From 39a89b0827fca8a62bb80cf12a5abc75661bdaf9 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 25 Sep 2015 09:24:16 -0400 Subject: Guard against power loss etc when building propellor, by updating the executable atomically. --- src/Propellor/Bootstrap.hs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/Propellor/Bootstrap.hs b/src/Propellor/Bootstrap.hs index 6812b4ab..b2cf5609 100644 --- a/src/Propellor/Bootstrap.hs +++ b/src/Propellor/Bootstrap.hs @@ -104,9 +104,22 @@ build = catchBoolIO $ do 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. + unlessM (boolSystem "cp" [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 -- cgit v1.2.3