OnRmt-1.0.0.0: onrmtssh.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
module Main where
import Brick.Widgets.ProgressBar (progressCompleteAttr)
import Data.List (partition, mapAccumL)
import Data.Monoid
import qualified Data.Text as T
import Graphics.Vty.Attributes ( defAttr, withStyle
, withForeColor, withBackColor
, magenta, cyan
)
import Network.OnRmt
import Network.OnRmt.UI.BrickUI
import Network.SSH.KnownHosts (SSHRemote, readKnownHosts
, targetAddr
, isIPv4Remote, isIPv6Remote
, isDNSRemote
)
import System.Environment
rmtTestAttrs =
[ (progressCompleteAttr
, defAttr `withForeColor` magenta `withBackColor` cyan)
]
params = OnRmtParams { appName = "onrmttest"
, maxParallel = 9
, directSSH = False }
data SSHGroups = SSHGroups { ipv4 :: [SSHRemote]
, ipv6 :: [SSHRemote]
, dns :: [SSHRemote]
, other :: [SSHRemote]
}
getEntries =
do allknown <- readKnownHosts
let (ipv4',not1) = partition isIPv4Remote allknown
(ipv6',not2) = partition isIPv6Remote not1
(dns',other') = partition isDNSRemote not2
return $ SSHGroups ipv4' ipv6' dns' other'
remoteWorkItems :: SSHGroups -> [WorkItems]
remoteWorkItems sshg =
[ WorkGroup "IPv4" (WorkItems $ length $ ipv4 sshg)
, WorkGroup "IPv6" (WorkItems $ length $ ipv6 sshg)
, WorkGroup "DNS" (WorkItems $ length $ dns sshg)
, WorkGroup "Other" (WorkItems $ length $ other sshg)
]
instance WorkEntry SSHRemote where
name = fst . targetAddr
identify r _ = name r
rmtaddr = name
instance WorkGroup SSHGroups where
type GroupEntry SSHGroups = SSHRemote
getItems = remoteWorkItems
numEntries g = sum [ length $ ipv4 g
, length $ ipv6 g
, length $ dns g
, length $ other g
]
getEntry g n =
let l1 = length $ ipv4 g
l2 = length $ ipv6 g
l3 = length $ dns g
l4 = length $ other g
in if n < l1
then ipv4 g !! n
else if n < (l1 + l2)
then ipv6 g !! (n - l1)
else if n < (l1 + l2 + l3)
then dns g !! (n - l1 - l2)
else other g !! (n - l1 - l2 - l3)
main =
do (uiMode, stateGen, s) <- brickUI (appName params) rmtTestAttrs
result <- onRmt getEntries params uiMode stateGen s
putStr "Final status: "
putStrLn $ show result
return ()