2017-02-18 19:25:57 +00:00
|
|
|
{-# LANGUAGE DeriveDataTypeable #-}
|
|
|
|
{-# LANGUAGE NamedFieldPuns #-}
|
2017-03-13 15:37:07 +00:00
|
|
|
{-# LANGUAGE ScopedTypeVariables #-}
|
2017-02-18 19:25:57 +00:00
|
|
|
|
|
|
|
module System.Term ( initialize ) where
|
|
|
|
import qualified System.Serverman as S
|
|
|
|
|
|
|
|
import System.Environment
|
2017-02-22 09:28:34 +00:00
|
|
|
import System.Directory
|
2017-02-22 09:55:17 +00:00
|
|
|
import System.Exit
|
2017-02-18 19:25:57 +00:00
|
|
|
import Data.Monoid
|
|
|
|
import Data.Maybe
|
2017-02-22 09:55:17 +00:00
|
|
|
import Control.Monad
|
2017-03-11 10:21:38 +00:00
|
|
|
import Control.Monad.State
|
2017-03-13 15:37:07 +00:00
|
|
|
import Data.Default.Class
|
|
|
|
import System.FilePath
|
|
|
|
import Data.List
|
|
|
|
|
2017-03-21 10:05:17 +00:00
|
|
|
import System.Serverman.Utils hiding (liftIO)
|
2017-03-18 14:34:56 +00:00
|
|
|
import System.Serverman.Actions.Repository
|
2017-02-18 19:25:57 +00:00
|
|
|
|
|
|
|
initialize = do
|
2017-02-19 12:47:37 +00:00
|
|
|
args <- getArgs
|
2017-03-13 15:37:07 +00:00
|
|
|
|
|
|
|
dir <- liftIO $ getAppUserDataDirectory "serverman"
|
|
|
|
let path = dir </> "repository"
|
|
|
|
|
|
|
|
let params = parseParams args
|
|
|
|
liftIO $ print params
|
|
|
|
|
|
|
|
-- Fetch repository first
|
|
|
|
S.runApp $ do
|
|
|
|
S.run (S.fetchRepository)
|
2017-03-18 14:34:56 +00:00
|
|
|
S.run (S.detectOS)
|
2017-03-13 15:37:07 +00:00
|
|
|
|
|
|
|
state@(S.AppState { S.repository }) <- get
|
2017-03-18 14:34:56 +00:00
|
|
|
put $ state { arguments = rest params }
|
2017-03-13 15:37:07 +00:00
|
|
|
|
|
|
|
case params of
|
|
|
|
(Params { listServices = True }) -> liftIO $ do
|
|
|
|
mapM_ print repository
|
2017-03-21 10:05:17 +00:00
|
|
|
p@(Params { install = Just service }) -> do
|
2017-03-18 14:34:56 +00:00
|
|
|
ms <- findService service
|
|
|
|
case ms of
|
2017-03-21 10:05:17 +00:00
|
|
|
Just s -> handleRemote p $ S.install s
|
2017-03-18 14:34:56 +00:00
|
|
|
Nothing -> liftIO $ putStrLn $ "service not found: " ++ service
|
2017-03-21 10:05:17 +00:00
|
|
|
p@(Params { rest = (x:xs), remote }) -> do
|
2017-03-18 14:34:56 +00:00
|
|
|
case x of
|
|
|
|
(service, Nothing) -> do
|
|
|
|
ms <- findService service
|
|
|
|
case ms of
|
2017-03-21 10:05:17 +00:00
|
|
|
Just s -> do
|
|
|
|
handleRemote p $ S.install s
|
|
|
|
S.run $ S.call s remote
|
|
|
|
|
2017-03-18 14:34:56 +00:00
|
|
|
Nothing -> liftIO $ putStrLn $ "could not find any service matching " ++ service
|
|
|
|
_ -> liftIO $ putStrLn $ "could not understand your input"
|
2017-03-13 15:37:07 +00:00
|
|
|
|
|
|
|
{-S.run (S.call (head repository) [])-}
|
2017-02-18 19:25:57 +00:00
|
|
|
|
|
|
|
return ()
|
|
|
|
|
2017-03-13 15:37:07 +00:00
|
|
|
where
|
2017-03-21 10:05:17 +00:00
|
|
|
handleRemote (Params { remote = Just file }) action = do
|
|
|
|
list <- liftIO $ map read . lines <$> readFile file
|
|
|
|
S.run (S.remote list action)
|
|
|
|
handleRemote (Params { remote = Nothing }) action = S.run action
|
2017-03-13 15:37:07 +00:00
|
|
|
|
|
|
|
|
|
|
|
data Manage = Start | Stop deriving (Eq, Show)
|
|
|
|
data Params = Params { listServices :: Bool
|
|
|
|
, install :: Maybe String
|
|
|
|
, manage :: Maybe (Manage, String)
|
|
|
|
, update :: Bool
|
|
|
|
, remote :: Maybe FilePath
|
|
|
|
, help :: Bool
|
2017-03-18 14:34:56 +00:00
|
|
|
, rest :: [(String, Maybe String)]
|
2017-03-13 15:37:07 +00:00
|
|
|
} deriving (Show)
|
|
|
|
|
|
|
|
instance Default Params where
|
|
|
|
def = Params { listServices = False
|
2017-03-21 10:05:17 +00:00
|
|
|
, install = Nothing
|
|
|
|
, manage = Nothing
|
|
|
|
, remote = Nothing
|
|
|
|
, update = False
|
|
|
|
, help = False
|
|
|
|
, rest = []
|
|
|
|
}
|
2017-03-13 15:37:07 +00:00
|
|
|
|
|
|
|
parseParams :: [String] -> Params
|
|
|
|
parseParams ("repository":"list":xs) = (parseParams xs) { listServices = True }
|
|
|
|
parseParams ("repository":"update":xs) = (parseParams xs) { update = True }
|
|
|
|
parseParams ("service":"start":s:xs) = (parseParams xs) { manage = Just (Start, s) }
|
|
|
|
parseParams ("service":"stop":s:xs) = (parseParams xs) { manage = Just (Stop, s) }
|
|
|
|
parseParams ("install":s:xs) = (parseParams xs) { install = Just s }
|
|
|
|
parseParams ("--remote":s:xs) = (parseParams xs) { remote = Just s }
|
|
|
|
parseParams ("--help":xs) = (parseParams xs) { help = True }
|
|
|
|
parseParams ("-h":xs) = (parseParams xs) { help = True }
|
2017-03-18 14:34:56 +00:00
|
|
|
parseParams [] = def { help = True }
|
|
|
|
parseParams x = def { rest = toPairs x }
|
|
|
|
where
|
|
|
|
toPairs [] = []
|
|
|
|
toPairs [x] = [(getWord x, Nothing)]
|
|
|
|
toPairs (x:y:xs)
|
|
|
|
| flagName x && value y = [(getWord x, Just y)] ++ toPairs xs
|
|
|
|
| flagName y && value x = [(getWord x, Nothing)] ++ toPairs (y:xs)
|
|
|
|
| flagName x && flagName y = [(getWord x, Nothing)] ++ toPairs (y:xs)
|
|
|
|
| otherwise = toPairs xs
|
|
|
|
|
|
|
|
flagName = isPrefixOf "-"
|
|
|
|
value = not . flagName
|
|
|
|
getWord = dropWhile (== '-')
|