File: nsagent.go

package info (click to toggle)
golang-github-rootless-containers-bypass4netns 0.4.2-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 596 kB
  • sloc: sh: 1,936; python: 542; makefile: 33
file content (70 lines) | stat: -rw-r--r-- 1,491 bytes parent folder | download | duplicates (2)
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
66
67
68
69
70
package nsagent

import (
	"encoding/json"
	"fmt"
	"io"
	"net"
	"os"
	"os/signal"
	"sort"

	"github.com/rootless-containers/bypass4netns/pkg/bypass4netns/nsagent/types"
	"github.com/sirupsen/logrus"
	"golang.org/x/sys/unix"
)

func Main() error {
	w := os.Stdout
	if err := inspect(w); err != nil {
		return err
	}
	sigCh := make(chan os.Signal, 1)
	signal.Notify(sigCh, unix.SIGHUP, unix.SIGTERM, unix.SIGINT)
	for sig := range sigCh {
		switch sig {
		case unix.SIGHUP:
			if err := inspect(w); err != nil {
				return err
			}
		case unix.SIGTERM, unix.SIGINT:
			return nil
		}
	}
	return nil
}

func inspect(w io.Writer) error {
	var msg types.Message
	interfaces, err := net.Interfaces()
	if err != nil {
		return fmt.Errorf("failed to enumerate the network interfaces: %w", err)
	}
	for _, intf := range interfaces {
		addrs, err := intf.Addrs()
		if err != nil {
			logrus.Warnf("Failed to get the addresses of the network interface %q: %v", intf.Name, err)
			continue
		}
		entry := types.Interface{
			Name: intf.Name,
		}
		for _, addr := range addrs {
			if ipNet, ok := addr.(*net.IPNet); ok {
				entry.CIDRs = append(entry.CIDRs, ipNet.String())
			}
		}
		sort.Strings(entry.CIDRs)
		msg.Interfaces = append(msg.Interfaces, entry)
	}
	sort.Slice(msg.Interfaces, func(i, j int) bool {
		return msg.Interfaces[i].Name < msg.Interfaces[j].Name
	})
	b, err := json.Marshal(msg)
	if err != nil {
		return err
	}
	b = append(b, []byte("\n")...)
	_, err = w.Write(b)
	return err
}