forked from thannaske/cmk-teamspeak
-
Notifications
You must be signed in to change notification settings - Fork 0
/
agent_check.go
157 lines (132 loc) · 4.57 KB
/
agent_check.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
package main
import (
"fmt"
"github.com/multiplay/go-ts3"
"gopkg.in/ini.v1"
"os"
)
type ServerQueryConfig struct {
ServerAddress string
Username string
Password string
}
// Set to TRUE during testing and make sure that you define the dev_* variables
// The if-structure gets automagically removed by the golang compiler during optimization
// because DEVELOPER_MODE is a const that can't change during runtime
const DEVELOPER_MODE bool = false
// Only relevant when testing
var (
dev_server = ""
dev_username = ""
dev_password = ""
)
func ReadConfig() *ServerQueryConfig {
// Gets removed during build when DEVELOPER_MODE is set to false
// Do not worry about loss of performance - Go compiler is awesome!
if DEVELOPER_MODE {
return &ServerQueryConfig{ServerAddress: dev_server, Username: dev_username, Password: dev_password}
}
// Check_MK provides an env variable to the configuration directory
configBaseDir := os.Getenv("MK_CONFDIR")
// Load the user configuration and process the required sections and keys
// Exit application with non-zero code when configuration was not read successful
// Also display a Check_MK Agent-compatible error code to process on monitoring server
if cfg, err := ini.Load(configBaseDir + "/teamspeak3.cfg"); err != nil {
fmt.Println("<<<Teamspeak3>>>")
fmt.Println("ConfigError: Yes, 1")
os.Exit(1)
} else {
if sect, err := cfg.GetSection("serverquery"); err != nil {
fmt.Println("<<<Teamspeak3>>>")
fmt.Println("ConfigError: Yes, 2")
os.Exit(1)
} else {
var conf_address, conf_user, conf_password string
if val, err := sect.GetKey("address"); err != nil {
fmt.Println("<<<Teamspeak3>>>")
fmt.Println("ConfigError: Yes, 3")
os.Exit(1)
} else {
conf_address = val.String()
}
if val, err := sect.GetKey("user"); err != nil {
fmt.Println("<<<Teamspeak3>>>")
fmt.Println("ConfigError: Yes, 4")
os.Exit(1)
} else {
conf_user = val.String()
}
if val, err := sect.GetKey("password"); err != nil {
fmt.Println("<<<Teamspeak3>>>")
fmt.Println("ConfigError: Yes, 5")
os.Exit(1)
} else {
conf_password = val.String()
}
// Build ServerQueryConfig struct and return pointer
return &ServerQueryConfig{ServerAddress: conf_address, Username: conf_user, Password: conf_password}
}
}
// Return empty ServerQueryConfig struct
return &ServerQueryConfig{}
}
func main() {
var queryConfig *ServerQueryConfig = ReadConfig()
// Print Check_MK section header
fmt.Println("<<<Teamspeak3>>>")
fmt.Println("ConfigError: No")
// Establish connection to Teamspeak3 server query
c, err := ts3.NewClient(queryConfig.ServerAddress)
// Determine if we can actually reach the server's query console
// In case of error we want to exit with zero-code because the check application itself ran correctly
if err != nil {
fmt.Println("QueryPortReachable: No")
os.Exit(0)
} else {
fmt.Println("QueryPortReachable: Yes")
}
// Make sure the query connection will be closed when application terminates
defer c.Close()
// Try to authenticate with Teamspeak3 server query
if err := c.Login(queryConfig.Username, queryConfig.Password); err != nil {
fmt.Println("AuthSuccess: No")
os.Exit(0)
} else {
fmt.Println("AuthSuccess: Yes")
}
// Try to get server's current version
if v, err := c.Version(); err != nil {
fmt.Println("Version: None")
fmt.Println("Platform: None")
fmt.Println("Build: None")
os.Exit(0)
} else {
fmt.Println("Version:", v.Version)
fmt.Println("Platform:", v.Platform)
fmt.Println("Build:", v.Build)
}
// Iterate through list of virtual servers
if l, err := c.Server.List(); err != nil {
os.Exit(0)
} else {
for _, server := range l {
c.Use(server.ID)
var serverAutoStart string = "no"
var trafficIngressBytesTotal uint64 = 0
var trafficEgressBytesTotal uint64 = 0
// Convert boolean value to string
if server.AutoStart == true {
serverAutoStart = "yes"
}
// When the server is stopped this method exits with an error
if connInfo, err := c.Server.ServerConnectionInfo(); err == nil {
trafficIngressBytesTotal = connInfo.BytesReceivedTotal
trafficEgressBytesTotal = connInfo.BytesSentTotal
}
// Scheme: "VirtualServer: ($PORT $STATUS $ONLINE_CLIENTS $MAX_CLIENTS $CURRENT_CHANNELS $AUTO_START $BANDWIDTH_INGRESS_TOTAL $BANDWIDTH_EGRESS_TOTAL )"
fmt.Printf("VirtualServer: (%d %s %d %d %d %s %d %d)\n", server.Port, server.Status, server.ClientsOnline, server.MaxClients, server.ChannelsOnline, serverAutoStart, trafficIngressBytesTotal, trafficEgressBytesTotal)
}
}
// Ran successful
os.Exit(0)
}