qualys-cli 0.1.8__tar.gz → 0.2.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.
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/CHANGELOG.md +107 -1
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/PKG-INFO +2 -2
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/pyproject.toml +1 -1
- qualys_cli-0.2.0/src/qualys_cli/__init__.py +1 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/_docs/usage.html +15 -15
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/cli.py +9 -3
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/client.py +88 -2
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/commands/asset.py +54 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/commands/cs.py +68 -0
- qualys_cli-0.2.0/src/qualys_cli/commands/edr.py +34 -0
- qualys_cli-0.2.0/src/qualys_cli/commands/fim.py +47 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/commands/pc.py +100 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/commands/pm.py +36 -3
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/commands/tc.py +97 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/commands/vm.py +477 -2
- qualys_cli-0.2.0/src/qualys_cli/detection_stats.py +225 -0
- qualys_cli-0.2.0/tests/conftest.py +77 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_all_commands_smoke.py +8 -0
- qualys_cli-0.2.0/tests/test_asset_tags.py +68 -0
- qualys_cli-0.2.0/tests/test_detection_stats.py +178 -0
- qualys_cli-0.2.0/tests/test_detection_stats_cmd.py +337 -0
- qualys_cli-0.2.0/tests/test_fim_edr.py +72 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_help.py +3 -1
- qualys_cli-0.2.0/tests/test_isolation.py +31 -0
- qualys_cli-0.2.0/tests/test_kcs_mitigation.py +91 -0
- qualys_cli-0.2.0/tests/test_kev.py +120 -0
- qualys_cli-0.2.0/tests/test_mcp_live.py +645 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_pc.py +59 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_tc.py +74 -0
- qualys_cli-0.2.0/tests/test_vm.py +589 -0
- qualys_cli-0.1.8/src/qualys_cli/__init__.py +0 -1
- qualys_cli-0.1.8/tests/conftest.py +0 -43
- qualys_cli-0.1.8/tests/test_vm.py +0 -229
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/.gitignore +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/LICENSE +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/README.md +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/__main__.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/audit.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/auth.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/cache.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/commands/__init__.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/commands/ca.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/commands/csam.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/commands/etm.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/commands/scanauth.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/commands/sub.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/commands/user.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/commands/was.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/config.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/extras.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/flair.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/formatters.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/history.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/http_server.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/mcp_server.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/metrics.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/platforms.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/src/qualys_cli/queries.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/__init__.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_agent_mode.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_asset.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_audit.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_ca.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_client.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_csam.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_error_handling.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_etm.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_features.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_flair.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_formatters.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_global_flags.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_high_fixes.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_main.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_med_fixes.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_pm.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_resiliency.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_review_fixes.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_scanauth.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_security_fixes.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_sub.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_user.py +0 -0
- {qualys_cli-0.1.8 → qualys_cli-0.2.0}/tests/test_was.py +0 -0
|
@@ -6,6 +6,109 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.2.0] — 2026-09-21
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
- `cs k8s-cluster list/get` — Kubernetes cluster security (KCS). Path per
|
|
13
|
+
the gateway's own swagger: /csapi/v1.3/k8sClusters.
|
|
14
|
+
- `cs policy list` — centralized image-assurance / CI-CD gate policies.
|
|
15
|
+
- `pm mitigation plan` — available FIX-type mitigation scripts per QID
|
|
16
|
+
(POST /mtg/v1/vulnerabilities/mitigations; empty = patch-only QIDs).
|
|
17
|
+
- `fim events` — File Integrity Monitoring event search (who changed what,
|
|
18
|
+
when). Note: pagination rides in the request body; the query param is
|
|
19
|
+
silently ignored by the API (verified live).
|
|
20
|
+
- `edr events` — EDR endpoint telemetry search. The EDR API is served
|
|
21
|
+
under its platform module name, `/ioc/`.
|
|
22
|
+
- `tc evaluation resources` — resources evaluated against one control
|
|
23
|
+
("which S3 buckets fail X"), failing-only by default with per-resource
|
|
24
|
+
failure evidence. Filter field verified live: `resource.result:FAIL`
|
|
25
|
+
(bare `result:FAIL` is accepted but silently matches nothing).
|
|
26
|
+
- `tc resource list` / `tc resource get` — cloud resource inventory with
|
|
27
|
+
failed-control counts. Note: this path family requires the UPPERCASE
|
|
28
|
+
provider segment (lowercase 404s misleadingly).
|
|
29
|
+
- `pc exception list` — compliance exceptions/waivers with status,
|
|
30
|
+
expiration, policy/control filters.
|
|
31
|
+
- `pc control list` — compliance controls; `--frameworks` adds SOC2/ISO/
|
|
32
|
+
NIST/CIS framework section mappings (details=All).
|
|
33
|
+
- `asset tag list` — enumerate configured asset tags (id/name/parent),
|
|
34
|
+
the scoping unit for business-unit and team rollups.
|
|
35
|
+
- `vm host detection` / `detection-stats`: `--include-ignored` surfaces
|
|
36
|
+
detections in the ignored/exception workflow.
|
|
37
|
+
- `vm kb qvs` enumeration mode: search the CVE universe by QVS range and
|
|
38
|
+
NVD publish window (`--qvs-min/--qvs-max/--published-after/
|
|
39
|
+
--published-before/--modified-after`) with client-side
|
|
40
|
+
`--exploit-maturity/--threat-actor/--cisa-only` filters. Routes to the
|
|
41
|
+
v3 endpoint (v2 hard-requires a CVE list). Closes the largest coverage
|
|
42
|
+
gap found auditing the 923-question CRA bank.
|
|
43
|
+
- `vm appliance list --full` — output_mode=full detail: last-connected
|
|
44
|
+
time, signature versions, interface config.
|
|
45
|
+
- `pm patch list --platform` documents MacOS (value already passed
|
|
46
|
+
through; help text implied Windows|Linux only).
|
|
47
|
+
- `vm host detection-stats`: `--qds` / `--qds-min` (Qualys Detection Score
|
|
48
|
+
aggregation: mean/max/critical count overall and per QID, server-side
|
|
49
|
+
QDS range filtering), `--sla-days N` (within/beyond share for arbitrary
|
|
50
|
+
SLA thresholds), `--fixed-since` (unambiguous "fixed in window" spelling),
|
|
51
|
+
`--top N` (configurable QID concentration list).
|
|
52
|
+
- `vm kb qvs` — Qualys Vulnerability Score per CVE with contributing
|
|
53
|
+
factors (CVSS, EPSS, exploit maturity, threat actors, malware, CISA KEV
|
|
54
|
+
status + due date). JSON endpoint, ETag-cached.
|
|
55
|
+
- `vm kb list --lean` — compact records (qid/title/severity/cves/patchable/
|
|
56
|
+
kev) instead of ~76KB-per-QID full entries; sized for LLM context windows.
|
|
57
|
+
- `vm host list`: `--show-trurisk`, `--trurisk-min/--trurisk-max` — TruRisk
|
|
58
|
+
score, asset criticality, and factors per host (documented Host List API
|
|
59
|
+
params).
|
|
60
|
+
- `vm scan list --ref <scan_ref>` — single-scan drill-down with STATUS /
|
|
61
|
+
SUB_STATE and option-profile detail for diagnosing errored scans.
|
|
62
|
+
- `vm host exists` — disambiguates "host has no matching detections" from
|
|
63
|
+
"host is not in the subscription", with per-host last-scan freshness.
|
|
64
|
+
- `QUALYS_FO_API_VERSION=3|4` — opt-in migration off the End-of-Service
|
|
65
|
+
/api/2.0/fo/ paths for the versioned endpoints (host list, detection,
|
|
66
|
+
knowledge base, QVS). v3/v4 authenticate with JWT bearer (exchanged and
|
|
67
|
+
cached automatically) instead of Basic auth. Default remains v2 until
|
|
68
|
+
the EOL date approaches.
|
|
69
|
+
- `vm host detection-stats` — population-level aggregates (MTTR / backlog age)
|
|
70
|
+
in one command: paginates the full matching detection population internally
|
|
71
|
+
with lean server-side params and returns count, mean/median/p25/p75/min/max
|
|
72
|
+
days, an age histogram, per-severity and top-QID breakdowns, plus a
|
|
73
|
+
`definition` field stating exactly what the metric measures. Built for
|
|
74
|
+
MCP/agent callers so "what's our MTTR" is one tool call, not dozens.
|
|
75
|
+
- `vm host detection-stats --kev` — restrict any stats query to CISA KEV
|
|
76
|
+
vulnerabilities. Resolves the KEV QID set internally and filters
|
|
77
|
+
client-side (no Qualys API version supports server-side threat-intel
|
|
78
|
+
filtering — verified against v2 and v4).
|
|
79
|
+
- `vm kb kev-qids` — enumerate the full QID set covering the CISA KEV
|
|
80
|
+
catalog (public CISA feed → chunked, parallel, ETag-cached KB mapping;
|
|
81
|
+
~4 min cold, sub-second warm).
|
|
82
|
+
- `vm host detection`: new server-side cost-cutting options `--status`,
|
|
83
|
+
`--detection-updated-since`, `--show-results/--no-show-results`,
|
|
84
|
+
`--show-igs/--no-show-igs`.
|
|
85
|
+
- `client.cached_get_xml()` — ETag/soft-TTL cached XML GET, mirroring
|
|
86
|
+
`cached_get_json`; `vm kb list` now uses it (repeat catalog queries
|
|
87
|
+
revalidate instead of re-downloading multi-MB responses).
|
|
88
|
+
|
|
89
|
+
### Fixed
|
|
90
|
+
- `vm host list` / `vm host detection`: `--limit` is now sent server-side as
|
|
91
|
+
`truncation_limit`. Previously it was applied client-side after the API
|
|
92
|
+
had evaluated and serialized the full result set (observed: an 88 MB /
|
|
93
|
+
497 s response trimmed locally to 3 rows).
|
|
94
|
+
- `vm scan list --limit` now bounds JSON output (the scan list API has no
|
|
95
|
+
truncation param and the limit was only applied to table renders —
|
|
96
|
+
`--limit 8` returned the full 554-scan history).
|
|
97
|
+
- For windowed MTTR queries, detections whose fix predates the
|
|
98
|
+
`--detection-updated-since` window are excluded and counted in
|
|
99
|
+
`dropped_fixed_before_window` (the server filters on record-update time,
|
|
100
|
+
not fix time).
|
|
101
|
+
- Percentiles use inclusive interpolation (`statistics.quantiles`); the
|
|
102
|
+
previous nearest-rank-via-`round()` biased small-sample medians low.
|
|
103
|
+
- Test suite no longer reads or writes the developer's real
|
|
104
|
+
`~/.config/qualys-cli/` (config, cache, install-id are isolated per-test;
|
|
105
|
+
a canary test guards the invariant).
|
|
106
|
+
|
|
107
|
+
## [0.1.9] — 2026-08-12
|
|
108
|
+
|
|
109
|
+
### Changed
|
|
110
|
+
- Version bump for PyPI release. No functional changes relative to 0.1.8.
|
|
111
|
+
|
|
9
112
|
## [0.1.8] — 2026-07-21
|
|
10
113
|
|
|
11
114
|
### Added
|
|
@@ -247,7 +350,10 @@ Initial public release.
|
|
|
247
350
|
- Ruff lint clean (E, F, I, UP, B, C4, SIM rule sets).
|
|
248
351
|
- Codegen pipeline (`scripts/`) is opt-in via the `codegen` extra.
|
|
249
352
|
|
|
250
|
-
[Unreleased]: https://github.com/qualys/qualys-cli/compare/v0.1.
|
|
353
|
+
[Unreleased]: https://github.com/qualys/qualys-cli/compare/v0.1.9...HEAD
|
|
354
|
+
[0.1.9]: https://github.com/qualys/qualys-cli/compare/v0.1.8...v0.1.9
|
|
355
|
+
[0.1.8]: https://github.com/qualys/qualys-cli/compare/v0.1.7...v0.1.8
|
|
356
|
+
[0.1.7]: https://github.com/qualys/qualys-cli/compare/v0.1.6...v0.1.7
|
|
251
357
|
[0.1.6]: https://github.com/qualys/qualys-cli/compare/v0.1.5...v0.1.6
|
|
252
358
|
[0.1.5]: https://github.com/qualys/qualys-cli/compare/v0.1.4...v0.1.5
|
|
253
359
|
[0.1.4]: https://github.com/qualys/qualys-cli/compare/v0.1.2...v0.1.4
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: qualys-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: Unified command-line interface for the Qualys Cloud Platform REST APIs (VM, PC, PM, ETM, WAS, TotalCloud, Cloud Agent, Container Security, CSAM, Subscription, Asset, and User management).
|
|
5
5
|
Project-URL: Homepage, https://www.qualys.com
|
|
6
6
|
Author-email: Qualys <support@qualys.com>
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "qualys-cli"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.2.0"
|
|
8
8
|
description = "Unified command-line interface for the Qualys Cloud Platform REST APIs (VM, PC, PM, ETM, WAS, TotalCloud, Cloud Agent, Container Security, CSAM, Subscription, Asset, and User management)."
|
|
9
9
|
readme = { file = "README.md", content-type = "text/markdown" }
|
|
10
10
|
license = { file = "LICENSE" }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.2.0"
|