-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathmon.go
100 lines (91 loc) · 2.32 KB
/
mon.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
package main
import (
"flag"
"fmt"
"log"
"time"
"github.com/ClusterLabs/go-pacemaker"
)
var verbose = flag.Bool("verbose", false, "print whole cib on each update")
var file = flag.String("file", "", "file to load as CIB")
var remoteSrv = flag.String("remote", "", "remote server to connect to (ip)")
var port = flag.Int("port", 3121, "remote port to connect to (3121)")
var user = flag.String("user", "hacluster", "remote user to connect as")
var password = flag.String("password", "", "remote password to connect with")
var encrypted = flag.Bool("encrypted", false, "set if remote connection is encrypted")
func listenToCib(cib *pacemaker.Cib, restarter chan int) {
_, err := cib.Subscribe(func(event pacemaker.CibEvent, doc *pacemaker.CibDocument) {
if event == pacemaker.UpdateEvent {
fmt.Printf("\n")
fmt.Printf("event: %s\n", event)
if *verbose {
fmt.Printf("cib: %s\n", doc.ToString())
}
} else {
log.Printf("lost connection: %s\n", event)
restarter <- 1
}
})
if err != nil {
log.Printf("Failed to subscribe to CIB: %s", err)
}
}
func connectToCib() (*pacemaker.Cib, error) {
var cib *pacemaker.Cib
var err error
// connect to CIB in various ways
// 1 using a file
if *file != "" {
cib, err = pacemaker.OpenCib(pacemaker.FromFile(*file))
// 2 using a remote server
} else if *remoteSrv != "" {
cib, err = pacemaker.OpenCib(pacemaker.FromRemote(*remoteSrv, *user, *password, *port, *encrypted))
// 3 assuming cib is local to the binary
} else {
cib, err = pacemaker.OpenCib()
}
if err != nil {
log.Print("Failed to open CIB")
return nil, err
}
doc, err := cib.Query()
if err != nil {
log.Print("Failed to query CIB")
return nil, err
}
defer doc.Close()
if *verbose {
fmt.Printf("CIB: %s\n", doc.ToString())
}
return cib, nil
}
func main() {
flag.Parse()
restarter := make(chan int)
cib, err := connectToCib()
if err != nil {
log.Printf("Failed in connectToCib: %s", err)
} else {
listenToCib(cib, restarter)
}
go pacemaker.Mainloop()
state := 0
for {
if state == 0 {
state = <-restarter
} else if state == 1 {
if cib != nil {
cib.Close()
cib = nil
}
cib, err = connectToCib()
if err != nil {
log.Printf("Failed in connectToCib: %s", err)
time.Sleep(5 * time.Second)
} else {
listenToCib(cib, restarter)
state = 0
}
}
}
}