import SocketServer import threading import cmd import sys import Entry class LocalMyCmdException(Exception): def __init__(self, msg): self.msg = msg class MyCmd(cmd.Cmd): @classmethod def setClassParams(cls, entries, adminPwd): cls.entries = entries cls.adminPwd = adminPwd def __init__(self, i, o): cmd.Cmd.__init__(self, completekey=None, stdin=i, stdout=o) cmd.Cmd.use_rawinput = False self.intro = "Hello at the yadyn cli\n" self.prompt = "yadyn> " def do_list(self, l): try: parts = l.split(' ') if len(parts) != 1: raise LocalMyCmdException("illegal number of arguments") x = parts[0] if x == 'all': for entry in MyCmd.entries.values(): self.stdout.write(str(entry) + "\n") elif MyCmd.entries.has_key(x): self.stdout.write(str(MyCmd.entries[x]) + "\n") else: raise LocalMyCmdException("unknown dynid") except LocalMyCmdException, e: self.stdout.write("Failure: %s\n" % str(e.msg)) def do_add(self, l): try: parts = l.split(' ') if len(parts) != 4: raise LocalMyCmdException("illegal number of arguments") (dynid, name, zone, sharedSecret) = parts if MyCmd.entries.has_key(dynid): raise LocalMyCmdException("duplicate dynid") for entry in MyCmd.entries.values(): if entry.name == name and entry.zone == zone: raise LocalMyCmdException("duplicate full name") newEntry = Entry.Entry(dynid, sharedSecret, name, zone) MyCmd.entries[dynid] = newEntry self.stdout.write("Done\n") except LocalMyCmdException, e: self.stdout.write("Failure: %s\n" % str(e.msg)) def do_edit(self, l): try: parts = l.split(' ') if len(parts) != 3: raise LocalMyCmdException("illegal number of arguments") (dynid, attr, value) = parts if not MyCmd.entries.has_key(dynid): raise LocalMyCmdException("unknown dynid") if attr == 'sharedSecret': MyCmd.entries[dynid].sharedSecret = value elif attr == 'name': MyCmd.entries[dynid].name = value else: raise LocalMyCmdException("unknown attribute to change") self.stdout.write("Done\n") except LocalMyCmdException, e: self.stdout.write("Failure: %s\n" % str(e.msg)) def do_delete(self, l): try: parts = l.split(' ') if len(parts) != 1: raise LocalMyCmdException("illegal number of arguments") x = parts[0] if not MyCmd.entries.has_key(x): raise LocalMyCmdException("unknown dynid") del MyCmd.entries[x] self.stdout.write("Done\n") except LocalMyCmdException, e: self.stdout.write("Failure: %s\n" % str(e.msg)) def do_debug(self, l): try: parts = l.split(' ') if len(parts) != 1: raise LocalMyCmdException("illegal number of arguments") if parts[0] == 'on': Logger.debugEnable() elif parts[0] == 'off': Logger.debugDisable() else: raise LocalMyCmdException("illegal argument") except LocalMyCmdException, e: self.stdout.write("Failure: %s\n" % str(e.msg)) def do_quit(self, l): self.stdout.write("Bye\n") return True class CmdHandler(SocketServer.StreamRequestHandler): def handle(self): myCmd = MyCmd(self.rfile, self.wfile) myCmd.cmdloop() class CmdServer(SocketServer.ThreadingTCPServer): def __init__(self, server_address, RequestHandlerClass): self.allow_reuse_address = True SocketServer.ThreadingTCPServer.__init__(self, server_address, RequestHandlerClass) class CmdReceiver(threading.Thread): def __init__(self, cmdAddr, entries, adminPwd): threading.Thread.__init__(self) self.cmdAddr = cmdAddr MyCmd.setClassParams(entries, adminPwd) self.setDaemon(True) def run(self): CmdServer(self.cmdAddr, CmdHandler).serve_forever()