| This script can be used to implement persistent leases on openWRT, DD-WRT |
| etc. Persistent leases are good: if the lease database is lost on a |
| reboot, then it will eventually be restored as hosts renew their |
| leases. Until a host renews (which may take hours/days) it will |
| not exist in the DNS if dnsmasq's DDNS function is in use. |
| |
| *WRT systems remount all non-volatile filesystems read-only after boot, |
| so the normal leasefile will not work. They do, however have NV |
| storage, accessed with the nvram command: |
| |
| /usr/lib # nvram |
| usage: nvram [get name] [set name=value] [unset name] [show] |
| |
| The principle is that leases are kept in NV variable with data |
| corresponding to the line in a leasefile: |
| |
| dnsmasq_lease_192.168.1.56=3600 00:41:4a:05:80:74 192.168.1.56 * * |
| |
| By giving dnsmasq the leasefile-ro command, it no longer creates or writes a |
| leasefile; responsibility for maintaining the lease database transfers |
| to the lease change script. At startup, in leasefile-ro mode, |
| dnsmasq will run |
| |
| "<lease_change_script> init" |
| |
| and read whatever that command spits out, expecting it to |
| be in dnsmasq leasefile format. |
| |
| So the lease change script, given "init" as argv[1] will |
| suck existing leases out of the NVRAM and emit them from |
| stdout in the correct format. |
| |
| The second part of the problem is keeping the NVRAM up-to-date: this |
| is done by the lease-change script which dnsmasq runs when a lease is |
| updated. When it is called with argv[1] as "old", "add", or "del" |
| it updates the relevant nvram entry. |
| |
| So, dnsmasq should be run as : |
| |
| dnsmasq --leasefile-ro --dhcp-script=/path/to/lease_update.sh |
| |
| or the same flags added to /etc/dnsmasq.conf |
| |
| |
| |
| Notes: |
| |
| This needs dnsmasq-2.33 or later to work. |
| |
| This technique will work with, or without, compilation with |
| HAVE_BROKEN_RTC. Compiling with HAVE_BROKEN_RTC is |
| _highly_recommended_ for this application since is avoids problems |
| with the system clock being warped by NTP, and it vastly reduces the |
| number of writes to the NVRAM. With HAVE_BROKEN_RTC, NVRAM is updated |
| only when a lease is created or destroyed; without it, a write occurs |
| every time a lease is renewed. |
| |
| It probably makes sense to restrict the number of active DHCP leases |
| to an appropriate number using dhcp-lease-max. On a new DD_WRT system, |
| there are about 10K bytes free in the NVRAM. Each lease record is |
| about 100 bytes, so restricting the number of leases to 50 will limit |
| use to half that. (The default limit in the distributed source is 150) |
| |
| Any UI script which reads the dnsmasq leasefile will have to be |
| amended, probably by changing it to read the output of |
| `lease_update init` instead. |
| |
| |
| Thanks: |
| |
| To Steve Horbachuk for checks on the script and debugging beyond the |
| call of duty. |
| |
| |
| Simon Kelley |
| Fri Jul 28 11:51:13 BST 2006 |
| |
| |
| |
| |
| |