Пример #1
0
    def log_into_node(self, node, username=None, password=None,
                  r_username=None, r_password=None):
        """
        Raises IOError.
        """
        rc = False # assume failure
        msg = ""

        try:
            authinfo = None
            if username or password or r_username or r_password:
                # may raise a ValueError
                authinfo = libiscsi.chapAuthInfo(username=username,
                                                 password=password,
                                                 reverse_username=r_username,
                                                 reverse_password=r_password)
            node.setAuth(authinfo)
            node.login()
            rc = True
            log.info("iSCSI: logged into %s at %s:%s through %s",
                    node.name, node.address, node.port, node.iface)
            if not self._mark_node_active(node):
                log.error("iSCSI: node not found among discovered")
        except (IOError, ValueError) as e:
            msg = str(e)
            log.warning("iSCSI: could not log into %s: %s", node.name, msg)

        return (rc, msg)
    def log_into_node(self, node, username=None, password=None,
                  r_username=None, r_password=None, intf=None):
        """
        Raises IOError.
        """
        rc = False # assume failure
        msg = ""

        if intf:
            w = intf.waitWindow(_("Logging in to iSCSI node"),
                                _("Logging in to iSCSI node %s") % node.name)
        try:
            authinfo = None
            if username or password or r_username or r_password:
                # may raise a ValueError
                authinfo = libiscsi.chapAuthInfo(username=username,
                                                 password=password,
                                                 reverse_username=r_username,
                                                 reverse_password=r_password)
            node.setAuth(authinfo)
            node.login()
            rc = True
            log.info("iSCSI: logged into %s %s:%s" % (node.name,
                                                      node.address,
                                                      node.port))
            self.nodes.append(node)
        except (IOError, ValueError) as e:
            msg = str(e)
            log.warning("iSCSI: could not log into %s: %s" % (node.name, msg))
        if intf:
            w.pop()

        return (rc, msg)
Пример #3
0
    def log_into_node(self,
                      node,
                      username=None,
                      password=None,
                      r_username=None,
                      r_password=None):
        """
        Raises IOError.
        """
        rc = False  # assume failure
        msg = ""

        try:
            authinfo = None
            if username or password or r_username or r_password:
                # may raise a ValueError
                authinfo = libiscsi.chapAuthInfo(username=username,
                                                 password=password,
                                                 reverse_username=r_username,
                                                 reverse_password=r_password)
            node.setAuth(authinfo)
            node.login()
            rc = True
            log.info("iSCSI: logged into %s at %s:%s through %s", node.name,
                     node.address, node.port, node.iface)
            if not self._mark_node_active(node):
                log.error("iSCSI: node not found among discovered")
        except (IOError, ValueError) as e:
            msg = str(e)
            log.warning("iSCSI: could not log into %s: %s", node.name, msg)

        return (rc, msg)
    def discover(self, ipaddr, port="3260", username=None, password=None,
                  r_username=None, r_password=None, intf=None):
        """
        Discover iSCSI nodes on the target.

        Returns list of new found nodes.
        """
        authinfo = None
        found = 0
        logged_in = 0

        if not has_iscsi():
            raise IOError, _("iSCSI not available")
        if self._initiator == "":
            raise ValueError, _("No initiator name set")

        if username or password or r_username or r_password:
            # Note may raise a ValueError
            authinfo = libiscsi.chapAuthInfo(username=username,
                                             password=password,
                                             reverse_username=r_username,
                                             reverse_password=r_password)
        self.startup(intf)

        # Note may raise an IOError
        found_nodes = libiscsi.discover_sendtargets(address=ipaddr,
                                                    port=int(port),
                                                    authinfo=authinfo)
        # only return the nodes we are not logged into yet
        return [n for n in found_nodes if n not in self.nodes]
Пример #5
0
    def discover(self,
                 ipaddr,
                 port="3260",
                 username=None,
                 password=None,
                 r_username=None,
                 r_password=None,
                 intf=None):
        """
        Discover iSCSI nodes on the target available for login.

        If we are logged in a node discovered for specified target
        do not do the discovery again as it can corrupt credentials
        stored for the node (setAuth and getAuth are using database
        in /var/lib/iscsi/nodes which is filled by discovery). Just
        return nodes obtained and stored in the first discovery
        instead.

        Returns list of nodes user can log in.
        """
        authinfo = None

        if not has_iscsi():
            raise IOError, _("iSCSI not available")
        if self._initiator == "":
            raise ValueError, _("No initiator name set")

        if self.active_nodes((ipaddr, port)):
            log.debug(
                "iSCSI: skipping discovery of %s:%s due to active nodes" %
                (ipaddr, port))
        else:
            if username or password or r_username or r_password:
                # Note may raise a ValueError
                authinfo = libiscsi.chapAuthInfo(username=username,
                                                 password=password,
                                                 reverse_username=r_username,
                                                 reverse_password=r_password)
            self.startup(intf)

            # Note may raise an IOError
            found_nodes = libiscsi.discover_sendtargets(address=ipaddr,
                                                        port=int(port),
                                                        authinfo=authinfo)
            if found_nodes is None:
                return None
            self.discovered_targets[(ipaddr, port)] = []
            for node in found_nodes:
                self.discovered_targets[(ipaddr, port)].append([node, False])
                log.debug("discovered iSCSI node: %s" % node.name)

        # only return the nodes we are not logged into yet
        return [
            node
            for (node, logged_in) in self.discovered_targets[(ipaddr, port)]
            if not logged_in
        ]
Пример #6
0
    def addTarget(self,
                  ipaddr,
                  port="3260",
                  user=None,
                  pw=None,
                  user_in=None,
                  pw_in=None,
                  intf=None):
        authinfo = None
        found = 0
        logged_in = 0

        if not has_iscsi():
            raise IOError, _("iSCSI not available")
        if self._initiator == "":
            raise ValueError, _("No initiator name set")

        if user or pw or user_in or pw_in:
            # Note may raise a ValueError
            authinfo = libiscsi.chapAuthInfo(username=user,
                                             password=pw,
                                             reverse_username=user_in,
                                             reverse_password=pw_in)
        self.startup(intf)

        # Note may raise an IOError
        found_nodes = libiscsi.discover_sendtargets(address=ipaddr,
                                                    port=int(port),
                                                    authinfo=authinfo)
        if found_nodes == None:
            raise IOError, _("No iSCSI nodes discovered")

        if intf:
            w = intf.waitWindow(_("Logging in to iSCSI nodes"),
                                _("Logging in to iSCSI nodes"))

        for node in found_nodes:
            # skip nodes we already have
            if node in self.nodes:
                continue

            found = found + 1
            try:
                if (authinfo):
                    node.setAuth(authinfo)
                node.login()
                log.info("iscsi.addTarget logged in to %s %s %s" %
                         (node.name, node.address, node.port))
                self.nodes.append(node)
                logged_in = logged_in + 1
            except IOError, e:
                log.warning(
                    "Could not log into discovered iscsi target %s: %s" %
                    (node.name, str(e)))
                # some nodes may require different credentials
                pass
Пример #7
0
    def addTarget(self, ipaddr, port="3260", user=None, pw=None,
                  user_in=None, pw_in=None, intf=None):
        authinfo = None
        found = 0
        logged_in = 0

        if not has_iscsi():
            raise IOError, _("iSCSI not available")
        if self._initiator == "":
            raise ValueError, _("No initiator name set")

        if user or pw or user_in or pw_in:
            # Note may raise a ValueError
            authinfo = libiscsi.chapAuthInfo(username=user, password=pw,
                                             reverse_username=user_in,
                                             reverse_password=pw_in)
        self.startup(intf)

        # Note may raise an IOError
        found_nodes = libiscsi.discover_sendtargets(address=ipaddr,
                                                    port=int(port),
                                                    authinfo=authinfo)
        if found_nodes == None:
            raise IOError, _("No iSCSI nodes discovered")

        if intf:
            w = intf.waitWindow(_("Logging in to iSCSI nodes"),
                                _("Logging in to iSCSI nodes"))

        for node in found_nodes:
            # skip nodes we already have
            if node in self.nodes:
                continue

            found = found + 1
            try:
                if (authinfo):
                    node.setAuth(authinfo)
                node.login()
                self.nodes.append(node)
                logged_in = logged_in + 1
            except:
                # some nodes may require different credentials
                pass

        if intf:
            w.pop()

        if found == 0:
            raise IOError, _("No new iSCSI nodes discovered")

        if logged_in == 0:
            raise IOError, _("Could not log in to any of the discovered nodes")

        stabilize(intf)
Пример #8
0
    def discover(self, ipaddr, port="3260", username=None, password=None,
                 r_username=None, r_password=None):
        """
        Discover iSCSI nodes on the target available for login.

        If we are logged in a node discovered for specified target
        do not do the discovery again as it can corrupt credentials
        stored for the node (setAuth and getAuth are using database
        in /var/lib/iscsi/nodes which is filled by discovery). Just
        return nodes obtained and stored in the first discovery
        instead.

        Returns list of nodes user can log in.
        """
        authinfo = None

        if not has_iscsi():
            raise IOError, _("iSCSI not available")
        if self._initiator == "":
            raise ValueError, _("No initiator name set")

        if self.active_nodes((ipaddr, port)):
            log.debug("iSCSI: skipping discovery of %s:%s due to active nodes" %
                      (ipaddr, port))
        else:
            if username or password or r_username or r_password:
                # Note may raise a ValueError
                authinfo = libiscsi.chapAuthInfo(username=username,
                                                 password=password,
                                                 reverse_username=r_username,
                                                 reverse_password=r_password)
            self.startup()

            # Note may raise an IOError
            found_nodes = libiscsi.discover_sendtargets(address=ipaddr,
                                                        port=int(port),
                                                        authinfo=authinfo)
            if found_nodes is None:
                return []
            self.discovered_targets[(ipaddr, port)] = []
            for node in found_nodes:
                self.discovered_targets[(ipaddr, port)].append([node, False])
                log.debug("discovered iSCSI node: %s" % node.name)

        # only return the nodes we are not logged into yet
        return [node for (node, logged_in) in
                self.discovered_targets[(ipaddr, port)]
                if not logged_in]
Пример #9
0
    def log_into_node(self,
                      node,
                      username=None,
                      password=None,
                      r_username=None,
                      r_password=None,
                      intf=None):
        """
        Raises IOError.
        """
        rc = False  # assume failure
        msg = ""

        if intf:
            w = intf.waitWindow(_("Logging in to iSCSI node"),
                                _("Logging in to iSCSI node %s") % node.name)
        try:
            authinfo = None
            if username or password or r_username or r_password:
                # may raise a ValueError
                authinfo = libiscsi.chapAuthInfo(username=username,
                                                 password=password,
                                                 reverse_username=r_username,
                                                 reverse_password=r_password)
            node.setAuth(authinfo)
            node.login()
            rc = True
            log.info("iSCSI: logged into %s at %s:%s through %s" %
                     (node.name, node.address, node.port, node.iface))
            self.nodes.append(node)
        except (IOError, ValueError) as e:
            msg = str(e)
            log.warning("iSCSI: could not log into %s: %s" % (node.name, msg))
        if intf:
            w.pop()

        return (rc, msg)
Пример #10
0
    def discover(self,
                 ipaddr,
                 port="3260",
                 username=None,
                 password=None,
                 r_username=None,
                 r_password=None,
                 intf=None):
        """
        Discover iSCSI nodes on the target.

        Returns list of new found nodes.
        """
        authinfo = None
        found = 0
        logged_in = 0

        if not has_iscsi():
            raise IOError, _("iSCSI not available")
        if self._initiator == "":
            raise ValueError, _("No initiator name set")

        if username or password or r_username or r_password:
            # Note may raise a ValueError
            authinfo = libiscsi.chapAuthInfo(username=username,
                                             password=password,
                                             reverse_username=r_username,
                                             reverse_password=r_password)
        self.startup(intf)

        # Note may raise an IOError
        found_nodes = libiscsi.discover_sendtargets(address=ipaddr,
                                                    port=int(port),
                                                    authinfo=authinfo)
        # only return the nodes we are not logged into yet
        return [n for n in found_nodes if n not in self.nodes]
Пример #11
0
    def discover(self, ipaddr, port="3260", username=None, password=None,
                 r_username=None, r_password=None):
        """
        Discover iSCSI nodes on the target available for login.

        If we are logged in a node discovered for specified target
        do not do the discovery again as it can corrupt credentials
        stored for the node (setAuth and getAuth are using database
        in /var/lib/iscsi/nodes which is filled by discovery). Just
        return nodes obtained and stored in the first discovery
        instead.

        Returns list of nodes user can log in.
        """
        authinfo = None

        if not has_iscsi():
            raise IOError(_("iSCSI not available"))
        if self._initiator == "":
            raise ValueError(_("No initiator name set"))

        if self.active_nodes((ipaddr, port)):
            log.debug("iSCSI: skipping discovery of %s:%s due to active nodes",
                      ipaddr, port)
        else:
            if username or password or r_username or r_password:
                # Note may raise a ValueError
                authinfo = libiscsi.chapAuthInfo(username=username,
                                                 password=password,
                                                 reverse_username=r_username,
                                                 reverse_password=r_password)
            self.startup()

            # start libiscsi discover_sendtargets in a new process
            # threads can't be used here because the libiscsi library
            # using signals internally which are send to bad thread
            (con_recv, con_write) = Pipe(False)
            p = Process(target=_call_discover_targets, args=(con_write,
                                                             con_recv,
                                                             ipaddr,
                                                             port,
                                                             authinfo, ))
            p.start()

            # Close the writing end of the pipe in the parent
            con_write.close()

            with con_recv:
                try:
                    (ok, data) = con_recv.recv()
                    if not ok:
                        log.debug("iSCSI: exception raised when "
                                  "discover_sendtargets process called: %s",
                                  str(data))
                except EOFError:
                    ok = False
                    log.error("iSCSI: can't receive response from "
                              "_call_discover_targets")

            p.join()

            # convert dictionary back to iscsi nodes object
            if ok:
                found_nodes = []
                for node in data:
                    found_nodes.append(libiscsi.node(**node))
            else:
                return []

            self.discovered_targets[(ipaddr, port)] = []
            for node in found_nodes:
                self.discovered_targets[(ipaddr, port)].append([node, False])
                log.debug("discovered iSCSI node: %s", node.name)

        # only return the nodes we are not logged into yet
        return [node for (node, logged_in) in
                self.discovered_targets[(ipaddr, port)]
                if not logged_in]
Пример #12
0
    def discover(self, ipaddr, port="3260", username=None, password=None,
                 r_username=None, r_password=None):
        """
        Discover iSCSI nodes on the target available for login.

        If we are logged in a node discovered for specified target
        do not do the discovery again as it can corrupt credentials
        stored for the node (setAuth and getAuth are using database
        in /var/lib/iscsi/nodes which is filled by discovery). Just
        return nodes obtained and stored in the first discovery
        instead.

        Returns list of nodes user can log in.
        """
        authinfo = None

        if not has_iscsi():
            raise IOError(_("iSCSI not available"))
        if self._initiator == "":
            raise ValueError(_("No initiator name set"))

        if self.active_nodes((ipaddr, port)):
            log.debug("iSCSI: skipping discovery of %s:%s due to active nodes",
                      ipaddr, port)
        else:
            if username or password or r_username or r_password:
                # Note may raise a ValueError
                authinfo = libiscsi.chapAuthInfo(username=username,
                                                 password=password,
                                                 reverse_username=r_username,
                                                 reverse_password=r_password)
            self.startup()

            # start libiscsi discover_sendtargets in a new process
            # threads can't be used here because the libiscsi library
            # using signals internally which are send to bad thread
            (con_recv, con_write) = Pipe(False)
            p = Process(target=_call_discover_targets, args=(con_write,
                                                             ipaddr,
                                                             port,
                                                             authinfo, ))
            p.start()

            try:
                (ok, data) = con_recv.recv()
                if not ok:
                    log.debug("iSCSI: exception raised when "
                              "discover_sendtargets process called: %s",
                              str(data))
            except EOFError:
                ok = False
                log.error("iSCSI: can't receive response from "
                          "_call_discover_targets")

            p.join()

            # convert dictionary back to iscsi nodes object
            if ok:
                found_nodes = []
                for node in data:
                    found_nodes.append(libiscsi.node(**node))
            else:
                return []

            self.discovered_targets[(ipaddr, port)] = []
            for node in found_nodes:
                self.discovered_targets[(ipaddr, port)].append([node, False])
                log.debug("discovered iSCSI node: %s", node.name)

        # only return the nodes we are not logged into yet
        return [node for (node, logged_in) in
                self.discovered_targets[(ipaddr, port)]
                if not logged_in]