From b21c82e32d955e15d846aed87535b6d728ab1d0b Mon Sep 17 00:00:00 2001 From: Mathias Hall-Andersen Date: Sat, 15 Jul 2017 13:41:02 +0200 Subject: Conforming to the cross-platform UX The implementation now terminates when the unix socket is deleted. Currently we are unable to use fsnotify (on linux), since it does not notify on the deletion of open files. The implementation can now daemonize (on linux) or be kept in the foreground by providing the necessary flag. --- src/main.go | 73 ++++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 25 deletions(-) (limited to 'src/main.go') diff --git a/src/main.go b/src/main.go index dc27472..74e7ec9 100644 --- a/src/main.go +++ b/src/main.go @@ -1,23 +1,45 @@ package main import ( - "fmt" "log" - "net" "os" "runtime" ) -/* TODO: Fix logging - * TODO: Fix daemon - */ - func main() { - if len(os.Args) != 2 { + // parse arguments + + var foreground bool + var interfaceName string + if len(os.Args) < 2 || len(os.Args) > 3 { + return + } + + switch os.Args[1] { + case "-f", "--foreground": + foreground = true + if len(os.Args) != 3 { + return + } + interfaceName = os.Args[2] + default: + foreground = false + if len(os.Args) != 2 { + return + } + interfaceName = os.Args[1] + } + + // daemonize the process + + if !foreground { + err := Daemonize() + if err != nil { + log.Println("Failed to daemonize:", err) + } return } - deviceName := os.Args[1] // increase number of go workers (for Go <1.5) @@ -25,32 +47,33 @@ func main() { // open TUN device - tun, err := CreateTUN(deviceName) + tun, err := CreateTUN(interfaceName) log.Println(tun, err) if err != nil { return } + // create wireguard device + device := NewDevice(tun, LogLevelDebug) - device.log.Info.Println("Starting device") + + logInfo := device.log.Info + logError := device.log.Error + logInfo.Println("Starting device") // start configuration lister - go func() { - socketPath := fmt.Sprintf("/var/run/wireguard/%s.sock", deviceName) - l, err := net.Listen("unix", socketPath) - if err != nil { - log.Fatal("listen error:", err) - } + uapi, err := NewUAPIListener(interfaceName) + if err != nil { + logError.Fatal("UAPI listen error:", err) + } + defer uapi.Close() - for { - conn, err := l.Accept() - if err != nil { - log.Fatal("accept error:", err) - } - go ipcHandle(device, conn) + for { + conn, err := uapi.Accept() + if err != nil { + logError.Fatal("accept error:", err) } - }() - - device.Wait() + go ipcHandle(device, conn) + } } -- cgit v1.2.3-59-g8ed1b