packages feed

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 }