OnRmt-1.0.0.0: sample/GetRemotes.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
module GetRemotes where
import Data.List
import Data.Maybe
import qualified Data.Text as T
import Control.Concurrent
import Network.OnRmt (WorkEntry(..), WorkGroup(..), WorkItems(..))
data EntryData = EData T.Text (Maybe T.Text) [T.Text]
data Entry a = EGroup T.Text (Entry a) | EList [a] | Entry a :++: Entry a
summarize (EData n _ is) = T.intercalate "\n" $ n : is
identifyEnt (EData n ma is) _ = n
`T.append` maybe "" (\a -> " @ " `T.append` a) ma
`T.append` if null is then "" else " -- " `T.append` head is
nameEnt (EData n _ _) = n
getEntries :: IO (Entry EntryData)
getEntries = return $
(EGroup "Server" $ EGroup "Dev" $
EList [ EData "serverhost01" Nothing ["x86_64 dev host"
,"in dev lab"]
, EData "serverhost02" Nothing ["AMD dev host"
,"dev Lab"]
, EData "serverhost03" Nothing ["x32 dev host"
,"dev Lab"]
])
:++: (EGroup "Server" $ EGroup "Test" $
EList [ EData "testhost01" Nothing ["TEST/QA host"]
, EData "testhost02" Nothing ["TEST/QA host"]
])
:++: (EGroup "Server" $ EGroup "PROD" $
EList [ EData "host01" Nothing ["Zone1 PRODUCTION host"
,"Canada Datacenter"]
, EData "host02" Nothing ["Zone2 PRODUCTION host"
,"England Datacenter"]
, EData "host03" Nothing ["Zone3 PRODUCTION host"
,"Singapore Datacenter"]
])
:++: (EGroup "DBase" $ EGroup "PROD" $
EList [EData "dbs001.prod.company.co"
Nothing ["MySQL Controller"]])
:++: (EGroup "DBase" $ EGroup "PROD" $
(EGroup "Linux" $
EList [ EData "dbs002"
(Just "dbs001.prod.company.co")
["MySQL Primary Node"]
, EData "dbs003" (Just "127.0.0.1") ["DB Node"]
, EData "dbs004" (Just "127.0.0.1") ["DB Node"]
, EData "dbs005" (Just "127.0.0.1") ["DB Node"]])
:++: (EGroup "Windows" $
EList [ EData "mssql01.prod.company.co" Nothing ["MSSQL Node"]
, EData "mssql02.prod.company.co" Nothing ["MSSQL Node"]
, EData "mssql01b" (Just "127.0.0.1") ["MSSQL Standby Node"]
, EData "mssql02b" (Just "localhost") ["MSSQL Standby Node"]]))
:++: (EGroup "WebServer" $ EGroup "Prod" $
(EGroup "WestCoast" $
EList [ EData "websrv-3" (Just "websrv-3") ["WebServer Node"]
, EData "websrv-4" (Just "websrv-4") ["WebServer Node"]
, EData "websrv008" (Just "websrv008") ["WebServer Node"]
, EData "webserv009" (Just "websrv009") ["WebServer Node"]])
:++: (EGroup "EastCoast" $
EList [ EData "websrvec001" (Just "websrvec001") ["WebServer Node"]
, EData "websrvec002" (Just "websrvec002") ["WebServer Node"]
, EData "websrvec19" (Just "websrvec19") ["WebServer Node"]
]))
:++: (EList (EData "localhost" Nothing ["Current system"]
: map (\n -> EData (T.append "Host#" $ T.pack $ show n) (Just "localhost") []) [1..255]))
segregate :: Entry a -> [WorkItems]
segregate (EList ls) = [WorkItems $ length ls]
segregate (EGroup g e) = map (WorkGroup g) $ segregate e
segregate (a :++: b) = segregate a ++ segregate b
cntEntries :: Entry a -> Int
cntEntries (EList ls) = length ls
cntEntries (EGroup _ g) = cntEntries g
cntEntries (a :++: b) = cntEntries a + cntEntries b
entryNum :: Entry a -> Int -> a
entryNum es n = either id (error "Invalid Entry #") $ eNum (Right n) es
where eNum rem (EList ls) = rem >>= \n -> if n >= length ls
then Right (n - length ls)
else Left (ls !! n)
eNum rem (EGroup _ s) = eNum rem s
eNum rem (a :++: b) = eNum (eNum rem a) b
instance WorkEntry EntryData where
name = nameEnt
identify = identifyEnt
rmtaddr (EData n ma _) = maybe n id ma
instance WorkEntry a => WorkGroup (Entry a) where
type GroupEntry (Entry a) = a
getItems = segregate
numEntries = cntEntries
getEntry = entryNum