def lineReceived(self, line): """(Internal) Handle Twisted's report of an incoming line from AMI""" log.debug('Line In: %r', line) if self.readingVariables: if not line.strip(): self.readingVariables = False self.factory.mainFunction(self) else: try: key, value = line.split(b':', 1) value = value[1:].rstrip(b'\n').rstrip(b'\r') except ValueError as err: log.error("""Invalid variable line: %r""", line) else: self.variables[key.lower()] = value log.debug("""%s = %r""", key, value) else: try: df = self.pendingMessages.pop(0) except IndexError as err: log.warn("Line received without pending deferred: %r", line) else: if line.startswith(b'200'): line = line[4:] if line.lower().startswith(b'result='): line = line[7:] df.callback(line) else: # XXX parse out the error code try: errCode, line = line.split(b' ', 1) errCode = int(errCode) except ValueError as err: errCode = 500 df.errback(error.AGICommandFailure(errCode, line))
def checkFailure(self, result, failure='-1'): """(Internal) Check for a failure-code, raise error if == result""" # result code may have trailing information... try: resultInt, line = result.split(b' ', 1) except ValueError as err: resultInt = result if resultInt.strip() == failure: raise error.AGICommandFailure(FAILURE_CODE, result) return result
def onStreamingComplete(self, resultLine, skipMS=0): """(Internal) Handle putative success Also watch for failure-on-load problems """ try: digit, endposStuff = resultLine.split(b' ', 1) except ValueError as err: pass else: digit = int(digit) endposStuff = endposStuff.strip() if endposStuff.startswith(b'endpos='): endpos = int(endposStuff[7:].strip()) if endpos == skipMS: # "likely" an error according to the wiki, # we'll raise an error... raise error.AGICommandFailure( FAILURE_CODE, "End position %s == original position, " "result code %s" % (endpos, digit)) return digit, endpos raise ValueError("Unexpected result on streaming completion: %r" % resultLine)
def resultAsInt(self, result): """(Internal) Convert result to an integer value""" try: return int(result.strip()) except ValueError as err: raise error.AGICommandFailure(FAILURE_CODE, result)
except IndexError, err: log.warn("Line received without pending deferred: %r", line) else: if line.startswith('200'): line = line[4:] if line.lower().startswith('result='): line = line[7:] df.callback(line) else: # XXX parse out the error code try: errCode, line = line.split(' ', 1) errCode = int(errCode) except ValueError, err: errCode = 500 df.errback(error.AGICommandFailure(errCode, line)) def sendCommand(self, commandString): """(Internal) Send the given command to the other side""" log.info("Send Command: %r", commandString) commandString = commandString.rstrip('\n').rstrip('\r') df = defer.Deferred() self.pendingMessages.append(df) self.sendLine(commandString) return df def checkFailure(self, result, failure='-1'): """(Internal) Check for a failure-code, raise error if == result""" # result code may have trailing information... try: resultInt, line = result.split(' ', 1)