packages feed

Holumbus-Distribution-0.1.0: Programs/PortRegistryDaemon/PortRegistryDaemon.hs

-- ----------------------------------------------------------------------------

{- |
  Module     : Holumbus.PortRegistryDaemon
  Copyright  : Copyright (C) 2009 Sebastian Reese
  License    : MIT

  Maintainer : Sebastian Reese (str@holumbus.org)
  Stability  : experimental
  Portability: portable
  Version    : 0.1

  This module provides the PortRegistryDeamonm, which is the Portregistry and a server console.

  Usage: PortRegistryDaemon PortRegistryPort ConsolePort Logfile

-}

-- ----------------------------------------------------------------------------

module Main(main) where

import           Holumbus.Common.Logging
import           Holumbus.Common.FileHandling
import           Holumbus.Common.Utils
import           Holumbus.Network.Port
import           Holumbus.Network.PortRegistry
import           Holumbus.Network.PortRegistry.PortRegistryData
import qualified Holumbus.Console.ServerConsole as Console
import           System.Environment (getArgs)
import           System.Log.Logger
import           System.Exit

version :: String
version = "Holumbus-PortRegistryDaemon 0.1"

prompt :: String
prompt = "# PortRegistryDaemon > "

localLogger :: String
localLogger = "Holumbus.PortRegistryDaemon"

pUsage :: IO ()
pUsage = do
  putStrLn "Usage: PortRegistryDaemon PortRegistryPort ConsolePort Logfile"

params :: IO [String]
params = do
  args <- getArgs
  if length args /= 3 then do
    errorM localLogger "Wrong argument count"
    pUsage
    exitFailure
    else
      return args

main :: IO ()
main
  = handleAll (\e -> errorM localLogger $ "EXCEPTION: " ++ show e) $ do
    (s_regport:s_cport:logfile:[]) <- params
    initializeFileLogging logfile [(localLogger, INFO),("Holumbus.Network.DoWithServer",INFO),("measure",ERROR)]
    let sn      = "portregistry"
    let regport = Just . fromInteger . read $ s_regport
    let cport   =                      read $ s_cport
    r <- newPortRegistryData sn regport
    p <- getPortRegistryRequestPort r
    writePortToFile p "/tmp/registry.port"
    saveToXmlFile "/tmp/registry.xml" p
    Console.startServerConsole createConsole r cport prompt

    
createConsole :: Console.ConsoleData PortRegistryData
createConsole =
  Console.addConsoleCommand "register"   hdlRegister   "registers a port manually" $
  Console.addConsoleCommand "unregister" hdlUnregister "unregisters a port manually" $
  Console.addConsoleCommand "lookup"   hdlLookup     "gets the socket id for a port" $
  Console.addConsoleCommand "ports"    hdlGetPorts   "lists all ports" $ 
  Console.addConsoleCommand "version"    hdlVersion    "prints the version" $
  Console.initializeConsole
      

hdlRegister :: PortRegistryData -> [String] -> IO String
hdlRegister prd opts
  = do
    handleAll (\_ -> return "usage: register <streamname> <hostname> <socketId>") $
      do
      let sn = head opts
      let hn = head $ tail opts
      let po = fromInteger . read . head . tail . tail $ opts
      registerPort sn (SocketId hn po) prd
      return "Register succesfull"


hdlUnregister :: PortRegistryData -> [String] -> IO String
hdlUnregister prd opts
  = handleAll (\_ -> return "usage: unregister <streamname>") $
      do
      let sn = head opts
      unregisterPort sn prd
      return "Unregister succesfull"


hdlLookup :: PortRegistryData -> [String] -> IO String
hdlLookup prd opts
  = handleAll (\_ -> return "usage: lookup <streamname>") $
      do
      let sn = head opts
      soid <- lookupPort sn prd
      return . show $ soid


hdlGetPorts :: PortRegistryData -> [String] -> IO String
hdlGetPorts prd _
  = do
    ls <- getPorts prd
    return . show $ ls


hdlVersion :: PortRegistryData -> [String] -> IO String
hdlVersion _ _
  = return version

-- ------------------------------------------------------------