aboutsummaryrefslogtreecommitdiff
path: root/network.go
diff options
context:
space:
mode:
Diffstat (limited to 'network.go')
-rw-r--r--network.go94
1 files changed, 94 insertions, 0 deletions
diff --git a/network.go b/network.go
new file mode 100644
index 0000000..d78a57d
--- /dev/null
+++ b/network.go
@@ -0,0 +1,94 @@
1package main
2
3import (
4 "errors"
5 "net"
6 "os"
7 "strings"
8
9 jww "github.com/spf13/jwalterweatherman"
10)
11
12type interfaceContext struct {
13 PrimaryIP *net.IP
14 MacAddr *net.HardwareAddr
15 PrimaryHostname *string
16}
17
18func interfaceIsUsable(i *net.Interface) bool {
19 if i.Flags&net.FlagLoopback != 0 {
20 return false
21 }
22
23 if i.Flags&net.FlagUp == 0 {
24 return false
25 }
26
27 addrs, err := i.Addrs()
28 if err != nil || len(addrs) == 0 {
29 return false
30 }
31
32 if strings.HasPrefix(i.Name, "docker") {
33 return false
34 }
35
36 return true
37}
38
39func getPrimaryInterface() (*net.Interface, error) {
40 ifaces, err := net.Interfaces()
41 if err != nil {
42 return nil, err
43 }
44
45 if len(ifaces) == 0 {
46 return nil, errors.New("no interfaces found")
47 }
48
49 var iface net.Interface
50 for _, iface = range ifaces {
51 if !interfaceIsUsable(&iface) {
52 continue
53 } else {
54 break
55 }
56 }
57
58 if interfaceIsUsable(&iface) {
59 return &iface, nil
60 } else {
61 return nil, errors.New("no usable interfaces found")
62 }
63}
64
65func getInterfaceContext() (*interfaceContext, error) {
66 iface, err := getPrimaryInterface()
67 if err != nil {
68 return nil, err
69 }
70
71 // Validated to have at least this in interfaceIsUsable
72 addrs, err := iface.Addrs()
73 if err != nil {
74 return nil, err
75 }
76
77 primaryAddr := addrs[0].String()
78 primaryIP, _, err := net.ParseCIDR(primaryAddr)
79 if err != nil {
80 return nil, err
81 }
82
83 name, err := os.Hostname()
84 if err != nil {
85 jww.ERROR.Printf("Unable to resolve hostname, using localhost: %s", err.Error())
86 name = "localhost"
87 }
88
89 return &interfaceContext{
90 PrimaryIP: &primaryIP,
91 MacAddr: &iface.HardwareAddr,
92 PrimaryHostname: &name,
93 }, nil
94}