def run_and_check(self, cmd, expectation=True): """ Run a command check the result. If the caller cares about failure and the command fails we raise a generic exception. """ result = ReturnCode(True) logger.info(cmd + " called") self.pdu.connect() result.message = self.pdu.run(cmd) self.pdu.disconnect() e = Exception() if not result.message.find('E000: Success'): if result.message.find('E101: Command Not Found') > -1: logger.error(result.message) result.status = False failmsg = cmd + " failed" e = ApplianceError(failmsg) elif result.message.startswith('E102: Parameter Error'): logger.critical(result.message) result.status = False failmsg = cmd + " failed" e = ApplianceUsage(failmsg) result.status = False if not expectation: return result elif not result.status: raise e return result
def cycle(self, outlet, expectation=True): """ Power cycle a particular port in the PDU specified by the outlet number. """ outlet_state = self.state result = ReturnCode(True) outlet = str(outlet) logger.info("cycle %s" % outlet) self.send("1") self.expect("Control Sub Menu") self.send("1") self.expect("Outlet State Sub Menu") if int(outlet) in range(1, 9): self.send("1") elif int(outlet) in range(9, 17): self.send("2") elif int(outlet) in range(17, 25): self.send("3") self.expect("Outlet Control Sub Menu") self.send(outlet) self.expect("%s Command Choices" % outlet_state[outlet]['name']) self.send("3") self.expect("%s Requested Command is Reboot" % outlet_state[outlet]['name']) self.send("\r") self.expect("Outlet State Sub Menu") if not expectation: return result elif re.search("error|fail", self.before, re.MULTILINE | re.I): raise ApplianceError("pdu cycle failed") # get back to main menu for i in range(0, 2): self.send('\x1b') self.expect("Select Item Number")
def __init__(self, username, hostname, password, prompt=None): # test if this is a telnet or ssh connection s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) if s.connect_ex( (hostname, 23) ) == 0: # the apc is accepting connections using telnet protocol. self.pdu = PDU_telnet(username, hostname, password, prompt) elif s.connect_ex( (hostname, 22)) == 0: # the apc is accepting connections using ssh protocol. self.pdu = PDU_ssh(username, hostname, password, prompt) else: message = 'We can not determine what protocol is being used by PDU %s' % hostname logger.error(message) raise ApplianceError(message)
def up(self, outlet, expectation=True, wait=True): outlet = str(outlet) cmd = 'pset %s 1' % outlet logger.info(cmd) result = self.run_and_check(cmd, expectation) if wait: down = True while down: try: stat = self.state[outlet]['state'] except KeyError: raise ApplianceError("Either %s or %s are not present" % (outlet, "state")) if stat == 'On': down = False return result
def is_failed(sr, lun): result = ReturnCode(False) l = sr.list.get(lun) if l: if sr.version >= 7: if l['state'].find('failed') != -1: result.status = True result.message = l['state'] else: for component in l.get('raids'): if component['state'].find('failed') != -1: result.status = True result.message = component['state'] else: raise ApplianceError( 'trying to query status of a non-existing lun: %s' % lun) return result
def up(self, outlet, expectation=True, wait=True): """ Turns on a particular port in the PDU specified by the outlet number. """ outlet_state = self.state result = ReturnCode(True) outlet = str(outlet) logger.info("up %s" % outlet) self.send("1") self.expect("Control Sub Menu") self.send("1") self.expect("Outlet State Sub Menu") if int(outlet) in range(1, 9): self.send("1") elif int(outlet) in range(9, 17): self.send("2") elif int(outlet) in range(17, 25): self.send("3") self.expect("Outlet Control Sub Menu") self.send(outlet) self.expect("%s Command Choices" % outlet_state[outlet]['name']) self.send("1") self.expect("%s Requested Command is Immediate On" % outlet_state[outlet]['name']) self.send("\r") self.expect("Outlet State Sub Menu") if not expectation: return result elif re.search("error|fail", self.before, re.MULTILINE | re.I): raise ApplianceError("powering on outlet failed") # get back to main menu for i in range(0, 3): self.send('\x1b') self.expect("Select Item Number") if wait: down = True while down: stat = outlet_state[outlet]['state'] if stat == 'On': down = False return result
def run_and_check(self, cmd, expectation=True): """ Run a command check the result. If the caller cares about failure and the command fails we raise a generic exception. """ result = ReturnCode(True) logger.info(cmd + " called") result.message = self.run(cmd) if result.message.find('Invalid command or parameters.') > -1: # this will never work since the error is after the # prompt added except KeyError: to catch problems # below I suspect "expectation" might have a problem too. logger.error(result.message) result.status = False if not expectation: return result elif not result.status: raise ApplianceError(cmd + " failed") return result
def run_and_check(self, cmd, expectation=True, force=False): """ Run a command check the result. If the caller cares about failure and the command fails we raise a generic exception. """ result = ReturnCode(True) confirm = re.compile("Enter[ \t]*\'y\'*.") logger.info(cmd + " called") if force: t = self.prompt self.prompt = confirm self.run(cmd) self.prompt = t result.message = self.run('y') else: result.message = self.run(cmd) e = Exception() if result.message.startswith('Error:'): logger.error(result.message) result.status = False failmsg = cmd + " failed: " + result.message e = ApplianceError(failmsg) elif result.message.startswith('Usage:'): logger.critical(result.message) result.status = False failmsg = cmd + " failed: " + result.message e = ApplianceUsage(failmsg) result.status = False if not expectation: return result elif not result.status: raise e # logger.info( result) return result
def elproxyna(sr, elp=None): """ Use elproxy with no authentication on an SRX to connect to an EL 9P server. Return a py9p.Client given an SRX and EL server address!port (e.g. '5100001004013368!17007'). :param sr: an srx object :param elp: el address and port of namespace target """ sr.expert_run("aux/listen1 -t 'tcp!*!17771' /bin/elproxy &") s = socket.create_connection((sr.host, 17771)) if not elp: elp = sr.expert_run("cat /net/el/addr").message + '!17007' a = 'el!' + elp + '\n' s.sendall('%4.4d\n' % len(a)) # send request s.sendall(a) s.recv(5) # get response length r = s.recv(512) # get response if r.find('OK ') == -1: raise ApplianceError('elproxyna: %s' % r) ns = Client(Sock(s, chatty=0), user='******') return ns
def is_recovering(sr, lun): """ Is this lun recovering? :param sr: an srx object :param lun: a lun number as str :return: returnCode with lun state as message """ result = ReturnCode(False) l = sr.list.get(lun) if l: if sr.version >= 7: if l['state'].find('recovering') != -1: result.status = True result.message = l['state'] else: for component in l.get('raids'): if component['state'].find('recovering') != -1: result.status = True result.message = component['state'] else: raise ApplianceError( 'trying to query status of a non-existing lun: %s' % lun) return result