aboutsummaryrefslogtreecommitdiff
path: root/src/Main.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Main.hs')
-rw-r--r--src/Main.hs68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/Main.hs b/src/Main.hs
new file mode 100644
index 0000000..494faba
--- /dev/null
+++ b/src/Main.hs
@@ -0,0 +1,68 @@
+{-# LANGUAGE QuasiQuotes #-}
+
+module Main (
+ main
+) where
+
+import Data.ByteString.Char8 (pack)
+import Data.Either.Utils (forceEither)
+import Data.Maybe (fromJust)
+import Data.Version (showVersion)
+import Database.MySQL.Base (ConnectInfo(..))
+import Database.MySQL.Base.Types (Option(ReadDefaultFile, ReadDefaultGroup))
+import Paths_mywatch (getDataDir, version) -- from cabal
+import System.Environment (getArgs)
+import Text.InterpolatedString.Perl6 (qc)
+import qualified Data.ConfigFile as Cf
+import qualified System.Console.Docopt.NoTH as O
+
+import Server (server)
+
+usage :: IO String
+usage = do
+ dataDir <- getDataDir
+ return $
+ "mywatch " ++ showVersion version
+ ++ " view queries on many MySQL servers" ++ [qc|
+
+Usage:
+ mywatch [options] MYCNF
+
+Options:
+
+ -d, --datadir=DIR Data directory including static files [default: {dataDir}]
+
+ -s, --socket=SOCK Listen on this UNIX-socket [default: /tmp/mywatch.sock]
+ -p, --port=PORT Instead of UNIX-socket, listen on this TCP port (localhost)
+
+ -h, --help Show this message
+
+|]
+
+main :: IO()
+main = do
+ doco <- O.parseUsageOrExit =<< usage
+ args <- O.parseArgsOrExit doco =<< getArgs
+ if args `O.isPresent` O.longOption "help"
+ then putStrLn $ O.usage doco
+ else do
+ let
+ file = fromJust $ O.getArg args $ O.argument "MYCNF"
+ port = O.getArg args $ O.longOption "port"
+ socket = fromJust $ O.getArg args $ O.longOption "socket"
+ datadir = fromJust $ O.getArg args $ O.longOption "datadir"
+ servers <- filter ("client" /=) . Cf.sections . forceEither <$> Cf.readfile Cf.emptyCP file
+ let
+ myInfo = map (\g -> ConnectInfo {
+ connectDatabase = "",
+ connectHost = "",
+ connectPassword = "",
+ connectPath = "",
+ connectPort = 0,
+ connectSSL = Nothing,
+ connectUser = "",
+ connectOptions = [ ReadDefaultFile file, ReadDefaultGroup (pack g) ]
+ }) servers
+ listen = maybe (Right socket) (Left . read) port
+ server listen myInfo datadir
+