Use ceoc directly in the gui

This commit is contained in:
Michael Spang 2009-08-06 01:39:33 -04:00
parent b348f5d5bd
commit e6e673447e
2 changed files with 48 additions and 25 deletions

View File

@ -10,7 +10,7 @@ Future changes to the members database that need to be atomic
must also be moved into this module. must also be moved into this module.
""" """
import os, re, subprocess, ldap import os, re, subprocess, ldap
from ceo import conf, ldapi, terms from ceo import conf, ldapi, terms, remote, ceo_pb2
from ceo.excep import InvalidArgument from ceo.excep import InvalidArgument
@ -66,16 +66,6 @@ class NoSuchMember(MemberException):
def __str__(self): def __str__(self):
return "Member not found: %d" % self.memberid return "Member not found: %d" % self.memberid
class ChildFailed(MemberException):
def __init__(self, program, status, output):
MemberException.__init__(self)
self.program, self.status, self.output = program, status, output
def __str__(self):
msg = '%s failed with status %d' % (self.program, self.status)
if self.output:
msg += ': %s' % self.output
return msg
### Connection Management ### ### Connection Management ###
@ -146,22 +136,31 @@ def create_member(username, password, name, program):
raise InvalidArgument("password", "<hidden>", "too short (minimum %d characters)" % cfg['min_password_length']) raise InvalidArgument("password", "<hidden>", "too short (minimum %d characters)" % cfg['min_password_length'])
try: try:
args = [ "/usr/bin/addmember", "--stdin", username, name, program ] request = ceo_pb2.AddUser()
addmember = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) request.type = ceo_pb2.AddUser.MEMBER
out, err = addmember.communicate(password) request.username = username
status = addmember.wait() request.password = password
request.realname = name
request.program = program
out = remote.run_remote('adduser', request.SerializeToString())
response = ceo_pb2.AddUserResponse()
response.ParseFromString(out)
if any(message.status != 0 for message in response.messages):
raise MemberException('\n'.join(message.message for message in response.messages))
# # If the user was created, consider adding them to the mailing list # # If the user was created, consider adding them to the mailing list
# if not status: # if not status:
# listadmin_cfg_file = "/path/to/the/listadmin/config/file" # listadmin_cfg_file = "/path/to/the/listadmin/config/file"
# mail = subprocess.Popen(["/usr/bin/listadmin", "-f", listadmin_cfg_file, "--add-member", username + "@csclub.uwaterloo.ca"]) # mail = subprocess.Popen(["/usr/bin/listadmin", "-f", listadmin_cfg_file, "--add-member", username + "@csclub.uwaterloo.ca"])
# status2 = mail.wait() # Fuck if I care about errors! # status2 = mail.wait() # Fuck if I care about errors!
except remote.RemoteException, e:
raise MemberException(e)
except OSError, e: except OSError, e:
raise MemberException(e) raise MemberException(e)
if status:
raise ChildFailed("addmember", status, out+err)
def get(userid): def get(userid):
""" """
@ -388,16 +387,22 @@ def create_club(username, name):
raise InvalidArgument("username", username, "expected format %s" % repr(cfg['username_regex'])) raise InvalidArgument("username", username, "expected format %s" % repr(cfg['username_regex']))
try: try:
args = [ "/usr/bin/addclub", username, name ] request = ceo_pb2.AddUser()
addclub = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) request.type = ceo_pb2.AddUser.CLUB
out, err = addclub.communicate() request.username = username
status = addclub.wait() request.realname = name
out = remote.run_remote('adduser', request.SerializeToString())
response = ceo_pb2.AddUserResponse()
response.ParseFromString(out)
if any(message.status != 0 for message in response.messages):
raise MemberException('\n'.join(message.message for message in response.messages))
except remote.RemoteException, e:
raise MemberException(e)
except OSError, e: except OSError, e:
raise MemberException(e) raise MemberException(e)
if status:
raise ChildFailed("addclub", status, out+err)
### Terms ### ### Terms ###

18
ceo/remote.py Normal file
View File

@ -0,0 +1,18 @@
import os
import subprocess
class RemoteException(Exception):
"""Exception class for bad argument values."""
def __init__(self, status, stdout, stderr):
self.status, self.stdout, self.stderr = status, stdout, stderr
def __str__(self):
return 'Error executing ceoc (%d)\n\n%s' % (self.status, self.stderr)
def run_remote(op, data):
ceoc = '%s/ceoc' % os.environ.get('CEO_LIB_DIR', '/usr/lib/ceod')
addmember = subprocess.Popen([ceoc, op], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = addmember.communicate(data)
status = addmember.wait()
if status:
raise RemoteException(status, out, err)
return out