module TestNetwork where
import Network.Socket hiding (send, sendTo, recv, recvFrom)
import Network.Socket.ByteString
import Language.Asn.Types
import Net.Snmp.Types
import Net.Snmp.Encoding
import Data.ByteString (ByteString)
import Text.Printf (printf)
import Network.BSD (getProtocolNumber)
import Control.Concurrent
import Control.Monad
import qualified Language.Asn.Encoding as E
import qualified Data.ByteString as ByteString
import qualified Data.ByteString.Lazy as LB
import qualified Data.Vector as Vector
printResponse :: MessageV2 -> IO ()
printResponse msg = do
addrinfos <- getAddrInfo Nothing (Just "10.10.10.1") (Just "161")
let serveraddr = head addrinfos
sock <- socket (addrFamily serveraddr) Stream defaultProtocol
connect sock (addrAddress serveraddr)
sendAll sock (LB.toStrict (E.der messageV2 msg))
result <- recv sock 2048
close sock
putStrLn (hexByteString result)
sendUdp :: MessageV2 -> IO ()
sendUdp msg = do
addrinfos <- getAddrInfo Nothing (Just "10.10.10.1") (Just "161")
let serveraddr = head addrinfos
sock <- socket (addrFamily serveraddr) Datagram defaultProtocol
connect sock (addrAddress serveraddr)
putStrLn "Sending"
sendAll sock (LB.toStrict $ E.der messageV2 msg)
msg <- recv sock 1024
close sock
putStr "Got response: "
putStrLn (hexByteString msg)
backgroundListenUdp :: IO ()
backgroundListenUdp = void $ forkIO listenUdp
listenUdp :: IO ()
listenUdp = do
protoNum <- getProtocolNumber "UDP"
serveraddr:_ <- getAddrInfo
(Just (defaultHints {addrFlags = [AI_PASSIVE]}))
Nothing (Just "161")
sock <- socket (addrFamily serveraddr) Datagram protoNum
bind sock (addrAddress serveraddr)
let go = do
(bs,_) <- recvFrom sock 4096
if ByteString.null bs
then close sock
else putStrLn (hexByteString bs) >> go
go
getSystemDescription :: MessageV2
getSystemDescription = MessageV2 "opsview"
$ PdusGetRequest $ Pdu
(RequestId 10000)
(ErrorStatus 0)
(ErrorIndex 0)
$ Vector.singleton $ VarBind sysDescr BindingResultUnspecified
sysDescr :: ObjectIdentifier
sysDescr = ObjectIdentifier $ Vector.fromList [1,3,6,1,2,1,1,1,0]
hexByteString :: ByteString -> String
hexByteString = ByteString.foldr (\w xs -> printf "%02X" w ++ xs) []