{"id":42104758,"url":"https://github.com/jonnrb/hostapd_grpc","last_synced_at":"2026-01-26T13:12:18.872Z","repository":{"id":57531062,"uuid":"116456789","full_name":"jonnrb/hostapd_grpc","owner":"jonnrb","description":"Exposes hostapd's control socket via gRPC","archived":false,"fork":false,"pushed_at":"2020-07-02T02:57:28.000Z","size":93,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-11-16T03:34:34.162Z","etag":null,"topics":["docker","grpc","hostapd","linux"],"latest_commit_sha":null,"homepage":"","language":"C","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/jonnrb.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}},"created_at":"2018-01-06T05:38:25.000Z","updated_at":"2021-12-26T22:38:03.000Z","dependencies_parsed_at":"2022-09-05T10:50:26.679Z","dependency_job_id":null,"html_url":"https://github.com/jonnrb/hostapd_grpc","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/jonnrb/hostapd_grpc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonnrb%2Fhostapd_grpc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonnrb%2Fhostapd_grpc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonnrb%2Fhostapd_grpc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonnrb%2Fhostapd_grpc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jonnrb","download_url":"https://codeload.github.com/jonnrb/hostapd_grpc/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonnrb%2Fhostapd_grpc/sbom","scorecard":{"id":531327,"data":{"date":"2025-08-11","repo":{"name":"github.com/jonnrb/hostapd_grpc","commit":"06a2c4da9e411af90642bc977ba221179172521c"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.7,"checks":[{"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":"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":"Code-Review","score":0,"reason":"Found 0/28 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":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"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":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"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":"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":"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":"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":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"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":"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":"Vulnerabilities","score":0,"reason":"17 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2022-0322 / GHSA-cg3q-j54f-5p7p","Warn: Project is vulnerable to: GO-2022-0197 / GHSA-4r78-hx75-jjj2 / GHSA-mv93-wvcp-7m7r","Warn: Project is vulnerable to: GO-2020-0014 / GHSA-vfw5-hrgq-h5wf","Warn: Project is vulnerable to: GO-2022-0536 / GHSA-39qc-96h7-956f / GHSA-hgr8-6h9x-f7q9","Warn: Project is vulnerable to: GO-2022-0236 / GHSA-h86h-8ppg-mxmh","Warn: Project is vulnerable to: GO-2021-0238 / GHSA-83g2-8m93-v3w7","Warn: Project is vulnerable to: GO-2022-0288","Warn: Project is vulnerable to: GO-2022-0969 / GHSA-69cg-p879-7622","Warn: Project is vulnerable to: GO-2022-1144 / GHSA-xrjj-mj9h-534m","Warn: Project is vulnerable to: GO-2023-1571 / GHSA-vvpx-j8f3-3w6h","Warn: Project is vulnerable to: GO-2023-1988 / GHSA-2wrh-6pvc-2jm9","Warn: Project is vulnerable to: GO-2023-2102 / GHSA-4374-p667-p6c8","Warn: Project is vulnerable to: GO-2023-2153 / GHSA-m425-mq94-257g / GHSA-qppj-fm5r-hxr3","Warn: Project is vulnerable to: GO-2024-2687 / GHSA-4v7x-pqxf-cx7m","Warn: Project is vulnerable to: GO-2024-3333","Warn: Project is vulnerable to: GO-2025-3503 / GHSA-qxp5-gwg8-xv66","Warn: Project is vulnerable to: GO-2025-3595 / GHSA-vvgc-356p-c3xw"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-20T05:49:13.773Z","repository_id":57531062,"created_at":"2025-08-20T05:49:13.773Z","updated_at":"2025-08-20T05:49:13.773Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28779061,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-26T11:46:04.308Z","status":"ssl_error","status_checked_at":"2026-01-26T11:46:02.664Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["docker","grpc","hostapd","linux"],"created_at":"2026-01-26T13:12:18.154Z","updated_at":"2026-01-26T13:12:18.865Z","avatar_url":"https://github.com/jonnrb.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# hostapd_grpc [![Build Status](https://drone.jonnrb.com/api/badges/jon/hostapd_grpc/status.svg?branch=master)](https://drone.jonnrb.com/jon/hostapd_grpc)\n\nDo you use `hostapd` to run your Wi-Fi? Did you know there's a nifty control\nsocket it exports to let you do normal router stuff with it? Yeah neither did\nI. I wanted to hack around on it, but the `wpa_ctrl` interface is a little\nklunky so I figured as I use parts of it, they can be wrapped in a tidy GRPC\nserver with the API spec'd all in protobuf.\n\n(Now with Prometheus metrics!)\n\n### Usage\n\nThere needs to be a teensy bit of corrdination with hostapd. The usual\n`ctrl_interface` option is `/var/run/hostapd`. hostapd\\_grpc needs read access\nto this directory and the sockets created there. A part of the `wpa_ctrl`\nprotocol involves creation of a client socket that hostapd can read. While it\ndoesn't matter what path hostapd and hostapd\\_grpc see the `ctrl_interface`\ndirectory at, the client socket directory path *must* be the same as seen by\nhostapd and hostapd\\_grpc. Additionally, hostapd\\_grpc will think anything that\nmoves inside the `ctrl_interface` directory is a valid hostapd socket and will\ntreat it as such. Separate the client and the control directories or prepare\nfor crash and boom.\n\nBy default, gRPC pokes out on port 8080 and Prometheus metrics are on port 9090.\n\nProbably not up to date exerpt of `./hostapd_grpc -help`:\n\n```\n  Flags from server/server.cc:\n    -hostapd_client_dir (Path to place client sockets in; hostapd must be able\n      to read the same directory at this path!) type: string\n      default: \"/var/run/hostapd_grpc\"\n    -hostapd_control_dir (Path specified by ctrl_interface hostapd option)\n      type: string default: \"/var/run/hostapd\"\n    -hostapd_grpc_addr (Address gRPC will bind) type: string\n      default: \"0.0.0.0:8080\"\n    -hostapd_metrics_addr (Address Prometheus metrics will bind) type: string\n      default: \"0.0.0.0:9090\"\n    -hostapd_metrics_scrape_interval_ms (How often to scrape metrics from\n      hostapd in milliseconds) type: uint64 default: 5000\n```\n\n### Docker\n\nExample `docker-compose.yml`:\n\n```yaml\nversion: '2'\n\nservices:\n  hostapd:\n    image: jonnrb/hostapd\n    privileged: true\n    volumes:\n      - ./hostapd.conf.tmpl:/data/hostapd.conf.tmpl:ro\n      - /var/run/docker.sock:/var/run/docker.sock:ro\n      - hostapd_control:/var/run/hostapd:rw\n      - hostapd_clients:/var/run/hostapd_grpc:ro\n    network_mode: host\n\n  hostapd_grpc:\n    image: jonnrb/hostapd_grpc\n    volumes:\n      - hostapd_control:/var/run/hostapd:ro\n      - hostapd_clients:/var/run/hostapd_grpc:rw\n    networks:\n      - private\n\n  prometheus:\n    image: prom/prometheus\n    command: --config.file=/prometheus.yml --storage.tsdb.path=/prometheus\n    volumes:\n      - ./prometheus.yml:/prometheus.yml:ro\n      - prometheus:/prometheus:rw\n    networks:\n      - private\n\nnetworks:\n  private:\n    internal: true\n\nvolumes:\n  prometheus:\n  hostapd_control:\n    driver_opts:\n      type: tmpfs\n      device: tmpfs\n  hostapd_clients:\n    driver_opts:\n      type: tmpfs\n      device: tmpfs\n```\n\n### _Work in Progress..._\n\nIf you find this neat and whatnot, I'm open to implementing new features and\nfixing bugs. Just add an issue or make a PR!\n\nI'm currently using this to provide data to\n[wifi_dash](https://git.jonnrb.com/jon/wifi_dash).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonnrb%2Fhostapd_grpc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjonnrb%2Fhostapd_grpc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonnrb%2Fhostapd_grpc/lists"}