]>
Commit | Line | Data |
---|---|---|
b23afe7b | 1 | {-# LANGUAGE LambdaCase #-} |
2ff46fce A |
2 | {-# LANGUAGE RecordWildCards #-} |
3 | ||
4 | module Graylog.Types | |
5 | ( Graylog | |
6 | , _graylogHost | |
7 | , _graylogPort | |
8 | , _graylogAddress | |
c91dbdc0 A |
9 | , _graylogSocket |
10 | , _graylogHostName | |
f82a8dfc | 11 | , _graylogChunkSize |
c91dbdc0 | 12 | , ChunkSize |
2ff46fce | 13 | |
c91dbdc0 | 14 | , defaultChunkSize |
2ff46fce A |
15 | , openGraylog |
16 | , closeGraylog | |
17 | ) where | |
18 | ||
b23afe7b | 19 | import Data.List |
2ff46fce A |
20 | import Data.Text (Text) |
21 | import qualified Data.Text as T | |
22 | import Network.BSD | |
23 | import Network.Socket | |
24 | ||
c91dbdc0 A |
25 | type ChunkSize = Word |
26 | ||
2ff46fce A |
27 | data Graylog |
28 | = Graylog | |
c91dbdc0 A |
29 | { _graylogHost :: String |
30 | , _graylogPort :: String | |
31 | , _graylogAddress :: AddrInfo | |
32 | , _graylogSocket :: Socket | |
33 | , _graylogHostName :: Text | |
34 | , _graylogChunkSize :: ChunkSize | |
2ff46fce A |
35 | } |
36 | ||
c91dbdc0 A |
37 | defaultChunkSize :: ChunkSize |
38 | defaultChunkSize = 8192 | |
39 | ||
b23afe7b A |
40 | openGraylog |
41 | :: HostName -> ServiceName -> ChunkSize -> IO (Either String Graylog) | |
f82a8dfc A |
42 | openGraylog h p cksize |
43 | | cksize < 1024 = return $ Left "ChunkSize must be at least 1024." | |
44 | | otherwise = getAddrInfo Nothing (Just h) (Just p) >>= \case | |
b23afe7b A |
45 | [] -> return $ Left "No address info found." |
46 | infos -> | |
47 | case find (\i -> addrSocketType i == Datagram) infos of | |
48 | Nothing -> return $ Left "No datagram info found for address." | |
49 | Just i -> do | |
50 | sock <- socket (addrFamily i) Datagram defaultProtocol | |
51 | connect sock (addrAddress i) | |
52 | hostname <- getHostName | |
53 | return $ Right $ Graylog h p i sock (T.pack hostname) cksize | |
2ff46fce A |
54 | |
55 | closeGraylog :: Graylog -> IO () | |
56 | closeGraylog Graylog{..} = close _graylogSocket |