plexavo 0.2.2__tar.gz → 0.2.4__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.
- {plexavo-0.2.2 → plexavo-0.2.4}/PKG-INFO +66 -146
- {plexavo-0.2.2 → plexavo-0.2.4}/README.md +65 -145
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/__init__.py +1 -1
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/__main__.py +1 -1
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo.egg-info/PKG-INFO +66 -146
- {plexavo-0.2.2 → plexavo-0.2.4}/pyproject.toml +1 -1
- {plexavo-0.2.2 → plexavo-0.2.4}/tests/test_cli_entrypoint.py +4 -3
- {plexavo-0.2.2 → plexavo-0.2.4}/LICENSE +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/auth.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/aws_profile_setup.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/checks/__init__.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/checks/encryption.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/checks/iam.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/checks/iam_hygiene.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/checks/logging.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/checks/network.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/checks/storage.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/checks/usage.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/cli.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/findings.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/interactive.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/principals.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/report/__init__.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/report/ai_narration.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/report/fonts/DejaVuSans-Bold.ttf +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/report/fonts/DejaVuSans-BoldOblique.ttf +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/report/fonts/DejaVuSans-Oblique.ttf +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/report/fonts/DejaVuSans.ttf +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/report/fonts/GEIST-FONT-LICENSE.txt +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/report/html_report.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/report/pdf.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/report/templates/report.html.j2 +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo/scoring.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo.egg-info/SOURCES.txt +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo.egg-info/dependency_links.txt +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo.egg-info/entry_points.txt +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo.egg-info/requires.txt +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/plexavo.egg-info/top_level.txt +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/setup.cfg +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/tests/test_ai_narration_offline.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/tests/test_auth_offline.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/tests/test_encryption_offline.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/tests/test_iam_hygiene_offline.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/tests/test_iam_offline.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/tests/test_logging_offline.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/tests/test_network_offline.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/tests/test_report_offline.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/tests/test_scoring.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/tests/test_storage_offline.py +0 -0
- {plexavo-0.2.2 → plexavo-0.2.4}/tests/test_usage_offline.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: plexavo
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.4
|
|
4
4
|
Summary: Open-source AWS misconfiguration scanner — runs with your own local AWS credentials, nothing sent to anyone else.
|
|
5
5
|
Author: Kavee
|
|
6
6
|
License: AGPL-3.0-or-later
|
|
@@ -125,187 +125,107 @@ scoped by a Condition block, or a CloudTrail lookup that hit its page cap on
|
|
|
125
125
|
`--report-html`/`--report-pdf` render this same data as a full report; see
|
|
126
126
|
[Cost](#cost) for what `--explain` needs and what it costs.
|
|
127
127
|
|
|
128
|
-
##
|
|
128
|
+
## Install
|
|
129
129
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
130
|
+
Plexavo is a command-line tool. Pick your OS below — every path installs
|
|
131
|
+
it into its own isolated environment, so it never clashes with your other
|
|
132
|
+
Python packages.
|
|
133
133
|
|
|
134
|
-
### macOS & Linux
|
|
134
|
+
### macOS & Linux
|
|
135
135
|
|
|
136
|
-
[uv](https://docs.astral.sh/uv/)
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
**1. Install uv** (if you don't already have it):
|
|
140
|
-
|
|
141
|
-
```bash
|
|
142
|
-
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
(Full options: [uv installation docs](https://docs.astral.sh/uv/getting-started/installation/).)
|
|
146
|
-
|
|
147
|
-
**2. Install Plexavo:**
|
|
136
|
+
[uv](https://docs.astral.sh/uv/) puts a single `plexavo` command on your
|
|
137
|
+
PATH, in every terminal, with nothing to activate:
|
|
148
138
|
|
|
149
139
|
```bash
|
|
140
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh # skip if you have uv
|
|
150
141
|
uv tool install plexavo
|
|
151
142
|
```
|
|
152
143
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
**Have an Anthropic API key and want AI-narrated explanations** (see
|
|
157
|
-
[Cost](#cost) — it's optional and costs a few cents per scan, not
|
|
158
|
-
free)? Install with the `[ai]` extra instead — same package, just with
|
|
159
|
-
the `anthropic` library included:
|
|
160
|
-
|
|
161
|
-
```bash
|
|
162
|
-
uv tool install "plexavo[ai]"
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
No key yet, or not sure? Skip it for now — the plain install is
|
|
166
|
-
genuinely complete on its own. Add it later with:
|
|
167
|
-
|
|
168
|
-
```bash
|
|
169
|
-
uv tool install --reinstall "plexavo[ai]"
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
Just want to try it once without installing anything?
|
|
144
|
+
Update or remove later with `uv tool upgrade plexavo` /
|
|
145
|
+
`uv tool uninstall plexavo`. Prefer [pipx](https://pipx.pypa.io/)?
|
|
146
|
+
`pipx install plexavo` works the same way.
|
|
173
147
|
|
|
174
|
-
|
|
175
|
-
uvx plexavo scan --profile my-aws-profile
|
|
176
|
-
```
|
|
148
|
+
### Windows
|
|
177
149
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
uv tool uninstall plexavo
|
|
183
|
-
```
|
|
150
|
+
`uv` and `pipx` install fine, but the small `plexavo.exe` launcher they
|
|
151
|
+
drop on your PATH is unsigned, and Windows Smart App Control refuses to
|
|
152
|
+
run unsigned executables it doesn't recognise. The way around it is to
|
|
153
|
+
run Plexavo through Python directly. Two ways — both isolated, pick one:
|
|
184
154
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
Install with `pip` and run the tool as `py -m plexavo`:
|
|
155
|
+
#### Option 1 — uv (recommended)
|
|
188
156
|
|
|
189
157
|
```powershell
|
|
190
|
-
|
|
191
|
-
py -m plexavo
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
`py -m plexavo` with no arguments opens the interactive menu, exactly
|
|
195
|
-
like the `plexavo` command does on macOS/Linux — flags are only for
|
|
196
|
-
scripting/CI.
|
|
197
|
-
|
|
198
|
-
> **Why not uv/pipx on Windows?** Both work by putting a small generated
|
|
199
|
-
> `plexavo.exe` launcher on your PATH. That launcher is unsigned, and
|
|
200
|
-
> Windows Smart App Control blocks unsigned executables it doesn't
|
|
201
|
-
> recognise — so `plexavo` can fail to start with a "can't confirm who
|
|
202
|
-
> published" message. `py -m plexavo` calls Python directly and never
|
|
203
|
-
> touches that launcher, so it always works. (If your machine doesn't
|
|
204
|
-
> enforce Smart App Control, `uv tool install plexavo` works here too.)
|
|
158
|
+
uv tool install plexavo
|
|
205
159
|
|
|
206
|
-
|
|
160
|
+
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
|
|
207
161
|
|
|
208
|
-
|
|
209
|
-
|
|
162
|
+
if (!(Test-Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force }
|
|
163
|
+
Add-Content $PROFILE 'function plexavo { & "$env:APPDATA\uv\tools\plexavo\Scripts\python.exe" -m plexavo @args }'
|
|
210
164
|
```
|
|
211
165
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
```powershell
|
|
215
|
-
py -m pip install --user --upgrade plexavo
|
|
216
|
-
py -m pip uninstall plexavo
|
|
217
|
-
```
|
|
166
|
+
Open a new terminal and `plexavo` works exactly like it does on
|
|
167
|
+
macOS/Linux.
|
|
218
168
|
|
|
219
|
-
|
|
169
|
+
`uv tool install` still leaves the blocked `plexavo.exe` on your PATH.
|
|
170
|
+
The line you add to your PowerShell profile shadows it with a command
|
|
171
|
+
that calls uv's bundled `python.exe` directly — that Python is signed by
|
|
172
|
+
the Python Software Foundation, so Smart App Control never stops it. You
|
|
173
|
+
add it once; the `Set-ExecutionPolicy` line (also once) is what lets
|
|
174
|
+
PowerShell load your profile at all. Update later with
|
|
175
|
+
`uv tool upgrade plexavo`.
|
|
220
176
|
|
|
221
|
-
|
|
177
|
+
#### Option 2 — virtual environment (no uv)
|
|
222
178
|
|
|
223
179
|
```powershell
|
|
224
|
-
|
|
180
|
+
py -m venv plexavo-venv
|
|
181
|
+
.\plexavo-venv\Scripts\Activate.ps1
|
|
182
|
+
python -m pip install plexavo
|
|
183
|
+
python -m plexavo
|
|
225
184
|
```
|
|
226
185
|
|
|
227
|
-
|
|
228
|
-
|
|
186
|
+
Use `python -m` for everything inside the venv. Creating a venv also
|
|
187
|
+
generates its own `pip.exe` and `plexavo.exe`, and those are exactly the
|
|
188
|
+
unsigned launcher stubs Smart App Control blocks — but the venv's
|
|
189
|
+
`python.exe` is a copy of your real Python with its signature intact, so
|
|
190
|
+
going through it (`python -m pip`, `python -m plexavo`) always works.
|
|
229
191
|
|
|
230
|
-
|
|
192
|
+
Activating the venv (`.\plexavo-venv\Scripts\Activate.ps1`) just points
|
|
193
|
+
`python` at this environment for the current terminal — you re-run it in
|
|
194
|
+
each new terminal, and `deactivate` leaves it. If PowerShell blocks the
|
|
195
|
+
activate script, run `Set-ExecutionPolicy -Scope CurrentUser RemoteSigned`
|
|
196
|
+
once. Update with `python -m pip install --upgrade plexavo` inside the
|
|
197
|
+
activated environment.
|
|
231
198
|
|
|
232
|
-
|
|
233
|
-
plexavo scan --profile my-aws-profile --report-html report.html
|
|
234
|
-
```
|
|
199
|
+
### AI-narrated explanations (optional, any OS)
|
|
235
200
|
|
|
236
|
-
|
|
237
|
-
|
|
201
|
+
Plexavo is complete without this. If you have an Anthropic API key and
|
|
202
|
+
want each finding rewritten as a full narrative (see [Cost](#cost)),
|
|
203
|
+
install `"plexavo[ai]"` in place of `plexavo` in any command above.
|
|
238
204
|
|
|
239
|
-
|
|
240
|
-
same resolution order as the AWS CLI. No AI, no API key, no cost — and
|
|
241
|
-
findings still come with free Next Step / Full Fix Detail guidance
|
|
242
|
-
wherever a template exists (10 common check types); this alone is a
|
|
243
|
-
complete, genuinely useful scan.
|
|
244
|
-
|
|
245
|
-
Want a full AI-written explanation for *every* finding instead (needs
|
|
246
|
-
the `[ai]` install above)?
|
|
247
|
-
|
|
248
|
-
```bash
|
|
249
|
-
export ANTHROPIC_API_KEY="sk-ant-..." # your own key, your own account
|
|
250
|
-
plexavo scan --profile my-aws-profile --explain --report-html report.html --report-pdf report.pdf
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
- Drop `--explain` and findings still get free template remediation where
|
|
254
|
-
available (no API key needed) and raw technical detail otherwise.
|
|
255
|
-
`--explain` replaces that with a live AI narrative for every finding,
|
|
256
|
-
including the templated ones.
|
|
257
|
-
- Drop `--report-html`/`--report-pdf` to just see the console table.
|
|
258
|
-
- `--explain-limit N` (default 25) caps how many findings get a live AI
|
|
259
|
-
call when `--explain` is passed, as a safety rail against unexpectedly
|
|
260
|
-
large real scans — it doesn't limit the free template remediation.
|
|
261
|
-
- No `ANTHROPIC_API_KEY` set, or a call fails for any reason (invalid key,
|
|
262
|
-
rate limit, network issue)? The scan and report are completely
|
|
263
|
-
unaffected — that finding falls back to template/raw detail instead of
|
|
264
|
-
an AI narrative, not an error. See [Cost](#cost).
|
|
265
|
-
|
|
266
|
-
### Alternative: pipx
|
|
267
|
-
|
|
268
|
-
Already use [pipx](https://pipx.pypa.io/) on macOS/Linux? It works exactly
|
|
269
|
-
the same way as uv — its own isolated environment, one global command, no
|
|
270
|
-
venv:
|
|
205
|
+
### From source (for contributing, or trying an unreleased change)
|
|
271
206
|
|
|
272
207
|
```bash
|
|
273
|
-
|
|
274
|
-
|
|
208
|
+
git clone https://github.com/plexavo/plexavo.git
|
|
209
|
+
cd plexavo
|
|
210
|
+
uv pip install -e . # or: pip install -e . (inside a venv)
|
|
275
211
|
```
|
|
276
212
|
|
|
277
|
-
|
|
278
|
-
Windows section above) — if the `plexavo` command is blocked, run
|
|
279
|
-
`py -m plexavo` instead, or use the `pip` install.
|
|
280
|
-
|
|
281
|
-
### Alternative: pip + venv
|
|
213
|
+
## Using Plexavo
|
|
282
214
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
215
|
+
Run it with no arguments and it walks you through everything — choosing an
|
|
216
|
+
AWS profile (or setting a new one up), picking whether you want an HTML or
|
|
217
|
+
PDF report, then running the scan and showing your 0-100 score with every
|
|
218
|
+
finding and its plain-English fix. Nothing to memorise.
|
|
286
219
|
|
|
287
220
|
```bash
|
|
288
|
-
|
|
289
|
-
plexavo
|
|
290
|
-
source plexavo-env/bin/activate # Mac/Linux
|
|
291
|
-
|
|
292
|
-
pip install plexavo
|
|
293
|
-
pip install "plexavo[ai]" # with AI-narrated explanations
|
|
221
|
+
plexavo # macOS/Linux, and Windows Option 1
|
|
222
|
+
python -m plexavo # Windows Option 2 — inside the activated venv
|
|
294
223
|
```
|
|
295
224
|
|
|
296
|
-
|
|
297
|
-
`
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
Control.
|
|
301
|
-
|
|
302
|
-
### From source (for contributing, or trying an unreleased change)
|
|
303
|
-
|
|
304
|
-
```bash
|
|
305
|
-
git clone https://github.com/plexavo/plexavo.git
|
|
306
|
-
cd plexavo
|
|
307
|
-
uv pip install -e . # or: pip install -e . (inside a venv)
|
|
308
|
-
```
|
|
225
|
+
Scripting a scan into CI or a scheduled job? Add `scan` and flags —
|
|
226
|
+
`plexavo scan --help` (or `python -m plexavo scan --help`) covers the
|
|
227
|
+
flag-driven form (`--profile`, `--region`, `--report-html`,
|
|
228
|
+
`--report-pdf`, `--explain`).
|
|
309
229
|
|
|
310
230
|
## Project structure
|
|
311
231
|
|
|
@@ -96,187 +96,107 @@ scoped by a Condition block, or a CloudTrail lookup that hit its page cap on
|
|
|
96
96
|
`--report-html`/`--report-pdf` render this same data as a full report; see
|
|
97
97
|
[Cost](#cost) for what `--explain` needs and what it costs.
|
|
98
98
|
|
|
99
|
-
##
|
|
99
|
+
## Install
|
|
100
100
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
101
|
+
Plexavo is a command-line tool. Pick your OS below — every path installs
|
|
102
|
+
it into its own isolated environment, so it never clashes with your other
|
|
103
|
+
Python packages.
|
|
104
104
|
|
|
105
|
-
### macOS & Linux
|
|
105
|
+
### macOS & Linux
|
|
106
106
|
|
|
107
|
-
[uv](https://docs.astral.sh/uv/)
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
**1. Install uv** (if you don't already have it):
|
|
111
|
-
|
|
112
|
-
```bash
|
|
113
|
-
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
(Full options: [uv installation docs](https://docs.astral.sh/uv/getting-started/installation/).)
|
|
117
|
-
|
|
118
|
-
**2. Install Plexavo:**
|
|
107
|
+
[uv](https://docs.astral.sh/uv/) puts a single `plexavo` command on your
|
|
108
|
+
PATH, in every terminal, with nothing to activate:
|
|
119
109
|
|
|
120
110
|
```bash
|
|
111
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh # skip if you have uv
|
|
121
112
|
uv tool install plexavo
|
|
122
113
|
```
|
|
123
114
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
**Have an Anthropic API key and want AI-narrated explanations** (see
|
|
128
|
-
[Cost](#cost) — it's optional and costs a few cents per scan, not
|
|
129
|
-
free)? Install with the `[ai]` extra instead — same package, just with
|
|
130
|
-
the `anthropic` library included:
|
|
131
|
-
|
|
132
|
-
```bash
|
|
133
|
-
uv tool install "plexavo[ai]"
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
No key yet, or not sure? Skip it for now — the plain install is
|
|
137
|
-
genuinely complete on its own. Add it later with:
|
|
138
|
-
|
|
139
|
-
```bash
|
|
140
|
-
uv tool install --reinstall "plexavo[ai]"
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
Just want to try it once without installing anything?
|
|
115
|
+
Update or remove later with `uv tool upgrade plexavo` /
|
|
116
|
+
`uv tool uninstall plexavo`. Prefer [pipx](https://pipx.pypa.io/)?
|
|
117
|
+
`pipx install plexavo` works the same way.
|
|
144
118
|
|
|
145
|
-
|
|
146
|
-
uvx plexavo scan --profile my-aws-profile
|
|
147
|
-
```
|
|
119
|
+
### Windows
|
|
148
120
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
uv tool uninstall plexavo
|
|
154
|
-
```
|
|
121
|
+
`uv` and `pipx` install fine, but the small `plexavo.exe` launcher they
|
|
122
|
+
drop on your PATH is unsigned, and Windows Smart App Control refuses to
|
|
123
|
+
run unsigned executables it doesn't recognise. The way around it is to
|
|
124
|
+
run Plexavo through Python directly. Two ways — both isolated, pick one:
|
|
155
125
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
Install with `pip` and run the tool as `py -m plexavo`:
|
|
126
|
+
#### Option 1 — uv (recommended)
|
|
159
127
|
|
|
160
128
|
```powershell
|
|
161
|
-
|
|
162
|
-
py -m plexavo
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
`py -m plexavo` with no arguments opens the interactive menu, exactly
|
|
166
|
-
like the `plexavo` command does on macOS/Linux — flags are only for
|
|
167
|
-
scripting/CI.
|
|
168
|
-
|
|
169
|
-
> **Why not uv/pipx on Windows?** Both work by putting a small generated
|
|
170
|
-
> `plexavo.exe` launcher on your PATH. That launcher is unsigned, and
|
|
171
|
-
> Windows Smart App Control blocks unsigned executables it doesn't
|
|
172
|
-
> recognise — so `plexavo` can fail to start with a "can't confirm who
|
|
173
|
-
> published" message. `py -m plexavo` calls Python directly and never
|
|
174
|
-
> touches that launcher, so it always works. (If your machine doesn't
|
|
175
|
-
> enforce Smart App Control, `uv tool install plexavo` works here too.)
|
|
129
|
+
uv tool install plexavo
|
|
176
130
|
|
|
177
|
-
|
|
131
|
+
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
|
|
178
132
|
|
|
179
|
-
|
|
180
|
-
|
|
133
|
+
if (!(Test-Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force }
|
|
134
|
+
Add-Content $PROFILE 'function plexavo { & "$env:APPDATA\uv\tools\plexavo\Scripts\python.exe" -m plexavo @args }'
|
|
181
135
|
```
|
|
182
136
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
```powershell
|
|
186
|
-
py -m pip install --user --upgrade plexavo
|
|
187
|
-
py -m pip uninstall plexavo
|
|
188
|
-
```
|
|
137
|
+
Open a new terminal and `plexavo` works exactly like it does on
|
|
138
|
+
macOS/Linux.
|
|
189
139
|
|
|
190
|
-
|
|
140
|
+
`uv tool install` still leaves the blocked `plexavo.exe` on your PATH.
|
|
141
|
+
The line you add to your PowerShell profile shadows it with a command
|
|
142
|
+
that calls uv's bundled `python.exe` directly — that Python is signed by
|
|
143
|
+
the Python Software Foundation, so Smart App Control never stops it. You
|
|
144
|
+
add it once; the `Set-ExecutionPolicy` line (also once) is what lets
|
|
145
|
+
PowerShell load your profile at all. Update later with
|
|
146
|
+
`uv tool upgrade plexavo`.
|
|
191
147
|
|
|
192
|
-
|
|
148
|
+
#### Option 2 — virtual environment (no uv)
|
|
193
149
|
|
|
194
150
|
```powershell
|
|
195
|
-
|
|
151
|
+
py -m venv plexavo-venv
|
|
152
|
+
.\plexavo-venv\Scripts\Activate.ps1
|
|
153
|
+
python -m pip install plexavo
|
|
154
|
+
python -m plexavo
|
|
196
155
|
```
|
|
197
156
|
|
|
198
|
-
|
|
199
|
-
|
|
157
|
+
Use `python -m` for everything inside the venv. Creating a venv also
|
|
158
|
+
generates its own `pip.exe` and `plexavo.exe`, and those are exactly the
|
|
159
|
+
unsigned launcher stubs Smart App Control blocks — but the venv's
|
|
160
|
+
`python.exe` is a copy of your real Python with its signature intact, so
|
|
161
|
+
going through it (`python -m pip`, `python -m plexavo`) always works.
|
|
200
162
|
|
|
201
|
-
|
|
163
|
+
Activating the venv (`.\plexavo-venv\Scripts\Activate.ps1`) just points
|
|
164
|
+
`python` at this environment for the current terminal — you re-run it in
|
|
165
|
+
each new terminal, and `deactivate` leaves it. If PowerShell blocks the
|
|
166
|
+
activate script, run `Set-ExecutionPolicy -Scope CurrentUser RemoteSigned`
|
|
167
|
+
once. Update with `python -m pip install --upgrade plexavo` inside the
|
|
168
|
+
activated environment.
|
|
202
169
|
|
|
203
|
-
|
|
204
|
-
plexavo scan --profile my-aws-profile --report-html report.html
|
|
205
|
-
```
|
|
170
|
+
### AI-narrated explanations (optional, any OS)
|
|
206
171
|
|
|
207
|
-
|
|
208
|
-
|
|
172
|
+
Plexavo is complete without this. If you have an Anthropic API key and
|
|
173
|
+
want each finding rewritten as a full narrative (see [Cost](#cost)),
|
|
174
|
+
install `"plexavo[ai]"` in place of `plexavo` in any command above.
|
|
209
175
|
|
|
210
|
-
|
|
211
|
-
same resolution order as the AWS CLI. No AI, no API key, no cost — and
|
|
212
|
-
findings still come with free Next Step / Full Fix Detail guidance
|
|
213
|
-
wherever a template exists (10 common check types); this alone is a
|
|
214
|
-
complete, genuinely useful scan.
|
|
215
|
-
|
|
216
|
-
Want a full AI-written explanation for *every* finding instead (needs
|
|
217
|
-
the `[ai]` install above)?
|
|
218
|
-
|
|
219
|
-
```bash
|
|
220
|
-
export ANTHROPIC_API_KEY="sk-ant-..." # your own key, your own account
|
|
221
|
-
plexavo scan --profile my-aws-profile --explain --report-html report.html --report-pdf report.pdf
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
- Drop `--explain` and findings still get free template remediation where
|
|
225
|
-
available (no API key needed) and raw technical detail otherwise.
|
|
226
|
-
`--explain` replaces that with a live AI narrative for every finding,
|
|
227
|
-
including the templated ones.
|
|
228
|
-
- Drop `--report-html`/`--report-pdf` to just see the console table.
|
|
229
|
-
- `--explain-limit N` (default 25) caps how many findings get a live AI
|
|
230
|
-
call when `--explain` is passed, as a safety rail against unexpectedly
|
|
231
|
-
large real scans — it doesn't limit the free template remediation.
|
|
232
|
-
- No `ANTHROPIC_API_KEY` set, or a call fails for any reason (invalid key,
|
|
233
|
-
rate limit, network issue)? The scan and report are completely
|
|
234
|
-
unaffected — that finding falls back to template/raw detail instead of
|
|
235
|
-
an AI narrative, not an error. See [Cost](#cost).
|
|
236
|
-
|
|
237
|
-
### Alternative: pipx
|
|
238
|
-
|
|
239
|
-
Already use [pipx](https://pipx.pypa.io/) on macOS/Linux? It works exactly
|
|
240
|
-
the same way as uv — its own isolated environment, one global command, no
|
|
241
|
-
venv:
|
|
176
|
+
### From source (for contributing, or trying an unreleased change)
|
|
242
177
|
|
|
243
178
|
```bash
|
|
244
|
-
|
|
245
|
-
|
|
179
|
+
git clone https://github.com/plexavo/plexavo.git
|
|
180
|
+
cd plexavo
|
|
181
|
+
uv pip install -e . # or: pip install -e . (inside a venv)
|
|
246
182
|
```
|
|
247
183
|
|
|
248
|
-
|
|
249
|
-
Windows section above) — if the `plexavo` command is blocked, run
|
|
250
|
-
`py -m plexavo` instead, or use the `pip` install.
|
|
251
|
-
|
|
252
|
-
### Alternative: pip + venv
|
|
184
|
+
## Using Plexavo
|
|
253
185
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
186
|
+
Run it with no arguments and it walks you through everything — choosing an
|
|
187
|
+
AWS profile (or setting a new one up), picking whether you want an HTML or
|
|
188
|
+
PDF report, then running the scan and showing your 0-100 score with every
|
|
189
|
+
finding and its plain-English fix. Nothing to memorise.
|
|
257
190
|
|
|
258
191
|
```bash
|
|
259
|
-
|
|
260
|
-
plexavo
|
|
261
|
-
source plexavo-env/bin/activate # Mac/Linux
|
|
262
|
-
|
|
263
|
-
pip install plexavo
|
|
264
|
-
pip install "plexavo[ai]" # with AI-narrated explanations
|
|
192
|
+
plexavo # macOS/Linux, and Windows Option 1
|
|
193
|
+
python -m plexavo # Windows Option 2 — inside the activated venv
|
|
265
194
|
```
|
|
266
195
|
|
|
267
|
-
|
|
268
|
-
`
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
Control.
|
|
272
|
-
|
|
273
|
-
### From source (for contributing, or trying an unreleased change)
|
|
274
|
-
|
|
275
|
-
```bash
|
|
276
|
-
git clone https://github.com/plexavo/plexavo.git
|
|
277
|
-
cd plexavo
|
|
278
|
-
uv pip install -e . # or: pip install -e . (inside a venv)
|
|
279
|
-
```
|
|
196
|
+
Scripting a scan into CI or a scheduled job? Add `scan` and flags —
|
|
197
|
+
`plexavo scan --help` (or `python -m plexavo scan --help`) covers the
|
|
198
|
+
flag-driven form (`--profile`, `--region`, `--report-html`,
|
|
199
|
+
`--report-pdf`, `--explain`).
|
|
280
200
|
|
|
281
201
|
## Project structure
|
|
282
202
|
|
|
@@ -4,7 +4,7 @@ This is the exact same entry point as the installed `plexavo` command, so
|
|
|
4
4
|
running it with no arguments still opens the interactive menu. It exists so
|
|
5
5
|
Windows users can install with plain `pip` and run the tool without going
|
|
6
6
|
through the generated `plexavo.exe` launcher, which Windows Smart App Control
|
|
7
|
-
blocks on some machines (it's unsigned). See the README's
|
|
7
|
+
blocks on some machines (it's unsigned). See the README's Install section.
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
from plexavo.cli import main
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: plexavo
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.4
|
|
4
4
|
Summary: Open-source AWS misconfiguration scanner — runs with your own local AWS credentials, nothing sent to anyone else.
|
|
5
5
|
Author: Kavee
|
|
6
6
|
License: AGPL-3.0-or-later
|
|
@@ -125,187 +125,107 @@ scoped by a Condition block, or a CloudTrail lookup that hit its page cap on
|
|
|
125
125
|
`--report-html`/`--report-pdf` render this same data as a full report; see
|
|
126
126
|
[Cost](#cost) for what `--explain` needs and what it costs.
|
|
127
127
|
|
|
128
|
-
##
|
|
128
|
+
## Install
|
|
129
129
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
130
|
+
Plexavo is a command-line tool. Pick your OS below — every path installs
|
|
131
|
+
it into its own isolated environment, so it never clashes with your other
|
|
132
|
+
Python packages.
|
|
133
133
|
|
|
134
|
-
### macOS & Linux
|
|
134
|
+
### macOS & Linux
|
|
135
135
|
|
|
136
|
-
[uv](https://docs.astral.sh/uv/)
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
**1. Install uv** (if you don't already have it):
|
|
140
|
-
|
|
141
|
-
```bash
|
|
142
|
-
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
(Full options: [uv installation docs](https://docs.astral.sh/uv/getting-started/installation/).)
|
|
146
|
-
|
|
147
|
-
**2. Install Plexavo:**
|
|
136
|
+
[uv](https://docs.astral.sh/uv/) puts a single `plexavo` command on your
|
|
137
|
+
PATH, in every terminal, with nothing to activate:
|
|
148
138
|
|
|
149
139
|
```bash
|
|
140
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh # skip if you have uv
|
|
150
141
|
uv tool install plexavo
|
|
151
142
|
```
|
|
152
143
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
**Have an Anthropic API key and want AI-narrated explanations** (see
|
|
157
|
-
[Cost](#cost) — it's optional and costs a few cents per scan, not
|
|
158
|
-
free)? Install with the `[ai]` extra instead — same package, just with
|
|
159
|
-
the `anthropic` library included:
|
|
160
|
-
|
|
161
|
-
```bash
|
|
162
|
-
uv tool install "plexavo[ai]"
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
No key yet, or not sure? Skip it for now — the plain install is
|
|
166
|
-
genuinely complete on its own. Add it later with:
|
|
167
|
-
|
|
168
|
-
```bash
|
|
169
|
-
uv tool install --reinstall "plexavo[ai]"
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
Just want to try it once without installing anything?
|
|
144
|
+
Update or remove later with `uv tool upgrade plexavo` /
|
|
145
|
+
`uv tool uninstall plexavo`. Prefer [pipx](https://pipx.pypa.io/)?
|
|
146
|
+
`pipx install plexavo` works the same way.
|
|
173
147
|
|
|
174
|
-
|
|
175
|
-
uvx plexavo scan --profile my-aws-profile
|
|
176
|
-
```
|
|
148
|
+
### Windows
|
|
177
149
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
uv tool uninstall plexavo
|
|
183
|
-
```
|
|
150
|
+
`uv` and `pipx` install fine, but the small `plexavo.exe` launcher they
|
|
151
|
+
drop on your PATH is unsigned, and Windows Smart App Control refuses to
|
|
152
|
+
run unsigned executables it doesn't recognise. The way around it is to
|
|
153
|
+
run Plexavo through Python directly. Two ways — both isolated, pick one:
|
|
184
154
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
Install with `pip` and run the tool as `py -m plexavo`:
|
|
155
|
+
#### Option 1 — uv (recommended)
|
|
188
156
|
|
|
189
157
|
```powershell
|
|
190
|
-
|
|
191
|
-
py -m plexavo
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
`py -m plexavo` with no arguments opens the interactive menu, exactly
|
|
195
|
-
like the `plexavo` command does on macOS/Linux — flags are only for
|
|
196
|
-
scripting/CI.
|
|
197
|
-
|
|
198
|
-
> **Why not uv/pipx on Windows?** Both work by putting a small generated
|
|
199
|
-
> `plexavo.exe` launcher on your PATH. That launcher is unsigned, and
|
|
200
|
-
> Windows Smart App Control blocks unsigned executables it doesn't
|
|
201
|
-
> recognise — so `plexavo` can fail to start with a "can't confirm who
|
|
202
|
-
> published" message. `py -m plexavo` calls Python directly and never
|
|
203
|
-
> touches that launcher, so it always works. (If your machine doesn't
|
|
204
|
-
> enforce Smart App Control, `uv tool install plexavo` works here too.)
|
|
158
|
+
uv tool install plexavo
|
|
205
159
|
|
|
206
|
-
|
|
160
|
+
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
|
|
207
161
|
|
|
208
|
-
|
|
209
|
-
|
|
162
|
+
if (!(Test-Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force }
|
|
163
|
+
Add-Content $PROFILE 'function plexavo { & "$env:APPDATA\uv\tools\plexavo\Scripts\python.exe" -m plexavo @args }'
|
|
210
164
|
```
|
|
211
165
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
```powershell
|
|
215
|
-
py -m pip install --user --upgrade plexavo
|
|
216
|
-
py -m pip uninstall plexavo
|
|
217
|
-
```
|
|
166
|
+
Open a new terminal and `plexavo` works exactly like it does on
|
|
167
|
+
macOS/Linux.
|
|
218
168
|
|
|
219
|
-
|
|
169
|
+
`uv tool install` still leaves the blocked `plexavo.exe` on your PATH.
|
|
170
|
+
The line you add to your PowerShell profile shadows it with a command
|
|
171
|
+
that calls uv's bundled `python.exe` directly — that Python is signed by
|
|
172
|
+
the Python Software Foundation, so Smart App Control never stops it. You
|
|
173
|
+
add it once; the `Set-ExecutionPolicy` line (also once) is what lets
|
|
174
|
+
PowerShell load your profile at all. Update later with
|
|
175
|
+
`uv tool upgrade plexavo`.
|
|
220
176
|
|
|
221
|
-
|
|
177
|
+
#### Option 2 — virtual environment (no uv)
|
|
222
178
|
|
|
223
179
|
```powershell
|
|
224
|
-
|
|
180
|
+
py -m venv plexavo-venv
|
|
181
|
+
.\plexavo-venv\Scripts\Activate.ps1
|
|
182
|
+
python -m pip install plexavo
|
|
183
|
+
python -m plexavo
|
|
225
184
|
```
|
|
226
185
|
|
|
227
|
-
|
|
228
|
-
|
|
186
|
+
Use `python -m` for everything inside the venv. Creating a venv also
|
|
187
|
+
generates its own `pip.exe` and `plexavo.exe`, and those are exactly the
|
|
188
|
+
unsigned launcher stubs Smart App Control blocks — but the venv's
|
|
189
|
+
`python.exe` is a copy of your real Python with its signature intact, so
|
|
190
|
+
going through it (`python -m pip`, `python -m plexavo`) always works.
|
|
229
191
|
|
|
230
|
-
|
|
192
|
+
Activating the venv (`.\plexavo-venv\Scripts\Activate.ps1`) just points
|
|
193
|
+
`python` at this environment for the current terminal — you re-run it in
|
|
194
|
+
each new terminal, and `deactivate` leaves it. If PowerShell blocks the
|
|
195
|
+
activate script, run `Set-ExecutionPolicy -Scope CurrentUser RemoteSigned`
|
|
196
|
+
once. Update with `python -m pip install --upgrade plexavo` inside the
|
|
197
|
+
activated environment.
|
|
231
198
|
|
|
232
|
-
|
|
233
|
-
plexavo scan --profile my-aws-profile --report-html report.html
|
|
234
|
-
```
|
|
199
|
+
### AI-narrated explanations (optional, any OS)
|
|
235
200
|
|
|
236
|
-
|
|
237
|
-
|
|
201
|
+
Plexavo is complete without this. If you have an Anthropic API key and
|
|
202
|
+
want each finding rewritten as a full narrative (see [Cost](#cost)),
|
|
203
|
+
install `"plexavo[ai]"` in place of `plexavo` in any command above.
|
|
238
204
|
|
|
239
|
-
|
|
240
|
-
same resolution order as the AWS CLI. No AI, no API key, no cost — and
|
|
241
|
-
findings still come with free Next Step / Full Fix Detail guidance
|
|
242
|
-
wherever a template exists (10 common check types); this alone is a
|
|
243
|
-
complete, genuinely useful scan.
|
|
244
|
-
|
|
245
|
-
Want a full AI-written explanation for *every* finding instead (needs
|
|
246
|
-
the `[ai]` install above)?
|
|
247
|
-
|
|
248
|
-
```bash
|
|
249
|
-
export ANTHROPIC_API_KEY="sk-ant-..." # your own key, your own account
|
|
250
|
-
plexavo scan --profile my-aws-profile --explain --report-html report.html --report-pdf report.pdf
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
- Drop `--explain` and findings still get free template remediation where
|
|
254
|
-
available (no API key needed) and raw technical detail otherwise.
|
|
255
|
-
`--explain` replaces that with a live AI narrative for every finding,
|
|
256
|
-
including the templated ones.
|
|
257
|
-
- Drop `--report-html`/`--report-pdf` to just see the console table.
|
|
258
|
-
- `--explain-limit N` (default 25) caps how many findings get a live AI
|
|
259
|
-
call when `--explain` is passed, as a safety rail against unexpectedly
|
|
260
|
-
large real scans — it doesn't limit the free template remediation.
|
|
261
|
-
- No `ANTHROPIC_API_KEY` set, or a call fails for any reason (invalid key,
|
|
262
|
-
rate limit, network issue)? The scan and report are completely
|
|
263
|
-
unaffected — that finding falls back to template/raw detail instead of
|
|
264
|
-
an AI narrative, not an error. See [Cost](#cost).
|
|
265
|
-
|
|
266
|
-
### Alternative: pipx
|
|
267
|
-
|
|
268
|
-
Already use [pipx](https://pipx.pypa.io/) on macOS/Linux? It works exactly
|
|
269
|
-
the same way as uv — its own isolated environment, one global command, no
|
|
270
|
-
venv:
|
|
205
|
+
### From source (for contributing, or trying an unreleased change)
|
|
271
206
|
|
|
272
207
|
```bash
|
|
273
|
-
|
|
274
|
-
|
|
208
|
+
git clone https://github.com/plexavo/plexavo.git
|
|
209
|
+
cd plexavo
|
|
210
|
+
uv pip install -e . # or: pip install -e . (inside a venv)
|
|
275
211
|
```
|
|
276
212
|
|
|
277
|
-
|
|
278
|
-
Windows section above) — if the `plexavo` command is blocked, run
|
|
279
|
-
`py -m plexavo` instead, or use the `pip` install.
|
|
280
|
-
|
|
281
|
-
### Alternative: pip + venv
|
|
213
|
+
## Using Plexavo
|
|
282
214
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
215
|
+
Run it with no arguments and it walks you through everything — choosing an
|
|
216
|
+
AWS profile (or setting a new one up), picking whether you want an HTML or
|
|
217
|
+
PDF report, then running the scan and showing your 0-100 score with every
|
|
218
|
+
finding and its plain-English fix. Nothing to memorise.
|
|
286
219
|
|
|
287
220
|
```bash
|
|
288
|
-
|
|
289
|
-
plexavo
|
|
290
|
-
source plexavo-env/bin/activate # Mac/Linux
|
|
291
|
-
|
|
292
|
-
pip install plexavo
|
|
293
|
-
pip install "plexavo[ai]" # with AI-narrated explanations
|
|
221
|
+
plexavo # macOS/Linux, and Windows Option 1
|
|
222
|
+
python -m plexavo # Windows Option 2 — inside the activated venv
|
|
294
223
|
```
|
|
295
224
|
|
|
296
|
-
|
|
297
|
-
`
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
Control.
|
|
301
|
-
|
|
302
|
-
### From source (for contributing, or trying an unreleased change)
|
|
303
|
-
|
|
304
|
-
```bash
|
|
305
|
-
git clone https://github.com/plexavo/plexavo.git
|
|
306
|
-
cd plexavo
|
|
307
|
-
uv pip install -e . # or: pip install -e . (inside a venv)
|
|
308
|
-
```
|
|
225
|
+
Scripting a scan into CI or a scheduled job? Add `scan` and flags —
|
|
226
|
+
`plexavo scan --help` (or `python -m plexavo scan --help`) covers the
|
|
227
|
+
flag-driven form (`--profile`, `--region`, `--report-html`,
|
|
228
|
+
`--report-pdf`, `--explain`).
|
|
309
229
|
|
|
310
230
|
## Project structure
|
|
311
231
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "plexavo"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.4"
|
|
8
8
|
description = "Open-source AWS misconfiguration scanner — runs with your own local AWS credentials, nothing sent to anyone else."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "AGPL-3.0-or-later" }
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"""Checks that `python -m plexavo` works and is equivalent to the installed
|
|
2
2
|
`plexavo` command / `python -m plexavo.cli`.
|
|
3
3
|
|
|
4
|
-
This is the Windows install path (README
|
|
5
|
-
via `py -m plexavo` instead of the Smart-App-Control-blocked
|
|
6
|
-
launcher. If the `plexavo/__main__.py` shim regresses, that
|
|
4
|
+
This is the Windows install path (README Install section): the venv option
|
|
5
|
+
runs the tool via `py -m plexavo` instead of the Smart-App-Control-blocked
|
|
6
|
+
`plexavo.exe` launcher. If the `plexavo/__main__.py` shim regresses, that
|
|
7
|
+
path breaks.
|
|
7
8
|
|
|
8
9
|
Run: python test_cli_entrypoint.py
|
|
9
10
|
"""
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|