@@ -44,89 +44,51 @@ func main() {
4444 flag .IntVar (& hostPort , "host-port" , 9023 , "The port to listen on. Default: 9023" )
4545 flag .Parse ()
4646
47+ if iface == "" {
48+ slog .Error ("interface must be specified" )
49+ flag .Usage ()
50+ os .Exit (1 )
51+ }
52+
4753 if disable4 && disable6 {
4854 slog .Error ("both disable4 and disable6 flag set, needs at least one" )
4955 flag .Usage ()
5056 os .Exit (1 )
5157 }
5258
59+ link , err := netlink .LinkByName (iface )
60+ if err != nil {
61+ log .Fatalln (err )
62+ }
63+
5364 slog .Info ("starting observer" , "iface" , iface , "icmp_targets" , icmpTargets , "icmp_count" , icmpCount , "interval" , interval , "disable4" , disable4 , "disable6" , disable6 , "dns_qname" , dnsQname , "dns_target" , dnsTargets )
5465
5566 dnsTargetsList := strings .Split (dnsTargets , "," )
5667 icmpTargetsList := strings .Split (icmpTargets , "," )
57- http .Handle ("/metrics" , promhttp .Handler ())
5868
59- link , err := netlink .LinkByName (iface )
60- if err != nil {
61- log .Fatalln (err )
62- }
69+ http .Handle ("/metrics" , promhttp .Handler ())
6370
6471 go func () {
6572 for {
66- yourIPAddr , prefixBits , err := sampleDhcp (iface , verbose )
67- if err != nil {
68- slog .Warn ("sampling dhcp" , "your_ip_addr" , yourIPAddr , "prefix_bits" , prefixBits , "err" , err )
69- }
70-
71- err = sampleDns (dnsTargetsList , dnsQname )
72- if err != nil {
73- slog .Warn ("sampling DNS" , "err" , err )
74- }
7573
76- var addr * netlink.Addr
77- var addr6 * netlink.Addr
7874 if ! disable4 {
79- yourIPAddr , prefixBits , err := sampleDhcp (iface , verbose )
80- if err != nil {
81- slog .Warn ("sampling dhcp v4" , "iface" , iface , "err" , err )
82- }
83-
84- addr , err = netlink .ParseAddr (yourIPAddr .String () + "/" + strconv .Itoa (prefixBits ))
85- if err != nil {
86- slog .Error ("parsing address" , "err" , err )
87- os .Exit (1 )
88- }
89-
90- err = netlink .AddrAdd (link , addr )
91- if err != nil {
92- slog .Warn ("adding netlink" , "link" , link , "addr" , addr , "err" , err )
75+ if err := observeIPv4 (link ); err != nil {
76+ slog .Warn ("issue with ipv4" , "err" , err )
9377 }
9478 }
9579
9680 if ! disable6 {
97- yourIP6Addr , prefix6Bits , err := sampleDhcp6 (iface , verbose )
98- if err != nil {
99- slog .Warn ("sampling dhcp v6" , "iface" , iface , "err" , err )
100- }
101-
102- addr6 , err = netlink .ParseAddr (yourIP6Addr .String () + "/" + strconv .Itoa (prefix6Bits ))
103- if err != nil {
104- slog .Error ("adding link" , "addr6" , addr6 , "err" , err )
105- os .Exit (1 )
106- }
107-
108- err = netlink .AddrAdd (link , addr6 )
109- if err != nil {
110- slog .Warn ("could not add netlink address" , "link" , link , "addr6" , addr6 , "err" , err )
81+ if err := observeIPv6 (link ); err != nil {
82+ slog .Warn ("issue with ipv6" , "err" , err )
11183 }
11284 }
11385
114- if icmpTargets != "" && len ( icmpTargetsList ) > 0 {
115- sampleIcmp ( icmpTargetsList , icmpCount )
86+ if err := sampleDns ( dnsTargetsList , dnsQname ); err != nil {
87+ slog . Warn ( "issue with DNS sampling" , "err" , err )
11688 }
11789
118- if ! disable4 {
119- err := netlink .AddrDel (link , addr )
120- if err != nil {
121- slog .Warn ("deleting v4 netlink" , "link" , link , "addr" , addr , "err" , err )
122- }
123- }
124-
125- if ! disable6 {
126- err := netlink .AddrDel (link , addr6 )
127- if err != nil {
128- slog .Warn ("deleting v6 netlink" , "link" , link , "addr" , addr , "err" , err )
129- }
90+ if err := sampleIcmp (icmpTargetsList , icmpCount ); err != nil {
91+ slog .Warn ("issue sampling icmp" , "err" , err )
13092 }
13193
13294 time .Sleep (interval )
@@ -137,6 +99,55 @@ func main() {
13799 slog .Info ("starting observer" , "host_address" , hostAddress )
138100 err = http .ListenAndServe (hostAddress , nil )
139101 if err != nil {
140- panic (err )
102+ slog .Error ("http server" , "err" , err )
103+ os .Exit (1 )
104+ }
105+ }
106+
107+ func observeIPv4 (link netlink.Link ) error {
108+ ip , prefix , err := sampleDhcp (iface , verbose )
109+ if err != nil {
110+ return fmt .Errorf ("DHCPv4 sampling failed: %w" , err )
111+ }
112+
113+ addr , err := netlink .ParseAddr (ip .String () + "/" + strconv .Itoa (prefix ))
114+ if err != nil {
115+ return fmt .Errorf ("parsing IPv4 address failed: %w" , err )
116+ }
117+
118+ if err := netlink .AddrAdd (link , addr ); err != nil {
119+ slog .Warn ("could not add IPv4 address" , "addr" , addr , "err" , err )
120+ return nil
121+ }
122+ defer func () {
123+ if err := netlink .AddrDel (link , addr ); err != nil {
124+ slog .Warn ("could not delete IPv4 address" , "addr" , addr , "err" , err )
125+ }
126+ }()
127+
128+ return nil
129+ }
130+
131+ func observeIPv6 (link netlink.Link ) error {
132+ ip6 , prefix6 , err := sampleDhcp6 (iface , verbose )
133+ if err != nil {
134+ return fmt .Errorf ("DHCPv6 sampling failed: %w" , err )
135+ }
136+
137+ addr6 , err := netlink .ParseAddr (ip6 .String () + "/" + strconv .Itoa (prefix6 ))
138+ if err != nil {
139+ return fmt .Errorf ("parsing IPv6 address failed: %w" , err )
140+ }
141+
142+ if err := netlink .AddrAdd (link , addr6 ); err != nil {
143+ slog .Warn ("could not add IPv6 address" , "addr6" , addr6 , "err" , err )
144+ return nil
141145 }
146+ defer func () {
147+ if err := netlink .AddrDel (link , addr6 ); err != nil {
148+ slog .Warn ("could not delete IPv6 address" , "addr6" , addr6 , "err" , err )
149+ }
150+ }()
151+
152+ return nil
142153}
0 commit comments