h$A}      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                                                 !!!!!!!!"""###$$$$$$$$$$$$$$$$$$$$$$$%%%%%%%%%%%&&&&'''((((())))) ) ) ) ) ) ) ) ) ) ) ) * * * * * * * * * * * * * * * * * * * * * * * * * * + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , - - - . . . . . . . . . . . / / / / / / / / / / / / / / / / / / / / 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 5 5    6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : ; ; < = = > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ? ? ? @ @ @ @ @ @ @ @ A A A A A A A A A A A A A A A A B B B B B B B B B B C C C D D D D D D D D D E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E F F F F F F F F F F F F F F F F F F F F F F F F F F F F G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G H H H H H I I I I I I I I I J J J J J J J J J J K K K KKLLMMMMMMMMMMMMNNNNNNNNNNNNNNNNNNNNOPPPPPPPPPPPQQQQQQQQQQQQQQQQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSTTTTTTTTTTTTTUUUUUUUUUUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWWWWWWWWWWWWWWWWWWWWWXYYYYYZZZZZZ[[[[[[[[[\\\\\\\\\\\\\\\\\\]]]]]]]]]]]]]]]]]]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^___________________________```````````aaaaaaaaaaabbbbbbbbbbbccccccccccccccccccccccccccccccccccddddeefffffggggggggggghhhijjjjjjjjkkkklllllllllllllllllllllllllllllmmmmmmmmmmmmmmmmnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnoooooooooooooooooopppppppqqqqqqqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrsssssssssssssssssssssssssssssssssssssssssssssssssstuuvvvvvvvvvvwwwwwwwwwwwwwwwwwwxxxxxxxxxxyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzZZZZZZ{{{{{{{{{{{{{{{{{{||}}}}~~~~~~~~ Safe-Inferred3 Safe-Inferred4< propellor>This is where propellor installs itself when deploying a host.  Safe-Inferred5 propellor7Class of user input that an installer might prompt for. propellor4Get the disk device the user selected to install to. propellorCheck if the user has confirmed they want to erase the target disk device. propellorThe disk device to install to.  Safe-Inferred>8 propellorA value that can be used in a configuration file, or otherwise used to configure a program.Unlike Show, there should only be instances of this type class for values that have a standard serialization that is understood outside of Haskell code.When converting a type alias such as "type Foo = String" or "type Foo = Int" to a newtype, it's unsafe to derive a Show instance, because there may be code that shows the type to configure a value. Instead, define a ConfigurableValue instance. propellor6val String does not do any quoting, unlike show String  Safe-Inferred8M  Safe-Inferred3: propellorNormally when an exception is encountered while propellor is ensuring a property, the property fails, but propellor robustly continues on to the next property.This is the only exception that will stop the entire propellor run, preventing any subsequent properties of the Host from being ensured. (When propellor is running in a container in a Host, this exception only stops the propellor run in the container; the outer run in the Host continues.)You should only throw this exception when things are so badly messed up that it's best for propellor to not try to do anything else.None'(3?  propellorUse this to put a value in Info that is not a monoid. The last value set will be used. This info does not propagate out of a container. propellorInfo about PrivData generally will be propigated even in cases where other Info is not, so it treated specially. propellor4Values stored in Info must be members of this class.This is used to avoid accidentially using other data types as info, especially type aliases which coud easily lead to bugs. We want a little bit of dynamic types here, but not too far.. propellor>Should this info be propagated out of a container to its Host? propellorInformation about a Host, which can be provided by its properties.Many different types of data can be contained in the same Info value at the same time. See  and . propellorAny value in the $ type class can be added to an Info. propellorConverts any value in the 4 type class into an Info, which is otherwise empty. propellorExtracts a value from an Info. propellorMaps a function over all values stored in the Info that are of the appropriate type. None>D propellorCapabilities of a container. propellorThe container has its own hostname (and domain name) separate from the system that contains it. propellorThe container has its own root filesystem, rather than sharing the root filesystem of the system that contains it. propellor;A value that can be bound between the host and a container.For example, a Bound Port is a Port on the container that is bound to a Port on the host. propellorCreate a Bound value, from two different values for the host and container. For example, Port 8080 -<- Port 80 means that port 8080 on the host is bound to port 80 from the container. propellorFlipped version of -<- with the container value first and host value second. propellorCreate a Bound value, that is the same on both the host and container. propellorA [ContainerCapability] can be used as Info. It does not propagate out to the Host. When not in a container, the Info value will be [].  None3H  propellorMany of these architecture names are based on the names used by Debian, with a few exceptions for clarity. propellor&64 bit Intel, called "amd64" in Debian propellor%32 bit Intel, called "i386" in Debian propellorItanium propellorNew Linux ABI for 64 bit CPUs using 32-bit integers. Not widely used. propellor#FreeBSD breaks their releases into  Production and Legacy. propellorDebian has several rolling suites, and a number of stable releases, such as Stable "buster". propellorMost of Debian ports are based on Linux. There also exist hurd-i386, kfreebsd-i386, kfreebsd-amd64 ports propellorProperties can target one or more OS's; the targets are part of the type of the property, so need to be kept fairly simple. propellorA well-known Debian derivative founded by a space tourist. The actual name of this distribution is not used in Propellor per 0http://joeyh.name/blog/entry/trademark_nonsense/ propellor-High level description of a operating system. propellor-Makes a Group with the same name as the User.>> Safe-InferredJJ propellorResults of actions, with color. propellor4There can be three results of satisfying a Property.None3>O>  propellorGets the info of the property, combined with all info of all children properties. propellor'Info, not including info from children. propellorGets a ChildProperty representing the Property. You should not normally need to use this. propellorGets the action that can be run to satisfy a Property. You should never run this action directly. Use  instead. propellorSince there are many different types of Properties, they cannot be put into a list. The simplified ChildProperty can be put into a list. propellorProps is a combination of a list of properties, with their combined metatypes. propellorAn action that Propellor runs at the end, after trying to satisfy all properties. It's passed the combined Result of the entire Propellor run. propellorPropellor's monad provides read-only access to info about the host it's running on, and a writer to accumulate EndActions. propellorEverything Propellor knows about a system: Its hostname, properties and their collected info. propellorWhen two actions are appended together, the second action is only run if the first action does not fail. Safe-Inferred '(./?P} propellorFrom singleton to value. propellor1A class used to pass singleton values implicitly. propellor#The data family of singleton types. A@ A@None'(-./>U propellor!Type level equality of metatypes. propellor1Every item in the subset must be in the superset. propellorType level difference. Items that are in the first list, but not in the second. propellor=Type level intersection. Duplicate list items are eliminated. propellorType level union. propellorPretty-prints a list of MetaTypes for display in a type error message. propellor$Allows providing an additional note. propellorThis (or CheckCombinableNote) should be used anywhere Combine is used, as an additional constraint. For example: 3foo :: CheckCombinable x y => x -> y -> Combine x y propellorCombine two MetaTypes lists, yielding a list that has targets present in both, and nontargets present in either. propellor)Convenience type operator to combine two  lists. For example: HasInfo + Debian!Which is shorthand for this type: )MetaTypes '[WithInfo, Targeting OSDebian] propellorUsed to indicate that a Property adds Info to the Host where it's used. propellorDebian and derivatives. propellorAny linux system propellorAny unix-like system propellorA target OS of a Property propellor-Indicates that a Property has associated Info BC BC Safe-InferredV4 Safe-InferredV Safe-InferredV Safe-InferredW Safe-InferredWR ! D Safe-InferredW Safe-InferredX#NoneXS Safe-InferredX Safe-InferredX  Safe-InferredY*  Safe-InferredYj 232015 Joey Hess  BSD-2-clauseNone>i propellorBuffered output. propellorValues that can be output. propellor.A shared global variable for the OutputHandle. propellorHolds a lock while performing an action. This allows the action to perform its own output to the console, without using functions from this module.While this is running, other threads that try to lockOutput will block. Any calls to  and  will not block, but the output will be buffered and displayed only once the action is done. propellor%Blocks until we have the output lock. propellor0Tries to take the output lock, without blocking. propellor/Only safe to call after taking the output lock. propellor%Use this around any actions that use  or This is necessary to ensure that buffered concurrent output actually gets displayed before the program exits. propellor&Blocks until any processes started by  have finished, and any buffered output is displayed. Also blocks while  is is use. calls this at the end, so you do not normally need to use this. propellorDisplays a value to stdout.No newline is appended to the value, so if you want a newline, be sure to include it yourself.Uses locking to ensure that the whole output occurs atomically even when other threads are concurrently generating output.When something else is writing to the console at the same time, this does not block. It buffers the value, so it will be displayed once the other writer is done. propellorLike , but displays to stderr.(Does not throw an exception.) propellor.Use this to wait for processes started with  and , and get their exit status.Note that such processes are actually automatically waited for internally, so not calling this explicitly will not result in zombie processes. This behavior differs from  propellorWrapper around  that prevents multiple processes that are running concurrently from writing to stdout/stderr at the same time.If the process does not output to stdout or stderr, it's run by createProcess entirely as usual. Only processes that can generate output are handled specially:A process is allowed to write to stdout and stderr in the usual way, assuming it can successfully take the output lock.When the output lock is held (ie, by another concurrent process, or because  is being called at the same time), the process is instead run with its stdout and stderr redirected to a buffer. The buffered output will be displayed as soon as the output lock becomes free.6Currently only available on Unix systems, not Windows. propellorWrapper around  that makes sure a process is run in the foreground, with direct access to stdout and stderr. Useful when eg, running an interactive process. propellor4Adds a value to the output buffer for later display.Note that buffering large quantities of data this way will keep it resident in memory until it can be displayed. While  uses temp files if the buffer gets too big, this STM function cannot do so. propellorA STM action that waits for some buffered output to become available, and returns it.The function can select a subset of output when only some is desired; the fst part is returned and the snd is left in the buffer.This will prevent it from being displayed in the usual way, so you'll need to use  to display it yourself. propellor Use with  to make it only return buffered output that ends with a newline. Anything buffered without a newline is left in the buffer. propellor3Emits the content of the OutputBuffer to the Handle If you use this, you should use : to ensure you're the only thread writing to the console.?2015 Joey Hess  BSD-2-clauseNonei2015 Joey Hess  BSD-2-clauseNonelG propellorCalls You should use the waitForProcess in this module on the resulting ProcessHandle. Using System.Process.waitForProcess instead can have mildly unexpected results. propellorCalls You should only use this on a ProcessHandle obtained by calling createProcess from this module. Using this with a ProcessHandle obtained from System.Process.createProcess etc will have extremely unexpected results; it can wait a very long time before returning. Safe-Inferredlw Nonel7Nonet2 propellorNormally, when reading from a process, it does not need to be fed any standard input. propellorRuns an action to write to a process on its stdin, returns its output, and also allows specifying the environment. propellorWaits for a ProcessHandle, and throws an IOError if the process did not exit successfully. propellorWaits for a ProcessHandle and returns True if it exited successfully. Note that using this with createProcessChecked will throw away the Bool, and is only useful to ignore the exit code of a process, while still waiting for it. -} propellorRuns createProcess, then an action on its handles, and then forceSuccessProcess. propellorRuns createProcess, then an action on its handles, and then a checker action on its exit code, which must wait for the process. propellorLeaves the process running, suitable for lazy streaming. Note: Zombies will result, and must be waited on. propellorRuns a CreateProcessRunner, on a CreateProcess structure, that is adjusted to pipe only from/to a single StdHandle, and passes the resulting Handle to an action. propellorLike withHandle, but passes (stdin, stdout) handles to the action. propellorLike withHandle, but passes (stdout, stderr) handles to the action. propellorForces the CreateProcessRunner to run quietly; both stdout and stderr are discarded. propellorStdout and stderr are discarded, while the process is fed stdin from the handle. propellorStarts an interactive process. Unlike runInteractiveProcess in System.Process, stderr is inherited. propellorWrapper around  that does debug logging. propellorWrapper around  that does debug logging.Noneu propellorRuns a process and returns a transcript combining its stdout and stderr, and whether it succeeded or failed. propellor"Also feeds the process some input. Safe-Inferredw? propellorsame as Data.List.Utils.split intercalate x . splitOn x === id propellorSplit on a single character. This is over twice as fast as using split on a list of length 1, while producing identical results. -} propellorsame as Data.List.Utils.replace propellorOnly traverses the list once while dropping the last n characters.None|  propellor1Parameters that can be passed to a shell command. propellor A parameter propellorThe name of a file propellorUsed to pass a list of CommandParams to a function that runs a command and expects Strings. -} propellorRun a system command, and returns True or False if it succeeded or failed.This and other command running functions in this module log the commands run at debug level, using System.Log.Logger. propellor1Runs a system command, returning the exit status. propellorWraps a shell command line inside sh -c, allowing it to be run in a login shell that may not support POSIX shell, eg csh. propellorEscapes a filename or other parameter to be safely able to be exposed to the shell.This method works for POSIX shells, as well as other shells like csh. propellor3Unescapes a set of shellEscaped words or filenames. propellorFor quickcheck. propellorSegments a list of filenames into groups that are all below the maximum command-line length limit. propellorNot preserving order is a little faster, and streams better when there are a great many filenames.None|GNone|qNoneS propellor DNSSEC Zone Signing Key (public) propellor!DNSSEC Zone Signing Key (private) propellorDNSSEC Key Signing Key (public) propellor DNSSEC Key Signing Key (private) propellor!Contains the actual private data.Note that this may contain exta newlines at the end, or they may have been stripped off, depending on how the user entered the privdata, and which version of propellor stored it. Use the accessor functions below to avoid newline problems. propellor.Class of things that can be used as a Context. propellorA context that may vary depending on the HostName where it's used. propellor+A context in which a PrivDataField is used.Often this will be a domain name. For example, Context "www.example.com" could be used for the SSL cert for the web server serving that domain. Multiple hosts might use that privdata.*This appears in serialized privdata files. propellorCombines a PrivDataField with a description of how to generate its value. propellorNote that removing or changing constructors or changing types will break the serialized privdata files, so don't do that! It's fine to add new constructors. propellorNot used anymore, but retained to avoid breaking serialization of old files propellor For host key, use empty UserName propellorUse when a PrivDataField is not dependent on any paricular context. propellor7Makes a HostContext that consists just of the hostname. propellorWhen PrivData is the content of a file, this is the lines thereof. propellorWhen the PrivData is a single value, like a password, this extracts it. Note that if multiple lines are present in the PrivData, only the first is returned; there is never a newline in the String. propellor&Use to get ByteString out of PrivData. propellorParameter that would be passed to ssh-keygen to generate key of this type,,Nonem propellor8All the command line actions that propellor can perform. Safe-Inferred propellor Represents a dataset in a zpool.-Can be constructed from a / separated string. propellorRepresents a zpool. propellorA single ZFS filesystem.((None3>{ propellorDomains in the zone file must end with a period if they are absolute.Let's use a type to keep absolute domains straight from relative domains.The RootDomain refers to the top level of the domain, so can be used to add nameservers, MX's, etc to a domain. propellor2Bind serial numbers are unsigned, 32 bit integers. propellor2An in-addr.arpa record corresponding to an IPAddr. propellorTypes of DNS records./This is not a complete list, more can be added. propellor?  propellorTightens the MetaType list of a Property (or similar), to contain fewer targets.For example, to make a property that uses apt-get, which is only available on DebianLike systems: upgraded :: Property DebianLike upgraded = tightenTargets $ cmdProperty "apt-get" ["upgrade"] propellorCombines together two properties, yielding a property that has the description and info of the first, and that has the second property as a child property. propellorType level calculation of the type that results from combining two types of properties. propellorA property that can be reverted. The first Property is run normally and the second is run when it's reverted.See } for a way to use RevertableProperty to define different versions of a host. propellorThe core data type of Propellor, this represents a property that the system should have, with a description, and an action to ensure it has the property.There are different types of properties that target different OS's, and so have different metatypes. For example: "Property DebianLike" and "Property FreeBSD".&Also, some properties have associated , which is indicated in their type: "Property (HasInfo + DebianLike)"There are many associated type families, which are mostly used internally, so you needn't worry about them. propellorConstructs a Property, from a description and an action to run to ensure the Property is met.Due to the polymorphic return type of this function, most uses will need to specify a type signature. This lets you specify what OS the property targets, etc. For example:  foo :: Property Debian foo = property "foo" $ do ... return MadeChange propellor;Changes the action that is performed to satisfy a property. propellorShorthand to construct a revertable property from any two Properties. propellor!Any type of Property is a Monoid. propellorAny type of Property is a Semigroup. When properties x and y are appended together, the resulting property has a description like "x and y". Note that when x fails to be ensured, it will not try to ensure y. propellorAny type of RevertableProperty is a Semigroup. When revertable properties x and y are appended together, the resulting revertable property has a description like "x and y". Note that when x fails to be ensured, it will not try to ensure y. propellor5How to combine the actions to satisfy the properties. propellorUsed when combining revertable properties, to combine their reversion actions.&None3None3RNone3> propellorPlatforms that grub can boot. propellor Boot loader installed on a host.  None  propellorSerializable tracing. Export `PROPELLOR_TRACE=1` in the environment to make propellor emit these to stdout, in addition to its other output. propellorGiven a line read from propellor, if it's a serialized Trace, parses it. propellorGets the global MessageHandle. propellorForce console output. This can be used when stdout is not directly connected to a console, but is eventually going to be displayed at a console. propellorShows a message while performing an action, with a colored status display. propellorShows a message while performing an action on a specified host, with a colored status display. propellor;Displays the error message in red, and throws an exception.When used inside a property, the exception will make the current property fail. Propellor will continue to the next property. propellorLike , but throws a =, preventing propellor from continuing to the next property.Think twice before using this. Is the problem so bad that propellor cannot try to ensure other properties? If not, use  instead. propellor propellor This is a  but its / is not accurate; in particular it may return  despite having made a change. However, when it returns $, it really did make a change, and  is still an error. propellor-Use to indicate that a Property is unchecked. propellor;Checks the result of a property. Mostly used to convert a  to a +, but can also be used to further check a . propellorMakes a  or an  only run when a test succeeds. propellorSometimes it's not practical to test if a property made a change. In such a case, it's often fine to say: someprop `assume` MadeChangeHowever, beware assuming &, as that will make combinators like onChange not work. propellor!Run before ensuring the property. propellor(Run after ensuring the property. Return  if a change was detected, or  if no change was detected.None -./ propellor:Used to provide the metatypes of a Property to calls to  within it. propellorFor when code running in the Propellor monad needs to ensure a Property.Use  ` to get the OuterMetaTypesWithness. For example: foo = Property Debian foo = property' "my property" $ \w -> do ensureProperty w (aptInstall "foo")The type checker will prevent using ensureProperty with a property that does not support the target OSes needed by the OuterMetaTypesWitness. In the example above, aptInstall must support Debian, since foo is supposed to support Debian.The type checker will also prevent using ensureProperty with a property with HasInfo in its MetaTypes. Doing so would cause the * associated with the property to be lost. propellorConstructs a property, like , but provides its . Safe-InferredEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxy~z{}| Safe-Inferred propellorA table with a header that is set off with lines under each header item. propellorFormats a table to lines, automatically padding columns to the same size.None NoneVNoneEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxy~z{}|Nonej propellorReads the next entry from the handle. Once the end of the directory is reached, returns Nothing and automatically closes the handle. propellorLike getDirectoryContents, but rather than buffering the whole directory content in memory, lazily streams.This is like lazy readFile in that the handle to the directory remains open until the whole list is consumed, or until the list is garbage collected. So use with caution particularly when traversing directory trees. propellorTrue only when directory exists and contains nothing. Throws exception if directory does not exist.NoneH propellorTrue only when directory exists and contains nothing. Throws exception if directory does not exist. propellorTrue if the directory does not exist or contains nothing. Ignores "lost+found" which can exist in an empty filesystem. propellorRun test on entries found in directory, return False as soon as the test returns False, else return True. Throws exception if directory does not exist.None ./>? propellorMakes a perhaps non-idempotent Property be idempotent by using a flag file to indicate whether it has run before. Use with caution. propellorIndicates that the first property depends on the second, so before the first is ensured, the second must be ensured.The combined property uses the description of the first property. propellorCombines together two properties, resulting in one property that ensures the first, and if the first succeeds, ensures the second.The combined property uses the description of the first property. propellorWhenever a change has to be made for a Property, causes a hook Property to also be run, but not otherwise. propellorSame as  except that if property y fails, a flag file is generated. On next run, if the flag file is present, property y is executed even if property x doesn't change.With , if y fails, the property x  y returns 5. But if this property is applied again, it returns $. This behavior can cause trouble... propellor&Changes the description of a property. propellor Alias for  flip describe propellorTries the first property, but if it fails to work, instead uses the second. propellorIndicates that a Property may change a particular file. When the file is modified in any way (including changing its permissions or mtime), the property will return MadeChange instead of NoChange. propellorLike , but compares the content of the file. Changes to mtime etc that do not change file content are treated as NoChange. propellor;Determines if the first file is newer than the second file.This can be used with 0 to only run a command when a file has changed. check ("/etc/aliases" `isNewerThan` "/etc/aliases.db") (cmdProperty "newaliases" [] `assume` MadeChange) -- updates aliases.dbOr it can be used with $ to test if a command made a change. checkResult (return ()) (\_ -> "/etc/aliases.db" `isNewerThan` "/etc/aliases") (cmdProperty "newaliases" [])(If one of the files does not exist, the file that does exist is considered to be the newer of the two.) propellorPicks one of the two input properties to use, depending on the targeted OS.If both input properties support the targeted OS, then the first will be used.The resulting property will use the description of the first property no matter which property is used in the end. So, it's often a good idea to change the description to something clearer. For example: upgraded :: Property (DebianLike + FreeBSD) upgraded = (Apt.upgraded `pickOS` Pkg.upgraded) `describe` "OS upgraded";If neither input property supports the targeted OS, calls . Using the example above on a Fedora system would fail that way. propellorMakes a property that is satisfied differently depending on specifics of the host's operating system.  myproperty :: Property Debian myproperty = withOS "foo installed" $ \w o -> case o of (Just (System (Debian kernel (Stable release)) arch)) -> ensureProperty w ... (Just (System (Debian kernel suite) arch)) -> ensureProperty w ... _ -> unsupportedOS'Note that the operating system specifics may not be declared for all hosts, which is where Nothing comes in. propellor:A property that always fails with an unsupported OS error. propellorThrows an error, for use in / when a property is lacking support for an OS. propellor*Undoes the effect of a RevertableProperty. propellorA no-op property.This is the same as  from the  instance. propellorIn situations where it's not possible to provide a property that works, this can be used to make a property that always fails with an error message you provide. propellorRegisters an action that should be run at the very end, after propellor has checks all the properties of a host.!!1None propellor9A series of shell commands. (Without a leading hashbang.) propellor6A property that can be satisfied by running a command.#The command must exit 0 on success. propellorA property that can be satisfied by running a command, with added environment variables in addition to the standard environment. propellor5A property that can be satisfied by running a script. propellorA property that can satisfied by running a script as user (cd'd to their home directory). None ./>? propellor"Defines a host and its properties. host "example.com" $ props & someproperty ! oldproperty & otherproperty propellor(Start accumulating a list of properties.$Properties can be added to it using  etc. propellorAdds a property to a Props.+Can add Properties and RevertableProperties propellor,Adds a property before any other properties. propellor!Adds a property in reverted form.111NoneD Noney!None/r propellorGets the Properties of a Host, and ensures them all, with nice display of what's being done. propellor0Runs a Propellor action with the specified host.If the Result is not FailedChange, any EndActions that were accumulated while running the action are then also run. propellorEnsures the child properties, with a display of each as it runs. propellor5Lifts an action into the context of a different host. ,fromHost hosts "otherhost" Ssh.getHostPubKey propellorChains to a propellor sub-Process, forwarding its output on to the display, except for the last line which is a Result. propellor?Used by propellor sub-Processes that are run by chainPropellor."None ./>- propellorCombines a list of properties, resulting in a single property that when run will run each property in the list in turn, and print out the description of each as it's run. Does not stop on failure; does propagate overall success/failure. For example: (propertyList "foo" $ props & bar & baz propellorCombines a list of properties, resulting in one property that ensures each in turn. Stops if a property fails. -combineProperties "foo" $ props & bar & bazThis is similar to using  with a list of properties, except it can combine together different types of properties.#NonebNoneն propellorWhen at a tty, set GPG_TTY to point to the tty device. This is needed so that when gpg is run with stio connected to a pipe, it is still able to display password prompts at the console.This should not prevent gpg from using the GUI for prompting when one is available.$None /3?s propellorAllows a Property to access the value of a specific PrivDataField, for use in a specific Context or HostContext. Example use: withPrivData (PrivFile pemfile) (Context "joeyh.name") $ \getdata -> property "joeyh.name ssl cert" $ getdata $ \privdata -> liftIO $ writeFile pemfile (privDataVal privdata) where pemfile = "/etc/ssl/certs/web.pem"Note that if the value is not available, the action is not run and instead it prints a message to help the user make the necessary private data available.The resulting Property includes Info about the PrivDataField being used, which is necessary to ensure that the privdata is sent to the remote host by propellor. propellor?Get only the set of PrivData that the Host's Info says it uses. propellorSets the context of any privdata that uses HostContext to the provided name.%None/ propellorNote that the metatype of a container's properties is not retained, so this defaults to UnixLike. So, using this with setContainerProps can add properties to a container that conflict with properties already in it. Use caution when using this; only add properties that do not have restricted targets. propellorAdjust the provided Property, adding to its propertyChidren the properties of the provided container.The Info of the propertyChildren is adjusted to only include info that should be propagated out to the Property.Any PrivInfo that uses HostContext is adjusted to use the name of the container as its context. propellorFilters out parts of the Info that should not propagate out of a container.  NoneNoneD ! DEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxy~z{}|! D EFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxy~z{}|Nonev ! $#"'&%*)(-,+0/.321654987<;:?>=DEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxy~z{}|EFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxy~z{}|None`&&2016 Evan Cofsky None7 propellor$Gets the properties of a ZFS volume. propellor(Runs the zfs command with the arguments.Runs the command with -H which will skip the header line and separate all fields with tabs.Replaces Nothing in the argument list with the ZFS pool/dataset. propellorReturn the ZFS command line suitable for readProcess or cmdProperty.'&2016 Evan Cofsky None propellorOS's that support ZFS propellorWill ensure that a ZFS volume exists with the specified mount point. This requires the pool to exist as well, but we don't create pools yet. propellorSets the given properties. Returns True if all were successfully changed, False if not.&2016 Evan Cofsky None+(NoneV propellor$Kernel version number, in a string.  propellor/Using this property causes an immediate reboot.So, this is not a useful property on its own, but it can be useful to compose with other properties. For example: 4 Apt.installed ["new-kernel"] `onChange` Reboot.now propellor;Schedules a reboot at the end of the current propellor run.The  code of the entire propellor run can be checked; the reboot proceeds only if the function returns True.The reboot can be forced to run, which bypasses the init system. Useful if the init system might not be running for some reason. propellorReboots immediately if a kernel other than the distro-installed kernel is running.This will only work if you have taken measures to ensure that the other kernel won't just get booted again. See # for an example of how to do this. propellorGiven a kernel version string v, reboots immediately if the running kernel version is strictly less than v and there is an installed kernel version is greater than or equal to v;. Fails if the requested kernel version is not installed.For this to be useful, you need to have ensured that the installed kernel with the highest version number is the one that will be started after a reboot.This is useful when upgrading to a new version of Debian where you need to ensure that a new enough kernel is running before ensuring other properties.)Zihao Wang None  propellorHave pacman update its lists of packages, but without upgrading anything.    *&2016 Evan Cofsky None3  +None>?  propellor,The location that a symbolic link points to.  propellor#Replaces all the content of a file.  propellorEnsures that a line is present in a file, adding it to the end if not. For example:  & "/etc/default/daemon.conf" `File.containsLine` ("cachesize = " ++ val 1024)The above example uses  to serialize a   propellorEnsures that a list of lines are present in a file, adding any that are not to the end of the file.Note that this property does not guarantee that the lines will appear consecutively, nor in the order specified. If you need either of these, use .  propellorEnsures that a block of consecutive lines is present in a file, adding it to the end if not. Revert to ensure that the block is not present (though the lines it contains could be present, non-consecutively).  propellorEnsures that a line is not present in a file. Note that the file is ensured to exist, so if it doesn't, an empty file will be written.  propellorReplaces all the content of a file, ensuring that its modes do not allow it to be read or written by anyone other than the current user  propellor5Ensures a file has contents that comes from PrivData.The file's permissions are preserved if the file already existed. Otherwise, they're set to 600.  propellorLike hasPrivContent, but allows specifying a source for PrivData, rather than using .  propellorLeaves the file at its default or current mode, allowing "private" data to be read.Use with caution!  propellorReplaces the content of a file with the transformed content of another file  propellor ownerGroup f (User "user") (Group "user"))  propellor.Ensures that a file/dir has the specfied mode.  propellorA property that applies a pure function to the content of a file.  propellor7A temp file to use when writing new content for a file.8This is a stable name so it can be removed idempotently.It ends with "~" so that programs that read many config files from a directory will treat it as an editor backup file, and not read it.  propellorCreates/updates a file atomically, running the action to create the stable tmp file, and then renaming it into place.  propellorGenerates a base configuration file name from a String, which can be put in a configuration directory, such as /etc/apt/sources.list.d/The generated file name is limited to using ASCII alphanumerics, '_' and '.' , so that programs that only accept a limited set of characters will accept it. Any other characters will be encoded in escaped form.Some file extensions, such as ".old" may be filtered out by programs that use configuration directories. To avoid such problems, it's a good idea to add an static prefix and extension to the result of this function. For example: aptConf foo = "/etc/apt/apt.conf.d" "propellor_" ++ configFileName foo <.> ".conf"  propellor6Applies configFileName to any value that can be shown.  propellorInverse of showConfigFileName.  propellorWhen passed PreserveExisting, only ensures the property when the file does not exist.) ) ,None r  propellor/Removes user home directory!! Use with caution.  propellorOnly ensures that the user has some password set. It may or may not be a password from the PrivData.  propellorWhile hasSomePassword uses the name of the host as context, this allows specifying a different context. This is useful when you want to use the same password on multiple hosts, for example.  propellorEnsures that a user's password is set to a password from the PrivData. (Will change any existing password.)A user's password can be stored in the PrivData in either of two forms; the full cleartext  Password or a  CryptPassword, hash. The latter is obviously more secure.  propellorMakes a user's password be the passed String. Highly insecure: The password is right there in your config file for anyone to see!  propellorGives a user access to the secondary groups, including audio and video, that the OS installer normally gives a desktop user access to.Note that some groups may only exit after installation of other software. When a group does not exist yet, the user won't be added to it.  propellorEnsures that a file is owned by a user, and also by that user's primary group.  propellor5Controls whether shadow passwords are enabled or not.  propellorEnsures that a user has a specified login shell, and that the shell is enabled in etcshells.  propellor Ensures that etcshells contains a shell.  -None   .None3Z  propellorEnsures that a service is running. Does not ensure that any package providing that service is installed. See Apt.serviceInstalledRunningNote that due to the general poor state of init scripts, the best we can do is try to start the service, and if it fails, assume this means it's already running.  propellorThis property prevents daemons and other services from being started, which is often something you want to prevent when building a chroot.When this is set,   and   will not start services.On Debian this installs a  /usr/sbin/policy-rc.d script to further prevent any packages that get installed from starting daemons. Reverting the property removes the script.  propellor.Check if the noServices property is in effect. /None  propellorStanza of an ifupdown interfaces file, with header lines and options.  propellor:Options to put in a stanza of an ifupdown interfaces file.  propellorResets etcnetwork/interfaces to a clean and empty state, containing just the standard loopback interface, and with interfacesD enabled.This can be used as a starting point to defining other interfaces.6No interfaces are brought up or down by this property.  propellor4Configures an interface to get its address via dhcp.  propellor:Configures an interface with a static address and gateway.  propellorConfigures an interface with several stanzas (IPv4 and IPv6 for example).  propellorWrites a static interface file for the specified interface to preserve its current configuration.The interface has to be up already. It could have been brought up by DHCP, or by other means. The current ipv4 addresses and routing configuration of the interface are written into the file.If the interface file already exists, this property does nothing, no matter its content.(ipv6 addresses are not included because it's assumed they come up automatically in most situations.)  propellor*6to4 ipv6 connection, should work anywhere  propellor%A file in the interfaces.d directory.  propelloretcnetwork interfaces.d files have to match -- ^[a-zA-Z0-9_-]+$ see "man 5 interfaces"  propellorEnsures that files in the the interfaces.d directory are used. interfacesDEnabled :: Property DebianLike  0None  propellor4Function to extract the domain name from a HostName.  propellorEnsures that the hostname is set using best practices, to whatever name the  has.Configures both  /etc/hostname and the current hostname. (However, when used inside a chroot, avoids setting the current hostname as that would impact the system outside the chroot.) /etc/hosts is also configured, with an entry for 127.0.1.1, which is standard at least on Debian to set the FDQN. Also, the  /etc/hosts 127.0.0.1 line is set to localhost. Putting any other hostnames there is not best practices and can lead to annoying messages from eg, apache.  propellorMakes  /etc/resolv.conf contain search and domain lines for the domain that the hostname is in.  propellorhostname of foo.example.com has a domain of example.com. But, when the hostname is example.com, the domain is example.com too.This doesn't work for eg, foo.co.uk, or when foo.sci.uni.edu is in a sci.uni.edu subdomain. If you are in such a network, provide your own ExtractDomain function to the properties above. 1&2016 Evan Cofsky None3& & &2016 Evan Cofsky None8 2NoneZ  propellor1Puts the DNSSEC key files in place from PrivData.signedPrimary uses this, so this property does not normally need to be used directly.  propellor2Uses dnssec-signzone to sign a domain's zone file.signedPrimary uses this, so this property does not normally need to be used directly.  propellorThe file used for a given key.  propellor6These are the extensions that dnssec-keygen looks for.  propellor$dnssec-signzone makes a .signed file 3None%  propellorKey for a shell conffile property. Conventionally uppercase letters and numbers with underscores for separators. See files in  /etc/default.  propellor3Name of a configuration setting within a .ini file.  propellorName of a section of an .ini file. This value is put in square braces to generate the section header.  propellorif SectionStart does not find the section in the file, this is used to insert the section somewhere within it  propellorrun on all lines in the section, including the SectionStart line; can add, delete, and modify lines, or even delete entire section  propellorfind a line that indicates we are past the section (eg, a new section header)  propellor?find the line that is the start of the wanted section (eg, == " Foo")  propellorAdjusts a section of conffile.  propellorEnsures that a .ini file exists and contains a section with a key=value setting.  propellorRemoves a key=value setting from a section of an .ini file. Note that the section heading is left in the file, so this is not a perfect reversion of containsIniSetting.  propellorEnsures that a .ini file exists and contains a section with a given key=value list of settings.  propellorEnsures that a .ini file does not contain the specified section.  propellor+Specifies the whole content of a .ini file.,Revertijg this causes the file not to exist.  propellor(Ensures a shell conffile (like those in  /etc/default#) exists and has a key=value pair.Comments out any further settings of that key further down the file, to avoid those taking precedence.  propellor2Comments out a key=value pair in a shell conffile.Does not delete the file if empty, and does not uncomment any lines, so not a perfect reversion of  .  4None'9  propellor9Command that a dekstop file runs. May include parameters.  propellor+Name used in a desktop file; user visible.  propellorSpecifies an autostart file. By default it will be located in the system-wide autostart directory.  5'Sean Whitton None(R  propellorThe name of a file in  /etc/default, without the  /etc/default prefix. E.g. useradd.  propellor"Set a key=value pair in a file in  /etc/default.  None?*  propellor$Ensures two properties concurrently.  & foo `concurrently` barTo ensure three properties concurrently, just use this combinator twice: , & foo `concurrently` bar `concurrently` baz  propellorEnsures all the properties in the list, with a specified amount of concurrency. < concurrentList (pure 2) "demo" $ props & foo & bar & bazThe above example will run foo and bar concurrently, and once either of those 2 properties finishes, will start running baz.  propellor'Running Propellor actions concurrently.   6None3?9  propellorThe name of a package, a glob to match the names of packages, or a regexp surrounded by slashes to match the names of packages. See apt_preferences(5), "Regular expressions and glob(7) syntax"  propellor$Indicate host's preferred apt mirror  propellor>Only available for Stable suites, not for Testing or Unstable.  propellorMakes sources.list have a standard content using the Debian mirror CDN (or other host specified using the  8 property), with the Debian suite configured by the os.  propellor(Adds additional sources.list generators.Note that if a Property needs to enable an apt source, it's better to do so via a separate file in /etc/apt/sources.list.d/  propellorAdds an apt source for a suite, and pins that suite to a given pin value (see apt_preferences(5)). Revert to drop the source and unpin the suite.If the requested suite is the host's OS suite, the suite is pinned, but no source is added. That apt source should already be available, or you can use a property like .  propellorHave apt update its lists of packages, but without upgrading anything.  propellorHave apt upgrade packages, adding new packages and removing old as necessary. Often used in combination with the   property.  propellorHave apt upgrade packages, but never add new packages or remove old packages. Not suitable for upgrading acrocess major versions of the distribution.  propellorHave dpkg try to configure any packages that are not fully configured.  propellor/Minimal install of package, without recommends.  propellor1Install packages from the stable-backports suite.If installing the backport requires installing versions of a package's dependencies from stable-backports too, you will need to include those dependencies in the list of packages passed to this function.  propellorMinimal install from the stable-backports suite, without recommends.  propellorInstalls the build deps for the source package unpacked in the specifed directory, with a dummy package also installed so that autoRemove won't remove them.  propellorPins a list of packages, package wildcards and/or regular expressions to a list of suites and corresponding pin priorities (see apt_preferences(5)). Revert to unpin.Each package, package wildcard or regular expression will be pinned to all of the specified suites.Note that this will have no effect unless there is an apt source for each of the suites. One way to add an apt source is .For example, to obtain Emacs Lisp addon packages not present in your release of Debian from testing, falling back to sid if they're not available in testing, you could use & Apt.suiteAvailablePinned Testing (-10) & Apt.suiteAvailablePinned Unstable (-10) & ["elpa-*"] `Apt.pinnedTo` [(Testing, 100), (Unstable, 50)]  propellorPackage installation may fail becuse the archive has changed. Run an update in that case and retry.  propellor/Enables unattended upgrades. Revert to disable.  propellorEnable periodic updates (but not upgrades), including download of packages.  propellorPreseeds debconf values and reconfigures the package so it takes effect.  propellor0Ensures that a service is installed and running.Assumes that there is a 1:1 mapping between service names and apt package names.  propellorCleans apt's cache of downloaded packages to avoid using up disk space.  propellor+Add a foreign architecture to dpkg and apt.  propellorDisable the use of PDiffs for machines with high-bandwidth connections.  propellorSet apt's proxy  propellor;Cause apt to proxy downloads via an apt cacher on localhost 7None<  propellorMinimal install of XFCE, with a terminal emulator and panel, and X and network-manager, but not any of the extra apps.  propellorInstalls network-manager-gnome, which is the way to get network-manager to manage networking in XFCE too.  propellorNormally at first login, XFCE asks what kind of panel the user wants. This enables the default configuration noninteractively.  8'Flix Sipma None< 9'Flix Sipma NoneCk  propellorProvided a [UnboundSection], a [UnboundZone] and a [UnboundHost], cachingDnsServer ensure unbound is configured accordingly.Be carefull with CNAMEs, unbound is not a primary DNS server, so it will resolve these by itself. For a locally served zone, you probably want A/AAAA records instead.Example property:  cachingDnsServer [ ("remote-control", [("control-enable", "no")] , ("server", [ ("interface", "0.0.0.0") , ("access-control", "192.168.1.0/24 allow") , ("do-tcp", "no") ]) [ (AbsDomain "example.com", "transparent") , (AbsDomain $ reverseIP $ IPv4 "192.168.1", "static") ] [ (AbsDomain "example.com", Address $ IPv4 "192.168.1.2") , (AbsDomain "myhost.example.com", Address $ IPv4 "192.168.1.2") , (AbsDomain "myrouter.example.com", Address $ IPv4 "192.168.1.1") , (AbsDomain "www.example.com", Address $ IPv4 "192.168.1.2") , (AbsDomain "example.com", MX 10 "mail.example.com") , (AbsDomain "mylaptop.example.com", Address $ IPv4 "192.168.1.2") -- ^ connected via ethernet , (AbsDomain "mywifi.example.com", Address $ IPv4 "192.168.2.1") , (AbsDomain "mylaptop.example.com", Address $ IPv4 "192.168.2.2") -- ^ connected via wifi, use round robin , (AbsDomain "myhost.example.com", PTR $ reverseIP $ IPv4 "192.168.1.2") , (AbsDomain "myrouter.example.com", PTR $ reverseIP $ IPv4 "192.168.1.1") , (AbsDomain "mylaptop.example.com", PTR $ reverseIP $ IPv4 "192.168.1.2") ] :NoneH  propellor1Sets up a tor bridge. (Not a relay or exit node.) Uses port 443  propellorSets up a tor relay. Uses port 443  propellor6Makes the tor node be named, with a known private key.This can be moved to a different IP without needing to wait to accumulate trust.  propellorConfigures tor with secret_id_key, ed25519_master_id_public_key, and ed25519_master_id_secret_key from privdata.  propellorA tor server (bridge, relay, or exit) Don't use if you just want to run tor for personal use.  propellorSpecifies configuration settings. Any lines in the config file that set other values for the specified settings will be removed, while other settings are left as-is. Tor is restarted when configuration is changed.  propellorLimit incoming and outgoing traffic to the specified amount each.For example, PerSecond "30 kibibytes" is the minimum limit for a useful relay.  propellor*Enables a hidden service for a given port.If used without  ', tor will generate a new private key.  propellorSame as   but also causes propellor to display the onion address of the hidden service.  propellor