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.
Files changed (33) hide show
  1. {proxyctl-0.5.13 → proxyctl-0.5.14}/PKG-INFO +4 -2
  2. {proxyctl-0.5.13 → proxyctl-0.5.14}/README.md +2 -0
  3. {proxyctl-0.5.13 → proxyctl-0.5.14}/man/proxyctl.1 +3 -1
  4. {proxyctl-0.5.13 → proxyctl-0.5.14}/pyproject.toml +1 -1
  5. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/cli.py +52 -3
  6. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/explain.py +6 -2
  7. {proxyctl-0.5.13 → proxyctl-0.5.14}/.gitignore +0 -0
  8. {proxyctl-0.5.13 → proxyctl-0.5.14}/LICENSE +0 -0
  9. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/__init__.py +0 -0
  10. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/_io.py +0 -0
  11. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/audit.py +0 -0
  12. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/autostart.py +0 -0
  13. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/builtin_plugins/__init__.py +0 -0
  14. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/builtin_plugins/connectivity_basic.py +0 -0
  15. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/builtin_plugins/corp_network.py +0 -0
  16. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/check.py +0 -0
  17. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/completion.py +0 -0
  18. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/connections.py +0 -0
  19. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/connections_filters.py +0 -0
  20. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/connections_human.py +0 -0
  21. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/core/__init__.py +0 -0
  22. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/core/plugin.py +0 -0
  23. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/engine/__init__.py +0 -0
  24. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/engine/base.py +0 -0
  25. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/engine/mihomo.py +0 -0
  26. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/engine/singbox.py +0 -0
  27. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/status.py +0 -0
  28. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/subscription.py +0 -0
  29. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/suggest.py +0 -0
  30. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/suggest_rules.py +0 -0
  31. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/trace.py +0 -0
  32. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/traffic.py +0 -0
  33. {proxyctl-0.5.13 → proxyctl-0.5.14}/src/proxyctl/traffic_store.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: proxyctl
3
- Version: 0.5.13
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)。
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "proxyctl"
3
- version = "0.5.13"
3
+ version = "0.5.14"
4
4
  description = "Proxy configuration lifecycle management for macOS and Linux"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -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 ("http_proxy", "https_proxy", "all_proxy",
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