summaryrefslogtreecommitdiff
path: root/cmd/tunneld
diff options
context:
space:
mode:
authorMikhail Osipov <mike.osipov@gmail.com>2020-03-26 00:29:12 +0300
committerMikhail Osipov <mike.osipov@gmail.com>2020-03-30 01:57:31 +0300
commit3c4432e0f2fb8ddf54a2e441063d584b99572a4e (patch)
treee1e36bed941a7bbb62b23656eeddd154eec0a920 /cmd/tunneld
parent5c846ba3a0e5e323b61339572e7a4f917c1d79d4 (diff)
add tun socket
Diffstat (limited to 'cmd/tunneld')
-rw-r--r--cmd/tunneld/main.go50
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")
}