{-# LANGUAGE CPP #-} module Main where import Control.Monad import DDNS.Server import DDNS.Server.EditZone import DDNS.Server.SignReq import Data.List import OpenSSL import System.Console.ParseArgs import System.IO data Options = Help | LSDir | DNSPort | HTTPSPort | AllowTransfer | Command deriving (Show, Eq, Ord) arginfo :: [Arg Options] arginfo = [ Arg { argIndex = Help , argAbbr = Just 'h' , argName = Just "help" , argData = Nothing , argDesc = "print this help." } , Arg { argIndex = LSDir , argAbbr = Just 'd' , argName = Just "localstatedir" -- LOCALSTATEDIR will be replaced by CPP , argData = argDataDefaulted "DIR" ArgtypeString LOCALSTATEDIR , argDesc = "specify the local state directory (def: " ++ LOCALSTATEDIR ++ ")." } , Arg { argIndex = DNSPort , argAbbr = Just 'p' , argName = Just "dns-port" , argData = argDataDefaulted "PORT" ArgtypeString "53" , argDesc = "port to listen for DNS packets (default: 53)." } , Arg { argIndex = HTTPSPort , argAbbr = Just 'P' , argName = Just "https-port" , argData = argDataDefaulted "PORT" ArgtypeString "443" , argDesc = "port to listen for HTTPS connections (def: 443)." } , Arg { argIndex = AllowTransfer , argAbbr = Just 'a' , argName = Just "allow-transfer" , argData = Nothing , argDesc = "accept AXFR requests." } , Arg { argIndex = Command , argAbbr = Nothing , argName = Nothing , argData = argDataDefaulted "COMMAND" ArgtypeString "daemon" , argDesc = "command to the server (default: \"daemon\")." } ] main :: IO () main = withOpenSSL $ do m <- parseArgsIO ArgsComplete arginfo when (gotArg m Help) $ usageError m "" let lsdir = getRequiredArg m LSDir (key, cert) <- ensureWeHaveKeypair lsdir withDB <- ensureWeHaveDB lsdir withDB $ \ db -> case getRequiredArg m Command of "signreq" -> signReq key cert "editzone" -> editZone db _ -> usageError m ""