From d701d1c0e31ce891fb6acfa3fdf5ff213d9afbea Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Sun, 19 Apr 2026 18:57:43 +0800 Subject: [PATCH] feat: add `-post-up` and `-post-down` flags for cmdline --- common/cmd/cmd.go | 17 +++++++++++++++++ main.go | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/common/cmd/cmd.go b/common/cmd/cmd.go index e015dd2e..17f4b2ef 100644 --- a/common/cmd/cmd.go +++ b/common/cmd/cmd.go @@ -3,6 +3,7 @@ package cmd import ( "fmt" "os/exec" + "runtime" "strings" ) @@ -34,3 +35,19 @@ func splitArgs(cmd string) []string { } return args } + +func ExecShell(shellStr string) (string, error) { + var cmd *exec.Cmd + if runtime.GOOS == "windows" { + cmd = exec.Command("cmd.exe", "/C", shellStr) + } else { + cmd = exec.Command("sh", "-c", shellStr) + } + + prepareBackgroundCommand(cmd) + out, err := cmd.CombinedOutput() + if err != nil { + return "", fmt.Errorf("%v, %s", err, string(out)) + } + return string(out), nil +} diff --git a/main.go b/main.go index 6f21e811..a9ada2b9 100644 --- a/main.go +++ b/main.go @@ -14,6 +14,7 @@ import ( "strings" "syscall" + "github.com/metacubex/mihomo/common/cmd" "github.com/metacubex/mihomo/component/generator" "github.com/metacubex/mihomo/component/geodata" "github.com/metacubex/mihomo/component/updater" @@ -41,6 +42,8 @@ var ( externalControllerUnix string externalControllerPipe string secret string + postUp string + postDown string ) func init() { @@ -52,6 +55,8 @@ func init() { flag.StringVar(&externalControllerUnix, "ext-ctl-unix", os.Getenv("CLASH_OVERRIDE_EXTERNAL_CONTROLLER_UNIX"), "override external controller unix address") flag.StringVar(&externalControllerPipe, "ext-ctl-pipe", os.Getenv("CLASH_OVERRIDE_EXTERNAL_CONTROLLER_PIPE"), "override external controller pipe address") flag.StringVar(&secret, "secret", os.Getenv("CLASH_OVERRIDE_SECRET"), "override secret for RESTful API") + flag.StringVar(&postUp, "post-up", os.Getenv("CLASH_POST_UP"), "set post-up script") + flag.StringVar(&postDown, "post-down", os.Getenv("CLASH_POST_DOWN"), "set post-down script") flag.BoolVar(&geodataMode, "m", false, "set geodata mode") flag.BoolVar(&version, "v", false, "show current version of mihomo") flag.BoolVar(&testConfig, "t", false, "test configuration and exit") @@ -184,6 +189,19 @@ func main() { updater.RegisterGeoUpdater() } + if postDown != "" { + defer func() { + if _, err := cmd.ExecShell(postDown); err != nil { + log.Errorln("post-down script error: %s", err.Error()) + } + }() + } + if postUp != "" { + if _, err := cmd.ExecShell(postUp); err != nil { + log.Fatalln("post-up script error: %s", err.Error()) + } + } + defer executor.Shutdown() termSign := make(chan os.Signal, 1)