-
Notifications
You must be signed in to change notification settings - Fork 191
/
ports.go
65 lines (56 loc) · 1.57 KB
/
ports.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package services
import (
"net"
"github.com/pkg/errors"
)
var disallowedPorts = map[int]string{
// Anything <= 1024
1433: "MS-SQL (Microsoft SQL Server database management system)",
1434: "MS-SQL (Microsoft SQL Server database management system)",
1521: "Oracle SQL",
1701: "L2TP (Layer 2 Tunneling Protocol)",
1723: "PPTP (Point-to-Point Tunneling Protocol)",
2049: "NFS (Network File System)",
3000: "Node.js (Server-side JavaScript environment)",
3001: "Node.js (Server-side JavaScript environment)",
3306: "MySQL (Database system)",
3389: "RDP (Remote Desktop Protocol)",
5060: "SIP (Session Initiation Protocol)",
5145: "RSH (Remote Shell)",
5353: "mDNS (Multicast DNS)",
5432: "PostgreSQL (Database system)",
5900: "VNC (Virtual Network Computing)",
6379: "Redis (Database system)",
8000: "HTTP Alternate (http_alt)",
8080: "HTTP Alternate (http_alt)",
8082: "PHP FPM",
8443: "HTTPS Alternate (https_alt)",
9443: "Redis Enterprise (Database system)",
}
func getAvailablePort() (int, error) {
get := func() (int, error) {
addr, err := net.ResolveTCPAddr("tcp", "localhost:0")
if err != nil {
return 0, errors.WithStack(err)
}
l, err := net.ListenTCP("tcp", addr)
if err != nil {
return 0, errors.WithStack(err)
}
defer l.Close()
return l.Addr().(*net.TCPAddr).Port, nil
}
for range 1000 {
port, err := get()
if err != nil {
return 0, errors.WithStack(err)
}
if isAllowed(port) {
return port, nil
}
}
return 0, errors.New("no available port")
}
func isAllowed(port int) bool {
return port > 1024 && disallowedPorts[port] == ""
}