packages feed

AutoForms-0.4.0: src/Examples/HCron/Daemon1st.hs

module Daemon1st where

import List(sort)
import System(system)
import Control.Concurrent(threadDelay)

import Entry1st

main = do putStrLn "The HCron daemon"
          spec                             <- readFile specLocation
          calTime                          <- getCalendarTime
          (TOD currentSecondsSinceEpoch _) <- getClockTime
          let entries           = (read spec)::[Entry Time]
              entries'          = filter isNew $ map toSeconds (sort entries)
              isNew (Entry t _) = t > currentSecondsSinceEpoch
              toSeconds x       = x { when = timeToSeconds calTime (when x) }
          putStrLn "Successfully read entries. Starting daemon."
          putStrLn $ unlines $ map show entries
          putStrLn "After pruning:"
          putStrLn $ unlines $ map show entries'
          daemon entries'

daemon :: [Entry Integer] -> IO()
daemon [] = return ()
daemon ((Entry time command'):xs) =
    do (TOD clockTime _) <- getClockTime
       delaySeconds $ max 0 (time - clockTime)
       system command'
       daemon xs

getCalendarTime :: IO CalendarTime
getCalendarTime =
    do clockTime <- getClockTime
       toCalendarTime clockTime

timeToSeconds :: CalendarTime -> Time -> Integer
timeToSeconds calTime t =
       let t' = calTime { ctYear = year t, ctMonth = month t, ctDay = day t
                        , ctHour = hour t, ctMin = minute t, ctSec = 0, ctPicosec = 0 }
           (TOD time _) = (toClockTime t')
       in time

delaySeconds :: Integer -> IO ()
delaySeconds seconds = delayMicro (seconds * 1)   -- FIXME: multiple by 10^6
    where
      delayMicro ms | ms <= 0   = return ()
                    | otherwise = do let d = min (toInteger (maxBound::Int)) ms
                                     print (d `div` 10^6)
                                     threadDelay (fromInteger d)
                                     delayMicro (ms - d)