module Network.Snmp.Client.Internal
( oidFromBS
, makeSocket
, succCounter
, predCounter
, lastS
, isUpLevel
, uniqID
)
where
import Data.ByteString (ByteString)
import Network.Socket hiding (recv, socket, close)
import qualified Network.Socket as NS
import qualified Data.ByteString.Char8 as C
import Control.Applicative ((<$>))
import Data.Maybe (catMaybes)
import Network.Protocol.Snmp (Coupla, Suite(..), OID)
import Network.Snmp.Client.Types (Port, Hostname)
import Data.IORef (IORef, atomicModifyIORef')
import Network.Info
import Data.Int
oidFromBS :: ByteString -> [Integer]
oidFromBS xs = catMaybes $ map (\x -> fst <$> C.readInteger x) $ C.splitWith (== '.') xs
makeSocket :: Hostname -> Port -> IO Socket
makeSocket hostname port = do
serverAddress <- head <$> getAddrInfo (Just defaultHints) (Just hostname) (Just port)
sock <- NS.socket (addrFamily serverAddress) Datagram defaultProtocol
connect sock (addrAddress serverAddress)
return sock
succCounter :: (Bounded a, Integral a) => IORef a -> IO a
succCounter ref = atomicModifyIORef' ref check
where
check x
| x < maxBound = (succ x, succ x)
| otherwise = (0, 0)
predCounter :: (Bounded a, Integral a) => IORef a -> IO a
predCounter ref = atomicModifyIORef' ref check
where
check x
| x > 0 = (pred x, pred x)
| otherwise = (maxBound, maxBound)
lastS :: Suite -> Coupla
lastS (Suite xs) = last xs
isUpLevel :: OID -> OID -> Bool
isUpLevel new old = let baseLength = length old
in old /= take baseLength new
uniqID :: IO Int32
uniqID = do
nf <- getNetworkInterfaces
let zeroMac = MAC 0 0 0 0 0 0
zeroIp = IPv4 0
ipToW (IPv4 x) = x
return $ abs . fromIntegral $ case filter (\x -> ipv4 x /= zeroIp && mac x /= zeroMac ) nf of
[] -> 1000000
[x] -> ipToW (ipv4 x)
x:_ -> ipToW (ipv4 x)