packages feed

propellor 5.6.1 → 5.7.0

raw patch · 27 files changed

+205/−91 lines, 27 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Propellor.Property.PropellorRepo: OriginUrl :: String -> OriginUrl
- Propellor.Property.PropellorRepo: hasOriginUrl :: String -> Property (HasInfo + UnixLike)
- Propellor.Property.PropellorRepo: instance GHC.Show.Show Propellor.Property.PropellorRepo.OriginUrl
- Propellor.Property.PropellorRepo: newtype OriginUrl
- Propellor.Property.SiteSpecific.JoeySites: pumpRss :: Property DebianLike
+ Propellor.Property.Cron: jobDropped :: Desc -> Times -> Property UnixLike
+ Propellor.Property.Localdir: OriginUrl :: String -> OriginUrl
+ Propellor.Property.Localdir: hasOriginUrl :: String -> Property (HasInfo + UnixLike)
+ Propellor.Property.Localdir: instance GHC.Show.Show Propellor.Property.Localdir.OriginUrl
+ Propellor.Property.Localdir: newtype OriginUrl
+ Propellor.Property.Localdir: removed :: Property UnixLike
+ Propellor.Property.Mount: partialBindMountsOf :: FilePath -> IO [MountPoint]
+ Propellor.Property.Sbuild: osDebianStandard :: Property Debian
+ Propellor.Utilities: addModes :: [FileMode] -> FileMode -> FileMode
+ Propellor.Utilities: allowRead :: FilePath -> IO ()
+ Propellor.Utilities: allowWrite :: FilePath -> IO ()
+ Propellor.Utilities: checkMode :: FileMode -> FileMode -> Bool
+ Propellor.Utilities: combineModes :: [FileMode] -> FileMode
+ Propellor.Utilities: defaultFileMode :: IO FileMode
+ Propellor.Utilities: executeModes :: [FileMode]
+ Propellor.Utilities: getUmask :: IO FileMode
+ Propellor.Utilities: groupSharedModes :: [FileMode]
+ Propellor.Utilities: groupWriteRead :: FilePath -> IO ()
+ Propellor.Utilities: isExecutable :: FileMode -> Bool
+ Propellor.Utilities: isSticky :: FileMode -> Bool
+ Propellor.Utilities: isSymLink :: FileMode -> Bool
+ Propellor.Utilities: modifyFileMode :: FilePath -> (FileMode -> FileMode) -> IO ()
+ Propellor.Utilities: modifyFileMode' :: FilePath -> (FileMode -> FileMode) -> IO FileMode
+ Propellor.Utilities: noUmask :: (MonadIO m, MonadMask m) => FileMode -> m a -> m a
+ Propellor.Utilities: otherGroupModes :: [FileMode]
+ Propellor.Utilities: preventWrite :: FilePath -> IO ()
+ Propellor.Utilities: protectedOutput :: IO a -> IO a
+ Propellor.Utilities: readModes :: [FileMode]
+ Propellor.Utilities: removeModes :: [FileMode] -> FileMode -> FileMode
+ Propellor.Utilities: setSticky :: FilePath -> IO ()
+ Propellor.Utilities: stickyMode :: FileMode
+ Propellor.Utilities: type FileMode = CMode
+ Propellor.Utilities: withModifiedFileMode :: FilePath -> (FileMode -> FileMode) -> IO a -> IO a
+ Propellor.Utilities: withUmask :: (MonadIO m, MonadMask m) => FileMode -> m a -> m a
+ Propellor.Utilities: writeFileProtected :: FilePath -> String -> IO ()
+ Propellor.Utilities: writeFileProtected' :: FilePath -> (Handle -> IO ()) -> IO ()
+ Propellor.Utilities: writeModes :: [FileMode]
- Propellor.Property.Cron: runPropellor :: Times -> Property DebianLike
+ Propellor.Property.Cron: runPropellor :: Times -> RevertableProperty DebianLike UnixLike

Files

CHANGELOG view
@@ -1,3 +1,26 @@+propellor (5.7.0) unstable; urgency=medium++  * Sbuild.built no longer includes Apt.stdSourcesList by default,+    in order to support non-Debian OS's. (API change)+    To upgrade: Simply add Sbuild.osDebianStandard to all Sbuild.built+    calls which have osDebian.+    Thanks, Sean Whitton+  * Propellor.Property.PropellorRepo renamed to Propellor.Property.Localdir+    to widen its scope. (API change)+  * Added Localdir.removed property.+    Thanks, Sean Whitton+  * Sbuild.built uses Localdir.removed to clean up the propellor localdir+    after it's done running in a schroot.+    Thanks, Sean Whitton+  * Cron.runPropellor made revertable. (minor API change)+    Thanks, Sean Whitton+  * Added Cron.jobDropped.+    Thanks, Sean Whitton+  * Added Utility.FileMode to the modules exported by Propellor.Utilities+    to propellor library users.++ -- Joey Hess <id@joeyh.name>  Fri, 05 Apr 2019 11:59:52 -0400+ propellor (5.6.1) unstable; urgency=medium    * fix Libvirt.hs haddock build
debian/changelog view
@@ -1,3 +1,26 @@+propellor (5.7.0) unstable; urgency=medium++  * Sbuild.built no longer includes Apt.stdSourcesList by default,+    in order to support non-Debian OS's. (API change)+    To upgrade: Simply add Sbuild.osDebianStandard to all Sbuild.built+    calls which have osDebian.+    Thanks, Sean Whitton+  * Propellor.Property.PropellorRepo renamed to Propellor.Property.Localdir+    to widen its scope. (API change)+  * Added Localdir.removed property.+    Thanks, Sean Whitton+  * Sbuild.built uses Localdir.removed to clean up the propellor localdir+    after it's done running in a schroot.+    Thanks, Sean Whitton+  * Cron.runPropellor made revertable. (minor API change)+    Thanks, Sean Whitton+  * Added Cron.jobDropped.+    Thanks, Sean Whitton+  * Added Utility.FileMode to the modules exported by Propellor.Utilities+    to propellor library users.++ -- Joey Hess <id@joeyh.name>  Fri, 05 Apr 2019 11:59:52 -0400+ propellor (5.6.1) unstable; urgency=medium    * fix Libvirt.hs haddock build
joeyconfig.hs view
@@ -71,6 +71,7 @@ 	& Laptop.trimSSD 	& Grub.cmdline_Linux_default "i915.enable_psr=1" 	! Grub.cmdline_Linux_default "quiet"+	& User.hasGroup (User "joey") (Group "dialout")  	& JoeySites.dkimMilter 	& JoeySites.postfixSaslPasswordClient@@ -184,7 +185,7 @@ 			`setSize` MegaBytes 16000 		) 	& JoeySites.cubieTruckOneWire-	+	& Systemd.persistentJournal 	& Apt.installed ["firmware-atheros"] 	& Apt.serviceInstalledRunning "ntp" -- no hardware clock 	& bootstrappedFrom GitRepoOutsideChroot@@ -259,7 +260,7 @@ 		] 		[ Borg.KeepDays 7 		, Borg.KeepWeeks 4-		, Borg.KeepMonths 6+		, Borg.KeepMonths 3 		] 		`requires` Ssh.knownHost hosts "usw-s002.rsync.net" (User "root") 		`requires` Ssh.userKeys (User "root")
propellor.cabal view
@@ -1,5 +1,5 @@ Name: propellor-Version: 5.6.1+Version: 5.7.0 Cabal-Version: 1.20 License: BSD2 Maintainer: Joey Hess <id@joeyh.name>@@ -104,6 +104,7 @@     Propellor.Property.Libvirt     Propellor.Property.List     Propellor.Property.LightDM+    Propellor.Property.Localdir     Propellor.Property.Locale     Propellor.Property.Logcheck     Propellor.Property.Lvm@@ -120,7 +121,6 @@     Propellor.Property.Parted.Types     Propellor.Property.Partition     Propellor.Property.Postfix-    Propellor.Property.PropellorRepo     Propellor.Property.Prosody     Propellor.Property.Qemu     Propellor.Property.Reboot
src/Propellor/Git/VerifiedBranch.hs view
@@ -3,7 +3,6 @@ import Propellor.Base import Propellor.Git import Propellor.PrivData.Paths-import Utility.FileMode  {- To verify origin branch commit's signature, have to convince gpg  - to use our keyring while running git verify-tag.
src/Propellor/Property/Bootstrap.hs view
@@ -15,7 +15,6 @@ import Propellor.Types.Info import Propellor.Property.Chroot import Propellor.PrivData.Paths-import Utility.FileMode  import Data.List import qualified Data.ByteString as B
src/Propellor/Property/Ccache.hs view
@@ -11,7 +11,6 @@ import qualified Propellor.Property.File as File import qualified Propellor.Property.Apt as Apt -import Utility.FileMode import Utility.DataUnits import System.Posix.Files import qualified Data.Semigroup as Sem
src/Propellor/Property/Cron.hs view
@@ -1,10 +1,15 @@-module Propellor.Property.Cron where+module Propellor.Property.Cron (+	Times(..),+	job,+	niceJob,+	jobDropped,+	Propellor.Property.Cron.runPropellor+) where  import Propellor.Base import qualified Propellor.Property.File as File import qualified Propellor.Property.Apt as Apt import Propellor.Bootstrap-import Utility.FileMode  import Data.Char @@ -31,7 +36,7 @@ job desc times (User u) cddir command = combineProperties ("cronned " ++ desc) $ props 	& Apt.serviceInstalledRunning "cron" 	& Apt.installed ["util-linux", "moreutils"]-	& cronjobfile `File.hasContent`+	& cronjobfile desc times `File.hasContent` 		[ case times of 			Times _ -> "" 			_ -> "#!/bin/sh\nset -e"@@ -41,47 +46,74 @@ 		, "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" 		, "" 		, case times of-			Times t -> t ++ "\t" ++ u ++ "\tchronic " ++ shellEscape scriptfile+			Times t -> t ++ "\t" ++ u ++ "\tchronic "+				++ shellEscape (scriptfile desc) 			_ -> case u of-				"root" -> "chronic " ++ shellEscape scriptfile-				_ -> "chronic su " ++ u ++ " -c " ++ shellEscape scriptfile+				"root" -> "chronic " ++ shellEscape (scriptfile desc)+				_ -> "chronic su " ++ u ++ " -c "+					++ shellEscape (scriptfile desc) 		] 	& case times of 		Times _ -> doNothing-		_ -> cronjobfile `File.mode` combineModes (readModes ++ executeModes)+		_ -> (cronjobfile desc times)+			`File.mode` combineModes (readModes ++ executeModes) 	-- Use a separate script because it makes the cron job name 	-- prettier in emails, and also allows running the job manually.-	& scriptfile `File.hasContent`+	& scriptfile desc `File.hasContent` 		[ "#!/bin/sh" 		, "# Generated by propellor" 		, "set -e"-		, "flock -n " ++ shellEscape cronjobfile+		, "flock -n " ++ shellEscape (cronjobfile desc times) 			++ " sh -c " ++ shellEscape cmdline 		]-	& scriptfile `File.mode` combineModes (readModes ++ executeModes)+	& scriptfile desc `File.mode` combineModes (readModes ++ executeModes)   where 	cmdline = "cd " ++ cddir ++ " && ( " ++ command ++ " )"-	cronjobfile = "/etc" </> cronjobdir </> name-	cronjobdir = case times of-		Times _ -> "cron.d"-		Daily -> "cron.daily"-		Weekly -> "cron.weekly"-		Monthly -> "cron.monthly"-	scriptfile = "/usr/local/bin/" ++ name ++ "_cronjob"-	name = map sanitize desc-	sanitize c-		| isAlphaNum c = c-		| otherwise = '_' +-- | Removes a cron job created by 'job' or 'niceJob', as identified by the+-- 'Desc' passed to those properties when the cronjob was set up+--+-- Those properties are not revertable because simply removing a cronjob does+-- not undo the changes it might have made to the system, i.e., 'jobDropped' is+-- not in the general case a reversion of 'job' or 'niceJob'+jobDropped :: Desc -> Times -> Property UnixLike+jobDropped desc times = combineProperties ("uncronned " ++ desc) $ props+	& File.notPresent (scriptfile desc)+	& File.notPresent (cronjobfile desc times)+ -- | Installs a cron job, and runs it niced and ioniced. niceJob :: Desc -> Times -> User -> FilePath -> String -> Property DebianLike niceJob desc times user cddir command = job desc times user cddir 	("nice ionice -c 3 sh -c " ++ shellEscape command)  -- | Installs a cron job to run propellor.-runPropellor :: Times -> Property DebianLike-runPropellor times = withOS "propellor cron job" $ \w o -> do-	bootstrapper <- getBootstrapper-	ensureProperty w $-		niceJob "propellor" times (User "root") localdir-			(bootstrapPropellorCommand bootstrapper o ++ "; ./propellor")+runPropellor :: Times -> RevertableProperty DebianLike UnixLike+runPropellor times = cronned <!> uncronned+  where+	cronned = withOS "propellor cron job" $ \w o -> do+		bootstrapper <- getBootstrapper+		ensureProperty w $+			niceJob "propellor" times (User "root") localdir+				(bootstrapPropellorCommand bootstrapper o ++ "; ./propellor")+	uncronned = jobDropped "propellor" times++-- Utility functions++cronjobname :: Desc -> String+cronjobname d = map sanitize d+  where+	sanitize c+		| isAlphaNum c = c+		| otherwise = '_'++scriptfile :: Desc -> FilePath+scriptfile d = "/usr/local/bin/" ++ (cronjobname d) ++ "_cronjob"++cronjobfile :: Desc -> Times -> FilePath+cronjobfile d times = "/etc" </> cronjobdir </> (cronjobname d)+  where+	cronjobdir = case times of+		Times _ -> "cron.d"+		Daily -> "cron.daily"+		Weekly -> "cron.weekly"+		Monthly -> "cron.monthly"
src/Propellor/Property/Debootstrap.hs view
@@ -15,7 +15,6 @@ import Propellor.Property.Chroot.Util import Propellor.Property.Qemu import Utility.Path-import Utility.FileMode  import Data.List import Data.Char
src/Propellor/Property/DiskImage.hs view
@@ -42,7 +42,6 @@ import Propellor.Types.Bootloader import Propellor.Container import Utility.Path-import Utility.FileMode import Utility.DataUnits  import Data.List (isPrefixOf, isInfixOf, sortBy, unzip4)
src/Propellor/Property/File.hs view
@@ -3,7 +3,6 @@ module Propellor.Property.File where  import Propellor.Base-import Utility.FileMode  import qualified Data.ByteString.Lazy as L import Data.List (isInfixOf, isPrefixOf)
src/Propellor/Property/HostingProvider/Linode.hs view
@@ -3,7 +3,6 @@ import Propellor.Base import qualified Propellor.Property.Grub as Grub import qualified Propellor.Property.File as File-import Utility.FileMode  -- | Configures grub to use the serial console as set up by Linode. -- Useful when running a distribution supplied kernel.
+ src/Propellor/Property/Localdir.hs view
@@ -0,0 +1,61 @@+{-# LANGUAGE DeriveDataTypeable #-}++-- | Properties to manipulate propellor's @/usr/local/propellor@ on spun hosts++module Propellor.Property.Localdir where++import Propellor.Base+import Propellor.Git.Config+import Propellor.Types.Info+import Propellor.Property.Chroot (inChroot)+import Propellor.Property.Mount (partialBindMountsOf, umountLazy)++-- | Sets the url to use as the origin of propellor's git repository.+--+-- By default, the url is taken from the deploy or origin remote of+-- the repository that propellor --spin is run in. Setting this property+-- overrides that default behavior with a different url.+--+-- When hosts are being updated without using -- --spin, eg when using+-- the `Propellor.Property.Cron.runPropellor` cron job, this property can+-- be set to redirect them to a new git repository url.+hasOriginUrl :: String -> Property (HasInfo + UnixLike)+hasOriginUrl u = setInfoProperty p (toInfo (InfoVal (OriginUrl u)))+  where+	p :: Property UnixLike+	p = property ("propellor repo url " ++ u) $ do+		curru <- liftIO getRepoUrl+		if curru == Just u+			then return NoChange+			else makeChange $ setRepoUrl u++newtype OriginUrl = OriginUrl String+	deriving (Show, Typeable)++-- | Removes the @/usr/local/propellor@ directory used to spin the host, after+-- ensuring other properties.  Without this property, that directory is left+-- behind after the spin.+--+-- Does not perform other clean up, such as removing Haskell libraries that were+-- installed in order to build propellor, or removing cronjobs such as created+-- by 'Propellor.Property.Cron.runPropellor'.+removed :: Property UnixLike+removed = check (doesDirectoryExist localdir) $+	property "propellor's /usr/local dir to be removed" $ do+		endAction "removing /usr/local/propellor" atend+		return NoChange+  where+	atend _ = do+		ifM inChroot+			-- In a chroot, all we have to do is unmount localdir,+			-- and then delete it+			( liftIO $ umountLazy localdir+			-- Outside of a chroot, if we don't unmount any bind+			-- mounts of localdir before deleting it, another run of+			-- propellor will have problems reestablishing those+			-- bind mounts in order to spin chroots+			, liftIO $ partialBindMountsOf localdir+				>>= mapM_ umountLazy+			)+		liftIO $ removeDirectoryRecursive localdir+		return NoChange
src/Propellor/Property/Mount.hs view
@@ -89,6 +89,20 @@ 	. filter (dirContains target) 	<$> mountPoints +-- | Get mountpoints which are bind mounts of subdirectories of mounted+-- filesystems+--+-- E.g. as created by @mount --bind /etc/foo /etc/bar@ where @/etc/foo@ is not+-- itself a mount point, but just a subdirectory.  These are sometimes known as+-- "partial bind mounts"+partialBindMountsOf :: FilePath -> IO [MountPoint]+partialBindMountsOf sourceDir =+	map (drop 2 . dropWhile (/= ']')) . filter getThem . lines+	<$> readProcess "findmnt" ["-rn", "--output", "source,target"]+  where+	getThem l = bracketed `isSuffixOf` (takeWhile (/= ' ') l)+	bracketed = "[" ++ sourceDir ++ "]"+ -- | Filesystem type mounted at a given location. getFsType :: MountPoint -> IO (Maybe FsType) getFsType p = findmntField "fstype" [p]
src/Propellor/Property/Openssl.hs view
@@ -5,9 +5,7 @@ import Propellor.Base import qualified Propellor.Property.Apt as Apt import qualified Propellor.Property.File as File-import Utility.FileMode import Utility.SafeCommand-  installed :: Property DebianLike installed = Apt.installed ["openssl"]
− src/Propellor/Property/PropellorRepo.hs
@@ -1,29 +0,0 @@-{-# LANGUAGE DeriveDataTypeable #-}--module Propellor.Property.PropellorRepo where--import Propellor.Base-import Propellor.Git.Config-import Propellor.Types.Info---- | Sets the url to use as the origin of propellor's git repository.------ By default, the url is taken from the deploy or origin remote of--- the repository that propellor --spin is run in. Setting this property--- overrides that default behavior with a different url.------ When hosts are being updated without using -- --spin, eg when using--- the `Propellor.Property.Cron.runPropellor` cron job, this property can--- be set to redirect them to a new git repository url.-hasOriginUrl :: String -> Property (HasInfo + UnixLike)-hasOriginUrl u = setInfoProperty p (toInfo (InfoVal (OriginUrl u)))-  where-	p :: Property UnixLike-	p = property ("propellor repo url " ++ u) $ do-		curru <- liftIO getRepoUrl-		if curru == Just u-			then return NoChange-			else makeChange $ setRepoUrl u--newtype OriginUrl = OriginUrl String-	deriving (Show, Typeable)
src/Propellor/Property/Sbuild.hs view
@@ -29,6 +29,7 @@ >    where >  	sidSchrootBuilt = Sbuild.built Sbuild.UseCcache $ props >  		& osDebian Unstable X86_32+>  		& Sbuild.osDebianStandard >  		& Sbuild.update `period` Weekly (Just 1) >  		& Sbuild.useHostProxy mybox @@ -65,6 +66,7 @@ 	-- * Properties for use inside sbuild schroots 	update, 	useHostProxy,+	osDebianStandard, 	-- * Global sbuild configuration 	-- blockNetwork, 	keypairGenerated,@@ -86,8 +88,8 @@ -- import qualified Propellor.Property.Firewall as Firewall import qualified Propellor.Property.Schroot as Schroot import qualified Propellor.Property.Reboot as Reboot+import qualified Propellor.Property.Localdir as Localdir import qualified Propellor.Property.User as User-import Utility.FileMode  import Data.List @@ -222,8 +224,11 @@ 	schroot = Chroot.debootstrapped Debootstrap.BuilddD 			schrootRoot (Props schrootProps) 	schrootProps =-		ps ++ [toChildProperty Apt.stdSourcesList-		, toChildProperty $ Apt.installed ["eatmydata", "ccache"]]+		ps ++ [toChildProperty $ Apt.installed ["eatmydata", "ccache"]+		-- Drop /usr/local/propellor since build chroots should be+		-- clean.  Note that propellor does not have to install its+		-- build-deps into the chroot, so this is sufficient cleanup+		, toChildProperty $ Localdir.removed]  	-- static values 	suiteArch = suite ++ "-" ++ arch@@ -250,6 +255,12 @@ 		_ -> base 	  where 		base = ["eatmydata"]++-- | Properties that will be wanted in almost any Debian schroot, but not in+-- schroots for other operating systems.+osDebianStandard :: Property Debian+osDebianStandard = propertyList "standard Debian sbuild properties" $ props+	& Apt.stdSourcesList  -- | Ensure that an sbuild schroot's packages and apt indexes are updated --
src/Propellor/Property/Schroot.hs view
@@ -9,8 +9,6 @@ import qualified Propellor.Property.File as File import qualified Propellor.Property.Apt as Apt -import Utility.FileMode- data UseOverlays = UseOverlays deriving (Eq, Show, Typeable)  -- | Indicate that a schroots on a host should use @union-type=overlay@
src/Propellor/Property/Service.hs view
@@ -5,7 +5,6 @@ import Propellor.Base import Propellor.Types.Info import qualified Propellor.Property.File as File-import Utility.FileMode  type ServiceName = String 
src/Propellor/Property/SiteSpecific/Branchable.hs view
@@ -56,7 +56,7 @@ 	 	] 	 	[ Borg.KeepDays 7 	 	, Borg.KeepWeeks 5-	 	, Borg.KeepMonths 12+	 	, Borg.KeepMonths 3 	 	, Borg.KeepYears 1 	 	] 	& Ssh.userKeys (User "root") (Context "branchable.com")
src/Propellor/Property/SiteSpecific/JoeySites.hs view
@@ -25,7 +25,6 @@ import qualified Propellor.Property.Fail2Ban as Fail2Ban import qualified Propellor.Property.LetsEncrypt as LetsEncrypt import qualified Propellor.Property.Mount as Mount-import Utility.FileMode import Utility.Split  import Data.List@@ -345,13 +344,7 @@ 		"tmp.joeyh.name" 		"26fd6e38-1226-11e2-a75f-ff007033bdba" 		[]-	& pumpRss---- Work around for expired ssl cert.--- (Obsolete; need to revert this.)-pumpRss :: Property DebianLike-pumpRss = Cron.job "pump rss" (Cron.Times "15 * * * *") (User "joey") "/srv/web/tmp.joeyh.name/"-	"wget https://pump2rss.com/feed/joeyh@identi.ca.atom -O pump.atom.new --no-check-certificate 2>/dev/null; sed 's/ & / /g' pump.atom.new > pump.atom"+	& Cron.jobDropped "pump rss" (Cron.Times "15 * * * *")  ircBouncer :: Property (HasInfo + DebianLike) ircBouncer = propertyList "IRC bouncer" $ props@@ -1162,7 +1155,7 @@ 	, "w3m", "sm", "weechat" 	, "borgbackup", "wipe", "smartmontools", "libgfshare-bin" 	, "units"-	, "virtualbox", "qemu-kvm"+	, "virtualbox", "virtualbox-guest-additions-iso", "qemu-kvm" 	] 	`requires` baseSoftware 	`requires` devSoftware
src/Propellor/Property/Ssh.hs view
@@ -40,7 +40,6 @@ import qualified Propellor.Property.Apt as Apt import Propellor.Property.User import Propellor.Types.Info-import Utility.FileMode  import System.PosixCompat import qualified Data.Map as M
src/Propellor/Property/Systemd.hs view
@@ -55,7 +55,6 @@ import qualified Propellor.Property.Apt as Apt import qualified Propellor.Property.File as File import Propellor.Property.Systemd.Core-import Utility.FileMode import Utility.Split  import Data.List
src/Propellor/Property/Tor.hs view
@@ -7,7 +7,6 @@ import qualified Propellor.Property.Apt as Apt import qualified Propellor.Property.Service as Service import qualified Propellor.Property.ConfFile as ConfFile-import Utility.FileMode import Utility.DataUnits  import System.Posix.Files
src/Propellor/Shim.hs view
@@ -8,7 +8,6 @@  import Propellor.Base import Utility.LinuxMkLibs-import Utility.FileMode  import Data.List import System.Posix.Files
src/Propellor/Spin.hs view
@@ -29,9 +29,8 @@ import Propellor.Bootstrap import Propellor.Types.CmdLine import Propellor.Types.Info-import Propellor.Property.PropellorRepo (OriginUrl(..))+import Propellor.Property.Localdir (OriginUrl(..)) import qualified Propellor.Shim as Shim-import Utility.FileMode import Utility.SafeCommand import Utility.Process.NonConcurrent 
src/Propellor/Utilities.hs view
@@ -19,6 +19,7 @@ 	, module Utility.Tmp.Dir 	, module Utility.Monad 	, module Utility.Misc+	, module Utility.FileMode ) where  import Utility.PartialPrelude@@ -33,3 +34,4 @@ import Utility.Tmp.Dir import Utility.Monad import Utility.Misc+import Utility.FileMode