summaryrefslogtreecommitdiff
path: root/src/Propellor/PrivData.hs
diff options
context:
space:
mode:
authorJoey Hess2015-01-15 20:15:01 -0400
committerJoey Hess2015-01-15 20:15:01 -0400
commitc7609c824ba1ce7cdcdf9c646b721db80333f04b (patch)
treed35862ed87d9b61d73d45013085642dc1c0fa2d7 /src/Propellor/PrivData.hs
parentee7135dbfd87c1be06ce7777e9e21fd6548c420e (diff)
Add descriptions of how to set missing fields to --list-fields output. (Minor API changes)
Diffstat (limited to 'src/Propellor/PrivData.hs')
-rw-r--r--src/Propellor/PrivData.hs52
1 files changed, 32 insertions, 20 deletions
diff --git a/src/Propellor/PrivData.hs b/src/Propellor/PrivData.hs
index 6643d81d..53d5fdba 100644
--- a/src/Propellor/PrivData.hs
+++ b/src/Propellor/PrivData.hs
@@ -82,20 +82,24 @@ withPrivData' feed srclist c mkprop = addinfo $ mkprop $ \a ->
Context cname <- mkHostContext hc <$> asks hostName
warningMessage $ "Missing privdata " ++ intercalate " or " fieldnames ++ " (for " ++ cname ++ ")"
liftIO $ putStrLn $ "Fix this by running:"
- liftIO $ forM_ srclist $ \src -> do
- putStrLn $ " propellor --set '" ++ show (privDataField src) ++ "' '" ++ cname ++ "' \\"
- maybe noop (\d -> putStrLn $ " " ++ d) (describePrivDataSource src)
- putStrLn ""
+ liftIO $ showSet $
+ map (\s -> (privDataField s, Context cname, describePrivDataSource s)) srclist
return FailedChange
- addinfo p = p { propertyInfo = propertyInfo p <> mempty { _privDataFields = fieldset } }
+ addinfo p = p { propertyInfo = propertyInfo p <> mempty { _privData = privset } }
+ privset = S.fromList $ map (\s -> (privDataField s, describePrivDataSource s, hc)) srclist
fieldnames = map show fieldlist
- fieldset = S.fromList $ zip fieldlist (repeat hc)
fieldlist = map privDataField srclist
hc = asHostContext c
-addPrivDataField :: (PrivDataField, HostContext) -> Property
-addPrivDataField v = pureInfoProperty (show v) $
- mempty { _privDataFields = S.singleton v }
+showSet :: [(PrivDataField, Context, Maybe PrivDataSourceDesc)] -> IO ()
+showSet l = forM_ l $ \(f, Context c, md) -> do
+ putStrLn $ " propellor --set '" ++ show f ++ "' '" ++ c ++ "' \\"
+ maybe noop (\d -> putStrLn $ " " ++ d) md
+ putStrLn ""
+
+addPrivData :: (PrivDataField, Maybe PrivDataSourceDesc, HostContext) -> Property
+addPrivData v = pureInfoProperty (show v) $
+ mempty { _privData = S.singleton v }
{- Gets the requested field's value, in the specified context if it's
- available, from the host's local privdata cache. -}
@@ -111,8 +115,8 @@ type PrivMap = M.Map (PrivDataField, Context) PrivData
filterPrivData :: Host -> PrivMap -> PrivMap
filterPrivData host = M.filterWithKey (\k _v -> S.member k used)
where
- used = S.map (\(f, c) -> (f, mkHostContext c (hostName host))) $
- _privDataFields $ hostInfo host
+ used = S.map (\(f, _, c) -> (f, mkHostContext c (hostName host))) $
+ _privData $ hostInfo host
getPrivData :: PrivDataField -> Context -> PrivMap -> Maybe PrivData
getPrivData field context = M.lookup (field, context)
@@ -142,10 +146,17 @@ editPrivData field context = do
listPrivDataFields :: [Host] -> IO ()
listPrivDataFields hosts = do
m <- decryptPrivData
- showtable "Currently set data:" $
- map mkrow (M.keys m)
- showtable "Data that would be used if set:" $
- map mkrow (M.keys $ M.difference wantedmap m)
+
+ section "Currently set data:"
+ showtable $ map mkrow (M.keys m)
+ let missing = M.keys $ M.difference wantedmap m
+
+ unless (null missing) $ do
+ section "Missing data that would be used if set:"
+ showtable $ map mkrow missing
+
+ section "How to set missing data:"
+ showSet $ map (\(f, c) -> (f, c, join $ M.lookup (f, c) descmap)) missing
where
header = ["Field", "Context", "Used by"]
mkrow k@(field, (Context context)) =
@@ -153,12 +164,13 @@ listPrivDataFields hosts = do
, shellEscape context
, intercalate ", " $ sort $ fromMaybe [] $ M.lookup k usedby
]
- mkhostmap host = M.fromList $ map (\(f, c) -> ((f, mkHostContext c (hostName host)), [hostName host])) $
- S.toList $ _privDataFields $ hostInfo host
- usedby = M.unionsWith (++) $ map mkhostmap hosts
+ mkhostmap host mkv = M.fromList $ map (\(f, d, c) -> ((f, mkHostContext c (hostName host)), mkv d)) $
+ S.toList $ _privData $ hostInfo host
+ usedby = M.unionsWith (++) $ map (\h -> mkhostmap h $ const $ [hostName h]) hosts
wantedmap = M.fromList $ zip (M.keys usedby) (repeat "")
- showtable desc rows = do
- putStrLn $ "\n" ++ desc
+ descmap = M.unions $ map (\h -> mkhostmap h id) hosts
+ section desc = putStrLn $ "\n" ++ desc
+ showtable rows = do
putStr $ unlines $ formatTable $ tableWithHeader header rows
setPrivDataTo :: PrivDataField -> Context -> PrivData -> IO ()