diff --git a/src/mod/netutils/netutils.go b/src/mod/netutils/netutils.go index 22466f3..46ebcd4 100644 --- a/src/mod/netutils/netutils.go +++ b/src/mod/netutils/netutils.go @@ -157,3 +157,13 @@ func resolveIpFromDomain(targetIpOrDomain string) string { return targetIpAddrString } + +// Check if the given port is already used by another process +func CheckIfPortOccupied(portNumber int) bool { + listener, err := net.Listen("tcp", ":"+strconv.Itoa(portNumber)) + if err != nil { + return true + } + listener.Close() + return false +} diff --git a/src/reverseproxy.go b/src/reverseproxy.go index c55b6db..fb22cf6 100644 --- a/src/reverseproxy.go +++ b/src/reverseproxy.go @@ -14,6 +14,7 @@ import ( "imuslab.com/zoraxy/mod/dynamicproxy/loadbalance" "imuslab.com/zoraxy/mod/dynamicproxy/permissionpolicy" "imuslab.com/zoraxy/mod/dynamicproxy/rewrite" + "imuslab.com/zoraxy/mod/netutils" "imuslab.com/zoraxy/mod/uptime" "imuslab.com/zoraxy/mod/utils" ) @@ -28,10 +29,22 @@ func ReverseProxtInit() { Load Reverse Proxy Global Settings */ inboundPort := 443 + autoStartReverseProxy := true if sysdb.KeyExists("settings", "inbound") { + //Read settings from database sysdb.Read("settings", "inbound", &inboundPort) - SystemWideLogger.Println("Serving inbound port ", inboundPort) + if netutils.CheckIfPortOccupied(inboundPort) { + autoStartReverseProxy = false + SystemWideLogger.Println("Inbound port ", inboundPort, " is occupied. Change the listening port in the webmin panel and press \"Start Service\" to start reverse proxy service") + } else { + SystemWideLogger.Println("Serving inbound port ", inboundPort) + } } else { + //Default port + if netutils.CheckIfPortOccupied(inboundPort) { + inboundPort = 8743 + SystemWideLogger.Println("Port 443 is occupied. Switching to backup port 8743 instead") + } SystemWideLogger.Println("Inbound port not set. Using default (443)") } @@ -60,6 +73,9 @@ func ReverseProxtInit() { } listenOnPort80 := true + if netutils.CheckIfPortOccupied(80) { + listenOnPort80 = false + } sysdb.Read("settings", "listenP80", &listenOnPort80) if listenOnPort80 { SystemWideLogger.Println("Port 80 listener enabled") @@ -136,9 +152,11 @@ func ReverseProxtInit() { //Start Service //Not sure why but delay must be added if you have another //reverse proxy server in front of this service - time.Sleep(300 * time.Millisecond) - dynamicProxyRouter.StartProxyService() - SystemWideLogger.Println("Dynamic Reverse Proxy service started") + if autoStartReverseProxy { + time.Sleep(300 * time.Millisecond) + dynamicProxyRouter.StartProxyService() + SystemWideLogger.Println("Dynamic Reverse Proxy service started") + } //Add all proxy services to uptime monitor //Create a uptime monitor service