[Dnsmasq-discuss] Scripting with lua
White, Phil
whitepj at manx.biz
Fri May 24 09:32:04 UTC 2024
On Wed, 15 May 2024 at 06:32, Geert Stappers <stappers at 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 at lists.thekelleys.org.uk
> https://lists.thekelleys.org.uk/cgi-bin/mailman/listinfo/dnsmasq-discuss
More information about the Dnsmasq-discuss
mailing list