eufon/blinkenlicht/nl.fnl

68 lines
1.8 KiB
Plaintext
Raw Normal View History

2022-04-01 15:23:14 +00:00
(local nl (require :netlink))
(local view (. (require :fennel) :view))
(print (string.format "All known netlink groups: %s"
(table.concat (nl.groups) ", ")))
(local nls (nl.socket))
;; when we have a default route, we get the ifname
;; $ grep DEVTYPE /sys/class/net/*/uevent
;; /sys/class/net/docker0/uevent:DEVTYPE=bridge
;; /sys/class/net/wlp4s0/uevent:DEVTYPE=wlan
;; /sys/class/net/wwp0s20f0u2i12/uevent:DEVTYPE=wwan
;; (ethernet and loopback devices don't have DEVTYPE)
;; if the type is wlan, we can get a signal strength indicator
;; from the "quality - link" column of /proc/net/wireless
;; for wwan, need to determine how to get strength and carrier name
(fn netlunk []
(let [links {}
routes {}]
(fn handle-event [event]
(match event
{:event :newlink}
(match event.up
"yes" (tset links event.index event)
"no" (tset links event.index nil))
{:event :newroute}
(tset routes (or event.dst "default")
(if (. links event.index)
event
nil))
{} (print :unhandled event.event)
))
(each [_ event (ipairs (nls:query ))]
(handle-event event))
{
:refresh #(each [_ event (ipairs (nls:event))]
(handle-event event))
:fd (nls:fd)
:uplink (fn [self] routes.default)
:wait #(nls:poll 1000)
2022-04-03 11:39:59 +00:00
:interface (fn [self ifnum] (. links ifnum))
2022-04-01 15:23:14 +00:00
}
))
(let [nl (netlunk)]
(while (or (nl:wait) true)
(nl:refresh)
(match (nl:uplink)
{:index ifnum}
(print "default route through " (. (nl:interface ifnum) :name))
{}
(print "no default route")
)))
;; default route is newroute event without dst
;; look for newlink event with :running "yes"