{"id":37217461,"url":"https://github.com/google/ubntools","last_synced_at":"2026-01-15T01:01:32.576Z","repository":{"id":57607611,"uuid":"85600938","full_name":"google/ubntools","owner":"google","description":"Tools to do fun things with ubiquity gear","archived":true,"fork":false,"pushed_at":"2022-11-09T15:18:42.000Z","size":20,"stargazers_count":19,"open_issues_count":0,"forks_count":6,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-11T14:29:57.154Z","etag":null,"topics":["network"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/google.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-03-20T16:35:33.000Z","updated_at":"2025-12-15T06:38:36.000Z","dependencies_parsed_at":"2022-08-30T05:22:25.123Z","dependency_job_id":null,"html_url":"https://github.com/google/ubntools","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/google/ubntools","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google%2Fubntools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google%2Fubntools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google%2Fubntools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google%2Fubntools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/google","download_url":"https://codeload.github.com/google/ubntools/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google%2Fubntools/sbom","scorecard":{"id":438112,"data":{"date":"2025-08-11","repo":{"name":"github.com/google/ubntools","commit":"51fdef99ad109da366b6d36ca9d2e0edd3292285"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.9,"checks":[{"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/18 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":"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":"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":"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":"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":"Maintained","score":0,"reason":"project is archived","details":["Warn: Repository is archived."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"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":"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: 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":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":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: github.com/google/.github/SECURITY.md:1","Info: Found linked content: github.com/google/.github/SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: github.com/google/.github/SECURITY.md:1","Info: Found text in security policy: github.com/google/.github/SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}}]},"last_synced_at":"2025-08-19T05:07:26.765Z","repository_id":57607611,"created_at":"2025-08-19T05:07:26.765Z","updated_at":"2025-08-19T05:07:26.765Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28441004,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-15T00:55:22.719Z","status":"ssl_error","status_checked_at":"2026-01-15T00:55:20.945Z","response_time":107,"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":["network"],"created_at":"2026-01-15T01:00:59.324Z","updated_at":"2026-01-15T01:01:32.447Z","avatar_url":"https://github.com/google.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ubntools\n\nCopyright 2017 Google Inc.\n\nThis is not a google product.\n\nTools to do fun things with ubiquity gear.\n\n# MOVED TO https://github.com/ThomasHabets/ubntools\n\n## HOWTO\n\n### 1. Log in to AP\n\n### 2. Generate SSH key\n\n```\n$ mkdir ~/.ssh\n$ dropbearkey -t rsa -f ~/.ssh/id_dropbear -s 2048\nssh-rsa AAAA…== admin@apname\n```\n\n### 3. Add this key to server's `~/.ssh/authorized_keys`\n\nTry a one-time upload by uploading `ap-uploader.sh` to the AP and running:\n```\n$ ./ap-uploader.sh user@server:path/\n```\n\n### 4. Set up regular data uploads\n\nOn the AP, run:\n```\n$ nohup sh -c 'while true; do ./ap-uploader.sh user@server:path/;sleep 600;done' \u0026\n```\n\nMake sure files are being uploaded to the server every 10 minutes. If it all\nlooks good then the AP setup is done. At least until it reboots.\n\n### 5. On server: Create database\n\n```\n$ createdb ubntools\n$ psql ubntools -f schema.sql\n```\n\n### 6. Import data\n\n```\n$ go build inserter.go\n$ ./inserter -dbconnect='dbname=ubntools host=/var/run/postgresql sslmode=disable' /path/to/*.gz\n```\n\n### 7. Query data\n\n```\n$ psql ubntools\nubntools=\u003e SELECT * FROM view_neighbors;\n    ap    | channel |       bssid       |         essid          | bw | rssi | security | adhoc\n----------+---------+-------------------+------------------------+----+------+----------+-------\n  apname  |       6 | 00:8e:f2:aa:aa:aa | virginmediaxxxxxxx     | 20 |   10 | secured  | f\n[…]\n```\n\n### 8. Generate channel utilization graph\n\n```\n$ go build mkgraph.go\n$ ./mkgraph -dbconnect='dbname=ubntools host=/var/run/postgresql sslmode=disable' | gnuplot\n$ mv foo.png /path/to/web/root/or/something/\n```\n\n## Interesting queries\n\nThere are premade views (do `\\d` and then `SELECT * from view_…`),\nbut you can query more raw data too.\n\n### Current clients\n```\nSELECT\n  essid,\n  ap,\n  channel,\n  data-\u003e\u003e'hostname' hostname,\n  data-\u003e\u003e'mac' mac,\n  data-\u003e\u003e'rssi' rssi\nFROM sta_table_latest\nORDER BY essid,ap,channel,hostname,mac;\n```\n\n### Active radios\n```\nSELECT\n  ap,\n  data-\u003e\u003e'name' AS name,\n  data-\u003e\u003e'radio' AS radio,\n  CASE data-\u003e\u003e'is_11ac' WHEN 'true' THEN TRUE ELSE FALSE END as \"802.11ac\",\n  data-\u003e\u003e'max_txpower' AS power\nFROM radio_table_latest\nORDER BY ap, name;\n```\n\n### One client's RSSI over time\n```\nSELECT\n  ts,\n  (data-\u003e\u003e'rssi')::int rssi\nFROM sta_table\nWHERE data-\u003e\u003e'mac'='11:22:33:44:55:66'\nORDER BY ts;\n```\n\n### rssi of clients over time\n```\nSELECT\n  ap,\n  ts,\n  essid,\n  channel,\n  data-\u003e\u003e'hostname' hostname,\n  data-\u003e\u003e'mac' mac,\n  data-\u003e\u003e'rssi' rssi\nFROM sta_table\nORDER BY data-\u003e\u003e'mac',ts;\n```\n\n### Show days when there was at least one DFS event forcing a change of channel\n\n```\n# SELECT TO_CHAR(ts,'YYYY-MM-DD') dayy,MIN(channel) channel FROM view_clients_history WHERE ap='ap-longrange' AND ts\u003e'2020-11-01' AND channel\u003e11 GROUP BY dayy ORDER BY dayy;\n    dayy    | channel \n------------+---------\n 2020-11-01 |     128\n 2020-11-02 |     128\n 2020-11-03 |     128\n 2020-11-04 |     128\n 2020-11-05 |     128\n 2020-11-06 |      40\n 2020-11-07 |      40\n 2020-11-08 |      44\n 2020-11-09 |     128\n 2020-11-10 |     128\n 2020-11-11 |      44\n 2020-11-12 |      44\n 2020-11-13 |      36\n 2020-11-14 |      36\n 2020-11-15 |      44\n 2020-11-16 |      44\n 2020-11-17 |     128\n 2020-11-18 |      36\n 2020-11-19 |      36\n 2020-11-20 |      36\n 2020-11-21 |      36\n 2020-11-22 |      48\n 2020-11-23 |      48\n 2020-11-24 |      44\n 2020-11-25 |      48\n 2020-11-26 |      48\n 2020-11-27 |      36\n 2020-11-28 |      36\n 2020-11-29 |     128\n 2020-11-30 |      40\n 2020-12-01 |      40\n 2020-12-02 |      40\n(32 rows)\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoogle%2Fubntools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgoogle%2Fubntools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoogle%2Fubntools/lists"}