heyefi-2.0.0.2: src/Main.hs
module Main where
import HEyefi.App (app)
import HEyefi.CommandLineOptions (handleOptionsThenMaybe)
import HEyefi.Config (monitorConfig, newConfig, runWithConfig)
import HEyefi.Constant (port, configPath)
import HEyefi.Log (logInfoIO)
import HEyefi.Prelude
import HEyefi.Types (SharedConfig)
import Control.Concurrent (forkIO)
import Control.Concurrent.STM (
newTVar
, atomically
, writeTVar
, TVar
, readTVar )
import Control.Monad (forever, void)
import Network.Wai.Handler.Warp (run)
import System.IO
import System.Posix.Signals (installHandler, sigHUP, Handler( Catch ))
handleHup :: TVar (Maybe Int) -> IO ()
handleHup wakeSig = atomically (writeTVar wakeSig (Just 1))
hangupSignal :: IO (TVar (Maybe Int))
hangupSignal = do
wakeSig <- atomically (newTVar Nothing)
_ <- installHandler sigHUP (Catch (handleHup wakeSig)) Nothing
return wakeSig
readAndMonitorSharedConfig :: TVar (Maybe Int) ->
SharedConfig ->
IO ()
readAndMonitorSharedConfig wakeSig sharedConfig =
void (forkIO (forever
(do
c <- atomically (readTVar sharedConfig)
runWithConfig c (
monitorConfig (unpack configPath) sharedConfig wakeSig))))
runHeyefi :: IO ()
runHeyefi = do
wakeSig <- hangupSignal
sharedConfig <- newConfig
readAndMonitorSharedConfig wakeSig sharedConfig
logInfoIO (listeningOnPort (tshow port))
run port (app sharedConfig)
main :: IO ()
main = do
hSetBuffering stdout LineBuffering
handleOptionsThenMaybe runHeyefi