1 {-# LANGUAGE LambdaCase #-}
2 {-# LANGUAGE RecordWildCards #-}
20 import Data.Text (Text)
21 import qualified Data.Text as T
25 -- | The maximum size of each datagram when using UDP transit methods.
28 -- | Handle for a socket connected to Graylog. In some cases this socket
29 -- is UDP and will not have a maintained session.
32 { _graylogHost :: String
33 , _graylogPort :: String
34 , _graylogAddress :: AddrInfo
35 , _graylogSocket :: Socket
36 , _graylogHostName :: Text
37 , _graylogChunkSize :: ChunkSize
40 defaultChunkSize :: ChunkSize
41 defaultChunkSize = 8192
44 :: HostName -- ^ The host on which graylog is running.
45 -> ServiceName -- ^ The port on which graylog is running.
46 -> ChunkSize -- ^ The maximum size of each UDP datagram.
47 -> IO (Either String Graylog)
48 openGraylog h p cksize
49 | cksize < 1024 = return $ Left "ChunkSize must be at least 1024."
50 | otherwise = getAddrInfo Nothing (Just h) (Just p) >>= \case
51 [] -> return $ Left "No address info found."
53 case find (\i -> addrSocketType i == Datagram) infos of
54 Nothing -> return $ Left "No datagram info found for address."
56 sock <- socket (addrFamily i) Datagram defaultProtocol
57 connect sock (addrAddress i)
58 hostname <- getHostName
59 return $ Right $ Graylog h p i sock (T.pack hostname) cksize
61 closeGraylog :: Graylog -> IO ()
62 closeGraylog Graylog{..} = close _graylogSocket