Esempio n. 1
0
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()
Esempio n. 2
0
    def parseConfig(self):
        self.config = ConfigParser()
        self.config.read()

        self.credentials = AuthParser()
        self.credentials.read()