Adding upstream version 1.34.4.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
e393c3af3f
commit
4978089aab
4963 changed files with 677545 additions and 0 deletions
61
plugins/inputs/teamspeak/README.md
Normal file
61
plugins/inputs/teamspeak/README.md
Normal file
|
@ -0,0 +1,61 @@
|
|||
# Teamspeak 3 Input Plugin
|
||||
|
||||
This plugin uses the Teamspeak 3 ServerQuery interface of the Teamspeak server
|
||||
to collect statistics of one or more virtual servers. If you are querying an
|
||||
external Teamspeak server, make sure to add the host which is running Telegraf
|
||||
to query_ip_allowlist.txt in the Teamspeak Server directory. For information
|
||||
about how to configure the server take a look the [Teamspeak 3 ServerQuery
|
||||
Manual][1].
|
||||
|
||||
[1]: http://media.teamspeak.com/ts3_literature/TeamSpeak%203%20Server%20Query%20Manual.pdf
|
||||
|
||||
## Global configuration options <!-- @/docs/includes/plugin_config.md -->
|
||||
|
||||
In addition to the plugin-specific configuration settings, plugins support
|
||||
additional global and plugin configuration settings. These settings are used to
|
||||
modify metrics, tags, and field or create aliases and configure ordering, etc.
|
||||
See the [CONFIGURATION.md][CONFIGURATION.md] for more details.
|
||||
|
||||
[CONFIGURATION.md]: ../../../docs/CONFIGURATION.md#plugins
|
||||
|
||||
## Configuration
|
||||
|
||||
```toml @sample.conf
|
||||
# Reads metrics from a Teamspeak 3 Server via ServerQuery
|
||||
[[inputs.teamspeak]]
|
||||
## Server address for Teamspeak 3 ServerQuery
|
||||
# server = "127.0.0.1:10011"
|
||||
## Username for ServerQuery
|
||||
username = "serverqueryuser"
|
||||
## Password for ServerQuery
|
||||
password = "secret"
|
||||
## Nickname of the ServerQuery client
|
||||
nickname = "telegraf"
|
||||
## Array of virtual servers
|
||||
# virtual_servers = [1]
|
||||
```
|
||||
|
||||
## Metrics
|
||||
|
||||
- teamspeak
|
||||
- uptime
|
||||
- clients_online
|
||||
- total_ping
|
||||
- total_packet_loss
|
||||
- packets_sent_total
|
||||
- packets_received_total
|
||||
- bytes_sent_total
|
||||
- bytes_received_total
|
||||
- query_clients_online
|
||||
|
||||
### Tags
|
||||
|
||||
- The following tags are used:
|
||||
- virtual_server
|
||||
- name
|
||||
|
||||
## Example Output
|
||||
|
||||
```text
|
||||
teamspeak,virtual_server=1,name=LeopoldsServer,host=vm01 bytes_received_total=29638202639i,uptime=13567846i,total_ping=26.89,total_packet_loss=0,packets_sent_total=415821252i,packets_received_total=237069900i,bytes_sent_total=55309568252i,clients_online=11i,query_clients_online=1i 1507406561000000000
|
||||
```
|
12
plugins/inputs/teamspeak/sample.conf
Normal file
12
plugins/inputs/teamspeak/sample.conf
Normal file
|
@ -0,0 +1,12 @@
|
|||
# Reads metrics from a Teamspeak 3 Server via ServerQuery
|
||||
[[inputs.teamspeak]]
|
||||
## Server address for Teamspeak 3 ServerQuery
|
||||
# server = "127.0.0.1:10011"
|
||||
## Username for ServerQuery
|
||||
username = "serverqueryuser"
|
||||
## Password for ServerQuery
|
||||
password = "secret"
|
||||
## Nickname of the ServerQuery client
|
||||
nickname = "telegraf"
|
||||
## Array of virtual servers
|
||||
# virtual_servers = [1]
|
119
plugins/inputs/teamspeak/teamspeak.go
Normal file
119
plugins/inputs/teamspeak/teamspeak.go
Normal file
|
@ -0,0 +1,119 @@
|
|||
//go:generate ../../../tools/readme_config_includer/generator
|
||||
package teamspeak
|
||||
|
||||
import (
|
||||
_ "embed"
|
||||
"strconv"
|
||||
|
||||
"github.com/multiplay/go-ts3"
|
||||
|
||||
"github.com/influxdata/telegraf"
|
||||
"github.com/influxdata/telegraf/plugins/inputs"
|
||||
)
|
||||
|
||||
//go:embed sample.conf
|
||||
var sampleConfig string
|
||||
|
||||
type Teamspeak struct {
|
||||
Server string `toml:"server"`
|
||||
Username string `toml:"username"`
|
||||
Password string `toml:"password"`
|
||||
Nickname string `toml:"nickname"`
|
||||
VirtualServers []int `toml:"virtual_servers"`
|
||||
|
||||
client *ts3.Client
|
||||
connected bool
|
||||
}
|
||||
|
||||
func (*Teamspeak) SampleConfig() string {
|
||||
return sampleConfig
|
||||
}
|
||||
|
||||
func (ts *Teamspeak) Gather(acc telegraf.Accumulator) error {
|
||||
var err error
|
||||
|
||||
if !ts.connected {
|
||||
err = ts.connect()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
for _, vserver := range ts.VirtualServers {
|
||||
if err := ts.client.Use(vserver); err != nil {
|
||||
ts.connected = false
|
||||
return err
|
||||
}
|
||||
|
||||
sm, err := ts.client.Server.Info()
|
||||
if err != nil {
|
||||
ts.connected = false
|
||||
return err
|
||||
}
|
||||
|
||||
sc, err := ts.client.Server.ServerConnectionInfo()
|
||||
if err != nil {
|
||||
ts.connected = false
|
||||
return err
|
||||
}
|
||||
|
||||
tags := map[string]string{
|
||||
"virtual_server": strconv.Itoa(sm.ID),
|
||||
"name": sm.Name,
|
||||
}
|
||||
|
||||
fields := map[string]interface{}{
|
||||
"uptime": sm.Uptime,
|
||||
"clients_online": sm.ClientsOnline,
|
||||
"total_ping": sm.TotalPing,
|
||||
"total_packet_loss": sm.TotalPacketLossTotal,
|
||||
"packets_sent_total": sc.PacketsSentTotal,
|
||||
"packets_received_total": sc.PacketsReceivedTotal,
|
||||
"bytes_sent_total": sc.BytesSentTotal,
|
||||
"bytes_received_total": sc.BytesReceivedTotal,
|
||||
"query_clients_online": sm.QueryClientsOnline,
|
||||
}
|
||||
|
||||
acc.AddFields("teamspeak", fields, tags)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ts *Teamspeak) connect() error {
|
||||
var err error
|
||||
|
||||
ts.client, err = ts3.NewClient(ts.Server)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = ts.client.Login(ts.Username, ts.Password)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(ts.Nickname) > 0 {
|
||||
for _, vserver := range ts.VirtualServers {
|
||||
if err := ts.client.Use(vserver); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := ts.client.SetNick(ts.Nickname); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ts.connected = true
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
inputs.Add("teamspeak", func() telegraf.Input {
|
||||
return &Teamspeak{
|
||||
Server: "127.0.0.1:10011",
|
||||
VirtualServers: []int{1},
|
||||
}
|
||||
})
|
||||
}
|
139
plugins/inputs/teamspeak/teamspeak_test.go
Normal file
139
plugins/inputs/teamspeak/teamspeak_test.go
Normal file
|
@ -0,0 +1,139 @@
|
|||
package teamspeak
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"net"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/influxdata/telegraf/testutil"
|
||||
)
|
||||
|
||||
const welcome = `Welcome to the TeamSpeak 3 ServerQuery interface, type "help" for a list of commands and ` +
|
||||
`"help <command>" for information on a specific command.`
|
||||
const ok = `error id=0 msg=ok`
|
||||
const errorMsg = `error id=256 msg=command\snot\sfound`
|
||||
|
||||
var cmd = map[string]string{
|
||||
"login": "",
|
||||
"use": "",
|
||||
"serverinfo": `virtualserver_unique_identifier=a1vn9PLF8CMIU virtualserver_name=Testserver ` +
|
||||
`virtualserver_welcomemessage=Test virtualserver_platform=Linux virtualserver_version=3.0.13.8\s[Build:\s1500452811] ` +
|
||||
`virtualserver_maxclients=32 virtualserver_password virtualserver_clientsonline=2 virtualserver_channelsonline=1 ` +
|
||||
`virtualserver_created=1507400243 virtualserver_uptime=148 virtualserver_codec_encryption_mode=0 virtualserver_hostmessage ` +
|
||||
`virtualserver_hostmessage_mode=0 virtualserver_filebase=files\/virtualserver_1 virtualserver_default_server_group=8 ` +
|
||||
`virtualserver_default_channel_group=8 virtualserver_flag_password=0 virtualserver_default_channel_admin_group=5 ` +
|
||||
`virtualserver_max_download_total_bandwidth=18446744073709551615 virtualserver_max_upload_total_bandwidth=18446744073709551615 ` +
|
||||
`virtualserver_hostbanner_url virtualserver_hostbanner_gfx_url virtualserver_hostbanner_gfx_interval=0 ` +
|
||||
`virtualserver_complain_autoban_count=5 virtualserver_complain_autoban_time=1200 virtualserver_complain_remove_time=3600 ` +
|
||||
`virtualserver_min_clients_in_channel_before_forced_silence=100 virtualserver_priority_speaker_dimm_modificator=-18.0000 ` +
|
||||
`virtualserver_id=1 virtualserver_antiflood_points_tick_reduce=5 virtualserver_antiflood_points_needed_command_block=150 ` +
|
||||
`virtualserver_antiflood_points_needed_ip_block=250 virtualserver_client_connections=1 virtualserver_query_client_connections=1 ` +
|
||||
`virtualserver_hostbutton_tooltip virtualserver_hostbutton_url virtualserver_hostbutton_gfx_url virtualserver_queryclientsonline=1 ` +
|
||||
`virtualserver_download_quota=18446744073709551615 virtualserver_upload_quota=18446744073709551615 virtualserver_month_bytes_downloaded=0 ` +
|
||||
`virtualserver_month_bytes_uploaded=0 virtualserver_total_bytes_downloaded=0 virtualserver_total_bytes_uploaded=0 virtualserver_port=9987 ` +
|
||||
`virtualserver_autostart=1 virtualserver_machine_id virtualserver_needed_identity_security_level=8 virtualserver_log_client=0 ` +
|
||||
`virtualserver_log_query=0 virtualserver_log_channel=0 virtualserver_log_permissions=1 virtualserver_log_server=0 ` +
|
||||
`virtualserver_log_filetransfer=0 virtualserver_min_client_version=1445512488 virtualserver_name_phonetic virtualserver_icon_id=0 ` +
|
||||
`virtualserver_reserved_slots=0 virtualserver_total_packetloss_speech=0.0000 virtualserver_total_packetloss_keepalive=0.0000 ` +
|
||||
`virtualserver_total_packetloss_control=0.0000 virtualserver_total_packetloss_total=0.0000 virtualserver_total_ping=1.0000 ` +
|
||||
`virtualserver_ip=0.0.0.0,\s:: virtualserver_weblist_enabled=1 virtualserver_ask_for_privilegekey=0 virtualserver_hostbanner_mode=0 ` +
|
||||
`virtualserver_channel_temp_delete_delay_default=0 virtualserver_min_android_version=1407159763 virtualserver_min_ios_version=1407159763 ` +
|
||||
`virtualserver_status=online connection_filetransfer_bandwidth_sent=0 connection_filetransfer_bandwidth_received=0 ` +
|
||||
`connection_filetransfer_bytes_sent_total=0 connection_filetransfer_bytes_received_total=0 connection_packets_sent_speech=0 ` +
|
||||
`connection_bytes_sent_speech=0 connection_packets_received_speech=0 connection_bytes_received_speech=0 connection_packets_sent_keepalive=261 ` +
|
||||
`connection_bytes_sent_keepalive=10701 connection_packets_received_keepalive=261 connection_bytes_received_keepalive=10961 ` +
|
||||
`connection_packets_sent_control=54 connection_bytes_sent_control=15143 connection_packets_received_control=55 ` +
|
||||
`connection_bytes_received_control=4239 connection_packets_sent_total=315 connection_bytes_sent_total=25844 connection_packets_received_total=316 ` +
|
||||
`connection_bytes_received_total=15200 connection_bandwidth_sent_last_second_total=81 connection_bandwidth_sent_last_minute_total=141 ` +
|
||||
`connection_bandwidth_received_last_second_total=83 connection_bandwidth_received_last_minute_total=98`,
|
||||
"serverrequestconnectioninfo": `connection_filetransfer_bandwidth_sent=0 connection_filetransfer_bandwidth_received=0 ` +
|
||||
`connection_filetransfer_bytes_sent_total=0 connection_filetransfer_bytes_received_total=0 connection_packets_sent_total=369 ` +
|
||||
`connection_bytes_sent_total=28058 connection_packets_received_total=370 connection_bytes_received_total=17468 ` +
|
||||
`connection_bandwidth_sent_last_second_total=81 connection_bandwidth_sent_last_minute_total=109 connection_bandwidth_received_last_second_total=83 ` +
|
||||
`connection_bandwidth_received_last_minute_total=94 connection_connected_time=174 connection_packetloss_total=0.0000 connection_ping=1.0000`,
|
||||
}
|
||||
|
||||
func TestGather(t *testing.T) {
|
||||
l, err := net.Listen("tcp", "127.0.0.1:0")
|
||||
require.NoError(t, err, "Initializing test server failed")
|
||||
defer l.Close()
|
||||
|
||||
go handleRequest(l, t)
|
||||
|
||||
var acc testutil.Accumulator
|
||||
testConfig := Teamspeak{
|
||||
Server: l.Addr().String(),
|
||||
Username: "serveradmin",
|
||||
Password: "test",
|
||||
VirtualServers: []int{1},
|
||||
}
|
||||
require.NoError(t, testConfig.Gather(&acc), "Gather returned error. Error: %s\n", err)
|
||||
|
||||
fields := map[string]interface{}{
|
||||
"uptime": int(148),
|
||||
"clients_online": int(2),
|
||||
"total_ping": float32(1.0000),
|
||||
"total_packet_loss": float64(0.0000),
|
||||
"packets_sent_total": uint64(369),
|
||||
"packets_received_total": uint64(370),
|
||||
"bytes_sent_total": uint64(28058),
|
||||
"bytes_received_total": uint64(17468),
|
||||
"query_clients_online": int(1),
|
||||
}
|
||||
|
||||
acc.AssertContainsFields(t, "teamspeak", fields)
|
||||
}
|
||||
|
||||
func handleRequest(l net.Listener, t *testing.T) {
|
||||
c, err := l.Accept()
|
||||
if err != nil {
|
||||
t.Errorf("Error accepting test connection: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
if _, err = c.Write([]byte("TS3\n\r" + welcome + "\n\r")); err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
|
||||
for {
|
||||
msg, _, err := bufio.NewReader(c).ReadLine()
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
|
||||
r, exists := cmd[strings.Split(string(msg), " ")[0]]
|
||||
if exists {
|
||||
switch r {
|
||||
case "":
|
||||
if _, err = c.Write([]byte(ok + "\n\r")); err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
case "quit":
|
||||
if _, err = c.Write([]byte(ok + "\n\r")); err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
if err = c.Close(); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
return
|
||||
default:
|
||||
if _, err = c.Write([]byte(r + "\n\r" + ok + "\n\r")); err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if _, err = c.Write([]byte(errorMsg + "\n\r")); err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue