Uproot(uprt) is a multi-platform (Windows, MacOs, and Linux) command line utility written in Dart to convert a router's DHCP IP Reservations between routers. DHCP Reservations are also sometimes referred to as static mappings (and throughout this documentation they are typically referred to as static leases).
For example, uprt can be used to help move static leases from DD-Wrt to OpenWrt, or from OpenWrt to pfSense, or back and forth between various other router formats. Uprt avoids errors on import by verifying and enforcing required network ranges, eliminating duplicate leases, and validating Ip and Mac addresses.
In addition, uprt can merge existing lists of static leases using the merge command.
ip6 static leases are not supported.
Download Windows, Mac, and X86 Linux binaries
Like this project ? Please click the star at the top right corner of this page.
Many network administrators often have long lists of DHCP reservations specified in their router. Those who do a lot of home automation, for example may have many devices for which IPs have been statically assigned, making upgrading to a different type of router painful. Many times the IP reservations along with the associated Mac Addresses need to be manually re-entered into the new router's software. As long as the router formats are supported, Uproot allows one to export the list of DHCP Reservations from one router, and easily convert the list to a format of another supported type. In addition to straight import, Uproot can merge and validate the static leases from both the old and the new router, eliminating duplicates.
- DD-WRT
- Mikrotik RouterOS
- OPNSense
- OpenWrt
- pfSense
Also supports the following file formats:
- json
- csv
If you have a target device that is supported, but an unsupported source device (e.g., you are migrating from Google Wifi to OpenWrt), see Unsupported Routers - Creating A CSV File of Network Devices Using Nmap.
- Detection of input format based on extension (can also manually specify the format)
- Converts to multiple formats simultaneously
- Merges static leases from one file into another
- Optionally sorts static leases by IP addresses
- Validates lease to avoid import errors:
- Validates all generated files against expected output type
- Enforces IP range (optional)
- Excludes unnecessary duplicates from output
- Excludes invalid ip4 and Mac addresses from output
- Example input files available in source for testing
- Mikrotik RouterOS format does not yet support hostnames for Mikrotik leases (i.e., all output
rscfiles are generated without hostnames) - Does not support ip6 leases
Binaries are included for macOS, Linux, and Windows for the latest releases. Simply download to your respective platform and put in your path.
If you choose to compile yourself:
-
Open a terminal.
-
Install the latest version of Dart for your operating system.
-
Clone the repository (you'll need a personal access token if by https).
Example:
git clone https://github.com/GeekVisit/uproot.git
-
Pull down the dependencies:
cd uproot dart pub get -
Run all tests (optional):
dart test -
Change into the bin directory and compile:
cd bin dart compile exe uprt.dart -o uprt [or -o uprt.exe on windows]
-
If on Linux or Mac, set permission and copy into bin directory in path:
sudo chmod 700 ./uprt sudo cp ./uprt /usr/local/bin/uprt sudo chown $(whoami) /usr/local/bin/uprt -
If on Windows, make sure
uprt.exeis in a folder that is in your PATH environmental variable. If not, move it to the appropriate path or add the directory. -
Test the binary with included test files:
cd .. [so you are in the uproot folder] uprt test/test-data/lease-list-infile.csv -g cdjmnop -d test/test-output
For a complete list of options, type uprt or uprt -h
Below is the latest help:
uprt (2021.10.001 running on macos 10.15.7)
A tool to migrate static leases between DD-WRT, OpenWrt, OPNsense, Mikrotik, and pfSense routers. Also supports csv and json.
Usage:
-a, --append Used when --merge and --sort are given. If this flag is given, the merged file
will have the sorted leases from the source file appended to the end of the
target file leases rather than integrated with the merge file.
-b, --base-name Specify Base Name of Output Files (default uses basename of input file)
-d, --directory-out Directory to write files to, defaults to same directory as input file.
-h, --help Help
-t, --input-type Input file type: c (csv), d (ddwrt), j (json),
m (Mikrotik RouterOS), n (OPNsense), o (OpenWrt), p (pfsense)
If this option is not used, uprt will try to determine file
type based on the following extensions: .csv, .ddwrt,
.json, .rsc (mikrotik), .xml (for opnsense and pfsense,
distinguishing by searching for <opnsense> in file)
-g, --generate-type Required. Generated types may be multiple. Valid values include:
c (csv), d (DD-WRT), j (json),
m (Mikrotik RouterOS), n (OPNsense), o (OpenWrt), p (pfsense)
-L, --ip-low-address Enforced Lowest Ip of Network Range, Excludes Addresses Lower Than This From Target File
-H, --ip-high-address Enforced Highest Ip of Network Range, Excludes Addresses Higher Than This From Target File
-l, --log Creates Log file, if -P not set, then location is in temp folder
-P, --log-file-path Full file path to log file.
-m, --merge Merge to file. Specify path to file to merge converted output.
Used to add static leases to an existing output file.
-S, --server Name to designate in output file for Mikrotik dhcp server.
(defaults to "defconf")
-r, --replace-duplicates-in-merge-file Applies only when using --merge. If this option is set and the source file
has a static lease which has the same mac address, ip or hostname as a lease in
the merge file, the lease or leases in the merge file that have any of the
duplicate components will be discarded and the input lease will be used.
By default, this is set to false so any lease in the input file that has the
same ip, hostname, or mac address as one in the merge file is discarded.
-s, --[no-]sort Leases in resulting output file are sorted by Ip address.
(defaults to on)
-v, --verbose Verbosity - additional messages
-z, --verbose-debug Verbosity - debug level verbosity
-V, --version Gives Version
-w, --write-over Overwrites output files, if left out, will not overwriteExamples:
Convert a csv file to all formats (csv, json, DD-WRT, Mikrotik, OpenWrt, OPNsense, pfSense):
uprt test/test-data/lease-list-infile.csv -g cdjmnop -d test/test-outputConvert multiple csv files to PfSense and save output to a specified directory:
uprt test/test-data/*.csv -g p -d test/test-outputConvert a csv file to all formats, stripping out leases not in range and saving output to specified directory:
uprt test/test-data/lease-list-infile.csv -g cdjmnop -L 192.168.0.1 -H 192.168.0.254 -d test/test-outputMerging leases in a CSV file with an existing DDWRT file and generating an OpnSense file:
uprt test/test-data/lease-list-infile.csv -m test/test-merge/lease-list-infile-merge.ddwrt -g n -b example-merge-output -d test/test-outputMake a full backup of your router/firewall before importing any files generated by uprt. Use of uprt and files generated by uprt is entirely at user's risk.
To test uprt yourself, there are test input files are located under the test/test-data folder in the repository. Cd into the uproot directory and apply the examples given in uprt -h on the test files.
Below is a demonstration done on Mac Catalina showing the conversion from a .csv file to all formats.
After the conversion the demo scrolls through the resulting files.

To use Uproot, you'll need to export and import static leases to the respective routers.
Below are the export/import steps for each router/firewall type that is supported by Uproot.
The following router and firewall software are supported:
- DD-WRT
- Mikrotik RouterOS
- OPNSense
- OpenWrt
- pfSense
If you have a target device that is supported, but an unsupported source device (e.g., you are migrating from Google Wifi to OpenWrt), see Unsupported Routers - Creating A CSV File of Network Devices Using Nmap.
-
Ssh into your router and enter the following on the command line to export static leases to a file:
nvram get static_leases > static_leases.ddwrt -
Download the
static_lease.ddwrtfile from the router by using WinScp or a similar utility. If you do use WinScp, use the SCP protocol. -
Alternatively you can simply execute
nvram get static_leasesand copy the output from the terminal, paste it into a text file and save it locally. -
Now use the exported file as an input file to Uproot and convert to your required format.
Example:
Converting from DD-WRT format to OpenWrt format, with static leases having range of 192.168.0.1 to 192.168.0.254:
uprt static_leases.ddwrt -g o -L 192.168.0.1 -H 192.168.0.254
-
NOTE: Always Make a backup of your DD-WRT software configuration before importing (via backup tab in the Web interface). All imports will REPLACE your existing static leases. To add leases to an existing file, use the
--merge option. ** -
Using WinSCP (if on Windows) or a similar utility, login to your router and upload the
static_leases.ddwrtfile to the router. -
Using Putty if on Windows, or other ssh command line client, type the following, and press
Enter,replacing "X" with the number of static leases you are importing.nvram set static_leasenum=X -
Type the following and press
Enter. Note that the quotes are important:nvram set static_leases="$(cat static_leases.ddwrt)" nvram commit
-
Reboot the router. Your static leases should appear under the
Servicestab in the browser interface. -
TIP: If you have any issues with the above, log in using your browser to your router and view the changes as you make them. For instance, you can click on the
Servicestab and view the static leases after you set the nvram variable. If thenvram commitdoesn't work try clicking "Save" and then "Apply Settings" in the browser interface.
-
Using Putty if on Windows, or other ssh command line client, log into your router and type the following which will extract the static leases to a separate file for download:
grep -hnr -A3 "config host" /etc/config/dhcp > static_leases.openwrt
If this gives an error (e.g., if your version of OpenWrt does not have grep installed), just use copy (
uprtwill still be able to ignore the extra configuration information and extract the lease information from the raw dhcp file):cp /etc/config/dhcp static_leases.openwrt
-
Verify that the resulting file contains the static lease information:
cat static_leases.openwrt
-
Using scp or WinScp if on Windows, download the
static_leases.openwrtfile. -
Use the exported file as an input file to Uproot and convert to your required format.
Examples:
Converting DD-WRT to a json file
uprt static_leases.ddwrt -g j -L 192.168.0.1 -H 192.168.0.254
Converting DD-WRT to a Mikrotik RouterOS import script
uprt static_leases.ddwrt -g m -L 192.168.0.1 -H 192.168.0.254 -s defconf
-
NOTE: Always Make a backup of your Openwrt Router Files before importing! All imports will REPLACE your existing static leases. To add leases to an existing file, use the --merge option.
-
Using WinSCP (if on Windows) or a similar scp utility, login to your router and upload the file to be imported to the router (
static_leases.openwrtin the Open-WRT export example). -
Using Putty or other ssh command line client, enter the following two lines:
cp /etc/config/dhcp /etc/config/dhcp.original cat *infile.openwrt >> /etc/config/dhcpWARNING: Be sure that there are two
>>, otherwise the dhcp file will be overwritten instead of appended. Thus the recommended backup! To merge [will remove duplicates] instead of append, see step 4. -
ALTERNATIVELY, you can download the
dhcpfile to your local computer, merge the import file usinguprt, then upload the resultingdhcp.openwrtfile with the resulting merged file (you'll need to rename the output file todhcp). The advantage of this is you'll be able to sort the static leases by IP address anduprtwill also automatically take care of duplicates (please seeuprt -hfor sorting and append options). Example:-
On local computer:
uprt infile.openwrt -g o -m dhcp -b dhcp
-
Upload dhcp.openwrt to your router, remove the "openwrt" and replace /etc/config/dhcp.
cp /etc/config/dhcp /etc/config/dhcp.original cp /etc/config/dhcp.openwrt /etc/config/dhcp
-
-
Reboot the router. Your static leases should appear under the
Servicestab in the browser interface. -
TIP: If you have any issues with the above, login using your browser to your router. Static leases should appear in
Network->DHCP and DNS->Static Lease. If you don't see the imported leases, repeat steps, viewing the browser window as you make them. After the static leases appear, clickSave & Applyon theDHCP and DNSweb page.
-
Log in to your OPNsense router and navigate to System->Configuration->Backups.
-
Click on the big "Download configuration" button and download the file.
-
The backup file you've downloaded contains ALL backup data for the router. As of this writing, the OPNSense configuration does not allow partial backups of data (although it does allow partial restores). Since you only need the data in the static map tags and their parents and related closing tags, you can delete all tags unrelated to the static lease export. Preserve the static map tags and the other tags shown in the below example, but delete all others:
-
Use the exported file as an input file to Uproot and convert to your required format.
Example:
Converting OPNSense to pfSense
uprt static_leases-opn.xml -g p -L 192.168.0.1 -H 192.168.0.254
-
NOTE: Always make a backup of your OPNsense configuration before importing !
-
Importing REPLACES any static leases your router currently has. If you are adding leases to an existing configuration, follow these steps for merging .
-
To start your import, log in to your OPNsense router and navigate to System->Configuration->Backups.
-
Click on the big "Download configuration" button and download the file.
-
In the
Restoresection under theRestore Areaclick on the drop down arrow and changeAlltoDHCP Server. Click onBrowse ...and select the file to be imported. Then click "Restore configuration". -
OPNSense should respond with a "Successful" message.
-
To view the imported leases, navigate to Services->DHCPv4->[LAN].
-
Scroll down and verify the static leases have been imported.
If you are ADDING leases to an existing OpnSense configuration, you'll need to use the --merge option, merging the import file into a backup file of your existing configuration. Download to your local computer a backup from your existing configuration, then merge with the file to be imported:
uprt static_leases-to-import-opn.xml -m static-lease-backup.xml -g o -b merge-output This will output a "merge-output-opn.xml" file. Import this into your OpnSense router.
-
Log into pfSense using your browser and navigate to Diagnostics->Backup & Restore:
-
Scroll down to
Backup Configurationand setBackup areatoDHCP Server. ClickDownload configuration as XML. -
Use the exported file as an input file to Uproot and convert to your required format.
Example
Convert pfSense to OPNsense:
uprt static_leases-pfs.xml -g p -L 192.168.0.1 -H 192.168.0.254
-
NOTE: Always make a backup of your pfSense configuration before importing !
-
Importing REPLACES any static leases you currently have. If you are adding leases to an existing configuration, follow these steps for merging .
-
Log into pfSense using your browser and navigate to Diagnostics->Backup & Restore:
-
In the
Restoresection under theRestore Areaclick on the drop down arrow and changeAlltoDHCP Server. -
Click on `Browse ..." and select the file to be imported. Then click "Restore Configuration".
-
pfSense should respond with a "The configuration area has been restored. The firewall may need to be rebooted."
-
To verify the leases have been imported, navigate to Services->DHCP Server. Click on the LAN tab and scroll down to the "DHCP Static Mappings for this Interface" section where your imported leases should appear:
If you are ADDING leases to an existing pfSense configuration, you'll need to use the --merge option, merging the import file into a backup file of your existing configuration.
Download to your local computer a backup from your existing configuration, then merge with the file to be imported:
uprt static_leases-to-import-pfs.xml -m static-lease-backup.xml -g p -b merge-outputThis will output a "merge-output-pfs.xml" file. Import this file into your pfSense router.
-
Open
New Terminalfrom the menu in Winbox, or in Webfig click on theTerminalbutton on the top. -
Execute the following:
/ip dhcp-server lease export file=dhcp-static-leases.rsc -
This exports a file called "dhcp-static-leases.rsc" which will appear in
Files. -
Click on the
Filesmenu item. -
Download the
dhcp-static-leases.rscto your computer. -
Use the exported file as an input file to Uproot and convert to your required format.
Example: Convert Mikrotik RouterOS file to pfSense
uprt dhcp-static_leases.rsc -g p -L 192.168.0.1 -H 192.168.0.254
-
Select
Filesfrom the menu and upload your input file (or just drag and drop your file if using Winbox). -
Open
New Terminalfrom the menu in Winbox, or in Webfig click on theTerminalbutton on the top. -
Execute the following, changing the name of the input file as needed:
/import file=dhcp-static-leases.rsc
-
The terminal should respond "Script file loaded and executed successfully".
-
Common Error Messages:
- "Already have a static lease for this client" - Edit the input file to delete the lease, or alternatively use the
--mergeoption - see above.** - "input does not match any value of server" - Most likely the DHCP server named in your input file is different from your Mikrotik RouterOS configuration. Either change the name of the DHCP Server (in Winbox, IP->DHCP Server->DHCP and click on server), or edit the input file. Uprt also has a "-s" option to set the server name when converting to Mikrotik RouterOS files.
- "Already have a static lease for this client" - Edit the input file to delete the lease, or alternatively use the
-
Verify all leases are imported by navigating to IP->DHCP Server and clicking the
Leasestab.Or, alternatively, by using the terminal:
/ip dhcp-server lease print
-
If you are ADDING leases to an existing Mikrotik configuration, you'll want to use the
--mergeoption, merging the import file into a backup file of your existing configuration. -
Download to your local computer a backup from your existing configuration, then merge with the file to be imported:
uprt dhcp-static-leases.rsc -m dhcp-static-leases-export.rsc -g m -b merge-output
-
This will output a "merge-output.rsc" file. Upload the file to your Mikrotik router and follow the steps for importing.
If Uproot does not support your existing router and you wish to generate a list of the devices on your network to be used as a source file for uprt, you can use nmap and awk to generate a CSV file containing all online devices. You will need to edit the file to delete any devices you don't want to assign a static lease, or add any devices which were offline during the scan.
-
Install nmap and awk if not already installed.
-
Open a terminal and check if
nmapis installed, if not install. -
Do the same for
awk.awkis usually installed by default for Mac and Linux.gawkwill work. -
To install
awkon Windows, if you have chocolatey installed, at an Administrator command prompt, enterchoco install nmapandchoco install gawk. If you aren't using chocolatey, download and install nmap and awk.
-
-
The following command will generate the CSV file
ip_list.csvcontaining the leases of your online devices. The versions for the different operating systems differ slightly.
Windows :
nmap -sn X.X.X.X/X| awk "BEGIN { printf \"host-name,mac-address,address\n\";}/Nmap scan report for/{host = (NF == 6) ? $5 : \"\"; ip = (NF==6) ? $6 : $5; gsub(/\(/,\"\",ip);gsub(/\)/,\"\",ip);}/MAC Address:/{mac=$3; printf host\",\"mac\",\"ip\"\n\";}" > ip_list.csvLinux and Mac :
sudo nmap -sn X.X.X.X/X| awk 'BEGIN { printf "host-name,mac-address,address\r\n";}/Nmap scan report for/{host = (NF == 6) ? $5 : ""; ip = (NF==6) ? $6 : $5; gsub(/\(/,"",ip); gsub(/\)/,"",ip);}/MAC Address:/{mac=$3; printf host","mac","ip"\n";}' > ip_list.csvReplace "X.X.X.X/X" with your network's gateway and applicable CIDR (e.g., 192.168.1.1/24 if your network gateway is 192.168.1.1 using the typical home network CIDR of 24).
On Linux and Mac you must use sudo. Otherwise nmap will not be able to detect the mac addresses. The only difference between the above two statements, other than the removal of sudo for Windows is the different use of quotations. Windows requires quotes to be escaped and double quotes surrounding the awk statement.
A static lease or DHCP Reservation forces your router to assign the same IP address to a particular device on the network. By default, your router's DHCP server will dynamically assign IP addresses randomly to your network devices. By reserving an IP address for a particular device (e.g., 192.168.0.10 for a Raspberry Pi running piHole) the DHCP server is reserving a specified IP address for that device only, resulting in the same lease being assigned each time the device comes online (so such lease is static rather than dynamic), making it much easier for other devices to communicate with it. This can be particularly helpful for configuring home automation devices or setting up port forwarding.













