Horizon Runner The Horizon Runner is the component of Project Horizon that configures a computer to match an input HorizonScript.
Locate HorizonScript
Description / Priority 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.
Functional Requirements Runner.Locate.DetermineLocality The system shall determine if the HorizonScript is stored locally or remotely using the following algorithm: If the path to the HorizonScript is not provided, assume the HorizonScript is remote and end the calculation. Priority: Low. If the path to the HorizonScript begins with a single "/" followed by an alphanumeric character, the HorizonScript is local. If the path to the HorizonScript begins with a recognised valid protocol for downloading a HorizonScript followed by the characters "://", the HorizonScript is remote. If the path to the HorizonScript begins with an alphanumeric character, the HorizonScript is local and relative to the path /etc/horizon. 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. Runner.Locate.Local 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. Runner.Locate.Local.Failure 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. Runner.Locate.Remote 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. Runner.Locate.Remote.Configure The system shall use the network settings configured by the Administrator on the command line, if they have been provided. Runner.Locate.Remote.Configure.Automatic 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. Runner.Locate.Remote.Configure.AutoFailure If no network configuration can be found using DHCP, the system shall return an error describing the inability to configure a network connection. Runner.Locate.Remote.FullAuto If no HorizonScript path was provided, the system shall download the HorizonScript from a TFTP server using the filename MACADDRESS.installfile 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. The TFTP server specified on the command line, if one was provided. The TFTP server specified in the DHCP options, if DHCP was used to configure the network and the DHCP response provided one. The DHCP server, if DHCP was used to configure the network. The default gateway IP. Runner.Locate.Remote.Verify The system shall ensure that the server where the HorizonScript is kept is reachable over the protocol specified and that the HorizonScript exists. Runner.Locate.Remote.Download The system shall download the HorizonScript from the remote server to /etc/horizon/.
Validate HorizonScript
Description / Priority The system needs to validate the supplied HorizonScript before executing it.
Functional Requirements Runner.Validate.Exception If the HorizonScript fails any validation step performed by the system, the system shall report the error. Runner.Validate.Exception.Install If the system is running in an installation environment, the system shall report validation step failure to the listening agent. Runner.Validate.Exception.Continue The system shall support a mode where the system will continue validation after encountering a validation failure, to display all validation failures for a given HorizonScript. Runner.Validate.SkipBlanksAndComments The system shall ignore any lines that are entirely blank, or start with the ASCII octothorpe (#) character. Runner.Validate.Required The system shall verify the presence of each required keyword in the HorizonScript: mount, network, hostname, pkginstall, and rootpw. Runner.Validate.network The system shall verify that a single network entry is present in the HorizonScript, and that the value is either true or false. Runner.Validate.network.netaddress If the value in the HorizonScript for the network key is true, the system shall verify that at least one netaddress key is present. Runner.Validate.network.netaddress.Validity The system shall verify that each netaddress key has a valid form of at least two values in a space-separated tuple. Runner.Validate.network.netaddress.Validity.Type The system shall verify that the second value in each netaddress tuple is either dhcp, slaac, or static. Runner.Validate.network.netaddress.Validity.DHCP The system shall verify that each netaddress key is a two value tuple if the second value is dhcp. Runner.Validate.network.netaddress.Validity.Static The system shall verify that each netaddress key is either a four value tuple or a five value tuple if the second value is static. Runner.Validate.network.netaddress.Interface If the system is running in an installation environment, the system shall ensure that the interface specified as the first value in each netaddress tuple is present on the system. Failure of this requirement is a "soft" error. Runner.Validate.network.netaddress.Address If the second value of the netaddress key is static, the system shall ensure that the third value in the tuple is a valid IPv4 or IPv6 address. Runner.Validate.network.netaddress.Mask If the second value of the netaddress key is static, the system shall ensure that the fourth value in the tuple is a valid prefix length, in the form of a whole number between 0 and 32 inclusive if the third value is an IPv4 address, a whole number between 0 and 128 inclusive if the third value is an IPv6 address, or a network mask in the form of four octets separated by the period (.) symbol if the third value is an IPv4 address. Runner.Validate.network.netaddress.Gateway If the second value of the netaddress key is static, 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. Runner.Validate.network.netaddress.Count The system shall verify that netaddress is not specified more than 255 times per interface. Runner.Validate.network.netssid The system shall verify the validity of any present netssid key. Runner.Validate.network.netssid.Validity The system shall verify that each netssid key has a valid form of either three values or four values in a space-separated tuple. Runner.Validate.network.netssid.Interface If the system is running in an installation environment, the system shall ensure that the interface specified as the first value in each netssid tuple is present on the system and supports wireless extensions. Runner.Validate.network.netssid.SSID The system shall verify that the second value of each netssid tuple is a valid SSID enclosed in ASCII double-quotes ("). Runner.Validate.network.netssid.Security The system shall verify that the third value of each netssid tuple is a valid security type: either none, wep, or wpa. Runner.Validate.network.netssid.Key If the third value of a netssid tuple is a valid security type and not none, the system shall ensure that the netssid tuple has a fourth value that specifies the security key. Runner.Validate.netconfigtype The system shall verify that the HorizonScript contains zero or one netconfigtype key. Runner.Validate.netconfigtype.Validity If the HorizonScript contains a netconfigtype key, the system shall ensure that the netconfigtype key has a valid form of a single string containing a recognised network configuration type. Runner.Validate.netconfigtype.netifrc If the value of the netconfigtype key is netifrc, the system shall write any network configuration in a manner that can be used by the netifrc package. Runner.Validate.netconfigtype.eni If the value of the netconfigtype key is eni, the system shall write any network configuration to a /etc/network/interfaces file that conforms to the standard provided. Runner.Validate.nameserver The system shall verify any nameserver keys contained in the HorizonScript. Runner.Validate.nameserver.IP The system shall verify that the value of each nameserver key is an IPv4 or IPv6 address. Runner.Validate.hostname The system shall verify that the HorizonScript contains exactly one hostname key. Runner.Validate.hostname.Chars The system shall verify that the value for the hostname key contains only alphanumeric and optionally one or more period (.) characters. Runner.Validate.hostname.Begin The system shall verify that the value for the hostname key begins with an alphabetical character. Runner.Validate.hostname.Length The system shall verify that the value for the hostname key does not exceed 320 characters in length. Runner.Validate.hostname.PartLength The system shall verify that the value for each part of the value of the hostname key, separated by an ASCII period (.), does not exceed 64 characters in length. Runner.Validate.pkginstall The system shall verify that the HorizonScript contains at least one pkginstall key. Runner.Validate.rootpw The system shall verify that the HorizonScript contains exactly one rootpw key. Runner.Validate.rootpw.Crypt The system shall verify that the value for the rootpw key is in the format: $, either 2 for Blowfish or 6 for SHA-512, $, and then variant data. Runner.Validate.arch The system shall verify that the HorizonScript contains zero or one arch key. Runner.Validate.arch.Validity The system shall warn if the value specified in arch is not recognised as a valid APK-supported CPU architecture. This shall not be a fatal error, because not all Tier 3 systems may be recognised. Runner.Validate.language The system shall verify that the HorizonScript contains zero or one language key. Runner.Validate.language.Format The system shall verify that the value of the language key, if present, is a valid ISO 639-1 language code, optionally followed by an ASCII underscore (_) and ISO 3166-1 country code, optionally followed by the string literal .UTF-8. Runner.Validate.keymap The system shall verify that the HorizonScript contains zero or one keymap key. Runner.Validate.keymap.Valid The system shall verify that the value of the keymap key, if present, is a valid keyboard layout available for use in an Adélie Linux system. Runner.Validate.firmware The system shall verify that the HorizonScript contains zero or one firmware key. Runner.Validate.firmware.Boolean The system shall verify that the value of the firmware key, if present, is either true or false. Runner.Validate.firmware.ForceOff If the system has firmware support compiled out, the system shall verify that the value of the firmware key, if present, is false. Runner.Validate.timezone The system shall verify that the HorizonScript contains zero or one timezone key. Runner.Validate.timezone.zoneinfo The system shall verify that the value of the timezone key, if present, represents a valid zoneinfo time zone name. Runner.Validate.repository The system shall verify that the HorizonScript contains zero to ten repository keys. Runner.Validate.repository.ValidPath The system shall verify that the value of each repository key is either an absolute local path beginning with an ASCII oblique (/), or a valid URL utilising the HTTP or HTTPS protocols. Runner.Validate.signingkey The system shall verify that the HorizonScript contains zero to ten signingkey keys. Runner.Validate.signingkey.ValidPath The system shall verify that the value of each signingkey key is either an absolute local path beginning with an ASCII oblique (/), or a valid URL utilising the HTTPS protocol. Runner.Validate.username The system shall verify that the HorizonScript contains zero to 255 username keys. Runner.Validate.username.Unique The system shall verify that the value of each username key is unique. Runner.Validate.username.System The system shall verify that the value of each username key does not match a system-defined account. Runner.Validate.username.Valid The system shall verify that the value of each username key is a valid Linux user account name. Runner.Validate.useralias The system shall verify that the HorizonScript contains a number of useralias keys equal or less than the number of username keys. Runner.Validate.useralias.Validity The system shall verify that each useralias 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). Runner.Validate.useralias.Name The system shall verify that the first value in each useralias key tuple is an account name specified in a username key. Runner.Validate.useralias.Unique The system shall verify that only one useralias key is specified per account name. Runner.Validate.userpw The system shall verify that the HorizonScript contains a number of userpw keys equal or less than the number of username keys. Runner.Validate.userpw.Validity The system shall verify that each userpw key has a valid form of two values in a space-separated tuple. Runner.Validate.userpw.Name The system shall verify that the first value in each userpw key tuple is an account name specified in a username key. Runner.Validate.userpw.Unique The system shall verify that only one userpw key is specified per account name. Runner.Validate.userpw.Crypt The system shall verify that the second value for each userpw key tuple is in the format: $, either 2 for Blowfish or 6 for SHA-512, $, and then variant data. Runner.Validate.userpw.None If a username key exists with no matching userpw key tuple, the system shall display a warning message that the user account will have no passphrase set. Runner.Validate.usericon The system shall verify that the HorizonScript contains a number of usericon keys equal or less than the number of username keys. Runner.Validate.usericon.Validity The system shall verify that each usericon key has a valid form of two values in a space-separated tuple. Runner.Validate.usericon.Name The system shall verify that the first value in each usericon key tuple is an account name specified in a username key. Runner.Validate.usericon.Unique The system shall verify that only one usericon key is specified per account name. Runner.Validate.usericon.ValidPath The system shall verify that the second value of each usericon key tuple is either an absolute local path beginning with an ASCII backslash (/), or a valid URL utilising the HTTP or HTTPS protocols. Runner.Validate.usergroups The system shall verify any usergroups keys contained in the HorizonScript. Runner.Validate.usergroups.Validity The system shall verify that each usergroups key has a valid form of two values in a space-separated tuple. Runner.Validate.usergroups.Name The system shall verify that the first value in each usergroups key tuple is an account name specified in a username key. Runner.Validate.usergroups.Count The system shall verify that all usergroups key tuples for a specified account name specify a combined total of sixteen or fewer groups. Runner.Validate.usergroups.Unique The system shall verify that a group is specified only once for each account name. Runner.Validate.usergroups.Group The system shall verify that each group specified is a valid system-defined group name that is present in the base system image /etc/group file. Runner.Validate.diskid The system shall verify any diskid keys contained in the HorizonScript. Runner.Validate.diskid.Validity The system shall verify that each diskid 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). Runner.Validate.diskid.Unique The system shall verify that the first value of each diskid key tuple is unique in the HorizonScript. Runner.Validate.diskid.Block If the system is running in an installation environment, the system shall ensure that the first value of each diskid key tuple specifies a valid block device. Runner.Validate.disklabel The system shall verify any disklabel keys contained in the HorizonScript. Runner.Validate.disklabel.Validity The system shall verify that each disklabel key has a valid form of two values in a space-separated tuple. Runner.Validate.disklabel.Unique The system shall verify that the first value of each disklabel key tuple is unique in the HorizonScript. Runner.Validate.disklabel.Block If the system is running in an installation environment, the system shall ensure that the first value of each disklabel key tuple specifies a valid block device. Runner.Validate.disklabel.LabelType The system shall verify that the second value of each disklabel key tuple is one of the following three values: apm, mbr, or gpt. Runner.Validate.partition The system shall verify any partition keys contained in the HorizonScript. Runner.Validate.partition.Validity The system shall verify that each partition key has a valid form of three or four values in a space-separated tuple. Runner.Validate.partition.Validity.PartNo The system shall verify that the second value of each partition key tuple is a valid positive whole integer. Runner.Validate.partition.Unique The system shall verify that the union of the first and second values in each partition key tuple are unique. Runner.Validate.partition.Block If the system is running in an installation environment, the system shall ensure that the first value of each partition key tuple specifies a valid block device. Runner.Validate.partition.Size The system shall verify that the third value in each partition key tuple specifies a valid size as described in . Runner.Validate.partition.TypeCode If a partition key tuple contains a fourth value, the system shall verify that the fourth value of the partition key tuple is a valid type code, which is one of the following two values: boot, or esp. Runner.Validate.lvm_pv The system shall verify any lvm_pv keys contained in the HorizonScript. Runner.Validate.lvm_pv.Validity The system shall verify that the value of each lvm_pv is an absolute path to a device node. Runner.Validate.lvm_pv.Block If the system is running in an installation environment, the system shall verify that the value of each lvm_pv key specifies a valid block device or a block device that will be created. Runner.Validate.lvm_vg The system shall verify any lvm_vg keys contained in the HorizonScript. Runner.Validate.lvm_vg.Validity The system shall verify that each lvm_vg key has a valid form of two values in a space-separated tuple. Runner.Validate.lvm_vg.Block If the system is running in an installation environment, the system shall verify that the first value of each lvm_vg key tuple specifies a valid block device or a block device that will be created. Runner.Validate.lvm_vg.PhysicalVolume If the system is running in an installation environment, the system shall verify that the first value of each lvm_vg key tuple specifies a valid physical volume or a physical volume that will be created. Runner.Validate.lvm_vg.Name The system shall verify that the second value of each lvm_vg key specifies a string that would be valid as an LVM volume group name. Runner.Validate.lvm_lv The system shall verify any lvm_lv keys contained in the HorizonScript. Runner.Validate.lvm_lv.Validity The system shall verify that each lvm_lv key has a valid form of three values in a space-separated tuple. Runner.Validate.lvm_lv.VolumeGroup If the system is running in an installation environment, the system shall verify that the first value of each lvm_lv key specifies a valid LVM volume group, or one specified in an lvm_vg key. Runner.Validate.lvm_lv.Name The system shall verify that the second value of each lvm_lv key specifies a string that would be valid as an LVM logical volume name. Runner.Validate.lvm_lv.Size The system shall verify that the third value in each lvm_lv key tuple specifies a valid size as described in . Runner.Validate.encrypt The system shall verify any encrypt keys contained in the HorizonScript. Runner.Validate.encrypt.Validity The system shall verify that the value of each encrypt key is a string value that is an absolute path to a device node, with an optional second value as a space-separated tuple. Runner.Validate.encrypt.Block If the system is running in an installation environment, the system shall verify that the value of each encrypt key, and the first value of each encrypt key tuple, specifies a valid block device or a block device that will be created. Runner.Validate.encrypt.Unique The system shall verify that the value of each encrypt key, and the first value of each encrypt key tuple, is unique to all encrypt keys and encrypt key tuples in the HorizonScript. Runner.Validate.fs The systemm shall verify any fs keys contained in the HorizonScript. Runner.Validate.fs.Validity The system shall verify that each fs key has a valid form of two values in a space-separated tuple. Runner.Validate.fs.Block If the system is running in an installation environment, the system shall verify that the first value of each fs key tuple specifies a valid block device or a block device that will be created. Runner.Validate.fs.Type The system shall verify that the second value of each fs key tuple specifies a valid file system supported by Horizon, using lower case characters. Runner.Validate.fs.Unique The system shall verify that the first value of each fs key is unique in the HorizonScript. Runner.Validate.mount The system shall verify that the HorizonScript contains at least one valid mount key. Runner.Validate.mount.Validity The system shall verify that each mount key has a valid form of two or three values in a space-separated tuple. Runner.Validate.mount.Block If the system is running in an installation environment, the system shall verify that the first value of each mount key tuple specifies a valid block device or a block device that will be created. Runner.Validate.mount.Point The system shall verify that the second value of each mount key tuple specifies a valid mount point beginning with a /. Runner.Validate.mount.Unique The system shall verify that the second value of each mount key is unique. Runner.Validate.mount.Root The system shall verify that one mount key tuple specifies the root (/) mount. Runner.Validate.PackageAvail If the system is running in a runtime environment, the system shall verify that all of the packages specified in pkginstall keys are available in the specified repositories; either the repositories specified in repository keys, or the system-default repositories if no repository keys have been specified.
Execute HorizonScript
Description / Priority 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.
Functional Requirements Runner.Execute The system shall execute the instructions provided in the HorizonScript in the order described. Runner.Execute.Exception The system shall report any exception encountered during execution to the listening agent, following the specification in . Runner.Execute.Status 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 . Runner.Execute.StepBegin When the system begins a step, the system shall report the step as beginning to the listening agent, following the specification in . Runner.Execute.StepDone When the system completes a step, the system shall report the step as completed to the listening agent, following the specification in . Runner.Execute.Verify The system shall validate the HorizonScript, using the process specified in the section , before execution. Runner.Execute.Verify.Failure If the HorizonScript fails validation, the system shall report a fatal exception () and stop execution. Runner.Execute.diskid The system shall verify that each block device specified in a diskid key tuple matches the identification string provided. Runner.Execute.diskid.Failure If any block device fails the diskid identification string check, the system shall consider this a fatal error and stop execution of the HorizonScript. Runner.Execute.disklabel The system shall create any disklabels specified in disklabel key tuples. Runner.Execute.disklabel.Overwrite If a disklabel already exists on the block device where a new disklabel will be written, the system shall erase the existing disklabel before creating the new disklabel. Runner.Execute.disklabel.Failure If a disklabel cannot be created due to an I/O error, or due to a non-existent block device, the system shall consider this a fatal error and stop execution of the HorizonScript. Runner.Execute.partition The system shall create any partitions specified in partition key tuples. Runner.Execute.partition.Failure The system shall consider any failure to create a partition as a fatal error and stop execution of the HorizonScript, unless otherwise specified by a requirement in this tree. Runner.Execute.partition.Failure.Device If a partition cannot be created due to an I/O error, or due to a non-existent block device, the system shall consider this condition a fatal error and stop execution of the HorizonScript. Runner.Execute.partition.Failure.Numbering The system shall consider a numbering error, defined as creating a partition with the same index as an existing partition or creating a partition with an invalid index for the block device's label, a fatal error and stop execution of the HorizonScript. Runner.Execute.partition.Failure.Duplicate If the partition cannot be created because it already exists, and all properties are identical (index, size, type codes), the system shall continue as if the partitioning succeeded. Runner.Execute.encrypt.PVs If any lvm_pv keys are specified, and any encrypt keys specify the block device where an LVM physical volume will be created, the system shall execute the encrypt keys that correlate with lvm_pv keys before executing the lvm_pv keys. Runner.Execute.lvm_pv The system shall create any LVM physical volumes specified in lvm_pv keys. Runner.Execute.lvm_pv.Failure If a LVM physical volume cannot be created due to an I/O error, or due to a non-existent block device, the system shall consider this condition a fatal error and stop execution of the HorizonScript. Runner.Execute.lvm_vg The system shall create any LVM volume groups specified in lvm_vg keys. Runner.Execute.lvm_vg.Duplicate If an LVM volume group with the specified name already exists on the computer, the system shall consider this condition a fatal error and stop execution of the HorizonScript unless the volume group is using the same physical volume as specified, in which case the system shall continue as if creation of the LVM volume group succeeded. Runner.Execute.lvm_vg.Failure If an LVM volume group cannot be created due to an I/O error, or due to a non-existent physical volume, the system shall consider this condition a fatal error and stop execution of the HorizonScript. Runner.Execute.lvm_lv The system shall create any LVM logical volumes specified in lvm_lv keys. Runner.Execute.lvm_lv.Failure If an LVM logical volume cannot be created due to an I/O error, or due to a non-existent volume group, the system shall consider this condition a fatal error and stop execution of the HorizonScript. Runner.Execute.encrypt The system shall create LUKS containers specified in encrypt keys. Runner.Execute.encrypt.Prompt If an encrypt key does not specify a passphrase, the system shall prompt the User for a passphrase via the listening agent, following the specification in . Runner.Execute.fs The system shall create file systems specified in fs key tuples. Runner.Execute.fs.Overwrite If a file system is present on the block device where a new file system is to be created, the system shall overwrite the existing file system. Runner.Execute.fs.Failure If a file system cannot be created due to an I/O error, or due to a non-existent block device, the system shall consider this condition a fatal error and stop execution of the HorizonScript. Runner.Execute.mount The system shall mount the file systems specified in mount keys, under the /target namespace. Runner.Execute.mount.UnreadableFS If a block device specified in a mount key tuple has a file system that is unreadable by the computer, the system shall consider this condition a fatal error and stop execution of the HorizonScript. Runner.Execute.mount.InvalidOption If a mount option specified in a mount key tuple is invalid, and the file system successfully mounts without that option set, the system shall log a warning to the listening agent and proceed with installation. Runner.Execute.mount.Failure If a file system cannot be mounted due to an I/O error, or due to a non-existent block device, the system shall consider this condition a fatal error and stop execution of the HorizonScript. Runner.Execute.hostname The system shall set the hostname of the computer to the hostname specified in the hostname key. Runner.Execute.hostname.Write The system shall write the hostname of the computer to the /etc/hostname file in the target namespace. Runner.Execute.repository If one or more repository keys are specified in the HorizonScript, the system shall write the repository locations to the /etc/apk/repositories file in the target namespace; otherwise, the system shall write the default repository locations to the /etc/apk/repositories file in the target namespace. Runner.Execute.firmware If a firmware key is specified in the HorizonScript, and the system is compiled with firmware support enabled, and the value of the firmware key is true, the system shall add linux-firmware to the list of packages to install. Runner.Execute.firmware.Repository If no repository keys are specified in the HorizonScript, the system shall append the repository https://distfiles.apkfission.net/adelie-$VERSION/nonfree to the /etc/apk/repositories file in the target namespace, where $VERSION is the version of Adélie Linux being installed. Runner.Execute.netssid The system shall write the wireless networking configuration specified by any netssid keys to the /etc/wpa_supplicant/wpa_supplicant.conf file in the target namespace. Runner.Execute.netaddress The system shall write the networking configuration specified by any netaddress keys to the /etc/conf.d/net file in the target namespace. Runner.Execute.netaddress.OpenRC This requirement is under discussion. Runner.Execute.nameserver If one or more nameserver keys are specified in the HorizonScript, the system shall write the nameservers specified to the /etc/resolv.conf file in the target namespace. Runner.Execute.nameserver.FQDN If the hostname key contains a domain name part (at least one ASCII period . followed by at least one alphanumeric character), the system shall write the domain name to the /etc/resolv.conf file in the target namespace. Runner.Execute.network If the value of the network key is true, the system shall execute the netssid, netaddress, and nameserver keys in the installation environment. Runner.Execute.network.netaddress If the value of the network key is true, the system shall use the networking configuration specified in any netaddress keys in the installation environment. Runner.Execute.network.netssid If the value of the network key is true, the system shall use the wireless networking configuration specified in any netssid keys in the installation environment. Runner.Execute.network.nameserver If the value of the network key is true, the system shall use the nameservers specified in any nameserver keys in the installation environment. Runner.Execute.usericon The system shall use the icons specified in any usericon key tuples for identification of users in user interface elements in the target namespace. Runner.Execute.usericon.Remote If any usericon location is remote, the system shall download the contents of the remote file to the /usr/share/user-manager/avatars/remote/ directory in the target namespace. Runner.Execute.signingkey If any signingkey key is specified in the HorizonScript, the system shall copy all specified files to the /etc/apk/keys/ directory in the target namespace; otherwise, the system shall copy the default Adélie Linux signing keys to the /etc/apk/keys/ directory in the target namespace. Runner.Execute.signingkey.Firmware If the firmware key is specified in the HorizonScript, and the system is compiled with firmware support enabled, and the value of the firmware key is true, then the system shall copy the APK Fission signing key(s) to the /etc/apk/keys/ directory in the target namespace. Runner.Execute.pkginstall The system shall install all packages requested via the pkginstall key to the target namespace utilising the repositories configured in the target namespace. Runner.Execute.pkginstall.APKDB The system shall initialise the APK database in the target namespace before installing packages. Runner.Execute.pkginstall.arch If a arch key is specified in the HorizonScript, the system shall set the architecture of the target computer before installing packages and after initialising the APK database. Runner.Execute.pkginstall.Keys The system shall use the signing keys as specified in any signingkey keys for ensuring package integrity during package installation. Runner.Execute.rootpw The system shall set the root password in the target namespace to the value specified in the rootpw key. Runner.Execute.language If a language key is specified in the HorizonScript, the system shall add a script to /etc/profile.d setting the LANG environment variable to the value of the language key. Runner.Execute.keymap If a keymap key is specified in the HorizonScript, the system shall set the XKBLAYOUT variable in the /etc/default/keyboard file in the target namespace to value of the keymap key. Runner.Execute.UserAccounts The system shall configure user accounts in the target namespace as specified in keys username, useralias, userpw, and usergroups. Runner.Execute.timezone If a timezone key is specified in the HorizonScript, the system shall set the timezone in the target namespace to the specified timezone; otherwise, the system shall set the timezone in the target namespace to UTC. Runner.Execute.timezone.Missing If the zoneinfo file for the specified timezone in the timezone key is missing in the target namespace, but present in the installation environment, the system shall copy the zoneinfo file from the installation environment to the /etc/localtime file in the target namespace. Runner.Execute.Finish The system shall notify the listening agent that the HorizonScript has executed successfully and that the target is installed.