From c35a6c00cb4ad57c92f460dc265f711a34454fa0 Mon Sep 17 00:00:00 2001 From: Andrea Tosatto Date: Thu, 21 Jan 2016 21:18:40 +0100 Subject: [PATCH 1/3] Using net.Listen to look for open ports before binding them with Gin Signed-off-by: Andrea Tosatto --- main.go | 73 ++++++++++++++++++++++++++++++++------------------------- 1 file changed, 41 insertions(+), 32 deletions(-) diff --git a/main.go b/main.go index e04ba5477..d7d4f81db 100755 --- a/main.go +++ b/main.go @@ -4,7 +4,9 @@ package main import ( + "errors" "flag" + "net" "os" "os/user" "path/filepath" @@ -75,6 +77,21 @@ func launchSelfLater() { log.Println("Done waiting 2 secs. Now launching...") } +// getBindPort returns the first bindable port in the given range +func getBindPort(minPort, maxPort int) (int, error) { + + for i := minPort; i < maxPort; i++ { + ln, _ := net.Listen("tcp", ":"+strconv.Itoa(i)) + if ln != nil { + ln.Close() + return i, nil + } + } + + return -1, errors.New("Unable to bind any port in the range [" + strconv.Itoa(minPort) + "," + strconv.Itoa(maxPort) + ")") + +} + func main() { flag.Parse() @@ -215,11 +232,18 @@ func main() { socketHandler := wsHandler().ServeHTTP - extraOriginStr := "https://create.arduino.cc, http://create.arduino.cc, https://create-dev.arduino.cc, http://create-dev.arduino.cc, http://create-staging.arduino.cc, https://create-staging.arduino.cc" - - for i := 8990; i < 9001; i++ { - extraOriginStr = extraOriginStr + ", http://localhost:" + strconv.Itoa(i) + ", https://localhost:" + strconv.Itoa(i) + portPlain, err := getBindPort(8990, 9001) + if err != nil { + panic(err) } + portSSL, err := getBindPort(portPlain+1, 9001) + if err != nil { + panic(err) + } + + extraOriginStr := "https://create.arduino.cc, http://create.arduino.cc, https://create-dev.arduino.cc, http://create-dev.arduino.cc, http://create-staging.arduino.cc, https://create-staging.arduino.cc" + extraOriginStr += ", http://localhost:" + strconv.Itoa(portPlain) + ", https://localhost:" + strconv.Itoa(portPlain) + extraOriginStr += ", http://localhost:" + strconv.Itoa(portSSL) + ", https://localhost:" + strconv.Itoa(portSSL) r.Use(cors.Middleware(cors.Config{ Origins: *origins + ", " + extraOriginStr, @@ -247,38 +271,23 @@ func main() { return } - start := 8990 - end := 9000 - i := start - for i < end { - i = i + 1 - portSSL = ":" + strconv.Itoa(i) - if err := r.RunTLS(portSSL, filepath.Join(dest, "cert.pem"), filepath.Join(dest, "key.pem")); err != nil { - log.Printf("Error trying to bind to port: %v, so exiting...", err) - continue - } else { - ip := "0.0.0.0" - log.Print("Starting server and websocket (SSL) on " + ip + "" + port) - break - } + portStr := ":" + strconv.Itoa(portSSL) + if err := r.RunTLS(portStr, filepath.Join(dest, "cert.pem"), filepath.Join(dest, "key.pem")); err != nil { + log.Printf("Error trying to bind to port: %v, so exiting...", err) + } else { + ip := "0.0.0.0" + log.Print("Starting server and websocket (SSL) on " + ip + "" + port) } }() go func() { - start := 8990 - end := 9000 - i := start - for i < end { - i = i + 1 - port = ":" + strconv.Itoa(i) - if err := r.Run(port); err != nil { - log.Printf("Error trying to bind to port: %v, so exiting...", err) - continue - } else { - ip := "0.0.0.0" - log.Print("Starting server and websocket on " + ip + "" + port) - break - } + + portStr := ":" + strconv.Itoa(portPlain) + if err := r.Run(portStr); err != nil { + log.Printf("Error trying to bind to port: %v, so exiting...", err) + } else { + ip := "0.0.0.0" + log.Print("Starting server and websocket on " + ip + "" + port) } }() From cd693efa0c97dd146d631f12fb33fe1567b001f1 Mon Sep 17 00:00:00 2001 From: Andrea Tosatto Date: Fri, 22 Jan 2016 13:38:37 +0100 Subject: [PATCH 2/3] Commenting the way we choose portPlain and portSSL as suggested in the PR#58 Signed-off-by: Andrea Tosatto --- main.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index d7d4f81db..9341f7c92 100755 --- a/main.go +++ b/main.go @@ -16,9 +16,9 @@ import ( "time" log "github.com/Sirupsen/logrus" + "github.com/arduino/arduino-builder/src/github.com/itsjamie/gin-cors" "github.com/carlescere/scheduler" "github.com/gin-gonic/gin" - "github.com/itsjamie/gin-cors" "github.com/kardianos/osext" "github.com/vharitonsky/iniflags" //"github.com/sanbornm/go-selfupdate/selfupdate" #included in update.go to change heavily @@ -236,6 +236,10 @@ func main() { if err != nil { panic(err) } + // All the ports p in the range 8990 <= p <= portPlain + // has already been scanned and results not free. + // Thus we can restrict the search range for portSSL + // to [portPlain+1, 9001). portSSL, err := getBindPort(portPlain+1, 9001) if err != nil { panic(err) From 1beed74c83845572db4127bbe0c378c0a3f99893 Mon Sep 17 00:00:00 2001 From: Andrea Tosatto Date: Fri, 22 Jan 2016 15:58:22 +0100 Subject: [PATCH 3/3] Fixing wrong import path Signed-off-by: Andrea Tosatto --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index 9341f7c92..421fb5c83 100755 --- a/main.go +++ b/main.go @@ -16,7 +16,7 @@ import ( "time" log "github.com/Sirupsen/logrus" - "github.com/arduino/arduino-builder/src/github.com/itsjamie/gin-cors" + "github.com/itsjamie/gin-cors" "github.com/carlescere/scheduler" "github.com/gin-gonic/gin" "github.com/kardianos/osext"