On Wed, 15 May 2024 at 06:32, Geert Stappers <stapp...@stappers.nl> wrote:
> I've followed that URL and had to click deeper. > Now sharing the output of > $ curl --silent > https://raw.githubusercontent.com/whitepj/dnsmasq-lua/main/dhcp.lua Thanks Geert. Apologies -- it was my intention to keep the actual noise down to a minimum. You can see from the script that the vast majority of it is nothing more than comment. The line that I am having the problem with is that which retrieves that various variables. I have tried: a = (os.getenv("DNSMASQ_TIME_REMAINING") or "blank") but this returns nothing at all. Since my knowledge of lua is far from extensive, I'm hoping that someone may know what I'm doing wrong.. Many thanks. > --[[ > > LUA script for dnsmasq DHCP leases. Modified from original source at: > http://lists.thekelleys.org/pipermail/dnsmasq-discuss/2012q1/005425.html > This script is principally a boilerplate example, to show what is > possible... > Tested using dnsmasq v2.90 > > Run when: > - Startup (existing leases are invoked with 'old' event > - SIGHUP ? > - dhcp lease created, renewed, changed, or destroyed. > - tftp file transfer completes (not tested) > > ENVIRONMENT VARIABLES > ===================== > - DNSMASQ_DOMAIN > - DNSMASQ_SUPPLIED_HOSTNAME > - DNSMASQ_USER_CLASS0 ... _CLASSn > - DNSMASQ_LEASE_LENGTH / DNSMASQ_LEASE_EXPIRES > - DNSMASQ_TIME_REMAINING > - DNSMASQ_DATA_MISSING > - DNSMASQ_INTERFACE > - DNSMASQ_RELAY_ADDRESS > - DNSMASQ_TAGS > - DNSMASQ_REQUESTED_OPTIONS > - DNSMASQ_MUD_URL > - IPv4 Only > - DNSMASQ_CLIENT_ID > - DNSMASQ_CIRCUIT_ID > - DNSMASQ_SUBSCRIBER_ID > - DNSMASQ_REMOTE_ID > - DNSMASQ_VENDOR_CLASS > - IPv6 Only > - DNSMASQ_VENDOR_CLASS_ID > - DNSMASQ_VENDOR_CLASS0 ... _CLASSn > - DNSMASQ_SERVER_DUID > - DNSMASQ_IAID > - DNSMASQ_MAC >--]] > > DBI = require "DBI" -- The ONLY external dependency. On gentoo, use > emerge dev-lua/luadbi (or use luarocks) > > -- Variable Declarations > counter = 0 > file = nil -- writing to a normal file > dbh = nil -- our database connection > dbinsert = nil -- preprepared call to write to a database > > local function myenv() -- For testing. How do we retrieve the contents of > the environment variables? > a = (os.getenv("DNSMASQ_TIME_REMAINING") or "blank") -- > Help. Always blank. > return a > end > > local function myerrorhandler(err) > print("ERROR: " .. err) > end > > function init(a) > a = (a or "------------------------------\n") > -- MOST of this function will need to be deleted or commented out, > depending on what functionality is required. > local ok, err, code = os.rename("/tmp/ilua.db","/tmp/ilua.db") > if not ok then > if code == 13 then > print("DB File exists, but we can't open it! Please > fix (or delete).") > os.exit() > else > print("No DB file found. Creating...") > os.execute('sqlite3 --line /tmp/ilua.db "CREATE TABLE > table1(\"a\");"') > end > end > > print(a .. "Starting dnsmasq lua > script...\n==============================\n") > > file = assert(io.open("/tmp/test.log", "a+")) > -- dbh = assert(DBI.Connect('PostgreSQL', 'db', 'user', 'password' )) > -- Alternative > dbh = assert(DBI.Connect('SQLite3','/tmp/ilua.db')) > dbh:autocommit(true) > -- dbinsert = assert(dbh:prepare('INSERT INTO table1(a) values ($1)')) > -- PostgreSQL > end > > local function output(mystring) > print(mystring) -- In production, I see little point > in this. Left for testing. > file:write(mystring) -- We write our data to a standard > file... > file:flush() > > DBI.Do(dbh, "INSERT INTO table1(a) VALUES ('" .. mystring .. "');") > -- ... or a SQLite3 file ... > -- dbinsert:execute(mystring) -- ... or a database (if using > postgreSQL) > > -- See: http:jpmens.net/2013/10/21/tracking-dhcp-leases-with-dnsmasq/ > local cmd = 'mosquitto_pub -h 192.168.1.2 -t "' .. "topic" .. '" -m > "' .. "payload" .. '" -r' > print(cmd .. "\n") -- Edit, and change 'print' > to 'os.execute' > > -- What else might we like to do? > -- Possibly look at a hook for collectd. > end > > function shutdown() > file:write("Stopping dnsmasq lua > script..!\n==============================\n") > file:close() > -- dbinsert:close() -- only needed if we have a prepared > SQL insert function. > dbh:close() > end > > local function tabletostring(table) > local k,v > local line = "" > for k,v in pairs(table) do line = line .. "\n" .. k .. " = " .. v end > return line > end > > function lease(action, lease_desc) > counter = counter + 1 > -- status = xpcall(myenv, myerrorhandler) > -- print(status) > local line = "Lua: " .. counter .. " " .. action .. " " > for k,v in pairs(lease_desc) do line = line .. "\n" .. k .. " " .. v > end > line = line .. "\n" > output(line) > end > > function arp(a, b, c) -- expected, but not tested: Action (string), Args > (table) > --b = type(b) > c = type(c) > local line = "-- arp " .. a .. " / " .. tabletostring(b) .. "\n" .. c > .. "\n" > output(line) > end > > function tftp(a, b, c) -- expected, but not tested: Action, > table{destination addr, file name, file size} > a = (a or '-') > b = type(b) > c = type(c) > line = "-- tftp " .. a .. " / " .. b .. " / " .. c .. "\n" > output(line) > end > > > > -- Exit Codes: Does dnsmask log these anywhere? > -- 0: Success > -- 1: Configuration problem > -- 2: Network access problem > -- 3: Filesystem error (missing dir/file, incorrect permissions) > -- 4: Memory allocation failure > -- 5: Other (miscellaneous) problem > > > > > --[[ > -- Used only for testing. REMOVE the third hyphen above when calling via > dnsmasq. > table = {} > table["Example"] = "NOT accurate representation of data in real life!" > table["domain"] = "test.com" > table["hostname"] = "laptop" > table["mac_address"] = "01:23:45:67:89:ab" > table["ip_address"] = "192.168.1.14" > > init() > lease("old", table) > lease("add", table) > lease("del", table) > arp("arp-add", table) > arp("arp-del", table) > --tftp("test") > -- no other calls seen in a working environment. this > appears to be the lot. > shutdown() > > > --]] > > --[[ Ideas > > lua-cjson vs luajson > luasocket > toluapp > > What's in the DB? > IP / Lease status / Start / End / MAC / DNS Name / WINS name > Subnet / Router > > --]] > > --[[ > +-----+-----+-----------------+ > | arp | lease | > +-----+-----+-----+-----+-----+ > | add | old | add | old | del | > ================+=====+=====+=====+=====+=====+=====+ > mac_address | y | y | y | y | y | > client_address | y | y | | | | Either IPv4 addr or ?IPv6? > address > client_id | | | * | * | * | derived from MAC addr. Not > always present > lease_expires | | | y | y | y | > time_remaining | | | y | y | | If present, always '3600.0' > ip_address | | | y | y | y | > hostname | | | y | y | y | > domain | | | y | y | y | > interface | | | y | y | | > data_missing | | | y | y | | if present, always '1.0' > | | | | | | > ----------------+-----+-----+-----+-----+-----+-----+ > > --]] > > > Many thanks, > > Phil > > > Groeten > Geert Stappers > -- > Silence is hard to parse > > _______________________________________________ > Dnsmasq-discuss mailing list > Dnsmasq-discuss@lists.thekelleys.org.uk > https://lists.thekelleys.org.uk/cgi-bin/mailman/listinfo/dnsmasq-discuss _______________________________________________ Dnsmasq-discuss mailing list Dnsmasq-discuss@lists.thekelleys.org.uk https://lists.thekelleys.org.uk/cgi-bin/mailman/listinfo/dnsmasq-discuss