Beispiel #1
0
class Device(object):

    def __init__(
            self,
            url_chain,
            name=None,
            debug=0,
            stdout=None,
            stderr=None,
            session_log=None,
            log=None
    ):
        # Event emitted when new command output received
        self.command_output_received = Event()
        # Event emitted when device changed the name
        self.name_changed = Event()
        # Event emitted when device wants to log the message
        self.log_event = Event()
        self.log_event.listen(self._log)

        self.node_chain = []
        self.stdby_nodes = []
        self.debug = debug
        self.url_chain = url_chain

        for url in iter(to_list(url_chain)):
            if "," in url:
                # It has standby
                alt_address = url.split(',')
                if ('.' in alt_address[-1]):
                    #Alternate mgmt IP given for standby connections
                    for alt_ip in alt_address[1:] :
                        self.stdby_nodes.append('@'.join(url.split("@")[:-1]) + "@" + alt_ip)
                else :
                    #Alternate ports given for standby connections
                    for alt_port in alt_address[1:] :
                        self.stdby_nodes.append(':'.join(url.split(":")[:-1]) + ":" + alt_port)
                url = url.split(",")[0]

            node_info = NodeInfo(url)
            if not node_info.is_valid():
                self._dbg(
                    2, "For {} protocol {} is not supported or "
                    "{} is invalid URL".format(
                        node_info.hostname,
                        node_info.scheme,
                        node_info.url)
                )
                continue
            self.node_chain.append(node_info)

        if "," in self.url_chain[-1] :
            self.url_chain[-1] = self.url_chain[-1].split(",")[0]
        if self.node_chain:
            self.node_chain[0].verify_reachability = is_reachable

        self.session = None
        self.session_log = session_log
        self.connected = False
        self.last_command_succeed = False

        self.pending_connection = False
        self.command_execution_pending = Lock()
        self.connecting_lock = Lock()

        self.output_store_dir = "."

        if name:
            self.name = name
            #self.name = self.node_chain[-1].node_name
        else:
            self.name = self.node_chain[-1].node_name \
                if self.node_chain else "Unknown"

        if stdout is None:
            self.stdout = open(os.devnull, 'w')
        else:
            self.stdout = stdout

        if stderr is None:
            self.stderr = sys.stderr
        else:
            self.stderr = stderr

        self.info = {}

        self.packages = DevicePackages()

        self.log_event.disconnect(self._log)

        self.error_code = None

    def store_property(self, key, value):
        self._dbg(4, "Store '{}' <- '{}'".format(key, value))
        self.info[key] = value

    def get_property(self, key):
        return self.info.get(key, None)

    def __repr__(self):
        name = ""
        for node in self.node_chain:
            name += "->{}".format(node)
        return name[2:]

    def execute_command(self,command,timeout=60):
        return self.session.connected, self.session.send(command,timeout)

    def disconnect(self):
        return self.session.disconnect()

    def connect(self):
        status = False
        self.session = condor.make_connection_from_urls( "None", self.url_chain)
        try :
            print "Connecting to device"
            status = self.session.connect(self.session_log)
        except Exception as e:
            print "Failed to connect device"
            print e

        if not status and self.stdby_nodes :
            for node in self.stdby_nodes :
                new_url_chain = self.url_chain
                new_url_chain[-1] = node
                print "Trying to connect to: ", new_url_chain[-1]
                self.session = condor.make_connection_from_urls( "None", new_url_chain)
                try :
                    status = self.session.connect(self.session_log)
                except :
                    print "Failed to connect to : ",node
        return status

    def reconnect(self):
        """
         Wait for system to come up with max timeout as 10 Minutes

        """
        status = False
        timeout = 900
        poll_time = 30
        time_waited = 0
        print "System going for reload., please wait!!"
        self.session.disconnect()
        time.sleep(60)

        try :
            self.session.connect(self.session_log)
        except :
            pass 

        while 1:
            time_waited += poll_time
            if time_waited >= timeout:
                break
            else:
                time.sleep(poll_time)
                print "\nRetry count :%s @ %s"%(time_waited/poll_time,time.strftime("%H:%M:%S", time.localtime()))
                try:
                    status = self.session.connect(self.session_log)
                except:
                    continue

                if status :
                    return True
        return status

    def _dbg(self, level, msg):
        if self.debug <= level:
            return
        self.stderr.write("{} [{}]: {}\n".format(
            datetime.datetime.now(), self.name, msg)
        )

    def _log(self, msg):
        message = "{}: {}".format(self.name, msg)
        self._dbg(4, msg)
        self.stdout.write(message + '\n')

    def log(self, msg):
        self.log_event(msg)
Beispiel #2
0
class Device(object):

    def __init__(
            self,
            url_chain,
            name=None,
            debug=0,
            stdout=None,
            stderr=None,
            session_log=None,
            log=None
    ):
        # Event emitted when new command output received
        self.command_output_received = Event()
        # Event emitted when device changed the name
        self.name_changed = Event()
        # Event emitted when device wants to log the message
        self.log_event = Event()
        self.log_event.listen(self._log)

        self.node_chain = []
        self.stdby_nodes = []
        self.debug = debug
        self.url_chain = url_chain

        for url in iter(to_list(url_chain)):
            if "," in url:
                # It has standby
                alt_address = url.split(',')
                if ('.' in alt_address[-1]):
                    #Alternate mgmt IP given for standby connections
                    for alt_ip in alt_address[1:] :
                        self.stdby_nodes.append('@'.join(url.split("@")[:-1]) + "@" + alt_ip)
                else :
                    #Alternate ports given for standby connections
                    for alt_port in alt_address[1:] :
                        self.stdby_nodes.append(':'.join(url.split(":")[:-1]) + ":" + alt_port)
                url = url.split(",")[0]

            node_info = NodeInfo(url)
            if not node_info.is_valid():
                self._dbg(
                    2, "For {} protocol {} is not supported or "
                    "{} is invalid URL".format(
                        node_info.hostname,
                        node_info.scheme,
                        node_info.url)
                )
                continue
            self.node_chain.append(node_info)

        if "," in self.url_chain[-1] :
            self.url_chain[-1] = self.url_chain[-1].split(",")[0]
        if self.node_chain:
            self.node_chain[0].verify_reachability = is_reachable

        self.session = None
        self.session_log = session_log
        self.connected = False
        self.last_command_succeed = False

        self.pending_connection = False
        self.command_execution_pending = Lock()
        self.connecting_lock = Lock()

        self.output_store_dir = "."

        if name:
            self.name = name
            #self.name = self.node_chain[-1].node_name
        else:
            self.name = self.node_chain[-1].node_name \
                if self.node_chain else "Unknown"

        if stdout is None:
            self.stdout = open(os.devnull, 'w')
        else:
            self.stdout = stdout

        if stderr is None:
            self.stderr = sys.stderr
        else:
            self.stderr = stderr

        self.info = {}

        self.packages = DevicePackages()

        self.log_event.disconnect(self._log)

        self.error_code = None

    def store_property(self, key, value):
        self._dbg(4, "Store '{}' <- '{}'".format(key, value))
        self.info[key] = value

    def get_property(self, key):
        return self.info.get(key, None)

    def __repr__(self):
        name = ""
        for node in self.node_chain:
            name += "->{}".format(node)
        return name[2:]

    def execute_command(self,command):
        return self.session.connected, self.session.send(command)

    def disconnect(self):
        status = self.session.disconnect()
        return status

    def connect(self):
        status = False
        self.session = condor.make_connection_from_urls( "None", self.url_chain)
        try :
            print "Connecting to device"
            status = self.session.connect(self.session_log)
        except Exception as e:
            print "Failed to connect device"
            print e

        if not status and self.stdby_nodes :
            for node in self.stdby_nodes :
                new_url_chain = self.url_chain
                new_url_chain[-1] = node
                print "Trying to connect to: ", new_url_chain[-1]
                self.session = condor.make_connection_from_urls( "None", new_url_chain)
                try :
                    status = self.session.connect(self.session_log)
                except :
                    print "Failed to connect to : ",node
        return status

    def reconnect(self):
        """
         Wait for system to come up with max timeout as 10 Minutes

        """
        status = False
        timeout = 900
        poll_time = 30
        time_waited = 0
        print "System going for reload., please wait!!"
        time.sleep(60)
        self.session.disconnect()

        while 1:
            time_waited += poll_time
            if time_waited >= timeout:
                break
            else:
                time.sleep(poll_time)
                print "\nRetry count :%s @ %s"%(time_waited/poll_time,time.strftime("%H:%M:%S", time.localtime()))
                try:
                    status = self.session.connect()
                except:
                    continue

                if status :
                    return True
        return status

    def _dbg(self, level, msg):
        if self.debug <= level:
            return
        self.stderr.write("{} [{}]: {}\n".format(
            datetime.datetime.now(), self.name, msg)
        )

    def _log(self, msg):
        message = "{}: {}".format(self.name, msg)
        self._dbg(4, msg)
        self.stdout.write(message + '\n')

    def log(self, msg):
        self.log_event(msg)