diff options
| author | Joey Hess <joeyh@joeyh.name> | 2015-10-16 19:49:49 -0400 |
|---|---|---|
| committer | Joey Hess <joeyh@joeyh.name> | 2015-10-16 19:49:49 -0400 |
| commit | f18304181f59f737f8034f6a5aa69b89829f1785 (patch) | |
| tree | 8036e02a8b4198d6921d600e12070ec7886f170e /src | |
| parent | 2815e00bf87b3a2743b32110a36930c649eab569 (diff) | |
Added --unset-unused
Diffstat (limited to 'src')
| -rw-r--r-- | src/Propellor/CmdLine.hs | 8 | ||||
| -rw-r--r-- | src/Propellor/PrivData.hs | 38 | ||||
| -rw-r--r-- | src/Propellor/Types/CmdLine.hs | 1 |
3 files changed, 38 insertions, 9 deletions
diff --git a/src/Propellor/CmdLine.hs b/src/Propellor/CmdLine.hs index 35929ea7..1225f411 100644 --- a/src/Propellor/CmdLine.hs +++ b/src/Propellor/CmdLine.hs @@ -27,10 +27,12 @@ usage h = hPutStrLn h $ unlines , " propellor --spin targethost [--via relayhost]" , " propellor --add-key keyid" , " propellor --rm-key keyid" - , " propellor --set field context" + , " propellor --list-fields" , " propellor --dump field context" , " propellor --edit field context" - , " propellor --list-fields" + , " propellor --set field context" + , " propellor --unset field context" + , " propellor --unset-unused" , " propellor --merge" , " propellor --build" , " propellor --check" @@ -54,6 +56,7 @@ processCmdLine = go =<< getArgs go ("--rm-key":k:[]) = return $ RmKey k go ("--set":f:c:[]) = withprivfield f c Set go ("--unset":f:c:[]) = withprivfield f c Unset + go ("--unset-unused":[]) = return UnsetUnused go ("--dump":f:c:[]) = withprivfield f c Dump go ("--edit":f:c:[]) = withprivfield f c Edit go ("--list-fields":[]) = return ListFields @@ -98,6 +101,7 @@ defaultMain hostlist = do go _ Check = return () go _ (Set field context) = setPrivData field context go _ (Unset field context) = unsetPrivData field context + go _ (UnsetUnused) = unsetPrivDataUnused hostlist 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 0019730d..a8368e5d 100644 --- a/src/Propellor/PrivData.hs +++ b/src/Propellor/PrivData.hs @@ -9,6 +9,7 @@ module Propellor.PrivData ( addPrivData, setPrivData, unsetPrivData, + unsetPrivDataUnused, dumpPrivData, editPrivData, filterPrivData, @@ -158,7 +159,20 @@ setPrivData field context = do unsetPrivData :: PrivDataField -> Context -> IO () unsetPrivData field context = do modifyPrivData $ M.delete (field, context) - putStrLn "Private data unset." + descUnset field context + +descUnset :: PrivDataField -> Context -> IO () +descUnset field context = + putStrLn $ "Private data unset: " ++ show field ++ " " ++ show context + +unsetPrivDataUnused :: [Host] -> IO () +unsetPrivDataUnused hosts = do + deleted <- modifyPrivData' $ \m -> + let (keep, del) = M.partitionWithKey (\k _ -> k `M.member` usedby) m + in (keep, M.keys del) + mapM_ (uncurry descUnset) deleted + where + usedby = mkUsedByMap hosts dumpPrivData :: PrivDataField -> Context -> IO () dumpPrivData field context = do @@ -199,15 +213,21 @@ listPrivDataFields hosts = do , shellEscape context , intercalate ", " $ sort $ fromMaybe [] $ M.lookup k usedby ] - mkhostmap host mkv = M.fromList $ map (\(f, d, c) -> ((f, mkHostContext c (hostName host)), mkv d)) $ - S.toList $ fromPrivInfo $ getInfo $ hostInfo host - usedby = M.unionsWith (++) $ map (\h -> mkhostmap h $ const [hostName h]) hosts + usedby = mkUsedByMap hosts wantedmap = M.fromList $ zip (M.keys usedby) (repeat "") - descmap = M.unions $ map (`mkhostmap` id) hosts + descmap = M.unions $ map (`mkPrivDataMap` id) hosts section desc = putStrLn $ "\n" ++ desc showtable rows = do putStr $ unlines $ formatTable $ tableWithHeader header rows +mkUsedByMap :: [Host] -> M.Map (PrivDataField, Context) [HostName] +mkUsedByMap = M.unionsWith (++) . map (\h -> mkPrivDataMap h $ const [hostName h]) + +mkPrivDataMap :: Host -> (Maybe PrivDataSourceDesc -> a) -> M.Map (PrivDataField, Context) a +mkPrivDataMap host mkv = M.fromList $ + map (\(f, d, c) -> ((f, mkHostContext c (hostName host)), mkv d)) + (S.toList $ fromPrivInfo $ getInfo $ hostInfo host) + setPrivDataTo :: PrivDataField -> Context -> PrivData -> IO () setPrivDataTo field context (PrivData value) = do modifyPrivData set @@ -216,12 +236,16 @@ setPrivDataTo field context (PrivData value) = do set = M.insert (field, context) value modifyPrivData :: (PrivMap -> PrivMap) -> IO () -modifyPrivData f = do +modifyPrivData f = modifyPrivData' (\m -> (f m, ())) + +modifyPrivData' :: (PrivMap -> (PrivMap, a)) -> IO a +modifyPrivData' f = do makePrivDataDir m <- decryptPrivData - let m' = f m + let (m', r) = f m gpgEncrypt privDataFile (show m') void $ boolSystem "git" [Param "add", File privDataFile] + return r 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 380ac5a8..ca73c902 100644 --- a/src/Propellor/Types/CmdLine.hs +++ b/src/Propellor/Types/CmdLine.hs @@ -17,6 +17,7 @@ data CmdLine | ControlledRun HostName ControllerChain | Set PrivDataField Context | Unset PrivDataField Context + | UnsetUnused | Dump PrivDataField Context | Edit PrivDataField Context | ListFields |
