Holumbus-Storage-0.1.0: Programs/StorageControllerDaemon/StorageControllerDaemon.hs
module Main(main) where
import Holumbus.Common.Logging
import Holumbus.Network.PortRegistry.PortRegistryPort
import qualified Holumbus.Common.Debug as DEBUG
import Holumbus.Common.Utils ( handleAll )
import Data.Binary
import Data.List
import qualified Holumbus.Console.ServerConsole as Console
import qualified Holumbus.FileSystem.FileSystem as FS
import qualified Holumbus.FileSystem.Storage as S
import System.Environment (getArgs)
import System.Log.Logger
import System.Exit
version :: String
version = "Holumbus-StorageControllerDaemon 0.1"
prompt :: String
prompt = "# StorageControllerDaemon > "
localLogger :: String
localLogger = "Holumbus.StorageControllerDaemon"
pUsage :: IO ()
pUsage = do
putStrLn "Usage: StorageControllerDaemon ConsolePort Logfile"
params :: IO [String]
params = do
args <- getArgs
if length args /= 2 then do
errorM localLogger "Wrong argument count"
pUsage
exitFailure
else
return args
main :: IO ()
main
= handleAll (\e -> errorM localLogger $ "EXCEPTION: " ++ show e) $ do
putStrLn ("Starting " ++ version)
(s_cport:logfile:[]) <- params
initializeFileLogging logfile [(localLogger, INFO),("Holumbus.Network.DoWithServer",INFO),("measure",ERROR),("Holumbus",ERROR),("Holumbus.Network",ERROR)]
fs <- initialize
Console.startServerConsole createConsole fs (read s_cport) prompt
initialize :: IO (FS.FileSystem)
initialize = do
p <- newPortRegistryFromXmlFile "/tmp/registry.xml"
setPortRegistry p
fs <- FS.mkFileSystemController FS.defaultFSControllerConfig
return fs
createConsole :: Console.ConsoleData (FS.FileSystem)
createConsole =
Console.addConsoleCommand "id" getMySiteId "get my siteId" $
Console.addConsoleCommand "sites" getFileSites "get all sites with the given file name" $
Console.addConsoleCommand "with" getNearestNodePortWithFile "gets the nearest node-port with a file (DEBUG)" $
Console.addConsoleCommand "for" getNearestNodePortForFile "gets the nearest node-port for a (new) file (DEBUG)" $
Console.addConsoleCommand "contains" containsFile "is file in filesystem or not" $
Console.addConsoleCommand "create" createFile "adds a file" $
Console.addConsoleCommand "createS" createFiles "adds a list of files [(Filename,FileContent)]" $
Console.addConsoleCommand "append" append "appends to a file" $
Console.addConsoleCommand "delete" deleteFile "deletes a file" $
Console.addConsoleCommand "content" getFileContent "gets the content of a file" $
Console.addConsoleCommand "data" getFileData "gets the metadata of a file" $
Console.addConsoleCommand "local" isFileLocal "test, if the file is on the local node" $
Console.addConsoleCommand "debug" printDebug "prints internal state of the filesystem (DEBUG)" $
Console.addConsoleCommand "version" (printVersion version) "prints the version" $
Console.initializeConsole
getFileNameAndContent :: [String] -> (S.FileId, S.FileContent)
getFileNameAndContent [] = error "no filename given"
getFileNameAndContent (x:xs) = (x, encode $ intercalate " " xs)
-- getFileNameAndContent (x:xs) = (x, S.TextFile $ intercalate " " xs)
getFileNamesAndContent :: [String] -> [(S.FileId, S.FileContent)]
getFileNamesAndContent [] = []
getFileNamesAndContent (_:[]) = error "no content given"
getFileNamesAndContent (fid:c:xs) = ((fid, encode c):getFileNamesAndContent xs)
getFileNameAndContentSize :: [String] -> (S.FileId, Integer)
getFileNameAndContentSize [] = error "no filename given"
getFileNameAndContentSize (x1:[]) = (x1, 0)
getFileNameAndContentSize (x1:x2:_) = (x1, read x2)
getMySiteId :: FS.FileSystem -> [String] -> IO String
getMySiteId fs _
= do
handleAll (\e -> return $ show e) $
do
i <- FS.getMySiteId fs
return $ show i
getFileSites :: FS.FileSystem -> [String] -> IO String
getFileSites fs opts
= do
handleAll (\e -> return $ show e) $
do
let (n, _) = getFileNameAndContent opts
s <- FS.getFileSites n fs
return $ show s
getNearestNodePortWithFile :: FS.FileSystem -> [String] -> IO String
getNearestNodePortWithFile fs opts
= do
handleAll (\e -> return $ show e) $
do
let (n, _) = getFileNameAndContent opts
p <- FS.getNearestNodePortWithFile n fs
return $ show p
getNearestNodePortForFile :: FS.FileSystem -> [String] -> IO String
getNearestNodePortForFile fs opts
= do
handleAll (\e -> return $ show e) $
do
let (n, s) = getFileNameAndContentSize opts
p <- FS.getNearestNodePortForFile n s fs
return $ show p
containsFile :: FS.FileSystem -> [String] -> IO String
containsFile fs opts
= do
handleAll (\e -> return $ show e) $
do
let (n, _) = getFileNameAndContent opts
b <- FS.containsFile n fs
return $ show b
createFile :: FS.FileSystem -> [String] -> IO String
createFile fs opts
= do
handleAll (\e -> return $ show e) $
do
let (n, c) = getFileNameAndContent opts
FS.createFile n c fs
return ""
createFiles :: FS.FileSystem -> [String] -> IO String
createFiles fs opts
= do
handleAll (\e -> return $ show e) $
do
let l = getFileNamesAndContent opts
FS.createFiles l fs
return ""
append :: FS.FileSystem -> [String] -> IO String
append fs opts
= do
handleAll (\e -> return $ show e) $
do
let (n, c) = getFileNameAndContent opts
FS.appendFile n c fs
return ""
deleteFile :: FS.FileSystem -> [String] -> IO String
deleteFile fs opts
= do
handleAll (\e -> return $ show e) $
do
let (n, _) = getFileNameAndContent opts
FS.deleteFile n fs
return ""
getFileContent :: FS.FileSystem -> [String] -> IO String
getFileContent fs opts
= do
handleAll (\e -> return $ show e) $
do
let (n, _) = getFileNameAndContent opts
c <- FS.getFileContent n fs
return $ show c
getFileData :: FS.FileSystem -> [String] -> IO String
getFileData fs opts
= do
handleAll (\e -> return $ show e) $
do
let (n, _) = getFileNameAndContent opts
d <- FS.getFileData n fs
return $ show d
isFileLocal :: FS.FileSystem -> [String] -> IO String
isFileLocal fs opts
= do
handleAll (\e -> return $ show e) $
do
let (n, _) = getFileNameAndContent opts
b <- FS.isFileLocal n fs
return $ show b
printDebug :: FS.FileSystem -> [String] -> IO String
printDebug fs _
= do
handleAll (\e -> return . show $ e) $ DEBUG.getDebug fs
printVersion :: String -> FS.FileSystem -> [String] -> IO String
printVersion ver _ _
= return ver
-- ------------------------------------------------------------