class IRODSClientController(object): factory = IRODSClientFactory usage = "usage: %prog [options]" def __init__(self, reactor): self.reactor = reactor self.client = None import optparse optp = optparse.OptionParser(self.usage) # Parse the arguments (defaults to parsing sys.argv). self.parseArguments(optp) opts, args = optp.parse_args() self.parseConfig() self.configure(opts, args) self.connectTCP() def parseArguments(self, optp): optp.add_option('-v', '--verbose', dest='verbose', action='count', help="Increase verbosity (specify multiple times for more)") optp.add_option("-V", "--version", action='store_true', help="print version number and exit") def parseConfig(self): self.config = ConfigParser() self.config.read() self.credentials = AuthParser() self.credentials.read() def configure(self, opts, args): # Here would be a good place to check what came in on the command line # and call optp.error("Useful message") to exit if all it not well. log_level = logging.WARNING # default if opts.verbose == 1: log_level = logging.INFO elif opts.verbose >= 2: log_level = logging.DEBUG # Set up basic configuration, out to stderr with a # reasonable default format. observer = IRODSLogger(log_level) log.startLoggingWithObserver(observer.emit) def connectTCP(self): cb_connect = defer.Deferred() cb_connect.addCallbacks(self.connectClient, self.connectionFailed) cb_connection_lost = defer.Deferred() cb_connection_lost.addBoth(self.connectionLost) factory = self.factory(cb_connect, cb_connection_lost) host = self.config.irodsHost port = self.config.irodsPort self.reactor.connectTCP(host, port, factory) def connectClient(self, client): self.client = client self.sendConnect() def sendConnect(self): user = self.config.irodsUserName zone = self.config.irodsZone d = self.client.sendConnect(proxy_user=user, proxy_zone=zone, client_zone=zone, client_user=user) d.addCallbacks(self.sendAuth, self.printStacktrace) d.addErrback(self.sendDisconnect) def sendAuth(self, data): d = self.client.sendAuthChallenge(self.credentials.password) d.addCallbacks(self.sendCommands, self.sendDisconnect) def sendCommands(self, data): self.sendDisconnect() def parseSqlResult(self, data): if not data: return {} new_data = [] for col in data.sqlResult: for r in range(data.rowCnt): if len(new_data) < data.rowCnt: new_data.append({}) new_data[r][col.const] = col.value[r] return new_data def printStacktrace(self, failure): failure.trap(errors.CAT_NO_ROWS_FOUND) return None def sendDisconnect(self, data): self.client.sendDisconnect() return data def connectionLost(self, reason): reason.trap(error.ConnectionDone) if not reason: print "Connection Lost:", reason self.reactor.stop() def connectionFailed(self, reason): print "Connection Failed:", reason self.reactor.stop()
def parseConfig(self): self.config = ConfigParser() self.config.read() self.credentials = AuthParser() self.credentials.read()