Exemple #1
0
    def scan(self, **kwargs):
        """Implemnets the scan method in BasePlugin class.

           .. note::
              In this module, mac addesses were retrieved by ssh.
        """
        try:
            user = self.credential['username']
            pwd = self.credential['password']
        except KeyError:
            logging.error("Cannot find username and password in credential")
            return None

        cmd = ("BRIDGES=$(ovs-vsctl show |grep Bridge |cut -f 2 -d '\"');"
               "for br in $BRIDGES; do"
               "PORTS=$(ovs-ofctl show $br |grep addr |cut -f 1 -d ':' "
               "|egrep -v 'eth|wlan|LOCAL'|awk -F '(' '{print $1}');"
               "for port in $PORTS; do"
               "RESULT=$(ovs-appctl fdb/show $br |"
               "awk '$1 == '$port' {print $1"  "$2"  "$3}');"
               "echo '$RESULT'"
               "done;"
               "done;")
        output = None
        try:
            output = utils.ssh_remote_execute(self.host, user, pwd, cmd)
        except Exception as error:
            logging.exception(error)
            return None

        logging.debug("[scan][output] output is %s", output)
        if not output:
            return None

        fields_arr = ['port', 'vlan', 'mac']

        result = []
        for line in output:
            if not line or line == '\n':
                continue

            values_arr = line.split()
            temp = {}
            for field, value in zip(fields_arr, values_arr):
                temp[field] = value

            result.append(temp.copy())

        return result
Exemple #2
0
    def is_this_vendor(self, sys_info, host=None, credential=None, **kwargs):
        """Determine if the hostname is accociated witH this vendor.

        :param host: swtich's IP address
        :param credential: credential to access switch
        """
        result = sys_info
        if host and credential:
            if utils.is_valid_ssh_credential(credential):
                user = credential['username']
                pwd = credential['password']

            else:
                msg = ("[OVSwitch]The format of credential %r is not for SSH "
                       "or incorrect Keywords! " % credential)
                logging.info(msg)
                return False

            cmd = "ovs-vsctl -V"
            result = None
            try:
                result = utils.ssh_remote_execute(host, user, pwd, cmd)
                logging.debug('%s result for %s is %s', cmd, host, result)
                if not result:
                    return False
            except Exception as exc:
                logging.error("No vendor or connection failed to run %s", cmd)
                logging.exception(exc)
                return False

            if isinstance(result, str):
                result = [result]

        for line in result:
            if not line:
                continue
            if re.search(r"\b" + re.escape(self.__name) + r"\b", line):
                return True

        return False
Exemple #3
0
    def is_this_vendor(self, host, credential):
        """ Determine if the hostname is accociated witH this vendor.
            param str host : swtich's IP address
            param dict credential : credential to access switch
        """
        if "username" in credential and "password" in credential:
            user = credential['username']
            pwd = credential['password']

        else:
            logging.error('either username or password key is not in %s',
                          credential)
            return False
        cmd = "ovs-vsctl -V"
        result = None
        try:
            result = utils.ssh_remote_execute(host, user, pwd, cmd)
            logging.debug('%s result for %s is %s', cmd, host, result)
            if not result:
                return False
        except Exception as exc:
            logging.error("vendor incorrect or connection failed to run %s",
                          cmd)
            logging.exception(exc)
            return False

        if isinstance(result, str):
            result = [result]

        for line in result:
            if not line:
                continue
            if re.search(r"\b" + re.escape(self.__name) + r"\b", line):
                return True

        return False