Projet

Général

Profil

Paste
Télécharger au format
Statistiques
| Branche: | Révision:

root / plugins / teamspeak / ts3v2_ @ 17f78427

Historique | Voir | Annoter | Télécharger (8,3 ko)

1
#!/usr/bin/perl -w
2
# ts3v2_ (perl)
3
# Munin Plugin for Teamspeak3 Servers
4
# displays the number of connected users on TS3 servers
5
# and average transferrate per second over 5 min.
6
#
7
# You can use it with symlinks for overview and explicit ids.
8
# Also you can configure the following variables:
9
#  host
10
#  port
11
#
12
# by Marc Urben, www.oxi.ch or www.oom.ch
13
#
14
# Based on Tim Wulkau's script. Thank you!
15
# www.wulkau.de
16
#
17
#######################################################
18
# 02.10.10 - v0.3
19
#		    -now works again with 3.0.0-beta29
20
#
21
# 18.04.10 - v0.2
22
#           -transfer mode added
23
#
24
# 13.04.10 - v0.1
25
#           -initial release
26
#
27
######################################################
28

    
29
#%# family=auto
30
#%# capabilities=autoconf suggest
31

    
32
use strict;
33
use Net::Telnet;
34

    
35
# CONFIG HERE!
36
my $hostname =  $ENV{host} || "localhost";    # serveraddress
37
my $port =      $ENV{port} || 10011;      # querryport
38
my $user =      $ENV{user} || "serveradmin";
39
my $password =  $ENV{password} || "";
40
my $filename =  "ts3v2_";
41

    
42
# SCRIPT START!
43
#init telnet connection
44
my $name = ""; my $server = ""; my @num; my $id = 0; my $i = 0; my $myserver; my $transfer;
45
my $telnet = new Net::Telnet(Timeout=>1, Errmode=>"return", Prompt=>"/\r/");
46
if (!$telnet->open(Host=>$hostname, Port=>$port)) {
47
        die "Server could not be reached, please check your config!";
48
}
49

    
50
$telnet->waitfor("/Welcome/");
51

    
52
if ($password ne "") {
53
  $telnet->cmd("login client_login_name=".$user." client_login_password=".$password);
54
  my $response = $telnet->getline(Timeout=>1);
55
  if ($response !~ "error id=0 msg=ok") {
56
        $telnet->close;
57
        die "ServerQuery login failed: ".$response;
58
  }
59
}
60

    
61
#get argument
62
my $argument = "";
63
if ($0 =~ /$filename(\w+)$/i) {
64
        $argument = $1;
65
} elsif ($ARGV[0] ne "suggest" and $ARGV[0] ne "autoconf") {
66
        die "Error: We need to know what serverid you want, so link this plugin as "
67
                .$filename."1, ".$filename."2 or ".$filename."overview.\n";
68
}
69

    
70
#check for overview, transfer or single server mode
71
my $mode = "";
72
if ($argument eq "overview" or $argument eq "transfer" or (defined $ARGV[0] and ($ARGV[0] eq "suggest" or $ARGV[0] eq "autoconf"))) {
73
        if ($argument eq "overview") {
74
                $mode = "o";
75
        } elsif($argument eq "transfer") {
76
                $mode = "t";
77
        }
78
        $telnet->cmd("serverlist");
79
        my $line = $telnet->getline(Timeout=>1);
80
        my @servers = split(/\|/, $line);
81
        foreach (@servers) {
82
                if ($_ =~ m/virtualserver_id=(\d+) virtual/) {
83
                        push(@num, $1);
84
                } else {
85
                        die "ERROR: server string not recognized!\n";
86
                }
87
        }
88
        $telnet->waitfor("/error id=0 msg=ok/");
89
} elsif ($argument =~ /^[+-]?\d+$/ ) {
90
        $mode = "s";
91
        $server = $argument;
92
} else {
93
        die "ERROR: unknown plugin mode: $argument\n";
94
}
95

    
96
#check for config mode
97
if (exists $ARGV[0] and $ARGV[0] eq "autoconf") {
98
        print "yes";
99
        exit 0;
100
} elsif (exists $ARGV[0] and $ARGV[0] eq "suggest") {
101
        print "overview\n";
102
        print "transfer\n";
103
        foreach (@num) {
104
                print $_."\n";
105
        }
106
        exit 0;
107
} elsif (exists $ARGV[0] and $ARGV[0] eq "config") {
108
        if ($mode eq "s") {
109
                #single server mode
110
                $telnet->cmd("use sid=".$server);
111
                $telnet->waitfor("/error id=0 msg=ok/");
112
                $telnet->cmd("serverinfo");
113
                my $line = $telnet->getline(Timeout=>1);
114

    
115
                if ($line =~ m/virtualserver_id=(\d+) virtual/) {
116
                        my $id = $1;
117
                } else {
118
                        die "ERROR: server string not recognized!\n";
119
                }
120
                if ($line =~ m/virtualserver_name=(.*) virtualserver_welcomemessage/) {
121
                        $name = $1;
122
                        $name =~ s/\\s/ /g;
123
                } else {
124
                        die "ERROR: server string not recognized!\n";
125
                }
126
                $telnet->waitfor("/error id=0 msg=ok/");
127

    
128
                print "graph_title Teamspeak Users ".$name."\n";
129
                print "graph_vlabel Connected Teamspeak Users\n";
130
                print "graph_category voip\n";
131
                print "graph_info This graph shows the number of connected users on a Teamspeak3 server\n";
132
                print "users.label Users\n";
133
                print "users.info Connected users to ".$name."\n";
134
                print "users.type GAUGE\n";
135

    
136
                exit 0;
137
        } elsif ($mode eq "o") {
138
                #overview mode
139
                print "graph_title Teamspeak Users Overview\n";
140
                print "graph_vlabel Connected Teamspeak Users\n";
141
                print "graph_category voip\n";
142
                print "graph_info This graph shows the number of connected users on a Teamspeak3 server\n";
143

    
144
                foreach (@num) {
145
                        $telnet->cmd("use sid=".$_);
146
                        $telnet->waitfor("/error id=0 msg=ok/");
147
                        $telnet->cmd("serverinfo");
148
                        my $line = $telnet->getline(Timeout=>1);
149
                        if ($line =~ m/virtualserver_name=(.*) virtualserver_welcomemessage/) {
150
                                $name = $1;
151
                                $name =~ s/\\s/ /g;
152
                        } else {
153
                                die "ERROR: server string not recognized!\n";
154
                        }
155
                        $telnet->waitfor("/error id=0 msg=ok/");
156
                        print $_.".label ".$name."\n";
157
                        print $_.".info Users connected on ".$name."\n";
158
                        print $_.".type GAUGE\n";
159
                }
160
                exit 0;
161
        } elsif ($mode eq "t") {
162
                #transfer mode
163
                print "graph_title Teamspeak Transfer Overview\n";
164
                print "graph_vlabel Teamspeak Transfer\n";
165
                print "graph_category voip\n";
166
                print "graph_info This graph shows the Teamspeak3 Transfer Overview\n";
167
                print "transfer.label ~ Transfer per second\n";
168
                print "transfer.info Transfer per second over 5 min\n";
169
                print "transfer.type DERIVE\n";
170
                exit 0;
171
        }
172
} else {
173
        #go go magic, go!
174
        if ($mode eq "s") {
175
                #single mode
176
                $telnet->cmd("use sid=".$server);
177
                $telnet->waitfor("/error id=0 msg=ok/");
178
                $telnet->cmd("serverinfo");
179

    
180
                my $line = $telnet->getline(Timeout=>1);
181
                if ($line =~ m/virtualserver_clientsonline=(\d+) /) {
182
                        print "users.value ".($1-1)."\n";
183
                } else {
184
                        print "users.value 0\n";
185
                }
186
                $telnet->waitfor("/error id=0 msg=ok/");
187
        } elsif ($mode eq "o") {
188
                #overview mode
189
                for (@num) {
190
                        $telnet->waitfor("/Welcome/");
191
                        $telnet->cmd("use sid=".$_);
192
                        $telnet->waitfor("/error id=0 msg=ok/");
193
                        $telnet->cmd("serverinfo");
194

    
195
                        my $line = $telnet->getline(Timeout=>1);
196
                        if ($line =~ m/virtualserver_clientsonline=(\d+) /) {
197
                                print $_.".value ".($1-1)."\n";
198
                        } else {
199
                                print $_.".value 0\n";
200
                        }
201
                        $telnet->waitfor("/error id=0 msg=ok/");
202
                }
203
        } elsif ($mode eq "t") {
204
                $telnet->cmd("hostinfo");
205
                my @tsave;
206
                my $line = $telnet->getline(Timeout=>1);
207
                if ($line =~ m/connection_bytes_received_total=(\d+) connection_bandwidth_sent_last_second_total/) {
208
                        $transfer = $1;
209
                        print "transfer.value ".(($transfer-($transfer%300))/300)."\n";
210
                } else {
211
                        die "ERROR: server string not recognized!\n";
212
                }
213
                $telnet->waitfor("/error id=0 msg=ok/");
214

    
215
        }
216
}
217

    
218
#close telnet connection
219
$telnet->close;
220
exit;