import Control.Monad
import Data.Maybe
import Network
+import Network.HTTP.Lucu
+import Rakka.Environment
+import Rakka.Resource.Index
+import Rakka.Resource.Object
+import Rakka.Resource.Page
import System.Console.GetOpt
+import System.Directory
import System.Environment
import System.Exit
+import System.Posix.Files
import System.Posix.Types
import System.Posix.User
defaultPort :: PortNumber
defaultPort = fromIntegral 8080
+defaultLocalStateDir :: FilePath
+defaultLocalStateDir = LOCALSTATEDIR -- replaced by CPP
+
defaultUserName :: String
defaultUserName = "daemon"
, Option ['d'] ["localstatedir"]
(ReqArg OptLSDir "DIR")
- ("Path to the database directory. (default: " ++ LOCALSTATEDIR ++ ")")
+ ("Path to the database directory. (default: " ++ defaultLocalStateDir ++ ")")
, Option ['u'] ["user"]
(ReqArg OptUserName "USER")
exitWith $ ExitFailure 1
portNum <- getPortNum opts
- uid <- getUserID opts
+ uid <- getUserID opts
+ gid <- getGroupID opts
+ lsdir <- getLocalStateDir opts
+
+ createLocalStateDir lsdir uid gid
+
+ setGroupID gid
+ setUserID uid
+
+ env <- setupEnv lsdir portNum
+ runHttpd (envLucuConf env) (resTree env) [fallbackPage env]
- print portNum
- print uid
+
+resTree :: Environment -> ResTree
+resTree env
+ = mkResTree [ ([] , resIndex env)
+ , (["object"], resObject env)
+ ]
getPortNum :: [CmdOpt] -> IO PortNumber
userEnt <- getUserEntryForName name
return $ userID userEnt
-
\ No newline at end of file
+
+
+getGroupID :: [CmdOpt] -> IO GroupID
+getGroupID opts
+ = do let xs = mapMaybe (\ x -> case x of
+ OptGroupName n -> Just n
+ _ -> Nothing) opts
+ name = case xs of
+ [] -> defaultGroupName
+ (x:[]) -> x
+ _ -> error "too many --group options."
+
+ groupEnt <- getGroupEntryForName name
+ return $ groupID groupEnt
+
+
+getLocalStateDir :: [CmdOpt] -> IO FilePath
+getLocalStateDir opts
+ = do let xs = mapMaybe (\ x -> case x of
+ OptLSDir n -> Just n
+ _ -> Nothing) opts
+ path = case xs of
+ [] -> defaultLocalStateDir
+ (x:[]) -> x
+ _ -> error "too many --localstatedir options."
+
+ return path
+
+
+createLocalStateDir :: FilePath -> UserID -> GroupID -> IO ()
+createLocalStateDir path uid gid
+ = do createDirectoryIfMissing True path
+ setOwnerAndGroup path uid gid