Compare commits
41 Commits
pre_assign
...
master
Author | SHA1 | Date | |
---|---|---|---|
0caed70ec2 | |||
ea935b642f | |||
9b05156215 | |||
0a23f7f7e4 | |||
![]() |
0eda64ada1 | ||
0193f78387 | |||
f7b1d8b435 | |||
2bd6216426 | |||
8f3ed51020 | |||
191883158b | |||
97ebe7fd93 | |||
![]() |
5f3be54ec8 | ||
9d24eceefc | |||
1f9a4ed88d | |||
![]() |
6bdf8e55f2 | ||
![]() |
9b5b460496 | ||
![]() |
6e9042f023 | ||
![]() |
d5c656c757 | ||
bb73c05a6f | |||
![]() |
e70294dcfd | ||
e928560828 | |||
92fcb85cb9 | |||
f4f8f482b8 | |||
![]() |
5b537e3531 | ||
9ec5bee035 | |||
a663b5802f | |||
2219fbe4c0 | |||
6d3a9f5d3a | |||
faf6e9f96f | |||
38755fd648 | |||
eb933e7f81 | |||
16e68373a1 | |||
![]() |
d221947a89 | ||
![]() |
c4467cc5ea | ||
ea829884f0 | |||
648be9b2c4 | |||
d103acea18 | |||
8486ca0ecb | |||
dab60ad6f5 | |||
36991914d9 | |||
0be3cfc386 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -19,4 +19,3 @@
|
||||
.editix
|
||||
.idea/
|
||||
__pycache__/
|
||||
test.py
|
||||
|
@ -10,49 +10,36 @@
|
||||
<xs:complexType name="e_he_ipv6_cred">
|
||||
<xs:all>
|
||||
<xs:element name="user" type="xs:token" minOccurs="1"/>
|
||||
<xs:element name="updateKey" type="xs:token" minOccurs="1"/>
|
||||
<xs:element name="password" type="xs:token" minOccurs="1"/>
|
||||
</xs:all>
|
||||
<xs:attribute name="id" type="xs:ID" use="required"/>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="e_he_ipv6_tunnel">
|
||||
<xs:all>
|
||||
<xs:element name="server" type="t_net_addr_ip4"/>
|
||||
<xs:element name="allocs">
|
||||
<xs:element name="updateKey" type="xs:token" minOccurs="1"/>
|
||||
<xs:element name="assignments" minOccurs="1" maxOccurs="1">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1">
|
||||
<!-- HE only allocates a single /64 and, upon request, a single /48 per tunnel. -->
|
||||
<xs:element name="alloc" minOccurs="1" maxOccurs="2">
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="assign" minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_net_addr_ip6">
|
||||
<!-- VERY most likely "64" but we can't define a default with required. -->
|
||||
<xs:attribute name="prefix" type="t_he_ipv6_prefix" use="required"/>
|
||||
<xs:attribute name="iface" type="t_linux_iface_name" use="required"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
<xs:all>
|
||||
<xs:element name="ra" type="t_he_ipv6_ra" minOccurs="0" maxOccurs="1"/>
|
||||
</xs:all>
|
||||
<xs:attribute name="prefix" type="t_he_ipv6_prefix_local" use="optional" default="64"/>
|
||||
<xs:attribute name="alloc" type="t_he_ipv6_prefix" use="optional" default="64"/>
|
||||
<xs:attribute name="iface" type="t_linux_iface_name" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="raProvider" type="t_he_ipv6_ra_providers" use="optional"/>
|
||||
</xs:complexType>
|
||||
<xs:unique name="uniq_alloc_addr">
|
||||
<xs:unique name="uniq_he_assign">
|
||||
<xs:selector xpath=".//*"/>
|
||||
<xs:field xpath="."/>
|
||||
<!-- <xs:field xpath="@prefix"/> -->
|
||||
<xs:field xpath="@alloc"/>
|
||||
<xs:field xpath="@iface"/>
|
||||
</xs:unique>
|
||||
<xs:unique name="uniq_alloc_prefix">
|
||||
<xs:selector xpath=".//*"/>
|
||||
<xs:field xpath="@prefix"/>
|
||||
</xs:unique>
|
||||
</xs:element>
|
||||
<xs:element name="client" minOccurs="1" maxOccurs="1">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_net_addr_ip6">
|
||||
<!-- VERY most likely "64" but we can't define a default with required. -->
|
||||
<xs:attribute name="prefix" type="t_he_ipv6_prefix" use="required"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:all>
|
||||
<xs:attribute name="id" type="xs:positiveInteger" use="required"/>
|
||||
|
62
schema/lib/elements/ipxe.xsd
Normal file
62
schema/lib/elements/ipxe.xsd
Normal file
@ -0,0 +1,62 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="../types/unix.xsd"/>
|
||||
<xs:include schemaLocation="../types/ipxe.xsd"/>
|
||||
<xs:include schemaLocation="../types/git.xsd"/>
|
||||
|
||||
<xs:complexType name="e_ipxe_extratargets">
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="target" type="t_ipxe_extratarget" minOccurs="1" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="e_ipxe_opts">
|
||||
<xs:choice minOccurs="1" maxOccurs="2">
|
||||
<xs:element name="enable" maxOccurs="1">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="opt" minOccurs="1" type="t_ipxe_patchopt"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="disable" maxOccurs="1">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="opt" minOccurs="1" type="t_ipxe_patchopt"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:choice>
|
||||
<xs:attribute name="file" type="t_unix_relfilepath" use="required"/>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="e_ipxe_optswitch">
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="opts" minOccurs="1" maxOccurs="unbounded" type="e_ipxe_opts"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="subDir" type="t_unix_reldirpath" use="optional"/>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="e_ipxe_scripts">
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="script" minOccurs="1" maxOccurs="unbounded" type="t_ipxe_script"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="srcDir" type="t_unix_anydir" use="optional"/>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="e_ipxe_upstream">
|
||||
<xs:sequence>
|
||||
<xs:choice minOccurs="1" maxOccurs="2">
|
||||
<xs:element name="dest" minOccurs="1" maxOccurs="1" type="t_unix_dirpath"/>
|
||||
<xs:choice minOccurs="1" maxOccurs="1">
|
||||
<xs:element name="git" minOccurs="0" type="t_git_remote"/>
|
||||
<xs:element name="archive" minOccurs="0" type="t_ipxe_arcfile"/>
|
||||
</xs:choice>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
</xs:schema>
|
63
schema/lib/elements/repomirror.xsd
Normal file
63
schema/lib/elements/repomirror.xsd
Normal file
@ -0,0 +1,63 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="../types/repomirror.xsd"/>
|
||||
<xs:include schemaLocation="../types/net.xsd"/>
|
||||
<xs:include schemaLocation="../types/unix.xsd"/>
|
||||
|
||||
<xs:complexType name="e_repomir_owner">
|
||||
<xs:sequence minOccurs="1">
|
||||
<xs:choice minOccurs="1" maxOccurs="2">
|
||||
<xs:element name="user" type="t_unix_posixUserGroup" maxOccurs="1"/>
|
||||
<xs:element name="group" type="t_unix_posixUserGroup" maxOccurs="1"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="e_repomir_ignoreExit">
|
||||
<xs:attribute name="returns" type="t_repomir_returnCodeList" use="required"/>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- Commented out; we don't bother with SSH variants. See also e_repomir_upstream -->
|
||||
<!--
|
||||
<xs:complexType name="e_repomir_sync_proto">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_repomir_synctype">
|
||||
<xs:attribute name="ssh" use="optional" default="false" type="xs:boolean"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
-->
|
||||
|
||||
<xs:complexType name="e_repomir_tstmp_file">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_unix_filepath">
|
||||
<xs:attribute name="timeFormat" type="xs:string" use="optional" default="UNIX_EPOCH"/>
|
||||
<xs:attribute name="offset" type="xs:integer" use="optional"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="e_repomir_remote_tstmp_file">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="e_repomir_tstmp_file">
|
||||
<xs:attribute name="mtime" type="xs:boolean" use="optional" default="false"/>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="e_repomir_upstream">
|
||||
<xs:all minOccurs="1">
|
||||
<!-- <xs:element name="syncType" type="e_repomir_sync_proto" minOccurs="1"/> -->
|
||||
<xs:element name="syncType" type="t_repomir_synctype" minOccurs="1"/>
|
||||
<xs:element name="domain" type="xs:token" minOccurs="1"/>
|
||||
<xs:element name="port" minOccurs="0" type="t_net_port"/>
|
||||
<xs:element name="path" minOccurs="1" type="t_unix_dirpath"/>
|
||||
</xs:all>
|
||||
<xs:attribute name="delayCheck" type="xs:duration" use="optional"/>
|
||||
<xs:attribute name="offset" type="xs:duration" use="optional"/>
|
||||
</xs:complexType>
|
||||
|
||||
</xs:schema>
|
87
schema/lib/elements/resumegen.xsd
Normal file
87
schema/lib/elements/resumegen.xsd
Normal file
@ -0,0 +1,87 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:complexType name="e_resume_contact">
|
||||
<xs:all>
|
||||
<xs:element name="email" minOccurs="1" maxOccurs="1" type="xs:token"/>
|
||||
<xs:element name="phoneNumber" minOccurs="1" maxOccurs="1" type="xs:token"/>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="e_resume_duration">
|
||||
<xs:sequence minOccurs="1" maxOccurs="2">
|
||||
<xs:element name="start" type="xs:gYearMonth" minOccurs="1" maxOccurs="1"/>
|
||||
<xs:element name="end" type="xs:gYearMonth" minOccurs="0" maxOccurs="1"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="e_resume_workExperience">
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="experience" minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:all>
|
||||
<xs:element name="companyName" minOccurs="1" maxOccurs="1" type="xs:normalizedString"/>
|
||||
<xs:element name="positions" minOccurs="1" maxOccurs="1">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="position" minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:all>
|
||||
<xs:element name="duration" minOccurs="0" maxOccurs="1" type="e_resume_duration"/>
|
||||
<xs:element name="title" minOccurs="1" maxOccurs="1" type="xs:normalizedString"/>
|
||||
<xs:element name="role" minOccurs="1" maxOccurs="1">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="responsibility" minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:all>
|
||||
<xs:element name="desc" minOccurs="1" maxOccurs="1"/>
|
||||
<xs:element name="accomplishments" minOccurs="0" maxOccurs="1">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="accomplishment" minOccurs="1" maxOccurs="unbounded"
|
||||
type="xs:string"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="desc" minOccurs="1" maxOccurs="1" type="xs:normalizedString"/>
|
||||
<xs:element name="location" minOccurs="0" maxOccurs="1" type="e_resume_location"/>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="e_resume_location">
|
||||
<xs:all>
|
||||
<xs:element name="locality" minOccurs="1" maxOccurs="1" type="xs:normalizedString"/>
|
||||
<xs:element name="region" minOccurs="1" maxOccurs="1" type="xs:normalizedString"/>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="e_resume_name">
|
||||
<xs:all>
|
||||
<xs:element minOccurs="0" maxOccurs="1" name="nameTitle" type="xs:normalizedString"/>
|
||||
<xs:element minOccurs="0" maxOccurs="1" name="namePrefix" type="xs:normalizedString"/>
|
||||
<xs:element minOccurs="1" maxOccurs="1" name="firstName" type="xs:normalizedString"/>
|
||||
<xs:element minOccurs="0" maxOccurs="1" name="middleName" type="xs:normalizedString"/>
|
||||
<xs:element minOccurs="1" maxOccurs="1" name="lastName" type="xs:normalizedString"/>
|
||||
<xs:element minOccurs="0" maxOccurs="1" name="nameSuffix" type="xs:normalizedString"/>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
|
||||
</xs:schema>
|
@ -5,13 +5,13 @@
|
||||
|
||||
<xs:include schemaLocation="../types/vaultpass.xsd"/>
|
||||
|
||||
<xs:element name="t_vaultpass_authselect" abstract="true"/>
|
||||
<xs:element name="t_vaultpass_unsealselect" abstract="true"/>
|
||||
<xs:element name="e_vaultpass_authselect" abstract="true"/>
|
||||
<xs:element name="e_vaultpass_unsealselect" abstract="true"/>
|
||||
|
||||
<xs:element name="auth" substitutionGroup="t_vaultpass_authselect" type="t_vaultpass_auth_plain"/>
|
||||
<xs:element name="authGpg" substitutionGroup="t_vaultpass_authselect" type="t_vaultpass_star_gpg"/>
|
||||
<xs:element name="auth" substitutionGroup="e_vaultpass_authselect" type="t_vaultpass_auth_plain"/>
|
||||
<xs:element name="authGpg" substitutionGroup="e_vaultpass_authselect" type="t_vaultpass_star_gpg"/>
|
||||
|
||||
<xs:element name="unseal" substitutionGroup="t_vaultpass_unsealselect" type="t_std_base64"/>
|
||||
<xs:element name="unsealGpg" substitutionGroup="t_vaultpass_unsealselect" type="t_vaultpass_star_gpg"/>
|
||||
<xs:element name="unseal" substitutionGroup="e_vaultpass_unsealselect" type="t_std_base64"/>
|
||||
<xs:element name="unsealGpg" substitutionGroup="e_vaultpass_unsealselect" type="t_vaultpass_star_gpg"/>
|
||||
|
||||
</xs:schema>
|
||||
|
54
schema/lib/types/crossplatform.xsd
Normal file
54
schema/lib/types/crossplatform.xsd
Normal file
@ -0,0 +1,54 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="./unix.xsd"/>
|
||||
<xs:include schemaLocation="./windows.xsd"/>
|
||||
|
||||
<!-- ABSOLUTE directory path -->
|
||||
<xs:simpleType name="t_xplat_dirpath">
|
||||
<xs:union memberTypes="t_unix_dirpath t_windows_dirpath"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- RELATIVE directory path -->
|
||||
<xs:simpleType name="t_xplat_reldirpath">
|
||||
<xs:union memberTypes="t_unix_reldirpath t_windows_reldirpath"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- ABSOLUTE file path -->
|
||||
<xs:simpleType name="t_xplat_filepath">
|
||||
<xs:union memberTypes="t_unix_filepath t_windows_filepath"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- RELATIVE file path -->
|
||||
<xs:simpleType name="t_xplat_relfilepath">
|
||||
<xs:union memberTypes="t_unix_relfilepath t_windows_relfilepath"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- ABSOLUTE path (file or directory) -->
|
||||
<xs:simpleType name="t_xplat_path">
|
||||
<xs:union memberTypes="t_unix_path t_windows_path"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- RELATIVE path (file or directory) -->
|
||||
<xs:simpleType name="t_xplat_relpath">
|
||||
<xs:union memberTypes="t_unix_relpath t_windows_relpath"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- ANY valid value for the above types. -->
|
||||
<xs:simpleType name="t_xplat_anypath">
|
||||
<xs:union memberTypes="t_unix_anypath t_windows_anypath"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- RELATIVE or ABSOLUTE file path -->
|
||||
<xs:simpleType name="t_xplat_anyfile">
|
||||
<xs:union memberTypes="t_unix_anyfile t_windows_anyfile"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- RELATIVE or ABSOLUTE dir path -->
|
||||
<xs:simpleType name="t_xplat_anydir">
|
||||
<xs:union memberTypes="t_unix_anydir t_windows_anydir"/>
|
||||
</xs:simpleType>
|
||||
|
||||
</xs:schema>
|
53
schema/lib/types/git.xsd
Normal file
53
schema/lib/types/git.xsd
Normal file
@ -0,0 +1,53 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:simpleType name="t_git_commit">
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:pattern value="[A-Fa-f0-9]{4,40}"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_git_ref">
|
||||
<xs:union memberTypes="xs:token t_git_commit"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_git_reftypes">
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:enumeration value="branch"/><!-- a.k.a. "head" -->
|
||||
<xs:enumeration value="head"/><!-- a.k.a. "branch" -->
|
||||
<xs:enumeration value="tag"/>
|
||||
<xs:enumeration value="commit"/><!-- a.k.a. "rev" -->
|
||||
<xs:enumeration value="rev"/><!-- a.k.a. "commit" -->
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<!--
|
||||
<xs:complexType name="t_git_remote">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_git_uri">
|
||||
<xs:attribute name="refType" use="optional" default="branch" type="t_git_reftypes"/>
|
||||
<xs:attribute name="ref" use="optional" default="master" type="t_git_reftypes"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
-->
|
||||
<xs:complexType name="t_git_remote">
|
||||
<xs:sequence minOccurs="1" maxOccurs="1">
|
||||
<xs:choice minOccurs="1" maxOccurs="3">
|
||||
<xs:element name="refType" minOccurs="0" maxOccurs="1" type="t_git_reftypes" default="branch"/>
|
||||
<xs:element name="ref" minOccurs="0" maxOccurs="1" type="t_git_ref" default="master"/>
|
||||
<xs:element name="uri" minOccurs="1" maxOccurs="1" type="t_git_uri"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:simpleType name="t_git_uri">
|
||||
<xs:restriction base="xs:anyURI">
|
||||
<xs:pattern value="(https?|git|file|ssh)://.*"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
</xs:schema>
|
73
schema/lib/types/gomodh.xsd
Normal file
73
schema/lib/types/gomodh.xsd
Normal file
@ -0,0 +1,73 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:x="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="./net.xsd"/>
|
||||
<xs:include schemaLocation="./unix.xsd"/>
|
||||
|
||||
<xs:complexType name="t_gomodh_base">
|
||||
<xs:attribute name="name" type="t_unix_portablePosixFilename" use="required"/>
|
||||
<xs:attribute name="baseUrl" type="t_net_http_basic_uri" use="optional"/>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="t_gomodh_pkg">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="t_gomodh_base">
|
||||
<xs:all>
|
||||
<xs:element name="realUrl" type="t_gomodh_vcs_uri" minOccurs="1"/>
|
||||
</xs:all>
|
||||
<xs:attribute name="vcsType" type="t_gomodh_vcs" use="required"/>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="t_gomodh_mod">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="t_gomodh_base">
|
||||
<xs:all>
|
||||
<xs:element name="realURL" type="t_net_http_basic_uri"/>
|
||||
<xs:element name="releases">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="release">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:token">
|
||||
<xs:attribute name="dir" type="t_unix_dirpath" use="optional"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="baseDir" type="t_unix_dirpath" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:all>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- VCS are also called SCM. -->
|
||||
<xs:simpleType name="t_gomodh_vcs">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="bzr"/>
|
||||
<xs:enumeration value="fossil"/>
|
||||
<xs:enumeration value="git"/>
|
||||
<xs:enumeration value="hg"/>
|
||||
<xs:enumeration value="svn"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_gomodh_vcs_uri">
|
||||
<xs:restriction base="xs:anyURI">
|
||||
<!--
|
||||
Some of the weird ones might be BZR.
|
||||
http://doc.bazaar.canonical.com/development/en/user-reference/urlspec-help.html
|
||||
-->
|
||||
<xs:pattern value="(https?|bzr|aftp|bzr\+ssh|file|ftp|sftp|git|ssh|hg)://.+/?"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
</xs:schema>
|
@ -17,6 +17,12 @@
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_gpg_safe_key_id">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*(0x)?[0-9A-Fa-f]{40}\s*"/><!-- Full key ID -->
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_gpg_key_id_search">
|
||||
<xs:union memberTypes="t_gpg_key_id t_net_email_addr"/>
|
||||
</xs:simpleType>
|
||||
|
@ -3,6 +3,8 @@
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="./std.xsd"/>
|
||||
|
||||
<xs:simpleType name="t_he_ipv6_prefix">
|
||||
<xs:restriction base="xs:positiveInteger">
|
||||
<xs:enumeration value="48"/>
|
||||
@ -10,4 +12,42 @@
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_he_ipv6_prefix_local">
|
||||
<xs:restriction base="xs:positiveInteger">
|
||||
<xs:minInclusive value="64"/>
|
||||
<xs:maxInclusive value="128"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_he_ipv6_ra">
|
||||
<xs:all>
|
||||
<xs:element name="dns" default="false">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:boolean">
|
||||
<xs:attribute name="domains" type="t_std_list_space" use="optional"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="dhcpv6" default="false">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:boolean">
|
||||
<xs:attribute name="advOther" type="xs:boolean" use="optional" default="false"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:all>
|
||||
<xs:attribute name="tag" type="xs:token" use="optional"/>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:simpleType name="t_he_ipv6_ra_providers">
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:enumeration value="dnsmasq"/>
|
||||
<xs:enumeration value="radvd"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
</xs:schema>
|
||||
|
65
schema/lib/types/ipxe.xsd
Normal file
65
schema/lib/types/ipxe.xsd
Normal file
@ -0,0 +1,65 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="../types/unix.xsd"/>
|
||||
|
||||
<xs:complexType name="t_ipxe_extratarget">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_unix_reldirpath">
|
||||
<xs:attribute name="subDir" use="optional" default="." type="t_unix_reldirpath"/>
|
||||
<xs:attribute name="baseName" use="optional" type="t_unix_portablePosixFilename"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="t_ipxe_patch">
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="patchFile" minOccurs="1" maxOccurs="unbounded" type="t_ipxe_patch_file"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="patchDir" type="t_unix_anydir" use="optional" default="."/>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="t_ipxe_patch_file">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_unix_relfilepath">
|
||||
<xs:attribute name="stripLevel" type="xs:positiveInteger" use="optional" default="1"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:simpleType name="t_ipxe_patchopt">
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:pattern value="[A-Z0-9_]+"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_ipxe_rom_type">
|
||||
<xs:sequence minOccurs="1" maxOccurs="2">
|
||||
<xs:element name="romType" minOccurs="1"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="t_ipxe_roms">
|
||||
<xs:sequence minOccurs="1">
|
||||
<xs:element name="rom" type="xs:token" minOccurs="1" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="t_ipxe_script">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_unix_portablePosixFilename">
|
||||
<xs:attribute name="prefix" type="xs:token" use="required"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:simpleType name="t_ipxe_arcfile">
|
||||
<xs:restriction base="xs:anyURI">
|
||||
<xs:pattern value="(https?|file)://^.*\.(tar(\.((g|x)z|bz2?))?|t((g|x)z|bz2?)|zip)"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
</xs:schema>
|
@ -3,449 +3,456 @@
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="./std.xsd"/>
|
||||
<xs:include schemaLocation="./sys.xsd"/>
|
||||
<xs:include schemaLocation="./unix.xsd"/>
|
||||
<xs:include schemaLocation="./std.xsd"/>
|
||||
<xs:include schemaLocation="./sys.xsd"/>
|
||||
<xs:include schemaLocation="./unix.xsd"/>
|
||||
|
||||
<xs:simpleType name="t_linux_console_pageformats">
|
||||
<xs:restriction base="xs:positiveInteger">
|
||||
<xs:enumeration value="8"/>
|
||||
<xs:enumeration value="14"/>
|
||||
<xs:enumeration value="16"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType name="t_linux_console_pageformats">
|
||||
<xs:restriction base="xs:positiveInteger">
|
||||
<xs:enumeration value="8"/>
|
||||
<xs:enumeration value="14"/>
|
||||
<xs:enumeration value="16"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_linux_diskdev">
|
||||
<xs:restriction base="xs:string">
|
||||
<!-- TODO: is "auto" okay here? -->
|
||||
<xs:pattern value="\s*(/dev/([A-Za-z0-9_]+/)?[A-Za-z0-9_]+[0-9]?|auto)\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType name="t_linux_diskdev">
|
||||
<xs:restriction base="xs:string">
|
||||
<!-- TODO: is "auto" okay here? -->
|
||||
<xs:pattern value="\s*(/dev/([A-Za-z0-9_]+/)?[A-Za-z0-9_]+[0-9]?|auto)\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_linux_disksize">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*[-|+]?\s*([0-9]+)\s*(%|((k|Ki)|[MGTPEZY]i?)?B?|)\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType name="t_linux_disksize">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*[-|+]?\s*([0-9]+)\s*(%|((k|Ki)|[MGTPEZY]i?)?B?|)\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_linux_fstype">
|
||||
<xs:union memberTypes="t_std_UUID4">
|
||||
<xs:simpleType>
|
||||
<!-- parted names -->
|
||||
<!-- https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs -->
|
||||
<!-- ', '.join(sorted(list(dict(vars(parted.filesystem))['fileSystemType'].keys()))) -->
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:enumeration value="affs0"/>
|
||||
<xs:enumeration value="affs1"/>
|
||||
<xs:enumeration value="affs2"/>
|
||||
<xs:enumeration value="affs3"/>
|
||||
<xs:enumeration value="affs4"/>
|
||||
<xs:enumeration value="affs5"/>
|
||||
<xs:enumeration value="affs6"/>
|
||||
<xs:enumeration value="affs7"/>
|
||||
<xs:enumeration value="amufs"/>
|
||||
<xs:enumeration value="amufs0"/>
|
||||
<xs:enumeration value="amufs1"/>
|
||||
<xs:enumeration value="amufs2"/>
|
||||
<xs:enumeration value="amufs3"/>
|
||||
<xs:enumeration value="amufs4"/>
|
||||
<xs:enumeration value="amufs5"/>
|
||||
<xs:enumeration value="apfs1"/>
|
||||
<xs:enumeration value="apfs2"/>
|
||||
<xs:enumeration value="asfs"/>
|
||||
<xs:enumeration value="btrfs"/>
|
||||
<xs:enumeration value="ext2"/>
|
||||
<xs:enumeration value="ext3"/>
|
||||
<xs:enumeration value="ext4"/>
|
||||
<xs:enumeration value="fat16"/>
|
||||
<xs:enumeration value="fat32"/>
|
||||
<xs:enumeration value="hfs"/>
|
||||
<xs:enumeration value="hfs+"/>
|
||||
<xs:enumeration value="hfsx"/>
|
||||
<xs:enumeration value="hp-ufs"/>
|
||||
<xs:enumeration value="jfs"/>
|
||||
<xs:enumeration value="linux-swap(v0)"/>
|
||||
<xs:enumeration value="linux-swap(v1)"/>
|
||||
<xs:enumeration value="nilfs2"/>
|
||||
<xs:enumeration value="ntfs"/>
|
||||
<xs:enumeration value="reiserfs"/>
|
||||
<xs:enumeration value="sun-ufs"/>
|
||||
<xs:enumeration value="swsusp"/>
|
||||
<xs:enumeration value="udf"/>
|
||||
<xs:enumeration value="xfs"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:union>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_linux_iface_name">
|
||||
<xs:simpleType name="t_linux_fstype">
|
||||
<xs:union memberTypes="t_std_UUID4">
|
||||
<xs:simpleType>
|
||||
<!-- parted names -->
|
||||
<!-- https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs -->
|
||||
<!-- ', '.join(sorted(list(dict(vars(parted.filesystem))['fileSystemType'].keys()))) -->
|
||||
<xs:restriction base="xs:token">
|
||||
<!-- I have no idea if this will work. TODO: simplify, validate in-code. -->
|
||||
<!--
|
||||
"New" predictable iface naming.
|
||||
https://github.com/systemd/systemd/blob/master/src/udev/udev-builtin-net_id.c.
|
||||
-->
|
||||
<xs:pattern
|
||||
value="((en|sl|wl|ww)(b[0-9]+|c[a-z0-9]|o[0-9]+(n.*(d.*)?)?|s[0-9]+(f.*)?([nd].*)?|x([A-Fa-f0-9]:){5}[A-Fa-f0-9]|(P.*)?p[0-9]+s[0-9]+(([fnd].*)|u.*)?))"/>
|
||||
<!--
|
||||
Legacy naming.
|
||||
-->
|
||||
<xs:pattern value="(eth|wl(an)?)[0-9]*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
<xs:enumeration value="affs0"/>
|
||||
<xs:enumeration value="affs1"/>
|
||||
<xs:enumeration value="affs2"/>
|
||||
<xs:enumeration value="affs3"/>
|
||||
<xs:enumeration value="affs4"/>
|
||||
<xs:enumeration value="affs5"/>
|
||||
<xs:enumeration value="affs6"/>
|
||||
<xs:enumeration value="affs7"/>
|
||||
<xs:enumeration value="amufs"/>
|
||||
<xs:enumeration value="amufs0"/>
|
||||
<xs:enumeration value="amufs1"/>
|
||||
<xs:enumeration value="amufs2"/>
|
||||
<xs:enumeration value="amufs3"/>
|
||||
<xs:enumeration value="amufs4"/>
|
||||
<xs:enumeration value="amufs5"/>
|
||||
<xs:enumeration value="apfs1"/>
|
||||
<xs:enumeration value="apfs2"/>
|
||||
<xs:enumeration value="asfs"/>
|
||||
<xs:enumeration value="btrfs"/>
|
||||
<xs:enumeration value="ext2"/>
|
||||
<xs:enumeration value="ext3"/>
|
||||
<xs:enumeration value="ext4"/>
|
||||
<xs:enumeration value="fat16"/>
|
||||
<xs:enumeration value="fat32"/>
|
||||
<xs:enumeration value="hfs"/>
|
||||
<xs:enumeration value="hfs+"/>
|
||||
<xs:enumeration value="hfsx"/>
|
||||
<xs:enumeration value="hp-ufs"/>
|
||||
<xs:enumeration value="jfs"/>
|
||||
<xs:enumeration value="linux-swap(v0)"/>
|
||||
<xs:enumeration value="linux-swap(v1)"/>
|
||||
<xs:enumeration value="nilfs2"/>
|
||||
<xs:enumeration value="ntfs"/>
|
||||
<xs:enumeration value="reiserfs"/>
|
||||
<xs:enumeration value="sun-ufs"/>
|
||||
<xs:enumeration value="swsusp"/>
|
||||
<xs:enumeration value="udf"/>
|
||||
<xs:enumeration value="xfs"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:simpleType>
|
||||
</xs:union>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_linux_luks">
|
||||
<xs:sequence>
|
||||
<!-- TODO: add support for custom flags/opts? -->
|
||||
<xs:element name="luksDev" minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="secrets" minOccurs="1" maxOccurs="10" type="t_linux_luks_secrets"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="id" type="xs:ID" use="required"/>
|
||||
<xs:attribute name="name" type="t_std_nonempty" use="required"/>
|
||||
<xs:attribute name="source" type="xs:IDREF" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:simpleType name="t_linux_iface_name">
|
||||
<xs:union memberTypes="t_linux_iface_name_legacy t_linux_iface_name_predictable"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_linux_luks_secrets">
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="passphrase" minOccurs="0" maxOccurs="unbounded" type="t_std_nonempty"/>
|
||||
<!-- TODO: support URI to *read* bytes from? -->
|
||||
<xs:element name="keyFile" minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_unix_filepath">
|
||||
<xs:attribute name="size" type="xs:positiveInteger" use="optional"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:simpleType name="t_linux_iface_name_legacy">
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:pattern value="(eth|wl(an)?)[0-9]*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_linux_lvm">
|
||||
<xs:sequence>
|
||||
<xs:element name="volumeGroup" minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:all>
|
||||
<xs:element name="physicalVolumes" minOccurs="1" maxOccurs="1">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="pv" minOccurs="1" maxOccurs="unbounded" type="t_linux_lvm_pv"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="logicalVolumes" minOccurs="1" maxOccurs="1" type="t_linux_lvm_lv"/>
|
||||
</xs:all>
|
||||
<xs:attribute name="id" type="xs:ID" use="required"/>
|
||||
<xs:attribute name="name" type="t_std_nonempty" use="required"/>
|
||||
<xs:attribute name="extentSize" type="t_linux_pesize" use="optional" default="0"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:simpleType name="t_linux_iface_name_predictable">
|
||||
<!-- I have no idea if this will work. You'll probably want to validate in-code. -->
|
||||
<!--
|
||||
"New" predictable iface naming.
|
||||
https://github.com/systemd/systemd/blob/master/src/udev/udev-builtin-net_id.c.
|
||||
-->
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:pattern
|
||||
value="((en|sl|wl|ww)(b[0-9]+|c[a-z0-9]|o[0-9]+(n.*(d.*)?)?|s[0-9]+(f.*)?([nd].*)?|x([A-Fa-f0-9]:){5}[A-Fa-f0-9]|(P.*)?p[0-9]+s[0-9]+(([fnd].*)|u.*)?))"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_linux_lvm_lv">
|
||||
<xs:sequence>
|
||||
<xs:element name="lv" minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:element name="pvMember" minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:attribute name="source" use="required" type="xs:IDREF"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="id" type="xs:ID" use="required"/>
|
||||
<xs:attribute name="name" type="t_std_nonempty" use="required"/>
|
||||
<xs:attribute name="size" type="t_linux_lvsize" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="t_linux_luks">
|
||||
<xs:sequence>
|
||||
<!-- TODO: add support for custom flags/opts? -->
|
||||
<xs:element name="luksDev" minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="secrets" minOccurs="1" maxOccurs="10" type="t_linux_luks_secrets"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="id" type="xs:ID" use="required"/>
|
||||
<xs:attribute name="name" type="t_std_nonempty" use="required"/>
|
||||
<xs:attribute name="source" type="xs:IDREF" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="t_linux_lvm_pv">
|
||||
<xs:attribute name="id" type="xs:ID" use="required"/>
|
||||
<xs:attribute name="source" type="xs:IDREF" use="required"/>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:simpleType name="t_linux_lvsize">
|
||||
<!-- If no suffix is provided, program should assume the size is in *extents*. -->
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*([0-9]+)\s*(%|((k|Ki)|[MGTPEZY]i?)?B?|)\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_linux_mdadm">
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="array" minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="member" minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:attribute name="source" type="xs:IDREF" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="id" use="required" type="xs:ID"/>
|
||||
<xs:attribute name="name" use="required" type="t_std_nonempty"/>
|
||||
<xs:attribute name="meta" use="optional" default="1.2" type="t_linux_raid_meta"/>
|
||||
<xs:attribute name="level" use="required" type="t_linux_raid_levels"/>
|
||||
<!-- KB *only*. -->
|
||||
<!-- Can be pretty important!
|
||||
https://www.zdnet.com/article/chunks-the-hidden-key-to-raid-performance/ -->
|
||||
<xs:attribute name="chunkSize" use="optional" type="xs:positiveInteger" default="512"/>
|
||||
<xs:attribute name="layout" use="optional" type="t_linux_raid_layout" default="none"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:simpleType name="t_linux_mountpath">
|
||||
<xs:union memberTypes="t_unix_filepath">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="swap"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:union>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_linux_mounts">
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="mount" minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:element name="opt" minOccurs="1" maxOccurs="unbounded" type="t_std_cmdopts"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="source" type="xs:IDREF" use="required"/>
|
||||
<xs:attribute name="target" type="t_linux_mountpath" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="t_linux_nixpass">
|
||||
<xs:choice minOccurs="1" maxOccurs="1">
|
||||
<xs:element name="passwordPlain">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
<xs:attribute name="hashType" use="optional" default="sha512"
|
||||
type="t_linux_passwd_hashtypes"/>
|
||||
<xs:attribute name="rounds" use="optional" default="5000" type="xs:positiveInteger"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="passwordHash">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_linux_shadowhash">
|
||||
<xs:attribute name="hashType" use="optional" default="(detect)"
|
||||
type="t_linux_passwd_hashtypes_detect"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:choice>
|
||||
<xs:attribute name="locked" use="optional" default="false" type="xs:boolean"/>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="t_linux_package">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_std_nonempty">
|
||||
<xs:attribute name="repo" type="t_std_nonempty" use="optional"/>
|
||||
<xs:complexType name="t_linux_luks_secrets">
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="passphrase" minOccurs="0" maxOccurs="unbounded" type="t_std_nonempty"/>
|
||||
<!-- TODO: support URI to *read* bytes from? -->
|
||||
<xs:element name="keyFile" minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_unix_filepath">
|
||||
<xs:attribute name="size" type="xs:positiveInteger" use="optional"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:simpleType name="t_linux_part_flags">
|
||||
<xs:union>
|
||||
<xs:simpleType>
|
||||
<!-- parted.partition.partitionFlag -->
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="atvrecv"/>
|
||||
<xs:enumeration value="bios_grub"/>
|
||||
<xs:enumeration value="boot"/>
|
||||
<xs:enumeration value="diag"/>
|
||||
<xs:enumeration value="esp"/>
|
||||
<xs:enumeration value="hidden"/>
|
||||
<xs:enumeration value="hp-service"/>
|
||||
<xs:enumeration value="irst"/>
|
||||
<xs:enumeration value="lba"/>
|
||||
<xs:enumeration value="legacy_boot"/>
|
||||
<xs:enumeration value="lvm"/>
|
||||
<xs:enumeration value="msftdata"/>
|
||||
<xs:enumeration value="msftres"/>
|
||||
<xs:enumeration value="palo"/>
|
||||
<xs:enumeration value="prep"/>
|
||||
<xs:enumeration value="raid"/>
|
||||
<xs:enumeration value="root"/>
|
||||
<xs:enumeration value="swap"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType>
|
||||
<!-- These deviate from the parted flags (and in the case of the gpt_* ones, have no parted
|
||||
equivalent it seems).
|
||||
fdisk's "e(x)pert mode" has numerical GUID identifers for these ("Attrs").
|
||||
Details on these are at:
|
||||
https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_entries_(LBA_2%E2%80%9333)
|
||||
|
||||
BD_PART_FLAGS = BlockDev.PartFlag(-1)
|
||||
BD_PART_FLAGS_FRIENDLY = dict(zip(BD_PART_FLAGS.value_nicks, BD_PART_FLAGS.value_names))
|
||||
sorted(list(BD_PART_FLAGS_FRIENDLY.keys()))
|
||||
-->
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="apple_tv_recovery"/>
|
||||
<xs:enumeration value="cpalo"/>
|
||||
<xs:enumeration value="gpt_hidden"/><!-- No parted equivalent -->
|
||||
<xs:enumeration value="gpt_no_automount"/><!-- No parted equivalent -->
|
||||
<xs:enumeration value="gpt_read_only"/><!-- No parted equivalent -->
|
||||
<xs:enumeration value="gpt_system_part"/><!-- No parted equivalent -->
|
||||
<xs:enumeration value="hpservice"/>
|
||||
<xs:enumeration value="msft_data"/>
|
||||
<xs:enumeration value="msft_reserved"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:union>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_linux_passwd_hashtypes">
|
||||
<xs:union memberTypes="t_unix_passwd_hashtypes">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<!-- Unsupported in glibc. libxcrypt (https://github.com/besser82/libxcrypt/) has additional support. -->
|
||||
<!-- bcrypt/blowfish are the same. -->
|
||||
<!-- <xs:enumeration value="bcrypt"/> -->
|
||||
<!-- <xs:enumeration value="blowfish"/> -->
|
||||
<!-- <xs:enumeration value="scrypt"/> -->
|
||||
<xs:enumeration value="sha256"/>
|
||||
<xs:enumeration value="sha512"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:union>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_linux_passwd_hashtypes_detect">
|
||||
<xs:union memberTypes="t_unix_passwd_hashtypes">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="(detect)"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:union>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_linux_pesize">
|
||||
<!-- This is *basically* t_lvsize except we don't allow percentages. -->
|
||||
<!-- If no suffix is provided, we assume the size is in sectors
|
||||
UNLESS it's "0", which means use the default (which I *think* is dynamically generated). -->
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*([0-9]+)\s*(((k|Ki)|[MGTPEZY]i?)?B?|)\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_linux_raid_layout">
|
||||
<!-- mdadm(8), "layout=" option -->
|
||||
<!-- We don't need to cook in the "faulty" levels. -->
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:pattern
|
||||
value="((left|right)-a?symmetric(-6)?|[lr][as]|parity-(fir|la)st|ddf-(zero|N)-restart|ddf-N-continue|parity-first-6|[nof][0-9]+|none)"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_linux_raid_levels">
|
||||
<xs:restriction base="xs:integer">
|
||||
<xs:enumeration value="0"/>
|
||||
<xs:enumeration value="1"/>
|
||||
<xs:enumeration value="4"/>
|
||||
<xs:enumeration value="5"/>
|
||||
<xs:enumeration value="6"/>
|
||||
<xs:enumeration value="10"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_linux_raid_meta">
|
||||
<!-- Program should warn about 1.x used for non-aware bootloaders.
|
||||
0.90 should be used in that case. -->
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:enumeration value="0"/><!-- Same as 0.90 -->
|
||||
<xs:enumeration value="0.90"/><!-- Same as 0 -->
|
||||
<xs:enumeration value="1"/><!-- Same as 1.2, default -->
|
||||
<xs:enumeration value="1.0"/>
|
||||
<xs:enumeration value="1.1"/>
|
||||
<xs:enumeration value="1.2"/><!-- Same as 1, default -->
|
||||
<xs:enumeration value="default"/><!-- Same as 1, 1.2 -->
|
||||
<xs:enumeration value="ddf"/>
|
||||
<xs:enumeration value="imsm"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_linux_service">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_std_nonempty">
|
||||
<xs:attribute name="status" type="xs:boolean" use="optional" default="true"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:simpleType name="t_linux_shadowhash">
|
||||
<xs:union memberTypes="t_unix_shadowhash">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*($5)?($[a-zA-Z0-9./]{1,16})$[a-zA-Z0-9./]{43}\s*"/><!-- sha256 -->
|
||||
<xs:pattern value="\s*($6)?($[a-zA-Z0-9./]{1,16})$[a-zA-Z0-9./]{86}\s*"/><!-- sha512 -->
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:union>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_linux_user">
|
||||
<xs:sequence>
|
||||
<xs:element name="password" minOccurs="0" maxOccurs="1" type="t_linux_nixpass"/>
|
||||
<xs:element name="xGroup" minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:attribute name="name" type="t_unix_posixUserGroup" use="required"/>
|
||||
<xs:attribute name="create" type="xs:boolean" use="optional" default="false"/>
|
||||
<xs:attribute name="gid" type="xs:positiveInteger" use="optional"/>
|
||||
</xs:complexType>
|
||||
<xs:unique name="uniq_linux_grp">
|
||||
<xs:selector xpath="."/>
|
||||
<xs:field xpath="@name"/>
|
||||
</xs:unique>
|
||||
<xs:complexType name="t_linux_lvm">
|
||||
<xs:sequence>
|
||||
<xs:element name="volumeGroup" minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:all>
|
||||
<xs:element name="physicalVolumes" minOccurs="1" maxOccurs="1">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="pv" minOccurs="1" maxOccurs="unbounded" type="t_linux_lvm_pv"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="name" type="t_unix_posixUserGroup" use="required"/>
|
||||
<xs:attribute name="home" type="t_unix_filepath" use="optional"/>
|
||||
<xs:attribute name="uid" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="group" type="t_unix_posixUserGroup" use="optional"/>
|
||||
<xs:attribute name="gid" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="comment" type="t_std_nonempty" use="optional"/>
|
||||
<xs:attribute name="sudo" type="xs:boolean" use="optional" default="false"/>
|
||||
<xs:attribute name="sudoPassword" type="xs:boolean" use="optional" default="true"/>
|
||||
<xs:attribute name="shell" type="t_unix_filepath" use="optional" default="/bin/bash"/>
|
||||
<!-- TODO: change the positiveIntegers to xs:duration? or union? -->
|
||||
<!-- Might be pointless since the smallest increment is 1 day in
|
||||
shadow(5). -->
|
||||
<xs:attribute name="minAge" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="maxAge" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="warnDays" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="inactiveDays" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="expireDate" type="t_std_epoch_or_iso" use="optional"/>
|
||||
</xs:complexType>
|
||||
<xs:element name="logicalVolumes" minOccurs="1" maxOccurs="1" type="t_linux_lvm_lv"/>
|
||||
</xs:all>
|
||||
<xs:attribute name="id" type="xs:ID" use="required"/>
|
||||
<xs:attribute name="name" type="t_std_nonempty" use="required"/>
|
||||
<xs:attribute name="extentSize" type="t_linux_pesize" use="optional" default="0"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="t_linux_lvm_lv">
|
||||
<xs:sequence>
|
||||
<xs:element name="lv" minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:element name="pvMember" minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:attribute name="source" use="required" type="xs:IDREF"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="id" type="xs:ID" use="required"/>
|
||||
<xs:attribute name="name" type="t_std_nonempty" use="required"/>
|
||||
<xs:attribute name="size" type="t_linux_lvsize" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="t_linux_lvm_pv">
|
||||
<xs:attribute name="id" type="xs:ID" use="required"/>
|
||||
<xs:attribute name="source" type="xs:IDREF" use="required"/>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:simpleType name="t_linux_lvsize">
|
||||
<!-- If no suffix is provided, program should assume the size is in *extents*. -->
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*([0-9]+)\s*(%|((k|Ki)|[MGTPEZY]i?)?B?|)\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_linux_mdadm">
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="array" minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="member" minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:attribute name="source" type="xs:IDREF" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="id" use="required" type="xs:ID"/>
|
||||
<xs:attribute name="name" use="required" type="t_std_nonempty"/>
|
||||
<xs:attribute name="meta" use="optional" default="1.2" type="t_linux_raid_meta"/>
|
||||
<xs:attribute name="level" use="required" type="t_linux_raid_levels"/>
|
||||
<!-- KB *only*. -->
|
||||
<!-- Can be pretty important!
|
||||
https://www.zdnet.com/article/chunks-the-hidden-key-to-raid-performance/ -->
|
||||
<xs:attribute name="chunkSize" use="optional" type="xs:positiveInteger" default="512"/>
|
||||
<xs:attribute name="layout" use="optional" type="t_linux_raid_layout" default="none"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:simpleType name="t_linux_mountpath">
|
||||
<xs:union memberTypes="t_unix_filepath">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="swap"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:union>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_linux_mounts">
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="mount" minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:element name="opt" minOccurs="1" maxOccurs="unbounded" type="t_std_cmdopts"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="source" type="xs:IDREF" use="required"/>
|
||||
<xs:attribute name="target" type="t_linux_mountpath" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="t_linux_nixpass">
|
||||
<xs:choice minOccurs="1" maxOccurs="1">
|
||||
<xs:element name="passwordPlain">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
<xs:attribute name="hashType" use="optional" default="sha512"
|
||||
type="t_linux_passwd_hashtypes"/>
|
||||
<xs:attribute name="rounds" use="optional" default="5000" type="xs:positiveInteger"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="passwordHash">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_linux_shadowhash">
|
||||
<xs:attribute name="hashType" use="optional" default="(detect)"
|
||||
type="t_linux_passwd_hashtypes_detect"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:choice>
|
||||
<xs:attribute name="locked" use="optional" default="false" type="xs:boolean"/>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="t_linux_package">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_std_nonempty">
|
||||
<xs:attribute name="repo" type="t_std_nonempty" use="optional"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:simpleType name="t_linux_part_flags">
|
||||
<xs:union>
|
||||
<xs:simpleType>
|
||||
<!-- parted.partition.partitionFlag -->
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="atvrecv"/>
|
||||
<xs:enumeration value="bios_grub"/>
|
||||
<xs:enumeration value="boot"/>
|
||||
<xs:enumeration value="diag"/>
|
||||
<xs:enumeration value="esp"/>
|
||||
<xs:enumeration value="hidden"/>
|
||||
<xs:enumeration value="hp-service"/>
|
||||
<xs:enumeration value="irst"/>
|
||||
<xs:enumeration value="lba"/>
|
||||
<xs:enumeration value="legacy_boot"/>
|
||||
<xs:enumeration value="lvm"/>
|
||||
<xs:enumeration value="msftdata"/>
|
||||
<xs:enumeration value="msftres"/>
|
||||
<xs:enumeration value="palo"/>
|
||||
<xs:enumeration value="prep"/>
|
||||
<xs:enumeration value="raid"/>
|
||||
<xs:enumeration value="root"/>
|
||||
<xs:enumeration value="swap"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType>
|
||||
<!-- These deviate from the parted flags (and in the case of the gpt_* ones, have no parted
|
||||
equivalent it seems).
|
||||
fdisk's "e(x)pert mode" has numerical GUID identifers for these ("Attrs").
|
||||
Details on these are at:
|
||||
https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_entries_(LBA_2%E2%80%9333)
|
||||
|
||||
BD_PART_FLAGS = BlockDev.PartFlag(-1)
|
||||
BD_PART_FLAGS_FRIENDLY = dict(zip(BD_PART_FLAGS.value_nicks, BD_PART_FLAGS.value_names))
|
||||
sorted(list(BD_PART_FLAGS_FRIENDLY.keys()))
|
||||
-->
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="apple_tv_recovery"/>
|
||||
<xs:enumeration value="cpalo"/>
|
||||
<xs:enumeration value="gpt_hidden"/><!-- No parted equivalent -->
|
||||
<xs:enumeration value="gpt_no_automount"/><!-- No parted equivalent -->
|
||||
<xs:enumeration value="gpt_read_only"/><!-- No parted equivalent -->
|
||||
<xs:enumeration value="gpt_system_part"/><!-- No parted equivalent -->
|
||||
<xs:enumeration value="hpservice"/>
|
||||
<xs:enumeration value="msft_data"/>
|
||||
<xs:enumeration value="msft_reserved"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:union>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_linux_passwd_hashtypes">
|
||||
<xs:union memberTypes="t_unix_passwd_hashtypes">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<!-- Unsupported in glibc. libxcrypt (https://github.com/besser82/libxcrypt/) has additional support. -->
|
||||
<!-- bcrypt/blowfish are the same. -->
|
||||
<!-- <xs:enumeration value="bcrypt"/> -->
|
||||
<!-- <xs:enumeration value="blowfish"/> -->
|
||||
<!-- <xs:enumeration value="scrypt"/> -->
|
||||
<xs:enumeration value="sha256"/>
|
||||
<xs:enumeration value="sha512"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:union>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_linux_passwd_hashtypes_detect">
|
||||
<xs:union memberTypes="t_unix_passwd_hashtypes">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="(detect)"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:union>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_linux_pesize">
|
||||
<!-- This is *basically* t_lvsize except we don't allow percentages. -->
|
||||
<!-- If no suffix is provided, we assume the size is in sectors
|
||||
UNLESS it's "0", which means use the default (which I *think* is dynamically generated). -->
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*([0-9]+)\s*(((k|Ki)|[MGTPEZY]i?)?B?|)\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_linux_raid_layout">
|
||||
<!-- mdadm(8), "layout=" option -->
|
||||
<!-- We don't need to cook in the "faulty" levels. -->
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:pattern
|
||||
value="((left|right)-a?symmetric(-6)?|[lr][as]|parity-(fir|la)st|ddf-(zero|N)-restart|ddf-N-continue|parity-first-6|[nof][0-9]+|none)"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_linux_raid_levels">
|
||||
<xs:restriction base="xs:integer">
|
||||
<xs:enumeration value="0"/>
|
||||
<xs:enumeration value="1"/>
|
||||
<xs:enumeration value="4"/>
|
||||
<xs:enumeration value="5"/>
|
||||
<xs:enumeration value="6"/>
|
||||
<xs:enumeration value="10"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_linux_raid_meta">
|
||||
<!-- Program should warn about 1.x used for non-aware bootloaders.
|
||||
0.90 should be used in that case. -->
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:enumeration value="0"/><!-- Same as 0.90 -->
|
||||
<xs:enumeration value="0.90"/><!-- Same as 0 -->
|
||||
<xs:enumeration value="1"/><!-- Same as 1.2, default -->
|
||||
<xs:enumeration value="1.0"/>
|
||||
<xs:enumeration value="1.1"/>
|
||||
<xs:enumeration value="1.2"/><!-- Same as 1, default -->
|
||||
<xs:enumeration value="default"/><!-- Same as 1, 1.2 -->
|
||||
<xs:enumeration value="ddf"/>
|
||||
<xs:enumeration value="imsm"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_linux_service">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_std_nonempty">
|
||||
<xs:attribute name="status" type="xs:boolean" use="optional" default="true"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:simpleType name="t_linux_shadowhash">
|
||||
<xs:union memberTypes="t_unix_shadowhash">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*($5)?($[a-zA-Z0-9./]{1,16})$[a-zA-Z0-9./]{43}\s*"/><!-- sha256 -->
|
||||
<xs:pattern value="\s*($6)?($[a-zA-Z0-9./]{1,16})$[a-zA-Z0-9./]{86}\s*"/><!-- sha512 -->
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:union>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_linux_user">
|
||||
<xs:sequence>
|
||||
<xs:element name="password" minOccurs="0" maxOccurs="1" type="t_linux_nixpass"/>
|
||||
<xs:element name="xGroup" minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:attribute name="name" type="t_unix_posixUserGroup" use="required"/>
|
||||
<xs:attribute name="create" type="xs:boolean" use="optional" default="false"/>
|
||||
<xs:attribute name="gid" type="xs:positiveInteger" use="optional"/>
|
||||
</xs:complexType>
|
||||
<xs:unique name="uniq_linux_grp">
|
||||
<xs:selector xpath="."/>
|
||||
<xs:field xpath="@name"/>
|
||||
</xs:unique>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="name" type="t_unix_posixUserGroup" use="required"/>
|
||||
<xs:attribute name="home" type="t_unix_filepath" use="optional"/>
|
||||
<xs:attribute name="uid" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="group" type="t_unix_posixUserGroup" use="optional"/>
|
||||
<xs:attribute name="gid" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="comment" type="t_std_nonempty" use="optional"/>
|
||||
<xs:attribute name="sudo" type="xs:boolean" use="optional" default="false"/>
|
||||
<xs:attribute name="sudoPassword" type="xs:boolean" use="optional" default="true"/>
|
||||
<xs:attribute name="shell" type="t_unix_filepath" use="optional" default="/bin/bash"/>
|
||||
<!-- TODO: change the positiveIntegers to xs:duration? or union? -->
|
||||
<!-- Might be pointless since the smallest increment is 1 day in
|
||||
shadow(5). -->
|
||||
<xs:attribute name="minAge" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="maxAge" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="warnDays" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="inactiveDays" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="expireDate" type="t_std_epoch_or_iso" use="optional"/>
|
||||
</xs:complexType>
|
||||
|
||||
</xs:schema>
|
||||
|
@ -116,6 +116,13 @@
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_net_port">
|
||||
<xs:restriction base="xs:positiveInteger">
|
||||
<xs:minInclusive value="1"/>
|
||||
<xs:maxInclusive value="65535"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_net_proto">
|
||||
<!-- TODO: expand? Remove gre? -->
|
||||
|
17
schema/lib/types/repomirror.xsd
Normal file
17
schema/lib/types/repomirror.xsd
Normal file
@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:simpleType name="t_repomir_returnCodeList">
|
||||
<xs:list itemType="xs:integer"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_repomir_synctype">
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:enumeration value="rsync"/>
|
||||
<xs:enumeration value="ftp"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
</xs:schema>
|
35
schema/lib/types/router.xsd
Normal file
35
schema/lib/types/router.xsd
Normal file
@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="linux.xsd"/>
|
||||
<xs:include schemaLocation="net.xsd"/>
|
||||
|
||||
<!-- IEEE 802.1Q -->
|
||||
<xs:simpleType name="t_router_vlan">
|
||||
<xs:restriction base="xs:nonNegativeInteger">
|
||||
<xs:minInclusive value="0"/><!-- Technically redundant. -->
|
||||
<!--
|
||||
This is actually a vendor-specific thing; the official IEEE 802.1Q spec does NOT specify that VLAN ID 1 is
|
||||
reserved for management.
|
||||
-->
|
||||
<!-- <xs:minInclusive value="1"/> -->
|
||||
<xs:maxInclusive value="4094"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_router_bridge_iface">
|
||||
<xs:list itemType="t_linux_iface_name"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_router_iface">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_linux_iface_name">
|
||||
<xs:attribute name="vlan" type="t_router_vlan" use="optional"/>
|
||||
<xs:attribute name="bridge" type="t_router_bridge_iface" use="optional"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
|
||||
</xs:schema>
|
7
schema/lib/types/rss2.0.xsd
Normal file
7
schema/lib/types/rss2.0.xsd
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
|
||||
</xs:schema>
|
@ -35,6 +35,16 @@
|
||||
<!-- positiveInteger is used for UNIX Epoch. -->
|
||||
<xs:union memberTypes="xs:dateTime xs:positiveInteger"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_std_list_comma">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="[^,]+(,[^,])*"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_std_list_space">
|
||||
<xs:list itemType="xs:token"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_std_nonempty">
|
||||
<xs:restriction base="xs:token">
|
||||
@ -42,6 +52,18 @@
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- https://semver.org/ -->
|
||||
<!-- Not perfect; it's more permissible than official spec but will do nicely for basic check. -->
|
||||
<!--
|
||||
The XML pattern engine standard is... pretty limited but:
|
||||
https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
|
||||
-->
|
||||
<xs:simpleType name="t_std_semver">
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:pattern value="v?([1-9]+([0-9])*\.){2}\.[1-9]([0-9)*(-[.0-9A-Za-z-]+)?(\+[.0-9A-Za-z-]+)?"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_std_uri">
|
||||
<xs:restriction base="xs:anyURI">
|
||||
<xs:pattern value="\s*(https?|ftps?|file)://.+\s*"/>
|
||||
|
@ -9,9 +9,11 @@
|
||||
<xs:simpleType name="t_sys_diskfmt">
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:enumeration value="gpt"/>
|
||||
<!-- The next four should all evaluate to the exact same in-code. -->
|
||||
<xs:enumeration value="bios"/>
|
||||
<xs:enumeration value="dos"/>
|
||||
<xs:enumeration value="msdos"/>
|
||||
<xs:enumeration value="mbr"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
@ -3,104 +3,176 @@
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="./std.xsd"/>
|
||||
<xs:include schemaLocation="./std.xsd"/>
|
||||
|
||||
<xs:simpleType name="t_unix_filepath">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*(~?/[^/]+)+/?\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:complexType name="t_unix_arg">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
<xs:attribute name="value" type="xs:string" use="optional"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="t_unix_nixpass">
|
||||
<xs:choice minOccurs="1" maxOccurs="1">
|
||||
<xs:element name="passwordPlain">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
<xs:attribute name="hashType" use="optional" default="md5" type="t_unix_passwd_hashtypes"/>
|
||||
<xs:attribute name="rounds" use="optional" default="5000" type="xs:positiveInteger"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="passwordHash">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_unix_shadowhash">
|
||||
<xs:attribute name="hashType" use="optional" default="md5" type="t_unix_passwd_hashtypes"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:choice>
|
||||
<xs:attribute name="locked" use="optional" default="false" type="xs:boolean"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="t_unix_args">
|
||||
<xs:choice minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="long" type="t_unix_arg"/>
|
||||
<xs:element name="short" type="t_unix_arg"/>
|
||||
</xs:choice>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:simpleType name="t_unix_passwd_hashtypes">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="md5"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<!-- These were a pain to figure out. -->
|
||||
<!-- wtf. doesn't seem to work?
|
||||
dir: ^\s*(~?/[^/]*)+/?\s*$
|
||||
file: ^\s*(~?/[^/]+)+\s*$
|
||||
reldir: ^\s*[^/](([^/]*)+/?)+\s*$
|
||||
relfile: ^\s*[^/]+(/|[^/]*)*[^/]+\s*$
|
||||
-->
|
||||
<!-- ABSOLUTE directory path -->
|
||||
<xs:simpleType name="t_unix_dirpath">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*(~?/[^/]*)+/?\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282 -->
|
||||
<xs:simpleType name="t_unix_portablePosixFilename">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="[A-Za-z0-9._-]+"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_unix_posixUserGroup">
|
||||
<!-- https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_437
|
||||
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282
|
||||
https://unix.stackexchange.com/a/435120/284004 -->
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:pattern value="\s*[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}$)\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<!-- RELATIVE directory path -->
|
||||
<xs:simpleType name="t_unix_reldirpath">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*[^/](([^/]*)+/?)+\s*"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_unix_shadowhash">
|
||||
<!-- http://man7.org/linux/man-pages/man3/crypt.3.html#NOTES -->
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:pattern value="\s*($1)?($[a-zA-Z0-9./]{1,16})$[a-zA-Z0-9./]{22}\s*"/><!-- md5 -->
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<!-- ABSOLUTE file path -->
|
||||
<xs:simpleType name="t_unix_filepath">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*(~?/[^/]+)+\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_unix_user">
|
||||
<xs:sequence>
|
||||
<xs:element name="password" minOccurs="0" maxOccurs="1" type="t_unix_nixpass"/>
|
||||
<xs:element name="xGroup" minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:attribute name="name" type="t_unix_posixUserGroup" use="required"/>
|
||||
<xs:attribute name="create" type="xs:boolean" use="optional" default="false"/>
|
||||
<xs:attribute name="gid" type="xs:positiveInteger" use="optional"/>
|
||||
</xs:complexType>
|
||||
<xs:unique name="uniq_unix_grp">
|
||||
<xs:selector xpath="xGroup"/>
|
||||
<xs:field xpath="@name"/>
|
||||
</xs:unique>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="name" type="t_unix_posixUserGroup" use="required"/>
|
||||
<xs:attribute name="home" type="t_unix_filepath" use="optional"/>
|
||||
<xs:attribute name="uid" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="group" type="t_unix_posixUserGroup" use="optional"/>
|
||||
<xs:attribute name="gid" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="comment" type="t_std_nonempty" use="optional"/>
|
||||
<xs:attribute name="sudo" type="xs:boolean" use="optional" default="false"/>
|
||||
<xs:attribute name="sudoPassword" type="xs:boolean" use="optional" default="true"/>
|
||||
<xs:attribute name="shell" type="t_unix_filepath" use="optional" default="/bin/bash"/>
|
||||
<!-- TODO: change the positiveIntegers to xs:duration? or union? -->
|
||||
<!-- Might be pointless since the smallest increment is 1 day in
|
||||
shadow(5). -->
|
||||
<xs:attribute name="minAge" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="maxAge" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="warnDays" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="inactiveDays" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="expireDate" type="t_std_epoch_or_iso" use="optional"/>
|
||||
</xs:complexType>
|
||||
<!-- RELATIVE file path -->
|
||||
<xs:simpleType name="t_unix_relfilepath">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*([^/]+)(/[^/]+)*([^/])*\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- ABSOLUTE path (file or directory) -->
|
||||
<xs:simpleType name="t_unix_path">
|
||||
<xs:union memberTypes="t_unix_dirpath t_unix_filepath"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- RELATIVE path (file or directory) -->
|
||||
<xs:simpleType name="t_unix_relpath">
|
||||
<xs:union memberTypes="t_unix_reldirpath t_unix_relfilepath"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- ANY valid value for the above types. -->
|
||||
<xs:simpleType name="t_unix_anypath">
|
||||
<xs:union memberTypes="t_unix_path t_unix_relpath"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- RELATIVE or ABSOLUTE file path -->
|
||||
<xs:simpleType name="t_unix_anyfile">
|
||||
<xs:union memberTypes="t_unix_filepath t_unix_relfilepath"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- RELATIVE or ABSOLUTE dir path -->
|
||||
<xs:simpleType name="t_unix_anydir">
|
||||
<xs:union memberTypes="t_unix_dirpath t_unix_reldirpath"/>
|
||||
</xs:simpleType>
|
||||
<!-- END of regex silliness. What an ugly annoyance. -->
|
||||
|
||||
<xs:complexType name="t_unix_nixpass">
|
||||
<xs:choice minOccurs="1" maxOccurs="1">
|
||||
<xs:element name="passwordPlain">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
<xs:attribute name="hashType" use="optional" default="md5" type="t_unix_passwd_hashtypes"/>
|
||||
<xs:attribute name="rounds" use="optional" default="5000" type="xs:positiveInteger"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="passwordHash">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_unix_shadowhash">
|
||||
<xs:attribute name="hashType" use="optional" default="md5" type="t_unix_passwd_hashtypes"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:choice>
|
||||
<xs:attribute name="locked" use="optional" default="false" type="xs:boolean"/>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:simpleType name="t_unix_passwd_hashtypes">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="md5"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282 -->
|
||||
<xs:simpleType name="t_unix_portablePosixFilename">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="[A-Za-z0-9._-]+"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_unix_posixUserGroup">
|
||||
<!-- https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_437
|
||||
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282
|
||||
https://unix.stackexchange.com/a/435120/284004 -->
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:pattern value="\s*[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}$)\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_unix_shadowhash">
|
||||
<!-- http://man7.org/linux/man-pages/man3/crypt.3.html#NOTES -->
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:pattern value="\s*($1)?($[a-zA-Z0-9./]{1,16})$[a-zA-Z0-9./]{22}\s*"/><!-- md5 -->
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_unix_user">
|
||||
<xs:sequence>
|
||||
<xs:element name="password" minOccurs="0" maxOccurs="1" type="t_unix_nixpass"/>
|
||||
<xs:element name="xGroup" minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:attribute name="name" type="t_unix_posixUserGroup" use="required"/>
|
||||
<xs:attribute name="create" type="xs:boolean" use="optional" default="false"/>
|
||||
<xs:attribute name="gid" type="xs:positiveInteger" use="optional"/>
|
||||
</xs:complexType>
|
||||
<xs:unique name="uniq_unix_grp">
|
||||
<xs:selector xpath="xGroup"/>
|
||||
<xs:field xpath="@name"/>
|
||||
</xs:unique>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="name" type="t_unix_posixUserGroup" use="required"/>
|
||||
<xs:attribute name="home" type="t_unix_filepath" use="optional"/>
|
||||
<xs:attribute name="uid" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="group" type="t_unix_posixUserGroup" use="optional"/>
|
||||
<xs:attribute name="gid" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="comment" type="t_std_nonempty" use="optional"/>
|
||||
<xs:attribute name="sudo" type="xs:boolean" use="optional" default="false"/>
|
||||
<xs:attribute name="sudoPassword" type="xs:boolean" use="optional" default="true"/>
|
||||
<xs:attribute name="shell" type="t_unix_filepath" use="optional" default="/bin/bash"/>
|
||||
<!-- TODO: change the positiveIntegers to xs:duration? or union? -->
|
||||
<!-- Might be pointless since the smallest increment is 1 day in
|
||||
shadow(5). -->
|
||||
<xs:attribute name="minAge" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="maxAge" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="warnDays" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="inactiveDays" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="expireDate" type="t_std_epoch_or_iso" use="optional"/>
|
||||
</xs:complexType>
|
||||
|
||||
</xs:schema>
|
||||
|
@ -19,7 +19,7 @@
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<!-- We don't support Boto3 because it requires an external session object. -->
|
||||
<!-- We won't support EC2 Metadata auth unless requested because it's HELL complex. -->
|
||||
<!-- We won't support EC2 Metadata auth unless requested because it's HELLA complex. -->
|
||||
<!-- TODO -->
|
||||
<!--
|
||||
<xs:element name="aws">
|
||||
@ -72,7 +72,7 @@
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<!-- No longer supported upstream by HashiCorp. -->
|
||||
<!-- No longer supported upstream by HashiCorp. At least, not in community? And I don't have an Enterprise handy. -->
|
||||
<!--
|
||||
<xs:element name="mfa"/>
|
||||
-->
|
||||
@ -137,6 +137,7 @@
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_unix_filepath">
|
||||
<xs:attribute name="gpgHome" type="t_unix_filepath" use="optional"/>
|
||||
<xs:attribute name="gpgKeyId" type="t_gpg_safe_key_id" use="optional"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
|
66
schema/lib/types/windows.xsd
Normal file
66
schema/lib/types/windows.xsd
Normal file
@ -0,0 +1,66 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="./std.xsd"/>
|
||||
|
||||
<!-- ABSOLUTE directory path -->
|
||||
<!-- Getting this regex right for Windows is a nightmare. This is just intended to check in a very basic manner. -->
|
||||
<xs:simpleType name="t_windows_dirpath">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*(~|[A-Za-z]+:)(\\[^\\]*)+\\?\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- RELATIVE directory path -->
|
||||
<!-- Don't trust this. XML patterns don't support lookahead/lookbehind, so we can't negate a char sequence. -->
|
||||
<xs:simpleType name="t_windows_reldirpath">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*[^\\](([^\\]*)+\\?)+\s*"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- ABSOLUTE file path -->
|
||||
<xs:simpleType name="t_windows_filepath">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*(~|[A-Za-z]+:)?(\\[^\\]+)+\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- RELATIVE file path -->
|
||||
<xs:simpleType name="t_windows_relfilepath">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*([^\\]+)(\\[^\\]+)*([^\\])*\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- ABSOLUTE path (file or directory) -->
|
||||
<xs:simpleType name="t_windows_path">
|
||||
<xs:union memberTypes="t_windows_dirpath t_windows_filepath"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- RELATIVE path (file or directory) -->
|
||||
<xs:simpleType name="t_windows_relpath">
|
||||
<xs:union memberTypes="t_windows_reldirpath t_windows_relfilepath"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- ANY valid value for the above types. -->
|
||||
<xs:simpleType name="t_windows_anypath">
|
||||
<xs:union memberTypes="t_windows_path t_windows_relpath"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- RELATIVE or ABSOLUTE file path -->
|
||||
<xs:simpleType name="t_windows_anyfile">
|
||||
<xs:union memberTypes="t_windows_filepath t_windows_relfilepath"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- RELATIVE or ABSOLUTE dir path -->
|
||||
<xs:simpleType name="t_windows_anydir">
|
||||
<xs:union memberTypes="t_windows_dirpath t_windows_reldirpath"/>
|
||||
</xs:simpleType>
|
||||
|
||||
</xs:schema>
|
31
schema/projects/go_libxml2.xsd
Normal file
31
schema/projects/go_libxml2.xsd
Normal file
@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema targetNamespace="http://xmlsoft.org/"
|
||||
xmlns="http://xmlsoft.org/"
|
||||
xmlns:libxml2="http://xmlsoft.org/"
|
||||
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
|
||||
<xs:include schemaLocation="../lib/types/cksum.xsd"/>
|
||||
<xs:include schemaLocation="../lib/types/std.xsd"/>
|
||||
|
||||
<xs:element name="libxml2">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="sub">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="sub2" type="xs:string" minOccurs="0"/>
|
||||
<xs:element name="nestedInclude" type="t_cksum_hash" minOccurs="1" maxOccurs="1"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="attrOpt" use="optional" default="none specified" type="xs:string"/>
|
||||
<xs:attribute name="attrReq" use="required" type="t_std_nonempty"/>
|
||||
<xs:attribute name="attrBoolNoDef" use="optional" type="xs:boolean"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
</xs:schema>
|
26
schema/projects/gomodh.xsd
Normal file
26
schema/projects/gomodh.xsd
Normal file
@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema targetNamespace="https://go.r00t2.io/"
|
||||
xmlns="https://go.r00t2.io/"
|
||||
xmlns:gomodh="https://go.r00t2.io/"
|
||||
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="../lib/types/net.xsd"/>
|
||||
<xs:include schemaLocation="../lib/types/gomodh.xsd"/>
|
||||
|
||||
<xs:element name="gomodh">
|
||||
<xs:complexType>
|
||||
<xs:choice minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="mod" type="t_gomodh_mod"/>
|
||||
<xs:element name="pkg" type="t_gomodh_pkg"/>
|
||||
</xs:choice>
|
||||
<xs:attribute name="baseURL" type="t_net_http_basic_uri" use="required"/>
|
||||
</xs:complexType>
|
||||
<xs:key name="key_name">
|
||||
<xs:selector xpath="./*"/>
|
||||
<xs:field xpath="@name"/>
|
||||
</xs:key>
|
||||
</xs:element>
|
||||
|
||||
</xs:schema>
|
56
schema/projects/ipxe/build.xsd
Normal file
56
schema/projects/ipxe/build.xsd
Normal file
@ -0,0 +1,56 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema targetNamespace="https://router.r00t2.io/boootbox/ipxe/build/"
|
||||
xmlns="https://router.r00t2.io/boootbox/ipxe/build/"
|
||||
xmlns:ipxe="https://router.r00t2.io/boootbox/ipxe/build/"
|
||||
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="../../lib/types/unix.xsd"/>
|
||||
<xs:include schemaLocation="../../lib/types/ipxe.xsd"/>
|
||||
<xs:include schemaLocation="../../lib/elements/ipxe.xsd"/>
|
||||
|
||||
<xs:element name="ipxe">
|
||||
<xs:complexType>
|
||||
<xs:all minOccurs="1">
|
||||
<xs:element name="source">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="0">
|
||||
<xs:choice minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="patchSet" minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1" maxOccurs="2">
|
||||
<xs:element name="switchOpts" maxOccurs="1" type="e_ipxe_optswitch"/>
|
||||
<xs:element name="patch" maxOccurs="1" type="t_ipxe_patch"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="upstream" minOccurs="1" maxOccurs="1" type="e_ipxe_upstream"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="srcDir" type="t_unix_dirpath" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="build">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1" maxOccurs="4">
|
||||
<xs:choice minOccurs="1" maxOccurs="4">
|
||||
<xs:element name="dest" minOccurs="1" maxOccurs="1" type="t_unix_dirpath"/>
|
||||
<xs:element name="scripts" minOccurs="1" maxOccurs="1" type="e_ipxe_scripts"/>
|
||||
<xs:element name="roms" minOccurs="1" maxOccurs="1" type="t_ipxe_roms"/>
|
||||
<xs:element name="extraTargets" minOccurs="0" maxOccurs="1" type="e_ipxe_extratargets"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="iso" type="xs:boolean" use="optional" default="false"/>
|
||||
<xs:attribute name="usb" type="xs:boolean" use="optional" default="false"/>
|
||||
<xs:attribute name="floppy" type="xs:boolean" use="optional" default="false"/>
|
||||
<xs:attribute name="mbr" type="xs:boolean" use="optional" default="false"/>
|
||||
<xs:attribute name="pxe" type="xs:boolean" use="optional" default="false"/>
|
||||
<xs:attribute name="undi" type="xs:boolean" use="optional" default="false"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
</xs:schema>
|
0
schema/projects/podloader.xsd
Normal file
0
schema/projects/podloader.xsd
Normal file
41
schema/projects/repomirror.xsd
Normal file
41
schema/projects/repomirror.xsd
Normal file
@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema targetNamespace="https://git.square-r00t.net/RepoMirror/"
|
||||
xmlns="https://git.square-r00t.net/RepoMirror/"
|
||||
xmlns:tunnel="https://git.square-r00t.net/RepoMirror/"
|
||||
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="../lib/types/net.xsd"/>
|
||||
<xs:include schemaLocation="../lib/types/repomirror.xsd"/>
|
||||
<xs:include schemaLocation="../lib/types/std.xsd"/>
|
||||
<xs:include schemaLocation="../lib/elements/repomirror.xsd"/>
|
||||
|
||||
<!-- ROOT -->
|
||||
<xs:element name="mirror">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="distro">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1">
|
||||
<xs:choice minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="upstream" type="e_repomir_upstream" minOccurs="1" maxOccurs="unbounded"/>
|
||||
<xs:element name="dest" type="t_unix_dirpath" minOccurs="1" maxOccurs="1"/>
|
||||
<xs:element name="lastLocalCheck" type="e_repomir_tstmp_file" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="lastLocalSync" type="e_repomir_tstmp_file" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="lastRemoteUpdate" type="e_repomir_remote_tstmp_file" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="lastRemoteSync" type="e_repomir_remote_tstmp_file" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="mountCheck" type="t_unix_dirpath" minOccurs="1"/>
|
||||
<xs:element name="owner" type="e_repomir_owner" minOccurs="0"/>
|
||||
<xs:element name="rsyncArgs" minOccurs="0" maxOccurs="1" type="t_unix_args"/>
|
||||
<xs:element name="rsyncIgnore" minOccurs="0" maxOccurs="1" type="e_repomir_ignoreExit"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="name" type="xs:ID" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
</xs:schema>
|
37
schema/projects/resumegen.xsd
Normal file
37
schema/projects/resumegen.xsd
Normal file
@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema targetNamespace="https://resume.r00t2.io/"
|
||||
xmlns="https://resume.r00t2.io/"
|
||||
xmlns:resume="https://resume.r00t2.io/"
|
||||
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="../lib/elements/resumegen.xsd"/>
|
||||
|
||||
<xs:element name="portfolio">
|
||||
<xs:complexType>
|
||||
<xs:all>
|
||||
<xs:element name="resume">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="3">
|
||||
<xs:element name="name" minOccurs="1" maxOccurs="1" type="e_resume_name"/>
|
||||
<xs:element name="contact" minOccurs="1" maxOccurs="1" type="e_resume_contact"/>
|
||||
<xs:element name="location" minOccurs="1" maxOccurs="1" type="e_resume_location"/>
|
||||
<xs:element name="workExperience" minOccurs="0" maxOccurs="1" type="e_resume_workExperience"/>
|
||||
<xs:element name="certifications" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="education" minOccurs="0" maxOccurs="1"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="cv">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1">
|
||||
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
</xs:schema>
|
@ -1,12 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema targetNamespace="https://tunnelbroker.net/"
|
||||
xmlns="https://tunnelbroker.net/"
|
||||
xmlns:heIPv6="https://tunelbroker.net/"
|
||||
xmlns:heIPv6="https://tunnelbroker.net/"
|
||||
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="../lib/elements/he_ipv6.xsd"/>
|
||||
<xs:include schemaLocation="../../lib/elements/he_ipv6.xsd"/>
|
||||
|
||||
<!-- ROOT -->
|
||||
<xs:element name="heIPv6">
|
52
schema/projects/router/networks.xsd
Normal file
52
schema/projects/router/networks.xsd
Normal file
@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema targetNamespace="https://router.r00t2.io/network/"
|
||||
xmlns="https://router.r00t2.io/network/"
|
||||
xmlns:networks="https://router.r00t2.io/network/"
|
||||
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="../../lib/types/linux.xsd"/>
|
||||
<xs:include schemaLocation="../../lib/types/net.xsd"/>
|
||||
<xs:include schemaLocation="../../lib/types/router.xsd"/>
|
||||
|
||||
<xs:element name="networks">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1">
|
||||
<xs:element name="network" minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:all>
|
||||
<xs:element name="dnsMasqTag" type="xs:token" minOccurs="0"/>
|
||||
<xs:element name="iface" type="t_router_iface"/>
|
||||
<xs:element name="addrs" minOccurs="0">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="ip4" type="t_net_qualified_addr_ip4"/>
|
||||
<xs:element name="ip6">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_net_qualified_addr_ip6">
|
||||
<xs:attribute name="dhcp" use="optional" type="xs:boolean" default="false"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="notes" minOccurs="0">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1">
|
||||
<xs:element name="note" minOccurs="1" maxOccurs="unbounded" type="xs:string"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:all>
|
||||
<xs:attribute name="name" type="xs:ID" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
</xs:schema>
|
51
schema/projects/rss2.0.xsd
Normal file
51
schema/projects/rss2.0.xsd
Normal file
@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema targetNamespace="https://www.rssboard.org/rss-specification/"
|
||||
xmlns="https://www.rssboard.org/rss-specification"
|
||||
xmlns:rss="https://www.rssboard.org/rss-specification"
|
||||
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="../lib/types/net.xsd"/>
|
||||
<xs:include schemaLocation="../lib/types/rss2.0.xsd"/>
|
||||
|
||||
<!--
|
||||
CURRENT RSS VERSION: 2.0.8
|
||||
It should be specified as an <rss> attribute as `version="2.0"`, though.
|
||||
-->
|
||||
<!-- ROOT -->
|
||||
<xs:element name="rss">
|
||||
<xs:complexType>
|
||||
<xs:all>
|
||||
<xs:element name="channel" minOccurs="1" maxOccurs="1">
|
||||
<!--
|
||||
This is my *opinion*. RSS 2.0 specification does not indicate if the elements should be in order or not.
|
||||
I enforce it for easy conformance to spec and to remove any ambiguity.
|
||||
I base the ordering on the sample 2.0 feed (https://www.rssboard.org/files/sample-rss-2.xml).
|
||||
-->
|
||||
<xs:sequence>
|
||||
<xs:element name="title" type="xs:normalizedString" minOccurs="1" maxOccurs="1"/>
|
||||
<xs:element name="link" type="t_net_http_basic_uri" minOccurs="1" maxOccurs="1"/>
|
||||
<xs:element name="description" type="xs:string" minOccurs="1" maxOccurs="1"/>
|
||||
<!--
|
||||
TODO: This has a pattern definition per:
|
||||
https://www.rssboard.org/rss-language-codes
|
||||
https://www.w3.org/TR/REC-html40/struct/dirlang.html#langcodes
|
||||
Maybe an enumeration at some point? But it's... thousands of possible combinations.
|
||||
And allowances are made for non-official ones, too.
|
||||
-->
|
||||
<xs:element name="language" type="xs:normalizedString" minOccurs="0" maxOccurs="1" default="en-us"/>
|
||||
<xs:element name="copyright" type="xs:normalizedString" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="managingEditor" type="xs:normalizedString" minOccurs="0" maxOccurs="1"/>
|
||||
</xs:sequence>
|
||||
</xs:element>
|
||||
</xs:all>
|
||||
<!--
|
||||
There isn't really a well-defined type string in the RSS spec for what version's valid values ARE, as they specify the version.
|
||||
"xs:token" should be safe/sane enough.
|
||||
-->
|
||||
<xs:attribute name="version" type="xs:token" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
</xs:schema>
|
39
schema/projects/tunnelbroker.tun.xsd
Normal file
39
schema/projects/tunnelbroker.tun.xsd
Normal file
@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema targetNamespace="https://tunnelbroker.net/tunnelInfo.php?tid"
|
||||
xmlns="https://tunnelbroker.net/tunnelInfo.php?tid"
|
||||
xmlns:tunnel="https://tunnelbroker.net/tunnelInfo.php?tid"
|
||||
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="../lib/types/net.xsd"/>
|
||||
<xs:include schemaLocation="../lib/types/std.xsd"/>
|
||||
|
||||
<!-- ROOT -->
|
||||
<xs:element name="tunnel">
|
||||
<xs:complexType>
|
||||
<xs:all minOccurs="1" maxOccurs="1">
|
||||
<xs:element name="description" type="xs:string" minOccurs="1" maxOccurs="1"/>
|
||||
<xs:element name="serverv4" type="t_net_addr_ip4" minOccurs="1" maxOccurs="1"/>
|
||||
<xs:element name="clientv4" type="t_net_addr_ip4" minOccurs="1" maxOccurs="1"/>
|
||||
<xs:element name="serverv6" type="t_net_addr_ip6" minOccurs="1" maxOccurs="1"/>
|
||||
<xs:element name="clientv6" type="t_net_addr_ip6" minOccurs="1" maxOccurs="1"/>
|
||||
<xs:element name="routed64" type="t_net_qualified_addr_ip6" minOccurs="1" maxOccurs="1"/>
|
||||
<xs:element name="routed48" type="t_net_qualified_addr_ip6" minOccurs="0" maxOccurs="1"/>
|
||||
<!--
|
||||
FYI, these are FQDNs... but it's more or less impossible to validate through XSD so we let code do that.
|
||||
-->
|
||||
<!-- BEGIN THE FUCKERY. -->
|
||||
<xs:element name="rdns1" type="t_std_nonempty" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="rdns2" type="t_std_nonempty" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="rdns3" type="t_std_nonempty" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="rdns4" type="t_std_nonempty" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="rdns5" type="t_std_nonempty" minOccurs="0" maxOccurs="1"/>
|
||||
<!-- END THE FUCKERY. -->
|
||||
</xs:all>
|
||||
<xs:attribute name="id" type="xs:positiveInteger" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
|
||||
</xs:schema>
|
44
schema/projects/tunnelbroker.xsd
Normal file
44
schema/projects/tunnelbroker.xsd
Normal file
@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema targetNamespace="https://tunnelbroker.net/tunnelInfo.php"
|
||||
xmlns="https://tunnelbroker.net/tunnelInfo.php"
|
||||
xmlns:tunnels="https://tunnelbroker.net/tunnelInfo.php"
|
||||
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="../lib/types/net.xsd"/>
|
||||
<xs:include schemaLocation="../lib/types/std.xsd"/>
|
||||
|
||||
<!-- ROOT -->
|
||||
<xs:element name="tunnels">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="tunnel" minOccurs="1" maxOccurs="5">
|
||||
<xs:complexType>
|
||||
<xs:all minOccurs="1" maxOccurs="1">
|
||||
<xs:element name="description" type="xs:string" minOccurs="1" maxOccurs="1"/>
|
||||
<xs:element name="serverv4" type="t_net_addr_ip4" minOccurs="1" maxOccurs="1"/>
|
||||
<xs:element name="clientv4" type="t_net_addr_ip4" minOccurs="1" maxOccurs="1"/>
|
||||
<xs:element name="serverv6" type="t_net_addr_ip6" minOccurs="1" maxOccurs="1"/>
|
||||
<xs:element name="clientv6" type="t_net_addr_ip6" minOccurs="1" maxOccurs="1"/>
|
||||
<xs:element name="routed64" type="t_net_qualified_addr_ip6" minOccurs="1" maxOccurs="1"/>
|
||||
<xs:element name="routed48" type="t_net_qualified_addr_ip6" minOccurs="0" maxOccurs="1"/>
|
||||
<!--
|
||||
FYI, these are FQDNs... but it's more or less impossible to validate through XSD so we let code do that.
|
||||
-->
|
||||
<!-- BEGIN THE FUCKERY. -->
|
||||
<xs:element name="rdns1" type="t_std_nonempty" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="rdns2" type="t_std_nonempty" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="rdns3" type="t_std_nonempty" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="rdns4" type="t_std_nonempty" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="rdns5" type="t_std_nonempty" minOccurs="0" maxOccurs="1"/>
|
||||
<!-- END THE FUCKERY. -->
|
||||
</xs:all>
|
||||
<xs:attribute name="id" type="xs:positiveInteger" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
</xs:schema>
|
@ -1,7 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema targetNamespace="https://git.square-r00t.net/VaultPass/"
|
||||
xmlns="https://git.square-r00t.net/VaultPass/"
|
||||
xmlns:vaultpass="https://git.square-r00t.net/VaultPass/"
|
||||
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
@ -12,25 +11,44 @@
|
||||
<!-- ROOT -->
|
||||
<xs:element name="vaultpass">
|
||||
<xs:complexType>
|
||||
<xs:all>
|
||||
<xs:element name="server" minOccurs="1" maxOccurs="1">
|
||||
<xs:sequence>
|
||||
<xs:element name="server" minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:all>
|
||||
<xs:element name="uri" type="t_std_uri" minOccurs="0" maxOccurs="1"
|
||||
default="http://localhost:8200/"/>
|
||||
<xs:element ref="t_vaultpass_unsealselect" minOccurs="0" maxOccurs="1"/>
|
||||
<!-- We don't use this anymore because groups don't play very nicely with a lot of libraries. Shame. -->
|
||||
<!-- <xs:element ref="e_vaultpass_unsealselect" minOccurs="0" maxOccurs="1"/> -->
|
||||
<xs:element name="unseal">
|
||||
<xs:complexType>
|
||||
<xs:choice minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="unsealGpg" type="t_vaultpass_star_gpg"/>
|
||||
<xs:element name="unsealPlain" type="t_std_base64"/>
|
||||
</xs:choice>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<!-- We don't use this anymore because groups don't play very nicely with a lot of libraries. Shame. -->
|
||||
<!-- <xs:element ref="e_vaultpass_authselect" minOccurs="1" maxOccurs="1"/> -->
|
||||
<xs:element name="auth" minOccurs="1" maxOccurs="1">
|
||||
<xs:complexType>
|
||||
<xs:choice minOccurs="1" maxOccurs="1">
|
||||
<xs:element name="authGpg" type="t_vaultpass_star_gpg"/>
|
||||
<xs:element name="authPlain" type="t_vaultpass_auth_plain"/>
|
||||
</xs:choice>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="mounts" minOccurs="0" maxOccurs="1">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="mount" minOccurs="1" maxOccurs="unbounded" type="t_vaultpass_mount"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:all>
|
||||
<xs:attribute name="id" type="xs:ID" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element ref="t_vaultpass_authselect" minOccurs="1" maxOccurs="1"/>
|
||||
<xs:element name="mounts" minOccurs="0" maxOccurs="1">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="mount" minOccurs="1" maxOccurs="unbounded" type="t_vaultpass_mount"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:all>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
|
18
test/go_libxml2_local.xml
Normal file
18
test/go_libxml2_local.xml
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<libxml2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://xmlsoft.org/"
|
||||
xsi:schemaLocation="http://xmlsoft.org/ ./schema/projects/go_libxml2_local.xsd">
|
||||
|
||||
<sub attrReq="foo" attrOpt="bar">
|
||||
<nestedInclude hashType="sha1">4cfcf843c66979eb1df2bd0c52817edb753a52ba</nestedInclude>
|
||||
</sub>
|
||||
<sub attrReq="foo2">
|
||||
<sub2>this is a test string only.</sub2>
|
||||
<nestedInclude hashType="sha512">be218408a748759fb98363593b8f544eb054171bced856ca98bd972823dec0b07b205453fc3c46f23c934d0959f1e05b609c011b6ada84a7050ad7c910b24bf1</nestedInclude>
|
||||
</sub>
|
||||
<sub attrReq="foo3" attrBoolNoDef="false">
|
||||
<sub2>foobar</sub2>
|
||||
<nestedInclude hashType="md5">f7b34871a562283ee92bbda00485eb45</nestedInclude>
|
||||
</sub>
|
||||
|
||||
</libxml2>
|
18
test/go_libxml2_remote.xml
Normal file
18
test/go_libxml2_remote.xml
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<libxml2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://xmlsoft.org/"
|
||||
xsi:schemaLocation="http://xmlsoft.org/ http://schema.xml.r00t2.io/projects/go_libxml2.xsd">
|
||||
|
||||
<sub attrReq="foo" attrOpt="bar">
|
||||
<nestedInclude hashType="sha1">4cfcf843c66979eb1df2bd0c52817edb753a52ba</nestedInclude>
|
||||
</sub>
|
||||
<sub attrReq="foo2">
|
||||
<sub2>this is a test string only.</sub2>
|
||||
<nestedInclude hashType="sha512">be218408a748759fb98363593b8f544eb054171bced856ca98bd972823dec0b07b205453fc3c46f23c934d0959f1e05b609c011b6ada84a7050ad7c910b24bf1</nestedInclude>
|
||||
</sub>
|
||||
<sub attrReq="foo3" attrBoolNoDef="false">
|
||||
<sub2>foobar</sub2>
|
||||
<nestedInclude hashType="md5">f7b34871a562283ee92bbda00485eb45</nestedInclude>
|
||||
</sub>
|
||||
|
||||
</libxml2>
|
76
test/schema/lib/types/cksum.xsd
Normal file
76
test/schema/lib/types/cksum.xsd
Normal file
@ -0,0 +1,76 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="./std.xsd"/>
|
||||
<xs:include schemaLocation="./net.xsd"/>
|
||||
<xs:include schemaLocation="./unix.xsd"/>
|
||||
|
||||
<xs:simpleType name="t_cksum_algo">
|
||||
<!-- Geared towards python. -->
|
||||
<!-- tuple(sorted(list(hashlib.algorithms_available.union(set(('adler32', 'crc32')))))) -->
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="adler32"/>
|
||||
<xs:enumeration value="blake2b"/>
|
||||
<xs:enumeration value="blake2s"/>
|
||||
<xs:enumeration value="crc32"/>
|
||||
<xs:enumeration value="md4"/>
|
||||
<xs:enumeration value="md5"/>
|
||||
<xs:enumeration value="md5-sha1"/>
|
||||
<xs:enumeration value="mdc2"/>
|
||||
<xs:enumeration value="ripemd160"/>
|
||||
<xs:enumeration value="sha1"/>
|
||||
<xs:enumeration value="sha224"/>
|
||||
<xs:enumeration value="sha256"/>
|
||||
<xs:enumeration value="sha384"/>
|
||||
<xs:enumeration value="sha3_224"/>
|
||||
<xs:enumeration value="sha3_256"/>
|
||||
<xs:enumeration value="sha3_384"/>
|
||||
<xs:enumeration value="sha3_512"/>
|
||||
<xs:enumeration value="sha512"/>
|
||||
<xs:enumeration value="sha512_224"/>
|
||||
<xs:enumeration value="sha512_256"/>
|
||||
<xs:enumeration value="shake_128"/>
|
||||
<xs:enumeration value="shake_256"/>
|
||||
<xs:enumeration value="sm3"/>
|
||||
<xs:enumeration value="whirlpool"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_cksum_file">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_net_generic_resource">
|
||||
<xs:attribute name="hashType" use="required" type="t_cksum_algo"/>
|
||||
<xs:attribute name="fileType" use="required" type="t_cksum_file_filetype"/>
|
||||
<xs:attribute name="filePath" use="optional" type="t_unix_filepath"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:simpleType name="t_cksum_file_filetype">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="gnu"/>
|
||||
<xs:enumeration value="bsd"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_cksum_hash">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_std_nonempty">
|
||||
<xs:attribute name="hashType" use="required" type="t_cksum_algo"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="t_cksum_verify">
|
||||
<xs:choice minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="checksum" minOccurs="0" maxOccurs="unbounded" type="t_cksum_hash">
|
||||
</xs:element>
|
||||
<xs:element name="checksumFile" minOccurs="0" maxOccurs="unbounded" type="t_cksum_file"/>
|
||||
</xs:choice>
|
||||
</xs:complexType>
|
||||
|
||||
</xs:schema>
|
197
test/schema/lib/types/net.xsd
Normal file
197
test/schema/lib/types/net.xsd
Normal file
@ -0,0 +1,197 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="./std.xsd"/>
|
||||
|
||||
<xs:simpleType name="t_net_addr_ip4">
|
||||
<xs:restriction base="xs:string">
|
||||
<!-- This is a REALLY LAZY regex. Matching IPv4 in regex is ugly as heck, so we do that in-code.
|
||||
This is just a gatekeeper. -->
|
||||
<xs:pattern value="\s*[0-9.]{7,15}\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_net_addr_ip6">
|
||||
<xs:restriction base="xs:string">
|
||||
<!-- This is a REALLY LAZY regex. Matching IPv6 in regex is ugly as heck, so we do that in-code.
|
||||
This is just a gatekeeper. -->
|
||||
<xs:pattern value="\s*[A-Za-z0-9:]+\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_net_authselect">
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:enumeration value="basic"/>
|
||||
<xs:enumeration value="digest"/>
|
||||
<xs:enumeration value="none"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_net_auto_ip6">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="slaac"/>
|
||||
<xs:enumeration value="dhcp6"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_net_both_addr">
|
||||
<xs:union memberTypes="t_net_addr_ip4 t_net_addr_ip6"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_net_both_qualified_addr">
|
||||
<xs:union memberTypes="t_net_qualified_addr_ip4 t_net_qualified_addr_ip6"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_net_email_addr">
|
||||
<xs:restriction base="xs:string">
|
||||
<!-- Thanks, my dude: https://stackoverflow.com/a/2147859/733214 -->
|
||||
<!-- And turns out email local parts are WAY more permissive than I thought:
|
||||
https://stackoverflow.com/a/2049510/733214 -->
|
||||
<xs:pattern value="[^@]+@[^\.]+\..+"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_net_ftp_resource">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_std_uri">
|
||||
<xs:attribute name="user" type="t_std_nonempty" use="optional" default="anonymous"/>
|
||||
<xs:attribute name="password" type="t_std_nonempty" use="optional"/>
|
||||
<!-- This should be handled in-application by looking at the scheme in the URI itself. -->
|
||||
<!-- <xs:attribute name="startTLS" type="xs:boolean" use="optional" default="false"/> -->
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="t_net_generic_resource">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_std_uri">
|
||||
<xs:attribute name="user" type="t_std_nonempty" use="optional"/>
|
||||
<xs:attribute name="password" type="t_std_nonempty" use="optional"/><!-- If FTP & none, "anonymous" -->
|
||||
<!-- This should be handled in-application by looking at the scheme in the URI itself. -->
|
||||
<!-- <xs:attribute name="startTLS" type="xs:boolean" use="optional" default="false"/> --><!-- FTP -->
|
||||
<xs:attribute name="authType" type="t_net_authselect" use="optional" default="none"/><!-- HTTP(S) -->
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="t_net_http_resource">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_std_uri">
|
||||
<xs:attribute name="user" type="t_std_nonempty" use="optional"/>
|
||||
<xs:attribute name="password" type="t_std_nonempty" use="optional"/>
|
||||
<xs:attribute name="authtype" type="t_net_authselect" use="optional" default="none"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:simpleType name="t_net_http_basic_uri">
|
||||
<xs:restriction base="xs:anyURI">
|
||||
<xs:pattern value="https?://.+/?"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_net_mac_addr">
|
||||
<xs:restriction base="xs:token">
|
||||
<!-- EUI48[RFC7043§3] (previously MAC48[RFC7042§2.1]) -->
|
||||
<xs:pattern value="\s*([A-Fa-f0-9]{2}[:-]?){5}[A-Fa-f0-9]{2}\s*"/>
|
||||
<!-- EUI64[RFC7043§4, RFC4291§2.5.1] -->
|
||||
<xs:pattern value="\s*([A-Fa-f0-9]{2}[:-]?){3}[Ff]{3}[FfEe][:-]?([A-Fa-f0-9]{2}[:-]?){2}[A-Fa-f0-9]{2}\s*"/>
|
||||
<xs:pattern
|
||||
value="\s*([A-Fa-f0-9]{2}[:-]?){3}[A-Fa-f0-9]{4}[:-]?([A-Fa-f0-9]{2}[:-]?){2}[A-Fa-f0-9]{2}\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_net_netproto">
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:enumeration value="ipv4"/>
|
||||
<xs:enumeration value="ipv6"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_net_port">
|
||||
<xs:restriction base="xs:positiveInteger">
|
||||
<xs:minInclusive value="1"/>
|
||||
<xs:maxInclusive value="65535"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_net_proto">
|
||||
<!-- TODO: expand? Remove gre? -->
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="tcp"/>
|
||||
<xs:enumeration value="udp"/>
|
||||
<xs:enumeration value="icmp"/>
|
||||
<xs:enumeration value="gre"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_net_qualified_addr_ip4">
|
||||
<!-- This is a REALLY LAZY regex. Matching IPv4 in regex is ugly as heck, so we do that in-code.
|
||||
This is just a gatekeeper. -->
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*[0-9.]{7,15}/[0-9]{1,2}\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_net_qualified_addr_ip6">
|
||||
<!-- This is a REALLY LAZY regex. Matching IPv6 in regex is ugly as heck, so we do that in-code.
|
||||
This is just a gatekeeper. -->
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*[A-Za-z0-9:]+/[0-9]{1,3}\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- TODO: "enterprise" WPA2 (add'l details)?
|
||||
WPA3?
|
||||
EAP,
|
||||
eduroam (https://github.com/rst0git/netctl-eduroam-config/blob/master/eduroam), etc. -->
|
||||
<!-- wep64, wep128, wpa-psk:tkip, wpa-psk:aes, wpa2-psk:tkip, wpa2-psk:aes, wpa2-psk:tkip/aes -->
|
||||
<xs:complexType name="t_net_wifi_crypto">
|
||||
<xs:all>
|
||||
<xs:element name="type" minOccurs="1" maxOccurs="1" default="wpa2">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:token">
|
||||
<!-- <xs:enumeration value="wep"/> -->
|
||||
<xs:enumeration value="wpa"/>
|
||||
<xs:enumeration value="wpa2"/>
|
||||
<!-- <xs:enumeration value="wpa3"/> -->
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<!-- Only valid for WPA/WPA2 (and maybe WPA3 once supported?) -->
|
||||
<xs:element name="creds" minOccurs="1" maxOccurs="1">
|
||||
<xs:complexType>
|
||||
<xs:choice minOccurs="1" maxOccurs="1">
|
||||
<!-- "personal" -->
|
||||
<xs:element name="psk">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
<!-- A key can be generated via "wpa_passphrase <ssid> <passphrase>" -->
|
||||
<!-- or via genPSK.py in extras/ -->
|
||||
<xs:attribute name="isKey" type="xs:boolean" use="optional" default="false"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<!-- TODO -->
|
||||
<!-- <xs:element name="enterprise"></xs:element> -->
|
||||
</xs:choice>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
|
||||
</xs:schema>
|
62
test/schema/lib/types/std.xsd
Normal file
62
test/schema/lib/types/std.xsd
Normal file
@ -0,0 +1,62 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:simpleType name="t_std_UUID4">
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:pattern value="\s*[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_std_base64">
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:pattern value="[A-Za-z0-9+/=]+"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_std_cmdopts">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
<xs:attribute name="name" use="required" type="xs:token"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:simpleType name="t_std_envvar">
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:pattern value="env:[A-Za-z_]+[A-Za-z0-9_]*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_std_epoch_or_iso">
|
||||
<!-- positiveInteger is used for UNIX Epoch. -->
|
||||
<xs:union memberTypes="xs:dateTime xs:positiveInteger"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_std_list_comma">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="[^,]+(,[^,])*"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_std_list_space">
|
||||
<xs:list itemType="xs:token"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_std_nonempty">
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:minLength value="1"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_std_uri">
|
||||
<xs:restriction base="xs:anyURI">
|
||||
<xs:pattern value="\s*(https?|ftps?|file)://.+\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
</xs:schema>
|
178
test/schema/lib/types/unix.xsd
Normal file
178
test/schema/lib/types/unix.xsd
Normal file
@ -0,0 +1,178 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
<xs:include schemaLocation="./std.xsd"/>
|
||||
|
||||
<xs:complexType name="t_unix_arg">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
<xs:attribute name="value" type="xs:string" use="optional"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="t_unix_args">
|
||||
<xs:choice minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="long" type="t_unix_arg"/>
|
||||
<xs:element name="short" type="t_unix_arg"/>
|
||||
</xs:choice>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- These were a pain to figure out. -->
|
||||
<!-- wtf. doesn't seem to work?
|
||||
dir: ^\s*(~?/[^/]*)+/?\s*$
|
||||
file: ^\s*(~?/[^/]+)+\s*$
|
||||
reldir: ^\s*[^/](([^/]*)+/?)+\s*$
|
||||
relfile: ^\s*[^/]+(/|[^/]*)*[^/]+\s*$
|
||||
-->
|
||||
<!-- ABSOLUTE directory path -->
|
||||
<xs:simpleType name="t_unix_dirpath">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*(~?/[^/]*)+/?\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- RELATIVE directory path -->
|
||||
<xs:simpleType name="t_unix_reldirpath">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*[^/](([^/]*)+/?)+\s*"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- ABSOLUTE file path -->
|
||||
<xs:simpleType name="t_unix_filepath">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*(~?/[^/]+)+\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- RELATIVE file path -->
|
||||
<xs:simpleType name="t_unix_relfilepath">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\s*([^/]+)(/[^/]+)*([^/])*\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- ABSOLUTE path (file or directory) -->
|
||||
<xs:simpleType name="t_unix_path">
|
||||
<xs:union memberTypes="t_unix_dirpath t_unix_filepath"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- RELATIVE path (file or directory) -->
|
||||
<xs:simpleType name="t_unix_relpath">
|
||||
<xs:union memberTypes="t_unix_reldirpath t_unix_relfilepath"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- ANY valid value for the above types. -->
|
||||
<xs:simpleType name="t_unix_anypath">
|
||||
<xs:union memberTypes="t_unix_path t_unix_relpath"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- RELATIVE or ABSOLUTE file path -->
|
||||
<xs:simpleType name="t_unix_anyfile">
|
||||
<xs:union memberTypes="t_unix_filepath t_unix_relfilepath"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- RELATIVE or ABSOLUTE dir path -->
|
||||
<xs:simpleType name="t_unix_anydir">
|
||||
<xs:union memberTypes="t_unix_dirpath t_unix_reldirpath"/>
|
||||
</xs:simpleType>
|
||||
<!-- END of regex silliness. What an ugly annoyance. -->
|
||||
|
||||
<xs:complexType name="t_unix_nixpass">
|
||||
<xs:choice minOccurs="1" maxOccurs="1">
|
||||
<xs:element name="passwordPlain">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
<xs:attribute name="hashType" use="optional" default="md5" type="t_unix_passwd_hashtypes"/>
|
||||
<xs:attribute name="rounds" use="optional" default="5000" type="xs:positiveInteger"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="passwordHash">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="t_unix_shadowhash">
|
||||
<xs:attribute name="hashType" use="optional" default="md5" type="t_unix_passwd_hashtypes"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:choice>
|
||||
<xs:attribute name="locked" use="optional" default="false" type="xs:boolean"/>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:simpleType name="t_unix_passwd_hashtypes">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="md5"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282 -->
|
||||
<xs:simpleType name="t_unix_portablePosixFilename">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="[A-Za-z0-9._-]+"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_unix_posixUserGroup">
|
||||
<!-- https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_437
|
||||
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282
|
||||
https://unix.stackexchange.com/a/435120/284004 -->
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:pattern value="\s*[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}$)\s*"/>
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="t_unix_shadowhash">
|
||||
<!-- http://man7.org/linux/man-pages/man3/crypt.3.html#NOTES -->
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:pattern value="\s*($1)?($[a-zA-Z0-9./]{1,16})$[a-zA-Z0-9./]{22}\s*"/><!-- md5 -->
|
||||
<xs:whiteSpace value="collapse"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:complexType name="t_unix_user">
|
||||
<xs:sequence>
|
||||
<xs:element name="password" minOccurs="0" maxOccurs="1" type="t_unix_nixpass"/>
|
||||
<xs:element name="xGroup" minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:attribute name="name" type="t_unix_posixUserGroup" use="required"/>
|
||||
<xs:attribute name="create" type="xs:boolean" use="optional" default="false"/>
|
||||
<xs:attribute name="gid" type="xs:positiveInteger" use="optional"/>
|
||||
</xs:complexType>
|
||||
<xs:unique name="uniq_unix_grp">
|
||||
<xs:selector xpath="xGroup"/>
|
||||
<xs:field xpath="@name"/>
|
||||
</xs:unique>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="name" type="t_unix_posixUserGroup" use="required"/>
|
||||
<xs:attribute name="home" type="t_unix_filepath" use="optional"/>
|
||||
<xs:attribute name="uid" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="group" type="t_unix_posixUserGroup" use="optional"/>
|
||||
<xs:attribute name="gid" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="comment" type="t_std_nonempty" use="optional"/>
|
||||
<xs:attribute name="sudo" type="xs:boolean" use="optional" default="false"/>
|
||||
<xs:attribute name="sudoPassword" type="xs:boolean" use="optional" default="true"/>
|
||||
<xs:attribute name="shell" type="t_unix_filepath" use="optional" default="/bin/bash"/>
|
||||
<!-- TODO: change the positiveIntegers to xs:duration? or union? -->
|
||||
<!-- Might be pointless since the smallest increment is 1 day in
|
||||
shadow(5). -->
|
||||
<xs:attribute name="minAge" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="maxAge" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="warnDays" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="inactiveDays" type="xs:positiveInteger" use="optional"/>
|
||||
<xs:attribute name="expireDate" type="t_std_epoch_or_iso" use="optional"/>
|
||||
</xs:complexType>
|
||||
|
||||
</xs:schema>
|
31
test/schema/projects/go_libxml2_local.xsd
Normal file
31
test/schema/projects/go_libxml2_local.xsd
Normal file
@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xs:schema targetNamespace="http://xmlsoft.org/"
|
||||
xmlns="http://xmlsoft.org/"
|
||||
xmlns:libxml2="http://xmlsoft.org/"
|
||||
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
|
||||
<xs:include schemaLocation="../lib/types/cksum.xsd"/>
|
||||
<xs:include schemaLocation="../lib/types/std.xsd"/>
|
||||
|
||||
<xs:element name="libxml2">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="sub">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="sub2" type="xs:string" minOccurs="0"/>
|
||||
<xs:element name="nestedInclude" type="t_cksum_hash" minOccurs="1" maxOccurs="1"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="attrOpt" use="optional" default="none specified" type="xs:string"/>
|
||||
<xs:attribute name="attrReq" use="required" type="t_std_nonempty"/>
|
||||
<xs:attribute name="attrBoolNoDef" use="optional" type="xs:boolean"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
</xs:schema>
|
Loading…
x
Reference in New Issue
Block a user