diff options
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/tunneld/main.go | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/cmd/tunneld/main.go b/cmd/tunneld/main.go index b45f516..4ff23ba 100644 --- a/cmd/tunneld/main.go +++ b/cmd/tunneld/main.go @@ -5,9 +5,11 @@ import ( "errors" "flag" "fmt" + "io" "log" "log/syslog" "os" + "os/exec" "os/signal" "os/user" "path" @@ -165,6 +167,42 @@ func updateSocketGroup(s *server.Server, group string) error { return nil } +func runCommand(s *server.Server, name string) error { + cmd := s.Env().Get(name) + if cmd == "" { + return nil + } + + log.Printf("cmd \"%s\" try", cmd) + + args := strings.Split(cmd, " ") + c := exec.Command(args[0], args[1:]...) + + stdout, _ := c.StdoutPipe() + stderr, _ := c.StderrPipe() + + if err := c.Start(); err != nil { + return fmt.Errorf("cmd \"%s\" start failed: %w", cmd, err) + } + + logger := func(s string, r io.Reader) { + for scanner := bufio.NewScanner(r); scanner.Scan(); { + log.Println(s, ">", scanner.Text()) + } + } + + go logger(args[0], stdout) + go logger(args[0], stderr) + + if err := c.Wait(); err != nil { + return fmt.Errorf("cmd \"%s\" failed: %w", cmd, err) + } + + log.Printf("cmd \"%s\" ok", cmd) + + return nil +} + func configure(s *server.Server) error { if err := readConfig(s); err != nil { return err @@ -176,9 +214,17 @@ func configure(s *server.Server) error { } } + if err := runCommand(s, "cmd.init"); err != nil { + return err + } + return nil } +func deconfigure(s *server.Server) error { + return runCommand(s, "cmd.down") +} + func main() { flag.Parse() initLog() @@ -208,5 +254,9 @@ func main() { s.Run() + if err := deconfigure(s); err != nil { + log.Println(err) + } + log.Print("exit") } |
