{"id":39467372,"url":"https://github.com/3mdeb/qubes-fwupd","last_synced_at":"2026-01-18T04:51:20.998Z","repository":{"id":55039264,"uuid":"272408811","full_name":"3mdeb/qubes-fwupd","owner":"3mdeb","description":"This was merged upstream and further development happens below:","archived":false,"fork":false,"pushed_at":"2022-09-11T10:32:17.000Z","size":1566,"stargazers_count":8,"open_issues_count":6,"forks_count":2,"subscribers_count":10,"default_branch":"master","last_synced_at":"2023-09-21T16:26:49.451Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://github.com/fwupd/fwupd/tree/main/contrib/qubes","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/3mdeb.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-06-15T10:27:16.000Z","updated_at":"2023-02-09T19:51:28.000Z","dependencies_parsed_at":"2022-08-14T09:50:34.667Z","dependency_job_id":null,"html_url":"https://github.com/3mdeb/qubes-fwupd","commit_stats":null,"previous_names":[],"tags_count":1,"template":null,"template_full_name":null,"purl":"pkg:github/3mdeb/qubes-fwupd","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3mdeb%2Fqubes-fwupd","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3mdeb%2Fqubes-fwupd/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3mdeb%2Fqubes-fwupd/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3mdeb%2Fqubes-fwupd/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/3mdeb","download_url":"https://codeload.github.com/3mdeb/qubes-fwupd/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3mdeb%2Fqubes-fwupd/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28530347,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"online","status_checked_at":"2026-01-18T02:00:07.578Z","response_time":98,"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":[],"created_at":"2026-01-18T04:51:20.447Z","updated_at":"2026-01-18T04:51:20.984Z","avatar_url":"https://github.com/3mdeb.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# qubes-fwupd\n\n[![Build Status](https://travis-ci.com/3mdeb/qubes-fwupd.svg?branch=master)](https://travis-ci.com/3mdeb/qubes-fwupd)\n\nfwupd wrapper for QubesOS\n\n## Table of Contents\n\n* [Requirements](#Requirements)\n* [Usage](#Usage)\n* [Installation](#Installation)\n* [Testing](#Testing)\n* [Whonix support](doc/whonix.md)\n* [UEFI capsule update](doc/uefi_capsule_update.md)\n* [Heads update](doc/heads_update.md)\n\n## OS Requirements\n\n**Operating System:** Qubes OS R4.1 or Qubes OS R4.0\n\n**Admin VM (dom0):** Fedora 25 or higher\n\n**Template VM:** Fedora 30\n\n**Whonix VM:** whonix-gw-15\n\n**fwupd version - dom0:** 0.9.5 or higher\n\n**fwupd version - VMs:** 1.2.6 or higher\n\nqubes-fwupd does not support dom0 updates and downgrades for fwupd 0.9.5 and\nolder. Use sys-usb to update external devices.\n\n## Usage\n\n```\n==========================================================================================\nUsage:\n==========================================================================================\n        Command:                        qubes-fwupdmgr [OPTION…][FLAG..]\n        Example:                        qubes-fwupdmgr refresh --whonix --url=\u003curl\u003e\n\nOptions:\n==========================================================================================\n        get-devices:                    Get all devices that support firmware updates\n        get-updates:                    Get the list of updates for connected hardware\n        refresh:                        Refresh metadata from remote server\n        update:                         Update chosen device to latest firmware version\n        update-heads:                   Updates heads firmware to the latest version\n        downgrade:                      Downgrade chosen device to chosen firmware version\n        clean:                          Delete all cached update files\n\nFlags:\n==========================================================================================\n        --whonix:                       Download firmware updates via Tor\n        --device:                       Specify device for heads update (default - x230)\n        --url:                          Address of the custom metadata remote server\n\nHelp:\n==========================================================================================\n        -h --help:                      Show help options\n```\n\n## Installation\n\nFor development purpose:\n\n1. Clone [qubes-builder](https://github.com/QubesOS/qubes-builder).\n  Make sure that you have enough space in your VM. You will need at least 10GB.\n\n```bash\n$ git clone https://github.com/QubesOS/qubes-builder.git\n$ cd qubes-builder\n```\n\n2. Copy specific config file from the `example-configs` directory\n\n```\ncp example-configs/qubes-os-master.conf builder.conf\n```\n\n3. Add the following to the `builder.conf`\n\n```\nGIT_URL_fwupd = https://github.com/3mdeb/qubes-fwupd\nNO_CHECK += fuwpd\n...\n\nCOMPONENTS = ...\n        builder \\\n        builder-debian \\\n        builder-rpm \\\n        fwupd\n```\n\n4. Download sources\n\n```\n$ make get-sources\n```\n\n5. Install dependencies\n\n```\n$ make install-deps\n```\n\n6. Install python2\n\n```\n# dnf install python2\n```\n\n7. You may need to remount the current filesystem\n\n```\n$ make remount\n```\n\n8. Build packages (First build takes close to 30 min,\n  so you can grab some coffee)\n\n```\n$ make fwupd\n```\n\n9. The build artifacts are placed in:\n  -- dom0 package - `qubes-builder/qubes-src/fwupd/pkgs/dom0-fc32/x86_64`\n  -- vm package - `qubes-builder/qubes-src/fwupd/pkgs/vm-fc32/x86_64`\n  -- whonix package - `qubes-builder/qubes-src/fwupd/pkgs/vm-buster`\n\n10. Run fedora template VM and copy VM package from qubes builder:\n\n```\n$ qvm-copy qubes-fwupd-vm-0.2.0-1.fc32.x86_64.rpm\n```\n\n11. Install package dependencies\n\n```\n# dnf install cabextract fwudp\n```\n\n12. Run terminal in the template VM and go to\n`~/QubesIncoming/\u003cqubes-builderVM\u003e`. Compare sha sums of the package in\nTemplateVM and qubes-builder VM. If they match, install the package:\n\n```\n# rpm -U qubes-fwupd-vm-0.2.0-1.fc32.x86_64.rpm\n```\n\n13. Shutdown TemplateVM\n\n14. Run whonix-gw-15 and copy whonix a package from qubes builder VM\n\n```\n$ qvm-copy qubes-fwupd-vm-whonix_0.2.0+deb10u1_amd64.deb\n```\n\n15. Download dependencies\n\n```\n# apt install cabextract fwudp\n```\n\n16. Run terminal in the whonix-gw-15 and go to `~/QubesIncoming/qubes-builder`.\nCompare sha sums of the package in TemplateVM and qubes-builder VM. If they\nmatch, install the package:\n\n```\n# dpkg -i qubes-fwupd-vm-whonix_0.2.0+deb10u1_amd64.deb\n```\n\n17. Shutdown whonix-gw-15\n\n18. Run dom0 terminal in the dom0 and copy package\n\n```\n$ qvm-run --pass-io \u003cqubes-builder-vm-name\u003e \\\n'cat \u003cqubes-builder-repo-path\u003e/qubes-src/fwupd/pkgs/dom0-fc32/x86_64/qubes-fwupd-dom0-0.2.0-1.fc32.x86_64.rpm' \u003e \\\nqubes-fwupd-vm-0.2.0-1.fc32.x86_64.rpm\n```\n\n19. Install package dependencies\n\n```\n# qubes-dom0-update cabextract fwudp python36\n```\n\n20. Make sure that sys-firewall, sys-whonix, and sys-usb (if exists) are running.\n\n21. Compare the sha sums of the package in dom0 and qubes-builder VM.\nIf they match, install the package:\n\n```\n# rpm -U qubes-fwupd-dom0-0.2.0-1.fc32.x86_64.rpm\n```\n\n22. Reboot system (or reboot sys-firewall, sys-whonix, and sys-usb)\n\n23. Run the tests to verify the installation process\n\n## Testing\n\n### Outside the Qubes OS\n\nA test case covers the whole qubes_fwupdmgr script. It could be run outside the\nQubes OS. If the requirements of a single test are not met, it will be omitted.\nTo run the tests, move to the repo directory and type the following:\n\n```\n$ python3 -m unittest -v test.test_qubes_fwupdmgr\n\ntest_clean_cache (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... ok\ntest_downgrade_firmware (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... skipped 'Required device not connected'\ntest_download_firmware_updates (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... skipped 'requires Qubes OS'\ntest_download_metadata (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... skipped 'requires Qubes OS'\ntest_get_devices (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... skipped 'requires Qubes OS'\ntest_get_devices_qubes (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... skipped 'requires Qubes OS'\ntest_get_updates (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... skipped 'requires Qubes OS'\ntest_get_updates_qubes (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... skipped 'requires Qubes OS'\ntest_help (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... ok\ntest_output_crawler (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... ok\ntest_parse_downgrades (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... ok\ntest_parse_parameters (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... ok\ntest_parse_updates_info (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... ok\ntest_refresh_metadata (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... skipped 'requires Qubes OS'\ntest_user_input_choice (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... ok\ntest_user_input_downgrade (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... ok\ntest_user_input_empty_list (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... ok\ntest_user_input_n (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... ok\ntest_verify_dmi (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... ok\ntest_verify_dmi_argument_version (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... ok\ntest_verify_dmi_version (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... ok\ntest_verify_dmi_wrong_vendor (test.test_qubes_fwupdmgr.TestQubesFwupdmgr) ... ok\n\n----------------------------------------------------------------------\nRan 22 tests in 0.003s\n\nOK (skipped=8)\n```\n\n### In the Qubes OS\n\nIn the dom0, move to:\n\n```\n$ cd /usr/share/qubes-fwupd/\n```\n\n#### Qubes OS 4.1\n\nRun the tests with sudo privileges:\n\n```\n# python3 -m unittest -v test.test_qubes_fwupdmgr\n```\n\nNote: If the whonix tests failed, make sure that you are connected to the Tor\n\n[![asciicast](https://asciinema.org/a/TgHOkLnD2YICxB0U80PVcQGqX.svg)](https://asciinema.org/a/TgHOkLnD2YICxB0U80PVcQGqX)\n\n#### Qubes OS 4.0\n\n**Make sure that you are using Python 3.6!**\n\n```\n# python36 -m unittest -v test.test_qubes_fwupdmgr\n```\n\nNote: If the whonix tests failed, make sure that you are connected to the Tor\n\n[![asciicast](https://asciinema.org/a/HRf27PXEHnLsiQtlwhb55l9Ni.svg)](https://asciinema.org/a/HRf27PXEHnLsiQtlwhb55l9Ni)\n\n## Whonix support\n\n```\n# qubes-fwupdmgr [refresh/update/downgrade] --whonix [FLAG]\n```\n\nMore specified information you will find in the\n[whonix documentation](doc/whonix.md).\n\n## UEFI capsule update\n\n```\n# qubes-fwupdmgr [update/downgrade]\n```\n\nRequirements and more specified information you will find in the\n[UEFI capsule update documentation](doc/uefi_capsule_update.md).\n\n## Heads update\n\n```\n# qubes-fwupdmgr update-heads --device=x230 --url=\u003ccustom-metadata-url\u003e\n```\n\nRequirements and more specified information you will find in the\n[heads update documentation](doc/heads_udpate.md).\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F3mdeb%2Fqubes-fwupd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F3mdeb%2Fqubes-fwupd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F3mdeb%2Fqubes-fwupd/lists"}