{"id":34094217,"url":"https://github.com/alsigna/netbox-software-manager","last_synced_at":"2026-04-06T09:02:15.493Z","repository":{"id":52822544,"uuid":"346165934","full_name":"alsigna/netbox-software-manager","owner":"alsigna","description":"NetBox Plugin to deal with Cisco IOS \u0026 XE software","archived":false,"fork":false,"pushed_at":"2023-10-25T16:47:44.000Z","size":5568,"stargazers_count":49,"open_issues_count":12,"forks_count":7,"subscribers_count":3,"default_branch":"master","last_synced_at":"2026-01-03T07:59:15.639Z","etag":null,"topics":["netbox","netbox-docker","netbox-plugin"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alsigna.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":"2021-03-09T22:51:14.000Z","updated_at":"2025-08-06T20:43:37.000Z","dependencies_parsed_at":"2024-11-19T01:43:04.379Z","dependency_job_id":null,"html_url":"https://github.com/alsigna/netbox-software-manager","commit_stats":{"total_commits":20,"total_committers":2,"mean_commits":10.0,"dds":"0.15000000000000002","last_synced_commit":"ab79483875df10a53668669b9846ad7823bdf939"},"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/alsigna/netbox-software-manager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alsigna%2Fnetbox-software-manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alsigna%2Fnetbox-software-manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alsigna%2Fnetbox-software-manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alsigna%2Fnetbox-software-manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alsigna","download_url":"https://codeload.github.com/alsigna/netbox-software-manager/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alsigna%2Fnetbox-software-manager/sbom","scorecard":{"id":186932,"data":{"date":"2025-08-11","repo":{"name":"github.com/alsigna/netbox-software-manager","commit":"ab79483875df10a53668669b9846ad7823bdf939"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.2,"checks":[{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/10 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating netboxcommunity/netbox:v3.4.3-2.4.0 to netboxcommunity/netbox:v3.4.3-2.4.0@sha256:85feedb641579d82019063171383acd207d09e64b2821ad683b1cf97e5555746","Warn: containerImage not pinned by hash: ftp/dockerfile:1: pin your Docker image by updating alpine:3.10 to alpine:3.10@sha256:451eee8bedcb2f029756dc3e9d73bab0e7943c1ac55cff3a4861c52a0fdd3e98","Warn: containerImage not pinned by hash: http/dockerfile:1: pin your Docker image by updating nginx to nginx@sha256:c424bd04bb9d3dd358bfb73557283e38e00fa4ceee983c92be2a8ea4dac923df","Warn: pipCommand not pinned by hash: Dockerfile:4","Warn: pipCommand not pinned by hash: Dockerfile:20","Info:   0 out of   3 containerImage dependencies pinned","Info:   0 out of   2 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 17 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-16T19:57:25.149Z","repository_id":52822544,"created_at":"2025-08-16T19:57:25.149Z","updated_at":"2025-08-16T19:57:25.149Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31466228,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-06T08:36:52.050Z","status":"ssl_error","status_checked_at":"2026-04-06T08:36:51.267Z","response_time":112,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["netbox","netbox-docker","netbox-plugin"],"created_at":"2025-12-14T15:01:40.747Z","updated_at":"2026-04-06T09:02:15.487Z","avatar_url":"https://github.com/alsigna.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Software Manager - NetBox plugin\n\n[NetBox](https://github.com/netbox-community/netbox) plugin to manage software for your Cisco devices in following aspects:\n\n- software repository\n- assign target (golden) image on created Device Types\n- scheduled upload golden image on devices\n- scheduled reload devices with golden image\n\n## Important notes\n\n1. Developed on NetBox 3.4.3 and compatible (probably) with other versions, but not tested.\n2. Plugin works with standalone IOS/IOS-XE boxes only. No Stacks/VSS/StackWiseVirtual at present.\n3. Plugin operates with software version only, and does not consider feature set (lanlite vs lanbase, K9 vs NPE).\n4. Test in your local sandbox, do not jump to production network.\n5. Use this plugin on production network at one's own risk with take responsibility for any potential outages due to reload of devices.\n6. Don't hesitate to contact me for any bugs/feature requests.\n\n## Software Repository\n\n### Main page\n\n\u003cimg src=\"static/software_repository.png\" width=\"75%\"\u003e\n\n### Add/Edit software page\n\n\u003cimg src=\"static/software_add.png\" width=\"50%\"\u003e\n\nSelect *.bin file, specify expected MD5 (from cisco site) and verbose version. Plugin calculates MD5 when file uploading and result should matches with entered MD5, otherwise MD5 will be redded.\n\n### Software image details\n\n\u003cimg src=\"static/software_details.png\" width=\"50%\"\u003e\n\n## Golden Images\n\n### Main page\n\n\u003cimg src=\"static/golden_images.png\" width=\"75%\"\u003e\n\nAssigned Image/Version for all created DeviceTypes with upgrade progress for particular DeviceType.\n\n## Upgrade Devices\n\n### Main page\n\n\u003cimg src=\"static/upgrade_devices.png\" width=\"75%\"\u003e\n\nprovides information about Target/Current versions (green = match, yellow = upgrade is required)\n\u003c!-- - allows filter out devices based on few attributes\n- way to create shedeled task for selected devices --\u003e\n\n### Add scheduled task\n\n\u003cimg src=\"static/scheduled_task_add.png\" width=\"75%\"\u003e\n\n- Select job type:\n\n  - upload (transfer golden image to the box)\n  - upgrade (reload with golden image w/o transfer)\n\n- select time to start or set \"Start Now\". Time is based on NetBox TimeZone, not your browser/hostPC.\n- select MW duration. All tasks will be skipped after this time (countdown starts from scheduled time, not from time of creation tasks)\n\n### Scheduled tasks list\n\n\u003cimg src=\"static/scheduled_task_list.png\" width=\"75%\"\u003e\n\nList of all scheduled/completed tasks.\n\n\u003e Tasks with Running status can be deleted in admin view only.\n\n\u003e Plugin has acknowledgment logic to try to prevent mass outage. ACK flag become True only in case of getting expected result. In case of any unknown error/traceback job will be finished with ACK=False. Any new job checks number of non-ACK and can be skpped if this number crossed threshold. ACK flag can be changed manually by clicking on \"V\" or \"X\".\n\n### Scheduled tasks info\n\n\u003cimg src=\"static/scheduled_task_info.png\" width=\"75%\"\u003e\n\nDetailed information about task and execution log.\n\n# Installation\n\nInstruction below describes installation for Docker-compose instance of NetBox.\n\nFor bare-metal setup pip can be used for installation. But some changes (ftp/redis etc) will be requared anyway.\n```shell\npip install netbox-plugin-software-manager\n```\n\n## 1. Create new docker image based on latest-ldap netbox image\n\n```shell\ncd {{ your-netbox-locaton }}\ngit clone https://github.com/alsigna/netbox-software-manager.git\ncd netbox-software-manager\ndocker build -t netbox-plugin .\n```\n\u003e Dockerfile:\n\u003e\n\u003e ```dockerfile\n\u003e FROM netboxcommunity/netbox:v3.4.3-2.4.0\n\u003e\n\u003e # install scrapli[paramiko], scrapli[textfsm]\n\u003e COPY requirements.txt /requirements.txt\n\u003e RUN /opt/netbox/venv/bin/python -m pip install -r /requirements.txt\n\u003e\n\u003e # make folder for image location. Should be in django media folder\n\u003e # folder name (software-images in example).\n\u003e RUN mkdir /opt/netbox/netbox/media/software-images/\n\u003e RUN chown -R unit:unit /opt/netbox/netbox/media/software-images\n\u003e\n\u003e # Add additional queue (software_manager in example). This name should be copied to NetBox configuration.py.\n\u003e RUN echo '\\n\\\n\u003e RQ_QUEUES[\"software_manager\"]=RQ_PARAMS\\n\\\n\u003e ' \u003e\u003e /opt/netbox/netbox/netbox/settings.py\n\u003e \n\u003e # Install plugin from local repository\n\u003e #--SoftwareManager\n\u003e COPY ./software_manager/ /source/SoftwareManager/software_manager/\n\u003e COPY ./setup.py /source/SoftwareManager/\n\u003e COPY ./README.md /source/SoftwareManager/\n\u003e COPY ./MANIFEST.in /source/SoftwareManager/\n\u003e \n\u003e #--Pip\n\u003e RUN /opt/netbox/venv/bin/python -m pip install /source/SoftwareManager/\n\n## 2. Create FTP or HTTP docker image\n\nfor FTP [docker-alpine-ftp-server](https://github.com/delfer/docker-alpine-ftp-server) is used. For HTTP nginx base image is used.\n\n\u003eOriginally scp was used to transfer files, but based on experience, FTP/HTTP is much faster.\n\n```shell\ncd ftp\ndocker build -t ftp_for_netbox .\ncd ../../\n```\n\nor\n\n```shell\ncd http\ndocker build -t http_for_netbox .\ncd ../../\n```\n\n## 3. Change docker-compose.yml\n\n```dockerfile\n...\n  netbox-server: \u0026netbox-server\n    # Change image name to \"customized\" image from step 1.\n    image: netbox-plugin\n    volumes:\n      # Mount log file. Path have to match with specified in configuration.py\n      - ./netbox-software-manager/upgrade.log:/var/log/upgrade.log:z\n      # Replace nginx-unit config\n      - ./netbox-software-manager/nginx-unit.json:/etc/unit/nginx-unit.json:z,ro\n      # Mount folder with IOS images. NetBox will upload/delete images.\n      # Format: /opt/netbox/netbox/media/{{ IMAGE_FOLDER }}\n      - ./netbox-software-manager/software-images:/opt/netbox/netbox/media/software-images:z\n      # Mount script for rq\n      - ./netbox-software-manager/rq.sh:/etc/netbox/rq.sh:z,ro\n...\n\n  netbox-worker:\n    # Run script instead of single worker\n    command: /bin/bash /etc/netbox/rq.sh\n    # Comment original config:\n    # entrypoint:\n    # - /opt/netbox/venv/bin/python\n    # - /opt/netbox/netbox/manage.py\n    # command:\n    # - rqworker \n...\n\n  # FTP server from step 2.\n  ftp:\n    image: ftp_for_netbox\n    ports:\n      - \"21:21\"\n      - \"21000-21100:21000-21100\"\n    privileged: true\n    volumes:\n      # Mount folder with IOS images. FTP has RO only.\n      - ./netbox-software-manager/software-images:/ftp/software-images:z,ro\n      # Mount configuration files\n      - ./netbox-software-manager/ftp/start_vsftpd.sh:/etc/vsftpd/start_vsftpd.sh:z,ro\n      - ./netbox-software-manager/ftp/vsftpd.conf:/etc/vsftpd/vsftpd.conf:z,ro\n    entrypoint: /etc/vsftpd/start_vsftpd.sh\n    environment:\n      # Specify user/password\n      - USERS=software-images|ftp_password\n      # Your external (host) IP address, not contaner's IP\n      - ADDRESS=192.168.0.1\n  \n  # OR HTTP server\n  http:\n    image: http_for_netbox\n    ports:\n      - \"80:80\"\n    volumes:\n      # Mount folder with IOS images. FTP has RO only.\n      - ./netbox-software-manager/software-images:/usr/share/nginx/html:z,ro\n\n```\n\n## 4. Change NetBox configuration.py\n\n```python\nPLUGINS = [\n    \"software_manager\",\n]\n\nPLUGINS_CONFIG = {\n    \"software_manager\": {\n        # Device credentials\n        \"DEVICE_USERNAME\": \"cisco\",\n        \"DEVICE_PASSWORD\": \"cisco\",\n        # FTP credentials (can be skipped if HTTP is used)\n        \"FTP_USERNAME\": \"ftp-user\",\n        \"FTP_PASSWORD\": \"ftp_password\",\n        \"FTP_SERVER\": \"192.168.0.1\",\n        # HTTP server name with patch to images (can be skipped if FTP is used)\n        \"HTTP_SERVER\": \"http://10.8.0.1:8001/\",\n        # Default transport method, [tfp|http]\n        \"DEFAULT_TRANSFER_METHOD\": \"http\",\n        # Log file\n        \"UPGRADE_LOG_FILE\": \"/var/log/upgrade.log\",\n        # Queue name. Check step 1 (dockerfile). Should be the same\n        \"UPGRADE_QUEUE\": \"software_manager\",\n        # Custom field name which is used for store current SW version\n        \"CF_NAME_SW_VERSION\": \"sw_version\",\n        # folder name for image storing. located in netbox media.\n        \"IMAGE_FOLDER\": \"software-images\",\n        # Threshold for non-ACK check\n        \"UPGRADE_THRESHOLD\": 2,\n        # Number of tries to connect to device before declare that we lost it.\n        \"UPGRADE_MAX_ATTEMPTS_AFTER_RELOAD\": 10,\n        # Hold timer between tries\n        \"UPGRADE_SECONDS_BETWEEN_ATTEMPTS\": 60,\n    }\n}\n```\n\n## 6. Restart docker-compose\n\n## 7. Add Custom Field\n\n| Name          |  Type  | Label         | Object(s)       |\n|---------------|--------|---------------|-----------------|\n| sw_version    |  Text  | SW Version    | dcim \u003e device   |\n\n## 8. Try to use\n\n- - -\n\n## nginx-unit.json\n\nOriginal NetBox config is used with max_body_size:\n\n```json\n\"settings\": {\n  \"http\": {\n      \"max_body_size\": 1073741824\n  }\n}\n```\n\n## rq.sh script\n\n```shell\n#!/bin/bash\n\n# start multply rqworkers for \"software_manager\", check name if you customized it. There are 5 workers. This means up to 5 concurrent jobs can be run at the same time.\n/opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py rqworker software_manager \u0026\n/opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py rqworker software_manager \u0026\n/opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py rqworker software_manager \u0026\n/opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py rqworker software_manager \u0026\n/opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py rqworker software_manager \u0026\n\n# start default netbox worker\n/opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py rqworker high default low\nexec \"$@\"\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falsigna%2Fnetbox-software-manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falsigna%2Fnetbox-software-manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falsigna%2Fnetbox-software-manager/lists"}