summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debian/changelog1
-rw-r--r--doc/usage.mdwn4
-rw-r--r--src/Propellor/CmdLine.hs2
-rw-r--r--src/Propellor/PrivData.hs21
-rw-r--r--src/Propellor/Types/CmdLine.hs1
5 files changed, 24 insertions, 5 deletions
diff --git a/debian/changelog b/debian/changelog
index 079ecf48..90deb80f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -3,6 +3,7 @@ propellor (2.6.0) UNRELEASED; urgency=medium
* Replace String type synonym Docker.Image by a data type
which allows to specify an image name and an optional tag. (API change)
Thanks, Antoine Eiche.
+ * Added --unset to delete a privdata field.
-- Joey Hess <id@joeyh.name> Tue, 16 Jun 2015 14:49:12 -0400
diff --git a/doc/usage.mdwn b/doc/usage.mdwn
index 4030628f..1c306aa3 100644
--- a/doc/usage.mdwn
+++ b/doc/usage.mdwn
@@ -71,6 +71,10 @@ and configured in haskell.
Sets a field of privdata. The content is read in from stdin.
+* propellor --unset field context
+
+ Removes a value from the privdata store.
+
* propellor --dump field context
Outputs the privdata value to stdout.
diff --git a/src/Propellor/CmdLine.hs b/src/Propellor/CmdLine.hs
index d29ffbb7..95a633ec 100644
--- a/src/Propellor/CmdLine.hs
+++ b/src/Propellor/CmdLine.hs
@@ -51,6 +51,7 @@ processCmdLine = go =<< getArgs
_ -> Spin <$> mapM hostname ps <*> pure Nothing
go ("--add-key":k:[]) = return $ AddKey k
go ("--set":f:c:[]) = withprivfield f c Set
+ go ("--unset":f:c:[]) = withprivfield f c Unset
go ("--dump":f:c:[]) = withprivfield f c Dump
go ("--edit":f:c:[]) = withprivfield f c Edit
go ("--list-fields":[]) = return ListFields
@@ -94,6 +95,7 @@ defaultMain hostlist = do
go _ (Continue cmdline) = go False cmdline
go _ Check = return ()
go _ (Set field context) = setPrivData field context
+ go _ (Unset field context) = unsetPrivData field context
go _ (Dump field context) = dumpPrivData field context
go _ (Edit field context) = editPrivData field context
go _ ListFields = listPrivDataFields hostlist
diff --git a/src/Propellor/PrivData.hs b/src/Propellor/PrivData.hs
index 71aa820d..d0426e75 100644
--- a/src/Propellor/PrivData.hs
+++ b/src/Propellor/PrivData.hs
@@ -6,6 +6,7 @@ module Propellor.PrivData (
withSomePrivData,
addPrivData,
setPrivData,
+ unsetPrivData,
dumpPrivData,
editPrivData,
filterPrivData,
@@ -143,6 +144,11 @@ setPrivData field context = do
putStrLn "Enter private data on stdin; ctrl-D when done:"
setPrivDataTo field context =<< hGetContentsStrict stdin
+unsetPrivData :: PrivDataField -> Context -> IO ()
+unsetPrivData field context = do
+ modifyPrivData $ M.delete (field, context)
+ putStrLn "Private data unset."
+
dumpPrivData :: PrivDataField -> Context -> IO ()
dumpPrivData field context =
maybe (error "Requested privdata is not set.") putStrLn
@@ -192,17 +198,22 @@ listPrivDataFields hosts = do
setPrivDataTo :: PrivDataField -> Context -> PrivData -> IO ()
setPrivDataTo field context value = do
- makePrivDataDir
- m <- decryptPrivData
- let m' = M.insert (field, context) (chomp value) m
- gpgEncrypt privDataFile (show m')
+ modifyPrivData set
putStrLn "Private data set."
- void $ boolSystem "git" [Param "add", File privDataFile]
where
+ set = M.insert (field, context) (chomp value)
chomp s
| end s == "\n" = chomp (beginning s)
| otherwise = s
+modifyPrivData :: (PrivMap -> PrivMap) -> IO ()
+modifyPrivData f = do
+ makePrivDataDir
+ m <- decryptPrivData
+ let m' = f m
+ gpgEncrypt privDataFile (show m')
+ void $ boolSystem "git" [Param "add", File privDataFile]
+
decryptPrivData :: IO PrivMap
decryptPrivData = fromMaybe M.empty . readish <$> gpgDecrypt privDataFile
diff --git a/src/Propellor/Types/CmdLine.hs b/src/Propellor/Types/CmdLine.hs
index bd0cbdfd..96949957 100644
--- a/src/Propellor/Types/CmdLine.hs
+++ b/src/Propellor/Types/CmdLine.hs
@@ -10,6 +10,7 @@ data CmdLine
| Spin [HostName] (Maybe HostName)
| SimpleRun HostName
| Set PrivDataField Context
+ | Unset PrivDataField Context
| Dump PrivDataField Context
| Edit PrivDataField Context
| ListFields