From b04dd1bba833852e22844696ecad365a11248e98 Mon Sep 17 00:00:00 2001 From: joe Date: Mon, 2 May 2016 00:21:02 +0000 Subject: implemented cokiki hosts command to merge cache hosts with etc hosts. --- cokiki.hs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'cokiki.hs') diff --git a/cokiki.hs b/cokiki.hs index 292b0b7..8e6ec35 100644 --- a/cokiki.hs +++ b/cokiki.hs @@ -19,6 +19,7 @@ import System.Exit import System.IO import System.Posix.User import CommandLine +import qualified Hosts usage = unlines [ "cokiki [--chroot=ROOTDIR]" @@ -52,6 +53,9 @@ usage = unlines , "" , " tor Modify /etc/tor/torrc to configure a tor hidden" , " service for email (smtp), ssh, and http ports." + , "" + , " hosts Merge hostnames from /var/cache/kiki/config/hosts" + , " into system file /etc/hosts." ] main = do @@ -62,6 +66,7 @@ main = do ["ssh-server"] -> Just $ sshServer uid <$> Kiki.ㄧchroot <*> Kiki.ㄧhomedir ["strongswan"] -> Just $ strongswan uid <$> Kiki.ㄧchroot <*> Kiki.ㄧhomedir ["tor"] -> Just $ configureTor uid <$> Kiki.ㄧchroot <*> Kiki.ㄧhomedir + ["hosts"] -> Just $ configureHosts uid <$> Kiki.ㄧchroot <*> Kiki.ㄧhomedir _ -> Nothing spec = uncurry fancy Kiki.kikiOptions "" errorQuit msg = do @@ -77,6 +82,7 @@ main = do maybeReadFile :: FilePath -> IO (Maybe L.ByteString) maybeReadFile path = do doesFileExist path >>= bool (return Nothing) (Just <$> L.readFile path) + myWriteFile f bs = do createDirectoryIfMissing True (takeDirectory f) hPutStrLn stderr $ "Writing "++f @@ -212,6 +218,14 @@ configureTor uid root cmn = whenRoot uid root cmn $ do Kiki.importAndRefresh root cmn return () +configureHosts uid root cmn = whenRoot uid root cmn $ do + Kiki.importAndRefresh root cmn + hosts <- Hosts.decode . fromMaybe "" <$> maybeReadFile (root "/etc/hosts") + kikihosts <- Hosts.decode . fromMaybe "" <$> maybeReadFile (root "/var/cache/kiki/config/hosts") + let hosts' = hosts `Hosts.plus` kikihosts + case Hosts.diff hosts hosts' of + [] -> hPutStrLn stderr "kiki hosts are already merged." + _ -> myWriteFile (root "/etc/hosts") $ Hosts.encode hosts' parseSshConfig :: L.ByteString -> [[L.ByteString]] parseSshConfig bs = map tokenize $ L8.lines bs -- cgit v1.2.3