experimental netlink code
This commit is contained in:
parent
a3584f21e0
commit
afd2d5dff0
53
blinkenlicht/netlink.nix
Normal file
53
blinkenlicht/netlink.nix
Normal file
@ -0,0 +1,53 @@
|
||||
{ lua, lib, fetchFromGitHub, buildLuaPackage, libmnl }:
|
||||
let pname = "netlink";
|
||||
in buildLuaPackage {
|
||||
inherit pname;
|
||||
version = "0.1.1-1";
|
||||
|
||||
buildInputs = [ libmnl ];
|
||||
|
||||
src = fetchFromGitHub {
|
||||
repo = "lua-netlink";
|
||||
owner = "chris2511";
|
||||
rev = "v0.1.1";
|
||||
hash = "sha256:1833naskl4p7rz5kk0byfgngvw1mvf6cnz64sr3ny7i202wv7s52";
|
||||
};
|
||||
buildPhase = "$CC -shared -l mnl -o netlink.so src/*.c";
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p "$out/lib/lua/${lua.luaversion}"
|
||||
cp netlink.so "$out/lib/lua/${lua.luaversion}/"
|
||||
'';
|
||||
|
||||
}
|
||||
|
||||
|
||||
# , fetchFromGitHub }:
|
||||
# let
|
||||
|
||||
# simpleName = "netlink";
|
||||
|
||||
# in
|
||||
# # TODO: add busted and checkPhase?
|
||||
# buildLuaPackage rec {
|
||||
# version = "0.10.2";
|
||||
# pname = simpleName; # nixpkgs unstable needs this
|
||||
# name = "${pname}-${version}"; # nixpkgs 21.11 needs this
|
||||
|
||||
# src = fetchFromGitHub {
|
||||
# owner = "stefano-m";
|
||||
# repo = "lua-${simpleName}";
|
||||
# rev = "v${version}";
|
||||
# sha256 = "0kl8ff1g1kpmslzzf53cbzfl1bmb5cb91w431hbz0z0vdrramh6l";
|
||||
# };
|
||||
|
||||
# propagatedBuildInputs = [ lgi ];
|
||||
|
||||
# buildPhase = ":";
|
||||
|
||||
# installPhase = ''
|
||||
# mkdir -p "$out/share/lua/${lua.luaversion}"
|
||||
# cp -r src/${pname} "$out/share/lua/${lua.luaversion}/"
|
||||
# '';
|
||||
|
||||
# }
|
94
blinkenlicht/nl.fnl
Normal file
94
blinkenlicht/nl.fnl
Normal file
@ -0,0 +1,94 @@
|
||||
(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))
|
||||
(print "File descriptor:" (nls:fd))
|
||||
|
||||
;; (local links
|
||||
;; (collect
|
||||
;; [_ l (ipairs (nls:query {:link true}))]
|
||||
;; l.name l))
|
||||
;; (print (view links))
|
||||
|
||||
;; ;; (local routes (nls:query {:route true}))
|
||||
;; ;; (print "Query route status:" (view routes))
|
||||
|
||||
;; (print :routes (view (nls:query {:route true})))
|
||||
;; (print :route6 (view (nls:query {:route6 true})))
|
||||
|
||||
;; ;; (each [_ entry (pairs routes)]
|
||||
;; ;; (local eth (nl.ethtool entry.name))
|
||||
;; ;; (when eth.speed
|
||||
;; ;; (print "ETH:" entry.name (view eth))))
|
||||
;; (print "GROUPS:" (view (nls:groups)))
|
||||
|
||||
;; 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
|
||||
;; and network name from `iwgetid wlan0 --raw`
|
||||
;; or directly using an ioctl http://papermint-designs.com/dmo-blog/2016-08-how-to-get-the-essid-of-the-wifi-network-you-are-connected-to-#
|
||||
|
||||
;; for wwan, need to determine how to get strength and carrier name
|
||||
|
||||
(fn find [predicate tbl]
|
||||
(accumulate [found nil
|
||||
_ el (ipairs tbl)]
|
||||
(if (predicate el) el found)))
|
||||
|
||||
(print (find #(= $1 "hey") [:one :two :hey :three]))
|
||||
|
||||
(fn netlunk []
|
||||
(let [links {}
|
||||
routes {}]
|
||||
(fn handle-event [event]
|
||||
; (print :event (view 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)
|
||||
:interface (fn [self ifnum] (print :lookup ifnum (view links)) (. links ifnum))
|
||||
}
|
||||
))
|
||||
|
||||
(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"
|
Loading…
Reference in New Issue
Block a user