serverman/src/System/Term.hs

87 lines
3.6 KiB
Haskell
Raw Normal View History

2017-02-18 19:25:57 +00:00
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE NamedFieldPuns #-}
module System.Term ( initialize ) where
import System.Serverman.Services
import qualified System.Serverman as S
import System.Console.CmdArgs
import qualified System.Console.CmdArgs.Explicit as E
import System.Environment
import Data.Monoid
import Data.Maybe
initialize = do
let mode = cmdArgsMode $ modes [webserver, install] &= program "serverman" &= summary "serverman v0.1.0, (C) Mahdi Dibaiee 2017"
(CmdArgs args help version _ _) <- E.processArgs mode
if isJust help then
putStrLn $ fromJust help
else if isJust version then
putStrLn $ fromJust version
else
case args of
p@(WebServerParams _ _ _ _ _ _ _) -> webServer p
p@(InstallParams _) -> manualInstall p
return ()
-- WEB SERVER
data Params = WebServerParams { directory :: String
, domain :: String
, port :: String
, ssl :: Bool
, forward :: String
, wService :: String
, output :: String
}
| InstallParams { iService :: String }
deriving (Show, Data, Typeable)
webserver = WebServerParams { directory = "/var/www/html/" &= typDir &= help "directory to serve static files from, defaults to /var/www/html/"
, domain = "test.dev" &= typ "DOMAIN" &= help "domain/server name, defaults to test.dev"
, port = def &= typ "PORT" &= help "port number to listen to, defaults to 80 for http and 443 for https"
, forward = def &= typ "PORT" &= help "the port to forward to (in case of a port-forwarding server)"
, ssl = False &= help "create a letsencrypt certificate for this domain, defaults to false"
, wService = "nginx" &= help "service to build config for: (n)ginx, (a)pache, defaults to nginx" &= explicit &= name "service"
, output = def &= help "output directory for the selected service, defaults to /etc/nginx for nginx and /etc/apache2 for apache"
} &= explicit &= name "webserver"
install = InstallParams { iService = def &= argPos 0
} &= explicit &= name "install"
webServer (WebServerParams { directory, domain, port, ssl, forward, wService, output }) = do
let serverType
| (not . null) forward = S.PortForwarding
| otherwise = S.Static
let serviceName = read wService :: Service
let portNumber
| (not . null) port = port
| ssl = "403"
| otherwise = "80"
let outDir
| (not . null) output = output
| serviceName == S.NGINX = "/etc/nginx/"
| serviceName == S.Apache = "/etc/apache2/"
let params = S.ServerParams { S.directory = directory
, S.domain = domain
, S.port = portNumber
, S.ssl = ssl
, S.forward = forward
, S.serverType = serverType
, S.service = serviceName
, S.output = outDir
}
S.run $ S.newServer params
manualInstall (InstallParams { iService }) = do
S.run $ S.detectOS >>= (S.install (read iService))