Skip to content

Instantly share code, notes, and snippets.

@flyte
Last active December 30, 2015 23:49
Show Gist options
  • Save flyte/7903129 to your computer and use it in GitHub Desktop.
Save flyte/7903129 to your computer and use it in GitHub Desktop.
Telnets to a TeamSpeak 3 server and sets the given user to be in the serveradmin group. User must be on the TS server at runtime.
from telnetlib import Telnet
from getpass import getpass
from time import sleep
import re
import argparse
import sys
p = argparse.ArgumentParser()
p.add_argument("-s", "--server", required=True)
p.add_argument("-p", "--port", default=10011, type=int)
p.add_argument("-u", "--user", required=True)
p.add_argument("-a", "--adminuser", default="serveradmin")
p.add_argument("-pw", "--password", default=None)
CLIENT_RE = "^clid=(\d+?) cid=(\d+?) client_database_id=(\d+?) client_nickname=(.+?) client_type=(\d+?)$"
class Client(object):
def __init__(self, clid, cid, client_database_id, client_nickname, client_type):
self.clid = clid
self.cid = cid
self.database_id = client_database_id
self.nickname = client_nickname
self.type = client_type
def __repr__(self):
return "%s: %s" % (self.__class__.__name__, self.nickname)
class WrongResponse(Exception):
pass
def write_and_read(telnet_sess, write, read="error id=0 msg=ok"):
write = write + "\n"
read = read + "\n\r"
telnet_sess.write(write)
resp = telnet_sess.read_until(read, timeout=2)
if resp != read:
raise WrongResponse(resp.replace("\s", " "))
def disconnect(telnet_sess):
print "Now disconnecting."
write_and_read(telnet_sess, "quit", "error id=0 msg=ok")
telnet_sess.close()
if __name__ == "__main__":
args = p.parse_args()
if args.password is None:
args.password = getpass("Server password: ")
t = Telnet(args.server, args.port)
sleep(1)
t.read_very_eager()
try:
write_and_read(t, "login %s %s\n" % (args.adminuser, args.password))
except WrongResponse as e:
print "Error logging in to server: %s" % e
disconnect(t)
sys.exit(1)
write_and_read(t, "use 1")
t.write("clientlist\n")
clientlist = t.read_until("error id=0 msg=ok\n\r").split("\n\r")[0].split("|")
clients = []
for c in clientlist:
match = re.match(CLIENT_RE, c)
clid, cid, client_database_id, client_nickname, client_type = match.groups()
client_nickname = client_nickname.replace("\s", " ")
clients.append(Client(
clid, cid, client_database_id, client_nickname, client_type))
client = [c for c in clients if c.nickname == args.user]
if not len(client):
print "Unable to find user %s on server." % args.user
disconnect(t)
sys.exit(1)
try:
write_and_read(t, "servergroupaddclient sgid=6 cldbid=%s\n" % client[0].database_id)
print "User %s added to serveradmin group." % args.user
except WrongResponse, e:
print "Error adding %s to serveradmin group: %s" % (args.user, e)
finally:
disconnect(t)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment