Files
test-auth/sso/services/jabber/ejabberdctl.py

237 lines
5.9 KiB
Python

import subprocess
import shlex
import StringIO
class CommandError():
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
class eJabberdCtl():
""" Python abstraction of ejabberdctl """
def __init__(self, sudo=False, ejctl='/usr/sbin/ejabberdctl'):
if sudo:
self.ejctl = ['sudo',ejctl]
else:
self.ejctl = [ejctl]
def _execute(self, commandline):
""" Execute a ejabberd command """
args = []
args.extend(self.ejctl)
args.extend(shlex.split(commandline))
print args
try:
proc = subprocess.Popen(args, stdout=subprocess.PIPE)
proc.wait()
out = proc.communicate()
ret = proc.returncode
#print "%d: %s" % (ret, out)
except OSError, e:
raise CommandError('Error encountered during execution: %s' % e)
if ret > 0:
raise CommandError('Error: return code is %s' % ret)
elif ret < 0:
raise CommandError('Terminated by signal %s' % ret)
return out[0]
def status():
""" Returns the server status """
pass
def stop():
""" Stop the ejabberd server """
pass
def restart():
""" Restart the ejabberd server """
pass
def reopen_log():
""" Reopen the ejabberd log file """
pass
def register(self, user, server, password):
""" Adds a user to a vhost """
cmd = "register %s %s %s" % (user, server, password)
try:
self._execute(cmd)
except CommandError, e:
return False
else:
return True
def unregister(self, user, server):
""" Deletes a user from a vhost """
cmd = "unregister %s %s" % (user, server)
try:
self._execute(cmd)
except CommandError, e:
return False
else:
return True
def backup(self, file):
""" Backup the ejabberd database to a file """
pass
def restore(self, file):
""" Restore a backup file to the database """
pass
def install_fallback(self, file):
""" Install a database fallback file """
pass
def dump(self, file):
""" Dump the database to a text file """
pass
def load(self, file):
""" Load a database from a text file """
pass
def delete_expired_messages(self):
""" Delete expired offline messages from the database """
cmd = "delete-expired-messages"
try:
self._execute(cmd)
except CommandError, e:
return False
else:
return True
def delete_old_messages(self, n):
""" Delete offline messages older than n days from the database """
cmd = "delete-old-messages %s" % n
try:
self._execute(cmd)
except CommandError, e:
return False
else:
return True
def status_list(self, status):
""" Gets a list of users with the specified status """
cmd = "status-list %s" % status
try:
cmdout = self._execute(cmd)
except CommandError, e:
return 0
else:
out = {}
lines = cmdout[:-1].split('\n')
for item in lines:
u = item.split(' ')
if not hasattr(out, u[0]):
out[u[0]] = {}
out[u[0]][u[1]] = u[2:]
return out
def set_password(self, user, server, password):
cmd = "set-password %s %s %s" % (user, server, password)
try:
self._execute(cmd)
except CommandError, e:
return False
else:
return True
def is_online(self, user, server):
""" Returns a boolean of if the user is currently online """
cmd = "user-resources %s %s" % (user, server)
try:
out = self._execute(cmd)
except CommandError, e:
return False
else:
if len(out) > 0:
return True
else:
return False
def online_users(self, server=None):
""" Gives the number of online users server-wide or for a particular vhost """
if server:
cmd = "vhost %s stats onlineusers" % server
else:
cmd = "connected-users-number"
try:
out = self._execute(cmd)
except CommandError, e:
return 0
else:
return int(out)
def get_users(self, server):
""" Gets a list of users for a specific vhost """
cmd = "vhost %s registered-users" % server
try:
out = self._execute(cmd)
except CommandError, e:
return []
else:
return out[:-1].split('\n')
def get_shared_groups(self, server):
""" Gets a list of Shared Roster Groups (SRGs) for a specific vhost """
cmd = "srg-list-groups %s" % server
try:
out = self._execute(cmd)
except CommandError, e:
return 0
else:
return out[:-1].split('\n')
def ban_user(self, server, user, reason="Banned"):
""" Bans a user, and kicks them off the server """
cmd = "vhost %s ban-account %s %s" % (server, user, reason)
try:
self._execute(cmd)
except CommandError, e:
return False
else:
return True
if __name__ == '__main__':
b = eJabberdCtl(sudo=True)
print b.register('test88','dredd.it','bleh')
print b.is_online('matalok', 'dredd.it')
print b.online_users()
print b.online_users('dredd.it')
print b.get_shared_groups('dredd.it')
print b.get_users('dredd.it')
print b.status_list('available')
print b.set_password('matalok', 'dredd.it', 'br6feoot')