proxyctl 0.5.13__tar.gz → 0.5.14__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.
- {proxyctl-0.5.13 → proxyctl-0.5.14}/PKG-INFO +4 -2
- {proxyctl-0.5.13 → proxyctl-0.5.14}/README.md +2 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/man/proxyctl.1 +3 -1
- {proxyctl-0.5.13 → proxyctl-0.5.14}/pyproject.toml +1 -1
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/cli.py +52 -3
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/explain.py +6 -2
- {proxyctl-0.5.13 → proxyctl-0.5.14}/.gitignore +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/LICENSE +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/__init__.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/_io.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/audit.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/autostart.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/builtin_plugins/__init__.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/builtin_plugins/connectivity_basic.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/builtin_plugins/corp_network.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/check.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/completion.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/connections.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/connections_filters.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/connections_human.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/core/__init__.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/core/plugin.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/engine/__init__.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/engine/base.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/engine/mihomo.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/engine/singbox.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/status.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/subscription.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/suggest.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/suggest_rules.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/trace.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/traffic.py +0 -0
- {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/traffic_store.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: proxyctl
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.14
|
|
4
4
|
Summary: Proxy configuration lifecycle management for macOS and Linux
|
|
5
5
|
Project-URL: Homepage, https://github.com/crhan/proxyctl
|
|
6
6
|
Project-URL: Issues, https://github.com/crhan/proxyctl/issues
|
|
@@ -279,6 +279,8 @@ proxy_port: 7890 # 自 0.1.4 起可配
|
|
|
279
279
|
no_proxy_extra: # 自 0.1.5 起追加 NO_PROXY
|
|
280
280
|
- "*.internal.example.com"
|
|
281
281
|
- 10.0.0.0/8
|
|
282
|
+
proxy_env_extra: # 自 0.5.14 起:额外导出为代理地址的变量名
|
|
283
|
+
- PI_PROXY_ANTHROPIC # omp 的 Anthropic 请求只读它,不读 HTTPS_PROXY
|
|
282
284
|
```
|
|
283
285
|
|
|
284
286
|
完整字段见 [config.yaml.example](config.yaml.example)。
|
|
@@ -250,6 +250,8 @@ proxy_port: 7890 # 自 0.1.4 起可配
|
|
|
250
250
|
no_proxy_extra: # 自 0.1.5 起追加 NO_PROXY
|
|
251
251
|
- "*.internal.example.com"
|
|
252
252
|
- 10.0.0.0/8
|
|
253
|
+
proxy_env_extra: # 自 0.5.14 起:额外导出为代理地址的变量名
|
|
254
|
+
- PI_PROXY_ANTHROPIC # omp 的 Anthropic 请求只读它,不读 HTTPS_PROXY
|
|
253
255
|
```
|
|
254
256
|
|
|
255
257
|
完整字段见 [config.yaml.example](config.yaml.example)。
|
|
@@ -186,6 +186,8 @@ rulePayload / host / IP 聚合目的地,输出 app_contexts / candidate_contex
|
|
|
186
186
|
.TP
|
|
187
187
|
.B proxyctl env [--unset]
|
|
188
188
|
输出 / 清除 HTTP_PROXY / HTTPS_PROXY / NO_PROXY 环境变量(可 \fIeval\fR)。
|
|
189
|
+
配置 \fBproxy_env_extra\fR 列出的变量名(如 omp 的 \fBPI_PROXY_ANTHROPIC\fR)
|
|
190
|
+
一并导出为同一 HTTP 代理地址、一并清除。
|
|
189
191
|
.TP
|
|
190
192
|
.B proxyctl log [--tail \fIN\fR] [--no-follow] [--json]
|
|
191
193
|
查看后端日志。默认 \fItail -f\fR;\fB--json\fR 为 NDJSON(首行 meta header + 数据行)。
|
|
@@ -271,7 +273,7 @@ DEPENDENCY_MISSING — 依赖二进制 / 脚本缺失
|
|
|
271
273
|
.SH FILES
|
|
272
274
|
.TP
|
|
273
275
|
.I ~/.config/proxyctl/config.yaml
|
|
274
|
-
proxyctl 自身配置(API token / 端口 / 企业 DNS / extra_daemons / no_proxy_extra / plugins_disabled)。
|
|
276
|
+
proxyctl 自身配置(API token / 端口 / 企业 DNS / extra_daemons / no_proxy_extra / proxy_env_extra / plugins_disabled)。
|
|
275
277
|
.TP
|
|
276
278
|
.I ~/.config/mihomo/config.yaml
|
|
277
279
|
mihomo 引擎配置(rules / proxies / proxy-providers / dns / tun)。
|
|
@@ -55,6 +55,9 @@ DEFAULTS = {
|
|
|
55
55
|
# 个人附加的 NO_PROXY 项(追加到默认 localhost/私网集合之后)
|
|
56
56
|
# 例: ["corp.example.com", "intranet.local"] 或 "corp.example.com,intranet.local"
|
|
57
57
|
"no_proxy_extra": [],
|
|
58
|
+
# 额外导出为代理地址的环境变量名:`proxyctl env` 一并 export,`env --unset` 一并 unset。
|
|
59
|
+
# 给不读 HTTP(S)_PROXY、只认自家变量的工具,例: ["PI_PROXY_ANTHROPIC"](omp)
|
|
60
|
+
"proxy_env_extra": [],
|
|
58
61
|
}
|
|
59
62
|
|
|
60
63
|
SCRIPTS_DIR = os.path.dirname(os.path.realpath(__file__))
|
|
@@ -1352,6 +1355,48 @@ def _normalize_no_proxy_extra(extra) -> list[str]:
|
|
|
1352
1355
|
return out
|
|
1353
1356
|
|
|
1354
1357
|
|
|
1358
|
+
_ENV_PROXY_VARS = ("http_proxy", "https_proxy", "all_proxy",
|
|
1359
|
+
"HTTP_PROXY", "HTTPS_PROXY", "ALL_PROXY",
|
|
1360
|
+
"no_proxy", "NO_PROXY")
|
|
1361
|
+
_ENV_VAR_NAME_RE = re.compile(r"[A-Za-z_][A-Za-z0-9_]*")
|
|
1362
|
+
|
|
1363
|
+
|
|
1364
|
+
def _normalize_proxy_env_extra(extra) -> list[str]:
|
|
1365
|
+
"""proxy_env_extra → 可安全 eval 的变量名列表(去重、保序)。
|
|
1366
|
+
|
|
1367
|
+
`proxyctl env` 的输出会被 eval:非法变量名一律跳过并在 stderr 提示;
|
|
1368
|
+
与内置代理变量同名的项跳过(内置那组已导出,不能被改写成 HTTP 地址)。
|
|
1369
|
+
YAML 会把 yes / no / on / off / true / false / null 解析成 bool / None,
|
|
1370
|
+
非字符串项同样跳过并提示,不能被 str() 成 True / None 再导出。
|
|
1371
|
+
"""
|
|
1372
|
+
def warn(msg: str) -> None:
|
|
1373
|
+
print(f"{YELLOW}警告:proxy_env_extra {msg}{NC}", file=sys.stderr)
|
|
1374
|
+
|
|
1375
|
+
if not extra:
|
|
1376
|
+
return []
|
|
1377
|
+
if isinstance(extra, str):
|
|
1378
|
+
items = extra.split(",")
|
|
1379
|
+
elif isinstance(extra, (list, tuple)):
|
|
1380
|
+
items = extra
|
|
1381
|
+
else:
|
|
1382
|
+
warn(f"应为列表或逗号分隔字符串,已忽略:{extra!r}")
|
|
1383
|
+
return []
|
|
1384
|
+
out: list[str] = []
|
|
1385
|
+
for item in items:
|
|
1386
|
+
if not isinstance(item, str):
|
|
1387
|
+
warn(f"跳过非字符串项 {item!r}(YAML 会把 yes/no/on/off/true/false/null "
|
|
1388
|
+
"解析成布尔或空值,这类变量名请加引号)")
|
|
1389
|
+
continue
|
|
1390
|
+
name = item.strip()
|
|
1391
|
+
if not name or name in out or name in _ENV_PROXY_VARS:
|
|
1392
|
+
continue
|
|
1393
|
+
if not _ENV_VAR_NAME_RE.fullmatch(name):
|
|
1394
|
+
warn(f"跳过非法变量名 {name!r}")
|
|
1395
|
+
continue
|
|
1396
|
+
out.append(name)
|
|
1397
|
+
return out
|
|
1398
|
+
|
|
1399
|
+
|
|
1355
1400
|
def cmd_env(config: dict, unset: bool = False):
|
|
1356
1401
|
"""输出设置/清除代理环境变量的 shell 语句。
|
|
1357
1402
|
|
|
@@ -1359,14 +1404,16 @@ def cmd_env(config: dict, unset: bool = False):
|
|
|
1359
1404
|
eval $(proxyctl env) # 设置代理
|
|
1360
1405
|
eval $(proxyctl env --unset) # 清除代理
|
|
1361
1406
|
|
|
1407
|
+
config.proxy_env_extra 列出的变量名一并 export 为 HTTP 代理地址、一并 unset,
|
|
1408
|
+
给不读 HTTP(S)_PROXY、只认自家变量的工具用(如 omp 的 PI_PROXY_ANTHROPIC)。
|
|
1409
|
+
|
|
1362
1410
|
Args:
|
|
1363
1411
|
config: 全局配置字典
|
|
1364
1412
|
unset: True 则输出 unset 语句
|
|
1365
1413
|
"""
|
|
1414
|
+
extra_vars = _normalize_proxy_env_extra(config.get("proxy_env_extra"))
|
|
1366
1415
|
if unset:
|
|
1367
|
-
for var in
|
|
1368
|
-
"HTTP_PROXY", "HTTPS_PROXY", "ALL_PROXY",
|
|
1369
|
-
"no_proxy", "NO_PROXY"):
|
|
1416
|
+
for var in _ENV_PROXY_VARS + tuple(extra_vars):
|
|
1370
1417
|
print(f"unset {var};")
|
|
1371
1418
|
return
|
|
1372
1419
|
|
|
@@ -1387,6 +1434,8 @@ def cmd_env(config: dict, unset: bool = False):
|
|
|
1387
1434
|
print(f"export {var}={proxy_socks};")
|
|
1388
1435
|
for var in ("no_proxy", "NO_PROXY"):
|
|
1389
1436
|
print(f"export {var}={no_proxy};")
|
|
1437
|
+
for var in extra_vars:
|
|
1438
|
+
print(f"export {var}={proxy_http};")
|
|
1390
1439
|
|
|
1391
1440
|
|
|
1392
1441
|
# ── 命令:log ─────────────────────────────────────────────────────────────────
|
|
@@ -215,11 +215,15 @@ def _t_env(backend, config) -> TopicCard:
|
|
|
215
215
|
"summary": (
|
|
216
216
|
"代理环境变量(HTTP_PROXY / HTTPS_PROXY / NO_PROXY 等)。"
|
|
217
217
|
f"`proxyctl env` 输出 export 行,可 eval 进当前 shell(端口 {port})。"
|
|
218
|
+
"只认自家变量、不读 HTTP(S)_PROXY 的工具(如 omp 的 "
|
|
219
|
+
"PI_PROXY_ANTHROPIC)把变量名加进 proxy_env_extra,随 env 一并导出。"
|
|
218
220
|
),
|
|
219
|
-
"file": _io_proxyctl_config_path() + " [no_proxy_extra
|
|
221
|
+
"file": _io_proxyctl_config_path() + " [no_proxy_extra / proxy_env_extra 字段]",
|
|
220
222
|
"edit": (
|
|
221
223
|
" # no_proxy_extra: 追加内网域名 / IPv4 CIDR / 企业 host\n"
|
|
222
|
-
" # 裸 IPv6 CIDR 会被跳过,避免 Python/httpx 误解析 NO_PROXY"
|
|
224
|
+
" # 裸 IPv6 CIDR 会被跳过,避免 Python/httpx 误解析 NO_PROXY\n"
|
|
225
|
+
" # proxy_env_extra: 额外导出为代理地址的变量名,例 [PI_PROXY_ANTHROPIC]\n"
|
|
226
|
+
" # env --unset 一并清除;非法变量名会被跳过"
|
|
223
227
|
),
|
|
224
228
|
"verify": "eval \"$(proxyctl env)\" && env | grep -i proxy",
|
|
225
229
|
"next_commands": ["env", "env --unset"],
|
|
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
|