packages feed

arbtt-0.4.4: src/capture-main.hs

module Main where

import Control.Monad
import Control.Concurrent
import System.Directory
import System.FilePath
import Graphics.X11.XScreenSaver (compiledWithXScreenSaver)
import System.IO
import System.Posix.IO
import System.IO.Error
import System.Exit
import System.Locale.SetLocale
import System.Console.GetOpt
import System.Environment
import Data.Maybe
import Data.Version (showVersion)

import Capture
import TimeLog
import UpgradeLog1

import Paths_arbtt (version)


data Conf = Conf {
	cSampleRate :: Integer
	}
defaultConf = Conf 60

data Opts = Help | Version | SetRate Integer
	deriving Eq

versionStr = "arbtt-capture " ++ showVersion version
header = "Usage: arbtt-capture [OPTIONS...]"

options :: [OptDescr Opts]
options = 
     [ Option "h?"     ["help"]
              (NoArg Help)
	      "show this help"
     , Option "V"      ["version"]
              (NoArg Version)
	      "show the version number"
     , Option "r"      ["sample-rate"]
     	      (ReqArg (SetRate . read) "RATE")
	      "set the sample rate in seconds (default: 60)"
     ]	     

-- | This is very raw, someone ought to improve this
lockFile filename = flip catch (\e -> hPutStrLn stderr ("arbtt [Error]: Could not aquire lock for " ++ filename ++"!") >> exitFailure) $ do
    fd <- openFd (filename  ++ ".lck") WriteOnly (Just 0o644) defaultFileFlags
    setLock fd (WriteLock, AbsoluteSeek, 0, 0)

main = do
    setLocale LC_ALL (Just "") 
    unless compiledWithXScreenSaver $
    	hPutStrLn stderr "arbtt [Warning]: X11 was compiled without support for XScreenSaver"
    
    args <- getArgs
    flags <- case getOpt Permute options args of
    	(o, [], []) | Help `notElem` o && Version `notElem` o -> return o
	(o, _, _)   | Version `elem` o -> do
		hPutStrLn stderr versionStr
		exitSuccess
	(o, _, _)   | Help `elem` o -> do
                hPutStr stderr (usageInfo header options)
		exitSuccess
	(_,_,errs) -> do
                hPutStr stderr (concat errs ++ usageInfo header options)
                exitFailure

    let sampleRate = foldr (.) id
                     (map (\f -> case f of {SetRate r -> const r; _ -> id}) flags)
		     60

    dir <- getAppUserDataDirectory "arbtt"
    createDirectoryIfMissing False dir
    let captureFile = dir </> "capture.log"
    lockFile captureFile
    upgradeLogFile1 captureFile
    setupChecks
    runLogger captureFile (sampleRate * 1000) captureData