From 382bd834f62f9e42368b7a816544bb2561d1e222 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Tue, 21 Oct 2025 13:32:22 +0800 Subject: [PATCH] feat: update connect.rs --- connect-rs/src/main.rs | 72 ++++++++++++++++++++++++++++++++++++++---- script-meta-v2.json | 6 ++-- script-meta.json | 4 +-- 3 files changed, 71 insertions(+), 11 deletions(-) diff --git a/connect-rs/src/main.rs b/connect-rs/src/main.rs index bb8d365..5aacf73 100755 --- a/connect-rs/src/main.rs +++ b/connect-rs/src/main.rs @@ -15,7 +15,8 @@ use crypto::digest::Digest; use crypto::sha2::Sha256; use keyring::Entry; use rust_util::{ - XResult, failure, information, opt_result, simple_error, success, util_cmd, util_env, util_file, + failure, iff, information, opt_result, simple_error, success, util_cmd, util_env, util_file, + XResult, }; use serde_json::Value; use std::fs; @@ -24,6 +25,12 @@ use std::process::Command; const PAC_FILE: &str = "__proxy__.pac"; const ENV_CONNECT_PAC_FILE_PATH: &str = "CONNECT_PAC_FILE_PATH"; +const KEYRING_SERVICE: &str = "hatter.ink"; +const KEYRING_USER: &str = "pac_auth_token"; + +const NET_WORK_SETUP: &str = "networksetup"; +const WIFI: &str = "Wi-Fi"; + #[derive(Debug, Parser)] #[command(name = "connect-rs", bin_name = "connect.rs")] #[command(about = "Connect to the world", long_about = None)] @@ -43,6 +50,9 @@ enum Commands { /// Update #[command(short_flag = 'u')] Update, + /// Add domain + #[command(short_flag = 'a')] + AddDomain(CmdAddDomain), } #[derive(Debug, Args)] @@ -52,8 +62,20 @@ pub struct CmdConnect { pub update: bool, } -const NET_WORK_SETUP: &str = "networksetup"; -const WIFI: &str = "Wi-Fi"; +#[derive(Debug, Args)] +pub struct CmdAddDomain { + /// Domains (split by ',') + #[arg(long, short = 'd')] + pub domains: String, + + /// Not GFW + #[arg(long)] + pub not_gfw: bool, + + /// Reconnect + #[arg(long, short = 'r')] + pub reconnect: bool, +} fn main() { let args = ConnectArgs::parse(); @@ -75,6 +97,16 @@ fn main() { Commands::Update => { update_pac_file_ignore_error(); } + Commands::AddDomain(cmd) => match add_pac_digest(&cmd.domains, !cmd.not_gfw) { + Ok(_) => { + success!("Add domain successfully"); + if cmd.reconnect { + turn_proxy_off(); + turn_proxy_on(); + } + } + Err(e) => failure!("Add domain failed: {}", e), + }, } } @@ -117,6 +149,14 @@ fn update_pac_file() -> XResult<()> { Ok(()) } +fn turn_proxy_on() { + run_command( + NET_WORK_SETUP, + &["-setautoproxyurl", WIFI, "http://localhost:8888/pac"], + "setautoproxyurl proxy", + ); +} + fn turn_proxy_off() { run_command( NET_WORK_SETUP, @@ -214,9 +254,29 @@ fn get_pac_digest() -> XResult { } } +fn add_pac_digest(domains: &str, gfw: bool) -> XResult<()> { + let auth_token = get_pac_auth_token()?; + let url = format!( + "https://hatter.ink/pac/add_pac_domain.json?digest=1&__auth_token={}&type={}&domains={}", + auth_token, + iff!(gfw, "gfw", "no_gfw"), + domains + ); + + let pac_digest_response = + opt_result!(reqwest::blocking::get(&url), "Add domain to pac failed: {}"); + if pac_digest_response.status().as_u16() != 200 { + return simple_error!( + "Get pac digest HTTP status error: {}", + pac_digest_response.status().as_u16() + ); + } + Ok(()) +} + fn get_pac_auth_token() -> XResult { let entry = opt_result!( - Entry::new("hatter.ink", "get_pac_auth_token"), + Entry::new(KEYRING_SERVICE, KEYRING_USER), "New entry failed: {}" ); Ok(opt_result!( @@ -225,5 +285,5 @@ fn get_pac_auth_token() -> XResult { )) } -// @SCRIPT-SIGNATURE-V1: yk-r1.ES256.20251019T230159+08:00.MEQCIByk8UrJGAfSk3tNh4cr -// +0M5B6P+72yivwmFvGnWOzv4AiBAjVanUpEEU4hUxpP8I3B/xMEdm26eDe25/7VAaxEmKw== +// @SCRIPT-SIGNATURE-V1: yk-r1.ES256.20251021T133159+08:00.MEQCIFEij7e8qbFLQ2oD7+uw +// mvdUy6nMUPIb/cxG6UDKm2ccAiBHgFSSqZ9DXdwPnn/yZH6vJVyqvricLpTuRApNT9g+yA== diff --git a/script-meta-v2.json b/script-meta-v2.json index c0cc95a..6d0171c 100644 --- a/script-meta-v2.json +++ b/script-meta-v2.json @@ -17,11 +17,11 @@ }, "connect.rs": { "script_name": "connect.rs", - "script_length": 6475, - "script_sha256": "f0cc02ed76cf97974e19fe14873c2af8c0a87f6bcaa85f344110719047991907", + "script_length": 8102, + "script_sha256": "b0263a2056f6e600299a81a43f06d2bf841cf8cf9d533e8342e87a82038adabd", "script_full_url": "https://git.hatter.ink/rust-scripts/scriptbase/raw/branch/main/connect-rs/src/main.rs", "publish_time": 1760367513436, - "update_time": 1760890167503 + "update_time": 1761024735490 }, "current-time.rs": { "script_name": "current-time.rs", diff --git a/script-meta.json b/script-meta.json index 02209ea..715d500 100644 --- a/script-meta.json +++ b/script-meta.json @@ -11,8 +11,8 @@ }, "connect-rs": { "script_name": "connect-rs", - "script_length": 6475, - "script_sha256": "f0cc02ed76cf97974e19fe14873c2af8c0a87f6bcaa85f344110719047991907" + "script_length": 8102, + "script_sha256": "b0263a2056f6e600299a81a43f06d2bf841cf8cf9d533e8342e87a82038adabd" }, "current-time-rs": { "script_name": "current-time-rs",