From c31b52ce5ec0a9b71b4a6943523c0ae652072f05 Mon Sep 17 00:00:00 2001 From: 1Computer1 Date: Thu, 5 Sep 2019 10:17:08 -0400 Subject: [PATCH] Change the CLI to take the languages folder --- README.md | 4 ++-- app/Main.hs | 24 ++++++++++++++++-------- config.example.dhall | 1 - myriad.cabal | 2 +- src/Myriad.hs | 6 +++--- src/Myriad/Core.hs | 7 ++++--- src/Myriad/Docker.hs | 2 +- 7 files changed, 27 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 7a0c811..f58cd1f 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,8 @@ Arbitrary code execution server using Docker. ## Running -- Make sure the configuration is filled out, see `config.dhall` for an example -- Run `myriad --config path/to/config.dhall` +- Make sure the configuration is filled out, see `config.example.dhall` for an example +- Run `myriad --config /path/to/config.dhall --languages /path/to/languages/` ## Endpoints diff --git a/app/Main.hs b/app/Main.hs index 84243fd..b4df8b9 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -8,19 +8,27 @@ import Myriad data Args = Args { configInput :: T.Text + , languagesDir :: T.Text } parseArgs :: IO Args parseArgs = execParser $ info (helper <*> args) (fullDesc <> progDesc "Run the Myriad server") where - args = Args <$> option str (mconcat - [ long "config" - , short 'c' - , help "Sets the Dhall configuration" - , metavar "DHALL" - ]) + args = Args + <$> option str (mconcat + [ long "config" + , short 'c' + , help "Set the Dhall configuration" + , metavar "DHALL" + ]) + <*> option str (mconcat + [ long "languages" + , short 'l' + , help "Set the languages directory" + , metavar "DIR" + ]) main :: IO () main = do - Args { configInput } <- parseArgs - runMyriadServer configInput + Args { configInput, languagesDir } <- parseArgs + runMyriadServer configInput languagesDir diff --git a/config.example.dhall b/config.example.dhall index b6958a3..79fa8a8 100644 --- a/config.example.dhall +++ b/config.example.dhall @@ -36,6 +36,5 @@ let config : Config = , prepareContainers = False , cleanupInterval = 30 , port = 8081 - , languagesDir = "./languages" } in config diff --git a/myriad.cabal b/myriad.cabal index 375483e..49bd7d1 100644 --- a/myriad.cabal +++ b/myriad.cabal @@ -1,7 +1,7 @@ cabal-version: 2.2 name: myriad -version: 0.1.0.0 +version: 0.2.0.0 synopsis: Arbitrary code execution in Docker description: Please see the README category: Server diff --git a/src/Myriad.hs b/src/Myriad.hs index 923ec99..06ea630 100644 --- a/src/Myriad.hs +++ b/src/Myriad.hs @@ -13,9 +13,9 @@ import Myriad.Core import Myriad.Docker import Myriad.Server -runMyriadServer :: T.Text -> IO () -runMyriadServer configInput = do - env <- initEnv configInput +runMyriadServer :: T.Text -> T.Text -> IO () +runMyriadServer configInput languagesDir = do + env <- initEnv configInput languagesDir runMyriadT env do buildAllImages startCleanup diff --git a/src/Myriad/Core.hs b/src/Myriad/Core.hs index 4e015e6..e1cf180 100644 --- a/src/Myriad/Core.hs +++ b/src/Myriad/Core.hs @@ -49,6 +49,7 @@ data EvalResult = EvalOk BL.ByteString | EvalTimedOut | EvalErrored data Env = Env { config :: MyriadConfig + , languagesDir :: T.Text , containers :: MVar (M.Map Language ContainerName) , containerSems :: MVar (M.Map Language QSem) , evalSems :: MVar (M.Map Language QSem) @@ -61,7 +62,6 @@ data MyriadConfig = MyriadConfig , prepareContainers :: Bool , cleanupInterval :: Natural , port :: Natural - , languagesDir :: T.Text } deriving (Show, Generic) instance Interpret MyriadConfig @@ -112,10 +112,11 @@ type Myriadic m = (MonadReader Env m, MonadLogger m, MonadLoggerIO m, MonadIO m, readConfig :: T.Text -> IO MyriadConfig readConfig = input auto -initEnv :: T.Text -> IO Env -initEnv configInput = +initEnv :: T.Text -> T.Text -> IO Env +initEnv configInput languagesDir = Env <$> readConfig configInput + <*> pure languagesDir <*> newMVar M.empty <*> newMVar M.empty <*> newMVar M.empty diff --git a/src/Myriad/Docker.hs b/src/Myriad/Docker.hs index ace7794..7d89ba1 100644 --- a/src/Myriad/Docker.hs +++ b/src/Myriad/Docker.hs @@ -27,7 +27,7 @@ import Myriad.Core buildImage :: Myriadic m => LanguageConfig -> m () buildImage lang@LanguageConfig { name, concurrent } = do - MyriadConfig { prepareContainers, languagesDir } <- asks config + Env { config = MyriadConfig { prepareContainers }, languagesDir } <- ask logInfo ["Building image ", cs $ imageName lang] exec_ ["docker build -t ", imageName lang, " ", cs languagesDir cs name] setupQSems