<xs:elementname="storage"><!-- storage media related things. -->
<xs:elementname="disk"><!-- a disk device. -->
<xs:elementname="type"type="xs:string"/><!-- TODO: custom type. gpt, bios, etc. -->
<xs:elementname="name"type="xs:string"/><!-- device, e.g. 'sda' -->
<xs:elementname="part"><!-- define a partition -->
<xs:elementname="num"type="xs:positiveInteger"/><!-- partition number -->
<xs:elementname="name"type="xs:string"/><!-- TODO: custom type. the filesystem or partition label. optional. -->
<xs:elementname="size"type="xs:string"/><!-- TODO: custom type. the size of the partition. can be e.g.: #G,#K, etc. or #%. -->
<xs:elementname="fstype"type="xs:string"/><!-- TODO: custom type. the filesystem to format as. see the gdisk filesystem types: http://www.rodsbooks.com/gdisk/walkthrough.html -->
</xs:element>
</xs:element>
<xs:elementname="mount"><!-- mountpoint -->
<xs:elementname="order"type="xs:integer"/><!-- optional. the "weight" to give this mount point. -->
<xs:elementname="source"type="xs:string"/><!-- TODO: custom type. the device to mount, e.g. /dev/sda1 -->
<xs:elementname="mountpt"type="xs:string"/><!-- TODO: custom type. where to mount, e.g. /boot -->
<xs:elementname="type"type="xs:string"/><!-- TODO: custom type. the filesystem type. optional; should normally be auto-detected. -->
<xs:elementname="options"type="xs:string"/><!-- other mount options. optional. -->
<xs:elementname="password"type="xs:string"/><!-- TODO: custom type. the HASHED AND SALTED version of the password. if blank, password will be blank. if not defined, account will be locked. -->
<xs:elementname="regusr"><!-- TODO: add UID/GID support. GID support for xgroup? a regular user -->
<xs:elementname="username"type="xs:string"/><!-- TODO: custom type (some char restrictions, etc.) the username -->
<xs:elementname="homedir"><!-- the home directory -->
<xs:elementname="path"type="xs:string"/><!-- TODO: can use same type as storage/mount/mountpt. the path for the user's homedir. /home/USERNAME if not defined. -->
<xs:elementname="create"type="xs:booleanean"/><!-- TODO: set default. create the user's homedir. boolean. default is yes. -->
</xs:element>
<xs:elementname="group"type="xs:string"/><!-- TODO: custom type, some naming restrictions apply. the user's primary group. optional; if not specified, one will be created that matches the username. -->
<xs:elementname="xgroup"><!-- an extra group to add the user to. -->
<xs:elementname="name"type="xs:string"/><!-- TODO: same type as user/regusr/group. the name of the group -->
</xs:element>
<xs:elementname="password"type="xs:string"/><!-- TODO: same type as user/root/password. see user/root/password -->
<xs:elementname="comment"type="xs:string"/><!-- the description of the user. optional. -->
<xs:elementname="sudo"type="xs:booleanean"/><!-- TODO: set default. whether or not to give the user FULL sudo privileges. boolean. no if unspecified. -->
<xs:elementname="status"type="xs:boolean"/><!-- one of "enabled" or "disabled". assume disabled by default. -->
<xs:elementname="mirror"type="xs:anyURI"/><!-- the URI for the mirror for the repo, or an Include directive. -->
</xs:element>
<xs:elementname="custom"><!-- "[custom]" -->
<xs:elementname="name"type="xs:string"/><!-- whatever the repository's name should be per the repo. can specify multiple of these. -->
<xs:elementname="status"type="xs:boolean"/><!-- one of "enabled" or "disabled". assume disabled by default. -->
<xs:elementname="siglevel"type="xs:string"/><!-- TODO: custom type as a list or something? the siglevel. one element specified per additional trust level. if none provided, default is "Optional" and "TrustAll". -->
<xs:elementname="mirror"type="xs:anyURI"/><!-- the URI for the mirror for the repo, or an Include directive. -->
<xs:elementname="mirror"type="xs:anyURI"/><!-- TODO: restriction here on valid URIs for pacman. a URI to generate a mirrorlist, if we're using a custom entry. multiple of these can be specified. -->
<xs:elementname="software"><!-- packages considered *required*. these will be installed first/early on. -->
<xs:elementname="package"><!-- a package item -->
<xs:elementname="name"type="xs:string"/><!-- the name of the package. -->
<xs:elementname="repo"type="xs:string"/><!-- optional. the repo to install the package from. MUST BE ENABLED IN THE REPOS ELEMENT TREE. -->
<xs:elementname="version"type="xs:string"/><!-- TODO: custom type. optional, and most likely will never need it. a version specification, like ">1.0.1" or "<3.0.3". -->
<xs:elementname="type"type="xs:string"/><!-- TODO: custom type via a list? the type of bootloader. one of "grub", "lilo", "syslinux"... -->
<xs:elementname="efi"type="xs:boolean"/><!-- boolean. UEFI support. if false, strictly MBR. -->
<xs:elementname="where"type="xs:string"/><!-- TODO: same type as storage/mount/mountpt. if efi is true, the mountpoint for the ESP (from within the chroot). if false, the device (or partition) to install the bootloader on. -->
<xs:elementname="uri"type="xs:anyURI"/><!-- TODO: restrict to URIs understandable by python's urllib. a URI where to find the file. http://, https://, ftp://, file://, etc. -->
<xs:elementname="lang"type="xs:string"/><!-- TODO: validate/restrict somehow? might need custom type. optional. the language of the script. "/bin/bash", "/bin/python3", "/bin/python2", "/bin/awk" (if you're insane), etc. -->