summaryrefslogblamecommitdiff
path: root/devel/requirements/3b_runner.xml
blob: cb0d73645c39dcaecc3e35c216df65155ca60fb5 (plain) (tree)











































































                                                                                                                                                                                                                                                                                                                                                                                                           











                                                                                                                                                                                                                       



                                                                                                                                                                

                                                         
























































                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                             



















                                                                                                                                                                                                                                                                         



























                                                                                                                                                                                                                                                                                

                                                         
                                                                                                                                     






                                                                                                                                                                                                                                                                                                                                   
                                                                                                                                   






                                                                                                                                                                                                  
                                                                                                                                     






                                                                                                                                                                                          



                                                                                                                                                                                                         
                                                                                                                                     



















                                                                                                                                                                                                                                                                  
                             































































































                                                                                                                                                                                                                                                                                              















































































































                                                                                                                                                                                                                                                                                                                     















































                                                                                                                                                                                                                                                                                                                                                                                                           





                                                     
                                                                                                                                                                                                                                                                                                   


                                                      


                                                                                                                                
                             



                                                                                                                                                                                          



















                                                                                                                                                                                                                           



                                                        


                      
    <section id="runner">
        <title>Horizon Runner</title>
        <para>The Horizon Runner is the component of Project Horizon that configures a computer to match an input HorizonScript.</para>
        <section id="runner_locate">
            <title>Locate HorizonScript</title>
            <section id="runner_locate_meta">
                <title>Description / Priority</title>
                <para>The system needs to load the HorizonScript into memory.  If the HorizonScript is a local file, the system needs to ensure it is present and readable.  If the HorizonScript is remote, the system needs to proceed to Network Configuration before continuing.</para>
            </section>
            <section id="runner_locate_req">
                <title>Functional Requirements</title>
                <formalpara id="Runner.Locate.DetermineLocality">
                    <title>Runner.Locate.DetermineLocality</title>
                    <para>The system shall determine if the HorizonScript is stored locally or remotely using the following algorithm:
                        <orderedlist id="Runner.Locate.DetermineLocality.Algo">
                            <listitem><para>If the path to the HorizonScript is not provided, assume the HorizonScript is remote and end the calculation.  Priority: Low.</para></listitem>
                            <listitem><para>If the path to the HorizonScript begins with a single "/" followed by an alphanumeric character, the HorizonScript is local.</para></listitem>
                            <listitem><para>If the path to the HorizonScript begins with a recognised valid protocol for downloading a HorizonScript followed by the characters "://", the HorizonScript is remote.</para></listitem>
                            <listitem><para>If the path to the HorizonScript begins with an alphanumeric character, the HorizonScript is local and relative to the path <filename class="directory">/etc/horizon</filename>.</para></listitem>
                            <listitem><para>If the path to the HorizonScript does not match any of the rules specified before this line, the path provided is invalid and the system shall return an error describing the specified path and the fact it is invalid.</para></listitem>
                        </orderedlist>
                    </para>
                </formalpara>
                <formalpara id="Runner.Locate.Local">
                    <title>Runner.Locate.Local</title>
                    <para>If the HorizonScript is local, the system shall ensure the HorizonScript specified exists at the specified path, is readable by the system, and is the correct format.</para>
                </formalpara>
                <formalpara id="Runner.Locate.Local.Failure">
                    <title>Runner.Locate.Local.Failure</title>
                    <para>If the HorizonScript fails the tests in Runner.Locate.Local, the system shall return an error describing the reason the HorizonScript could not be used.</para>
                </formalpara>
                <formalpara id="Runner.Locate.Remote">
                    <title>Runner.Locate.Remote</title>
                    <para>If the HorizonScript is remote, the system shall configure the network and then ensure the HorizonScript specified is accessible, as described in the following requirements sections.</para>
                </formalpara>
                <formalpara id="Runner.Locate.Remote.Configure">
                    <title>Runner.Locate.Remote.Configure</title>
                    <para>The system shall use the network settings configured by the Administrator on the command line, if they have been provided.</para>
                </formalpara>
                <formalpara id="Runner.Locate.Remote.Configure.Automatic">
                    <title>Runner.Locate.Remote.Configure.Automatic</title>
                    <para>If no network configuration was provided on the command line, the system shall initiate a DHCP request on each available network interface, waiting for a 15 second time out period before continuing to the next network interface.  An "available network interface" is defined as a non-loopback network interface that currently has a carrier signal.</para>
                </formalpara>
                <formalpara id="Runner.Locate.Remote.Configure.AutoFailure">
                    <title>Runner.Locate.Remote.Configure.AutoFailure</title>
                    <para>If no network configuration can be found using DHCP, the system shall return an error describing the inability to configure a network connection.</para>
                </formalpara>
                <formalpara id="Runner.Locate.Remote.FullAuto">
                    <title>Runner.Locate.Remote.FullAuto</title>
                    <para>If no HorizonScript path was provided, the system shall download the HorizonScript from a TFTP server using the filename <filename>MACADDRESS.installfile</filename> where MACADDRESS is the MAC address of the active network adaptor with colons (:) replaced by dashes (-).  The system shall use the following algorithm to determine the TFTP server, using the first match.
                        <orderedlist id="Runner.Locate.Remote.FullAuto.Algo">
                            <listitem><para>The TFTP server specified in the DHCP options, if the DHCP response provided one.</para></listitem>
                            <listitem><para>The TFTP server specified on the command line, if one was provided.</para></listitem>
                            <listitem><para>The DHCP server, if DHCP was used to configure the network.</para></listitem>
                            <listitem><para>The default gateway IP.</para></listitem>
                        </orderedlist>
                    </para>
                </formalpara>
                <formalpara id="Runner.Locate.Remote.Verify">
                    <title>Runner.Locate.Remote.Verify</title>
                    <para>The system shall ensure that the server where the HorizonScript is kept is reachable over the protocol specified and that the HorizonScript exists.</para>
                </formalpara>
                <formalpara id="Runner.Locate.Remote.Download">
                    <title>Runner.Locate.Remote.Download</title>
                    <para>The system shall download the HorizonScript from the remote server to <filename class="directory">/etc/horizon/</filename>.</para>
                </formalpara>
            </section>
        </section>
        <section id="runner_verify">
            <title>Verify HorizonScript</title>
            <section id="runner_verify_meta">
                <title>Description / Priority</title>
                <para>The system needs to verify the validity of the supplied HorizonScript before executing it.</para>
            </section>
            <section id="runner_verify_req">
                <title>Functional Requirements</title>
                <formalpara id="Runner.Verify.Exception">
                    <title>Runner.Verify.Exception</title>
                    <para>If the HorizonScript fails any verification step performed by the system, the system shall report the error.</para>
                </formalpara>
                <formalpara id="Runner.Verify.Exception.Install">
                    <title>Runner.Verify.Exception.Install</title>
                    <para>If the system is running in an installation environment, the system shall report verification step failure to the listening agent.</para>
                </formalpara>
                <formalpara id="Runner.Verify.Exception.Continue">
                    <title>Runner.Verify.Exception.Continue</title>
                    <para>The system shall support a mode where the system will continue verification after encountering a verification failure, to display all verification failures for a given HorizonScript.</para>
                </formalpara>
                <formalpara id="Runner.Verify.SkipBlanksAndComments">
                    <title>Runner.Verify.SkipBlanksAndComments</title>
                    <para>The system shall ignore any lines that are entirely blank, or start with the ASCII octothorpe (<literal>#</literal>) character.</para>
                </formalpara>
                <formalpara id="Runner.Verify.Required">
                    <title>Runner.Verify.Required</title>
                    <para>The system shall verify the presence of each required keyword in the HorizonScript: <literal>mount</literal>, <literal>network</literal>, <literal>hostname</literal>, <literal>pkginstall</literal>, and <literal>rootpw</literal>.</para>
                </formalpara>
                <formalpara id="Runner.Verify.network">
                    <title>Runner.Verify.network</title>
                    <para>The system shall verify that a single <literal>network</literal> entry is present in the HorizonScript, and that the value is either <literal>true</literal> or <literal>false</literal>.</para>
                </formalpara>
                <formalpara id="Runner.Verify.network.netaddress">
                    <title>Runner.Verify.network.netaddress</title>
                    <para>If the value in the HorizonScript for the <literal>network</literal> key is <literal>true</literal>, the system shall verify that at least one <literal>netaddress</literal> key is present.</para>
                </formalpara>
                <formalpara id="Runner.Verify.network.netaddress.NoNetwork">
                    <title>Runner.Verify.network.netaddress.NoNetwork</title>
                    <para>If the value in the HorizonScript for the <literal>network</literal> key is <literal>false</literal>, the system shall verify that no <literal>netaddress</literal> key is present.</para>
                </formalpara>
                <formalpara id="Runner.Verify.network.netaddress.Validity">
                    <title>Runner.Verify.network.netaddress.Validity</title>
                    <para>The system shall verify that each <literal>netaddress</literal> key has a valid form of at least two values in a space-separated tuple.</para>
                </formalpara>
                <formalpara id="Runner.Verify.network.netaddress.Validity.Type">
                    <title>Runner.Verify.network.netaddress.Validity.Type</title>
                    <para>The system shall verify that the second value in each <literal>netaddress</literal> tuple is either <literal>dhcp</literal> or <literal>static</literal>.</para>
                </formalpara>
                <formalpara id="Runner.Verify.network.netaddress.Validity.DHCP">
                    <title>Runner.Verify.network.netaddress.Validity.DHCP</title>
                    <para>The system shall verify that each <literal>netaddress</literal> key is a two value tuple if the second value is <literal>dhcp</literal>.</para>
                </formalpara>
                <formalpara id="Runner.Verify.network.netaddress.Validity.Static">
                    <title>Runner.Verify.network.netaddress.Validity.Static</title>
                    <para>The system shall verify that each <literal>netaddress</literal> key is either a four value tuple or a five value tuple if the second value is <literal>static</literal>.</para>
                </formalpara>
                <formalpara id="Runner.Verify.network.netaddress.Interface">
                    <title>Runner.Verify.network.netaddress.Interface</title>
                    <para>If the system is running in an installation environment, the system shall ensure that the interface specified as the first value in each <literal>netaddress</literal> tuple is present on the system.  Failure of this requirement is a "soft" error.</para>
                </formalpara>
                <formalpara id="Runner.Verify.network.netaddress.Address">
                    <title>Runner.Verify.network.netaddress.Address</title>
                    <para>If the second value of the <literal>netaddress</literal> key is <literal>static</literal>, the system shall ensure that the third value in the tuple is a valid IPv4 or IPv6 address.</para>
                </formalpara>
                <formalpara id="Runner.Verify.network.netaddress.Mask">
                    <title>Runner.Verify.network.netaddress.Mask</title>
                    <para>If the second value of the <literal>netaddress</literal> key is <literal>static</literal>, the system shall ensure that the fourth value in the tuple is a valid prefix, in the form of a whole number between 1 and 32 inclusive if the third value is an IPv4 address, a whole number between 1 and 64 inclusive if the third value is an IPv6 address, or a network mask in the form of four octets separated by the period (<literal>.</literal>) symbol if the third value is an IPv4 address.</para>
                </formalpara>
                <formalpara id="Runner.Verify.network.netaddress.Gateway">
                    <title>Runner.Verify.network.netaddress.Gateway</title>
                    <para>If the second value of the <literal>netaddress</literal> key is <literal>static</literal>, and the tuple contains a fifth value, the system shall ensure that the fifth value is a valid IP address of the same type as the third value in the tuple.</para>
                </formalpara>
                <formalpara id="Runner.Verify.network.netaddress.Count">
                    <title>Runner.Verify.network.netaddress.Count</title>
                    <para>The system shall verify that <literal>netaddress</literal> is not specified more than 255 times per interface.</para>
                </formalpara>
                <formalpara id="Runner.Verify.network.netssid">
                    <title>Runner.Verify.network.netssid</title>
                    <para>If the value in the HorizonScript for the <literal>network</literal> key is <literal>true</literal>, the system shall verify the validity of any present <literal>netssid</literal> key.</para>
                </formalpara>
                <formalpara id="Runner.Verify.network.netssid.NoNetwork">
                    <title>Runner.Verify.network.netssid.NoNetwork</title>
                    <para>If the value in the HorizonScript for the <literal>network</literal> key is <literal>false</literal>, the system shall verify that no <literal>netssid</literal> key is present.</para>
                </formalpara>
                <formalpara id="Runner.Verify.network.netssid.Validity">
                    <title>Runner.Verify.network.netaddress.Validity</title>
                    <para>The system shall verify that each <literal>netssid</literal> key has a valid form of either three values or four values in a space-separated tuple.</para>
                </formalpara>
                <formalpara id="Runner.Verify.network.netssid.Interface">
                    <title>Runner.Verify.network.netssid.Interface</title>
                    <para>If the system is running in an installation environment, the system shall ensure that the interface specified as the first value in each <literal>netssid</literal> tuple is present on the system and supports wireless extensions.</para>
                </formalpara>
                <formalpara id="Runner.Verify.network.netssid.SSID">
                    <title>Runner.Verify.network.netssid.SSID</title>
                    <para>The system shall verify that the second value of each <literal>netssid</literal> tuple is a valid SSID enclosed in ASCII double-quotes (<literal>"</literal>).</para>
                </formalpara>
                <formalpara id="Runner.Verify.network.netssid.Security">
                    <title>Runner.Verify.network.netssid.Security</title>
                    <para>The system shall verify that the third value of each <literal>netssid</literal> tuple is a valid security type: either <literal>none</literal>, <literal>wep</literal>, or <literal>wpa</literal>.</para>
                </formalpara>
                <formalpara id="Runner.Verify.network.netssid.Key">
                    <title>Runner.Verify.network.netssid.Key</title>
                    <para>If the third value of a <literal>netssid</literal> tuple is a valid security type and not <literal>none</literal>, the system shall ensure that the <literal>netssid</literal> tuple has a fourth value that specifies the security key.</para>
                </formalpara>
                <formalpara id="Runner.Verify.hostname">
                    <title>Runner.Verify.hostname</title>
                    <para>The system shall verify that the HorizonScript contains exactly one <literal>hostname</literal> key.</para>
                </formalpara>
                <formalpara id="Runner.Verify.hostname.Chars">
                    <title>Runner.Verify.hostname.Chars</title>
                    <para>The system shall verify that the value for the <literal>hostname</literal> key contains only alphanumeric and optionally one or more period (<literal>.</literal>) characters.</para>
                </formalpara>
                <formalpara id="Runner.Verify.hostname.Begin">
                    <title>Runner.Verify.hostname.Begin</title>
                    <para>The system shall verify that the value for the <literal>hostname</literal> key begins with an alphabetical character.</para>
                </formalpara>
                <formalpara id="Runner.Verify.hostname.Length">
                    <title>Runner.Verify.hostname.Length</title>
                    <para>The system shall verify that the value for the <literal>hostname</literal> key does not exceed 320 characters in length.</para>
                </formalpara>
                <formalpara id="Runner.Verify.pkginstall">
                    <title>Runner.Verify.pkginstall</title>
                    <para>The system shall verify that the HorizonScript contains at least one <literal>pkginstall</literal> key.</para>
                </formalpara>
                <formalpara id="Runner.Verify.rootpw">
                    <title>Runner.Verify.rootpw</title>
                    <para>The system shall verify that the HorizonScript contains exactly one <literal>rootpw</literal> key.</para>
                </formalpara>
                <formalpara id="Runner.Verify.rootpw.Crypt">
                    <title>Runner.Verify.rootpw.Crypt</title>
                    <para>The system shall verify that the value for the <literal>rootpw</literal> key is in the format: <literal>$</literal>, either <literal>2</literal> for Blowfish or <literal>6</literal> for SHA-512, <literal>$</literal>, and then variant data.</para>
                </formalpara>
                <formalpara id="Runner.Verify.language">
                    <title>Runner.Verify.language</title>
                    <para>The system shall verify that the HorizonScript contains zero or one <literal>language</literal> key.</para>
                </formalpara>
                <formalpara id="Runner.Verify.language.Format">
                    <title>Runner.Verify.language.Format</title>
                    <para>The system shall verify that the value of the <literal>language</literal> key, if present, is a valid ISO 639-1 language code, optionally followed by an ASCII underscore (<literal>_</literal>) and ISO 3166-1 country code, optionally followed by the string literal <literal>.UTF-8</literal>.</para>
                </formalpara>
                <formalpara id="Runner.Verify.keymap">
                    <title>Runner.Verify.keymap</title>
                    <para>The system shall verify that the HorizonScript contains zero or one <literal>keymap</literal> key.</para>
                </formalpara>
                <formalpara id="Runner.Verify.keymap.Valid">
                    <title>Runner.Verify.keymap.Valid</title>
                    <para>The system shall verify that the value of the <literal>keymap</literal> key, if present, is a valid keyboard layout available for use in an Adélie Linux system.</para>
                </formalpara>
                <formalpara id="Runner.Verify.firmware">
                    <title>Runner.Verify.firmware</title>
                    <para>The system shall verify that the HorizonScript contains zero or one <literal>firmware</literal> key.</para>
                </formalpara>
                <formalpara id="Runner.Verify.firmware.Boolean">
                    <title>Runner.Verify.firmware.Boolean</title>
                    <para>The system shall verify that the value of the <literal>firmware</literal> key, if present, is either <literal>true</literal> or <literal>false</literal>.</para>
                </formalpara>
                <formalpara id="Runner.Verify.firmware.ForceOff">
                    <title>Runner.Verify.firmware.ForceOff</title>
                    <para>If the system has firmware support compiled out, the system shall verify that the value of the <literal>firmware</literal> key, if present, is <literal>false</literal>.</para>
                </formalpara>
                <formalpara id="Runner.Verify.timezone">
                    <title>Runner.Verify.timezone</title>
                    <para>The system shall verify that the HorizonScript contains zero or one <literal>timezone</literal> key.</para>
                </formalpara>
                <formalpara id="Runner.Verify.timezone.zoneinfo">
                    <title>Runner.Verify.timezone.zoneinfo</title>
                    <para>The system shall verify that the value of the <literal>timezone</literal> key, if present, represents a valid zoneinfo time zone name.</para>
                </formalpara>
                <formalpara id="Runner.Verify.repository">
                    <title>Runner.Verify.repository</title>
                    <para>The system shall verify that the HorizonScript contains zero to ten <literal>repository</literal> keys.</para>
                </formalpara>
                <formalpara id="Runner.Verify.repository.ValidPath">
                    <title>Runner.Verify.repository.ValidPath</title>
                    <para>The system shall verify that the value of each <literal>repository</literal> key is either an absolute local path beginning with an ASCII backslash (<literal>/</literal>), or a valid URL utilising the HTTP or HTTPS protocols.</para>
                </formalpara>
                <formalpara id="Runner.Verify.signingkey">
                    <title>Runner.Verify.signingkey</title>
                    <para>The system shall verify that the HorizonScript contains zero to ten <literal>signingkey</literal> keys.</para>
                </formalpara>
                <formalpara id="Runner.Verify.signingkey.ValidPath">
                    <title>Runner.Verify.signingkey.ValidPath</title>
                    <para>The system shall verify that the value of each <literal>signingkey</literal> key is either an absolute local path beginning with an ASCII backslash (<literal>/</literal>), or a valid URL utilising the HTTPS protocol.</para>
                </formalpara>
                <formalpara id="Runner.Verify.username">
                    <title>Runner.Verify.username</title>
                    <para>The system shall verify that the HorizonScript contains zero to 255 <literal>username</literal> keys.</para>
                </formalpara>
                <formalpara id="Runner.Verify.username.Unique">
                    <title>Runner.Verify.username.Unique</title>
                    <para>The system shall verify that the value of each <literal>username</literal> key is unique.</para>
                </formalpara>
                <formalpara id="Runnver.Verify.username.System">
                    <title>Runner.Verify.username.System</title>
                    <para>The system shall verify that the value of each <literal>username</literal> key does not match a system-defined account.</para>
                </formalpara>
                <formalpara id="Runner.Verify.username.Valid">
                    <title>Runner.Verify.username.Valid</title>
                    <para>The system shall verify that the value of each <literal>username</literal> key is a valid Linux user account name.</para>
                </formalpara>
                <formalpara id="Runner.Verify.useralias">
                    <title>Runner.Verify.useralias</title>
                    <para>The system shall verify that the HorizonScript contains a number of <literal>useralias</literal> keys equal or less than the number of <literal>username</literal> keys.</para>
                </formalpara>
                <formalpara id="Runner.Verify.useralias.Validity">
                    <title>Runner.Verify.useralias.Validity</title>
                    <para>The system shall verify that each <literal>useralias</literal> key has a valid form of two values in a space-separated tuple, with the second value reading to the end of the line (optionally containing spaces).</para>
                </formalpara>
                <formalpara id="Runner.Verify.useralias.Name">
                    <title>Runner.Verify.useralias.Name</title>
                    <para>The system shall verify that the first value in each <literal>useralias</literal> key tuple is an account name specified in a <literal>username</literal> key.</para>
                </formalpara>
                <formalpara id="Runner.Verify.useralias.Unique">
                    <title>Runner.Verify.useralias.Unique</title>
                    <para>The system shall verify that only one <literal>useralias</literal> key is specified per account name.</para>
                </formalpara>
                <formalpara id="Runner.Verify.userpw">
                    <title>Runner.Verify.userpw</title>
                    <para>The system shall verify that the HorizonScript contains a number of <literal>userpw</literal> keys equal or less than the number of <literal>username</literal> keys.</para>
                </formalpara>
                <formalpara id="Runner.Verify.userpw.Validity">
                    <title>Runner.Verify.userpw.Validity</title>
                    <para>The system shall verify that each <literal>userpw</literal> key has a valid form of two values in a space-separated tuple.</para>
                </formalpara>
                <formalpara id="Runner.Verify.userpw.Name">
                    <title>Runner.Verify.userpw.Name</title>
                    <para>The system shall verify that the first value in each <literal>userpw</literal> key tuple is an account name specified in a <literal>username</literal> key.</para>
                </formalpara>
                <formalpara id="Runner.Verify.userpw.Unique">
                    <title>Runner.Verify.userpw.Unique</title>
                    <para>The system shall verify that only one <literal>userpw</literal> key is specified per account name.</para>
                </formalpara>
                <formalpara id="Runner.Verify.userpw.Crypt">
                    <title>Runner.Verify.userpw.Crypt</title>
                    <para>The system shall verify that the second value for each <literal>userpw</literal> key tuple is in the format: <literal>$</literal>, either <literal>2</literal> for Blowfish or <literal>6</literal> for SHA-512, <literal>$</literal>, and then variant data.</para>
                </formalpara>
                <formalpara id="Runner.Verify.usericon">
                    <title>Runner.Verify.usericon</title>
                    <para>The system shall verify that the HorizonScript contains a number of <literal>usericon</literal> keys equal or less than the number of <literal>username</literal> keys.</para>
                </formalpara>
                <formalpara id="Runner.Verify.usericon.Validity">
                    <title>Runner.Verify.usericon.Validity</title>
                    <para>The system shall verify that each <literal>usericon</literal> key has a valid form of two values in a space-separated tuple.</para>
                </formalpara>
                <formalpara id="Runner.Verify.usericon.Name">
                    <title>Runner.Verify.usericon.Name</title>
                    <para>The system shall verify that the first value in each <literal>usericon</literal> key tuple is an account name specified in a <literal>username</literal> key.</para>
                </formalpara>
                <formalpara id="Runner.Verify.usericon.Unique">
                    <title>Runner.Verify.usericon.Unique</title>
                    <para>The system shall verify that only one <literal>usericon</literal> key is specified per account name.</para>
                </formalpara>
                <formalpara id="Runner.Verify.usericon.ValidPath">
                    <title>Runner.Verify.usericon.ValidPath</title>
                    <para>The system shall verify that the second value of each <literal>usericon</literal> key tuple is either an absolute local path beginning with an ASCII backslash (<literal>/</literal>), or a valid URL utilising the HTTP or HTTPS protocols.</para>
                </formalpara>
                <formalpara id="Runner.Verify.usergroups">
                    <title>Runner.Verify.usergroups</title>
                    <para>The system shall verify any <literal>usergroups</literal> keys contained in the HorizonScript.</para>
                </formalpara>
                <formalpara id="Runner.Verify.usergroups.Validity">
                    <title>Runner.Verify.usergroups.Validity</title>
                    <para>The system shall verify that each <literal>usergroups</literal> key has a valid form of two values in a space-separated tuple.</para>
                </formalpara>
                <formalpara id="Runner.Verify.usergroups.Name">
                    <title>Runner.Verify.usergroups.Name</title>
                    <para>The system shall verify that the first value in each <literal>usergroups</literal> key tuple is an account name specified in a <literal>username</literal> key.</para>
                </formalpara>
                <formalpara id="Runner.Verify.usergroups.Count">
                    <title>Runner.Verify.usergroups.Count</title>
                    <para>The system shall verify that all <literal>usergroups</literal> key tuples for a specified account name specify a combined total of sixteen or fewer groups.</para>
                </formalpara>
                <formalpara id="Runner.Verify.usergroups.Unique">
                    <title>Runner.Verify.usergroups.Unique</title>
                    <para>The system shall verify that a group is specified only once for each account name.</para>
                </formalpara>
                <formalpara id="Runner.Verify.usergroups.Group">
                    <title>Runner.Verify.usergroups.Group</title>
                    <para>The system shall verify that each group specified is a valid system-defined group name.</para>
                </formalpara>
                <formalpara id="Runner.Verify.diskid">
                    <title>Runner.Verify.diskid</title>
                    <para>The system shall verify any <literal>diskid</literal> keys contained in the HorizonScript.</para>
                </formalpara>
                <formalpara id="Runner.Verify.diskid.Validity">
                    <title>Runner.Verify.diskid.Validity</title>
                    <para>The system shall verify that each <literal>diskid</literal> key has a valid form of two values in a space-separated tuple, with the second value reading to the end of the line (optionally containing spaces).</para>
                </formalpara>
                <formalpara id="Runner.Verify.diskid.Unique">
                    <title>Runner.Verify.diskid.Unique</title>
                    <para>The system shall verify that the first value of each <literal>diskid</literal> key tuple is unique in the HorizonScript.</para>
                </formalpara>
                <formalpara id="Runner.Verify.diskid.Block">
                    <title>Runner.Verify.diskid.Block</title>
                    <para>If the system is running in an installation environment, the system shall ensure that the first value of each <literal>diskid</literal> key tuple specifies a valid block device.</para>
                </formalpara>
                <formalpara id="Runner.Verify.disklabel">
                    <title>Runner.Verify.disklabel</title>
                    <para>The system shall verify any <literal>disklabel</literal> keys contained in the HorizonScript.</para>
                </formalpara>
                <formalpara id="Runner.Verify.disklabel.Validity">
                    <title>Runner.Verify.disklabel.Validity</title>
                    <para>The system shall verify that each <literal>disklabel</literal> key has a valid form of two values in a space-separated tuple.</para>
                </formalpara>
                <formalpara id="Runner.Verify.disklabel.Unique">
                    <title>Runner.Verify.disklabel.Unique</title>
                    <para>The system shall verify that the first value of each <literal>disklabel</literal> key tuple is unique in the HorizonScript.</para>
                </formalpara>
                <formalpara id="Runner.Verify.disklabel.Block">
                    <title>Runner.Verify.disklabel.Block</title>
                    <para>If the system is running in an installation environment, the system shall ensure that the first value of each <literal>disklabel</literal> key tuple specifies a valid block device.</para>
                </formalpara>
                <formalpara id="Runner.Verify.disklabel.LabelType">
                    <title>Runner.Verify.disklabel.LabelType</title>
                    <para>The system shall verify that the second value of each <literal>disklabel</literal> key tuple is one of the following three values: <literal>apm</literal>, <literal>mbr</literal>, or <literal>gpt</literal>.</para>
                </formalpara>
                <formalpara id="Runner.Verify.partition">
                    <title>Runner.Verify.partition</title>
                    <para>The system shall verify any <literal>partition</literal> keys contained in the HorizonScript.</para>
                </formalpara>
                <formalpara id="Runner.Verify.partition.Validity">
                    <title>Runner.Verify.partition.Validity</title>
                    <para>The system shall verify that each <literal>partition</literal> key has a valid form of three or four values in a space-separated tuple.</para>
                </formalpara>
                <formalpara id="Runner.Verify.partition.Validity.PartNo">
                    <title>Runner.Verify.partition.Validity.PartNo</title>
                    <para>The system shall verify that the second value of each <literal>partition</literal> key tuple is a valid positive whole integer.</para>
                </formalpara>
                <formalpara id="Runner.Verify.partition.Unique">
                    <title>Runner.Verify.partition.Unique</title>
                    <para>The system shall verify that the union of the first and second values in each <literal>partition</literal> key tuple are unique.</para>
                </formalpara>
                <formalpara id="Runner.Verify.partition.Block">
                    <title>Runner.Verify.partition.Block</title>
                    <para>If the system is running in an installation environment, the system shall ensure that the first value of each <literal>partition</literal> key tuple specifies a valid block device.</para>
                </formalpara>
                <formalpara id="Runner.Verify.partition.Size">
                    <title>Runner.Verify.partition.Size</title>
                    <para>The system shall verify that the third value in each <literal>partition</literal> key tuple specifies a valid size as described in <xref linkend="REF-5" />.</para>
                </formalpara>
                <formalpara id="Runner.Verify.partition.TypeCode">
                    <title>Runner.Verify.partition.TypeCode</title>
                    <para>If a <literal>partition</literal> key tuple contains a fourth value, the system shall verify that the fourth value of the <literal>partition</literal> key tuple is a valid type code, which is one of the following two values: <literal>boot</literal>, or <literal>esp</literal>.</para>
                </formalpara>
                <formalpara id="Runner.Verify.lvm_pv">
                    <title>Runner.Verify.lvm_pv</title>
                    <para>The system shall verify any <literal>lvm_pv</literal> keys contained in the HorizonScript.</para>
                </formalpara>
                <formalpara id="Runner.Verify.lvm_pv.Validity">
                    <title>Runner.Verify.lvm_pv.Validity</title>
                    <para>The system shall verify that the value of each <literal>lvm_pv</literal> is an absolute path to a device node.</para>
                </formalpara>
                <formalpara id="Runner.Verify.lvm_pv.Block">
                    <title>Runner.Verify.lvm_pv.Block</title>
                    <para>If the system is running in an installation environment, the system shall verify that the value of each <literal>lvm_pv</literal> key specifies a valid block device.</para>
                </formalpara>
                <formalpara id="Runner.Verify.lvm_vg">
                    <title>Runner.Verify.lvm_vg</title>
                    <para>The system shall verify any <literal>lvm_vg</literal> keys contained in the HorizonScript.</para>
                </formalpara>
                <formalpara id="Runner.Verify.lvm_vg.Validity">
                    <title>Runner.Verify.lvm_vg.Validity</title>
                    <para>The system shall verify that each <literal>lvm_vg</literal> key has a valid form of two values in a space-separated tuple.</para>
                </formalpara>
                <formalpara id="Runner.Verify.lvm_vg.Block">
                    <title>Runner.Verify.lvm_vg.Block</title>
                    <para>If the system is running in an installation environment, the system shall verify that the first value of each <literal>lvm_vg</literal> key tuple specifies a valid block device.</para>
                </formalpara>
                <formalpara id="Runner.Verify.lvm_vg.Name">
                    <title>Runner.Verify.lvm_vg.Name</title>
                    <para>The system shall verify that the second value of each <literal>lvm_vg</literal> key specifies a string that would be valid as an LVM volume group name.</para>
                </formalpara>
                <formalpara id="Runner.Verify.lvm_lv">
                    <title>Runner.Verify.lvm_lv</title>
                    <para>The system shall verify any <literal>lvm_lv</literal> keys contained in the HorizonScript.</para>
                </formalpara>
                <formalpara id="Runner.Verify.lvm_lv.Validity">
                    <title>Runner.Verify.lvm_lv.Validity</title>
                    <para>The system shall verify that each <literal>lvm_lv</literal> key has a valid form of three values in a space-separated tuple.</para>
                </formalpara>
                <formalpara id="Runner.Verify.lvm_lv.VolumeGroup">
                    <title>Runner.Verify.lvm_lv.VolumeGroup</title>
                    <para>If the system is running in an installation environment, the system shall verify that the first value of each <literal>lvm_lv</literal> key specifies a valid LVM volume group, or one specified in an <literal>lvm_vg</literal> key.</para>
                </formalpara>
                <formalpara id="Runner.Verify.lvm_lv.Name">
                    <title>Runner.Verify.lvm_lv.Name</title>
                    <para>The system shall verify that the second value of each <literal>lvm_lv</literal> key specifies a string that would be valid as an LVM logical volume name.</para>
                </formalpara>
                <formalpara id="Runner.Verify.lvm_lv.Size">
                    <title>Runner.Verify.lvm_lv.Size</title>
                    <para>The system shall verify that the third value in each <literal>lvm_lv</literal> key tuple specifies a valid size as described in <xref linkend="REF-5" />.</para>
                </formalpara>
                <formalpara id="Runner.Verify.encrypt">
                    <title>Runner.Verify.encrypt</title>
                    <para>The system shall verify any <literal>encrypt</literal> keys contained in the HorizonScript.</para>
                </formalpara>
                <formalpara id="Runner.Verify.encrypt.Validity">
                    <title>Runner.Verify.encrypt.Validity</title>
                    <para>The system shall verify that the value of each <literal>encrypt</literal> key is a string value that is an absolute path to a device node, with an optional second value as a space-separated tuple.</para>
                </formalpara>
                <formalpara id="Runner.Verify.encrypt.Block">
                    <title>Runner.Verify.encrypt.Block</title>
                    <para>If the system is running in an installation environment, the system shall verify that the value of each <literal>encrypt</literal> key, and the first value of each <literal>encrypt</literal> key tuple, specifies a valid block device.</para>
                </formalpara>
                <formalpara id="Runner.Verify.fs">
                    <title>Runner.Verify.fs</title>
                    <para>The systemm shall verify any <literal>fs</literal> keys contained in the HorizonScript.</para>
                </formalpara>
                <formalpara id="Runner.Verify.fs.Validity">
                    <title>Runner.Verify.fs.Validity</title>
                    <para>The system shall verify that each <literal>fs</literal> key has a valid form of two values in a space-separated tuple.</para>
                </formalpara>
                <formalpara id="Runner.Verify.fs.Block">
                    <title>Runner.Verify.fs.Block</title>
                    <para>If the system is running in an installation environment, the system shall verify that the first value of each <literal>fs</literal> key tuple specifies a valid block device.</para>
                </formalpara>
                <formalpara id="Runner.Verify.fs.Type">
                    <title>Runner.Verify.fs.Type</title>
                    <para>The system shall verify that the second value of each <literal>fs</literal> key tuple specifies a valid file system supported by Horizon, using lower case characters.</para>
                </formalpara>
                <formalpara id="Runner.Verify.mount">
                    <title>Runner.Verify.mount</title>
                    <para>The system shall verify that the HorizonScript contains at least one valid <literal>mount</literal> key.</para>
                </formalpara>
                <formalpara id="Runner.Verify.mount.Validity">
                    <title>Runner.Verify.mount.Validity</title>
                    <para>The system shall verify that each <literal>mount</literal> key has a valid form of two or three values in a space-separated tuple.</para>
                </formalpara>
                <formalpara id="Runner.Verify.mount.Block">
                    <title>Runner.Verify.mount.Block</title>
                    <para>If the system is running in an installation environment, the system shall verify that the first value of each <literal>mount</literal> key tuple specifies a valid block device.</para>
                </formalpara>
                <formalpara id="Runner.Verify.mount.Point">
                    <title>Runner.Verify.mount.Point</title>
                    <para>The system shall verify that the second value of each <literal>mount</literal> key specifies a valid mount point beginning with a <literal>/</literal>.</para>
                </formalpara>
                <formalpara id="Runner.Verify.PackageAvail">
                    <title>Runner.Verify.PackageAvail</title>
                    <para>If the system is running in a runtime environment, the system shall verify that all of the packages specified in <literal>pkginstall</literal> keys are available in the specified repositories; either the repositories specified in <literal>repository</literal> keys, or the system-default repositories if no <literal>repository</literal> keys have been specified.</para>
                </formalpara>
            </section>
        </section>
        <section id="runner_execute">
            <title>Execute HorizonScript</title>
            <section id="runner_execute_meta">
                <title>Description / Priority</title>
                <para>The system executes the instructions provided in the HorizonScript, in the specified order.  The system reports progress, and all warnings and errors, to the listening agent.  Once the system has finished, it reports the completion status to the listening agent.</para>
            </section>
            <section id="runner_execute_req">
                <title>Functional Requirements</title>
                <formalpara id="Runner.Execute">
                    <title>Runner.Execute</title>
                    <para>The system shall execute the instructions provided in the HorizonScript in the order described.</para>
                </formalpara>
                <formalpara id="Runner.Execute.Exception">
                    <title>Runner.Execute.Exception</title>
                    <para>The system shall report any exception encountered during execution to the listening agent, following the specification in <xref linkend="runner_agent"/>.</para>
                </formalpara>
                <formalpara id="Runner.Execute.Status">
                    <title>Runner.Execute.Status</title>
                    <para>If an operation has taken more than 10 seconds, the system shall report the status of the operation to the listening agent, following the specification in <xref linkend="runner_agent"/>.</para>
                </formalpara>
                <formalpara id="Runner.Execute.StepBegin">
                    <title>Runner.Execute.StepBegin</title>
                    <para>When the system begins a step, the system shall report the step as beginning to the listening agent, following the specification in <xref linkend="runner_agent"/>.</para>
                </formalpara>
                <formalpara id="Runner.Execute.StepDone">
                    <title>Runner.Execute.StepDone</title>
                    <para>When the system completes a step, the system shall report the step as completed to the listening agent, following the specification in <xref linkend="runner_agent"/>.</para>
                </formalpara>
                <formalpara id="Runner.Execute.Verify">
                    <title>Runner.Execute.Verify</title>
                    <para>The system shall verify the HorizonScript, using the process specified in the section <xref linkend="runner_verify"/>, before execution.</para>
                </formalpara>
                <formalpara id="Runner.Execute.Verify.Failure">
                    <title>Runner.Execute.Verify.Failure</title>
                    <para>If the HorizonScript fails verification, the system shall report a fatal exception (<xref linkend="Runner.Execute.Exception"/>) and stop execution.</para>
                </formalpara>
                <formalpara id="Runner.Execute.diskid">
                    <title>Runner.Execute.diskid</title>
                    <para></para>
                </formalpara>
            </section>
        </section>
    </section>