evo-cli 0.31.0__tar.gz → 0.31.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.
- {evo_cli-0.31.0 → evo_cli-0.31.1}/PKG-INFO +1 -1
- evo_cli-0.31.1/evo_cli/VERSION +1 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/openvpn.py +12 -2
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/openvpn.py +5 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli.egg-info/PKG-INFO +1 -1
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_openvpn.py +44 -0
- evo_cli-0.31.0/evo_cli/VERSION +0 -1
- {evo_cli-0.31.0 → evo_cli-0.31.1}/Containerfile +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/HISTORY.md +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/LICENSE +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/MANIFEST.in +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/README.md +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/__init__.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/__main__.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/base.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/cli.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/__init__.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/agent_toy.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/claude_code.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/cloudflare.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/cred.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/download.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/fix_claude.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/gdrive.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/gh.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/__init__.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/_dag.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/_git.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/_hub.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/_mirror.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/_model.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/_mutate.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/_paths.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/_render.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/_server.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/check.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/clone.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/edit.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/pull.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/serve.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/show.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/views.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/index-Cs7hXRPJ.css +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/index-CuNOlaH7.js +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/index.html +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/hwid.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/hwid_reset.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/image.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/localproxy.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/mcp.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/miniconda.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/netcheck.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/ngrok.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/opencode.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/plantuml.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/route/__init__.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/route/_dns.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/route/_dpi.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/route/_hosts.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/route/_probe.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/route/check.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/route/fix.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/route/probe.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/route/status.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/serp.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/site2s.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/ssh.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/storage.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/sysmon.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/tts.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/update.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/wifi.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/console.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/credentials/__init__.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/credentials/doctor.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/credentials/google_oauth.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/credentials/migrate.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/credentials/oauth_flow.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/credentials/registry.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/credentials/store.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/credentials/sync.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/imaging/__init__.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/imaging/align.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/imaging/core.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/imaging/creds.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/imaging/errors.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/imaging/gemini.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/imaging/ncnn.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/mcp_registry.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/serp/__init__.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/serp/client.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/serp/creds.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/serp/errors.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/serp/install.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/serp/render.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/tts/__init__.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/tts/chunking.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/tts/core.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/tts/creds.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/tts/errors.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/tts/gemini.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/tts/http.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/tts/openai.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/tts/player.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/tts/vbee.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli.egg-info/SOURCES.txt +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli.egg-info/dependency_links.txt +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli.egg-info/entry_points.txt +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli.egg-info/requires.txt +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli.egg-info/top_level.txt +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/pyproject.toml +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/setup.cfg +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/__init__.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/fake_evo_agents.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/fixtures/hub/contract-0.2.0.json +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/fixtures/hub/mirror-demo.yaml +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_agent_toy.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_claude_code.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_cli.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_console.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_cred.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_download.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_fix_claude.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_gdrive.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_gh.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_harness.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_harness_clone.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_harness_dag.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_harness_hub.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_harness_show.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_image.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_mcp.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_ngrok.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_opencode.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_plantuml.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_route.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_serp.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_storage.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_sysmon.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_tts.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_update.py +0 -0
- {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_wifi.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.31.1
|
|
@@ -42,12 +42,22 @@ def _table(rows):
|
|
|
42
42
|
_state_text(state["state"]),
|
|
43
43
|
state.get("vpn_ip", ""),
|
|
44
44
|
(profile.get("remotes") or [""])[0],
|
|
45
|
-
|
|
45
|
+
_creds(profile),
|
|
46
46
|
"yes" if profile.get("totp") else "no",
|
|
47
47
|
)
|
|
48
48
|
return table
|
|
49
49
|
|
|
50
50
|
|
|
51
|
+
def _creds(profile):
|
|
52
|
+
"""CREDS column: a certificate-only profile shows "cert", as it needs no username or password."""
|
|
53
|
+
if profile.get("password"):
|
|
54
|
+
return "yes"
|
|
55
|
+
try:
|
|
56
|
+
return "no" if vpn.uses_credentials(profile.get("config", "")) else "cert"
|
|
57
|
+
except vpn.CredentialError:
|
|
58
|
+
return "no"
|
|
59
|
+
|
|
60
|
+
|
|
51
61
|
def _rows():
|
|
52
62
|
profiles = _guard(vpn.profiles)
|
|
53
63
|
return [(name, profiles[name], _guard(vpn.request, name)) for name in sorted(profiles)]
|
|
@@ -322,7 +332,7 @@ def connect(name, timeout, sudo_password_stdin, watch):
|
|
|
322
332
|
_guard(vpn.validate_config, profile["config"])
|
|
323
333
|
if not shutil.which("openvpn"):
|
|
324
334
|
raise click.ClickException("Install OpenVPN first (macOS: brew install openvpn; Linux: your package manager).")
|
|
325
|
-
if not profile.get("username")
|
|
335
|
+
if _guard(vpn.uses_credentials, profile["config"]) and not (profile.get("username") and profile.get("password")):
|
|
326
336
|
raise click.ClickException("Missing credentials; run evo openvpn credentials PROFILE.")
|
|
327
337
|
if _guard(vpn.request, name)["state"] != "STOPPED":
|
|
328
338
|
raise click.ClickException("This profile already has a worker; use status or disconnect first.")
|
|
@@ -178,6 +178,11 @@ def validate_config(text):
|
|
|
178
178
|
return remotes
|
|
179
179
|
|
|
180
180
|
|
|
181
|
+
def uses_credentials(text):
|
|
182
|
+
"""Whether OpenVPN will ask for a username and password; a certificate-only profile never does."""
|
|
183
|
+
return any(words[0].removeprefix("--") == "auth-user-pass" for _, words in _directives(text))
|
|
184
|
+
|
|
185
|
+
|
|
181
186
|
def takes_default_route(text):
|
|
182
187
|
"""Whether a profile may take the default route. Only split-tunnel profiles can run beside another VPN.
|
|
183
188
|
|
|
@@ -126,6 +126,21 @@ def test_split_tunnel_is_only_what_provably_keeps_the_default_route(extra, full)
|
|
|
126
126
|
assert vpn.takes_default_route(CONFIG + extra) is full
|
|
127
127
|
|
|
128
128
|
|
|
129
|
+
CERT_ONLY = CONFIG.replace("auth-user-pass\n", "")
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
@pytest.mark.parametrize(
|
|
133
|
+
"config,expected",
|
|
134
|
+
[
|
|
135
|
+
(CONFIG, True),
|
|
136
|
+
(CERT_ONLY, False),
|
|
137
|
+
(CERT_ONLY + "<key>\nauth-user-pass\n</key>\n", False),
|
|
138
|
+
],
|
|
139
|
+
)
|
|
140
|
+
def test_only_auth_user_pass_asks_for_credentials(config, expected):
|
|
141
|
+
assert vpn.uses_credentials(config) is expected
|
|
142
|
+
|
|
143
|
+
|
|
129
144
|
@pytest.mark.parametrize(
|
|
130
145
|
"platform,output,gateway",
|
|
131
146
|
[
|
|
@@ -450,6 +465,35 @@ def test_connect_stacks_a_split_tunnel_beside_a_full_one_only(store, monkeypatch
|
|
|
450
465
|
assert "default route" not in result.output and started, result.output
|
|
451
466
|
|
|
452
467
|
|
|
468
|
+
def test_cert_only_profile_connects_and_lists_without_credentials(store, monkeypatch):
|
|
469
|
+
vpn.save_profile("cert", {"config": CERT_ONLY})
|
|
470
|
+
vpn.save_profile("login", {"config": CONFIG})
|
|
471
|
+
monkeypatch.setattr(vpn, "request", lambda name, command="status": {"state": "STOPPED"})
|
|
472
|
+
monkeypatch.setattr("evo_cli.commands.openvpn.shutil.which", lambda _: "/fake/openvpn")
|
|
473
|
+
monkeypatch.setattr("evo_cli.commands.openvpn.os.geteuid", lambda: 0)
|
|
474
|
+
started = []
|
|
475
|
+
|
|
476
|
+
class Exited:
|
|
477
|
+
def __init__(self):
|
|
478
|
+
self.stdin = io.BytesIO()
|
|
479
|
+
|
|
480
|
+
def poll(self):
|
|
481
|
+
return 1
|
|
482
|
+
|
|
483
|
+
monkeypatch.setattr(
|
|
484
|
+
"evo_cli.commands.openvpn.subprocess.Popen", lambda command, **_: started.append(command) or Exited()
|
|
485
|
+
)
|
|
486
|
+
runner = CliRunner()
|
|
487
|
+
result = runner.invoke(cli, ["openvpn", "connect", "login", "--no-watch"])
|
|
488
|
+
assert result.exit_code != 0 and "Missing credentials" in result.output and not started
|
|
489
|
+
result = runner.invoke(cli, ["openvpn", "connect", "cert", "--no-watch"])
|
|
490
|
+
assert "Missing credentials" not in result.output and started, result.output
|
|
491
|
+
rows = {
|
|
492
|
+
line.split()[1]: line.split()[-2] for line in runner.invoke(cli, ["openvpn", "list"]).output.splitlines()[1:3]
|
|
493
|
+
}
|
|
494
|
+
assert rows == {"cert": "cert", "login": "no"}
|
|
495
|
+
|
|
496
|
+
|
|
453
497
|
def test_pick_profile_by_number_single_or_prompt(store, monkeypatch):
|
|
454
498
|
runner = CliRunner()
|
|
455
499
|
totp = vpn.parse_totp(SECRET)
|
evo_cli-0.31.0/evo_cli/VERSION
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
0.31.0
|
|
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
|
|
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
|
|
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
|
|
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
|