package main import ( "encoding/json" "flag" "fmt" "github.com/influxdata/line-protocol/v2/lineprotocol" log "github.com/sirupsen/logrus" "os/exec" "strings" "time" ) type TF2Stat struct { Name string `json:"name"` Map string `json:"map"` Password bool `json:"password"` MaxPlayers int `json:"maxplayers"` NumPlayers int `json:"numplayers"` QueryPort int `json:"queryPort"` Ping int `json:"ping"` Error *string `json:"error,omitempty"` } type TF2Server string var ( server = flag.String("server", "", "comma seperated list of addresses to query") ) func main() { flag.Parse() servers := strings.Split(*server, ",") var tServer []TF2Server for _, srv := range servers { tServer = append(tServer, TF2Server(strings.TrimSpace(srv))) } for _, ip := range tServer { tStat, err := ip.Stats() if err != nil { log.Debugf("error retrieving stats for %s: %v", ip, err) continue } var enc lineprotocol.Encoder enc.StartLine("tf2server") enc.AddTag("address", string(ip)) enc.AddTag("map", tStat.Map) enc.AddTag("name", tStat.Name) enc.AddField("player", lineprotocol.IntValue(int64(tStat.NumPlayers))) enc.AddField("maxplayer", lineprotocol.IntValue(int64(tStat.MaxPlayers))) enc.AddField("ping", lineprotocol.IntValue(int64(tStat.Ping))) enc.EndLine(time.Now()) fmt.Print(string(enc.Bytes())) } } func (ip TF2Server) Stats() (*TF2Stat, error) { cmd := exec.Command("gamedig", "--type", "teamfortress2", string(ip)) bOut, err := cmd.CombinedOutput() if err != nil { return nil, err } nStat := new(TF2Stat) if err = json.Unmarshal(bOut, &nStat); err != nil { return nil, err } if nStat.Error != nil { return nil, fmt.Errorf("gamedig returned error: %v", *nStat.Error) } return nStat, nil }