RTNetlink is an extensible, high-level, pure-Haskell interface for manipulating network interfaces on Linux: creating and destroying interfaces, changing and dumping interface settings, adding and removing addresses.
The core interface of RTNetlink is the RTNL
monad. RTNL
handles the heavy
lifting of opening and closing netlink sockets, incrementing sequence numbers,
and getting the responses for the current sequence number behind the scenes.
Messages not that are not responses to a sent message, such as those sent to
group subscribers, are stored in the backlog and can be retrieved with
getBacklog
.
The basic way to use RTNL
is to use the create
, destroy
, dump
, and
change
convenience functions. If you want more control, you can use talk
and talk_
. Import modules like System.Linux.RTNetlink.Link
to get access
to prefab instances of Create
and Destroy
messages, etc. Or import
System.Linux.RTNetlink.Message
to get access to the core typeclasses and
create your own messages. System.Linux.RTNetlink.Packet
has a number of
functions to make this easier.
{-# LANGUAGE OverloadedStrings #-}
module Main where
import System.Linux.RTNetlink
import System.Linux.RTNetlink.Link
import Control.Monad (when)
main :: IO ()
main = runRTNL $ do
let mybridge = LinkName "mybridge"
create (Bridge, mybridge)
change mybridge Up
state <- dump' mybridge
when (state == Up) $
liftIO (putStrLn "I did it, mom!")
destroy mybridge