glinet-profiler 0.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- glinet_profiler-0.0.1/.github/dependabot.yml +8 -0
- glinet_profiler-0.0.1/.github/workflows/ci.yml +30 -0
- glinet_profiler-0.0.1/.github/workflows/release.yml +43 -0
- glinet_profiler-0.0.1/.gitignore +17 -0
- glinet_profiler-0.0.1/.release-please-manifest.json +3 -0
- glinet_profiler-0.0.1/CHANGELOG.md +49 -0
- glinet_profiler-0.0.1/LICENSE +674 -0
- glinet_profiler-0.0.1/PKG-INFO +114 -0
- glinet_profiler-0.0.1/README.md +88 -0
- glinet_profiler-0.0.1/docs/plans/2026-06-27-glinet-profiler-launcher.md +985 -0
- glinet_profiler-0.0.1/docs/plans/2026-06-27-internalize-enumerator.md +460 -0
- glinet_profiler-0.0.1/docs/plans/2026-06-27-registry-runtime-fetch.md +611 -0
- glinet_profiler-0.0.1/docs/plans/2026-06-27-rehome-api-browser.md +576 -0
- glinet_profiler-0.0.1/docs/plans/2026-06-27-submission-pr-bot.md +458 -0
- glinet_profiler-0.0.1/docs/specs/2026-06-27-glinet-profiler-launcher-design.md +108 -0
- glinet_profiler-0.0.1/docs/specs/2026-06-27-internalize-enumerator-design.md +67 -0
- glinet_profiler-0.0.1/docs/specs/2026-06-27-registry-runtime-fetch-design.md +65 -0
- glinet_profiler-0.0.1/docs/specs/2026-06-27-rehome-api-browser-design.md +106 -0
- glinet_profiler-0.0.1/docs/specs/2026-06-27-release-automation-design.md +43 -0
- glinet_profiler-0.0.1/docs/specs/2026-06-27-submission-pr-bot-design.md +79 -0
- glinet_profiler-0.0.1/pyproject.toml +83 -0
- glinet_profiler-0.0.1/release-please-config.json +10 -0
- glinet_profiler-0.0.1/src/glinet_profiler/__init__.py +1 -0
- glinet_profiler-0.0.1/src/glinet_profiler/capture.py +128 -0
- glinet_profiler-0.0.1/src/glinet_profiler/cli.py +85 -0
- glinet_profiler-0.0.1/src/glinet_profiler/enumerator/__init__.py +6 -0
- glinet_profiler-0.0.1/src/glinet_profiler/enumerator/catalog.py +618 -0
- glinet_profiler-0.0.1/src/glinet_profiler/enumerator/classify.py +28 -0
- glinet_profiler-0.0.1/src/glinet_profiler/enumerator/coverage.py +29 -0
- glinet_profiler-0.0.1/src/glinet_profiler/enumerator/models.py +76 -0
- glinet_profiler-0.0.1/src/glinet_profiler/enumerator/probe.py +172 -0
- glinet_profiler-0.0.1/src/glinet_profiler/enumerator/redact.py +73 -0
- glinet_profiler-0.0.1/src/glinet_profiler/enumerator/report.py +86 -0
- glinet_profiler-0.0.1/src/glinet_profiler/enumerator/ssh.py +193 -0
- glinet_profiler-0.0.1/src/glinet_profiler/enumerator/wordlist.py +131 -0
- glinet_profiler-0.0.1/src/glinet_profiler/glinet_login.py +63 -0
- glinet_profiler-0.0.1/src/glinet_profiler/registry.py +34 -0
- glinet_profiler-0.0.1/src/glinet_profiler/sanitize.py +29 -0
- glinet_profiler-0.0.1/src/glinet_profiler/server.py +134 -0
- glinet_profiler-0.0.1/src/glinet_profiler/submit.py +17 -0
- glinet_profiler-0.0.1/src/glinet_profiler/web/app.js +106 -0
- glinet_profiler-0.0.1/src/glinet_profiler/web/index.html +36 -0
- glinet_profiler-0.0.1/src/glinet_profiler/web/style.css +34 -0
- glinet_profiler-0.0.1/tests/test_capture.py +80 -0
- glinet_profiler-0.0.1/tests/test_cli.py +81 -0
- glinet_profiler-0.0.1/tests/test_enum_brute.py +57 -0
- glinet_profiler-0.0.1/tests/test_enum_catalog.py +68 -0
- glinet_profiler-0.0.1/tests/test_enum_classify.py +38 -0
- glinet_profiler-0.0.1/tests/test_enum_probe.py +72 -0
- glinet_profiler-0.0.1/tests/test_enum_redact.py +55 -0
- glinet_profiler-0.0.1/tests/test_enum_report.py +72 -0
- glinet_profiler-0.0.1/tests/test_enum_ssh_integration.py +36 -0
- glinet_profiler-0.0.1/tests/test_enum_ssh_parse.py +74 -0
- glinet_profiler-0.0.1/tests/test_glinet_login.py +91 -0
- glinet_profiler-0.0.1/tests/test_registry.py +13 -0
- glinet_profiler-0.0.1/tests/test_sanitize.py +58 -0
- glinet_profiler-0.0.1/tests/test_server.py +86 -0
- glinet_profiler-0.0.1/tests/test_submit.py +21 -0
- glinet_profiler-0.0.1/tests/test_web.py +43 -0
- glinet_profiler-0.0.1/uv.lock +1304 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
branches: [main]
|
|
5
|
+
pull_request:
|
|
6
|
+
permissions:
|
|
7
|
+
contents: read
|
|
8
|
+
jobs:
|
|
9
|
+
test:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
|
|
13
|
+
with:
|
|
14
|
+
persist-credentials: false
|
|
15
|
+
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
|
|
16
|
+
with:
|
|
17
|
+
python-version: "3.11"
|
|
18
|
+
- run: uv sync --all-extras --dev
|
|
19
|
+
- name: Ruff lint
|
|
20
|
+
run: uv run ruff check .
|
|
21
|
+
- name: Ruff format
|
|
22
|
+
run: uv run ruff format --check .
|
|
23
|
+
- name: Mypy (strict)
|
|
24
|
+
run: uv run mypy src
|
|
25
|
+
- name: Pylint
|
|
26
|
+
run: uv run pylint $(git ls-files '*.py')
|
|
27
|
+
- name: Tests
|
|
28
|
+
run: uv run pytest -q
|
|
29
|
+
- name: Zizmor (workflow security)
|
|
30
|
+
run: uv run zizmor .github/
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
name: release
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
branches: [main]
|
|
5
|
+
permissions: {}
|
|
6
|
+
jobs:
|
|
7
|
+
release-please:
|
|
8
|
+
runs-on: ubuntu-latest
|
|
9
|
+
permissions:
|
|
10
|
+
contents: write
|
|
11
|
+
pull-requests: write
|
|
12
|
+
outputs:
|
|
13
|
+
release_created: ${{ steps.rp.outputs.release_created }}
|
|
14
|
+
tag_name: ${{ steps.rp.outputs.tag_name }}
|
|
15
|
+
steps:
|
|
16
|
+
- id: rp
|
|
17
|
+
uses: googleapis/release-please-action@45996ed1f6d02564a971a2fa1b5860e934307cf7 # v5
|
|
18
|
+
with:
|
|
19
|
+
config-file: release-please-config.json
|
|
20
|
+
manifest-file: .release-please-manifest.json
|
|
21
|
+
|
|
22
|
+
# Publishes to PyPI via trusted publishing (OIDC) ONLY when release-please cut a
|
|
23
|
+
# release in this same run — sidesteps the GITHUB_TOKEN recursion guard, so no PAT.
|
|
24
|
+
publish:
|
|
25
|
+
needs: release-please
|
|
26
|
+
if: needs.release-please.outputs.release_created == 'true'
|
|
27
|
+
runs-on: ubuntu-latest
|
|
28
|
+
environment: production
|
|
29
|
+
permissions:
|
|
30
|
+
id-token: write # OIDC for PyPI trusted publishing
|
|
31
|
+
contents: read
|
|
32
|
+
steps:
|
|
33
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
|
|
34
|
+
with:
|
|
35
|
+
persist-credentials: false
|
|
36
|
+
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
|
|
37
|
+
with:
|
|
38
|
+
python-version: "3.11"
|
|
39
|
+
enable-cache: false # release artifact must not depend on a (poisonable) cache
|
|
40
|
+
- name: Build sdist + wheel
|
|
41
|
+
run: uv build
|
|
42
|
+
- name: Publish to PyPI (trusted publishing)
|
|
43
|
+
uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
.venv/
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
.pytest_cache/
|
|
5
|
+
.mypy_cache/
|
|
6
|
+
.ruff_cache/
|
|
7
|
+
dist/
|
|
8
|
+
build/
|
|
9
|
+
*.egg-info/
|
|
10
|
+
|
|
11
|
+
# Raw enumerator reports / captures may contain device identifiers (mac/sn) — never commit.
|
|
12
|
+
reports/
|
|
13
|
+
captures/
|
|
14
|
+
docs/devices/
|
|
15
|
+
|
|
16
|
+
# Pages staging area — assembled at deploy time, never committed.
|
|
17
|
+
_site/
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.0.1 (2026-06-27)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **cli:** one-shot headless capture by IP ([7c879c2](https://github.com/shauneccles/glinet-profiler/commit/7c879c203d7ff57d89a3d1adf8c8a6e951430d33))
|
|
9
|
+
* fetch the live registry at runtime; drop bundled data/site/bot (own repo) ([2c581a3](https://github.com/shauneccles/glinet-profiler/commit/2c581a37060ed88be98bfeb56ff71a3e0b794664))
|
|
10
|
+
* glinet-profiler local capture launcher (extracted from gli4py) ([bf2c1be](https://github.com/shauneccles/glinet-profiler/commit/bf2c1be0e2ff9c9f7ce323884680ef37ce635613))
|
|
11
|
+
* **launcher:** live capture progress (NDJSON streaming + UI panel + logging) ([0a70368](https://github.com/shauneccles/glinet-profiler/commit/0a70368b451cf6b9d0a018f52fcb1fa8219e4e69))
|
|
12
|
+
* local GL.iNet challenge-response login (libpass + hashlib) ([53e82aa](https://github.com/shauneccles/glinet-profiler/commit/53e82aad499ad671b9f3d910328003d4a17b93f6))
|
|
13
|
+
* move the enumerator engine into glinet_profiler (paramiko core) ([3ba5118](https://github.com/shauneccles/glinet-profiler/commit/3ba511813e5b5f54ce43b2220ab611809b7c54a0))
|
|
14
|
+
* point launcher Submit at the issue form (auto-label submission) ([38caf40](https://github.com/shauneccles/glinet-profiler/commit/38caf402f1fd8b9431f20a0a2a31987c8c5d6dd8))
|
|
15
|
+
* public registry browser site (ported, hardened escaping) ([8e4f6ea](https://github.com/shauneccles/glinet-profiler/commit/8e4f6ea6251e0ba190f41438cf6cf400f047048d))
|
|
16
|
+
* registry manifest builder (build_manifest + rebuild + CLI) ([d59163b](https://github.com/shauneccles/glinet-profiler/commit/d59163be2a18f0ba3d6f73a1de35fe142ba5962c))
|
|
17
|
+
* rewire capture/ingest to local engine+login; drop gli4py; SSH default ([38872a4](https://github.com/shauneccles/glinet-profiler/commit/38872a48567cfbd7e0e5d311aaded06ed2e38b79))
|
|
18
|
+
* **ui:** SSH ground-truth checked by default ([1ff8285](https://github.com/shauneccles/glinet-profiler/commit/1ff8285c741f2413954d05b99518b6f283c45c11))
|
|
19
|
+
* validate + ingest submitted profiles (glinet_profiler.ingest + CLI) ([710a2f9](https://github.com/shauneccles/glinet-profiler/commit/710a2f912ab4aecb821d44da1878ea3bbbc797da))
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
### Bug Fixes
|
|
23
|
+
|
|
24
|
+
* **ci:** pass attachment URL via env to curl (avoid shell injection) ([8c4b2c7](https://github.com/shauneccles/glinet-profiler/commit/8c4b2c7dd6bb0326eef3274b1f9113f5f3950730))
|
|
25
|
+
* drop stale gli4py[ssh] hint from SshUnavailable message ([3bfd73b](https://github.com/shauneccles/glinet-profiler/commit/3bfd73b8994fdf31a12377e93f0a47101c43a6e2))
|
|
26
|
+
* **launcher:** flush final NDJSON line; assert progress-count in structural test ([e8b2f0b](https://github.com/shauneccles/glinet-profiler/commit/e8b2f0bf5f6f69f03cb54e99568b4f5ebf703faf))
|
|
27
|
+
* **launcher:** skip browser auto-open under WSL; graceful Ctrl+C shutdown (no traceback) ([42980e8](https://github.com/shauneccles/glinet-profiler/commit/42980e815c6077595bc8c6b30a21a30ece7f2a19))
|
|
28
|
+
* **login:** clear error on invalid challenge; sha-determinism + username tests ([37b5a72](https://github.com/shauneccles/glinet-profiler/commit/37b5a7281a7a125c50dad4c6f64604a191ba5904))
|
|
29
|
+
* random heredoc delimiter + validate model/firmware are strings ([237a61d](https://github.com/shauneccles/glinet-profiler/commit/237a61d951a1db7b07363f84bf79f627233b3a3e))
|
|
30
|
+
* **registry:** guard non-dict manifest; cover registry-url threading + known-device CLI ([605f907](https://github.com/shauneccles/glinet-profiler/commit/605f907f5ce7e8e31d87d4d61a1305abbd5bd719))
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
### Documentation
|
|
34
|
+
|
|
35
|
+
* correct stale copy (no gli4py dependency; registry/site moved to glinet-registry) ([2ff1694](https://github.com/shauneccles/glinet-profiler/commit/2ff1694639f9414b8c94d9c783ec3385bca25257))
|
|
36
|
+
* implementation plan for re-homing the API browser (Phase 2) ([6d6dd39](https://github.com/shauneccles/glinet-profiler/commit/6d6dd39552aebe8a10cfb731bbf947d9de19c021))
|
|
37
|
+
* implementation plan for the submission PR bot ([163ec05](https://github.com/shauneccles/glinet-profiler/commit/163ec056ed585734075b2e4cbda178170026d90d))
|
|
38
|
+
* implementation plan to internalize the enumerator + drop gli4py ([25e3df9](https://github.com/shauneccles/glinet-profiler/commit/25e3df917ed3b0f3dbaee0025e66c15992efc95a))
|
|
39
|
+
* plan to split the registry into its own repo (runtime fetch) ([0f0c599](https://github.com/shauneccles/glinet-profiler/commit/0f0c599faa910ae565c54f329959711d95a90a80))
|
|
40
|
+
* preserve Phase-1 launcher design (spec + plan) from gli4py staging ([69eb55d](https://github.com/shauneccles/glinet-profiler/commit/69eb55dc998f3fd8a3f26534b73f25cf51edf661))
|
|
41
|
+
* spec automated profile-submission PR bot ([2c9b5ca](https://github.com/shauneccles/glinet-profiler/commit/2c9b5ca5719ca799b860a5fb70c90d0ebc9acf37))
|
|
42
|
+
* spec internalize the enumerator; drop gli4py entirely ([06f1947](https://github.com/shauneccles/glinet-profiler/commit/06f1947a90256bf2b8c4fe50626ca4e98fb818f5))
|
|
43
|
+
* spec re-home the API browser (Phase 2) ([36a5718](https://github.com/shauneccles/glinet-profiler/commit/36a5718a141b2c48d3555d9a6b47f45ae1c6aa19))
|
|
44
|
+
* spec split the registry into its own repo (runtime fetch) ([9acc6a0](https://github.com/shauneccles/glinet-profiler/commit/9acc6a0b4544bff2afc3ba135817fa9af8bf0a28))
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
### Continuous Integration
|
|
48
|
+
|
|
49
|
+
* release automation (release-please + PyPI trusted publishing) ([a88409b](https://github.com/shauneccles/glinet-profiler/commit/a88409b5ca2a886235683c105e014b750fcb3959))
|