From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Simon Wunderlich Date: Mon, 14 Oct 2013 19:52:34 +0200 References: <525B189E.1080105@altermundi.net> In-Reply-To: <525B189E.1080105@altermundi.net> MIME-Version: 1.0 Content-Type: Text/Plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Message-Id: <201310141952.34222.sw@simonwunderlich.de> Subject: Re: [B.A.T.M.A.N.] [PATCH 2/2] alfred: Bundle a lua script for autogenerating bat-hosts file Reply-To: The list for a Better Approach To Mobile Ad-hoc Networking List-Id: The list for a Better Approach To Mobile Ad-hoc Networking List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: b.a.t.m.a.n@lists.open-mesh.org > Provide a lua script that uses alfred to propagate and collect all > interface mac + names, then generate a /tmp/bat-hosts file. > If there's already a (probably hand-made) /etc/bat-hosts it won't overwrite > it but if there's none, it will symlink /etc/bat-hosts -> /tmp/bat-hosts > > Signed-off-by: Gui Iribarren > Thanks-to: Joshua Head Thanks a lot, this sounds like a really good idea! As this will be part of the openwrt package, I'd like to ask to make the bat-hosts.lua script optional and selectable (like you can turn on/off vis). I'll do the same for other (optional) services like gps. Also, do you need any additional dependencies for lua? Thanks, Simon > --- > alfred/Makefile | 2 + > alfred/files/bat-hosts.lua | 107 > ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 109 > insertions(+) > create mode 100644 alfred/files/bat-hosts.lua > > diff --git a/alfred/Makefile b/alfred/Makefile > index db9c71f..7027192 100644 > --- a/alfred/Makefile > +++ b/alfred/Makefile > @@ -74,6 +74,8 @@ define Package/alfred/install > $(INSTALL_BIN) ./files/alfred.init $(1)/etc/init.d/alfred > $(INSTALL_DIR) $(1)/etc/config > $(INSTALL_DATA) ./files/alfred.config $(1)/etc/config/alfred > + $(INSTALL_DIR) $(1)/etc/alfred > + $(INSTALL_BIN) ./files/bat-hosts.lua $(1)/etc/alfred/bat-hosts.lua > endef > > $(eval $(call BuildPackage,alfred)) > diff --git a/alfred/files/bat-hosts.lua b/alfred/files/bat-hosts.lua > new file mode 100644 > index 0000000..19f2cad > --- /dev/null > +++ b/alfred/files/bat-hosts.lua > @@ -0,0 +1,107 @@ > +#!/usr/bin/lua > + > +local type_id = 64 -- bat-hosts > + > +function get_hostname() > + local hostfile = io.open("/proc/sys/kernel/hostname", "r") > + local ret_string = hostfile:read("*a") > + ret_string = string.gsub(ret_string, "\n", "") > + hostfile:close() > + return ret_string > +end > + > +function get_interfaces_names() > + local ret = {} > + > + for name in io.popen("ls -1 /sys/class/net/"):lines() do > + table.insert(ret, name) > + end > + > + return ret > +end > + > +function get_interface_address(name) > + local addressfile = io.open("/sys/class/net/"..name.."/address", "r") > + local ret_string = addressfile:read("*a") > + ret_string = string.gsub(ret_string, "\n", "") > + addressfile:close() > + return ret_string > +end > + > + > +local function generate_bat_hosts() > +-- get hostname and interface macs/names > +-- then return a table containing valid bat-hosts lines > + local n, i > + local ifaces, ret = {}, {} > + > + local hostname = get_hostname() > + > + for n, i in ipairs(get_interfaces_names()) do > + local address = get_interface_address(i) > + ifaces[address] = i > + end > + > + for mac, iname in pairs(ifaces) do > + if mac:match("^%x%x:%x%x:%x%x:%x%x:%x%x:%x%x$") and not > mac:match("00:00:00:00:00:00") then + table.insert(ret, mac.." > "..hostname.."_"..iname.."\n") > + end > + end > + > + return ret > +end > + > +local function publish_bat_hosts() > +-- pass a raw chunk of data to alfred > + local fd = io.popen("alfred -s " .. type_id, "w") > + if fd then > + local ret = generate_bat_hosts() > + if ret then > + fd:write(table.concat(ret)) > + end > + fd:close() > + end > +end > + > +local function receive_bat_hosts() > +-- read raw chunks from alfred, convert them to a nested table and call > write_bat_hosts + local fd = io.popen("alfred -r " .. type_id) > + --[[ this command returns something like > + { "54:e6:fc:b9:cb:37", "00:11:22:33:44:55 > ham_wlan0\x0a00:22:33:22:33:22 ham_eth0\x0a" }, + { > "90:f6:52:bb:ec:57", "00:22:33:22:33:23 spam\x0a" }, > + ]]-- > + > + if fd then > + local output = fd:read("*a") > + if output then > + assert(loadstring("rows = {" .. output .. "}"))() > + write_bat_hosts(rows) > + end > + fd:close() > + end > +end > + > +local function write_bat_hosts(rows) > + local content = { "### File generated by alfred-bat-hosts\n" } > + > + -- merge the chunks from all nodes, de-escaping newlines > + for _, row in ipairs(rows) do > + local node, value = unpack(row) > + table.insert(content, "# Node ".. node .. "\n") > + table.insert(content, value:gsub("\x0a", "\n") .. "\n") > + end > + > + -- write parsed content down to disk > + local fd = io.open("/tmp/bat-hosts", "w") > + if fd then > + fd:write(table.concat(content)) > + fd:close() > + end > + > + -- try to make a symlink in /etc pointing to /tmp, > + -- if it exists, ln will do nothing. > + os.execute("ln -ns /tmp/bat-hosts /etc/bat-hosts 2>/dev/null") > +end > + > +publish_bat_hosts() > +receive_bat_hosts()