packages feed

propellor 5.15 → 5.16

raw patch · 15 files changed

+170/−76 lines, 15 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ Propellor.Property.Debootstrap: UseOldGpgKeyring :: DebootstrapConfig
+ Propellor.Property.SiteSpecific.JoeySites: connectStarlinkDish :: Property DebianLike
- Propellor.Property.SiteSpecific.GitAnnexBuilder: autoBuilderContainer :: (DebianSuite -> Architecture -> Flavor -> Property (HasInfo + Debian)) -> DebianSuite -> Architecture -> Flavor -> Times -> TimeOut -> Container
+ Propellor.Property.SiteSpecific.GitAnnexBuilder: autoBuilderContainer :: (DebianSuite -> Architecture -> Flavor -> Property (HasInfo + Debian)) -> DebianSuite -> Architecture -> DebootstrapConfig -> Flavor -> Times -> TimeOut -> Container
- Propellor.Property.SiteSpecific.GitAnnexBuilder: standardAutoBuilder :: DebianSuite -> Architecture -> Flavor -> Property (HasInfo + Debian)
+ Propellor.Property.SiteSpecific.GitAnnexBuilder: standardAutoBuilder :: Bool -> DebianSuite -> Architecture -> Flavor -> Property (HasInfo + Debian)

Files

CHANGELOG view
@@ -1,3 +1,12 @@+propellor (5.16) unstable; urgency=medium++  * Debootstrap: Added UseOldGpgKeyring constructor to DebootstrapConfig,+    which allows bootstrapping ancient stable releases of Debian.+  * Qemu: Install binfmt-support along with qemu-user-static.+  * Fix build with unix-2.8.0.0 and with unix-compat-0.7.++ -- Joey Hess <id@joeyh.name>  Mon, 29 May 2023 11:24:25 -0400+ propellor (5.15) unstable; urgency=medium    * Improve propellor's MetaTypes implementation to avoid an expontential
debian/changelog view
@@ -1,3 +1,12 @@+propellor (5.16) unstable; urgency=medium++  * Debootstrap: Added UseOldGpgKeyring constructor to DebootstrapConfig,+    which allows bootstrapping ancient stable releases of Debian.+  * Qemu: Install binfmt-support along with qemu-user-static.+  * Fix build with unix-2.8.0.0 and with unix-compat-0.7.++ -- Joey Hess <id@joeyh.name>  Mon, 29 May 2023 11:24:25 -0400+ propellor (5.15) unstable; urgency=medium    * Improve propellor's MetaTypes implementation to avoid an expontential
joeyconfig.hs view
@@ -28,8 +28,10 @@ import qualified Propellor.Property.Systemd as Systemd import qualified Propellor.Property.Journald as Journald import qualified Propellor.Property.Fail2Ban as Fail2Ban+import qualified Propellor.Property.FlashKernel as FlashKernel import qualified Propellor.Property.Laptop as Laptop import qualified Propellor.Property.LightDM as LightDM+import qualified Propellor.Property.Debootstrap as Debootstrap import qualified Propellor.Property.HostingProvider.Linode as Linode import qualified Propellor.Property.SiteSpecific.GitHome as GitHome import qualified Propellor.Property.SiteSpecific.GitAnnexBuilder as GitAnnexBuilder@@ -45,13 +47,14 @@ 	[ darkstar 	, dragon 	, oyster-	, orca 	, house 	, kite+	, sparrow 	, beaver 	, sow 	, mouse 	, peregrine+	, eel 	, pell 	] ++ monsters @@ -96,29 +99,6 @@ 	& User.hasPassword (User "root") 	& Apt.unattendedUpgrades -orca :: Host-orca = host "orca.kitenet.net" $ props-	& standardSystem Unstable X86_64 [ "Main git-annex build box." ]-	& ipv4 "138.38.108.179"--	& Apt.unattendedUpgrades-	& Postfix.satellite-	& Apt.serviceInstalledRunning "ntp"-	& Systemd.persistentJournal--	& Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer-		GitAnnexBuilder.standardAutoBuilder-		Unstable X86_64 Nothing (Cron.Times "15 * * * *") "2h")-	& Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer-		GitAnnexBuilder.standardAutoBuilder-		Unstable X86_32 Nothing (Cron.Times "30 * * * *") "2h")-	& Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer-		GitAnnexBuilder.stackAutoBuilder-		(Stable "jessie") X86_32 (Just "ancient") (Cron.Times "45 * * * *") "2h")-	& Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer-		GitAnnexBuilder.standardAutoBuilder-		Testing ARM64 Nothing (Cron.Times "1 * * * *") "4h")- house :: Host house = host "house.lan" $ props 	& standardSystem Testing ARMHF@@ -126,6 +106,10 @@ 	& Apt.removed ["rsyslog"] 	 	& cubietech_Cubietruck+	-- fsck when needed on boot+	& "/etc/default/flash-kernel"+		`File.containsLine` "LINUX_KERNEL_CMDLINE=\"fsck.repair=yes\""+		`onChange` FlashKernel.flashKernel 	& hasPartition 		( partition EXT3 			`mountedAt` "/"@@ -148,7 +132,7 @@ 		hosts 		(Context "house.joeyh.name") 		(SshEd25519, "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMAmVYddg/RgCbIj+cLcEiddeFXaYFnbEJ3uGj9G/EyV joey@honeybee")-	& JoeySites.connectStarlinkRouter+	& JoeySites.connectStarlinkDish 	& JoeySites.homeRouter 	& JoeySites.homeNAS 	& Apt.installed ["mtr-tiny", "iftop", "screen", "nmap"]@@ -156,15 +140,6 @@ 	& Apt.installed ["linux-headers-armmp-lpae"] 	& Postfix.satellite -	& check (not <$> hasContainerCapability Systemd.FilesystemContained) -		(setupRevertableProperty autobuilder)-	-- In case compiler needs more than available ram-	& Apt.serviceInstalledRunning "swapspace"-  where-	autobuilder = Systemd.nspawned $ GitAnnexBuilder.autoBuilderContainer-		(GitAnnexBuilder.armAutoBuilder GitAnnexBuilder.standardAutoBuilder)-		Testing ARMEL Nothing (Cron.Times "15 15 * * *") "10h"- -- This is not a complete description of kite, since it's a -- multiuser system with eg, user passwords that are not deployed -- with propellor.@@ -186,7 +161,6 @@  	& Network.preserveStatic "eth0" `requires` Network.cleanInterfacesFile 	& Apt.installed ["linux-image-amd64"]-	& Apt.serviceInstalledRunning "swapspace" 	& Linode.serialGrub 	& Linode.locateEnabled 	& Apt.unattendedUpgrades@@ -257,8 +231,6 @@ 	& alias "kgb.kitenet.net" 	& JoeySites.kgbServer 	-	& Systemd.nspawned ancientKitenet-	 	& alias "podcatcher.kitenet.net" 	& JoeySites.podcatcher @@ -267,6 +239,7 @@ 		[ (RelDomain "mouse-onion", CNAME $ AbsDomain "htieo6yu2qtcn2j3.onion") 		, (RelDomain "beaver-onion", CNAME $ AbsDomain "tl4xsvaxryjylgxs.onion") 		, (RelDomain "peregrine-onion", CNAME $ AbsDomain "rsdwvaabir6ty2kdzblq7wdda26ib4fuc6hzxzwum75jbn6thqbojvid.onion")+		, (RelDomain "eel-onion", CNAME $ AbsDomain "4yuc425lsa6ho2c6dlsg4cinadxvsn7vvir7a36ljv7wdyvg52h3inid.onion") 		, (RelDomain "sow-onion", CNAME $ AbsDomain "urt4g2tq32qktgtp.onion") 		] 	& myDnsPrimary "joeyh.name" []@@ -293,7 +266,45 @@ 	& Apache.httpsVirtualHost "letsencrypt.joeyh.name" "/var/www/html" 		(LetsEncrypt.AgreeTOS (Just "id@joeyh.name")) 	& alias "letsencrypt.joeyh.name"+	+	& Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer+		(GitAnnexBuilder.standardAutoBuilder True)+		Unstable X86_64 mempty Nothing (Cron.Times "15 * * * *") "2h")+	& Apt.serviceInstalledRunning "swapspace" +sparrow :: Host+sparrow = host "sparrow.kitenet.net" $ props+	& standardSystem Testing ARM64 [ "Welcome to sparrow!" ]+	& ipv4 "128.140.52.168"+	& ipv6 "2a01:4f8:c17:ed3a::1"+	& Apt.installed ["ssh"]+	& Apt.installed [ "git-annex", "myrepos", "build-essential", "make"]+	-- In case compiler needs more than available ram+	& Apt.serviceInstalledRunning "swapspace"++	& Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer+		-- qemu hangs running unattended-upgrades on i386+		-- so disable installing that+		(GitAnnexBuilder.standardAutoBuilder False)+		Unstable X86_32 mempty Nothing (Cron.Times "30 * * * *") "4h")+	& Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer+		GitAnnexBuilder.stackAutoBuilder+		(Stable "jessie") X86_32 +		(Debootstrap.UseOldGpgKeyring Debootstrap.:+ Debootstrap.DebootstrapMirror "http://archive.debian.org/debian/")+		(Just "ancient") (Cron.Times "45 * * * *") "4h")+	& Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer+		(GitAnnexBuilder.standardAutoBuilder True)+		Testing ARM64 mempty Nothing (Cron.Times "1 * * * *") "2h")+	& Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer+		GitAnnexBuilder.stackAutoBuilder+		(Stable "bullseye") ARM64 mempty+		(Just "ancient") (Cron.Times "20 * * * *") "2h")+	& Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer+		(GitAnnexBuilder.armAutoBuilder (GitAnnexBuilder.standardAutoBuilder True))+		Testing ARMEL mempty Nothing (Cron.Times "15 15 * * *") "2h")+	+	& Systemd.nspawned ancientKitenet+ beaver :: Host beaver = host "beaver.kitenet.net" $ props 	& Apt.installed ["ssh"]@@ -315,6 +326,13 @@ 	& Tor.installed 	& Tor.hiddenServiceAvailable "ssh" (Port 22) +eel :: Host+eel = host "eel.kitenet.net" $ props+	& Apt.installed ["ssh", "screen", "git-annex"]+	& Tor.installed+	& Tor.hiddenServiceAvailable "ssh" (Port 22)+	& LightDM.autoLogin (User "desktop")+ peregrine :: Host peregrine = host "peregrine.kitenet.net" $ props 	& Apt.installed ["ssh", "screen", "variety", "git-annex"]@@ -362,7 +380,7 @@ -- Exhibit: kite's 90's website on port 1994. ancientKitenet :: Systemd.Container ancientKitenet = Systemd.debContainer "ancient-kitenet" $ props-	& standardContainer (Stable "buster")+	& standardContainer (Stable "buster") ARM64 	& alias hn 	& Git.cloned (User "root") "git://kitenet-net.branchable.com/" "/var/www/html" 		(Just "remotes/origin/old-kitenet.net")@@ -406,9 +424,9 @@ 	& JoeySites.noExim  -- This is my standard container setup, Featuring automatic upgrades.-standardContainer :: DebianSuite -> Property (HasInfo + Debian)-standardContainer suite = propertyList "standard container" $ props-	& osDebian suite X86_64+standardContainer :: DebianSuite -> Architecture -> Property (HasInfo + Debian)+standardContainer suite arch = propertyList "standard container" $ props+	& osDebian suite arch 	-- Do not want to run mail daemon inside a random container.. 	& JoeySites.noExim 	& Apt.stdSourcesList `onChange` Apt.upgrade
propellor.cabal view
@@ -1,5 +1,5 @@ Name: propellor-Version: 5.15+Version: 5.16 Cabal-Version: 1.20 License: BSD2 Maintainer: Joey Hess <id@joeyh.name>
src/Propellor/CmdLine.hs view
@@ -6,7 +6,7 @@ import System.Environment (getArgs) import Data.List import System.Exit-import System.PosixCompat+import System.Posix.User import Network.Socket  import Propellor.Base
src/Propellor/Engine.hs view
@@ -16,7 +16,7 @@ import System.IO import Data.Monoid import "mtl" Control.Monad.RWS.Strict-import System.PosixCompat+import System.Posix.Files import System.Posix.IO import System.FilePath import System.Console.Concurrent
src/Propellor/Property/Debootstrap.hs view
@@ -34,6 +34,9 @@ 	| UseEmulation 	| DebootstrapProxy Url 	| DebootstrapMirror Url+	| UseOldGpgKeyring+	-- ^ Debootstrap using the keyring of old and removed gpg keys.+	-- This is needed to debootstrap ancient stable releases of Debian. 	| DebootstrapConfig :+ DebootstrapConfig 	deriving (Show) @@ -52,6 +55,7 @@ toParams UseEmulation = [] toParams (DebootstrapProxy _) = [] toParams (DebootstrapMirror _) = []+toParams UseOldGpgKeyring = [Param "--keyring=/usr/share/keyrings/debian-archive-removed-keys.gpg"] toParams (c1 :+ c2) = toParams c1 <> toParams c2  useEmulation :: DebootstrapConfig -> Bool
src/Propellor/Property/Gpg.hs view
@@ -3,7 +3,7 @@ import Propellor.Base import qualified Propellor.Property.Apt as Apt -import System.PosixCompat+import System.Posix.User  installed :: Property DebianLike installed = Apt.installed ["gnupg"]
src/Propellor/Property/Qemu.hs view
@@ -11,7 +11,7 @@   where 	setup = Apt.installed p `pickOS` unsupportedOS 	cleanup = Apt.removed p `pickOS` unsupportedOS-	p = ["qemu-user-static"]+	p = ["qemu-user-static", "binfmt-support"]  -- | Check if the given System supports an Architecture. --
src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs view
@@ -10,6 +10,7 @@ import qualified Propellor.Property.Systemd as Systemd import qualified Propellor.Property.Chroot as Chroot import Propellor.Property.Cron (Times)+import Propellor.Property.Debootstrap  builduser :: UserName builduser = "builder"@@ -105,9 +106,9 @@ 			`assume` MadeChange 		cabalupdated = homedir </> ".cabal" </> "packages" </> "hackage.haskell.org" </> "00-index.cache" -autoBuilderContainer :: (DebianSuite -> Architecture -> Flavor -> Property (HasInfo + Debian)) -> DebianSuite -> Architecture -> Flavor -> Times -> TimeOut -> Systemd.Container-autoBuilderContainer mkprop suite arch flavor crontime timeout =-	Systemd.container name $ \d -> Chroot.debootstrapped mempty d $ props+autoBuilderContainer :: (DebianSuite -> Architecture -> Flavor -> Property (HasInfo + Debian)) -> DebianSuite -> Architecture -> DebootstrapConfig -> Flavor -> Times -> TimeOut -> Systemd.Container+autoBuilderContainer mkprop suite arch debootstrapconfig flavor crontime timeout =+	Systemd.container name $ \d -> Chroot.debootstrapped debootstrapconfig d $ props 		& mkprop suite arch flavor 		& autobuilder (architectureToDebianArchString arch) crontime timeout   where@@ -115,13 +116,13 @@  type Flavor = Maybe String -standardAutoBuilder :: DebianSuite -> Architecture -> Flavor -> Property (HasInfo + Debian)-standardAutoBuilder suite arch flavor =+standardAutoBuilder :: Bool -> DebianSuite -> Architecture -> Flavor -> Property (HasInfo + Debian)+standardAutoBuilder unattendedupgrades suite arch flavor = 	propertyList "standard git-annex autobuilder" $ props 		& osDebian suite arch 		& Apt.stdSourcesList-		& Apt.unattendedUpgrades 		& Apt.cacheCleaned+		& (if unattendedupgrades then Apt.unattendedUpgrades else mempty) 		& User.accountFor (User builduser) 		& tree (architectureToDebianArchString arch) flavor 		& buildDepsApt@@ -131,7 +132,10 @@ 	propertyList "git-annex autobuilder using stack" $ props 		& osDebian suite arch 		& buildDepsNoHaskellLibs-		& Apt.stdSourcesList+		-- For some reason security.debian.org is very slow for+		-- ancient versions of debian stable used with this. So+		-- disable for now.+		-- & Apt.stdSourcesList 		& Apt.unattendedUpgrades 		& Apt.cacheCleaned 		& User.accountFor (User builduser)@@ -139,18 +143,24 @@ 		& stackInstalled 		-- Workaround https://github.com/commercialhaskell/stack/issues/2093 		& Apt.installed ["libtinfo-dev"]+		& Apt.installed ["libnuma1", "libnuma-dev", "zlib1g-dev"]  stackInstalled :: Property DebianLike stackInstalled = withOS "stack installed" $ \w o -> 	case o of 		(Just (System (Debian Linux (Stable "jessie")) arch)) -> 			ensureProperty w $ manualinstall arch+		(Just (System (Debian Linux (Stable "stretch")) arch)) ->+			ensureProperty w $ manualinstall arch+		(Just (System (Debian Linux (Stable "buster")) arch)) ->+			ensureProperty w $ manualinstall arch 		_ -> ensureProperty w $ Apt.installed ["haskell-stack"]   where 	-- Warning: Using a binary downloaded w/o validation.-	manualinstall :: Architecture -> Property Linux+	manualinstall :: Architecture -> Property DebianLike 	manualinstall arch = tightenTargets $ check (not <$> doesFileExist binstack) $ 		propertyList "stack installed from upstream tarball" $ props+			& Apt.installed ["wget"] 			& cmdProperty "wget" [url, "-O", tmptar] 				`assume` MadeChange 			& File.dirExists tmpdir@@ -168,9 +178,12 @@ 				_ -> doNothing 	  where 		url = case arch of-			X86_32 -> "https://www.stackage.org/stack/linux-i386"-			X86_64 -> "https://www.stackage.org/stack/linux-x86_64"-			ARMEL -> "https://github.com/commercialhaskell/stack/releases/download/v1.7.1/stack-1.7.1-linux-arm.tar.gz"+			X86_64 -> "https://github.com/commercialhaskell/stack/releases/download/v1.9.3/stack-1.9.3-linux-x86_64.tar.gz"+			X86_32 -> "https://github.com/commercialhaskell/stack/releases/download/v1.9.3/stack-1.9.3-linux-i386.tar.gz"+			ARMEL -> "https://github.com/commercialhaskell/stack/releases/download/v1.9.3/stack-1.9.3-linux-arm.tar.gz"+			-- Newer version because older version did not+			-- support installing ghc on arm64+			ARM64 -> "https://github.com/commercialhaskell/stack/releases/download/v2.1.3/stack-2.1.3-linux-aarch64.tar.gz" 			-- Probably not available. 			a -> "https://www.stackage.org/stack/linux-" ++ architectureToDebianArchString a 	binstack = "/usr/bin/stack"
src/Propellor/Property/SiteSpecific/JoeySites.hs view
@@ -249,22 +249,23 @@ 	`requires` Apt.installed ["git-annex", "myrepos"]  spamdEnabled :: Property DebianLike-spamdEnabled = tightenTargets $ -	cmdProperty "update-rc.d" ["spamassassin", "enable"]-		`assume` MadeChange+spamdEnabled = Apt.serviceInstalledRunning "spamd"  spamassassinConfigured :: Property DebianLike spamassassinConfigured = propertyList "spamassassin configured" $ props-	& Apt.serviceInstalledRunning "spamassassin"-	& "/etc/default/spamassassin" `File.containsLines`+	& spamdEnabled+	& "/etc/default/spamd" `File.containsLines` 		[ "# Propellor deployed" 		, "OPTIONS=\"--create-prefs --max-children 5 --helper-home-dir\""-		, "CRON=1" 		, "NICE=\"--nicelevel 15\""-		]+		]  		`describe` "spamd configured"-		`onChange` spamdEnabled-		`onChange` Service.restarted "spamassassin"+		`onChange` Service.restarted "spamd"+	& "/etc/default/spamassassin" `File.containsLines`+		[ "# Propellor deployed"+		, "CRON=1"+		]+		`describe` "spamassassin configured" 		`requires` Apt.serviceInstalledRunning "cron"  kiteMailServer :: Property (HasInfo + DebianLike)@@ -881,12 +882,33 @@ homerouterWifiInterface = "wlx00c0ca82eb78"  homerouterWifiInterfaceOld :: String-homerouterWifiInterfaceOld = "wlx00c0cab064eb"+homerouterWifiInterfaceOld = "wlx9cefd5fcd6f3" +-- Connect to the starlink dish directly (no starlink router)+connectStarlinkDish :: Property DebianLike+connectStarlinkDish = propertyList "connected via starlink dish" $ props+	-- Use dhcpcd for ipv6 prefix delegation to the wifi interface.+	& Apt.installed ["dhcpcd"]+	-- dhcpcd is run by ifup on boot. When the daemon was enabled,+	-- that somehow prevented prefix delegation from happening,+	-- so disable the daemon from being run by systemd.+	& Systemd.stopped "dhcpcd"+	& Systemd.masked "dhcpcd"+	& "/etc/dhcpcd.conf" `File.containsLine`+		("ia_pd 1 " ++ homerouterWifiInterface)+	& "/etc/dhcpcd.conf" `File.lacksLine`+		("ia_pd 1 " ++ homerouterWifiInterfaceOld)+	& Network.dhcp "end0"+		`requires` Network.cleanInterfacesFile+ -- Connect to the starlink router with its ethernet adapter.+--+-- Static route because with dhcp it sometimes fails to get an address from+-- starlink. connectStarlinkRouter :: Property DebianLike connectStarlinkRouter = propertyList "connected via starlink router" $ props-	& Network.dhcp "eth0"+	& Network.static "end0" (IPv4 "192.168.1.62")+		(Just (Network.Gateway (IPv4 "192.168.1.1"))) 		`requires` Network.cleanInterfacesFile  -- My home router, running hostapd and dnsmasq.@@ -916,21 +938,37 @@ 		[ "domain-needed" 		, "bogus-priv" 		, "interface=" ++ homerouterWifiInterface-		, "interface=eth0" 		, "domain=lan" 		-- lease time is short because the house 		-- controller wants to know when clients disconnect 		, "dhcp-range=10.1.1.100,10.1.1.150,10m" 		, "no-hosts"-		, "address=/honeybee.kitenet.net/10.1.1.1" 		, "address=/house.lan/10.1.1.1"+		-- allow accessing starlink dish when it's not online yet+		, "address=/dishy.starlink.com/192.168.100.1" 		] 		`onChange` Service.restarted "dnsmasq" 	-- Avoid DHCPNAK of lease obtained at boot, after NTP slews clock-	-- forward too far, causing that least to not be valid.+	-- forward too far, causing that lease to not be valid. 	& "/etc/default/dnsmasq" `File.containsLine` "DNSMASQ_OPTS=\"--dhcp-authoritative\"" 		`onChange` Service.restarted "dnsmasq" 	& ipmasq homerouterWifiInterface+	& Apt.installed ["radvd"]+	-- This needs ipv6 prefix delegation to the wifi interface to be+	-- enabled.+	& File.hasContent "/etc/radvd.conf"+		[ "interface " ++ homerouterWifiInterface ++ " {"+		, "  AdvSendAdvert on;"+		, "  MinRtrAdvInterval 3;"+		, "  MaxRtrAdvInterval 10;"+		, "  prefix ::/64 {"+		, "    AdvOnLink on;"+		, "    AdvAutonomous on;"+		, "    AdvRouterAddr on;"+		, "  };"+		, "};"+		]+		`onChange` Service.restarted "radvd"  -- | Enable IP masqerading, on whatever other interfaces come up, besides the -- provided intif.
src/Propellor/Property/Ssh.hs view
@@ -41,7 +41,8 @@ import Propellor.Property.User import Propellor.Types.Info -import System.PosixCompat+import System.Posix.User+import System.Posix.Files import qualified Data.Map as M import qualified Data.Set as S import qualified Data.Semigroup as Sem
src/Propellor/Spin.hs view
@@ -11,9 +11,8 @@  import Data.List import System.Exit-import System.PosixCompat+import System.Posix import System.Posix.IO-import System.Posix.Directory import Control.Concurrent.Async import qualified Data.ByteString as B import qualified Data.Set as S
src/Propellor/Ssh.hs view
@@ -4,7 +4,7 @@ import Utility.UserInfo import Utility.FileSystemEncoding -import System.PosixCompat+import System.Posix import Data.Time.Clock.POSIX import Data.Hashable 
src/Utility/UserInfo.hs view
@@ -21,7 +21,10 @@ import Control.Applicative #endif -import System.PosixCompat+import System.Posix.User+#if MIN_VERSION_unix(2,8,0)+import System.Posix.User.ByteString (UserEntry)+#endif import Prelude  {- Current user's home directory.