bein-0.3.3: Bein/Daemon.hs
{-# LANGUAGE ScopedTypeVariables #-}
module Main where
import Control.Concurrent.QSem
import System.Posix.Daemonize (serviced,CreateDaemon(..), simpleDaemon)
import Bein.Daemon.SignalHandlers (installSignalHandlers)
import Bein.Daemon.Protocol
import Bein.Daemon.Types
import Bein.SocketHandler (listenWith)
import Control.Monad.Reader (ReaderT(..))
import Control.Concurrent.STM
import Database.HDBC.PostgreSQL
import Bein.Configuration
main :: IO ()
main = serviced $ simpleDaemon { program = beind, user = Just "bein", group = Just "bein" }
beind :: a -> IO ()
beind _ = getState >>= runReaderT beind'
where beind' = do installSignalHandlers
socketFile <- configField daemon_port
listenWith daemonProtocol socketFile
getState :: IO DaemonState
getState = do
conn <- connectPostgreSQL "dbname=bein"
config <- readConfiguration conn
configTV <- newTVarIO config
sem <- newQSem 1
return $ State { stDb = conn, stConfigT = configTV, stSem = sem }