summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoey Hess2015-04-02 10:20:44 -0400
committerJoey Hess2015-04-02 10:20:44 -0400
commit86783dc52d048418439019067a0a1afccd4829d1 (patch)
tree392e55d1b1abecf0dab5e4b0ecec3a9359d0f6e0 /src
parent015b249c6672527dce31a61610358ccbb46f3b46 (diff)
Make propellor resistent to changes to shared libraries, such as libffi
* Make propellor resistent to changes to shared libraries, such as libffi, which might render the propellor binary unable to run. This is dealt with by checking the binary both when running propellor on a remote host, and by Cron.runPropellor. If the binary doesn't work, it will be rebuilt. * Note that since a new switch had to be added to allow testing the binary, upgrading to this version will cause a rebuild from scratch of propellor.
Diffstat (limited to 'src')
-rw-r--r--src/Propellor/Bootstrap.hs21
-rw-r--r--src/Propellor/CmdLine.hs3
-rw-r--r--src/Propellor/Property/Cron.hs4
-rw-r--r--src/Propellor/Types/CmdLine.hs1
4 files changed, 23 insertions, 6 deletions
diff --git a/src/Propellor/Bootstrap.hs b/src/Propellor/Bootstrap.hs
index 214f65d5..b0b4e58a 100644
--- a/src/Propellor/Bootstrap.hs
+++ b/src/Propellor/Bootstrap.hs
@@ -1,5 +1,6 @@
module Propellor.Bootstrap (
bootstrapPropellorCommand,
+ checkBinaryCommand,
installGitCommand,
buildPropellor,
) where
@@ -12,17 +13,27 @@ import Data.List
type ShellCommand = String
--- Shell command line to build propellor, used when bootstrapping on a new
--- host. Should be run inside the propellor config dir, and will install
--- all necessary build dependencies.
+-- Shell command line to ensure propellor is bootstrapped and ready to run.
+-- Should be run inside the propellor config dir, and will install
+-- all necessary build dependencies and build propellor.
bootstrapPropellorCommand :: ShellCommand
-bootstrapPropellorCommand = "if ! test -x ./propellor; then " ++ go ++ "; fi"
+bootstrapPropellorCommand = "if ! test -x ./propellor; then " ++ go ++ "; fi;" ++ checkBinaryCommand
where
- go = intercalate " && "
+ go = intercalate " && "
[ depsCommand
, buildCommand
]
+-- Use propellor --check to detect if the local propellor binary has
+-- stopped working (eg due to library changes), and must be rebuilt.
+checkBinaryCommand :: ShellCommand
+checkBinaryCommand = "if test -x ./propellor && ! ./propellor --check; then " ++ go ++ "; fi"
+ where
+ go = intercalate " && "
+ [ "cabal clean"
+ , buildCommand
+ ]
+
buildCommand :: ShellCommand
buildCommand = intercalate " && "
[ "cabal configure"
diff --git a/src/Propellor/CmdLine.hs b/src/Propellor/CmdLine.hs
index 9d7d0d95..1298daf2 100644
--- a/src/Propellor/CmdLine.hs
+++ b/src/Propellor/CmdLine.hs
@@ -33,6 +33,7 @@ usage h = hPutStrLn h $ unlines
, " propellor --list-fields"
, " propellor --merge"
, " propellor --build"
+ , " propellor --check"
]
usageError :: [String] -> IO a
@@ -43,6 +44,7 @@ usageError ps = do
processCmdLine :: IO CmdLine
processCmdLine = go =<< getArgs
where
+ go ("--check":_) = return Check
go ("--spin":ps) = case reverse ps of
(r:"--via":hs) -> Spin
<$> mapM hostname (reverse hs)
@@ -91,6 +93,7 @@ defaultMain hostlist = do
where
go _ (Serialized cmdline) = go True cmdline
go _ (Continue cmdline) = go False cmdline
+ go _ Check = return ()
go _ (Set field context) = setPrivData field context
go _ (Dump field context) = dumpPrivData field context
go _ (Edit field context) = editPrivData field context
diff --git a/src/Propellor/Property/Cron.hs b/src/Propellor/Property/Cron.hs
index 2a28a157..222f3849 100644
--- a/src/Propellor/Property/Cron.hs
+++ b/src/Propellor/Property/Cron.hs
@@ -3,6 +3,7 @@ module Propellor.Property.Cron where
import Propellor
import qualified Propellor.Property.File as File
import qualified Propellor.Property.Apt as Apt
+import Propellor.Bootstrap
import Utility.SafeCommand
import Utility.FileMode
@@ -81,4 +82,5 @@ niceJob desc times user cddir command = job desc times user cddir
-- | Installs a cron job to run propellor.
runPropellor :: Times -> Property NoInfo
-runPropellor times = niceJob "propellor" times "root" localdir "./propellor"
+runPropellor times = niceJob "propellor" times "root" localdir
+ (bootstrapPropellorCommand ++ "; ./propellor")
diff --git a/src/Propellor/Types/CmdLine.hs b/src/Propellor/Types/CmdLine.hs
index b8f488a4..bd0cbdfd 100644
--- a/src/Propellor/Types/CmdLine.hs
+++ b/src/Propellor/Types/CmdLine.hs
@@ -23,5 +23,6 @@ data CmdLine
| DockerChain HostName String
| ChrootChain HostName FilePath Bool Bool
| GitPush Fd Fd
+ | Check
deriving (Read, Show, Eq)