54 lines
1.4 KiB
Ruby
54 lines
1.4 KiB
Ruby
![]() |
require 'netlink/nlsocket'
|
||
|
require 'netlink/message'
|
||
|
|
||
|
module Netlink
|
||
|
# This is the high-level API using a NETLINK_ROUTE protocol socket
|
||
|
class RTSocket < NLSocket
|
||
|
def initialize(opt={})
|
||
|
super(opt.merge(:protocol => Netlink::NETLINK_ROUTE))
|
||
|
end
|
||
|
|
||
|
# List links. Returns an array of Netlink::Link objects
|
||
|
def link_list(opt)
|
||
|
send_request RTM_GETLINK, Link.new(opt),
|
||
|
NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST
|
||
|
receive_until_done
|
||
|
end
|
||
|
|
||
|
# List routes. Returns an array of Netlink::Route objects
|
||
|
# res = nl.routes(:family => Socket::AF_INET)
|
||
|
# #=> [..., ...]
|
||
|
def route_list(opt)
|
||
|
send_request RTM_GETROUTE, Route.new(opt),
|
||
|
NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST
|
||
|
receive_until_done
|
||
|
end
|
||
|
|
||
|
def addr_list(opt)
|
||
|
send_request RTM_GETADDR, Addr.new(opt),
|
||
|
NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST
|
||
|
receive_until_done
|
||
|
end
|
||
|
|
||
|
# Add a route
|
||
|
# nl.add_route(:family => Socket::AF_INET, ...)
|
||
|
def route_add(r)
|
||
|
send_request RTM_NEWROUTE, Route.new(r)
|
||
|
# Do we get any success/fail?
|
||
|
end
|
||
|
|
||
|
# Delete a route
|
||
|
def route_delete(r)
|
||
|
send_request RTM_DELROUTE, Route.new(r)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if __FILE__ == $0
|
||
|
require 'pp'
|
||
|
nl = Netlink::RTSocket.new
|
||
|
pp nl.route_list(:family => Socket::AF_INET)
|
||
|
pp nl.link_list(:family => Socket::AF_INET)
|
||
|
pp nl.addr_list(:family => Socket::AF_INET)
|
||
|
end
|