-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
104 lines (88 loc) · 2.42 KB
/
main.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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package main
import (
"flag"
"fmt"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"github.com/psvmcc/disconter/pkg/discovery"
"github.com/psvmcc/disconter/pkg/envflags"
"github.com/psvmcc/disconter/pkg/handlers"
"github.com/VictoriaMetrics/metrics"
"github.com/miekg/dns"
)
const (
appName = "disconter"
)
var (
version string
commit string
appVersion = appName + " " + version + "/" + commit
metricsListen string
dnsListen string
ver bool
metricsGo bool
debug bool
dockerRefresh int
)
func main() {
flag.StringVar(&metricsListen, "bind.metrics", "0.0.0.0:9553", "Bind the HTTP metrics server")
flag.StringVar(&dnsListen, "bind.dns", "0.0.0.0:53535", "Bind the DNS server")
flag.StringVar(&discovery.DockerSocket, "docker.socket", "/var/run/docker.sock", "Docker(Podman) socket path")
flag.IntVar(&dockerRefresh, "docker.refresh.interval", 100, "Container events refresh interval in milliseconds")
flag.BoolVar(&metricsGo, "metrics.go", true, "Extend Golang metrics")
flag.BoolVar(&debug, "debug", false, "Enable debug logging")
flag.BoolVar(&ver, "v", false, "Print version")
err := envflags.SetFlagsFromEnvironment()
if err != nil {
panic(err)
}
flag.Parse()
if ver {
fmt.Println(appVersion)
os.Exit(0)
}
go func() {
versionMetric := fmt.Sprintf(`disconter_info{version=%q,commit=%q}`, version, commit)
metrics.GetOrCreateCounter(versionMetric).Set(0)
http.HandleFunc("/metrics", func(w http.ResponseWriter, _ *http.Request) {
metrics.WritePrometheus(w, true)
})
server := &http.Server{
Addr: metricsListen,
ReadHeaderTimeout: 3 * time.Second,
}
log.Fatal(server.ListenAndServe())
}()
go func() {
handlers.Debug = debug
dns.HandleFunc("disconter.", handlers.HandleDNSRequest)
server := &dns.Server{Addr: dnsListen, Net: "udp"}
log.Fatal(server.ListenAndServe())
}()
discovery.Debug = debug
eventChan := make(chan string)
signalChan := make(chan os.Signal, 1)
signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM)
_, err = discovery.ListContainers(discovery.DockerSocket)
if err != nil {
panic(err)
}
go discovery.DockerEventListener(discovery.DockerSocket, eventChan)
for {
select {
case <-signalChan:
fmt.Println("Program terminated.")
return
case event, ok := <-eventChan:
if ok {
fmt.Println("Received Docker event:", event)
} else {
fmt.Println("Event channel closed. Exiting.")
}
}
}
}