summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--Propellor/CmdLine.hs39
-rw-r--r--Utility/Base64.hs24
-rw-r--r--propellor.cabal9
4 files changed, 37 insertions, 37 deletions
diff --git a/Makefile b/Makefile
index f2996fe3..321a4b47 100644
--- a/Makefile
+++ b/Makefile
@@ -11,7 +11,7 @@ build: deps dist/setup-config
ln -sf dist/build/propellor/propellor
deps:
- @if [ $$(whoami) = root ]; then apt-get -y install gnupg ghc cabal-install libghc-missingh-dev libghc-ansi-terminal-dev libghc-ifelse-dev libghc-unix-compat-dev libghc-hslogger-dev; fi || true
+ @if [ $$(whoami) = root ]; then apt-get -y install gnupg ghc cabal-install libghc-missingh-dev libghc-ansi-terminal-dev libghc-ifelse-dev libghc-unix-compat-dev libghc-hslogger-dev libghc-dataenc-dev; fi || true
dist/setup-config: propellor.cabal
cabal configure
diff --git a/Propellor/CmdLine.hs b/Propellor/CmdLine.hs
index 9217f892..838f85de 100644
--- a/Propellor/CmdLine.hs
+++ b/Propellor/CmdLine.hs
@@ -7,6 +7,7 @@ import System.Exit
import Propellor
import Utility.FileMode
import Utility.SafeCommand
+import Utility.Base64
data CmdLine
= Run HostName
@@ -67,27 +68,17 @@ spin host = do
void $ boolSystem "git" [Param "push"]
privdata <- gpgDecrypt (privDataFile host)
withBothHandles createProcessSuccess (proc "ssh" [user, bootstrapcmd url]) $ \(toh, fromh) -> do
- hPutStrLn stderr "PRE-STATUS"
- hFlush stderr
status <- getstatus fromh `catchIO` error "protocol error"
- hPutStrLn stderr "POST-STATUS"
- hFlush stderr
case status of
NeedKeyRing -> do
- hPutStrLn stderr "SEND-KEYRING"
- hFlush stderr
- s <- readProcess "gpg" $ gpgopts ++ ["--export", "-a"]
+ s <- toB64 readFile keyring
hPutStrLn toh $ toMarked keyringMarker s
HaveKeyRing -> noop
- hPutStrLn stderr "POST-KEYRING"
- hFlush stderr
hPutStrLn toh $ toMarked privDataMarker privdata
- hPutStrLn stderr "POST-PRIVDATA"
- hFlush stderr
hFlush toh
hClose toh
- -- Propigate remaining output.
+ -- Display remaining output.
void $ tryIO $ forever $
putStrLn =<< hGetLine fromh
hClose fromh
@@ -140,29 +131,13 @@ boot props = do
havering <- doesFileExist keyring
putStrLn $ toMarked statusMarker $ show $ if havering then HaveKeyRing else NeedKeyRing
hFlush stdout
- hPutStrLn stderr "SENT STATUS"
- hFlush stderr
reply <- getContents
- hPutStrLn stderr $ "GOT >>" ++ reply ++ "<<"
- hFlush stderr
makePrivDataDir
- hPutStrLn stderr $ "DEBUG 1"
- hFlush stderr
writeFileProtected privDataLocal $ fromMarked privDataMarker reply
- hPutStrLn stderr $ "DEBUG 2"
- hFlush stderr
- let keyringarmored = fromMarked keyringMarker reply
- hPutStrLn stderr $ "DEBUG 3"
- hFlush stderr
- unless (null keyringarmored) $ do
- hPutStrLn stderr $ "DEBUG 4"
- hFlush stderr
- withHandle StdinHandle createProcessSuccess
- (proc "gpg" $ gpgopts ++ ["--import", "-a"]) $ \h -> do
- hPutStr h keyringarmored
- hFlush h
- hPutStrLn stderr $ "READY"
- hFlush stderr
+ let keyringb64 = fromMarked keyringMarker reply
+ case fromB64Maybe keyringb64 of
+ Nothing -> noop
+ Just s -> writeFileProtected keyring s
ensureProperties props
addKey :: String -> IO ()
diff --git a/Utility/Base64.hs b/Utility/Base64.hs
new file mode 100644
index 00000000..0c6c8677
--- /dev/null
+++ b/Utility/Base64.hs
@@ -0,0 +1,24 @@
+{- Simple Base64 access
+ -
+ - Copyright 2011 Joey Hess <joey@kitenet.net>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Utility.Base64 (toB64, fromB64Maybe, fromB64) where
+
+import "dataenc" Codec.Binary.Base64
+import Data.Bits.Utils
+import Control.Applicative
+import Data.Maybe
+
+toB64 :: String -> String
+toB64 = encode . s2w8
+
+fromB64Maybe :: String -> Maybe String
+fromB64Maybe s = w82s <$> decode s
+
+fromB64 :: String -> String
+fromB64 = fromMaybe bad . fromB64Maybe
+ where
+ bad = error "bad base64 encoded data"
diff --git a/propellor.cabal b/propellor.cabal
index 0abc7d7c..0b551c80 100644
--- a/propellor.cabal
+++ b/propellor.cabal
@@ -25,19 +25,19 @@ Description:
Executable propellor
Main-Is: config.hs
- GHC-Options: -Wall
+ GHC-Options: -Wall -XPackageImports
Build-Depends: MissingH, directory, filepath, base >= 4.5, base < 5,
IfElse, process, bytestring, hslogger, unix-compat, ansi-terminal,
- containers
+ containers, dataenc
if (! os(windows))
Build-Depends: unix
Library
- GHC-Options: -Wall
+ GHC-Options: -Wall -XPackageImports
Build-Depends: MissingH, directory, filepath, base >= 4.5, base < 5,
IfElse, process, bytestring, hslogger, unix-compat, ansi-terminal,
- containers
+ containers, dataenc
if (! os(windows))
Build-Depends: unix
@@ -65,6 +65,7 @@ Library
Propellor.Types
Other-Modules:
Utility.Applicative
+ Utility.Base64
Utility.Data
Utility.Directory
Utility.Env