{"id":23983630,"url":"https://github.com/iitoneloc/ngs-dynamic-subnet","last_synced_at":"2025-10-09T09:35:49.301Z","repository":{"id":270258461,"uuid":"909192511","full_name":"iiTONELOC/ngs-dynamic-subnet","owner":"iiTONELOC","description":"A dependency-free Python module for dynamically generating subnet configuration settings with minimal input.","archived":false,"fork":false,"pushed_at":"2024-12-29T19:02:03.000Z","size":32,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-24T23:45:38.851Z","etag":null,"topics":["python3","subnet-calculator"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iiTONELOC.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-12-28T01:30:41.000Z","updated_at":"2024-12-29T19:02:07.000Z","dependencies_parsed_at":"2024-12-29T20:27:51.828Z","dependency_job_id":null,"html_url":"https://github.com/iiTONELOC/ngs-dynamic-subnet","commit_stats":null,"previous_names":["iitoneloc/ngs-dynamic-subnet"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/iiTONELOC/ngs-dynamic-subnet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iiTONELOC%2Fngs-dynamic-subnet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iiTONELOC%2Fngs-dynamic-subnet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iiTONELOC%2Fngs-dynamic-subnet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iiTONELOC%2Fngs-dynamic-subnet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iiTONELOC","download_url":"https://codeload.github.com/iiTONELOC/ngs-dynamic-subnet/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iiTONELOC%2Fngs-dynamic-subnet/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279001121,"owners_count":26083022,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-09T02:00:07.460Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["python3","subnet-calculator"],"created_at":"2025-01-07T12:19:17.166Z","updated_at":"2025-10-09T09:35:49.285Z","avatar_url":"https://github.com/iiTONELOC.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# NGS - Dynamic Subnet\n\nA dependency-free Python module for dynamically generating subnet configuration settings with minimal input.\n\nAutomatically generate subnet configurations based on a given parent network, number of desired subnets, and number of hosts per subnet.\n\n## Screenshot\n\n![Screenshot](./screenshot.png)\n\n## Table of Contents\n\n- [Installation](#installation)\n- [Usage](#usage)\n  - [As Module](#as-module)\n  - [As Script](#as-script)\n- [Tests](#tests)\n- [License](#license)\n\n## Installation\n\nThe only method for installation at the moment is to clone the repo and install the module locally by adding the project to the `PYTHONPATH` environment variable. Or to install locally using Pip. In the future, this may be added to PyPi.\n\n1. Clone the repo:\n\n    ```bash\n    git clone https://github.com/iiTONELOC/ngs-dynamic-subnet.git\n    ```\n\n### Via PYTHONPATH\n\nInstalls system-wide, only recommended when virtual environments are not an option. For best results, [see Local Installation Via Pip](#via-pip-as-a-local-installation)\n\n1. Add Directory to `PYTHONPATH`, be sure to replace absolute/path/to/ngs-dynamic-subnet with the absolute path to the downloaded repo\n\n    ```bash\n   echo 'export PYTHONPATH=\"/absolute/path/to/ngs-dynamic-subnet/:$PYTHONPATH\"' \u003e\u003e ~/.bashrc\n   ```\n\n2. Reload .bashrc\n\n    ```bash\n    source ~/.bashrc\n    ```\n\n### Via Pip as a Local Installation\n\nFor best results, ensure that the project using the module is configured for a virtual environment\n\n```bash\npip install /absolute/or/relative/path/to/ngs-dynamic-subnet\n\n# example output\n  Installing build dependencies ... done\n  Getting requirements to build wheel ... done\n  Preparing metadata (pyproject.toml) ... done\nCollecting ipaddress (from NG_Subnet==0.1.0)\n  Downloading ipaddress-1.0.23-py2.py3-none-any.whl.metadata (923 bytes)\nDownloading ipaddress-1.0.23-py2.py3-none-any.whl (18 kB)\nBuilding wheels for collected packages: NG_Subnet\n  Building wheel for NG_Subnet (pyproject.toml) ... done\n  Created wheel for NG_Subnet: filename=NG_Subnet-0.1.0-py3-none-any.whl size=5892 sha256=7e121250c9b66fbc564806e5f48fcd221c6a6715e9c52c488f927d48ad3b1f57\n  Stored in directory: /tmp/pip-ephem-wheel-cache-s3h0zlsh/wheels/8d/a2/bb/652ac2c0ce379239a4eccd041aadb09fc94789cf6969ebfe48\nSuccessfully built NG_Subnet\nInstalling collected packages: ipaddress, NG_Subnet\nSuccessfully installed NG_Subnet-0.1.0 ipaddress-1.0.23\n```\n\n## Usage\n\nCan be used as a module or run directly as a script.\n\n### As Module\n\nThe module exposes two functions, `calculateRequiredSubnetSize` and `generateDynamicSubnets`.\n\nGenerate Dynamic Subnets uses the Calculate Required Subnet Size in its subnet size calculation and is exported as a utility only.\n\nThe primary means of interacting with the module should be through the `generateDynamicSubnets` function directly:\n\n  ```python\n    import json\n    from NG_Subnet import generateDynamicSubnets\n\n    baseNetwork = \"10.0.0.0/16\"\n    numSubnets = 5\n    numHostsPerNet = 50\n\n    subnetData, parentNetwork = generateDynamicSubnets(baseNetwork, numSubnets, numHostsPerNet)\n\n    print(json.dumps(subnetData, indent=4))\n\n    # expected output \n    \"\"\"\n    {\n        \"Subnet-1\": {\n            \"subnet\": \"10.0.0.0/26\",\n            \"usable_range\": \"10.0.0.1 - 10.0.0.62\",\n            \"netmask\": \"255.255.255.192\",\n            \"broadcast\": \"10.0.0.63\",\n            \"gateway\": \"10.0.0.1\",\n            \"dhcp_range_start\": \"10.0.0.10\",\n            \"dhcp_range_end\": \"10.0.0.62\",\n            \"dns\": [\n                \"1.1.1.1\",\n                \"1.0.0.1\"\n            ]\n        },\n        \"Subnet-2\": {\n            \"subnet\": \"10.0.0.64/26\",\n            \"usable_range\": \"10.0.0.65 - 10.0.0.126\",\n            \"netmask\": \"255.255.255.192\",\n            \"broadcast\": \"10.0.0.127\",\n            \"gateway\": \"10.0.0.65\",\n            \"dhcp_range_start\": \"10.0.0.74\",\n            \"dhcp_range_end\": \"10.0.0.126\",\n            \"dns\": [\n                \"1.1.1.1\",\n                \"1.0.0.1\"\n            ]\n        },\n        \"Subnet-3\": {\n            \"subnet\": \"10.0.0.128/26\",\n            \"usable_range\": \"10.0.0.129 - 10.0.0.190\",\n            \"netmask\": \"255.255.255.192\",\n            \"broadcast\": \"10.0.0.191\",\n            \"gateway\": \"10.0.0.129\",\n            \"dhcp_range_start\": \"10.0.0.138\",\n            \"dhcp_range_end\": \"10.0.0.190\",\n            \"dns\": [\n                \"1.1.1.1\",\n                \"1.0.0.1\"\n            ]\n        },\n        \"Subnet-4\": {\n            \"subnet\": \"10.0.0.192/26\",\n            \"usable_range\": \"10.0.0.193 - 10.0.0.254\",\n            \"netmask\": \"255.255.255.192\",\n            \"broadcast\": \"10.0.0.255\",\n            \"gateway\": \"10.0.0.193\",\n            \"dhcp_range_start\": \"10.0.0.202\",\n            \"dhcp_range_end\": \"10.0.0.254\",\n            \"dns\": [\n                \"1.1.1.1\",\n                \"1.0.0.1\"\n            ]\n        },\n        \"Subnet-5\": {\n            \"subnet\": \"10.0.1.0/26\",\n            \"usable_range\": \"10.0.1.1 - 10.0.1.62\",\n            \"netmask\": \"255.255.255.192\",\n            \"broadcast\": \"10.0.1.63\",\n            \"gateway\": \"10.0.1.1\",\n            \"dhcp_range_start\": \"10.0.1.10\",\n            \"dhcp_range_end\": \"10.0.1.62\",\n            \"dns\": [\n                \"1.1.1.1\",\n                \"1.0.0.1\"\n            ]\n        }\n    }\n    \"\"\"\n  ```\n\n- To overwrite the default DNS settings, provide an array of DNS servers:\n\n  ```python\n    import json\n    from NG_Subnet import generateDynamicSubnets\n\n    baseNetwork = \"10.0.0.0/16\"\n    numSubnets = 5\n    numHostsPerNet = 50\n\n    subnetData, parentNetwork = generateDynamicSubnets(baseNetwork, numSubnets, numHostsPerNet, ['8.8.8.8'])\n\n    print(json.dumps(subnetData, indent=4))\n    # expected\n    \"\"\" {\n        \"Subnet-1\": {\n            \"subnet\": \"10.0.0.0/26\",\n            \"usable_range\": \"10.0.0.1 - 10.0.0.62\",\n            \"netmask\": \"255.255.255.192\",\n            \"broadcast\": \"10.0.0.63\",\n            \"gateway\": \"10.0.0.1\",\n            \"dhcp_range_start\": \"10.0.0.10\",\n            \"dhcp_range_end\": \"10.0.0.62\",\n            \"dns\": [\n                \"8.8.8.8\"\n            ]\n        },\n        \"Subnet-2\": {\n            \"subnet\": \"10.0.0.64/26\",\n            \"usable_range\": \"10.0.0.65 - 10.0.0.126\",\n            \"netmask\": \"255.255.255.192\",\n            \"broadcast\": \"10.0.0.127\",\n            \"gateway\": \"10.0.0.65\",\n            \"dhcp_range_start\": \"10.0.0.74\",\n            \"dhcp_range_end\": \"10.0.0.126\",\n            \"dns\": [\n                \"8.8.8.8\"\n            ]\n        },\n        \"Subnet-3\": {\n            \"subnet\": \"10.0.0.128/26\",\n            \"usable_range\": \"10.0.0.129 - 10.0.0.190\",\n            \"netmask\": \"255.255.255.192\",\n            \"broadcast\": \"10.0.0.191\",\n            \"gateway\": \"10.0.0.129\",\n            \"dhcp_range_start\": \"10.0.0.138\",\n            \"dhcp_range_end\": \"10.0.0.190\",\n            \"dns\": [\n                \"8.8.8.8\"\n            ]\n        },\n        \"Subnet-4\": {\n            \"subnet\": \"10.0.0.192/26\",\n            \"usable_range\": \"10.0.0.193 - 10.0.0.254\",\n            \"netmask\": \"255.255.255.192\",\n            \"broadcast\": \"10.0.0.255\",\n            \"gateway\": \"10.0.0.193\",\n            \"dhcp_range_start\": \"10.0.0.202\",\n            \"dhcp_range_end\": \"10.0.0.254\",\n            \"dns\": [\n                \"8.8.8.8\"\n            ]\n        },\n        \"Subnet-5\": {\n            \"subnet\": \"10.0.1.0/26\",\n            \"usable_range\": \"10.0.1.1 - 10.0.1.62\",\n            \"netmask\": \"255.255.255.192\",\n            \"broadcast\": \"10.0.1.63\",\n            \"gateway\": \"10.0.1.1\",\n            \"dhcp_range_start\": \"10.0.1.10\",\n            \"dhcp_range_end\": \"10.0.1.62\",\n            \"dns\": [\n                \"8.8.8.8\"\n            ]\n        }\n    }\n    \"\"\"\n  ```\n\n- If necessary, the gateway for each subnet can be set as the DNS server by using 'GATEWAY' or ['GATEWAY'] for the list of DNS servers:\n\n  ```python\n    import json\n    from NG_Subnet import generateDynamicSubnets\n\n    baseNetwork = \"10.0.0.0/16\"\n    numSubnets = 5\n    numHostsPerNet = 50\n\n    subnetData, parentNetwork = generateDynamicSubnets(baseNetwork, numSubnets, numHostsPerNet, 'GATEWAY')\n\n    print(json.dumps(subnetData, indent=4))\n    # expected\n    \"\"\"\n    Subnet Data:\n    {\n        \"Subnet-1\": {\n            \"subnet\": \"10.0.0.0/26\",\n            \"usable_range\": \"10.0.0.1 - 10.0.0.62\",\n            \"netmask\": \"255.255.255.192\",\n            \"broadcast\": \"10.0.0.63\",\n            \"gateway\": \"10.0.0.1\",\n            \"dhcp_range_start\": \"10.0.0.10\",\n            \"dhcp_range_end\": \"10.0.0.62\",\n            \"dns\": [\n                \"10.0.0.1\"\n            ]\n        },\n        \"Subnet-2\": {\n            \"subnet\": \"10.0.0.64/26\",\n            \"usable_range\": \"10.0.0.65 - 10.0.0.126\",\n            \"netmask\": \"255.255.255.192\",\n            \"broadcast\": \"10.0.0.127\",\n            \"gateway\": \"10.0.0.65\",\n            \"dhcp_range_start\": \"10.0.0.74\",\n            \"dhcp_range_end\": \"10.0.0.126\",\n            \"dns\": [\n                \"10.0.0.65\"\n            ]\n        },\n        \"Subnet-3\": {\n            \"subnet\": \"10.0.0.128/26\",\n            \"usable_range\": \"10.0.0.129 - 10.0.0.190\",\n            \"netmask\": \"255.255.255.192\",\n            \"broadcast\": \"10.0.0.191\",\n            \"gateway\": \"10.0.0.129\",\n            \"dhcp_range_start\": \"10.0.0.138\",\n            \"dhcp_range_end\": \"10.0.0.190\",\n            \"dns\": [\n                \"10.0.0.129\"\n            ]\n        },\n        \"Subnet-4\": {\n            \"subnet\": \"10.0.0.192/26\",\n            \"usable_range\": \"10.0.0.193 - 10.0.0.254\",\n            \"netmask\": \"255.255.255.192\",\n            \"broadcast\": \"10.0.0.255\",\n            \"gateway\": \"10.0.0.193\",\n            \"dhcp_range_start\": \"10.0.0.202\",\n            \"dhcp_range_end\": \"10.0.0.254\",\n            \"dns\": [\n                \"10.0.0.193\"\n            ]\n        },\n        \"Subnet-5\": {\n            \"subnet\": \"10.0.1.0/26\",\n            \"usable_range\": \"10.0.1.1 - 10.0.1.62\",\n            \"netmask\": \"255.255.255.192\",\n            \"broadcast\": \"10.0.1.63\",\n            \"gateway\": \"10.0.1.1\",\n            \"dhcp_range_start\": \"10.0.1.10\",\n            \"dhcp_range_end\": \"10.0.1.62\",\n            \"dns\": [\n                \"10.0.1.1\"\n            ]\n        }\n    }\n    \"\"\"\n  ```\n\n### As Script\n\nAdditionally, the subnet calculator can be invoked as a script and executed from the command line:\n\n```bash\npython3 /absolute/or/relative/path/to/ngs-dynamic-subnet\n```\n\n## Tests\n\nBasic tests have been included and are runnable via `pytest` from the project root:\n\n```bash\npytest ./tests\n\n# expect similar output\n=============================================== test session starts ================================================\nplatform linux -- Python 3.12.3, pytest-7.4.4, pluggy-1.4.0\nrootdir: /home/developer/code/python-projects/NG_Subnet\ncollected 2 items\n\ntests/test_generateDynamicSubnets.py .                                                                       [ 50%]\ntests/test_requiredSize.py .                                                                                 [100%]\n\n================================================ 2 passed in 0.01s =================================================\n```\n\n## License\n\n[License](./LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiitoneloc%2Fngs-dynamic-subnet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fiitoneloc%2Fngs-dynamic-subnet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiitoneloc%2Fngs-dynamic-subnet/lists"}