propellor 2.8.0 → 2.8.1
raw patch · 22 files changed
+256/−26 lines, 22 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Propellor.PrivData: instance Eq PrivInfo
- Propellor.PrivData: instance IsInfo PrivInfo
- Propellor.PrivData: instance Monoid PrivInfo
- Propellor.PrivData: instance Ord PrivInfo
- Propellor.PrivData: instance Show PrivInfo
- Propellor.PrivData: instance Typeable PrivInfo
- Propellor.PropAccum: instance PropAccum Host
- Propellor.PropAccum: instance PropAccum PropList
- Propellor.Property.Apt: keyname :: AptKey -> String
- Propellor.Property.Apt: pubkey :: AptKey -> String
- Propellor.Property.Chroot: instance PropAccum Chroot
- Propellor.Property.Chroot: instance Show BuilderConf
- Propellor.Property.Chroot: instance Show Chroot
- Propellor.Property.DebianMirror: instance Eq DebianPriority
- Propellor.Property.DebianMirror: instance Show DebianPriority
- Propellor.Property.Debootstrap: instance Monoid DebootstrapConfig
- Propellor.Property.Debootstrap: instance Show DebootstrapConfig
- Propellor.Property.Docker: instance Eq ContainerFilter
- Propellor.Property.Docker: instance Eq ContainerId
- Propellor.Property.Docker: instance Eq ContainerIdent
- Propellor.Property.Docker: instance Eq Image
- Propellor.Property.Docker: instance HasImage Container
- Propellor.Property.Docker: instance HasImage Image
- Propellor.Property.Docker: instance ImageIdentifier Image
- Propellor.Property.Docker: instance ImageIdentifier ImageID
- Propellor.Property.Docker: instance ImageIdentifier ImageUID
- Propellor.Property.Docker: instance Mountable (Bound FilePath)
- Propellor.Property.Docker: instance Mountable String
- Propellor.Property.Docker: instance PropAccum Container
- Propellor.Property.Docker: instance Publishable (Bound Port)
- Propellor.Property.Docker: instance Publishable String
- Propellor.Property.Docker: instance Read ContainerId
- Propellor.Property.Docker: instance Read ContainerIdent
- Propellor.Property.Docker: instance Read Image
- Propellor.Property.Docker: instance Show ContainerId
- Propellor.Property.Docker: instance Show ContainerIdent
- Propellor.Property.Docker: instance Show Image
- Propellor.Property.Docker: repository :: Image -> String
- Propellor.Property.Docker: tag :: Image -> Maybe String
- Propellor.Property.Firewall: instance Eq Chain
- Propellor.Property.Firewall: instance Eq ConnectionState
- Propellor.Property.Firewall: instance Eq Proto
- Propellor.Property.Firewall: instance Eq Rule
- Propellor.Property.Firewall: instance Eq Rules
- Propellor.Property.Firewall: instance Eq Target
- Propellor.Property.Firewall: instance Monoid Rules
- Propellor.Property.Firewall: instance Show Chain
- Propellor.Property.Firewall: instance Show ConnectionState
- Propellor.Property.Firewall: instance Show Proto
- Propellor.Property.Firewall: instance Show Rule
- Propellor.Property.Firewall: instance Show Rules
- Propellor.Property.Firewall: instance Show Target
- Propellor.Property.Gpg: getGpgKeyId :: GpgKeyId -> String
- Propellor.Property.List: instance PropertyList PropList
- Propellor.Property.List: instance PropertyList [Property HasInfo]
- Propellor.Property.List: instance PropertyList [Property NoInfo]
- Propellor.Property.Obnam: instance Eq NumClients
- Propellor.Property.Parted: instance Monoid PartSize
- Propellor.Property.Parted: instance Monoid PartTable
- Propellor.Property.Parted: instance PartedVal Bool
- Propellor.Property.Parted: instance PartedVal Fs
- Propellor.Property.Parted: instance PartedVal PartFlag
- Propellor.Property.Parted: instance PartedVal PartSize
- Propellor.Property.Parted: instance PartedVal PartType
- Propellor.Property.Parted: instance PartedVal TableType
- Propellor.Property.Parted: instance Show PartFlag
- Propellor.Property.Parted: instance Show PartSize
- Propellor.Property.Parted: instance Show PartTable
- Propellor.Property.Parted: instance Show PartType
- Propellor.Property.Parted: instance Show Partition
- Propellor.Property.Parted: instance Show TableType
- Propellor.Property.Parted: partFlags :: Partition -> [(PartFlag, Bool)]
- Propellor.Property.Parted: partFs :: Partition -> Fs
- Propellor.Property.Parted: partMkFsOpts :: Partition -> MkfsOpts
- Propellor.Property.Parted: partName :: Partition -> Maybe String
- Propellor.Property.Parted: partSize :: Partition -> PartSize
- Propellor.Property.Parted: partType :: Partition -> PartType
- Propellor.Property.Partition: instance Show Fs
- Propellor.Property.Rsync: instance RsyncParam Filter
- Propellor.Property.Ssh: instance Eq SshPubKeyInfo
- Propellor.Property.Ssh: instance IsInfo SshPubKeyInfo
- Propellor.Property.Ssh: instance Monoid SshPubKeyInfo
- Propellor.Property.Ssh: instance Ord SshPubKeyInfo
- Propellor.Property.Ssh: instance Typeable SshPubKeyInfo
- Propellor.Property.Systemd: instance Bindable (Bound FilePath)
- Propellor.Property.Systemd: instance Bindable FilePath
- Propellor.Property.Systemd: instance PropAccum Container
- Propellor.Property.Systemd: instance Publishable (Bound Port)
- Propellor.Property.Systemd: instance Publishable (Proto, Bound Port)
- Propellor.Property.Systemd: instance Publishable Port
- Propellor.Property.Systemd: instance Show Container
- Propellor.Property.User: instance Eq PasswordStatus
- Propellor.Types: hostInfo :: Host -> Info
- Propellor.Types: hostName :: Host -> HostName
- Propellor.Types: hostProperties :: Host -> [Property HasInfo]
- Propellor.Types: instance Applicative Propellor
- Propellor.Types: instance Combines (Property HasInfo) (Property HasInfo)
- Propellor.Types: instance Combines (Property HasInfo) (Property NoInfo)
- Propellor.Types: instance Combines (Property NoInfo) (Property HasInfo)
- Propellor.Types: instance Combines (Property NoInfo) (Property NoInfo)
- Propellor.Types: instance Combines RevertableProperty (Property HasInfo)
- Propellor.Types: instance Combines RevertableProperty (Property NoInfo)
- Propellor.Types: instance Combines RevertableProperty RevertableProperty
- Propellor.Types: instance Functor Propellor
- Propellor.Types: instance IsProp (Property HasInfo)
- Propellor.Types: instance IsProp (Property NoInfo)
- Propellor.Types: instance IsProp RevertableProperty
- Propellor.Types: instance Monad Propellor
- Propellor.Types: instance MonadCatch Propellor
- Propellor.Types: instance MonadIO Propellor
- Propellor.Types: instance MonadMask Propellor
- Propellor.Types: instance MonadReader Host Propellor
- Propellor.Types: instance MonadThrow Propellor
- Propellor.Types: instance MonadWriter [EndAction] Propellor
- Propellor.Types: instance Monoid (Propellor Result)
- Propellor.Types: instance Show (Property i)
- Propellor.Types: instance Show Host
- Propellor.Types: instance Typeable Host
- Propellor.Types: runWithHost :: Propellor p -> RWST Host [EndAction] () IO p
- Propellor.Types.Chroot: _chrootCfg :: ChrootInfo -> ChrootCfg
- Propellor.Types.Chroot: _chroots :: ChrootInfo -> Map FilePath Host
- Propellor.Types.Chroot: instance Empty ChrootCfg
- Propellor.Types.Chroot: instance Empty ChrootInfo
- Propellor.Types.Chroot: instance Eq ChrootCfg
- Propellor.Types.Chroot: instance IsInfo ChrootInfo
- Propellor.Types.Chroot: instance Monoid ChrootCfg
- Propellor.Types.Chroot: instance Monoid ChrootInfo
- Propellor.Types.Chroot: instance Show ChrootCfg
- Propellor.Types.Chroot: instance Show ChrootInfo
- Propellor.Types.Chroot: instance Typeable ChrootInfo
- Propellor.Types.CmdLine: instance Eq CmdLine
- Propellor.Types.CmdLine: instance Read CmdLine
- Propellor.Types.CmdLine: instance Show CmdLine
- Propellor.Types.Container: containerSide :: Bound v -> v
- Propellor.Types.Container: hostSide :: Bound v -> v
- Propellor.Types.Dns: confAllowTransfer :: NamedConf -> [IPAddr]
- Propellor.Types.Dns: confDnsServerType :: NamedConf -> DnsServerType
- Propellor.Types.Dns: confDomain :: NamedConf -> Domain
- Propellor.Types.Dns: confFile :: NamedConf -> FilePath
- Propellor.Types.Dns: confLines :: NamedConf -> [String]
- Propellor.Types.Dns: confMasters :: NamedConf -> [IPAddr]
- Propellor.Types.Dns: fromDnsInfo :: DnsInfo -> Set Record
- Propellor.Types.Dns: instance Empty NamedConfMap
- Propellor.Types.Dns: instance Eq AliasesInfo
- Propellor.Types.Dns: instance Eq BindDomain
- Propellor.Types.Dns: instance Eq DnsInfo
- Propellor.Types.Dns: instance Eq DnsServerType
- Propellor.Types.Dns: instance Eq IPAddr
- Propellor.Types.Dns: instance Eq NamedConf
- Propellor.Types.Dns: instance Eq NamedConfMap
- Propellor.Types.Dns: instance Eq Record
- Propellor.Types.Dns: instance Eq SOA
- Propellor.Types.Dns: instance Eq Zone
- Propellor.Types.Dns: instance IsInfo AliasesInfo
- Propellor.Types.Dns: instance IsInfo DnsInfo
- Propellor.Types.Dns: instance IsInfo NamedConfMap
- Propellor.Types.Dns: instance Monoid AliasesInfo
- Propellor.Types.Dns: instance Monoid DnsInfo
- Propellor.Types.Dns: instance Monoid NamedConfMap
- Propellor.Types.Dns: instance Ord AliasesInfo
- Propellor.Types.Dns: instance Ord BindDomain
- Propellor.Types.Dns: instance Ord DnsInfo
- Propellor.Types.Dns: instance Ord DnsServerType
- Propellor.Types.Dns: instance Ord IPAddr
- Propellor.Types.Dns: instance Ord NamedConf
- Propellor.Types.Dns: instance Ord NamedConfMap
- Propellor.Types.Dns: instance Ord Record
- Propellor.Types.Dns: instance Read BindDomain
- Propellor.Types.Dns: instance Read IPAddr
- Propellor.Types.Dns: instance Read Record
- Propellor.Types.Dns: instance Read SOA
- Propellor.Types.Dns: instance Read Zone
- Propellor.Types.Dns: instance Show AliasesInfo
- Propellor.Types.Dns: instance Show BindDomain
- Propellor.Types.Dns: instance Show DnsInfo
- Propellor.Types.Dns: instance Show DnsServerType
- Propellor.Types.Dns: instance Show IPAddr
- Propellor.Types.Dns: instance Show NamedConf
- Propellor.Types.Dns: instance Show NamedConfMap
- Propellor.Types.Dns: instance Show Record
- Propellor.Types.Dns: instance Show SOA
- Propellor.Types.Dns: instance Show Zone
- Propellor.Types.Dns: instance Typeable AliasesInfo
- Propellor.Types.Dns: instance Typeable DnsInfo
- Propellor.Types.Dns: instance Typeable NamedConfMap
- Propellor.Types.Dns: instance Typeable Record
- Propellor.Types.Dns: sDomain :: SOA -> BindDomain
- Propellor.Types.Dns: sExpire :: SOA -> Integer
- Propellor.Types.Dns: sNegativeCacheTTL :: SOA -> Integer
- Propellor.Types.Dns: sRefresh :: SOA -> Integer
- Propellor.Types.Dns: sRetry :: SOA -> Integer
- Propellor.Types.Dns: sSerial :: SOA -> SerialNumber
- Propellor.Types.Dns: zDomain :: Zone -> Domain
- Propellor.Types.Dns: zHosts :: Zone -> [(BindDomain, Record)]
- Propellor.Types.Dns: zSOA :: Zone -> SOA
- Propellor.Types.Docker: _dockerContainers :: DockerInfo -> Map String Host
- Propellor.Types.Docker: _dockerRunParams :: DockerInfo -> [DockerRunParam]
- Propellor.Types.Docker: instance Empty DockerInfo
- Propellor.Types.Docker: instance IsInfo DockerInfo
- Propellor.Types.Docker: instance Monoid DockerInfo
- Propellor.Types.Docker: instance Show DockerInfo
- Propellor.Types.Docker: instance Show DockerRunParam
- Propellor.Types.Docker: instance Typeable DockerInfo
- Propellor.Types.Empty: instance Empty (Map k v)
- Propellor.Types.Empty: instance Empty (Set v)
- Propellor.Types.Empty: instance Empty [a]
- Propellor.Types.Info: instance Monoid (InfoVal v)
- Propellor.Types.Info: instance Monoid Info
- Propellor.Types.Info: instance Show Info
- Propellor.Types.Info: instance Typeable InfoVal
- Propellor.Types.Info: instance Typeable v => IsInfo (InfoVal v)
- Propellor.Types.OS: instance Eq DebianSuite
- Propellor.Types.OS: instance Eq Distribution
- Propellor.Types.OS: instance Eq Port
- Propellor.Types.OS: instance Eq System
- Propellor.Types.OS: instance Show DebianSuite
- Propellor.Types.OS: instance Show Distribution
- Propellor.Types.OS: instance Show Port
- Propellor.Types.OS: instance Show System
- Propellor.Types.OS: instance Typeable System
- Propellor.Types.PrivData: instance Bounded DnsSecKey
- Propellor.Types.PrivData: instance Bounded SshKeyType
- Propellor.Types.PrivData: instance Enum DnsSecKey
- Propellor.Types.PrivData: instance Enum SshKeyType
- Propellor.Types.PrivData: instance Eq Context
- Propellor.Types.PrivData: instance Eq DnsSecKey
- Propellor.Types.PrivData: instance Eq HostContext
- Propellor.Types.PrivData: instance Eq PrivDataField
- Propellor.Types.PrivData: instance Eq SshKeyType
- Propellor.Types.PrivData: instance IsContext Context
- Propellor.Types.PrivData: instance IsContext HostContext
- Propellor.Types.PrivData: instance IsPrivDataSource PrivDataField
- Propellor.Types.PrivData: instance IsPrivDataSource PrivDataSource
- Propellor.Types.PrivData: instance Ord Context
- Propellor.Types.PrivData: instance Ord DnsSecKey
- Propellor.Types.PrivData: instance Ord HostContext
- Propellor.Types.PrivData: instance Ord PrivDataField
- Propellor.Types.PrivData: instance Ord SshKeyType
- Propellor.Types.PrivData: instance Read Context
- Propellor.Types.PrivData: instance Read DnsSecKey
- Propellor.Types.PrivData: instance Read PrivDataField
- Propellor.Types.PrivData: instance Read SshKeyType
- Propellor.Types.PrivData: instance Show Context
- Propellor.Types.PrivData: instance Show DnsSecKey
- Propellor.Types.PrivData: instance Show HostContext
- Propellor.Types.PrivData: instance Show PrivDataField
- Propellor.Types.PrivData: instance Show SshKeyType
- Propellor.Types.PrivData: mkHostContext :: HostContext -> HostName -> Context
- Propellor.Types.Result: instance ActionResult Bool
- Propellor.Types.Result: instance ActionResult Result
- Propellor.Types.Result: instance Eq Result
- Propellor.Types.Result: instance Monoid Result
- Propellor.Types.Result: instance Read Result
- Propellor.Types.Result: instance Show Result
- Propellor.Types.Result: instance ToResult Bool
+ Propellor.PrivData: forceHostContext :: String -> PrivInfo -> PrivInfo
+ Propellor.PrivData: instance GHC.Base.Monoid Propellor.PrivData.PrivInfo
+ Propellor.PrivData: instance GHC.Classes.Eq Propellor.PrivData.PrivInfo
+ Propellor.PrivData: instance GHC.Classes.Ord Propellor.PrivData.PrivInfo
+ Propellor.PrivData: instance GHC.Show.Show Propellor.PrivData.PrivInfo
+ Propellor.PrivData: instance Propellor.Types.Info.IsInfo Propellor.PrivData.PrivInfo
+ Propellor.PropAccum: instance Propellor.PropAccum.PropAccum Propellor.PropAccum.PropList
+ Propellor.PropAccum: instance Propellor.PropAccum.PropAccum Propellor.Types.Host
+ Propellor.Property.Apt: [keyname] :: AptKey -> String
+ Propellor.Property.Apt: [pubkey] :: AptKey -> String
+ Propellor.Property.Chroot: instance GHC.Show.Show Propellor.Property.Chroot.BuilderConf
+ Propellor.Property.Chroot: instance GHC.Show.Show Propellor.Property.Chroot.Chroot
+ Propellor.Property.Chroot: instance Propellor.PropAccum.PropAccum Propellor.Property.Chroot.Chroot
+ Propellor.Property.DebianMirror: instance GHC.Classes.Eq Propellor.Property.DebianMirror.DebianPriority
+ Propellor.Property.DebianMirror: instance GHC.Show.Show Propellor.Property.DebianMirror.DebianPriority
+ Propellor.Property.Debootstrap: instance GHC.Base.Monoid Propellor.Property.Debootstrap.DebootstrapConfig
+ Propellor.Property.Debootstrap: instance GHC.Show.Show Propellor.Property.Debootstrap.DebootstrapConfig
+ Propellor.Property.Docker: Container :: Image -> Host -> Container
+ Propellor.Property.Docker: [repository] :: Image -> String
+ Propellor.Property.Docker: [tag] :: Image -> Maybe String
+ Propellor.Property.Docker: instance GHC.Classes.Eq Propellor.Property.Docker.ContainerFilter
+ Propellor.Property.Docker: instance GHC.Classes.Eq Propellor.Property.Docker.ContainerId
+ Propellor.Property.Docker: instance GHC.Classes.Eq Propellor.Property.Docker.ContainerIdent
+ Propellor.Property.Docker: instance GHC.Classes.Eq Propellor.Property.Docker.Image
+ Propellor.Property.Docker: instance GHC.Read.Read Propellor.Property.Docker.ContainerId
+ Propellor.Property.Docker: instance GHC.Read.Read Propellor.Property.Docker.ContainerIdent
+ Propellor.Property.Docker: instance GHC.Read.Read Propellor.Property.Docker.Image
+ Propellor.Property.Docker: instance GHC.Show.Show Propellor.Property.Docker.ContainerId
+ Propellor.Property.Docker: instance GHC.Show.Show Propellor.Property.Docker.ContainerIdent
+ Propellor.Property.Docker: instance GHC.Show.Show Propellor.Property.Docker.Image
+ Propellor.Property.Docker: instance Propellor.PropAccum.PropAccum Propellor.Property.Docker.Container
+ Propellor.Property.Docker: instance Propellor.Property.Docker.HasImage Propellor.Property.Docker.Container
+ Propellor.Property.Docker: instance Propellor.Property.Docker.HasImage Propellor.Property.Docker.Image
+ Propellor.Property.Docker: instance Propellor.Property.Docker.ImageIdentifier Propellor.Property.Docker.Image
+ Propellor.Property.Docker: instance Propellor.Property.Docker.ImageIdentifier Propellor.Property.Docker.ImageID
+ Propellor.Property.Docker: instance Propellor.Property.Docker.ImageIdentifier Propellor.Property.Docker.ImageUID
+ Propellor.Property.Docker: instance Propellor.Property.Docker.Mountable (Propellor.Types.Container.Bound GHC.IO.FilePath)
+ Propellor.Property.Docker: instance Propellor.Property.Docker.Mountable GHC.Base.String
+ Propellor.Property.Docker: instance Propellor.Property.Docker.Publishable (Propellor.Types.Container.Bound Propellor.Types.OS.Port)
+ Propellor.Property.Docker: instance Propellor.Property.Docker.Publishable GHC.Base.String
+ Propellor.Property.Firewall: instance GHC.Base.Monoid Propellor.Property.Firewall.Rules
+ Propellor.Property.Firewall: instance GHC.Classes.Eq Propellor.Property.Firewall.Chain
+ Propellor.Property.Firewall: instance GHC.Classes.Eq Propellor.Property.Firewall.ConnectionState
+ Propellor.Property.Firewall: instance GHC.Classes.Eq Propellor.Property.Firewall.Proto
+ Propellor.Property.Firewall: instance GHC.Classes.Eq Propellor.Property.Firewall.Rule
+ Propellor.Property.Firewall: instance GHC.Classes.Eq Propellor.Property.Firewall.Rules
+ Propellor.Property.Firewall: instance GHC.Classes.Eq Propellor.Property.Firewall.Target
+ Propellor.Property.Firewall: instance GHC.Show.Show Propellor.Property.Firewall.Chain
+ Propellor.Property.Firewall: instance GHC.Show.Show Propellor.Property.Firewall.ConnectionState
+ Propellor.Property.Firewall: instance GHC.Show.Show Propellor.Property.Firewall.Proto
+ Propellor.Property.Firewall: instance GHC.Show.Show Propellor.Property.Firewall.Rule
+ Propellor.Property.Firewall: instance GHC.Show.Show Propellor.Property.Firewall.Rules
+ Propellor.Property.Firewall: instance GHC.Show.Show Propellor.Property.Firewall.Target
+ Propellor.Property.Gpg: [getGpgKeyId] :: GpgKeyId -> String
+ Propellor.Property.Kerberos: adminServerInstalled :: Property NoInfo
+ Propellor.Property.Kerberos: checkKeyTabEntry :: Maybe FilePath -> Principal -> IO Bool
+ Propellor.Property.Kerberos: checkKeyTabEntry' :: Maybe FilePath -> (Kvno, Principal) -> IO Bool
+ Propellor.Property.Kerberos: defaultKeyTab :: FilePath
+ Propellor.Property.Kerberos: installed :: Property NoInfo
+ Propellor.Property.Kerberos: k5login :: User -> [Principal] -> Property NoInfo
+ Propellor.Property.Kerberos: k5loginPath :: User -> IO FilePath
+ Propellor.Property.Kerberos: k5srvutil :: (Maybe FilePath) -> [String] -> IO String
+ Propellor.Property.Kerberos: kadmAclPath :: FilePath
+ Propellor.Property.Kerberos: kdcConfPath :: FilePath
+ Propellor.Property.Kerberos: kdcInstalled :: Property NoInfo
+ Propellor.Property.Kerberos: keyTabPath :: Maybe FilePath -> FilePath
+ Propellor.Property.Kerberos: keytabEntries :: Maybe FilePath -> IO [(Kvno, Principal)]
+ Propellor.Property.Kerberos: kpropAcls :: [String] -> Property NoInfo
+ Propellor.Property.Kerberos: kpropServerInstalled :: Property HasInfo
+ Propellor.Property.Kerberos: kpropdAclPath :: FilePath
+ Propellor.Property.Kerberos: principal :: String -> Maybe String -> Maybe Realm -> Principal
+ Propellor.Property.Kerberos: type Kvno = Integer
+ Propellor.Property.Kerberos: type Principal = String
+ Propellor.Property.Kerberos: type Realm = String
+ Propellor.Property.List: instance Propellor.Property.List.PropertyList Propellor.PropAccum.PropList
+ Propellor.Property.List: instance Propellor.Property.List.PropertyList [Propellor.Types.Property Propellor.Types.HasInfo]
+ Propellor.Property.List: instance Propellor.Property.List.PropertyList [Propellor.Types.Property Propellor.Types.NoInfo]
+ Propellor.Property.Logcheck: Paranoid :: ReportLevel
+ Propellor.Property.Logcheck: Server :: ReportLevel
+ Propellor.Property.Logcheck: Workstation :: ReportLevel
+ Propellor.Property.Logcheck: data ReportLevel
+ Propellor.Property.Logcheck: defaultPrefix :: String
+ Propellor.Property.Logcheck: ignoreFilePath :: ReportLevel -> Service -> FilePath
+ Propellor.Property.Logcheck: ignoreLines :: ReportLevel -> Service -> [String] -> Property NoInfo
+ Propellor.Property.Logcheck: installed :: Property NoInfo
+ Propellor.Property.Logcheck: instance GHC.Show.Show Propellor.Property.Logcheck.ReportLevel
+ Propellor.Property.Logcheck: type Service = String
+ Propellor.Property.Obnam: instance GHC.Classes.Eq Propellor.Property.Obnam.NumClients
+ Propellor.Property.Parted: [partFlags] :: Partition -> [(PartFlag, Bool)]
+ Propellor.Property.Parted: [partFs] :: Partition -> Fs
+ Propellor.Property.Parted: [partMkFsOpts] :: Partition -> MkfsOpts
+ Propellor.Property.Parted: [partName] :: Partition -> Maybe String
+ Propellor.Property.Parted: [partSize] :: Partition -> PartSize
+ Propellor.Property.Parted: [partType] :: Partition -> PartType
+ Propellor.Property.Parted: instance GHC.Base.Monoid Propellor.Property.Parted.PartSize
+ Propellor.Property.Parted: instance GHC.Base.Monoid Propellor.Property.Parted.PartTable
+ Propellor.Property.Parted: instance GHC.Show.Show Propellor.Property.Parted.PartFlag
+ Propellor.Property.Parted: instance GHC.Show.Show Propellor.Property.Parted.PartSize
+ Propellor.Property.Parted: instance GHC.Show.Show Propellor.Property.Parted.PartTable
+ Propellor.Property.Parted: instance GHC.Show.Show Propellor.Property.Parted.PartType
+ Propellor.Property.Parted: instance GHC.Show.Show Propellor.Property.Parted.Partition
+ Propellor.Property.Parted: instance GHC.Show.Show Propellor.Property.Parted.TableType
+ Propellor.Property.Parted: instance Propellor.Property.Parted.PartedVal GHC.Types.Bool
+ Propellor.Property.Parted: instance Propellor.Property.Parted.PartedVal Propellor.Property.Parted.PartFlag
+ Propellor.Property.Parted: instance Propellor.Property.Parted.PartedVal Propellor.Property.Parted.PartSize
+ Propellor.Property.Parted: instance Propellor.Property.Parted.PartedVal Propellor.Property.Parted.PartType
+ Propellor.Property.Parted: instance Propellor.Property.Parted.PartedVal Propellor.Property.Parted.TableType
+ Propellor.Property.Parted: instance Propellor.Property.Parted.PartedVal Propellor.Property.Partition.Fs
+ Propellor.Property.Partition: instance GHC.Show.Show Propellor.Property.Partition.Fs
+ Propellor.Property.Rsync: instance Propellor.Property.Rsync.RsyncParam Propellor.Property.Rsync.Filter
+ Propellor.Property.Ssh: instance GHC.Base.Monoid Propellor.Property.Ssh.SshPubKeyInfo
+ Propellor.Property.Ssh: instance GHC.Classes.Eq Propellor.Property.Ssh.SshPubKeyInfo
+ Propellor.Property.Ssh: instance GHC.Classes.Ord Propellor.Property.Ssh.SshPubKeyInfo
+ Propellor.Property.Ssh: instance Propellor.Types.Info.IsInfo Propellor.Property.Ssh.SshPubKeyInfo
+ Propellor.Property.Systemd: instance GHC.Show.Show Propellor.Property.Systemd.Container
+ Propellor.Property.Systemd: instance Propellor.PropAccum.PropAccum Propellor.Property.Systemd.Container
+ Propellor.Property.Systemd: instance Propellor.Property.Systemd.Bindable (Propellor.Types.Container.Bound GHC.IO.FilePath)
+ Propellor.Property.Systemd: instance Propellor.Property.Systemd.Bindable GHC.IO.FilePath
+ Propellor.Property.Systemd: instance Propellor.Property.Systemd.Publishable (Propellor.Property.Systemd.Proto, Propellor.Types.Container.Bound Propellor.Types.OS.Port)
+ Propellor.Property.Systemd: instance Propellor.Property.Systemd.Publishable (Propellor.Types.Container.Bound Propellor.Types.OS.Port)
+ Propellor.Property.Systemd: instance Propellor.Property.Systemd.Publishable Propellor.Types.OS.Port
+ Propellor.Property.Unbound: type ConfSection = String
+ Propellor.Property.Unbound: type UnboundHost = (BindDomain, Record)
+ Propellor.Property.Unbound: type UnboundKey = String
+ Propellor.Property.Unbound: type UnboundSection = (ConfSection, [UnboundSetting])
+ Propellor.Property.Unbound: type UnboundSetting = (UnboundKey, UnboundValue)
+ Propellor.Property.Unbound: type UnboundValue = String
+ Propellor.Property.Unbound: type UnboundZone = (BindDomain, ZoneType)
+ Propellor.Property.Unbound: type ZoneType = String
+ Propellor.Property.User: instance GHC.Classes.Eq Propellor.Property.User.PasswordStatus
+ Propellor.Types: [hostInfo] :: Host -> Info
+ Propellor.Types: [hostName] :: Host -> HostName
+ Propellor.Types: [hostProperties] :: Host -> [Property HasInfo]
+ Propellor.Types: [runWithHost] :: Propellor p -> RWST Host [EndAction] () IO p
+ Propellor.Types: instance Control.Monad.Catch.MonadCatch Propellor.Types.Propellor
+ Propellor.Types: instance Control.Monad.Catch.MonadMask Propellor.Types.Propellor
+ Propellor.Types: instance Control.Monad.Catch.MonadThrow Propellor.Types.Propellor
+ Propellor.Types: instance Control.Monad.IO.Class.MonadIO Propellor.Types.Propellor
+ Propellor.Types: instance Control.Monad.Reader.Class.MonadReader Propellor.Types.Host Propellor.Types.Propellor
+ Propellor.Types: instance Control.Monad.Writer.Class.MonadWriter [Propellor.Types.EndAction] Propellor.Types.Propellor
+ Propellor.Types: instance GHC.Base.Applicative Propellor.Types.Propellor
+ Propellor.Types: instance GHC.Base.Functor Propellor.Types.Propellor
+ Propellor.Types: instance GHC.Base.Monad Propellor.Types.Propellor
+ Propellor.Types: instance GHC.Base.Monoid (Propellor.Types.Propellor Propellor.Types.Result.Result)
+ Propellor.Types: instance GHC.Show.Show (Propellor.Types.Property i)
+ Propellor.Types: instance GHC.Show.Show Propellor.Types.Host
+ Propellor.Types: instance Propellor.Types.Combines (Propellor.Types.Property Propellor.Types.HasInfo) (Propellor.Types.Property Propellor.Types.HasInfo)
+ Propellor.Types: instance Propellor.Types.Combines (Propellor.Types.Property Propellor.Types.HasInfo) (Propellor.Types.Property Propellor.Types.NoInfo)
+ Propellor.Types: instance Propellor.Types.Combines (Propellor.Types.Property Propellor.Types.NoInfo) (Propellor.Types.Property Propellor.Types.HasInfo)
+ Propellor.Types: instance Propellor.Types.Combines (Propellor.Types.Property Propellor.Types.NoInfo) (Propellor.Types.Property Propellor.Types.NoInfo)
+ Propellor.Types: instance Propellor.Types.Combines Propellor.Types.RevertableProperty (Propellor.Types.Property Propellor.Types.HasInfo)
+ Propellor.Types: instance Propellor.Types.Combines Propellor.Types.RevertableProperty (Propellor.Types.Property Propellor.Types.NoInfo)
+ Propellor.Types: instance Propellor.Types.Combines Propellor.Types.RevertableProperty Propellor.Types.RevertableProperty
+ Propellor.Types: instance Propellor.Types.IsProp (Propellor.Types.Property Propellor.Types.HasInfo)
+ Propellor.Types: instance Propellor.Types.IsProp (Propellor.Types.Property Propellor.Types.NoInfo)
+ Propellor.Types: instance Propellor.Types.IsProp Propellor.Types.RevertableProperty
+ Propellor.Types.Chroot: [_chrootCfg] :: ChrootInfo -> ChrootCfg
+ Propellor.Types.Chroot: [_chroots] :: ChrootInfo -> Map FilePath Host
+ Propellor.Types.Chroot: instance GHC.Base.Monoid Propellor.Types.Chroot.ChrootCfg
+ Propellor.Types.Chroot: instance GHC.Base.Monoid Propellor.Types.Chroot.ChrootInfo
+ Propellor.Types.Chroot: instance GHC.Classes.Eq Propellor.Types.Chroot.ChrootCfg
+ Propellor.Types.Chroot: instance GHC.Show.Show Propellor.Types.Chroot.ChrootCfg
+ Propellor.Types.Chroot: instance GHC.Show.Show Propellor.Types.Chroot.ChrootInfo
+ Propellor.Types.Chroot: instance Propellor.Types.Empty.Empty Propellor.Types.Chroot.ChrootCfg
+ Propellor.Types.Chroot: instance Propellor.Types.Empty.Empty Propellor.Types.Chroot.ChrootInfo
+ Propellor.Types.Chroot: instance Propellor.Types.Info.IsInfo Propellor.Types.Chroot.ChrootInfo
+ Propellor.Types.CmdLine: instance GHC.Classes.Eq Propellor.Types.CmdLine.CmdLine
+ Propellor.Types.CmdLine: instance GHC.Read.Read Propellor.Types.CmdLine.CmdLine
+ Propellor.Types.CmdLine: instance GHC.Show.Show Propellor.Types.CmdLine.CmdLine
+ Propellor.Types.Container: [containerSide] :: Bound v -> v
+ Propellor.Types.Container: [hostSide] :: Bound v -> v
+ Propellor.Types.Dns: [confAllowTransfer] :: NamedConf -> [IPAddr]
+ Propellor.Types.Dns: [confDnsServerType] :: NamedConf -> DnsServerType
+ Propellor.Types.Dns: [confDomain] :: NamedConf -> Domain
+ Propellor.Types.Dns: [confFile] :: NamedConf -> FilePath
+ Propellor.Types.Dns: [confLines] :: NamedConf -> [String]
+ Propellor.Types.Dns: [confMasters] :: NamedConf -> [IPAddr]
+ Propellor.Types.Dns: [fromDnsInfo] :: DnsInfo -> Set Record
+ Propellor.Types.Dns: [sDomain] :: SOA -> BindDomain
+ Propellor.Types.Dns: [sExpire] :: SOA -> Integer
+ Propellor.Types.Dns: [sNegativeCacheTTL] :: SOA -> Integer
+ Propellor.Types.Dns: [sRefresh] :: SOA -> Integer
+ Propellor.Types.Dns: [sRetry] :: SOA -> Integer
+ Propellor.Types.Dns: [sSerial] :: SOA -> SerialNumber
+ Propellor.Types.Dns: [zDomain] :: Zone -> Domain
+ Propellor.Types.Dns: [zHosts] :: Zone -> [(BindDomain, Record)]
+ Propellor.Types.Dns: [zSOA] :: Zone -> SOA
+ Propellor.Types.Dns: instance GHC.Base.Monoid Propellor.Types.Dns.AliasesInfo
+ Propellor.Types.Dns: instance GHC.Base.Monoid Propellor.Types.Dns.DnsInfo
+ Propellor.Types.Dns: instance GHC.Base.Monoid Propellor.Types.Dns.NamedConfMap
+ Propellor.Types.Dns: instance GHC.Classes.Eq Propellor.Types.Dns.AliasesInfo
+ Propellor.Types.Dns: instance GHC.Classes.Eq Propellor.Types.Dns.BindDomain
+ Propellor.Types.Dns: instance GHC.Classes.Eq Propellor.Types.Dns.DnsInfo
+ Propellor.Types.Dns: instance GHC.Classes.Eq Propellor.Types.Dns.DnsServerType
+ Propellor.Types.Dns: instance GHC.Classes.Eq Propellor.Types.Dns.IPAddr
+ Propellor.Types.Dns: instance GHC.Classes.Eq Propellor.Types.Dns.NamedConf
+ Propellor.Types.Dns: instance GHC.Classes.Eq Propellor.Types.Dns.NamedConfMap
+ Propellor.Types.Dns: instance GHC.Classes.Eq Propellor.Types.Dns.Record
+ Propellor.Types.Dns: instance GHC.Classes.Eq Propellor.Types.Dns.SOA
+ Propellor.Types.Dns: instance GHC.Classes.Eq Propellor.Types.Dns.Zone
+ Propellor.Types.Dns: instance GHC.Classes.Ord Propellor.Types.Dns.AliasesInfo
+ Propellor.Types.Dns: instance GHC.Classes.Ord Propellor.Types.Dns.BindDomain
+ Propellor.Types.Dns: instance GHC.Classes.Ord Propellor.Types.Dns.DnsInfo
+ Propellor.Types.Dns: instance GHC.Classes.Ord Propellor.Types.Dns.DnsServerType
+ Propellor.Types.Dns: instance GHC.Classes.Ord Propellor.Types.Dns.IPAddr
+ Propellor.Types.Dns: instance GHC.Classes.Ord Propellor.Types.Dns.NamedConf
+ Propellor.Types.Dns: instance GHC.Classes.Ord Propellor.Types.Dns.NamedConfMap
+ Propellor.Types.Dns: instance GHC.Classes.Ord Propellor.Types.Dns.Record
+ Propellor.Types.Dns: instance GHC.Read.Read Propellor.Types.Dns.BindDomain
+ Propellor.Types.Dns: instance GHC.Read.Read Propellor.Types.Dns.IPAddr
+ Propellor.Types.Dns: instance GHC.Read.Read Propellor.Types.Dns.Record
+ Propellor.Types.Dns: instance GHC.Read.Read Propellor.Types.Dns.SOA
+ Propellor.Types.Dns: instance GHC.Read.Read Propellor.Types.Dns.Zone
+ Propellor.Types.Dns: instance GHC.Show.Show Propellor.Types.Dns.AliasesInfo
+ Propellor.Types.Dns: instance GHC.Show.Show Propellor.Types.Dns.BindDomain
+ Propellor.Types.Dns: instance GHC.Show.Show Propellor.Types.Dns.DnsInfo
+ Propellor.Types.Dns: instance GHC.Show.Show Propellor.Types.Dns.DnsServerType
+ Propellor.Types.Dns: instance GHC.Show.Show Propellor.Types.Dns.IPAddr
+ Propellor.Types.Dns: instance GHC.Show.Show Propellor.Types.Dns.NamedConf
+ Propellor.Types.Dns: instance GHC.Show.Show Propellor.Types.Dns.NamedConfMap
+ Propellor.Types.Dns: instance GHC.Show.Show Propellor.Types.Dns.Record
+ Propellor.Types.Dns: instance GHC.Show.Show Propellor.Types.Dns.SOA
+ Propellor.Types.Dns: instance GHC.Show.Show Propellor.Types.Dns.Zone
+ Propellor.Types.Dns: instance Propellor.Types.Empty.Empty Propellor.Types.Dns.NamedConfMap
+ Propellor.Types.Dns: instance Propellor.Types.Info.IsInfo Propellor.Types.Dns.AliasesInfo
+ Propellor.Types.Dns: instance Propellor.Types.Info.IsInfo Propellor.Types.Dns.DnsInfo
+ Propellor.Types.Dns: instance Propellor.Types.Info.IsInfo Propellor.Types.Dns.NamedConfMap
+ Propellor.Types.Docker: [_dockerContainers] :: DockerInfo -> Map String Host
+ Propellor.Types.Docker: [_dockerRunParams] :: DockerInfo -> [DockerRunParam]
+ Propellor.Types.Docker: instance GHC.Base.Monoid Propellor.Types.Docker.DockerInfo
+ Propellor.Types.Docker: instance GHC.Show.Show Propellor.Types.Docker.DockerInfo
+ Propellor.Types.Docker: instance GHC.Show.Show Propellor.Types.Docker.DockerRunParam
+ Propellor.Types.Docker: instance Propellor.Types.Empty.Empty Propellor.Types.Docker.DockerInfo
+ Propellor.Types.Docker: instance Propellor.Types.Info.IsInfo Propellor.Types.Docker.DockerInfo
+ Propellor.Types.Empty: instance Propellor.Types.Empty.Empty (Data.Map.Base.Map k v)
+ Propellor.Types.Empty: instance Propellor.Types.Empty.Empty (Data.Set.Base.Set v)
+ Propellor.Types.Empty: instance Propellor.Types.Empty.Empty [a]
+ Propellor.Types.Info: instance Data.Typeable.Internal.Typeable v => Propellor.Types.Info.IsInfo (Propellor.Types.Info.InfoVal v)
+ Propellor.Types.Info: instance GHC.Base.Monoid (Propellor.Types.Info.InfoVal v)
+ Propellor.Types.Info: instance GHC.Base.Monoid Propellor.Types.Info.Info
+ Propellor.Types.Info: instance GHC.Show.Show Propellor.Types.Info.Info
+ Propellor.Types.Info: mapInfo :: IsInfo v => (v -> v) -> Info -> Info
+ Propellor.Types.OS: instance GHC.Classes.Eq Propellor.Types.OS.DebianSuite
+ Propellor.Types.OS: instance GHC.Classes.Eq Propellor.Types.OS.Distribution
+ Propellor.Types.OS: instance GHC.Classes.Eq Propellor.Types.OS.Port
+ Propellor.Types.OS: instance GHC.Classes.Eq Propellor.Types.OS.System
+ Propellor.Types.OS: instance GHC.Show.Show Propellor.Types.OS.DebianSuite
+ Propellor.Types.OS: instance GHC.Show.Show Propellor.Types.OS.Distribution
+ Propellor.Types.OS: instance GHC.Show.Show Propellor.Types.OS.Port
+ Propellor.Types.OS: instance GHC.Show.Show Propellor.Types.OS.System
+ Propellor.Types.PrivData: [mkHostContext] :: HostContext -> HostName -> Context
+ Propellor.Types.PrivData: instance GHC.Classes.Eq Propellor.Types.PrivData.Context
+ Propellor.Types.PrivData: instance GHC.Classes.Eq Propellor.Types.PrivData.DnsSecKey
+ Propellor.Types.PrivData: instance GHC.Classes.Eq Propellor.Types.PrivData.HostContext
+ Propellor.Types.PrivData: instance GHC.Classes.Eq Propellor.Types.PrivData.PrivDataField
+ Propellor.Types.PrivData: instance GHC.Classes.Eq Propellor.Types.PrivData.SshKeyType
+ Propellor.Types.PrivData: instance GHC.Classes.Ord Propellor.Types.PrivData.Context
+ Propellor.Types.PrivData: instance GHC.Classes.Ord Propellor.Types.PrivData.DnsSecKey
+ Propellor.Types.PrivData: instance GHC.Classes.Ord Propellor.Types.PrivData.HostContext
+ Propellor.Types.PrivData: instance GHC.Classes.Ord Propellor.Types.PrivData.PrivDataField
+ Propellor.Types.PrivData: instance GHC.Classes.Ord Propellor.Types.PrivData.SshKeyType
+ Propellor.Types.PrivData: instance GHC.Enum.Bounded Propellor.Types.PrivData.DnsSecKey
+ Propellor.Types.PrivData: instance GHC.Enum.Bounded Propellor.Types.PrivData.SshKeyType
+ Propellor.Types.PrivData: instance GHC.Enum.Enum Propellor.Types.PrivData.DnsSecKey
+ Propellor.Types.PrivData: instance GHC.Enum.Enum Propellor.Types.PrivData.SshKeyType
+ Propellor.Types.PrivData: instance GHC.Read.Read Propellor.Types.PrivData.Context
+ Propellor.Types.PrivData: instance GHC.Read.Read Propellor.Types.PrivData.DnsSecKey
+ Propellor.Types.PrivData: instance GHC.Read.Read Propellor.Types.PrivData.PrivDataField
+ Propellor.Types.PrivData: instance GHC.Read.Read Propellor.Types.PrivData.SshKeyType
+ Propellor.Types.PrivData: instance GHC.Show.Show Propellor.Types.PrivData.Context
+ Propellor.Types.PrivData: instance GHC.Show.Show Propellor.Types.PrivData.DnsSecKey
+ Propellor.Types.PrivData: instance GHC.Show.Show Propellor.Types.PrivData.HostContext
+ Propellor.Types.PrivData: instance GHC.Show.Show Propellor.Types.PrivData.PrivDataField
+ Propellor.Types.PrivData: instance GHC.Show.Show Propellor.Types.PrivData.SshKeyType
+ Propellor.Types.PrivData: instance Propellor.Types.PrivData.IsContext Propellor.Types.PrivData.Context
+ Propellor.Types.PrivData: instance Propellor.Types.PrivData.IsContext Propellor.Types.PrivData.HostContext
+ Propellor.Types.PrivData: instance Propellor.Types.PrivData.IsPrivDataSource Propellor.Types.PrivData.PrivDataField
+ Propellor.Types.PrivData: instance Propellor.Types.PrivData.IsPrivDataSource Propellor.Types.PrivData.PrivDataSource
+ Propellor.Types.Result: instance GHC.Base.Monoid Propellor.Types.Result.Result
+ Propellor.Types.Result: instance GHC.Classes.Eq Propellor.Types.Result.Result
+ Propellor.Types.Result: instance GHC.Read.Read Propellor.Types.Result.Result
+ Propellor.Types.Result: instance GHC.Show.Show Propellor.Types.Result.Result
+ Propellor.Types.Result: instance Propellor.Types.Result.ActionResult GHC.Types.Bool
+ Propellor.Types.Result: instance Propellor.Types.Result.ActionResult Propellor.Types.Result.Result
+ Propellor.Types.Result: instance Propellor.Types.Result.ToResult GHC.Types.Bool
- Propellor.Info: askInfo :: IsInfo v => Propellor v
+ Propellor.Info: askInfo :: (IsInfo v) => Propellor v
- Propellor.Info: pureInfoProperty :: IsInfo v => Desc -> v -> Property HasInfo
+ Propellor.Info: pureInfoProperty :: (IsInfo v) => Desc -> v -> Property HasInfo
- Propellor.PropAccum: propigateContainer :: PropAccum container => container -> Property HasInfo -> Property HasInfo
+ Propellor.PropAccum: propigateContainer :: (PropAccum container) => String -> container -> Property HasInfo -> Property HasInfo
- Propellor.Property: fallback :: Combines (Property p1) (Property p2) => Property p1 -> Property p2 -> Property (CInfo p1 p2)
+ Propellor.Property: fallback :: (Combines (Property p1) (Property p2)) => Property p1 -> Property p2 -> Property (CInfo p1 p2)
- Propellor.Property: onChange :: Combines (Property x) (Property y) => Property x -> Property y -> CombinedType (Property x) (Property y)
+ Propellor.Property: onChange :: (Combines (Property x) (Property y)) => Property x -> Property y -> CombinedType (Property x) (Property y)
- Propellor.Property: onChangeFlagOnFail :: Combines (Property x) (Property y) => FilePath -> Property x -> Property y -> CombinedType (Property x) (Property y)
+ Propellor.Property: onChangeFlagOnFail :: (Combines (Property x) (Property y)) => FilePath -> Property x -> Property y -> CombinedType (Property x) (Property y)
- Propellor.Property.Apt: robustly :: Combines (Property i) (Property NoInfo) => Property i -> Property i
+ Propellor.Property.Apt: robustly :: (Combines (Property i) (Property NoInfo)) => Property i -> Property i
- Propellor.Property.Chroot: propigateChrootInfo :: IsProp (Property i) => Chroot -> Property i -> Property HasInfo
+ Propellor.Property.Chroot: propigateChrootInfo :: (IsProp (Property i)) => Chroot -> Property i -> Property HasInfo
- Propellor.Property.Debootstrap: built' :: Combines (Property NoInfo) (Property i) => Property i -> FilePath -> System -> DebootstrapConfig -> Property (CInfo NoInfo i)
+ Propellor.Property.Debootstrap: built' :: (Combines (Property NoInfo) (Property i)) => Property i -> FilePath -> System -> DebootstrapConfig -> Property (CInfo NoInfo i)
- Propellor.Property.Mount: type FsType = String
+ Propellor.Property.Mount: type FsType = String type of filesystem to mount ("auto" to autodetect)
- Propellor.Property.Scheduled: period :: IsProp (Property i) => Property i -> Recurrance -> Property i
+ Propellor.Property.Scheduled: period :: (IsProp (Property i)) => Property i -> Recurrance -> Property i
- Propellor.Types: combineWith :: Combines (Property x) (Property y) => (Propellor Result -> Propellor Result -> Propellor Result) -> Property x -> Property y -> CombinedType (Property x) (Property y)
+ Propellor.Types: combineWith :: (Combines (Property x) (Property y)) => (Propellor Result -> Propellor Result -> Propellor Result) -> Property x -> Property y -> CombinedType (Property x) (Property y)
Files
- CHANGELOG +16/−0
- config-joey.hs +1/−1
- debian/changelog +16/−0
- propellor.cabal +3/−1
- src/Propellor/Bootstrap.hs +17/−2
- src/Propellor/Gpg.hs +9/−6
- src/Propellor/PrivData.hs +8/−0
- src/Propellor/PropAccum.hs +9/−3
- src/Propellor/Property/Aiccu.hs +3/−1
- src/Propellor/Property/Chroot.hs +1/−1
- src/Propellor/Property/DebianMirror.hs +2/−0
- src/Propellor/Property/Docker.hs +4/−3
- src/Propellor/Property/Firewall.hs +4/−4
- src/Propellor/Property/Kerberos.hs +94/−0
- src/Propellor/Property/LightDM.hs +2/−0
- src/Propellor/Property/Logcheck.hs +36/−0
- src/Propellor/Property/Nginx.hs +2/−0
- src/Propellor/Property/Prosody.hs +2/−0
- src/Propellor/Property/SiteSpecific/IABak.hs +4/−0
- src/Propellor/Property/Unbound.hs +11/−1
- src/Propellor/Types/Info.hs +11/−2
- src/Propellor/Types/PrivData.hs +1/−1
CHANGELOG view
@@ -1,3 +1,19 @@+propellor (2.8.1) unstable; urgency=medium++ * Guard against power loss etc when building propellor, by updating+ the executable atomically.+ * Added Logcheck module, contributed by Jelmer Vernooij.+ * Added Kerberos module, contributed by Jelmer Vernooij.+ * Privdata that uses HostContext inside a container will now have the+ name of the container as its context, rather than the name of+ the host(s) where the container is used. This allows eg, having different+ passwords for a user in different containers. Note that previously,+ propellor would prompt using the container name as the context, but+ not actually use privdata using that context; so this is a bug fix.+ * Fix --add-key to not fail committing when no privdata file exists yet.++ -- Joey Hess <id@joeyh.name> Sun, 04 Oct 2015 13:54:59 -0400+ propellor (2.8.0) unstable; urgency=medium * Added Propellor.Property.Rsync.
config-joey.hs view
@@ -455,7 +455,7 @@ & Docker.publish "2202:22" & Docker.publish "8001:80" & Apt.installed ["ssh"]- & User.hasSomePassword (User "root")+ & User.hasPassword (User "root") & Ssh.permitRootLogin (Ssh.RootLogin True) kiteShellBox :: Systemd.Container
debian/changelog view
@@ -1,3 +1,19 @@+propellor (2.8.1) unstable; urgency=medium++ * Guard against power loss etc when building propellor, by updating+ the executable atomically.+ * Added Logcheck module, contributed by Jelmer Vernooij.+ * Added Kerberos module, contributed by Jelmer Vernooij.+ * Privdata that uses HostContext inside a container will now have the+ name of the container as its context, rather than the name of+ the host(s) where the container is used. This allows eg, having different+ passwords for a user in different containers. Note that previously,+ propellor would prompt using the container name as the context, but+ not actually use privdata using that context; so this is a bug fix.+ * Fix --add-key to not fail committing when no privdata file exists yet.++ -- Joey Hess <id@joeyh.name> Sun, 04 Oct 2015 13:54:59 -0400+ propellor (2.8.0) unstable; urgency=medium * Added Propellor.Property.Rsync.
propellor.cabal view
@@ -1,5 +1,5 @@ Name: propellor-Version: 2.8.0+Version: 2.8.1 Cabal-Version: >= 1.8 License: BSD3 Maintainer: Joey Hess <id@joeyh.name>@@ -91,6 +91,7 @@ Propellor.Property.Group Propellor.Property.Grub Propellor.Property.Journald+ Propellor.Property.Kerberos Propellor.Property.Mount Propellor.Property.Network Propellor.Property.Nginx@@ -105,6 +106,7 @@ Propellor.Property.Rsync Propellor.Property.List Propellor.Property.LightDM+ Propellor.Property.Logcheck Propellor.Property.Scheduled Propellor.Property.Service Propellor.Property.Ssh
src/Propellor/Bootstrap.hs view
@@ -104,9 +104,24 @@ void $ cabal ["configure"] unlessM (cabal ["build"]) $ error "cabal build failed"- nukeFile "propellor"- createSymbolicLink "dist/build/propellor-config/propellor-config" "propellor"+ -- For safety against eg power loss in the middle of the build,+ -- make a copy of the binary, and move it into place atomically.+ -- This ensures that the propellor symlink only ever points at+ -- a binary that is fully built. Also, avoid ever removing+ -- or breaking the symlink.+ --+ -- Need cp -a to make build timestamp checking work.+ unlessM (boolSystem "cp" [Param "-af", Param cabalbuiltbin, Param (tmpfor safetycopy)]) $+ error "cp of binary failed"+ rename (tmpfor safetycopy) safetycopy+ createSymbolicLink safetycopy (tmpfor dest)+ rename (tmpfor dest) dest return True+ where+ dest = "propellor"+ cabalbuiltbin = "dist/build/propellor-config/propellor-config"+ safetycopy = cabalbuiltbin ++ ".built"+ tmpfor f = f ++ ".propellortmp" make :: FilePath -> [FilePath] -> IO Bool -> IO () make dest srcs builder = do
src/Propellor/Gpg.hs view
@@ -6,6 +6,7 @@ import System.Directory import Data.Maybe import Data.List.Utils+import Control.Monad import Propellor.PrivData.Paths import Propellor.Message@@ -106,12 +107,14 @@ ] gitCommitKeyRing :: String -> IO Bool-gitCommitKeyRing action = gitCommit- [ File keyring- , File privDataFile- , Param "-m"- , Param ("propellor " ++ action)- ]+gitCommitKeyRing action = do+ -- Commit explicitly the keyring and privdata files, as other+ -- changes may be staged by the user and shouldn't be committed.+ tocommit <- filterM doesFileExist [ privDataFile, keyring]+ gitCommit $ (map File tocommit) ++ + [ Param "-m"+ , Param ("propellor " ++ action)+ ] -- Adds --gpg-sign if there's a keyring. gpgSignParams :: [CommandParam] -> IO [CommandParam]
src/Propellor/PrivData.hs view
@@ -17,6 +17,7 @@ decryptPrivData, PrivMap, PrivInfo,+ forceHostContext, ) where import Control.Applicative@@ -236,3 +237,10 @@ -- hosts need it. instance IsInfo PrivInfo where propigateInfo _ = True++-- | Sets the context of any privdata that uses HostContext to the+-- provided name.+forceHostContext :: String -> PrivInfo -> PrivInfo+forceHostContext name i = PrivInfo $ S.map go (fromPrivInfo i)+ where+ go (f, d, HostContext ctx) = (f, d, HostContext (const $ ctx name))
src/Propellor/PropAccum.hs view
@@ -14,6 +14,7 @@ import Propellor.Types import Propellor.Property import Propellor.Types.Info+import Propellor.PrivData -- | Starts accumulating the properties of a Host. --@@ -72,12 +73,16 @@ -- -- The Info of the propertyChildren is adjusted to only include -- info that should be propigated out to the Property.+--+-- Any PrivInfo that uses HostContext is adjusted to use the name+-- of the container as its context. propigateContainer :: (PropAccum container)- => container+ => String+ -> container -> Property HasInfo -> Property HasInfo-propigateContainer c prop = infoProperty+propigateContainer containername c prop = infoProperty (propertyDesc prop) (propertySatisfy prop) (propertyInfo prop)@@ -85,6 +90,7 @@ where hostprops = map go $ getProperties c go p = - let i = propigatableInfo (propertyInfo p)+ let i = mapInfo (forceHostContext containername)+ (propigatableInfo (propertyInfo p)) cs = map go (propertyChildren p) in infoProperty (propertyDesc p) (propertySatisfy p) i cs
src/Propellor/Property/Aiccu.hs view
@@ -1,3 +1,5 @@+-- | Maintainer: Jelmer Vernooij <jelmer@samba.org>+ module Propellor.Property.Aiccu ( installed, restarted,@@ -46,5 +48,5 @@ property "aiccu configured" . writeConfig writeConfig :: (((PrivDataField, PrivData) -> Propellor Result) -> Propellor Result) -> Propellor Result writeConfig getpassword = getpassword $ ensureProperty . go- go (Password _, p) = confPath `File.hasContentProtected` config u t p+ go (Password u', p) = confPath `File.hasContentProtected` config u' t p go (f, _) = error $ "Unexpected type of privdata: " ++ show f
src/Propellor/Property/Chroot.hs view
@@ -83,7 +83,7 @@ teardown = toProp (revert built) propigateChrootInfo :: (IsProp (Property i)) => Chroot -> Property i -> Property HasInfo-propigateChrootInfo c p = propigateContainer c p'+propigateChrootInfo c@(Chroot location _ _ _) p = propigateContainer location c p' where p' = infoProperty (propertyDesc p)
src/Propellor/Property/DebianMirror.hs view
@@ -1,3 +1,5 @@+-- | Maintainer: Félix Sipma <felix+propellor@gueux.org>+ module Propellor.Property.DebianMirror ( DebianPriority(..) , showPriority
src/Propellor/Property/Docker.hs view
@@ -19,7 +19,7 @@ Image(..), latestImage, ContainerName,- Container,+ Container(..), HasImage(..), -- * Container configuration dns,@@ -171,7 +171,7 @@ image = getImageName ctr propigateContainerInfo :: (IsProp (Property i)) => Container -> Property i -> Property HasInfo-propigateContainerInfo ctr@(Container _ h) p = propigateContainer ctr p'+propigateContainerInfo ctr@(Container _ h) p = propigateContainer cn ctr p' where p' = infoProperty (propertyDesc p)@@ -179,7 +179,8 @@ (propertyInfo p <> dockerinfo) (propertyChildren p) dockerinfo = dockerInfo $- mempty { _dockerContainers = M.singleton (hostName h) h }+ mempty { _dockerContainers = M.singleton cn h }+ cn = hostName h mkContainerInfo :: ContainerId -> Container -> ContainerInfo mkContainerInfo cid@(ContainerId hn _cn) (Container img h) =
src/Propellor/Property/Firewall.hs view
@@ -1,7 +1,7 @@--- |Properties for configuring firewall (iptables) rules------ Copyright 2014 Arnaud Bailly <arnaud.oqube@gmail.com>--- License: BSD-2-Clause+-- | Maintainer: Arnaud Bailly <arnaud.oqube@gmail.com>+-- +-- Properties for configuring firewall (iptables) rules+ module Propellor.Property.Firewall ( rule, installed,
+ src/Propellor/Property/Kerberos.hs view
@@ -0,0 +1,94 @@+-- | Maintainer: Jelmer Vernooij <jelmer@samba.org>++module Propellor.Property.Kerberos where++import Utility.Process++import Propellor+import qualified Propellor.Property.Apt as Apt+import qualified Propellor.Property.File as File+import Propellor.Property.User++type Realm = String+type Principal = String+type Kvno = Integer++-- Standard paths in MIT Kerberos++defaultKeyTab :: FilePath+defaultKeyTab = "/etc/krb5.keytab"++kadmAclPath :: FilePath+kadmAclPath = "/etc/krb5kdc/kadm5.acl"++kpropdAclPath :: FilePath+kpropdAclPath = "/etc/krb5kdc/kpropd.acl"++kdcConfPath :: FilePath+kdcConfPath = "/etc/krb5kdc/kdc.conf"++keyTabPath :: Maybe FilePath -> FilePath+keyTabPath = maybe defaultKeyTab id++-- | Create a principal from a primary, instance and realm+principal :: String -> Maybe String -> Maybe Realm -> Principal+principal p i r = p ++ maybe "" ("/"++) i ++ maybe "" ("@" ++) r++installed :: Property NoInfo+installed = Apt.installed ["krb5-user"]++kdcInstalled :: Property NoInfo+kdcInstalled = Apt.serviceInstalledRunning "krb5-kdc"++adminServerInstalled :: Property NoInfo+adminServerInstalled = Apt.serviceInstalledRunning "krb5-admin-server"++kpropServerInstalled :: Property HasInfo+kpropServerInstalled = propertyList "kprop server installed" $ props+ & kdcInstalled+ & Apt.installed ["openbsd-inetd"]+ & "/etc/inetd.conf" `File.containsLines`+ [ "krb5_prop\tstream\ttcp\tnowait\troot\t/usr/sbin/kpropd kpropd"+ , "krb5_prop\tstream\ttcp6\tnowait\troot\t/usr/sbin/kpropd kpropd"+ ]++kpropAcls :: [String] -> Property NoInfo+kpropAcls ps = kpropdAclPath `File.hasContent` ps `describe` "kprop server ACLs"++k5srvutil :: (Maybe FilePath) -> [String] -> IO String+k5srvutil kt cmd = readProcess "k5srvutil" (maybe [] (\x -> ["-f", x]) kt ++ cmd)++-- Keytab management+keytabEntries :: Maybe FilePath -> IO [(Kvno, Principal)]+keytabEntries p = do+ c <- k5srvutil p ["list"]+ return $ map parseLine (drop 3 $ lines c)+ where+ parseLine l = (Prelude.read x, y) where (x, y) = splitAt 5 l++checkKeyTabEntry' :: Maybe FilePath -> (Kvno, Principal) -> IO Bool+checkKeyTabEntry' path entry = do+ entries <- keytabEntries path+ return $ entry `elem` entries++checkKeyTabEntry :: Maybe FilePath -> Principal -> IO Bool+checkKeyTabEntry path princ = do+ entries <- keytabEntries path+ return $ princ `elem` (map snd entries)++-- k5login files+k5loginPath :: User -> IO FilePath+k5loginPath user = do+ h <- homedir user+ return $ h </> ".k5login"++k5login :: User -> [Principal] -> Property NoInfo+k5login user@(User u) ps = property (u ++ " has k5login") $ do+ f <- liftIO $ k5loginPath user+ liftIO $ do+ createDirectoryIfMissing True (takeDirectory f)+ writeFile f (unlines ps)+ ensureProperties+ [ File.ownerGroup f user (userGroup user)+ , File.ownerGroup (takeDirectory f) user (userGroup user)+ ]
src/Propellor/Property/LightDM.hs view
@@ -1,5 +1,7 @@ {-# LANGUAGE FlexibleInstances #-} +-- | Maintainer: Sean Whitton <spwhitton@spwhitton.name>+ module Propellor.Property.LightDM where import Propellor
+ src/Propellor/Property/Logcheck.hs view
@@ -0,0 +1,36 @@+-- | Maintainer: Jelmer Vernooij <jelmer@jelmer.uk>++module Propellor.Property.Logcheck (+ ReportLevel (Workstation, Server, Paranoid),+ Service,+ defaultPrefix,+ ignoreFilePath,+ ignoreLines,+ installed,+) where++import Propellor+import qualified Propellor.Property.Apt as Apt+import qualified Propellor.Property.File as File++data ReportLevel = Workstation | Server | Paranoid+type Service = String++instance Show ReportLevel where+ show Workstation = "workstation"+ show Server = "server"+ show Paranoid = "paranoid"++-- The common prefix used by default in syslog lines.+defaultPrefix :: String+defaultPrefix = "^\\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ "++ignoreFilePath :: ReportLevel -> Service -> FilePath+ignoreFilePath t n = "/etc/logcheck/ignore.d." ++ (show t) </> n++ignoreLines :: ReportLevel -> Service -> [String] -> Property NoInfo+ignoreLines t n ls = (ignoreFilePath t n) `File.containsLines` ls+ `describe` ("logcheck ignore lines for " ++ n ++ "(" ++ (show t) ++ ")")++installed :: Property NoInfo+installed = Apt.installed ["logcheck"]
src/Propellor/Property/Nginx.hs view
@@ -1,3 +1,5 @@+-- | Maintainer: Félix Sipma <felix+propellor@gueux.org>+ module Propellor.Property.Nginx where import Propellor
src/Propellor/Property/Prosody.hs view
@@ -1,3 +1,5 @@+-- | Maintainer: Félix Sipma <felix+propellor@gueux.org>+ module Propellor.Property.Prosody where import Propellor
src/Propellor/Property/SiteSpecific/IABak.hs view
@@ -37,6 +37,10 @@ & Cron.niceJob "shardmaint" Cron.Daily (User "root") "/" "/usr/local/IA.BAK/shardmaint-fast; /usr/local/IA.BAK/shardmaint" & Apt.installed ["git-annex"]+ & Apt.installed ["libmail-sendmail-perl"]+ & Cron.niceJob "expireemailer" Cron.Daily (User "root") + "/usr/local/IA.BAK"+ "./expireemailer" registrationServer :: [Host] -> Property HasInfo registrationServer knownhosts = propertyList "iabak registration server" $ props
src/Propellor/Property/Unbound.hs view
@@ -1,9 +1,19 @@--- | Properties for the Unbound caching DNS server+-- | Maintainer: Félix Sipma <felix+propellor@gueux.org>+--+-- Properties for the Unbound caching DNS server module Propellor.Property.Unbound ( installed , restarted , reloaded+ , UnboundSection+ , UnboundZone+ , UnboundHost+ , UnboundSetting+ , UnboundValue+ , UnboundKey+ , ConfSection+ , ZoneType , cachingDnsServer ) where
src/Propellor/Types/Info.hs view
@@ -5,6 +5,7 @@ IsInfo(..), addInfo, getInfo,+ mapInfo, propigatableInfo, InfoVal(..), fromInfoVal,@@ -16,8 +17,6 @@ import Data.Maybe -- | Information about a Host, which can be provided by its properties.------ Any value in the `IsInfo` type class can be added to an Info. data Info = Info [(Dynamic, Bool)] instance Show Info where@@ -37,11 +36,21 @@ -- container to its Host? propigateInfo :: v -> Bool +-- | Any value in the `IsInfo` type class can be added to an Info. addInfo :: IsInfo v => Info -> v -> Info addInfo (Info l) v = Info ((toDyn v, propigateInfo v):l) getInfo :: IsInfo v => Info -> v getInfo (Info l) = mconcat (mapMaybe (fromDynamic . fst) (reverse l))++-- | Maps a function over all values stored in the Info that are of the+-- appropriate type.+mapInfo :: IsInfo v => (v -> v) -> Info -> Info+mapInfo f (Info l) = Info (map go l)+ where+ go (i, p) = case fromDynamic i of+ Nothing -> (i, p)+ Just v -> (toDyn (f v), p) -- | Filters out parts of the Info that should not propigate out of a -- container.
src/Propellor/Types/PrivData.hs view
@@ -61,7 +61,7 @@ newtype Context = Context String deriving (Read, Show, Ord, Eq) --- | A context that varies depending on the HostName where it's used.+-- | A context that may vary depending on the HostName where it's used. newtype HostContext = HostContext { mkHostContext :: HostName -> Context } instance Show HostContext where