vardrrunner 0.28.0__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.
- vardrrunner-0.28.0/LICENSE +21 -0
- vardrrunner-0.28.0/PKG-INFO +199 -0
- vardrrunner-0.28.0/README.md +141 -0
- vardrrunner-0.28.0/pyproject.toml +84 -0
- vardrrunner-0.28.0/setup.cfg +4 -0
- vardrrunner-0.28.0/tests/test_api.py +278 -0
- vardrrunner-0.28.0/tests/test_auth_commands.py +150 -0
- vardrrunner-0.28.0/tests/test_cli.py +320 -0
- vardrrunner-0.28.0/tests/test_config.py +134 -0
- vardrrunner-0.28.0/tests/test_configs.py +173 -0
- vardrrunner-0.28.0/tests/test_credentials.py +134 -0
- vardrrunner-0.28.0/tests/test_daemon.py +482 -0
- vardrrunner-0.28.0/tests/test_doctor.py +164 -0
- vardrrunner-0.28.0/tests/test_engagements.py +123 -0
- vardrrunner-0.28.0/tests/test_handlers.py +447 -0
- vardrrunner-0.28.0/tests/test_heartbeat.py +259 -0
- vardrrunner-0.28.0/tests/test_imports.py +82 -0
- vardrrunner-0.28.0/tests/test_job_events.py +155 -0
- vardrrunner-0.28.0/tests/test_jobs.py +517 -0
- vardrrunner-0.28.0/tests/test_keychain.py +96 -0
- vardrrunner-0.28.0/tests/test_nmap.py +361 -0
- vardrrunner-0.28.0/tests/test_pipeline.py +434 -0
- vardrrunner-0.28.0/tests/test_pipelines.py +326 -0
- vardrrunner-0.28.0/tests/test_run_commands.py +302 -0
- vardrrunner-0.28.0/tests/test_runner.py +367 -0
- vardrrunner-0.28.0/tests/test_status.py +172 -0
- vardrrunner-0.28.0/vardrrunner/__init__.py +8 -0
- vardrrunner-0.28.0/vardrrunner/api.py +173 -0
- vardrrunner-0.28.0/vardrrunner/cli.py +440 -0
- vardrrunner-0.28.0/vardrrunner/commands/__init__.py +0 -0
- vardrrunner-0.28.0/vardrrunner/commands/auth.py +100 -0
- vardrrunner-0.28.0/vardrrunner/commands/daemon.py +326 -0
- vardrrunner-0.28.0/vardrrunner/commands/doctor.py +315 -0
- vardrrunner-0.28.0/vardrrunner/commands/engagements.py +67 -0
- vardrrunner-0.28.0/vardrrunner/commands/heartbeat.py +56 -0
- vardrrunner-0.28.0/vardrrunner/commands/imports.py +40 -0
- vardrrunner-0.28.0/vardrrunner/commands/jobs.py +177 -0
- vardrrunner-0.28.0/vardrrunner/commands/pipeline.py +417 -0
- vardrrunner-0.28.0/vardrrunner/commands/run.py +293 -0
- vardrrunner-0.28.0/vardrrunner/commands/status.py +113 -0
- vardrrunner-0.28.0/vardrrunner/config.py +164 -0
- vardrrunner-0.28.0/vardrrunner/configs.py +210 -0
- vardrrunner-0.28.0/vardrrunner/handlers.py +498 -0
- vardrrunner-0.28.0/vardrrunner/keychain.py +83 -0
- vardrrunner-0.28.0/vardrrunner/pipelines.py +48 -0
- vardrrunner-0.28.0/vardrrunner/runner.py +389 -0
- vardrrunner-0.28.0/vardrrunner/targets.py +76 -0
- vardrrunner-0.28.0/vardrrunner.egg-info/PKG-INFO +199 -0
- vardrrunner-0.28.0/vardrrunner.egg-info/SOURCES.txt +51 -0
- vardrrunner-0.28.0/vardrrunner.egg-info/dependency_links.txt +1 -0
- vardrrunner-0.28.0/vardrrunner.egg-info/entry_points.txt +2 -0
- vardrrunner-0.28.0/vardrrunner.egg-info/requires.txt +12 -0
- vardrrunner-0.28.0/vardrrunner.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Jorge Aquino
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: vardrrunner
|
|
3
|
+
Version: 0.28.0
|
|
4
|
+
Summary: Local automation runner for the VardrSec product family
|
|
5
|
+
Author: Jorge Aquino
|
|
6
|
+
License: MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2026 Jorge Aquino
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
The above copyright notice and this permission notice shall be included in all
|
|
18
|
+
copies or substantial portions of the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
SOFTWARE.
|
|
27
|
+
|
|
28
|
+
Project-URL: Homepage, https://github.com/VardrSec/VardrRunner
|
|
29
|
+
Project-URL: Repository, https://github.com/VardrSec/VardrRunner
|
|
30
|
+
Project-URL: Changelog, https://github.com/VardrSec/VardrRunner/blob/main/CHANGELOG.md
|
|
31
|
+
Project-URL: Issues, https://github.com/VardrSec/VardrRunner/issues
|
|
32
|
+
Keywords: security,bug-bounty,recon,automation,cli,vardrsec
|
|
33
|
+
Classifier: Development Status :: 4 - Beta
|
|
34
|
+
Classifier: Environment :: Console
|
|
35
|
+
Classifier: Intended Audience :: Information Technology
|
|
36
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
37
|
+
Classifier: Operating System :: OS Independent
|
|
38
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
39
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
40
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
41
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
42
|
+
Classifier: Topic :: Security
|
|
43
|
+
Requires-Python: >=3.10
|
|
44
|
+
Description-Content-Type: text/markdown
|
|
45
|
+
License-File: LICENSE
|
|
46
|
+
Requires-Dist: typer>=0.12
|
|
47
|
+
Requires-Dist: rich>=13
|
|
48
|
+
Requires-Dist: requests>=2.31
|
|
49
|
+
Requires-Dist: keyring>=24
|
|
50
|
+
Provides-Extra: dev
|
|
51
|
+
Requires-Dist: pytest>=8; extra == "dev"
|
|
52
|
+
Requires-Dist: pytest-cov>=5; extra == "dev"
|
|
53
|
+
Requires-Dist: ruff>=0.6; extra == "dev"
|
|
54
|
+
Requires-Dist: mypy>=1.11; extra == "dev"
|
|
55
|
+
Requires-Dist: types-requests>=2.31; extra == "dev"
|
|
56
|
+
Requires-Dist: bandit>=1.7; extra == "dev"
|
|
57
|
+
Dynamic: license-file
|
|
58
|
+
|
|
59
|
+
# VardrRunner
|
|
60
|
+
|
|
61
|
+
**The local automation runner for the VardrSec product family.**
|
|
62
|
+
|
|
63
|
+
VardrRunner runs your security tooling on *your* machine and syncs the results to a
|
|
64
|
+
VardrSec backend (today: [VardrMap](https://github.com/VardrSec/VardrMap)) over HTTP.
|
|
65
|
+
It is a thin, fast, dependency-light client: it polls the backend for queued scan jobs,
|
|
66
|
+
claims them atomically, executes the tool locally, streams live progress back, uploads
|
|
67
|
+
results, and heartbeats so the backend always knows which machines are online.
|
|
68
|
+
|
|
69
|
+
> **Why local?** Recon and scanning tools belong on the operator's box — their bandwidth,
|
|
70
|
+
> their IP, their tool versions. The backend orchestrates and stores; the runner does the
|
|
71
|
+
> work. The two are fully decoupled and only ever exchange JSON.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Features
|
|
76
|
+
- **Job queue worker** — poll, atomically claim, execute, and report scan jobs
|
|
77
|
+
- **Daemon mode** — `daemon start` runs a continuous background worker (poll every 5 s,
|
|
78
|
+
heartbeat every 60 s) with detached mode, PID file, and graceful shutdown
|
|
79
|
+
- **Tool runners** — `httpx`, `subfinder`, `nuclei`, `nmap`, `dnsx`, `naabu` (more coming),
|
|
80
|
+
each capturing output into a timestamped run directory, every run bounded by a timeout
|
|
81
|
+
- **Recon pipelines** — chain tools in one command: `recon` (subfinder → httpx → nuclei),
|
|
82
|
+
`deep` (adds dnsx resolution), `ports` (subfinder → dnsx → naabu), `quick`
|
|
83
|
+
- **VardrGate authorization tests** — `vardrgate_api_test` jobs drive the local `vardrgate`
|
|
84
|
+
binary over a CLI/JSON contract and attach the sanitized result to the job. Identity
|
|
85
|
+
credentials may reference a secret (`value_env` / `value_keychain`) that is resolved on
|
|
86
|
+
the runner at execution time, so the secret never reaches the backend
|
|
87
|
+
- **Importers** — pull existing `nuclei` / `httpx` output files into the backend
|
|
88
|
+
- **Real heartbeat** — reports hostname, version, OS, and per-tool availability so the
|
|
89
|
+
backend's Bridge shows live machine status
|
|
90
|
+
- **Live job events** — emits `started → targets_resolved → running → uploaded → done/failed`
|
|
91
|
+
so the backend Terminal shows real-time logs
|
|
92
|
+
- **Preflight (`doctor`)** — one command validates the whole machine (creds, URL, perms,
|
|
93
|
+
auth, daemon, disk, tools, pipelines) and exits non-zero on actionable failures, for
|
|
94
|
+
scripting unattended/VPS provisioning
|
|
95
|
+
- **Safe by default** — missing tools fail the job loudly, targets are normalized before
|
|
96
|
+
use, and the API key is stored locally with restrictive permissions
|
|
97
|
+
|
|
98
|
+
## Requirements
|
|
99
|
+
- Python **3.10+**
|
|
100
|
+
- The external tools you intend to run, on your `PATH` (e.g. `httpx`, `subfinder`, `nuclei`, `nmap`, `dnsx`, `naabu`) — plus `vardrgate` if you run `vardrgate_api_test` jobs
|
|
101
|
+
- A VardrSec backend URL and an API key (`vmap_…` for VardrMap)
|
|
102
|
+
- VardrMap **≥ v0.22.0** as the backend — the runner calls `/engagements/*` (see [CHANGELOG](CHANGELOG.md) v0.27.0)
|
|
103
|
+
|
|
104
|
+
## Install
|
|
105
|
+
|
|
106
|
+
**From PyPI** (once published) — recommended via [pipx](https://pipx.pypa.io) for an isolated CLI:
|
|
107
|
+
```bash
|
|
108
|
+
pipx install vardrrunner # or: pip install vardrrunner
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**From a GitHub Release** (works today, before PyPI) — grab the wheel from the
|
|
112
|
+
[latest release](https://github.com/VardrSec/VardrRunner/releases) (each is built in CI
|
|
113
|
+
with a CycloneDX SBOM and a build-provenance attestation):
|
|
114
|
+
```bash
|
|
115
|
+
pipx install ./vardrrunner-<version>-py3-none-any.whl
|
|
116
|
+
```
|
|
117
|
+
> Releases are cut per `vX.Y.Z` tag, so the newest release can lag `main`. Compare the
|
|
118
|
+
> release tag against [CHANGELOG.md](CHANGELOG.md) — if you need a version that has not
|
|
119
|
+
> been tagged yet, install from source.
|
|
120
|
+
|
|
121
|
+
**From source** (development):
|
|
122
|
+
```bash
|
|
123
|
+
git clone https://github.com/VardrSec/VardrRunner.git
|
|
124
|
+
cd VardrRunner
|
|
125
|
+
python -m venv venv
|
|
126
|
+
.\venv\Scripts\Activate.ps1 # Windows (macOS/Linux: source venv/bin/activate)
|
|
127
|
+
pip install -e ".[dev]"
|
|
128
|
+
```
|
|
129
|
+
All three install the `vardrrunner` command.
|
|
130
|
+
|
|
131
|
+
> Homebrew / Scoop formulae are planned once there's demand; until then use pipx or the release wheel.
|
|
132
|
+
|
|
133
|
+
## Quick start
|
|
134
|
+
```bash
|
|
135
|
+
vardrrunner login vardrmap # prompts for backend URL + API key; key goes to your OS keychain
|
|
136
|
+
vardrrunner status # show config, version, and which tools are detected
|
|
137
|
+
vardrrunner heartbeat # confirm the backend can see this machine
|
|
138
|
+
vardrrunner daemon start # run the continuous worker (poll jobs + heartbeat)
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### One-shot usage
|
|
142
|
+
```bash
|
|
143
|
+
vardrrunner engagements # list your engagements
|
|
144
|
+
vardrrunner scope <engagement-id> # show in/out-of-scope items
|
|
145
|
+
vardrrunner jobs list # show the backend queue
|
|
146
|
+
vardrrunner jobs run # claim + execute all pending jobs once
|
|
147
|
+
vardrrunner run subfinder --engagement <engagement-id> # run a single tool and upload results
|
|
148
|
+
vardrrunner import nuclei --engagement <engagement-id> -f out.jsonl
|
|
149
|
+
```
|
|
150
|
+
`--engagement` takes the engagement UUID; `--program` and `-p` are accepted as aliases.
|
|
151
|
+
|
|
152
|
+
See **[docs/cli.md](docs/cli.md)** for the full command reference.
|
|
153
|
+
|
|
154
|
+
## Configuration
|
|
155
|
+
|
|
156
|
+
**Desktop / dev:** `vardrrunner login` stores your API key in the **OS keychain** (macOS
|
|
157
|
+
Keychain, Windows Credential Locker, Linux Secret Service) — no plaintext key on disk. The
|
|
158
|
+
backend URL is kept in `~/.vardrmap/config.json`. Run `vardrrunner logout` to remove it.
|
|
159
|
+
|
|
160
|
+
**CI / servers / containers:** set credentials via environment variables (no keychain
|
|
161
|
+
needed). The key resolves in this order — **`VARDRMAP_API_KEY` env → OS keychain → config
|
|
162
|
+
file**:
|
|
163
|
+
|
|
164
|
+
| Variable | Purpose |
|
|
165
|
+
|----------|---------|
|
|
166
|
+
| `VARDRMAP_URL` | Backend base URL (must be `https://`, except `localhost`) |
|
|
167
|
+
| `VARDRMAP_API_KEY` | Your `vmap_` API key |
|
|
168
|
+
| `VARDRRUNNER_TOOL_TIMEOUT` | Per-tool run timeout in seconds (default 1800); a hung tool is killed and the job marked failed |
|
|
169
|
+
| `VARDRRUNNER_ALLOW_INSECURE` | Set to `1` to permit a plain-HTTP backend URL (not recommended) |
|
|
170
|
+
|
|
171
|
+
The runner refuses to send your API key over plain HTTP to a non-local host, so a mistyped
|
|
172
|
+
`http://` URL can't leak your key.
|
|
173
|
+
|
|
174
|
+
## Documentation
|
|
175
|
+
- [docs/architecture.md](docs/architecture.md) — how the runner is structured and how it talks to the backend
|
|
176
|
+
- [docs/development.md](docs/development.md) — local setup, testing, and contribution workflow
|
|
177
|
+
- [docs/cli.md](docs/cli.md) — complete command and flag reference
|
|
178
|
+
- [docs/adr/](docs/adr/) — Architecture Decision Records
|
|
179
|
+
- [CHANGELOG.md](CHANGELOG.md) — version history
|
|
180
|
+
|
|
181
|
+
## Development & testing
|
|
182
|
+
```bash
|
|
183
|
+
pip install -e ".[dev]" # editable install + dev tools (pytest, ruff, mypy)
|
|
184
|
+
ruff check vardrrunner tests # lint
|
|
185
|
+
ruff format --check vardrrunner tests # formatting
|
|
186
|
+
mypy vardrrunner # type check
|
|
187
|
+
pytest tests # 450 tests; all subprocess + HTTP calls are mocked
|
|
188
|
+
```
|
|
189
|
+
CI runs ruff (lint + format), mypy, and a bandit security scan, then the test suite at a
|
|
190
|
+
95% coverage floor on Python 3.10/3.11/3.12 (Linux) plus a 3.12 smoke on Windows and
|
|
191
|
+
macOS, and a `pip-audit` dependency audit — on every push and PR to `main`.
|
|
192
|
+
Contributions follow the **Engineering Charter** in [CLAUDE.md](CLAUDE.md): clean code,
|
|
193
|
+
tests in the same commit, docs updated, and the suite always green.
|
|
194
|
+
|
|
195
|
+
## License
|
|
196
|
+
[MIT](LICENSE) © 2026 Jorge Aquino.
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
*Part of the VardrSec product family — [VardrMap](https://github.com/VardrSec/VardrMap) · VardrRunner · VardrVault.*
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# VardrRunner
|
|
2
|
+
|
|
3
|
+
**The local automation runner for the VardrSec product family.**
|
|
4
|
+
|
|
5
|
+
VardrRunner runs your security tooling on *your* machine and syncs the results to a
|
|
6
|
+
VardrSec backend (today: [VardrMap](https://github.com/VardrSec/VardrMap)) over HTTP.
|
|
7
|
+
It is a thin, fast, dependency-light client: it polls the backend for queued scan jobs,
|
|
8
|
+
claims them atomically, executes the tool locally, streams live progress back, uploads
|
|
9
|
+
results, and heartbeats so the backend always knows which machines are online.
|
|
10
|
+
|
|
11
|
+
> **Why local?** Recon and scanning tools belong on the operator's box — their bandwidth,
|
|
12
|
+
> their IP, their tool versions. The backend orchestrates and stores; the runner does the
|
|
13
|
+
> work. The two are fully decoupled and only ever exchange JSON.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Features
|
|
18
|
+
- **Job queue worker** — poll, atomically claim, execute, and report scan jobs
|
|
19
|
+
- **Daemon mode** — `daemon start` runs a continuous background worker (poll every 5 s,
|
|
20
|
+
heartbeat every 60 s) with detached mode, PID file, and graceful shutdown
|
|
21
|
+
- **Tool runners** — `httpx`, `subfinder`, `nuclei`, `nmap`, `dnsx`, `naabu` (more coming),
|
|
22
|
+
each capturing output into a timestamped run directory, every run bounded by a timeout
|
|
23
|
+
- **Recon pipelines** — chain tools in one command: `recon` (subfinder → httpx → nuclei),
|
|
24
|
+
`deep` (adds dnsx resolution), `ports` (subfinder → dnsx → naabu), `quick`
|
|
25
|
+
- **VardrGate authorization tests** — `vardrgate_api_test` jobs drive the local `vardrgate`
|
|
26
|
+
binary over a CLI/JSON contract and attach the sanitized result to the job. Identity
|
|
27
|
+
credentials may reference a secret (`value_env` / `value_keychain`) that is resolved on
|
|
28
|
+
the runner at execution time, so the secret never reaches the backend
|
|
29
|
+
- **Importers** — pull existing `nuclei` / `httpx` output files into the backend
|
|
30
|
+
- **Real heartbeat** — reports hostname, version, OS, and per-tool availability so the
|
|
31
|
+
backend's Bridge shows live machine status
|
|
32
|
+
- **Live job events** — emits `started → targets_resolved → running → uploaded → done/failed`
|
|
33
|
+
so the backend Terminal shows real-time logs
|
|
34
|
+
- **Preflight (`doctor`)** — one command validates the whole machine (creds, URL, perms,
|
|
35
|
+
auth, daemon, disk, tools, pipelines) and exits non-zero on actionable failures, for
|
|
36
|
+
scripting unattended/VPS provisioning
|
|
37
|
+
- **Safe by default** — missing tools fail the job loudly, targets are normalized before
|
|
38
|
+
use, and the API key is stored locally with restrictive permissions
|
|
39
|
+
|
|
40
|
+
## Requirements
|
|
41
|
+
- Python **3.10+**
|
|
42
|
+
- The external tools you intend to run, on your `PATH` (e.g. `httpx`, `subfinder`, `nuclei`, `nmap`, `dnsx`, `naabu`) — plus `vardrgate` if you run `vardrgate_api_test` jobs
|
|
43
|
+
- A VardrSec backend URL and an API key (`vmap_…` for VardrMap)
|
|
44
|
+
- VardrMap **≥ v0.22.0** as the backend — the runner calls `/engagements/*` (see [CHANGELOG](CHANGELOG.md) v0.27.0)
|
|
45
|
+
|
|
46
|
+
## Install
|
|
47
|
+
|
|
48
|
+
**From PyPI** (once published) — recommended via [pipx](https://pipx.pypa.io) for an isolated CLI:
|
|
49
|
+
```bash
|
|
50
|
+
pipx install vardrrunner # or: pip install vardrrunner
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**From a GitHub Release** (works today, before PyPI) — grab the wheel from the
|
|
54
|
+
[latest release](https://github.com/VardrSec/VardrRunner/releases) (each is built in CI
|
|
55
|
+
with a CycloneDX SBOM and a build-provenance attestation):
|
|
56
|
+
```bash
|
|
57
|
+
pipx install ./vardrrunner-<version>-py3-none-any.whl
|
|
58
|
+
```
|
|
59
|
+
> Releases are cut per `vX.Y.Z` tag, so the newest release can lag `main`. Compare the
|
|
60
|
+
> release tag against [CHANGELOG.md](CHANGELOG.md) — if you need a version that has not
|
|
61
|
+
> been tagged yet, install from source.
|
|
62
|
+
|
|
63
|
+
**From source** (development):
|
|
64
|
+
```bash
|
|
65
|
+
git clone https://github.com/VardrSec/VardrRunner.git
|
|
66
|
+
cd VardrRunner
|
|
67
|
+
python -m venv venv
|
|
68
|
+
.\venv\Scripts\Activate.ps1 # Windows (macOS/Linux: source venv/bin/activate)
|
|
69
|
+
pip install -e ".[dev]"
|
|
70
|
+
```
|
|
71
|
+
All three install the `vardrrunner` command.
|
|
72
|
+
|
|
73
|
+
> Homebrew / Scoop formulae are planned once there's demand; until then use pipx or the release wheel.
|
|
74
|
+
|
|
75
|
+
## Quick start
|
|
76
|
+
```bash
|
|
77
|
+
vardrrunner login vardrmap # prompts for backend URL + API key; key goes to your OS keychain
|
|
78
|
+
vardrrunner status # show config, version, and which tools are detected
|
|
79
|
+
vardrrunner heartbeat # confirm the backend can see this machine
|
|
80
|
+
vardrrunner daemon start # run the continuous worker (poll jobs + heartbeat)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### One-shot usage
|
|
84
|
+
```bash
|
|
85
|
+
vardrrunner engagements # list your engagements
|
|
86
|
+
vardrrunner scope <engagement-id> # show in/out-of-scope items
|
|
87
|
+
vardrrunner jobs list # show the backend queue
|
|
88
|
+
vardrrunner jobs run # claim + execute all pending jobs once
|
|
89
|
+
vardrrunner run subfinder --engagement <engagement-id> # run a single tool and upload results
|
|
90
|
+
vardrrunner import nuclei --engagement <engagement-id> -f out.jsonl
|
|
91
|
+
```
|
|
92
|
+
`--engagement` takes the engagement UUID; `--program` and `-p` are accepted as aliases.
|
|
93
|
+
|
|
94
|
+
See **[docs/cli.md](docs/cli.md)** for the full command reference.
|
|
95
|
+
|
|
96
|
+
## Configuration
|
|
97
|
+
|
|
98
|
+
**Desktop / dev:** `vardrrunner login` stores your API key in the **OS keychain** (macOS
|
|
99
|
+
Keychain, Windows Credential Locker, Linux Secret Service) — no plaintext key on disk. The
|
|
100
|
+
backend URL is kept in `~/.vardrmap/config.json`. Run `vardrrunner logout` to remove it.
|
|
101
|
+
|
|
102
|
+
**CI / servers / containers:** set credentials via environment variables (no keychain
|
|
103
|
+
needed). The key resolves in this order — **`VARDRMAP_API_KEY` env → OS keychain → config
|
|
104
|
+
file**:
|
|
105
|
+
|
|
106
|
+
| Variable | Purpose |
|
|
107
|
+
|----------|---------|
|
|
108
|
+
| `VARDRMAP_URL` | Backend base URL (must be `https://`, except `localhost`) |
|
|
109
|
+
| `VARDRMAP_API_KEY` | Your `vmap_` API key |
|
|
110
|
+
| `VARDRRUNNER_TOOL_TIMEOUT` | Per-tool run timeout in seconds (default 1800); a hung tool is killed and the job marked failed |
|
|
111
|
+
| `VARDRRUNNER_ALLOW_INSECURE` | Set to `1` to permit a plain-HTTP backend URL (not recommended) |
|
|
112
|
+
|
|
113
|
+
The runner refuses to send your API key over plain HTTP to a non-local host, so a mistyped
|
|
114
|
+
`http://` URL can't leak your key.
|
|
115
|
+
|
|
116
|
+
## Documentation
|
|
117
|
+
- [docs/architecture.md](docs/architecture.md) — how the runner is structured and how it talks to the backend
|
|
118
|
+
- [docs/development.md](docs/development.md) — local setup, testing, and contribution workflow
|
|
119
|
+
- [docs/cli.md](docs/cli.md) — complete command and flag reference
|
|
120
|
+
- [docs/adr/](docs/adr/) — Architecture Decision Records
|
|
121
|
+
- [CHANGELOG.md](CHANGELOG.md) — version history
|
|
122
|
+
|
|
123
|
+
## Development & testing
|
|
124
|
+
```bash
|
|
125
|
+
pip install -e ".[dev]" # editable install + dev tools (pytest, ruff, mypy)
|
|
126
|
+
ruff check vardrrunner tests # lint
|
|
127
|
+
ruff format --check vardrrunner tests # formatting
|
|
128
|
+
mypy vardrrunner # type check
|
|
129
|
+
pytest tests # 450 tests; all subprocess + HTTP calls are mocked
|
|
130
|
+
```
|
|
131
|
+
CI runs ruff (lint + format), mypy, and a bandit security scan, then the test suite at a
|
|
132
|
+
95% coverage floor on Python 3.10/3.11/3.12 (Linux) plus a 3.12 smoke on Windows and
|
|
133
|
+
macOS, and a `pip-audit` dependency audit — on every push and PR to `main`.
|
|
134
|
+
Contributions follow the **Engineering Charter** in [CLAUDE.md](CLAUDE.md): clean code,
|
|
135
|
+
tests in the same commit, docs updated, and the suite always green.
|
|
136
|
+
|
|
137
|
+
## License
|
|
138
|
+
[MIT](LICENSE) © 2026 Jorge Aquino.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
*Part of the VardrSec product family — [VardrMap](https://github.com/VardrSec/VardrMap) · VardrRunner · VardrVault.*
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "vardrrunner"
|
|
7
|
+
dynamic = ["version"]
|
|
8
|
+
description = "Local automation runner for the VardrSec product family"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = { file = "LICENSE" }
|
|
11
|
+
requires-python = ">=3.10"
|
|
12
|
+
authors = [{ name = "Jorge Aquino" }]
|
|
13
|
+
keywords = ["security", "bug-bounty", "recon", "automation", "cli", "vardrsec"]
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Development Status :: 4 - Beta",
|
|
16
|
+
"Environment :: Console",
|
|
17
|
+
"Intended Audience :: Information Technology",
|
|
18
|
+
"License :: OSI Approved :: MIT License",
|
|
19
|
+
"Operating System :: OS Independent",
|
|
20
|
+
"Programming Language :: Python :: 3 :: Only",
|
|
21
|
+
"Programming Language :: Python :: 3.10",
|
|
22
|
+
"Programming Language :: Python :: 3.11",
|
|
23
|
+
"Programming Language :: Python :: 3.12",
|
|
24
|
+
"Topic :: Security",
|
|
25
|
+
]
|
|
26
|
+
dependencies = [
|
|
27
|
+
"typer>=0.12",
|
|
28
|
+
"rich>=13",
|
|
29
|
+
"requests>=2.31",
|
|
30
|
+
"keyring>=24",
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
[project.urls]
|
|
34
|
+
Homepage = "https://github.com/VardrSec/VardrRunner"
|
|
35
|
+
Repository = "https://github.com/VardrSec/VardrRunner"
|
|
36
|
+
Changelog = "https://github.com/VardrSec/VardrRunner/blob/main/CHANGELOG.md"
|
|
37
|
+
Issues = "https://github.com/VardrSec/VardrRunner/issues"
|
|
38
|
+
|
|
39
|
+
[project.optional-dependencies]
|
|
40
|
+
dev = [
|
|
41
|
+
"pytest>=8",
|
|
42
|
+
"pytest-cov>=5",
|
|
43
|
+
"ruff>=0.6",
|
|
44
|
+
"mypy>=1.11",
|
|
45
|
+
"types-requests>=2.31",
|
|
46
|
+
"bandit>=1.7",
|
|
47
|
+
]
|
|
48
|
+
|
|
49
|
+
[project.scripts]
|
|
50
|
+
vardrrunner = "vardrrunner.cli:app"
|
|
51
|
+
|
|
52
|
+
# Single source of truth for the version: read the literal from the package.
|
|
53
|
+
[tool.setuptools.dynamic]
|
|
54
|
+
version = { attr = "vardrrunner.__version__" }
|
|
55
|
+
|
|
56
|
+
[tool.setuptools.packages.find]
|
|
57
|
+
where = ["."]
|
|
58
|
+
include = ["vardrrunner*"]
|
|
59
|
+
|
|
60
|
+
[tool.ruff]
|
|
61
|
+
line-length = 100
|
|
62
|
+
target-version = "py310"
|
|
63
|
+
|
|
64
|
+
[tool.ruff.lint]
|
|
65
|
+
# E/W pycodestyle, F pyflakes, I import-sorting, B bugbear, UP pyupgrade.
|
|
66
|
+
select = ["E", "W", "F", "I", "B", "UP"]
|
|
67
|
+
ignore = [
|
|
68
|
+
# Long lines are left to the formatter; do not fail lint on E501.
|
|
69
|
+
"E501",
|
|
70
|
+
# B008: function call in argument default. This is the required Typer idiom
|
|
71
|
+
# (`typer.Option(...)` / `typer.Argument(...)` as defaults) — not a bug here.
|
|
72
|
+
"B008",
|
|
73
|
+
]
|
|
74
|
+
|
|
75
|
+
[tool.mypy]
|
|
76
|
+
python_version = "3.10"
|
|
77
|
+
ignore_missing_imports = true
|
|
78
|
+
# warn_unused_ignores is intentionally OFF: Windows-only `# type: ignore`s (ctypes.windll,
|
|
79
|
+
# DETACHED_PROCESS) are needed when CI type-checks on Linux but unused on Windows.
|
|
80
|
+
# Pragmatic baseline — not strict mode. Tighten incrementally over time.
|
|
81
|
+
|
|
82
|
+
[tool.pytest.ini_options]
|
|
83
|
+
addopts = "-q"
|
|
84
|
+
testpaths = ["tests"]
|