From d96279386a74dfb39c9f6556d97c288237179b06 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Mon, 5 Feb 2024 18:47:26 +0100 Subject: [PATCH] new: move running admin service to core --- .gitignore | 2 + admin_service/cmd/admin_service.syso | Bin 12510 -> 0 bytes cmd.bat | 4 + config/admin_service_cmd_runner.go | 38 +++++++ config/admin_service_cmd_runner_windows.go | 28 +++++ config/admin_service_commander.go | 116 +++++++++++++++++++++ config/config.go | 66 ++++++------ config/debug.go | 2 +- custom/custom.go | 3 +- global/global.go | 12 +-- go.mod | 1 + go.sum | 2 + 12 files changed, 234 insertions(+), 40 deletions(-) delete mode 100644 admin_service/cmd/admin_service.syso create mode 100644 cmd.bat create mode 100644 config/admin_service_cmd_runner.go create mode 100644 config/admin_service_cmd_runner_windows.go create mode 100644 config/admin_service_commander.go diff --git a/.gitignore b/.gitignore index 6daaa60..d75a0a6 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ **/*.log .DS_Store + +**/*.syso \ No newline at end of file diff --git a/admin_service/cmd/admin_service.syso b/admin_service/cmd/admin_service.syso deleted file mode 100644 index 18651d28507c66534772723a692b2588ad72b251..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12510 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 diff --git a/cmd.bat b/cmd.bat new file mode 100644 index 0000000..c1e7b38 --- /dev/null +++ b/cmd.bat @@ -0,0 +1,4 @@ +@echo off +set TAGS=with_gvisor,with_quic,with_wireguard,with_ech,with_utls,with_clash_api,with_grpc +@REM set TAGS=with_dhcp,with_low_memory,with_conntrack +go run --tags %TAGS% ./cmd %* \ No newline at end of file diff --git a/config/admin_service_cmd_runner.go b/config/admin_service_cmd_runner.go new file mode 100644 index 0000000..e22b6f2 --- /dev/null +++ b/config/admin_service_cmd_runner.go @@ -0,0 +1,38 @@ +//go:build !windows + +package config + +import ( + "fmt" + "os" + "os/exec" +) + +func ExecuteCmd(executablePath, args string) (string, error) { + err := execCmdImp([]string{"gksu", executablePath, args}) + if err == nil { + return "Ok", nil + } + err := execCmdImp([]string{"pkexec", executablePath, args}) + if err == nil { + return "Ok", nil + } + err := execCmdImp([]string{"/bin/sh", "-c", "sudo " + executablePath + " " + args}) + if err == nil { + return "Ok", nil + } + return "", err + +} + +func execCmdImp(cmd []string) error { + cmd := exec.Command(cmd[0], cmd[1:]) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + fmt.Printf("Running command: %v", cmd.String()) + if err := cmd.Run(); err != nil { + fmt.Printf("Error: %v\n", err) + return err + } + return nil +} diff --git a/config/admin_service_cmd_runner_windows.go b/config/admin_service_cmd_runner_windows.go new file mode 100644 index 0000000..e01b704 --- /dev/null +++ b/config/admin_service_cmd_runner_windows.go @@ -0,0 +1,28 @@ +//go:build windows + +package config + +import ( + "os" + "syscall" + + "golang.org/x/sys/windows" +) + +func ExecuteCmd(exe string, args string) (string, error) { + verb := "runas" + cwd, _ := os.Getwd() + + verbPtr, _ := syscall.UTF16PtrFromString(verb) + exePtr, _ := syscall.UTF16PtrFromString(exe) + cwdPtr, _ := syscall.UTF16PtrFromString(cwd) + argPtr, _ := syscall.UTF16PtrFromString(args) + + var showCmd int32 = 1 //SW_NORMAL + + err := windows.ShellExecute(0, verbPtr, exePtr, argPtr, cwdPtr, showCmd) + if err != nil { + return "", err + } + return "", nil +} diff --git a/config/admin_service_commander.go b/config/admin_service_commander.go new file mode 100644 index 0000000..f45a3a6 --- /dev/null +++ b/config/admin_service_commander.go @@ -0,0 +1,116 @@ +package config + +import ( + "fmt" + "io" + + "net/http" + "net/url" + "os" + "path/filepath" + "runtime" + + "github.com/sagernet/sing-box/option" + dns "github.com/sagernet/sing-dns" + E "github.com/sagernet/sing/common/exceptions" +) + +const ( + serviceURL = "http://localhost:18020" + startEndpoint = "/start" + stopEndpoint = "/stop" +) + +func isSupportedOS() bool { + return runtime.GOOS == "windows" || runtime.GOOS == "linux" +} +func ActivateTunnelService(opt ConfigOptions) (bool, error) { + if !isSupportedOS() { + return false, E.New("Unsupported OS: " + runtime.GOOS) + } + + go startTunnelRequest(opt, true) + return true, nil +} + +func DeactivateTunnelService() (bool, error) { + if !isSupportedOS() { + return true, nil + } + + go stopTunnelRequest() + return true, nil +} + +func startTunnelRequest(opt ConfigOptions, installService bool) (bool, error) { + params := map[string]interface{}{ + "Ipv6": opt.IPv6Mode == option.DomainStrategy(dns.DomainStrategyUseIPv4), + "ServerPort": opt.InboundOptions.MixedPort, + "StrictRoute": opt.InboundOptions.StrictRoute, + "EndpointIndependentNat": true, + "Stack": opt.InboundOptions.TUNStack, + } + + values := url.Values{} + for key, value := range params { + values.Add(key, fmt.Sprint(value)) + } + + url := fmt.Sprintf("%s%s?%s", serviceURL, startEndpoint, values.Encode()) + fmt.Printf("URL: %s\n", url) + response, err := http.Get(url) + if err != nil { + if installService { + return runTunnelService(opt) + } + return false, err + } + defer response.Body.Close() + body, err := io.ReadAll(response.Body) + fmt.Printf("Response Code: %d %s. Response Body: %s Error:%v\n", response.StatusCode, response.Status, body, err) + if err != nil || response.StatusCode != http.StatusOK { + return false, fmt.Errorf("Unexpected Status Code: %d %s. Response Body: %s error:%v", response.StatusCode, response.Status, body, err) + } + + return true, nil +} + +func stopTunnelRequest() (bool, error) { + response, err := http.Get(serviceURL + stopEndpoint) + if err != nil { + return false, fmt.Errorf("HTTP Request Error: %v", err) + } + defer response.Body.Close() + + body, err := io.ReadAll(response.Body) + fmt.Printf("Response Code: %d %s. Response Body: %s Error:%v\n", response.StatusCode, response.Status, body, err) + if err != nil || response.StatusCode != http.StatusOK { + return false, fmt.Errorf("Unexpected Status Code: %d %s. Response Body: %s error:%v", response.StatusCode, response.Status, body, err) + } + + return true, nil +} + +func runTunnelService(opt ConfigOptions) (bool, error) { + executablePath := getTunnelServicePath() + + out, err := ExecuteCmd(executablePath, "install") + fmt.Println("Shell command executed:", out, err) + return startTunnelRequest(opt, false) +} + +func getTunnelServicePath() string { + var fullPath string + binFolder := filepath.Dir(os.Args[0]) + + switch runtime.GOOS { + case "windows": + fullPath = "HiddifyService.exe" + case "darwin": + fallthrough + default: + fullPath = "HiddifyService" + } + + return filepath.Join(binFolder, fullPath) +} diff --git a/config/config.go b/config/config.go index f4804d4..95f16c7 100644 --- a/config/config.go +++ b/config/config.go @@ -135,40 +135,42 @@ func BuildConfig(opt ConfigOptions, input option.Options) (*option.Options, erro } if opt.EnableTun { - tunInbound := option.Inbound{ - Type: C.TypeTun, - Tag: InboundTUNTag, - TunOptions: option.TunInboundOptions{ - Stack: opt.TUNStack, - MTU: opt.MTU, - AutoRoute: true, - StrictRoute: opt.StrictRoute, - EndpointIndependentNat: true, - InboundOptions: option.InboundOptions{ - SniffEnabled: true, - SniffOverrideDestination: true, - DomainStrategy: inboundDomainStrategy, + if ok, _ := ActivateTunnelService(opt); !ok { + tunInbound := option.Inbound{ + Type: C.TypeTun, + Tag: InboundTUNTag, + TunOptions: option.TunInboundOptions{ + Stack: opt.TUNStack, + MTU: opt.MTU, + AutoRoute: true, + StrictRoute: opt.StrictRoute, + EndpointIndependentNat: true, + InboundOptions: option.InboundOptions{ + SniffEnabled: true, + SniffOverrideDestination: true, + DomainStrategy: inboundDomainStrategy, + }, }, - }, + } + switch opt.IPv6Mode { + case option.DomainStrategy(dns.DomainStrategyUseIPv4): + tunInbound.TunOptions.Inet4Address = []netip.Prefix{ + netip.MustParsePrefix("172.19.0.1/28"), + } + case option.DomainStrategy(dns.DomainStrategyUseIPv6): + tunInbound.TunOptions.Inet6Address = []netip.Prefix{ + netip.MustParsePrefix("fdfe:dcba:9876::1/126"), + } + default: + tunInbound.TunOptions.Inet4Address = []netip.Prefix{ + netip.MustParsePrefix("172.19.0.1/28"), + } + tunInbound.TunOptions.Inet6Address = []netip.Prefix{ + netip.MustParsePrefix("fdfe:dcba:9876::1/126"), + } + } + options.Inbounds = append(options.Inbounds, tunInbound) } - switch opt.IPv6Mode { - case option.DomainStrategy(dns.DomainStrategyUseIPv4): - tunInbound.TunOptions.Inet4Address = []netip.Prefix{ - netip.MustParsePrefix("172.19.0.1/28"), - } - case option.DomainStrategy(dns.DomainStrategyUseIPv6): - tunInbound.TunOptions.Inet6Address = []netip.Prefix{ - netip.MustParsePrefix("fdfe:dcba:9876::1/126"), - } - default: - tunInbound.TunOptions.Inet4Address = []netip.Prefix{ - netip.MustParsePrefix("172.19.0.1/28"), - } - tunInbound.TunOptions.Inet6Address = []netip.Prefix{ - netip.MustParsePrefix("fdfe:dcba:9876::1/126"), - } - } - options.Inbounds = append(options.Inbounds, tunInbound) } options.Inbounds = append( diff --git a/config/debug.go b/config/debug.go index 71713e4..fab5a9e 100644 --- a/config/debug.go +++ b/config/debug.go @@ -16,7 +16,7 @@ func SaveCurrentConfig(path string, options option.Options) error { if err != nil { return err } - p, err := filepath.Abs(filepath.Join(path, "current-config.json")) + p, err := filepath.Abs(path) fmt.Printf("Saving config to %v %+v\n", p, err) if err != nil { return err diff --git a/custom/custom.go b/custom/custom.go index f1dc683..d7b732f 100644 --- a/custom/custom.go +++ b/custom/custom.go @@ -156,7 +156,7 @@ func startService(delayStart bool) error { return fmt.Errorf("error building config: %w", err) } - config.SaveCurrentConfig(sWorkingPath, *patchedOptions) + config.SaveCurrentConfig(filepath.Join(sWorkingPath, "current-config.json"), *patchedOptions) err = startCommandServer(*logFactory) if err != nil { @@ -188,6 +188,7 @@ func stop() (CErr *C.char) { defer config.DeferPanicToError("stop", func(err error) { CErr = C.CString(err.Error()) }) + config.DeactivateTunnelService() if status != Started { return C.CString("") diff --git a/global/global.go b/global/global.go index 907d35d..49e2f48 100644 --- a/global/global.go +++ b/global/global.go @@ -122,7 +122,7 @@ func startService(delayStart bool) error { return fmt.Errorf("error building config: %w", err) } - config.SaveCurrentConfig(sWorkingPath, *patchedOptions) + config.SaveCurrentConfig(filepath.Join(sWorkingPath, "tunnel-current-config.json"), *patchedOptions) err = startCommandServer(*logFactory) if err != nil { @@ -248,11 +248,11 @@ func StartServiceC(delayStart bool, content string) error { // options = *patchedOptions - err = config.SaveCurrentConfig(sWorkingPath, options) - if err != nil { - fmt.Printf("Error in saving config: %v\n", err) - return err - } + // config.SaveCurrentConfig(filepath.Join(sWorkingPath, "custom-current-config.json"), options) + // if err != nil { + // fmt.Printf("Error in saving config: %v\n", err) + // return err + // } // err = startCommandServer(*logFactory) // if err != nil { diff --git a/go.mod b/go.mod index 28d4c97..b369729 100644 --- a/go.mod +++ b/go.mod @@ -18,6 +18,7 @@ require ( require ( berty.tech/go-libtor v1.0.385 // indirect github.com/ajg/form v1.5.1 // indirect + github.com/akavel/rsrc v0.10.2 // indirect github.com/andybalholm/brotli v1.0.6 // indirect github.com/caddyserver/certmagic v0.20.0 // indirect github.com/cloudflare/circl v1.3.7 // indirect diff --git a/go.sum b/go.sum index facdbeb..21110f9 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,8 @@ berty.tech/go-libtor v1.0.385 h1:RWK94C3hZj6Z2GdvePpHJLnWYobFr3bY/OdUJ5aoEXw= berty.tech/go-libtor v1.0.385/go.mod h1:9swOOQVb+kmvuAlsgWUK/4c52pm69AdbJsxLzk+fJEw= github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/akavel/rsrc v0.10.2 h1:Zxm8V5eI1hW4gGaYsJQUhxpjkENuG91ki8B4zCrvEsw= +github.com/akavel/rsrc v0.10.2/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/caddyserver/certmagic v0.20.0 h1:bTw7LcEZAh9ucYCRXyCpIrSAGplplI0vGYJ4BpCQ/Fc=