where
import Control.Concurrent ( threadDelay )
-import Control.Exception.Base ( bracket )
+import Control.Exception ( bracket, throw )
import Control.Monad ( when )
import Data.List ( isPrefixOf )
import Data.Maybe ( isNothing )
exit_no_password,
exit_no_username,
exit_pidfile_exists )
-import Logging (
- init_logging,
- log_debug,
- log_error,
- log_info,
- log_warning )
+import FeedHosts ( FeedHosts(..) )
+import Network.Services.TSN.Logging ( init_logging )
import qualified OptionalConfiguration as OC (
OptionalConfiguration(..),
from_rc )
-import Terminal (
- display_debug,
- display_error,
- display_info,
- display_sent,
- display_warning )
-import TSN.FeedHosts ( FeedHosts(..) )
-import TSN.Xml ( parse_xmlfid )
+import Network.Services.TSN.Report (
+ report_debug,
+ report_info,
+ report_warning,
+ report_error )
+import Network.Services.TSN.Terminal ( display_sent )
+import Xml ( parse_xmlfid )
import Unix ( full_daemonize )
--- | Display and log debug information. WARNING! This does not
--- automatically append a newline. The output is displayed/logged
--- as-is, for, you know, debug purposes.
-report_debug :: String -> IO ()
-report_debug s = do
- display_debug s
- log_debug s
-
-
--- | Display and log an error condition. This will prefix the error
--- with "ERROR: " when displaying (but not logging) it so that it
--- stands out.
---
-report_error :: String -> IO ()
-report_error s = do
- display_error $ "ERROR: " ++ s
- log_error s
-
-
--- | Display and log an informational (status) message.
---
-report_info :: String -> IO ()
-report_info s = do
- display_info s
- log_info s
-
-
--- | Display and log a warning. This will prefix the warning with
--- "WARNING: " when displaying (but not logging) it so that it
--- stands out.
---
-report_warning :: String -> IO ()
-report_warning s = do
- display_warning $ "WARNING: " ++ s
- log_warning s
-
-- | Receive a single line of text from a Handle, and send it to the
-- debug log.
-- If we were asked to daemonize, do that; otherwise just run the thing.
if (daemonize cfg)
- then full_daemonize cfg run_program
+ then try_daemonize cfg run_program
else run_program
where
catchIOError (connect_and_parse cfg host) (report_error . show)
thread_sleep 5 -- Wait 5s before attempting to reconnect.
round_robin cfg $ (feed_host_idx + 1) `mod` (length hosts)
+
+
+ -- | A exception handler around full_daemonize. If full_daemonize
+ -- doesn't work, we report the error and crash. This is fine; we
+ -- only need the program to be resilient once it actually starts.
+ --
+ try_daemonize :: Configuration -> IO () -> IO ()
+ try_daemonize cfg program =
+ catchIOError
+ (full_daemonize cfg program)
+ (\e -> do
+ report_error (show e)
+ throw e)