module Main where import Bein.Web.Types import Bein.Web.Commands import Bein.Web.Routing import qualified System.Posix.Daemonize as D import Happstack.Server import Control.Concurrent import Control.Monad.Trans import Control.Monad.Reader import Control.Concurrent.STM import Database.HDBC.PostgreSQL import Bein.Configuration import Network import System.IO main :: IO () main = D.serviced $ D.simpleDaemon { D.program = httpd, D.user = Just "bein", D.group = Just "bein" } getPort :: WebState -> IO Int getPort st = (liftIO.atomically.readTVar.configT) st >>= return.http_port httpd :: IO () httpd = getState >>= \s -> do p <- getPort s runReaderT sessionExpirer s simpleHTTP' (\a -> runReaderT a s) (Conf p Nothing) routing sessionExpirer :: BeinM WebState ThreadId sessionExpirer = forkR f where f = do update "select remove_expired_sessions()" [] liftIO $ threadDelay (5*60*1000000) f getState :: IO WebState getState = do conn <- connectPostgreSQL "dbname=bein" config <- readConfiguration conn configTV <- newTVarIO config sockMV <- (connectTo "" (UnixSocket (daemon_port config)) >>= \h -> do hSetBuffering h LineBuffering newMVar h) `catch` (\_ -> newEmptyMVar) return $ WebState { stDb = conn, stConfigT = configTV, stDaemonPort = sockMV, stObject = undefined, stUser = Nothing }