package main import ( "errors" "flag" "log" "log/syslog" "os" "os/signal" "path" "syscall" "tunnel/pkg/config" "tunnel/pkg/server" ) var ( debugFlag = flag.Bool("d", false, "debug: print time and source info") syslogFlag = flag.Bool("s", false, "log output to syslog instead of stdout") ) func initLog() { var logFlags int if *debugFlag { logFlags |= log.Ldate | log.Ltime | log.Lshortfile } log.SetFlags(logFlags) if *syslogFlag { sysLog, err := syslog.New(syslog.LOG_INFO, "tunneld") if err != nil { log.Fatal(err) } log.SetOutput(sysLog) } } func sighandler(c chan os.Signal, s *server.Server) { var try bool for sig := range c { if try { log.Fatal("force exit") } log.Printf("catch signal: %s", sig) try = true s.Stop() } } func getSocketPath() string { s, err := config.GetSocketPath() if err != nil { log.Fatal(err) } if err := os.Mkdir(path.Dir(s), 0700); err != nil { if !errors.Is(err, syscall.EEXIST) { log.Fatal(err) } } return s } func main() { flag.Parse() initLog() s, err := server.New(getSocketPath()) if err != nil { log.Fatal(err) } var c = make(chan os.Signal) signal.Notify(c, syscall.SIGINT, syscall.SIGTERM) go sighandler(c, s) log.Print("ready") s.Run() log.Print("exit") }