From 0446009f28558df48240291ef94bfea2848ee569 Mon Sep 17 00:00:00 2001 From: ji Date: Sun, 10 Nov 2024 15:38:56 +0100 Subject: [PATCH] v0.1.9 --- .gitignore | 64 ++++++++++ README.md | 52 +++++++- examples/add_vlans.py | 48 ++++--- python/README.md | 120 ++++++++---------- python/build/lib/opnsense_helper/classes.py | 10 +- python/build/lib/opnsense_helper/utils.py | 12 +- .../opnsense_helper-0.1.1-py3-none-any.whl | Bin 6842 -> 0 bytes python/dist/opnsense_helper-0.1.1.tar.gz | Bin 3266 -> 0 bytes .../opnsense_helper-0.1.2-py3-none-any.whl | Bin 7410 -> 0 bytes .../opnsense_helper-0.1.3-py3-none-any.whl | Bin 6194 -> 0 bytes .../opnsense_helper-0.1.4-py3-none-any.whl | Bin 6190 -> 0 bytes .../opnsense_helper-0.1.5-py3-none-any.whl | Bin 6190 -> 0 bytes .../opnsense_helper-0.1.7-py3-none-any.whl | Bin 7893 -> 0 bytes python/opnsense_helper.egg-info/PKG-INFO | 2 +- python/opnsense_helper/README.md | 1 + python/setup.py | 2 +- 16 files changed, 207 insertions(+), 104 deletions(-) create mode 100644 .gitignore delete mode 100644 python/dist/opnsense_helper-0.1.1-py3-none-any.whl delete mode 100644 python/dist/opnsense_helper-0.1.1.tar.gz delete mode 100644 python/dist/opnsense_helper-0.1.2-py3-none-any.whl delete mode 100644 python/dist/opnsense_helper-0.1.3-py3-none-any.whl delete mode 100644 python/dist/opnsense_helper-0.1.4-py3-none-any.whl delete mode 100644 python/dist/opnsense_helper-0.1.5-py3-none-any.whl delete mode 100644 python/dist/opnsense_helper-0.1.7-py3-none-any.whl create mode 120000 python/opnsense_helper/README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..edd58e5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,64 @@ +# Verschlüsselte Daten +*.key +*.pem +*.pfx +*.crt +*.certbot + +# Kompilierte Dateien +__pycache__ +*.py[cod] +*$py.class + +# Log-Dateien +*.log + +# Temporäre Dateien +*.tmp +*.swp +*.swo + +# IDE-Spezifische Dateien +.vscode/ +.idea/ + +# Python-Verpackungen +dist/ +build/ +*.egg-info + +# Virtual Environment +venv/ +env/ +ENV/ + +# Lokale Entwicklungsskripte +*.pyc +__init__.py* +*.so +*.dylib +*.dll + +# Test-Ausgaben +test_*.out +*.test + +# Build-Dateien +*.exe +*.exe~ +*.bin +*.class + +# Verschlüsselte Dateien +*.gpg +*.asc + +# Archivierte Dateien +*.tar.gz +*.tar.bz2 +*.tar.xz +*.zip + +# Docker-Dateien +.DS_Store +Thumbs.db diff --git a/README.md b/README.md index d80d75f..68c677e 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,60 @@ # opnsense-helper assign lan interfaces, create vlans, vlan-interfaces and setup dhcp in a single script. - - ## install ## pip ```bash pip install opnsense-helper ``` - - ## usage - before you create Vlan-Interfaces you need to add them first using the add_vlan method -- you can also add them via config file but this requires a reboot and it's not yet implemented +- rn i try to find out how to reconfigure the vlans using the backend, but this is on todo list +```python +from opnsense_helper.classes import Opnsense_Helper + +filepath = '/home/ji/confignew.xml' +output="./config.xml" +conf_path="/conf/config.xml" +vlans=[ + {'if': 'vtnet1', 'tag': '1', 'pcp': '0', 'proto': None, 'descr': 'vlan1', 'vlanif': 'vlan0.1'}, + {'if': 'vtnet1', 'tag': '2', 'pcp': '0', 'proto': None, 'descr': 'vlan2', 'vlanif': 'vlan0.2'} + ] +dhcp={ +"opt2": {'enable': '1', 'ddnsdomainalgorithm': 'hmac-md', "range":{'from': '200.0.3.10', '_to': '200.0.3.100'}}, +"opt3": {'enable': '1', 'ddnsdomainalgorithm': 'hmac-md', "range":{'from': '200.0.4.10', '_to': '200.0.4.100'}} +} +interfaces={ +"opt1": {'descr': 'router', 'enable': '1', 'ipaddr': None, 'subnet': None, 'type': None, 'virtual': None, 'spoofmac': '00:00:00:00:02:01',"interface":"vtnet1"}, +"opt2": {'descr': 'vlan1', 'enable': '1', 'ipaddr': '200.0.3.1', 'subnet': '24', 'type': None, 'virtual': None, 'spoofmac': '00:00:00:00:00:01',"interface":"vlan0.1"}, +"opt3": {'descr': 'vlan2', 'enable': '1', 'ipaddr': '200.0.4.1', 'subnet': '24', 'type': None, 'virtual': None, 'spoofmac': '00:00:00:00:00:02', "interface":"vlan0.2"} +} +ssh_auth={ +"user":"root", +"passw":"opnsense", +} +api_auth={ +# ONLY NEED WHEN YOU USE THE API +"api_key" :'ejl4fIU9yfNk+gaQmPk/rqIa15f1yX1snIKgcIEl2QNoJwhbekraWIE0ANRYceh9hey5IFGzlf3da4yJ', +"api_secret" : '5JVVGoatPbaAA+FozLDQY92/T6sRlmKD1+aRNl/YI8KA9/0TNiTDboLveqvd9FU8wFeDo3D3DY5wrUtF', +"ssl": True, +"verify": False +} +host= "192.168.1.103" +def test(): + helper=Opnsense_Helper(host=host,ssh_auth=ssh_auth,api_auth=api_auth,filepath=output, verbose=False) + helper.add_vlans(vlans) + #helper.set_vlans(vlans) + helper.get_conf(conf_path) + helper.initialize() + helper.add_Items("interfaces",interfaces) + helper.add_Items("dhcpd",dhcp) + helper.save(output) + helper.put_file(output,conf_path) + helper.close_con() + +if __name__ == "__main__": + test() +``` ### contribute - clone, or fork `git@github.com:the-pod-shop/opnsense-helper.git` diff --git a/examples/add_vlans.py b/examples/add_vlans.py index 07e7895..2ef696a 100644 --- a/examples/add_vlans.py +++ b/examples/add_vlans.py @@ -1,24 +1,42 @@ from opnsense_helper.classes import Opnsense_Helper + filepath = '/home/ji/confignew.xml' -output="/home/ji/.ansible/collections/ansible_collections/ji_podhead/podnet/plugins/x.xml" +output="./config.xml" conf_path="/conf/config.xml" -vlan3 ={'parentinterface': 'vtnet1', 'tag': '3', 'pcp': '0', 'proto': None, 'descr': 'vlan3', 'vlanif': 'vlan0.3',"attr":{"uuid":"cb503df8-821d-4acd-86ba-66b35e4df17n"}} -vlan4 ={'parentinterface': 'vtnet1', 'tag': '4', 'pcp': '0', 'proto': None, 'descr': 'vlan4', 'vlanif': 'vlan0.4',"attr":{"uuid":"cb503df8-821d-4acd-86ba-66b35e4s7c"}} -opt3_dhcp= {'enable': '1', 'ddnsdomainalgorithm': 'hmac-md', "range":{'from': '200.0.3.10', '_to': '200.0.3.100'},"attr":None} -opt4_dhcp= {'enable': '1', 'ddnsdomainalgorithm': 'hmac-md', "range":{'from': '200.0.4.10', '_to': '200.0.4.100'},"attr":None} -opt3_interface= {'descr': 'vlan3', 'enable': '1', 'ipaddr': '200.0.3.1', 'subnet': '24', 'type': None, 'virtual': None, 'spoofmac': '00:00:00:00:00:03', 'attr': {}} -opt4_interface= {'descr': 'vlan4', 'enable': '1', 'ipaddr': '200.0.3.1', 'subnet': '24', 'type': None, 'virtual': None, 'spoofmac': '00:00:00:00:00:04', 'attr': {}} +vlans=[ + {'if': 'vtnet1', 'tag': '1', 'pcp': '0', 'proto': None, 'descr': 'vlan1', 'vlanif': 'vlan0.1'}, + {'if': 'vtnet1', 'tag': '2', 'pcp': '0', 'proto': None, 'descr': 'vlan2', 'vlanif': 'vlan0.2'} + ] +dhcp={ +"opt2": {'enable': '1', 'ddnsdomainalgorithm': 'hmac-md', "range":{'from': '200.0.3.10', '_to': '200.0.3.100'}}, +"opt3": {'enable': '1', 'ddnsdomainalgorithm': 'hmac-md', "range":{'from': '200.0.4.10', '_to': '200.0.4.100'}} +} +interfaces={ +"opt1": {'descr': 'router', 'enable': '1', 'ipaddr': None, 'subnet': None, 'type': None, 'virtual': None, 'spoofmac': '00:00:00:00:02:01',"interface":"vtnet1"}, +"opt2": {'descr': 'vlan1', 'enable': '1', 'ipaddr': '200.0.3.1', 'subnet': '24', 'type': None, 'virtual': None, 'spoofmac': '00:00:00:00:00:01',"interface":"vlan0.1"}, +"opt3": {'descr': 'vlan2', 'enable': '1', 'ipaddr': '200.0.4.1', 'subnet': '24', 'type': None, 'virtual': None, 'spoofmac': '00:00:00:00:00:02', "interface":"vlan0.2"} +} +ssh_auth={ +"user":"root", +"passw":"opnsense", +} +api_auth={ +# ONLY NEED WHEN YOU USE THE API +"api_key" :'ejl4fIU9yfNk+gaQmPk/rqIa15f1yX1snIKgcIEl2QNoJwhbekraWIE0ANRYceh9hey5IFGzlf3da4yJ', +"api_secret" : '5JVVGoatPbaAA+FozLDQY92/T6sRlmKD1+aRNl/YI8KA9/0TNiTDboLveqvd9FU8wFeDo3D3DY5wrUtF', +"ssl": True, +"verify": False +} +host= "192.168.1.103" def test(): - helper=Opnsense_Helper(filepath,True,"root","opnsense","192.168.1.103") - helper.get_file(conf_path, output) + helper=Opnsense_Helper(host=host,ssh_auth=ssh_auth,api_auth=api_auth,filepath=output, verbose=False) + helper.add_vlans(vlans) + #helper.set_vlans(vlans) + helper.get_conf(conf_path) helper.initialize() - helper.objects["dhcpd"]["opt3"]=opt3_dhcp - helper.objects["dhcpd"]["opt4"]=opt4_dhcp - helper.objects["vlans"]["vlan3"]=vlan3 - helper.objects["vlans"]["vlan4"]=vlan4 - helper.objects["interfaces"]["opt3"]=opt3_interface - helper.objects["interfaces"]["opt4"]=opt4_interface + helper.add_Items("interfaces",interfaces) + helper.add_Items("dhcpd",dhcp) helper.save(output) helper.put_file(output,conf_path) helper.close_con() diff --git a/python/README.md b/python/README.md index 27d1db2..68c677e 100644 --- a/python/README.md +++ b/python/README.md @@ -1,83 +1,62 @@ # opnsense-helper assign lan interfaces, create vlans, vlan-interfaces and setup dhcp in a single script. - - ## install ## pip ```bash pip install opnsense-helper ``` - ## usage - -### python - -- import and create object -```python -from opnsense_helper.opnsense_helper import OpennsenseHelper -helper=OpennsenseHelper(filepath,True,"root","opnsense","192.168.1.103") -``` -- add some vars we need later +- before you create Vlan-Interfaces you need to add them first using the add_vlan method +- rn i try to find out how to reconfigure the vlans using the backend, but this is on todo list + ```python +from opnsense_helper.classes import Opnsense_Helper + filepath = '/home/ji/confignew.xml' -output="/home/ji/.ansible/collections/ansible_collections/ji_podhead/podnet/plugins/x.xml" +output="./config.xml" conf_path="/conf/config.xml" - -# the variables of the things we will modif -vlan3 ={'parentinterface': 'vtnet1', 'tag': '3', 'pcp': '0', 'proto': None, 'descr': 'vlan3', 'vlanif': 'vlan0.3',"attr":{"uuid":"cb503df8-821d-4acd-86ba-66b35e4df17n"}} -vlan4 ={'parentinterface': 'vtnet1', 'tag': '4', 'pcp': '0', 'proto': None, 'descr': 'vlan4', 'vlanif': 'vlan0.4',"attr":{"uuid":"cb503df8-821d-4acd-86ba-66b35e4s7c"}} -opt3_dhcp= {'enable': '1', 'ddnsdomainalgorithm': 'hmac-md', "range":{'from': '200.0.3.10', '_to': '200.0.3.100'},"attr":None} -opt4_dhcp= {'enable': '1', 'ddnsdomainalgorithm': 'hmac-md', "range":{'from': '200.0.4.10', '_to': '200.0.4.100'},"attr":None} -opt3_interface= {'descr': 'vlan3', 'enable': '1', 'ipaddr': '200.0.3.1', 'subnet': '24', 'type': None, 'virtual': None, 'spoofmac': '00:00:00:00:00:03', 'attr': {}} -opt4_interface= {'descr': 'vlan4', 'enable': '1', 'ipaddr': '200.0.3.1', 'subnet': '24', 'type': None, 'virtual': None, 'spoofmac': '00:00:00:00:00:04', 'attr': {}} - -``` -- get the current conf file -- initilaize the values and scan for object -- dumb the object to xml -. put the file back to the ssh-host -- close ssh-connection -```python -helper.get_file(conf_path, output) -helper.initialize() -helper.objects["dhcpd"]["opt3"]=opt3_dhcp -helper.objects["dhcpd"]["opt4"]=opt4_dhcp -helper.objects["vlans"]["vlan3"]=vlan3 -helper.objects["vlans"]["vlan4"]=vlan4 -helper.objects["interfaces"]["opt3"]=opt3_interface -helper.objects["interfaces"]["opt4"]=opt4_interface -helper.save(output) -helper.put_file(output,conf_path) -helper.close_con() +vlans=[ + {'if': 'vtnet1', 'tag': '1', 'pcp': '0', 'proto': None, 'descr': 'vlan1', 'vlanif': 'vlan0.1'}, + {'if': 'vtnet1', 'tag': '2', 'pcp': '0', 'proto': None, 'descr': 'vlan2', 'vlanif': 'vlan0.2'} + ] +dhcp={ +"opt2": {'enable': '1', 'ddnsdomainalgorithm': 'hmac-md', "range":{'from': '200.0.3.10', '_to': '200.0.3.100'}}, +"opt3": {'enable': '1', 'ddnsdomainalgorithm': 'hmac-md', "range":{'from': '200.0.4.10', '_to': '200.0.4.100'}} +} +interfaces={ +"opt1": {'descr': 'router', 'enable': '1', 'ipaddr': None, 'subnet': None, 'type': None, 'virtual': None, 'spoofmac': '00:00:00:00:02:01',"interface":"vtnet1"}, +"opt2": {'descr': 'vlan1', 'enable': '1', 'ipaddr': '200.0.3.1', 'subnet': '24', 'type': None, 'virtual': None, 'spoofmac': '00:00:00:00:00:01',"interface":"vlan0.1"}, +"opt3": {'descr': 'vlan2', 'enable': '1', 'ipaddr': '200.0.4.1', 'subnet': '24', 'type': None, 'virtual': None, 'spoofmac': '00:00:00:00:00:02', "interface":"vlan0.2"} +} +ssh_auth={ +"user":"root", +"passw":"opnsense", +} +api_auth={ +# ONLY NEED WHEN YOU USE THE API +"api_key" :'ejl4fIU9yfNk+gaQmPk/rqIa15f1yX1snIKgcIEl2QNoJwhbekraWIE0ANRYceh9hey5IFGzlf3da4yJ', +"api_secret" : '5JVVGoatPbaAA+FozLDQY92/T6sRlmKD1+aRNl/YI8KA9/0TNiTDboLveqvd9FU8wFeDo3D3DY5wrUtF', +"ssl": True, +"verify": False +} +host= "192.168.1.103" +def test(): + helper=Opnsense_Helper(host=host,ssh_auth=ssh_auth,api_auth=api_auth,filepath=output, verbose=False) + helper.add_vlans(vlans) + #helper.set_vlans(vlans) + helper.get_conf(conf_path) + helper.initialize() + helper.add_Items("interfaces",interfaces) + helper.add_Items("dhcpd",dhcp) + helper.save(output) + helper.put_file(output,conf_path) + helper.close_con() + +if __name__ == "__main__": + test() ``` -### adding vlans - -| tpe | name | -| --- | --- | -| NIC | veth1 | -| Interface | router | -| Vlan | vlan0.1 | -| VlanInterface | vlan1 | - - -- no redundant assigntments allowed -- reset to default config before reassigning -- roll back to snapshot -- old vlans and interfaces must explicitl get deleted and the config cant provide this -- however config gives freedom over runtime changes without entire cloudinit -- keep in mind that violating given rules can cause a broken vm - -### copy the config file to your machine manually -```bash -scp root@192.168.1.103:/conf/config.xml /home/user/confignew.xml && chmod +x /home/user/confignew.xml && chown user:user /home/user/confignew.xml -``` -### replace the original file manually -```bash -scp /home/user/config.xml root@192.168.1.103:/conf/config.xml -``` -## contribute -### python +### contribute - clone, or fork `git@github.com:the-pod-shop/opnsense-helper.git` - build when made changes - make sure to use the right user @@ -87,6 +66,7 @@ python setup.py bdist_wheel \ && pip install --upgrade . \ && python3 -m pip install --upgrade build #--force ``` +- you can also use the build.sh script - create pull request ## motivation @@ -96,4 +76,8 @@ python setup.py bdist_wheel \ - but /conf/config.xml has the answer. - however for phisical interfaces its the god damn conf.rc - my opnsense runs in a vm, so it really doesnt matter for me -- i just add the interfaces via libvirt and all i need to do is to enable them, given the /conf/config.xml method \ No newline at end of file +- i just add the interfaces via libvirt and all i need to do is to enable them, given the /conf/config.xml method +xml has the answer. +- however for phisical interfaces its the god damn conf.rc +- my opnsense runs in a vm, so it really doesnt matter for me +- i just add the interfaces via libvirt and all i need to do is to enable them, given the /conf/config.xml method diff --git a/python/build/lib/opnsense_helper/classes.py b/python/build/lib/opnsense_helper/classes.py index 7e4ad7d..8cff2cd 100644 --- a/python/build/lib/opnsense_helper/classes.py +++ b/python/build/lib/opnsense_helper/classes.py @@ -85,7 +85,7 @@ def save(self,output): """ update_xml_file(self.objects["dhcpd"],self.root,"dhcpd") update_xml_file(self.objects["interfaces"],self.root,"interfaces") - update_xml_file(self.objects["vlans"],self.root,"vlans") + #update_xml_file(self.objects["vlans"],self.root,"vlans") with open(output, 'w') as f: f.write(ET.tostring(self.root, encoding='unicode', method='xml')) def get_all(self,element): @@ -129,7 +129,10 @@ def get_all(self,element): child.attr=key.attrib if key.attrib is not None else None print(child.attr) - name = key.tag if element != "vlans" else child.descr + if element != "vlans": + name = key.tag + else: + name = child.descr self.objects[element][name]=child.__dict__ print(f'''{key.tag} : {child.__dict__} -------------------''') @@ -202,7 +205,8 @@ def add_vlans(self,vlans): payload={"vlan":value} r=api_post(self,"interfaces/vlan_settings/addItem",payload) print(r) - + r=api_post(self,"interfaces/vlan_settings/reconfigure",{}) + print(r) # please use the get_backup function to avoid losing data def get_conf(self,_from,_to=None): diff --git a/python/build/lib/opnsense_helper/utils.py b/python/build/lib/opnsense_helper/utils.py index 7ab38b1..b0d9fee 100644 --- a/python/build/lib/opnsense_helper/utils.py +++ b/python/build/lib/opnsense_helper/utils.py @@ -13,17 +13,7 @@ } #curl -k -u $OPNS_KEY:$OPNS_SECRET https://$IPFW/api/diagnostics/interface/getinterfaceconfig -def get_child(root,element, id, keys): - elements=[] - for parent in root.findall(element): - child= {} - for y in keys: - child[y]=None - for x in parent.findall(id): - for key in keys: - child[key]=parseChild(x, key) - elements.append(child) - return elements + def parseChild(parent, tag): result=parent.find(tag) diff --git a/python/dist/opnsense_helper-0.1.1-py3-none-any.whl b/python/dist/opnsense_helper-0.1.1-py3-none-any.whl deleted file mode 100644 index ef1496ec7b7638f9aa4d3cd4b083b626ca60f317..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6842 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 diff --git a/python/dist/opnsense_helper-0.1.1.tar.gz b/python/dist/opnsense_helper-0.1.1.tar.gz deleted file mode 100644 index 856af9e7a85e16231e5fdbfd7e8c690d33479235..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3266 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 diff --git a/python/dist/opnsense_helper-0.1.3-py3-none-any.whl b/python/dist/opnsense_helper-0.1.3-py3-none-any.whl deleted file mode 100644 index 609be9bf23b531f462f59ead543ba0d9d2b74895..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6194 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 F{tq53%1{6R diff --git a/python/dist/opnsense_helper-0.1.4-py3-none-any.whl b/python/dist/opnsense_helper-0.1.4-py3-none-any.whl deleted file mode 100644 index a46d8a07d05cea3b41d77e86274bbe9b64645f57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6190 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 diff --git a/python/dist/opnsense_helper-0.1.5-py3-none-any.whl b/python/dist/opnsense_helper-0.1.5-py3-none-any.whl deleted file mode 100644 index 984e4d2bce3a461f0b1cbd5bda1405a101cf260f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6190 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 diff --git a/python/dist/opnsense_helper-0.1.7-py3-none-any.whl b/python/dist/opnsense_helper-0.1.7-py3-none-any.whl deleted file mode 100644 index 40840dbba4edd2069d5f82cc5720428f4a87df10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7893 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 VQwk0Mpgdh)o`mb}udX%VKLF5PB?$lk diff --git a/python/opnsense_helper.egg-info/PKG-INFO b/python/opnsense_helper.egg-info/PKG-INFO index 04ea142..b62df0c 100644 --- a/python/opnsense_helper.egg-info/PKG-INFO +++ b/python/opnsense_helper.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: opnsense_helper -Version: 0.1.7 +Version: 0.1.9 Summary: assign lan interfaces, create vlans, vlan-interfaces and setup dhcp in a single script. Home-page: https://github.com/the-pod-shop/opnsense-helper/ Author: ji-podhdead diff --git a/python/opnsense_helper/README.md b/python/opnsense_helper/README.md new file mode 120000 index 0000000..42061c0 --- /dev/null +++ b/python/opnsense_helper/README.md @@ -0,0 +1 @@ +README.md \ No newline at end of file diff --git a/python/setup.py b/python/setup.py index 9e30237..41a4a33 100644 --- a/python/setup.py +++ b/python/setup.py @@ -2,7 +2,7 @@ setup( name='opnsense_helper', - version='0.1.7', + version='0.1.9', description='assign lan interfaces, create vlans, vlan-interfaces and setup dhcp in a single script.', url='https://github.com/the-pod-shop/opnsense-helper/', author='ji-podhdead',