Пример #1
0
    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
Пример #2
0
 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")
Пример #3
0
 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)
Пример #4
0
 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
Пример #5
0
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
Пример #6
0
 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
Пример #7
0
    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
Пример #8
0
    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
Пример #9
0
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
Пример #10
0
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