route_event.lua
#!/usr/bin/env eco local socket = require 'eco.socket' local rtnl = require 'eco.rtnl' local nl = require 'eco.nl' local function print_event(nlh, msg) if nlh.type == rtnl.RTM_NEWROUTE then print('new route') elseif nlh.type == rtnl.RTM_DELROUTE then print('del route') end local rt = rtnl.parse_rtmsg(msg) for k, v in pairs(rt) do if k == 'flags' then print(k .. ':', string.format('0x%x', v)) else print(k .. ':', v) end end local attrs = msg:parse_attr(rtnl.RTMSG_SIZE) if attrs[rtnl.RTA_DST] then local dst = nl.attr_get_payload(attrs[rtnl.RTA_DST]) print('dst:', socket.inet_ntop(socket.AF_INET, dst)) end if attrs[rtnl.RTA_SRC] then local src = nl.attr_get_payload(attrs[rtnl.RTA_SRC]) print('src:', socket.inet_ntop(socket.AF_INET, src)) end if attrs[rtnl.RTA_OIF] then local oif = nl.attr_get_u32(attrs[rtnl.RTA_OIF]) print('oif:', socket.if_indextoname(oif)) end if attrs[rtnl.RTA_GATEWAY] then local gw = nl.attr_get_payload(attrs[rtnl.RTA_GATEWAY]) print('gateway:', socket.inet_ntop(socket.AF_INET, gw)) end print() end local sock, err = nl.open(nl.NETLINK_ROUTE) if not sock then print('open fail:', err) return end local ok, err = sock:bind(rtnl.RTMGRP_IPV4_ROUTE | rtnl.RTMGRP_IPV6_ROUTE) if not ok then print('bind fail:', err) return end ok, err = sock:recv_messages(function(msg, nlh) if nlh.type == rtnl.RTM_NEWROUTE or nlh.type == rtnl.RTM_DELROUTE then print_event(nlh, msg) end end) if not ok then print('err:', err) end