aboutsummaryrefslogtreecommitdiffstats
path: root/teamspeak-multi.py
blob: cf717c870f18e0fcb7227f96d2d12eff15edd2ae (plain)
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
158
159
160
161
162
163
164
165
166
167
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Plugin to monitor a TeamSpeak Server via telnet
# 	* general bandwidth
# 	* filetransfer bandwidth
# 	* uptime
# 	* user count
#
# Parameters understood:
#     config   (required)
#     autoconf (optional - used by munin-config)
#
# Magic markers - optional - used by installation scripts and
# munin-config:
#
#  #%# family=manual
#  #%# capabilities=autoconf
import ts3
import sys
import os


class TeamspeakMulti:
	def config(self):
		config = {
			'bandwidth': [
				'multigraph teamspeak_transfer',
				'graph_order down up',
				'graph_title Teamspeak Bandwidth',
				'graph_args --base 1024',
				'graph_vlabel bytes in (-) / out (+)',
				'graph_category voip',
				'graph_info graph showing the total Teamspeak3 Bandwidth In and Out',

				'down.label received',
				'down.info total amount of bytes received in the last 5 minutes',
				'down.type DERIVE',
				'down.graph no',
				'down.min 0',
				'up.label bps',
				'up.info total amount of bytes sent in the last 5 minutes',
				'up.type DERIVE',
				'up.negative down',
				'up.min 0'
			],
			'filetransfer': [
				'multigraph teamspeak_fttransfer',
				'graph_order ftdown ftup',
				'graph_title Teamspeak File Bandwidth',
				'graph_args --base 1024',
				'graph_vlabel bytes in (-) / out (+)',
				'graph_category voip',
				'graph_info graph showing the Teamspeak3 File Bandwidth In and Out',

				'ftdown.label received',
				'ftdown.info total amount of bytes received for file transfers in the last 5 minutes',
				'ftdown.type DERIVE',
				'ftdown.graph no',
				'ftdown.min 0',
				'ftup.label bps',
				'ftup.info total amount of bytes sent for file transfers in the last 5 minutes',
				'ftup.type DERIVE',
				'ftup.negative ftdown',
				'ftup.min 0'
			],
			'uptime': [
				'multigraph teamspeak_uptime',
				'graph_title TeamSpeak Uptime',
				'graph_args --base 1000 -l 0',
				'graph_scale no',
				'graph_vlabel days',
				'graph_category voip',
				'graph_info graph showing the Teamspeak3 overall uptime',

				'uptime.label uptime in days',
				'uptime.info TeamSpeak Server Uptime',
				'uptime.cdef uptime,86400,/',
				'uptime.min 0',
				'uptime.draw AREA'
			],
			'users': [
				'multigraph teamspeak_usercount',
				'graph_title TeamSpeak User Count',
				'graph_args --base 1000 -l 0',
				'graph_printf %.0lf',
				'graph_vlabel connected users',
				'graph_category voip',
				'graph_info This graph shows the number of connected users on the Teamspeak3 server',

				'user.label users',
				'user.info users connected in the last 5 minutes',
				'user.min 0'
			]
		}

		return config

	def get_data(self, response):
		data = {
			'teamspeak_transfer': [],
			'teamspeak_fttransfer': [],
			'teamspeak_uptime': [],
			'teamspeak_usercount': []
		}

		# transfer
		data['teamspeak_transfer'].append('multigraph teamspeak_transfer')
		data['teamspeak_transfer'].append('down.value %s' % response["connection_bytes_received_total"])
		data['teamspeak_transfer'].append('up.value %s' % response["connection_bytes_sent_total"])

		# fttransfer
		data['teamspeak_fttransfer'].append('multigraph teamspeak_fttransfer')
		data['teamspeak_fttransfer'].append('ftdown.value %s' % response["connection_filetransfer_bytes_received_total"])
		data['teamspeak_fttransfer'].append('ftup.value %s' % response["connection_filetransfer_bytes_sent_total"])

		# uptime
		data['teamspeak_uptime'].append('multigraph teamspeak_uptime')
		data['teamspeak_uptime'].append('uptime.value %s' % response["instance_uptime"])

		# user count
		data['teamspeak_usercount'].append('multigraph teamspeak_usercount')
		data['teamspeak_usercount'].append('user.value %s' % response["virtualservers_total_clients_online"])

		return data

	def run(self):
		# read the configuration from munin environment
		host = os.environ.get('host', "localhost")
		port = os.environ.get('port', 10011)

		with ts3.query.TS3Connection(host, port) as ts3conn:
			# will raise a TS3QueryError if response code is not 0
			try:
				ts3conn.login(client_login_name=os.environ['username'],
							client_login_password=os.environ['password'])

				hostinfo = ts3conn.hostinfo().parsed
				result = self.get_data(hostinfo[0])

				# for key in results print every entry in dict
				[print('\n'.join(result[key])) for key in result.keys()]

			except (ts3.query.TS3QueryError,KeyError) as err:
				print("Login failed:", err.resp.error["msg"])
				exit(1)

	def main(self):
		# check if any argument is given
		if sys.argv.__len__() >= 2:
			# check if first argument is config or autoconf if not fetch data
			if sys.argv[1] == "config":
				# for key in config().keys() print every entry in dict
				[print('\n'.join(self.config()[key])) for key in self.config().keys()]
				if os.environ.get('MUNIN_CAP_DIRTYCONFIG') == '1':
					self.run()
			elif sys.argv[1] == 'autoconf':
				if None in [os.environ.get('username'), os.environ.get('password')]:
					print('env variables are missing')
				else:
					print('yes')
		else:
			self.run()


if __name__ == "__main__":
	TeamspeakMulti().main()