diff options
author | Joey Hess <joeyh@joeyh.name> | 2016-09-27 13:09:30 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2016-09-27 13:09:30 -0400 |
commit | 8fe65bd0f70c1cd2fc83469f401c987d69eb4370 (patch) | |
tree | 6e37cd1050f7b0b8d59b4198f6843c3faa54dbb9 /keysafe.hs | |
parent | d154002e063c1c3af5aba13cf05a11df8b8f9897 (diff) | |
download | keysafe-8fe65bd0f70c1cd2fc83469f401c987d69eb4370.tar.gz |
Added --check-servers mode, which is useful both at the command line to see what servers keysafe knows about, and as a cron job.
This commit was sponsored by Jake Vosloo on Patreon.
Diffstat (limited to 'keysafe.hs')
-rw-r--r-- | keysafe.hs | 45 |
1 files changed, 45 insertions, 0 deletions
@@ -19,10 +19,14 @@ import Cost import SecretKey import Share import Storage +import Servers import Types.Server import BackupLog import AutoStart +import HTTP import HTTP.Server +import HTTP.Client +import HTTP.ProofOfWork import ServerBackup import qualified Gpg import Data.Maybe @@ -31,10 +35,12 @@ import Data.Time.Calendar import Data.Monoid import Data.List import Control.DeepSeq +import Control.Concurrent.Async import qualified Data.Text as T import qualified Data.ByteString as B import qualified Data.ByteString.UTF8 as BU8 import qualified Data.Set as S +import System.IO import System.Posix.User (userGecos, getUserEntryForID, getEffectiveUserID) main :: IO () @@ -80,6 +86,7 @@ dispatch cmdline ui tunables possibletunables = do go (CmdLine.Chaff hn) _ = storeChaff hn (CmdLine.serverPort (CmdLine.serverConfig cmdline)) (CmdLine.chaffMaxDelay cmdline) + go CmdLine.CheckServers _ = checkServers go CmdLine.Benchmark _ = benchmarkTunables tunables go CmdLine.Test _ = @@ -401,3 +408,41 @@ autoStart cmdline tunables ui = do =<< Gpg.getSecretKey kid else storeBackupLog =<< mkBackupLog (BackupSkipped (GpgKey kid)) + +checkServers :: IO () +checkServers = do + putStrLn $ "Checking " ++ show (length networkServers) ++ " servers concurrently; please wait..." + results <- mapConcurrently check networkServers + mapM_ display results + case filter failed results of + [] -> return () + l + | length l == length networkServers -> + error "Failed to connect to any servers. Perhaps TOR is not running?" + | otherwise -> + error $ "Failed to connect to some servers: " + ++ show (map (sn . fst) l) + where + check s = do + m <- serverRequest' s motd + c <- serverRequest s Left Right NoPOWIdent countObjects + case (m, c) of + (Right (Motd mt), Right (CountResult cr)) -> + return (s, Right (mt, cr)) + (Left e, _) -> return (s, Left e) + (_, Left e) -> return (s, Left e) + (_, Right (CountFailure e)) -> return (s, Left e) + + display (s, v) = do + putStrLn $ "* " ++ sn s ++ " -- " ++ serverDesc s + case v of + Right (mt, cr) -> do + putStrLn $ " MOTD: " ++ T.unpack mt + putStrLn $ " object count: " ++ show cr + Left e -> hPutStrLn stderr $ + " failed to get connect to " ++ sn s ++ ": " ++ e + + failed (_, Left _) = True + failed _ = False + + sn = fromServerName . serverName |