예제 #1
0
 def v2_runner_on_unreachable(self, res):
     self.update_task_state(new_task_state=c.TASK_STATE_FAILED,
                            task_state_message=res._task.get_name())
     Tools.emit_log(task_name=self.task_name,
                    sample_device=self.sample_device,
                    message=logmsg.ERROR_UNREACHABLE.format(
                        res._task.get_name()))
예제 #2
0
 def v2_runner_on_ok(self, res):
     self.update_task_state(new_task_state=c.TASK_STATE_PROGRESS,
                            task_state_message=res._task.get_name())
     Tools.emit_log(task_name=self.task_name,
                    sample_device=self.sample_device,
                    message=logmsg.PLAYBOOK_TASK_OK.format(
                        res._task.get_name()))
예제 #3
0
    def probe_device_not_alive(self, device, timeout):
        """

        :param device:
        :param timeout:
        :return:
        """

        alive = device.deviceConnection.probe(timeout=5)
        probe_attemps = self.grp_cfg.TASKS.Provision.Software.RebootProbeCounter
        probe_cntr = 0

        while alive:

            if probe_cntr <= probe_attemps:
                alive = device.deviceConnection.probe(1)
                probe_cntr += 1
                Tools.emit_log(task_name=self.task_name,
                               sample_device=device,
                               message=logmsg.SW_PROBE_DEV.format(timeout))
                self.update_task_state(
                    new_task_state=c.TASK_STATE_REBOOTING,
                    task_state_message=logmsg.SW_PROBE_WAIT_REBOOT.format(
                        str(probe_cntr)))
                time.sleep(timeout)
            else:
                self.update_task_state(
                    new_task_state=c.TASK_STATE_FAILED,
                    task_state_message=c.TASK_STATE_MSG_FAILED)
                break

        return alive
예제 #4
0
 def v2_runner_on_failed(self, res, ignore_errors=False):
     self.update_task_state(new_task_state=c.TASK_STATE_FAILED,
                            task_state_message=res._task.get_name())
     Tools.emit_log(task_name=self.task_name,
                    sample_device=self.sample_device,
                    message=logmsg.PLAYBOOK_ERROR.format(
                        res._task.get_name()))
     return
예제 #5
0
    def dep_configuration_ipam(self):
        self.update_task_state(
            new_task_state=c.TASK_STATE_PROGRESS,
            task_state_message=
            'Processing configuration task deps for ipam task')
        Tools.emit_log(
            task_name=self.task_name,
            sample_device=self.sample_device,
            message='Processing configuration task deps for ipam task')
        self.sample_device.deviceConfigData['ipam'] = dict()

        for idx, ip in enumerate(self.shared[c.TASK_SHARED_IPAM]):
            self.sample_device.deviceConfigData['ipam']['IP' +
                                                        str(idx)] = ip[0]
예제 #6
0
    def run_task(self):

        if self.sample_device.deviceConnection is not None:
            self.update_task_state(new_task_state=c.TASK_STATE_DONE, task_state_message=c.TASK_STATE_MSG_DONE)
            Tools.emit_log(task_name=self.task_name,
                           task_state={'taskState': self.task_state,
                                       'taskStateMsg': c.TASK_STATE_MSG_DONE},
                           sample_device=self.sample_device, grp_cfg=self.grp_cfg,
                           shared=self.shared, message=c.TASK_STATE_MSG_DONE,
                           scope=c.LOGGER_SCOPE_ALL, level=c.LOGGER_LEVEL_INFO)

        else:
            self.update_task_state(new_task_state=c.TASK_STATE_FAILED,
                                   task_state_message=logmsg.INIT_DEV_CONN_NOK.format(self.sample_device.deviceIP))
            Tools.emit_log(task_name=self.task_name, sample_device=self.sample_device,
                           message=logmsg.INIT_DEV_CONN_NOK.format(self.sample_device.deviceIP))
예제 #7
0
파일: cleanup.py 프로젝트: darkisildur/YAPT
    def run_task(self):
        self.logger.info(
            Tools.create_log_msg(
                self.task_name, self.sample_device.deviceSerial,
                logmsg.CLEANUP_CLOSE_CONN.format(
                    hex(id(self.sample_device.deviceConnection)))))

        try:
            self.sample_device.deviceConnection.close()
            self.logger.info(
                Tools.create_log_msg(
                    self.task_name, self.sample_device.deviceSerial,
                    logmsg.CLEANUP_CLOSE_CONN_SUCCESS.format(
                        hex(id(self.sample_device.deviceConnection)))))

        except TimeoutExpiredError:
            self.update_task_state(
                new_task_state=c.TASK_STATE_FAILED,
                task_state_message='Connection timeout error')
            Tools.emit_log(task_name=self.task_name,
                           sample_device=self.sample_device,
                           message='Connection timeout error')
            return

        self.update_task_state(new_task_state=c.TASK_STATE_DONE,
                               task_state_message=c.TASK_STATE_MSG_DONE)
        Tools.emit_log(task_name=self.task_name,
                       task_state={
                           'taskState': self.task_state,
                           'taskStateMsg': c.TASK_STATE_MSG_DONE
                       },
                       sample_device=self.sample_device,
                       grp_cfg=self.grp_cfg,
                       shared=self.shared,
                       message=c.TASK_STATE_MSG_DONE,
                       scope=c.LOGGER_SCOPE_ALL,
                       level=c.LOGGER_LEVEL_INFO)
예제 #8
0
    def run_task(self):

        if self.grp_cfg.TASKS.Provision.Discovery.Mode == 'Discovery':
            resp = c.SRC.discover_by_space(sample_device=self.sample_device, shared=self.shared)
            if resp == c.TASK_STATE_DONE:
                self.update_task_state(new_task_state=c.TASK_STATE_DONE, task_state_message=c.TASK_STATE_MSG_DONE)
                Tools.emit_log(task_name=self.task_name,
                               task_state={'taskState': self.task_state,
                                           'taskStateMsg': c.TASK_STATE_MSG_DONE},
                               sample_device=self.sample_device, grp_cfg=self.grp_cfg,
                               shared=self.shared, message=c.TASK_STATE_MSG_DONE,
                               scope=c.LOGGER_SCOPE_ALL, level=c.LOGGER_LEVEL_INFO)
            elif resp == c.TASK_STATE_FAILED:
                self.update_task_state(new_task_state=c.TASK_STATE_FAILED, task_state_message=c.TASK_STATE_MSG_FAILED)
                Tools.emit_log(task_name=self.task_name, sample_device=self.sample_device,
                               message=c.TASK_STATE_MSG_FAILED)

        elif self.grp_cfg.TASKS.Provision.Discovery.Mode == 'Configlet':
            resp = c.SRC.discover_by_configlet(sample_device=self.sample_device, shared=self.shared)
            if resp == c.TASK_STATE_DONE:
                self.update_task_state(new_task_state=c.TASK_STATE_DONE, task_state_message=c.TASK_STATE_MSG_DONE)
                Tools.emit_log(task_name=self.task_name,
                               task_state={'taskState': self.task_state,
                                           'taskStateMsg': c.TASK_STATE_MSG_DONE},
                               sample_device=self.sample_device, grp_cfg=self.grp_cfg,
                               shared=self.shared, message=c.TASK_STATE_MSG_DONE,
                               scope=c.LOGGER_SCOPE_ALL, level=c.LOGGER_LEVEL_INFO)
            elif resp == c.TASK_STATE_FAILED:
                self.update_task_state(new_task_state=c.TASK_STATE_FAILED, task_state_message=c.TASK_STATE_MSG_FAILED)
                Tools.emit_log(task_name=self.task_name, sample_device=self.sample_device,
                               message=c.TASK_STATE_MSG_FAILED)
        else:
            self.update_task_state(new_task_state=c.TASK_STATE_FAILED,
                                   task_state_message=logmsg.DISCOVERY_MODE_NOK.format(
                                       self.grp_cfg.TASKS.Provision.Discovery.Mode))
            Tools.emit_log(task_name=self.task_name, sample_device=self.sample_device,
                           message=logmsg.DISCOVERY_MODE_NOK.format(self.grp_cfg.TASKS.Provision.Discovery.Mode))
예제 #9
0
파일: task.py 프로젝트: darkisildur/YAPT
    def __init__(self, sample_device=None, shared=None):

        self.logger = c.logger
        self.task_state = c.TASK_STATE_INIT
        self.task_progress = 0.0
        self.messages = {
            'error': 'error',
            'valid': 'valid',
            'invalid': 'invalid',
            'deactivated': 'deactivated'
        }
        self.task_name = self.__class__.__name__.split('Task')[0]
        self.sample_device = sample_device
        self.shared = shared
        self.grp_cfg = Tools.create_config_view(
            c.CONFIG_TYPE_GROUP, stream=sample_device.deviceGroupData)
        self.task_type = self.__class__.TASK_TYPE
        self.check_schema = self.__class__.CHECK_SCHEMA
        self.task_version = self.__class__.TASK_VERSION
        self._backendp = BackendClientProcessor(
            exchange='', routing_key=c.AMQP_RPC_BACKEND_QUEUE)
        self.logger.info(
            Tools.create_log_msg(self.task_name,
                                 self.sample_device.deviceSerial,
                                 'Validating task configuration'))
        isValid, err = self.__validate_task_config(
            grp_cfg=sample_device.deviceGroupData)

        if isValid == self.messages['valid']:
            self.logger.info(
                Tools.create_log_msg(self.task_name,
                                     self.sample_device.deviceSerial,
                                     'Task configuration is valid'))
            # self.pre_run_task()
            # self.run_task()
            # self.post_run_task()

        elif isValid == self.messages['invalid']:
            Tools.emit_log(
                task_name=self.task_name,
                sample_device=self.sample_device,
                message='Task configuration is invalid. <{0}>'.format(err))
            self.update_task_state(new_task_state=c.TASK_STATE_FAILED,
                                   task_state_message=c.TASK_STATE_MSG_FAILED)
            return
        elif isValid == self.messages['error']:
            Tools.emit_log(task_name=self.task_name,
                           sample_device=self.sample_device,
                           message='Task configuration file not found')
            self.update_task_state(new_task_state=c.TASK_STATE_FAILED,
                                   task_state_message=c.TASK_STATE_MSG_FAILED)
            return
        else:
            Tools.emit_log(task_name=self.task_name,
                           sample_device=self.sample_device,
                           message='Task configuration validation deactivated')
예제 #10
0
파일: vnfspin.py 프로젝트: darkisildur/YAPT
    def run_task(self):
        # this task has to run some when after configuration task
        # Spin up VNFs
        # Done

        datavars = self.sample_device.deviceConfigData

        if datavars:
            for vnf in datavars['device']['vnfs']:
                self.logger.info(
                    Tools.create_log_msg(
                        self.task_name, self.sample_device.deviceSerial,
                        logmsg.VNFSPIN_INIT.format(vnf['name'])))
                req1 = '{0} {1}'.format(
                    'request virtual-network-functions start', vnf['name'])
                self.sample_device.deviceConnection.cli(command=req1,
                                                        format='text',
                                                        warning=False)
                self.update_task_state(
                    new_task_state=c.TASK_STATE_PROGRESS,
                    task_state_message=logmsg.VNFSPIN_VNF_OK.format(
                        vnf['name']))
                Tools.emit_log(task_name=self.task_name,
                               task_state={
                                   'taskState': self.task_state,
                                   'taskStateMsg': c.TASK_STATE_MSG_DONE
                               },
                               sample_device=self.sample_device,
                               grp_cfg=self.grp_cfg,
                               shared=self.shared,
                               message=logmsg.VNFSPIN_VNF_OK.format(
                                   vnf['name']),
                               scope=c.LOGGER_SCOPE_ALL,
                               level=c.LOGGER_LEVEL_INFO)
        else:
            self.update_task_state(new_task_state=c.TASK_STATE_FAILED,
                                   task_state_message=logmsg.VNFSPIN_FILE_ERR)
            Tools.emit_log(task_name=self.task_name,
                           sample_device=self.sample_device,
                           message=logmsg.VNFSPIN_FILE_ERR)
            return

        self.update_task_state(new_task_state=c.TASK_STATE_DONE,
                               task_state_message=c.TASK_STATE_MSG_DONE)
        Tools.emit_log(task_name=self.task_name,
                       sample_device=self.sample_device,
                       message=c.TASK_STATE_DONE)
예제 #11
0
파일: init.py 프로젝트: darkisildur/YAPT
    def run_task(self):

        if self.sample_device.deviceConnection.connected:
            Tools.emit_log(task_name=self.task_name,
                           sample_device=self.sample_device,
                           message='Processing task dependencies: {0}'.format(
                               self.grp_cfg.TASKS.Provision.Init.Dependencies))

            if self.grp_cfg.TASKS.Provision.Init.Dependencies:
                module = Tools.get_task_module_from_group(
                    grp_cfg=self.grp_cfg, task_name='Configuration')

                if module == 'Internal':

                    for dep in self.grp_cfg.TASKS.Provision.Init.Dependencies:
                        if dep in self.grp_cfg.TASKS.Sequence:
                            task_dep = getattr(
                                self, 'dep_init_{0}'.format(dep.lower()))
                            task_dep()

            self.update_task_state(new_task_state=c.TASK_STATE_DONE,
                                   task_state_message=c.TASK_STATE_MSG_DONE)
            Tools.emit_log(task_name=self.task_name,
                           task_state=self.sample_device.deviceTasks.taskState[
                               self.task_name],
                           sample_device=self.sample_device,
                           grp_cfg=self.grp_cfg,
                           shared=self.shared,
                           message=c.TASK_STATE_MSG_DONE,
                           scope=c.LOGGER_SCOPE_ALL,
                           level=c.LOGGER_LEVEL_INFO)

        else:
            self.update_task_state(
                new_task_state=c.TASK_STATE_FAILED,
                task_state_message=logmsg.INIT_DEV_CONN_NOK.format(
                    self.sample_device.deviceSerial))
            Tools.emit_log(task_name=self.task_name,
                           sample_device=self.sample_device,
                           message=logmsg.INIT_DEV_CONN_NOK.format(
                               self.sample_device.deviceSerial))
예제 #12
0
파일: tasktools.py 프로젝트: abacuspix/YAPT
    def get_software_image_name(cls, sample_device, target_version, grp_cfg):
        """
        read file names stored under local images directory, extract label and compare them with target images version
            - return local filename if we have
            - return False if we don't
        :param sample_device:
        :param target_version:
        :param grp_cfg:
        :return: filename or False
        """

        Tools.emit_log(task_name='SOFTWARE',
                       sample_device=sample_device,
                       message=logmsg.SW_CHECK_DIR.format(target_version))
        f = False

        for filename in os.listdir(grp_cfg.TASKS.Provision.Software.ImageDir):

            if filename.endswith(".tgz"):

                local_version = re.findall(r"(?:[\d.X]+)(?:\-*)(?:[D\d.]+)",
                                           filename)[0]

                if target_version == local_version:
                    Tools.emit_log(
                        task_name='SOFTWARE',
                        sample_device=sample_device,
                        message=logmsg.SW_IMAGE_OK.format(local_version))
                    f = filename
                    break
                else:
                    pass

        if not f:
            # if no file found, return False
            Tools.emit_log(task_name='SOFTWARE',
                           sample_device=sample_device,
                           message=logmsg.SW_IMAGE_NOK.format(target_version))

        return f
예제 #13
0
    def get_software_image_name(cls, sample_device, target_version, grp_cfg):
        """
        read file names stored under local images directory, extract label and compare them with target images version
            - return local filename if we have
            - return False if we don't
        :param sample_device:
        :param target_version:
        :param grp_cfg:
        :return: filename or False
        """

        Tools.emit_log(task_name='SOFTWARE', sample_device=sample_device,
                       message=logmsg.SW_CHECK_DIR.format(target_version))

        _filename = Path("{0}/{1}.tgz".format(grp_cfg.TASKS.Provision.Software.ImageDir, target_version))

        if _filename.is_file():
            Tools.emit_log(task_name='SOFTWARE', sample_device=sample_device,
                                       message=logmsg.SW_IMAGE_OK.format(target_version))
            return "{0}.tgz".format(target_version)
        else:
            Tools.emit_log(task_name='SOFTWARE', sample_device=sample_device,
                               message=logmsg.SW_IMAGE_NOK.format(target_version))
            return False
예제 #14
0
    def install_device_software(self, path, image, target_version):
        """
        Call PyEz to install new JUNOS image to device
        :param sample_device:
        :param path:
        :param image:
        :return:
        """

        package = os.path.join(os.getcwd(), path)

        if c.SERVICEPLUGIN_OSSH in self.sample_device.deviceServicePlugin:

            try:
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.SW_CLEANUP_STORAGE)
                self.update_task_state(
                    new_task_state=c.TASK_STATE_PROGRESS,
                    task_state_message=logmsg.SW_CLEANUP_STORAGE)
                self.sample_device.deviceConnection.rpc.request_system_storage_cleanup(
                )
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.SW_COPY_IMG.format(image))
                self.update_task_state(
                    new_task_state=c.TASK_STATE_PROGRESS,
                    task_state_message=logmsg.SW_COPY_IMG.format(image))
                # progress = SoftwareTask.copy_progress
                with SCPClient(transport=self.sample_device.deviceConnection.
                               _conn._session.transport) as scp:
                    scp.put(package,
                            remote_path=self.grp_cfg.TASKS.Provision.Software.
                            RemoteDir)

            except (BadHostKeyException, AuthenticationException) as e:

                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.SW_COPY_IMG_NOK.format(
                                   e.message))
                self.update_task_state(
                    new_task_state=c.TASK_STATE_FAILED,
                    task_state_message=logmsg.SW_COPY_IMG_NOK.format(
                        e.message))
                return self.sample_device

            try:
                Tools.emit_log(
                    task_name=self.task_name,
                    sample_device=self.sample_device,
                    message=logmsg.SW_INSTALL_VERS.format(target_version))
                self.update_task_state(
                    new_task_state=c.TASK_STATE_PROGRESS,
                    task_state_message=logmsg.SW_INSTALL_VERS.format(
                        target_version))
                result = self.sample_device.deviceConnection.sw.pkgadd(
                    self.grp_cfg.TASKS.Provision.Software.RemoteDir + image,
                    dev_timeout=self.grp_cfg.TASKS.Provision.Software.
                    PkgAddDevTimeout)

            except Exception as err:
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.SW_INSTALL_NOK.format(str(err)))
                self.update_task_state(
                    new_task_state=c.TASK_STATE_FAILED,
                    task_state_message=logmsg.SW_INSTALL_NOK.format(str(err)))
                return self.sample_device

            if result is True:
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.SW_INSTALL_OK.format(
                                   self.sample_device.deviceIP))
                self.update_task_state(
                    new_task_state=c.TASK_STATE_PROGRESS,
                    task_state_message=logmsg.SW_INSTALL_OK.format(
                        self.sample_device.deviceIP))

            else:
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.SW_INSTALL_NOK.format(
                                   str(result)))
                self.update_task_state(
                    new_task_state=c.TASK_STATE_FAILED,
                    task_state_message=logmsg.SW_INSTALL_NOK.format(
                        str(result)))
                time.sleep(3)
                return self.sample_device

            Tools.emit_log(task_name=self.task_name,
                           sample_device=self.sample_device,
                           message=logmsg.SW_REBOOT.format(
                               self.sample_device.deviceIP))
            self.update_task_state(new_task_state=c.TASK_STATE_PROGRESS,
                                   task_state_message=logmsg.SW_REBOOT.format(
                                       self.sample_device.deviceIP))

            try:
                rsp = self.sample_device.deviceConnection.sw.reboot()
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.SW_REBOOT_DEV_RESP.format(
                                   rsp.replace('\n', " ")))
                self.sample_device.deviceConnection.close()
                self.sample_device.deviceIsRebooted = True
                self.update_task_state(new_task_state=c.TASK_STATE_REBOOTING,
                                       task_state_message='Rebooting...')
                c.oss_seen_devices_lck.acquire()

                try:
                    if self.sample_device.deviceIP in c.oss_seen_devices:
                        c.oss_seen_devices.pop(self.sample_device.deviceIP,
                                               None)
                finally:
                    c.oss_seen_devices_lck.release()

                return self.sample_device

            except exception.ConnectClosedError:
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.SW_CONN_LOOSE_REBOOT)
                self.update_task_state(
                    new_task_state=c.TASK_STATE_REBOOTING,
                    task_state_message=logmsg.SW_CONN_LOOSE_REBOOT)
                return self.sample_device

        else:

            try:

                result = self.sample_device.deviceConnection.sw.install(
                    package=package,
                    remote_path=self.grp_cfg.TASKS.Provision.Software.
                    RemoteDir,
                    cleanfs=True,
                    no_copy=False,
                    progress=SoftwareTask.install_progress)
            except Exception as err:

                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.SW_INSTALL_NOK.format(str(err)))
                self.update_task_state(new_task_state=c.TASK_STATE_FAILED,
                                       task_state_message=str(err))
                return self.sample_device

            if result is True:

                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.SW_INSTALL_OK.format(
                                   self.sample_device.deviceIP))
                self.update_task_state(
                    new_task_state=c.TASK_STATE_PROGRESS,
                    task_state_message=logmsg.SW_INSTALL_OK.format(
                        self.sample_device.deviceIP))

            else:

                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.SW_INSTALL_NOK.format(
                                   str(result)))
                self.update_task_state(
                    new_task_state=c.TASK_STATE_FAILED,
                    task_state_message=logmsg.SW_INSTALL_NOK.format(
                        str(result)))
                time.sleep(3)
                return self.sample_device

            Tools.emit_log(task_name=self.task_name,
                           sample_device=self.sample_device,
                           message=logmsg.SW_REBOOT.format(
                               self.sample_device.deviceIP))
            self.update_task_state(new_task_state=c.TASK_STATE_PROGRESS,
                                   task_state_message=logmsg.SW_REBOOT.format(
                                       self.sample_device.deviceIP))

            try:
                rsp = self.sample_device.deviceConnection.sw.reboot()
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.SW_REBOOT_DEV_RESP.format(
                                   rsp.replace('\n', " ")))
                # self.sample_device.deviceConnection.close()

            except exception.ConnectClosedError:
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.SW_CONN_LOOSE_REBOOT)
                self.update_task_state(
                    new_task_state=c.TASK_STATE_REBOOTING,
                    task_state_message=logmsg.SW_CONN_LOOSE_REBOOT)
            finally:

                alive = self.probe_device_not_alive(
                    self.sample_device,
                    self.grp_cfg.TASKS.Provision.Software.RetryProbeCounter)

                if not alive:
                    self.sample_device.deviceIsRebooted = True
                    Tools.emit_log(task_name=self.task_name,
                                   sample_device=self.sample_device,
                                   message=logmsg.SW_PROBE_WAKEUP.format(
                                       self.sample_device.deviceIP))
                    status, self.sample_device = Tools.create_dev_conn(
                        self.sample_device, connect=False)

                    if status:

                        alive = self.probe_device_alive(
                            self.sample_device, self.grp_cfg.TASKS.Provision.
                            Software.RebootProbeTimeout)

                        if alive:

                            Tools.emit_log(
                                task_name=self.task_name,
                                sample_device=self.sample_device,
                                message=logmsg.SW_PROBE_WAKUP_OK.format(
                                    self.sample_device.deviceIP))
                            self.sample_device.deviceIsRebooted = False
                            self.update_task_state(
                                new_task_state=c.TASK_STATE_PROGRESS,
                                task_state_message=logmsg.SW_PROBE_WAKUP_OK.
                                format(self.sample_device.deviceIP))
                            status, self.sample_device = Tools.create_dev_conn(
                                self.sample_device)

                            if status:

                                self.sample_device.deviceConnection.bind(
                                    cu=Config, sw=SW)
                                # Tools.emit_log(task_name=self.task_name, sample_device=self.sample_device,
                                #               message=logmsg.SW_CONN_OK.format(self.sample_device.deviceIP))
                                self.update_task_state(
                                    new_task_state=c.TASK_STATE_PROGRESS,
                                    task_state_message=logmsg.SW_CONN_OK.
                                    format(self.sample_device.deviceIP))

                                return self.sample_device

                            else:
                                return self.sample_device

                        else:
                            self.update_task_state(
                                new_task_state=c.TASK_STATE_FAILED,
                                task_state_message=c.TASK_STATE_MSG_FAILED)
                            self.sample_device.deviceConnection = None
                            return self.sample_device

                else:
                    Tools.emit_log(task_name=self.task_name,
                                   sample_device=self.sample_device,
                                   message=logmsg.SW_PROBE_DEV_NOK.format(
                                       self.sample_device.deviceIP,
                                       self.grp_cfg.TASKS.Provision.Software.
                                       RebootProbeCounter))
                    self.update_task_state(
                        new_task_state=c.TASK_STATE_FAILED,
                        task_state_message=logmsg.SW_PROBE_DEV_NOK.format(
                            self.sample_device.deviceIP, self.grp_cfg.TASKS.
                            Provision.Software.RebootProbeCounter))
예제 #15
0
파일: cleanup.py 프로젝트: darkisildur/YAPT
    def run_task(self):
        Tools.emit_log(task_name=self.task_name,
                       sample_device=self.sample_device,
                       message=logmsg.CLEANUP_CLOSE_CONN.format(
                           hex(id(self.sample_device.deviceConnection))))

        if isinstance(self.sample_device.deviceConnection, NetworkDriver):
            self.sample_device.deviceConnection.close()

        else:
            if c.SERVICEPLUGIN_OSSH in self.sample_device.deviceServicePlugin:

                try:
                    self.sample_device.deviceConnection.cli('op cleanup',
                                                            warning=False)
                except ConnectClosedError as cce:
                    pass

                c.oss_seen_devices_lck.acquire()

                try:
                    if self.sample_device.deviceIP in c.oss_seen_devices:
                        c.oss_seen_devices.pop(self.sample_device.deviceIP,
                                               None)
                finally:
                    c.oss_seen_devices_lck.release()
                    self.update_task_state(
                        new_task_state=c.TASK_STATE_DONE,
                        task_state_message=c.TASK_STATE_MSG_DONE)
                    Tools.emit_log(
                        task_name=self.task_name,
                        task_state=self.sample_device.deviceTasks.taskState[
                            self.task_name],
                        sample_device=self.sample_device,
                        grp_cfg=self.grp_cfg,
                        shared=self.shared,
                        message=logmsg.CLEANUP_CLOSE_CONN_SUCCESS.format(
                            hex(id(self.sample_device.deviceConnection))),
                        scope=c.LOGGER_SCOPE_ALL,
                        level=c.LOGGER_LEVEL_INFO)
            else:

                if self.sample_device.deviceConnection.connected:

                    try:
                        self.sample_device.deviceConnection.close()
                        self.update_task_state(
                            new_task_state=c.TASK_STATE_DONE,
                            task_state_message=c.TASK_STATE_MSG_DONE)
                        Tools.emit_log(
                            task_name=self.task_name,
                            task_state=self.sample_device.deviceTasks.
                            taskState[self.task_name],
                            sample_device=self.sample_device,
                            grp_cfg=self.grp_cfg,
                            shared=self.shared,
                            message=logmsg.CLEANUP_CLOSE_CONN_SUCCESS.format(
                                hex(id(self.sample_device.deviceConnection))),
                            scope=c.LOGGER_SCOPE_ALL,
                            level=c.LOGGER_LEVEL_INFO)

                    except TimeoutExpiredError:
                        self.update_task_state(
                            new_task_state=c.TASK_STATE_FAILED,
                            task_state_message=logmsg.
                            CLEANUP_CLOSE_CONN_TIMEOUT)
                        Tools.emit_log(
                            task_name=self.task_name,
                            sample_device=self.sample_device,
                            message=logmsg.CLEANUP_CLOSE_CONN_TIMEOUT)

                        return

                else:
                    self.update_task_state(
                        new_task_state=c.TASK_STATE_FAILED,
                        task_state_message=logmsg.CLEANUP_CLOSE_CONN_ERROR.
                        format(hex(id(self.sample_device.deviceConnection))))
                    Tools.emit_log(
                        task_name=self.task_name,
                        sample_device=self.sample_device,
                        message=logmsg.CLEANUP_CLOSE_CONN_ERROR.format(
                            hex(id(self.sample_device.deviceConnection))))

                    return
예제 #16
0
    def run_task(self):

        status_dev_cfg, dev_data_file = Tools.get_config(
            lookup_type=c.CONFIG_LOOKUP_TYPE_GET_DEVICE_CFG_FILE,
            sample_device=self.sample_device)
        status_template, template_file = Tools.get_config(
            lookup_type=c.CONFIG_LOOKUP_TYPE_GET_TEMPLATE_FILE,
            sample_device=self.sample_device)
        if status_dev_cfg:

            if status_template:

                loader = DataLoader()

                try:
                    ds = loader.load_from_file(
                        os.getcwd() + '/' + self.grp_cfg.TASKS.Provision.
                        Configuration.Ansibleapi.PlaybookPath + self.grp_cfg.
                        TASKS.Provision.Configuration.Ansibleapi.Playbook)
                except AnsibleFileNotFound as afnf:
                    self.update_task_state(
                        new_task_state=c.TASK_STATE_FAILED,
                        task_state_message=logmsg.PLAYBOOK_NOT_FOUND.format(
                            afnf))
                    Tools.emit_log(
                        task_name=self.task_name,
                        sample_device=self.sample_device,
                        message=logmsg.PLAYBOOK_NOT_FOUND.format(afnf))
                    return

                # Dynamic Inventory
                inventory = """
                    [YAPT]
                     {{ hosts }}
        
                    [YAPT:vars]
                      junos_user={{ junos_user }}
                      junos_password={{ junos_password }}
                      template_src={{ template_src }}
                      template_dst={{ template_dst }}
                      device_vars={{ device_vars }}
                      heading={{ heading }}
                    """

                inventory_template = jinja2.Template(inventory)
                '''
                ## Last changed: 2017-10-16-2139 version 12.1X47-D35.2;
                '''
                heading = """## Last changed: {0} version {1};
                    """.format(
                    datetime.datetime.now().strftime('%Y-%m-%d-%H%M'),
                    self.sample_device.softwareVersion)

                rendered_inventory = inventory_template.render({
                    'hosts':
                    self.sample_device.deviceIP,
                    'junos_user':
                    c.conf.YAPT.DeviceUsr,
                    'junos_password':
                    Tools.get_password(c.YAPT_PASSWORD_TYPE_DEVICE),
                    'template_src':
                    template_file,
                    'template_dst':
                    os.getcwd() + '/history/' +
                    self.sample_device.deviceSerial + '-' +
                    datetime.datetime.now().strftime('%Y-%m-%d-%H%M') +
                    '.conf',
                    'device_vars':
                    dev_data_file,
                    'heading':
                    heading
                })

                self.logger.debug(
                    Tools.create_log_msg(self.task_name,
                                         self.sample_device.deviceSerial,
                                         rendered_inventory))

                # Create a temporary file and write the template string to it
                hosts = NamedTemporaryFile(delete=False)
                hosts.write(rendered_inventory)
                hosts.close()
                inventory = InventoryManager(loader=loader, sources=hosts.name)
                variable_manager = VariableManager(loader=loader,
                                                   inventory=inventory)

                Options = namedtuple('Options', [
                    'listtags', 'listtasks', 'listhosts', 'syntax',
                    'connection', 'module_path', 'forks', 'remote_user',
                    'private_key_file', 'ssh_common_args', 'ssh_extra_args',
                    'sftp_extra_args', 'scp_extra_args', 'become',
                    'become_method', 'become_user', 'verbosity', 'check',
                    'diff'
                ])
                options = Options(listtags=False,
                                  listtasks=False,
                                  listhosts=True,
                                  syntax=False,
                                  connection='ssh',
                                  module_path=None,
                                  forks=100,
                                  remote_user=None,
                                  private_key_file=None,
                                  ssh_common_args=None,
                                  ssh_extra_args=None,
                                  sftp_extra_args=None,
                                  scp_extra_args=None,
                                  become=False,
                                  become_method=None,
                                  become_user=None,
                                  verbosity=None,
                                  check=False,
                                  diff=False)

                passwords = dict(
                    vault_pass=Tools.get_password(c.YAPT_PASSWORD_TYPE_DEVICE))
                play = Play.load(data=ds[0],
                                 variable_manager=variable_manager,
                                 loader=loader)

                results_callback = CallbackModule(
                    sample_device=self.sample_device,
                    shared=self.shared,
                    update_task_state=self.update_task_state)
                tqm = None

                try:
                    tqm = TaskQueueManager(
                        inventory=inventory,
                        variable_manager=variable_manager,
                        loader=loader,
                        options=options,
                        passwords=passwords,
                        stdout_callback=results_callback,
                    )

                    result = tqm.run(play)

                    if result > 0:
                        self.update_task_state(
                            new_task_state=c.TASK_STATE_FAILED,
                            task_state_message=logmsg.ANSIBLE_ERROR)
                        Tools.emit_log(task_name=self.task_name,
                                       sample_device=self.sample_device,
                                       message=logmsg.ANSIBLE_ERROR)
                        os.remove(hosts.name)
                        return

                    else:
                        self.update_task_state(
                            new_task_state=c.TASK_STATE_PROGRESS,
                            task_state_message=logmsg.PLAYBOOK_FINISHED_SUCCESS
                        )
                        self.sample_device.deviceConnection.facts_refresh()
                        self.sample_device.deviceConnection.facts_refresh(
                            keys='hostname')
                        self.sample_device.deviceName = self.sample_device.deviceConnection.facts[
                            'hostname']
                        self.update_task_state(
                            new_task_state=c.TASK_STATE_DONE,
                            task_state_message=c.TASK_STATE_MSG_DONE)
                        Tools.emit_log(
                            task_name=self.task_name,
                            task_state={
                                'taskState': self.task_state,
                                'taskStateMsg': c.TASK_STATE_MSG_DONE
                            },
                            sample_device=self.sample_device,
                            grp_cfg=self.grp_cfg,
                            shared=self.shared,
                            message=logmsg.PLAYBOOK_FINISHED_SUCCESS,
                            scope=c.LOGGER_SCOPE_ALL,
                            level=c.LOGGER_LEVEL_INFO)
                        os.remove(hosts.name)

                except Exception as e:
                    self.update_task_state(
                        new_task_state=c.TASK_STATE_FAILED,
                        task_state_message=logmsg.PLAYBOOK_ERROR.format(e))
                    Tools.emit_log(task_name=self.task_name,
                                   sample_device=self.sample_device,
                                   message=logmsg.PLAYBOOK_ERROR.format(e))
                    return

                finally:
                    if tqm is not None:
                        tqm.cleanup()
            else:
                self.update_task_state(
                    new_task_state=c.TASK_STATE_FAILED,
                    task_state_message=logmsg.ERROR_DEV_CFG_FILE)
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.ERROR_DEV_TEMPLATE_FILE.format(
                                   template_file))
        else:
            self.update_task_state(
                new_task_state=c.TASK_STATE_FAILED,
                task_state_message=logmsg.ERROR_DEV_CFG_FILE)
            Tools.emit_log(
                task_name=self.task_name,
                sample_device=self.sample_device,
                message=logmsg.ERROR_DEV_CFG_FILE.format(dev_data_file))
            return
예제 #17
0
    def run_task(self):

        a = AuthOptions({'authoritative_source': 'yapt'})

        pynipap.xmlrpc_uri = "http://{0}:{1}@{2}:{3}/XMLRPC".format(
            self.grp_cfg.TASKS.Provision.Ipam.User,
            self.grp_cfg.TASKS.Provision.Ipam.Password,
            self.grp_cfg.TASKS.Provision.Ipam.Address,
            self.grp_cfg.TASKS.Provision.Ipam.Port)

        for prefix in self.grp_cfg.TASKS.Provision.Ipam.Prefixes:

            try:
                p = Prefix.find_free(None, {
                    'from-prefix': [prefix],
                    'prefix_length': 32
                })

            except socket.error as se:
                self.update_task_state(
                    new_task_state=c.TASK_STATE_FAILED,
                    task_state_message=logmsg.IPAM_CONN_ERR.format(
                        se.strerror))
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.IPAM_CONN_ERR.format(
                                   se.strerror))

                return
            except NipapAuthenticationError as nae:
                self.update_task_state(
                    new_task_state=c.TASK_STATE_FAILED,
                    task_state_message=logmsg.IPAM_CONN_ERR.format(
                        nae.message))
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.IPAM_CONN_ERR.format(
                                   nae.message))

                return

            if p:
                self.shared[c.TASK_SHARED_IPAM].append(p)
                new_prefix = Prefix()
                new_prefix.prefix = p[0]
                new_prefix.type = 'host'
                new_prefix.description = self.sample_device.deviceSerial

                try:
                    new_prefix.save()
                    self.update_task_state(
                        new_task_state=c.TASK_STATE_DONE,
                        task_state_message=c.TASK_STATE_MSG_DONE)
                    Tools.emit_log(
                        task_name=self.task_name,
                        task_state={
                            'taskState': self.task_state,
                            'taskStateMsg': c.TASK_STATE_MSG_DONE
                        },
                        sample_device=self.sample_device,
                        grp_cfg=self.grp_cfg,
                        shared=self.shared,
                        scope=c.LOGGER_SCOPE_ALL,
                        level=c.LOGGER_LEVEL_INFO,
                        message=logmsg.IPAM_PREFIX_OK.format(prefix))

                except NipapValueError as nve:
                    self.update_task_state(
                        new_task_state=c.TASK_STATE_FAILED,
                        task_state_message=logmsg.IPAM_PREFIX_ERR.format(
                            nve.message))
                    Tools.emit_log(task_name=self.task_name,
                                   sample_device=self.sample_device,
                                   message=logmsg.IPAM_PREFIX_ERR.format(
                                       nve.message))

            else:
                self.update_task_state(
                    new_task_state=c.TASK_STATE_FAILED,
                    task_state_message=logmsg.IPAM_PREFIX_FULL.format(prefix))
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.IPAM_PREFIX_FULL.format(prefix))
예제 #18
0
    def do_cert_requests(self, datavars=None, event=None, cancel_chan=None):

        # Do time sync before getting certs
        req0 = 'set date ntp {0}'.format(datavars['device']['ntp_server'])

        req1 = 'request security pki ca-certificate enroll ca-profile ' + datavars[
            'device']['cert']['ca_profile']

        req2 = 'request security pki ca-certificate verify ca-profile ' + datavars[
            'device']['cert']['ca_profile']

        req3 = 'request security pki generate-key-pair certificate-id ' + datavars['device']['hostname'] \
               + ' size 2048 type rsa'

        req4 = 'request security pki local-certificate enroll ca-profile ' + datavars['device']['cert'][
            'ca_profile'] \
               + ' certificate-id ' + datavars['device']['hostname'] + ' domain-name ' + \
               datavars['device']['cert']['domain_name'] \
               + ' subject ' + datavars['device']['cert']['subject'] + ' challenge-password ' \
               + datavars['device']['cert']['challenge_password']

        pattern = r'(error):\s.*'
        regex = re.compile(pattern, re.MULTILINE)

        if event is not None:
            event.wait()

        self.update_task_state(new_task_state=c.TASK_STATE_PROGRESS,
                               task_state_message='Request Time Sync')
        Tools.emit_log(task_name=self.task_name,
                       sample_device=self.sample_device,
                       message=logmsg.CERT_ISSUE_CMD.format(req0))
        resp = self.sample_device.deviceConnection.cli(command=req0,
                                                       format='text',
                                                       warning=False)
        Tools.emit_log(task_name=self.task_name,
                       sample_device=self.sample_device,
                       message=logmsg.CERT_ISSUE_CMD_RESP.format(req0, resp))

        try:
            self.update_task_state(new_task_state=c.TASK_STATE_PROGRESS,
                                   task_state_message='Request CA Cert')
            Tools.emit_log(task_name=self.task_name,
                           sample_device=self.sample_device,
                           message=logmsg.CERT_ISSUE_CMD.format(req1))
            resp = self.sample_device.deviceConnection.cli(command=req1,
                                                           format='text',
                                                           warning=False)
            Tools.emit_log(task_name=self.task_name,
                           sample_device=self.sample_device,
                           message=logmsg.CERT_ISSUE_CMD_RESP.format(
                               req1, resp))
            status = re.findall(regex, resp)

            if len(status) > 0 and status[0] == 'error':
                self.update_task_state(new_task_state=c.TASK_STATE_FAILED,
                                       task_state_message=resp)
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=resp)
                return

            else:
                self.update_task_state(new_task_state=c.TASK_STATE_PROGRESS,
                                       task_state_message='Verify CA Cert')
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.CERT_ISSUE_CMD.format(req2))
                resp = self.sample_device.deviceConnection.cli(command=req2,
                                                               format='text',
                                                               warning=False)
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.CERT_ISSUE_CMD_RESP.format(
                                   req2, resp))
                status = re.findall(regex, resp)

                if len(status) > 0 and status[0] == 'error':
                    self.update_task_state(new_task_state=c.TASK_STATE_FAILED,
                                           task_state_message=status)
                    Tools.emit_log(task_name=self.task_name,
                                   sample_device=self.sample_device,
                                   message=status)
                    return

                else:
                    self.update_task_state(
                        new_task_state=c.TASK_STATE_PROGRESS,
                        task_state_message='Generate local keys')
                    Tools.emit_log(task_name=self.task_name,
                                   sample_device=self.sample_device,
                                   message=logmsg.CERT_ISSUE_CMD.format(req3))
                    resp = self.sample_device.deviceConnection.cli(
                        command=req3, format='text', warning=False)
                    Tools.emit_log(task_name=self.task_name,
                                   sample_device=self.sample_device,
                                   message=logmsg.CERT_ISSUE_CMD_RESP.format(
                                       req3, resp))
                    status = re.findall(regex, resp)

                    if len(status) > 0 and status[0] == 'error':
                        self.update_task_state(
                            new_task_state=c.TASK_STATE_FAILED,
                            task_state_message=status)
                        Tools.emit_log(task_name=self.task_name,
                                       sample_device=self.sample_device,
                                       message=status)
                        return

                    else:
                        self.update_task_state(
                            new_task_state=c.TASK_STATE_PROGRESS,
                            task_state_message='Request local cert')
                        Tools.emit_log(
                            task_name=self.task_name,
                            sample_device=self.sample_device,
                            message=logmsg.CERT_ISSUE_CMD.format(req4))
                        resp = self.sample_device.deviceConnection.cli(
                            command=req4, format='text', warning=False)
                        Tools.emit_log(
                            task_name=self.task_name,
                            sample_device=self.sample_device,
                            message=logmsg.CERT_ISSUE_CMD_RESP.format(
                                req4, resp))
                        status = re.findall(regex, resp)

                        if len(status) > 0 and status[0] == 'error':
                            self.update_task_state(
                                new_task_state=c.TASK_STATE_FAILED,
                                task_state_message=status)
                            Tools.emit_log(task_name=self.task_name,
                                           sample_device=self.sample_device,
                                           message=status)
                            return

                        else:
                            self.update_task_state(
                                new_task_state=c.TASK_STATE_DONE,
                                task_state_message=c.TASK_STATE_MSG_DONE)
                            Tools.emit_log(task_name=self.task_name,
                                           task_state={
                                               'taskState':
                                               self.task_state,
                                               'taskStateMsg':
                                               c.TASK_STATE_MSG_DONE
                                           },
                                           sample_device=self.sample_device,
                                           grp_cfg=self.grp_cfg,
                                           shared=self.shared,
                                           message=c.TASK_STATE_MSG_DONE,
                                           scope=c.LOGGER_SCOPE_ALL,
                                           level=c.LOGGER_LEVEL_INFO)
                            time.sleep(5)

                            if cancel_chan is not None:
                                cancel_chan.cancel()

        except (RPCError, TimeoutExpiredError) as err:
            self.logger.info(
                Tools.create_log_msg(
                    self.task_name, self.sample_device.deviceSerial,
                    logmsg.CERT_ISSUE_CMD_NOK.format(req0, err.message)))
            self.sample_device.deviceTasks.taskState[
                self.task_name] = err.message
예제 #19
0
파일: task.py 프로젝트: darkisildur/YAPT
    def update_task_state(self,
                          new_task_state=c.TASK_STATE_INIT,
                          task_state_message='empty'):

        Tools.emit_log(
            task_name=self.task_name,
            sample_device=self.sample_device,
            message='Current task state <{0}> --> New task state <{1}>'.format(
                self.task_state, new_task_state),
            level=c.LOGGER_LEVEL_DEBUG)

        if getattr(self, 'TASK_DESCENT', None):
            task_name = self.TASK_DESCENT
        else:
            task_name = self.task_name

        if new_task_state == c.TASK_STATE_DONE:

            if task_name == self.grp_cfg.TASKS.Sequence[-1:][0]:

                self.task_state = new_task_state
                self.sample_device.deviceStatus = c.DEVICE_STATUS_DONE
                self.task_progress = self.shared[c.TASK_SHARED_PROGRESS]
                self._update_backend()
                self.sample_device.deviceTasks.taskState[task_name] = {
                    'taskState': new_task_state,
                    'taskStateMsg': task_state_message
                }
            else:

                self.task_state = new_task_state
                self.sample_device.deviceStatus = c.DEVICE_STATUS_NEXT_TASK
                self.task_progress = self.shared[c.TASK_SHARED_PROGRESS]
                self._update_backend()
                self.sample_device.deviceTasks.taskState[task_name] = {
                    'taskState': new_task_state,
                    'taskStateMsg': task_state_message
                }

        elif new_task_state == c.TASK_STATE_FAILED:
            self.task_state = new_task_state
            self.sample_device.deviceStatus = c.DEVICE_STATUS_FAILED
            self._update_backend()
            self.sample_device.deviceTasks.taskState[task_name] = {
                'taskState': new_task_state,
                'taskStateMsg': task_state_message
            }

        elif new_task_state == c.TASK_STATE_REBOOTING:
            self.task_state = new_task_state
            self.sample_device.deviceStatus = c.DEVICE_STATUS_REBOOTED
            self._update_backend()
            self.sample_device.deviceTasks.taskState[task_name] = {
                'taskState': new_task_state,
                'taskStateMsg': task_state_message
            }

        elif new_task_state == c.TASK_STATE_PROGRESS:
            self.task_state = new_task_state
            self.sample_device.deviceStatus = c.DEVICE_STATUS_PROGRESS
            self._update_backend()
            self.sample_device.deviceTasks.taskState[task_name] = {
                'taskState': new_task_state,
                'taskStateMsg': task_state_message
            }

        else:
            Tools.emit_log(task_name=self.task_name,
                           sample_device=self.sample_device,
                           message='Unknown task state <{0}>'.format(
                               self.task_state))
예제 #20
0
파일: filecp.py 프로젝트: darkisildur/YAPT
    def run_task(self):
        Tools.emit_log(task_name=self.task_name,
                       sample_device=self.sample_device,
                       message=logmsg.CP_INIT.format(
                           self.grp_cfg.TASKS.Provision.Filecp.Files))

        if self.sample_device.deviceConnection.connected:

            try:
                if c.SERVICEPLUGIN_OSSH == self.sample_device.deviceServicePlugin:
                    with SCPClient(self.sample_device.deviceConnection._conn.
                                   _session.transport) as scp:
                        for _file in self.grp_cfg.TASKS.Provision.Filecp.Files:
                            self.update_task_state(
                                new_task_state=c.TASK_STATE_PROGRESS,
                                task_state_message=logmsg.CP_COPY.format(
                                    _file))
                            Tools.emit_log(
                                task_name=self.task_name,
                                sample_device=self.sample_device,
                                message=logmsg.CP_COPY.format(_file))
                            scp.put(
                                self.grp_cfg.TASKS.Provision.Filecp.
                                FileLocalDir + _file, self.grp_cfg.TASKS.
                                Provision.Filecp.FileRemoteDir)
                            Tools.emit_log(
                                task_name=self.task_name,
                                task_state={
                                    'taskState': self.task_state,
                                    'taskStateMsg': c.TASK_STATE_MSG_DONE
                                },
                                sample_device=self.sample_device,
                                grp_cfg=self.grp_cfg,
                                shared=self.shared,
                                message=logmsg.CP_SUCCESS.format(_file),
                                scope=c.LOGGER_SCOPE_ALL,
                                level=c.LOGGER_LEVEL_INFO)
                            self.update_task_state(
                                new_task_state=c.TASK_STATE_DONE,
                                task_state_message=c.TASK_STATE_MSG_DONE)
                else:
                    with SCP(self.sample_device.deviceConnection,
                             progress=False) as scp:
                        for _file in self.grp_cfg.TASKS.Provision.Filecp.Files:
                            self.update_task_state(
                                new_task_state=c.TASK_STATE_PROGRESS,
                                task_state_message=logmsg.CP_COPY.format(
                                    _file))
                            Tools.emit_log(
                                task_name=self.task_name,
                                sample_device=self.sample_device,
                                message=logmsg.CP_COPY.format(_file))
                            scp.put(
                                self.grp_cfg.TASKS.Provision.Filecp.
                                FileLocalDir + _file, self.grp_cfg.TASKS.
                                Provision.Filecp.FileRemoteDir)
                            Tools.emit_log(
                                task_name=self.task_name,
                                task_state={
                                    'taskState': self.task_state,
                                    'taskStateMsg': c.TASK_STATE_MSG_DONE
                                },
                                sample_device=self.sample_device,
                                grp_cfg=self.grp_cfg,
                                shared=self.shared,
                                message=logmsg.CP_SUCCESS.format(_file),
                                scope=c.LOGGER_SCOPE_ALL,
                                level=c.LOGGER_LEVEL_INFO)
                            self.update_task_state(
                                new_task_state=c.TASK_STATE_DONE,
                                task_state_message=c.TASK_STATE_MSG_DONE)

            except (paramiko.BadHostKeyException,
                    paramiko.AuthenticationException) as e:
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.CP_FAILED.format(e.message))
                self.update_task_state(
                    new_task_state=c.TASK_STATE_FAILED,
                    task_state_message=logmsg.CP_FAILED.format(e.message))
        else:
            Tools.emit_log(task_name=self.task_name,
                           sample_device=self.sample_device,
                           message=logmsg.CP_FAILED_NO_CONN)
            self.update_task_state(new_task_state=c.TASK_STATE_FAILED,
                                   task_state_message=logmsg.CP_FAILED_NO_CONN)
예제 #21
0
    def run_task(self):
        """
        Provision device config

        :param sample_device: A device object for which the config provisioning should be done
        :return:
        """
        Tools.emit_log(task_name=self.task_name,
                       sample_device=self.sample_device,
                       message=logmsg.CONF_TASK_INIT.format(
                           self.sample_device.deviceSerial))
        configurator = Configuration()
        resp = configurator.prepare_device_config(
            sample_device=self.sample_device)

        if resp['status']:

            self._device_config_file = resp['configfilename']

            if self.sample_device.deviceConnection.connected:

                # Lock the configuration, load configuration changes, and commit
                self.update_task_state(
                    new_task_state=c.TASK_STATE_PROGRESS,
                    task_state_message=logmsg.CONF_TASK_LOCK)
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.CONF_TASK_LOCK)

                try:

                    self.sample_device.deviceConnection.cu.lock()
                    self.update_task_state(
                        new_task_state=c.TASK_STATE_PROGRESS,
                        task_state_message=logmsg.CONF_TASK_LOCK_OK)
                    Tools.emit_log(task_name=self.task_name,
                                   sample_device=self.sample_device,
                                   message=logmsg.CONF_TASK_LOCK_OK)

                except LockError as err:
                    self.update_task_state(
                        new_task_state=c.TASK_STATE_FAILED,
                        task_state_message=logmsg.CONF_TASK_LOCK_NOK.format(
                            err.message))
                    Tools.emit_log(task_name=self.task_name,
                                   sample_device=self.sample_device,
                                   message=logmsg.CONF_TASK_LOCK_NOK.format(
                                       err.message))

                    return

                self.update_task_state(
                    new_task_state=c.TASK_STATE_PROGRESS,
                    task_state_message=logmsg.CONF_TASK_LOAD)
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.CONF_TASK_LOAD)

                try:

                    self.sample_device.deviceConnection.cu.load(
                        path=self.grp_cfg.TASKS.Provision.Configuration.
                        ConfigFileHistory + self._device_config_file,
                        merge=self.grp_cfg.TASKS.Provision.Configuration.Merge,
                        overwrite=self.grp_cfg.TASKS.Provision.Configuration.
                        Overwrite)

                except (ConfigLoadError, ValueError, Exception) as err:
                    Tools.emit_log(
                        task_name=self.task_name,
                        sample_device=self.sample_device,
                        message=logmsg.CONF_TASK_LOAD_NOK.format(err))
                    self.update_task_state(
                        new_task_state=c.TASK_STATE_FAILED,
                        task_state_message=logmsg.CONF_TASK_LOAD_NOK.format(
                            err))
                    Tools.emit_log(task_name=self.task_name,
                                   sample_device=self.sample_device,
                                   message=logmsg.CONF_TASK_UNLOCK)

                    try:

                        self.sample_device.deviceConnection.cu.unlock()
                        self.update_task_state(
                            new_task_state=c.TASK_STATE_PROGRESS,
                            task_state_message=logmsg.CONF_TASK_UNLOCK_OK)
                        Tools.emit_log(task_name=self.task_name,
                                       sample_device=self.sample_device,
                                       message=logmsg.CONF_TASK_UNLOCK_OK)

                    except UnlockError:
                        self.update_task_state(
                            new_task_state=c.TASK_STATE_FAILED,
                            task_state_message=logmsg.CONF_TASK_UNLOCK_NOK.
                            format(err))
                        Tools.emit_log(
                            task_name=self.task_name,
                            sample_device=self.sample_device,
                            message=logmsg.CONF_TASK_UNLOCK_NOK.format(err))

                    return

                self.update_task_state(
                    new_task_state=c.TASK_STATE_PROGRESS,
                    task_state_message=logmsg.CONF_TASK_COMMIT)
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.CONF_TASK_COMMIT)

                try:

                    self.sample_device.deviceConnection.cu.commit(
                        timeout=self.grp_cfg.TASKS.Provision.Configuration.
                        Internal.CommitTimeout,
                        comment='Commit by YAPT at {0}'.format(
                            datetime.datetime.now().strftime('%Y-%m-%d-%H%M')),
                        confirm=int(self.grp_cfg.TASKS.Provision.Configuration.
                                    Internal.ConfirmedTimeout))
                    self.sample_device.deviceConnection.cu.commit(
                        timeout=self.grp_cfg.TASKS.Provision.Configuration.
                        Internal.CommitTimeout,
                        comment='Commit confirmed by YAPT at {0}'.format(
                            datetime.datetime.now().strftime('%Y-%m-%d-%H%M')))

                    if not self.sample_device.deviceModel.startswith('NFX'):
                        self.sample_device.deviceConnection.cu.rescue('save')

                except (CommitError, ConnectClosedError, RpcTimeoutError,
                        TimeoutExpiredError) as err:

                    self.update_task_state(
                        new_task_state=c.TASK_STATE_PROGRESS,
                        task_state_message=logmsg.CONF_TASK_COMMIT_NOK.format(
                            err.message))
                    Tools.emit_log(task_name=self.task_name,
                                   sample_device=self.sample_device,
                                   message=logmsg.CONF_TASK_COMMIT_NOK.format(
                                       err.message))
                    Tools.emit_log(task_name=self.task_name,
                                   sample_device=self.sample_device,
                                   message=logmsg.CONF_TASK_UNLOCK)

                    try:

                        self.sample_device.deviceConnection.cu.unlock()
                        self.update_task_state(
                            new_task_state=c.TASK_STATE_FAILED,
                            task_state_message=c.TASK_STATE_MSG_FAILED)
                        Tools.emit_log(task_name=self.task_name,
                                       sample_device=self.sample_device,
                                       message=logmsg.CONF_TASK_UNLOCK_OK)

                    except (UnlockError, ConnectClosedError) as err:
                        self.update_task_state(
                            new_task_state=c.TASK_STATE_FAILED,
                            task_state_message=c.TASK_STATE_MSG_FAILED)
                        Tools.emit_log(
                            task_name=self.task_name,
                            sample_device=self.sample_device,
                            message=logmsg.CONF_TASK_UNLOCK_NOK.format(
                                err.message))
                    return

                self.update_task_state(
                    new_task_state=c.TASK_STATE_PROGRESS,
                    task_state_message=logmsg.CONF_TASK_UNLOCK)
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.CONF_TASK_UNLOCK)

                try:
                    self.sample_device.deviceConnection.cu.unlock()
                    self.update_task_state(
                        new_task_state=c.TASK_STATE_PROGRESS,
                        task_state_message=logmsg.CONF_TASK_UNLOCK_OK)
                    self.logger.info(
                        Tools.create_log_msg(self.task_name,
                                             self.sample_device.deviceSerial,
                                             logmsg.CONF_TASK_UNLOCK_OK))

                except UnlockError as err:
                    self.update_task_state(
                        new_task_state=c.TASK_STATE_FAILED,
                        task_state_message=logmsg.CONF_TASK_UNLOCK_NOK.format(
                            err.message))
                    Tools.emit_log(task_name=self.task_name,
                                   sample_device=self.sample_device,
                                   message=logmsg.CONF_TASK_UNLOCK_NOK.format(
                                       err.message))
                    return

                # If refreshing facts on NFX it needs more time doing so after configuration commit
                if self.sample_device.deviceModel.startswith('NFX'):
                    time.sleep(15)
                self.sample_device.deviceConnection.facts_refresh(
                    keys='hostname')
                self.sample_device.deviceName = self.sample_device.deviceConnection.facts[
                    'hostname']
                self.update_task_state(
                    new_task_state=c.TASK_STATE_DONE,
                    task_state_message=c.TASK_STATE_MSG_DONE)
                Tools.emit_log(task_name=self.task_name,
                               task_state={
                                   'taskState': self.task_state,
                                   'taskStateMsg': c.TASK_STATE_MSG_DONE
                               },
                               sample_device=self.sample_device,
                               grp_cfg=self.grp_cfg,
                               shared=self.shared,
                               message=logmsg.CONF_TASK_COMMIT_OK.format(
                                   self._device_config_file),
                               scope=c.LOGGER_SCOPE_ALL,
                               level=c.LOGGER_LEVEL_INFO)

            else:
                self.update_task_state(
                    new_task_state=c.TASK_STATE_FAILED,
                    task_state_message=logmsg.CONF_TASK_CONN_NOK.format(
                        self.sample_device.deviceSerial))
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.CONF_TASK_CONN_NOK.format(
                                   self.sample_device.deviceSerial))

        else:
            self.update_task_state(
                new_task_state=c.TASK_STATE_FAILED,
                task_state_message=logmsg.CONF_TASK_CFG_TEMPLATE_ERROR.format(
                    '', '', resp['configfilename']))
            Tools.emit_log(task_name=self.task_name,
                           sample_device=self.sample_device,
                           message=logmsg.CONF_TASK_CFG_TEMPLATE_ERROR.format(
                               '', '', resp['configfilename']))
예제 #22
0
파일: ticket.py 프로젝트: darkisildur/YAPT
    def run_sum_mode(self):

        Tools.emit_log(task_name=self.task_name,
                       sample_device=self.sample_device,
                       message=logmsg.TICKET_INIT.format(
                           self.sample_device.deviceSerial,
                           self.grp_cfg.TASKS.Provision.Ticket.Mode))
        url = '{0}://{1}:{2}/login'.format(
            self.grp_cfg.TASKS.Provision.Ticket.Protocol,
            self.grp_cfg.TASKS.Provision.Ticket.Address,
            self.grp_cfg.TASKS.Provision.Ticket.Port)

        session = requests.Session()

        data = {
            'username': "******".format(self.grp_cfg.TASKS.Provision.Ticket.User),
            'password':
            "******".format(self.grp_cfg.TASKS.Provision.Ticket.Password),
            'eauth': "{0}".format(self.grp_cfg.TASKS.Provision.Ticket.Eauth),
        }

        Tools.emit_log(task_name=self.task_name,
                       sample_device=self.sample_device,
                       message=logmsg.TICKET_CONN_INIT.format(url))

        resp = None

        try:

            resp = session.post(url, json=data, verify=False)

        except ConnectionError as cer:

            self.update_task_state(new_task_state=c.TASK_STATE_FAILED,
                                   task_state_message=c.TASK_STATE_MSG_FAILED)
            Tools.emit_log(task_name=self.task_name,
                           sample_device=self.sample_device,
                           message=cer.message)

        if resp is not None:

            if resp.status_code == 200:
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.TICKET_CONN_OK.format(url))

                try:
                    env = Environment(
                        autoescape=False,
                        loader=FileSystemLoader(
                            self.grp_cfg.TASKS.Provision.Ticket.TemplateDir),
                        trim_blocks=True,
                        lstrip_blocks=True)
                    self.update_task_state(
                        new_task_state=c.TASK_STATE_PROGRESS,
                        task_state_message='Found template <{0}>)'.format(
                            self.grp_cfg.TASKS.Provision.Ticket.
                            TicketCreateTemplate))
                    Tools.emit_log(
                        task_name=self.task_name,
                        sample_device=self.sample_device,
                        message='Found template directory <{0}>'.format(
                            self.grp_cfg.TASKS.Provision.Ticket.TemplateDir))

                except TemplateNotFound as err:

                    self.update_task_state(
                        new_task_state=c.TASK_STATE_FAILED,
                        task_state_message=
                        'Error in getting template directory <{0}>'.format(
                            err.message))
                    Tools.emit_log(
                        task_name=self.task_name,
                        sample_device=self.sample_device,
                        message='Error in getting template directory <{0}>'.
                        format(err.message))
                    return

                try:
                    template = env.get_template(self.grp_cfg.TASKS.Provision.
                                                Ticket.TicketCreateTemplate)
                    tasks = collections.OrderedDict()

                    for task in self.grp_cfg.TASKS.Sequence:
                        tasks[task] = self.sample_device.deviceTasks.taskState[
                            task]

                    ticket_created = template.render(
                        deviceSerial=self.sample_device.deviceSerial,
                        deviceName=self.sample_device.deviceName,
                        deviceModel=self.sample_device.deviceModel,
                        deviceGroup=self.sample_device.deviceGroup,
                        deviceStatus=self.sample_device.deviceStatus,
                        lastSeen=self.sample_device.deviceTimeStamp,
                        tasks=tasks)

                    self.update_task_state(
                        new_task_state=c.TASK_STATE_PROGRESS,
                        task_state_message=
                        'Successfully rendered template <{0}>'.format(
                            self.grp_cfg.TASKS.Provision.Ticket.
                            TicketCreateTemplate))
                    Tools.emit_log(
                        task_name=self.task_name,
                        sample_device=self.sample_device,
                        message='Successfully rendered template <{0}>'.format(
                            self.grp_cfg.TASKS.Provision.Ticket.
                            TicketCreateTemplate))

                except TemplateNotFound as err:

                    self.update_task_state(
                        new_task_state=c.TASK_STATE_FAILED,
                        task_state_message=
                        'Error in getting template file <{0}{1}>'.format(
                            self.grp_cfg.TASKS.Provision.Ticket.TemplateDir,
                            err.message))
                    Tools.emit_log(
                        task_name=self.task_name,
                        sample_device=self.sample_device,
                        message='Error in getting template file <{0}{1}>'.
                        format(self.grp_cfg.TASKS.Provision.Ticket.TemplateDir,
                               err.message))
                    return

                data = {
                    "client":
                    "runner",
                    "fun":
                    "{0}".format(
                        self.grp_cfg.TASKS.Provision.Ticket.Functions[0]),
                    "subject":
                    "YAPT new provisioning device <{0}>".format(
                        self.sample_device.deviceSerial),
                    "text":
                    ticket_created,
                    "next_event":
                    "{0}".format(
                        self.grp_cfg.TASKS.Provision.Ticket.NextEvent),
                    "data":
                    dict()
                }

                url = '{0}://{1}:{2}/'.format(
                    self.grp_cfg.TASKS.Provision.Ticket.Protocol,
                    self.grp_cfg.TASKS.Provision.Ticket.Address,
                    self.grp_cfg.TASKS.Provision.Ticket.Port)

                resp = None

                try:
                    resp = session.post(url, json=data, verify=False)

                except ConnectionError as cer:
                    self.update_task_state(
                        new_task_state=c.TASK_STATE_FAILED,
                        task_state_message=c.TASK_STATE_MSG_FAILED)
                    Tools.emit_log(task_name=self.task_name,
                                   sample_device=self.sample_device,
                                   message=cer.message)

                if resp is not None:
                    if resp.status_code == 200:

                        data = resp.json()
                        self.shared[c.TASK_SHARED_TICKET] = data['return'][0][
                            'ticket_id']
                        url = '{0}://{1}:{2}/logout'.format(
                            self.grp_cfg.TASKS.Provision.Ticket.Protocol,
                            self.grp_cfg.TASKS.Provision.Ticket.Address,
                            self.grp_cfg.TASKS.Provision.Ticket.Port)
                        resp = session.post(url, verify=False)

                        if resp.status_code == 200:

                            self.update_task_state(
                                new_task_state=c.TASK_STATE_DONE,
                                task_state_message=c.TASK_STATE_MSG_DONE)
                            Tools.emit_log(
                                task_name=self.task_name,
                                task_state={
                                    self.task_name:
                                    self.sample_device.deviceTasks.taskState[
                                        self.task_name]
                                },
                                sample_device=self.sample_device,
                                grp_cfg=self.grp_cfg,
                                shared=self.shared,
                                message=logmsg.TICKET_CREATE_OK.format(
                                    self.shared[c.TASK_SHARED_TICKET]),
                                scope=c.LOGGER_SCOPE_ALL,
                                level=c.LOGGER_LEVEL_INFO)

                        else:
                            self.update_task_state(
                                new_task_state=c.TASK_STATE_FAILED,
                                task_state_message=logmsg.TICKET_CREATE_NOK.
                                format(self.shared[c.TASK_SHARED_TICKET],
                                       resp.status_code))
                            Tools.emit_log(
                                task_name=self.task_name,
                                sample_device=self.sample_device,
                                message=logmsg.TICKET_CREATE_NOK.format(
                                    self.shared[c.TASK_SHARED_TICKET],
                                    resp.status_code))

                    else:
                        self.update_task_state(
                            new_task_state=c.TASK_STATE_FAILED,
                            task_state_message=logmsg.TICKET_CREATE_NOK.format(
                                self.shared[c.TASK_SHARED_TICKET],
                                resp.status_code))
                        Tools.emit_log(task_name=self.task_name,
                                       sample_device=self.sample_device,
                                       message=logmsg.TICKET_CREATE_NOK.format(
                                           self.shared[c.TASK_SHARED_TICKET],
                                           resp.status_code))

            else:
                self.update_task_state(
                    new_task_state=c.TASK_STATE_FAILED,
                    task_state_message=logmsg.TICKET_CONN_NOK.format(
                        url, resp.status_code))
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.TICKET_CONN_NOK.format(
                                   url, resp.status_code))
예제 #23
0
    def run_task(self):
        """
        Provision device images

        :param sample_device: A device object for which the image provisioning should be done
        :return:
        """

        target_version = getattr(
            self.grp_cfg.TASKS.Provision.Software.TargetVersion,
            self.sample_device.deviceModel, None)

        if self.sample_device.deviceStatus == c.DEVICE_STATUS_REBOOTED:

            # Device has been rebooted do not update again
            Tools.emit_log(task_name=self.task_name,
                           sample_device=self.sample_device,
                           message=logmsg.SW_INSTALLED_VERS.format(
                               self.sample_device.softwareVersion))
            Tools.emit_log(
                task_name=self.task_name,
                sample_device=self.sample_device,
                message=logmsg.SW_TARGET_VERS.format(target_version))
            Tools.emit_log(task_name=self.task_name,
                           sample_device=self.sample_device,
                           message=logmsg.SW_NO_UPDATE_NEEDED_SAME)
            self.sample_device.deviceIsRebooted = False
            self.update_task_state(new_task_state=c.TASK_STATE_DONE,
                                   task_state_message=c.TASK_STATE_MSG_DONE)

        else:

            Tools.emit_log(task_name=self.task_name,
                           sample_device=self.sample_device,
                           message=logmsg.SW_START_UPDATE.format(
                               self.sample_device.deviceSerial))
            SoftwareTask.sample_devices = {
                self.sample_device.deviceSerial: self.sample_device
            }

            if target_version is not None:
                feedback = Software.compare_device_vers_with_target_vers(
                    self.sample_device.softwareVersion, target_version)

                if feedback == 0:
                    self.update_task_state(
                        new_task_state=c.TASK_STATE_DONE,
                        task_state_message=logmsg.SW_DONE_SAME_VERS)
                    Tools.emit_log(task_name=self.task_name,
                                   sample_device=self.sample_device,
                                   message=logmsg.SW_INSTALLED_VERS.format(
                                       self.sample_device.softwareVersion))
                    Tools.emit_log(
                        task_name=self.task_name,
                        sample_device=self.sample_device,
                        message=logmsg.SW_TARGET_VERS.format(target_version))
                    Tools.emit_log(task_name=self.task_name,
                                   task_state={
                                       'taskState': self.task_state,
                                       'taskStateMsg': logmsg.SW_DONE_SAME_VERS
                                   },
                                   sample_device=self.sample_device,
                                   grp_cfg=self.grp_cfg,
                                   shared=self.shared,
                                   scope=c.LOGGER_SCOPE_ALL,
                                   level=c.LOGGER_LEVEL_INFO,
                                   message=logmsg.SW_NO_UPDATE_NEEDED_SAME)

                elif feedback == 1:
                    self.update_task_state(
                        new_task_state=c.TASK_STATE_DONE,
                        task_state_message=logmsg.SW_DONE_DEV_NEWER_VERS)
                    Tools.emit_log(task_name=self.task_name,
                                   sample_device=self.sample_device,
                                   message=logmsg.SW_INSTALLED_VERS.format(
                                       self.sample_device.softwareVersion))
                    Tools.emit_log(
                        task_name=self.task_name,
                        sample_device=self.sample_device,
                        message=logmsg.SW_TARGET_VERS.format(target_version))
                    Tools.emit_log(task_name=self.task_name,
                                   task_state={
                                       'taskState':
                                       self.task_state,
                                       'taskStateMsg':
                                       logmsg.SW_DONE_DEV_NEWER_VERS
                                   },
                                   sample_device=self.sample_device,
                                   grp_cfg=self.grp_cfg,
                                   shared=self.shared,
                                   scope=c.LOGGER_SCOPE_ALL,
                                   level=c.LOGGER_LEVEL_INFO,
                                   message=logmsg.SW_NO_UPDATE_NEEDED_NEWER)

                else:
                    Tools.emit_log(task_name=self.task_name,
                                   sample_device=self.sample_device,
                                   message=logmsg.SW_INSTALLED_VERS.format(
                                       self.sample_device.softwareVersion))
                    Tools.emit_log(
                        task_name=self.task_name,
                        sample_device=self.sample_device,
                        message=logmsg.SW_TARGET_VERS.format(target_version))
                    Tools.emit_log(task_name=self.task_name,
                                   sample_device=self.sample_device,
                                   message=logmsg.SW_UPDATE_NEEDED.format(
                                       self.sample_device.softwareVersion,
                                       target_version))
                    filename = Software.get_software_image_name(
                        self.sample_device,
                        target_version,
                        grp_cfg=self.grp_cfg)

                    if filename:

                        full_path = self.grp_cfg.TASKS.Provision.Software.ImageDir + filename

                        if self.sample_device.deviceConnection.connected:

                            self.sample_device = self.install_device_software(
                                full_path, filename, target_version)

                            if self.sample_device is not None:

                                if self.task_state != c.TASK_STATE_FAILED and self.task_state != c.TASK_STATE_REBOOTING:

                                    if self.sample_device.deviceConnection is not None:

                                        self.sample_device.deviceConnection.facts_refresh(
                                            keys='version')
                                        self.sample_device.softwareVersion = self.sample_device.deviceConnection.facts[
                                            "version"]
                                        self.update_task_state(
                                            new_task_state=c.TASK_STATE_DONE,
                                            task_state_message=c.
                                            TASK_STATE_MSG_DONE)
                                        Tools.emit_log(
                                            task_name=self.task_name,
                                            task_state={
                                                'taskState':
                                                self.task_state,
                                                'taskStateMsg':
                                                c.TASK_STATE_MSG_DONE
                                            },
                                            sample_device=self.sample_device,
                                            grp_cfg=self.grp_cfg,
                                            shared=self.shared,
                                            scope=c.LOGGER_SCOPE_ALL,
                                            level=c.LOGGER_LEVEL_INFO,
                                            message=logmsg.
                                            SW_NO_UPDATE_NEEDED_SAME)
                                    else:

                                        Tools.emit_log(
                                            task_name=self.task_name,
                                            sample_device=self.sample_device,
                                            message=logmsg.SW_CONN_NOK.format(
                                                self.sample_device.deviceIP))
                                        self.update_task_state(
                                            new_task_state=c.TASK_STATE_FAILED,
                                            task_state_message=c.
                                            TASK_STATE_MSG_FAILED)
                                        return

                                else:
                                    return

                            else:
                                Tools.emit_log(
                                    task_name=self.task_name,
                                    sample_device=self.sample_device,
                                    message=logmsg.SW_CONN_NOK.format(
                                        self.sample_device.deviceIP))
                                self.update_task_state(
                                    new_task_state=c.TASK_STATE_FAILED,
                                    task_state_message=logmsg.SW_CONN_NOK.
                                    format(self.sample_device.deviceIP))

                        else:
                            Tools.emit_log(task_name=self.task_name,
                                           sample_device=self.sample_device,
                                           message=logmsg.SW_CONN_NOK.format(
                                               self.sample_device.deviceIP))
                            self.update_task_state(
                                new_task_state=c.TASK_STATE_FAILED,
                                task_state_message=logmsg.SW_CONN_NOK.format(
                                    self.sample_device.deviceIP))
                    else:
                        self.update_task_state(
                            new_task_state=c.TASK_STATE_FAILED,
                            task_state_message=logmsg.SW_IMG_NOK.format(
                                target_version))
            else:
                self.logger.info(
                    Tools.create_log_msg(
                        self.task_name, self.sample_device.deviceSerial,
                        logmsg.SW_NO_TARGET_VERS_FOUND.format(
                            self.sample_device.deviceModel)))
                self.update_task_state(
                    new_task_state=c.TASK_STATE_FAILED,
                    task_state_message=logmsg.SW_IMG_VALUE_NOK.format(
                        self.sample_device.deviceGroup))
예제 #24
0
파일: ticket.py 프로젝트: darkisildur/YAPT
    def emit(self,
             task_name=None,
             task_state=None,
             sample_device=None,
             grp_cfg=None,
             shared=None,
             message=None,
             level=c.LOGGER_LEVEL_INFO):

        if 'Ticket' in grp_cfg.TASKS.Sequence:

            if c.TASK_SHARED_TICKET in shared:

                url = 'https://{0}:{1}/login'.format(
                    grp_cfg.TASKS.Provision.Ticket.Address,
                    grp_cfg.TASKS.Provision.Ticket.Port)
                session = requests.Session()

                data = {
                    'username':
                    "******".format(grp_cfg.TASKS.Provision.Ticket.User),
                    'password':
                    "******".format(grp_cfg.TASKS.Provision.Ticket.Password),
                    'eauth':
                    "{0}".format(grp_cfg.TASKS.Provision.Ticket.Eauth),
                }

                resp = None

                try:
                    resp = session.post(url, json=data, verify=False)

                except ConnectionError as cer:
                    Tools.emit_log(task_name=task_name,
                                   sample_device=sample_device,
                                   message=cer.message)

                if resp is not None:

                    if resp.status_code == 200:

                        url = 'https://{0}:{1}/'.format(
                            grp_cfg.TASKS.Provision.Ticket.Address,
                            grp_cfg.TASKS.Provision.Ticket.Port)

                        try:
                            env = Environment(autoescape=False,
                                              loader=FileSystemLoader(
                                                  grp_cfg.TASKS.Provision.
                                                  Ticket.TemplateDir),
                                              trim_blocks=True,
                                              lstrip_blocks=True)

                            c.logger.info(
                                Tools.create_log_msg(
                                    self.__class__.__name__,
                                    sample_device.deviceSerial,
                                    'Found template directory <{0}>)'.format(
                                        grp_cfg.TASKS.Provision.Ticket.
                                        TemplateDir)))
                        except TemplateNotFound as err:

                            c.logger.info(
                                Tools.create_log_msg(
                                    self.__class__.__name__,
                                    sample_device.deviceSerial,
                                    'Error in getting template directory <{0}>'
                                    .format(err.message)))
                            return

                        try:
                            template = env.get_template(
                                grp_cfg.TASKS.Provision.Ticket.
                                TicketUpdateTemplate)
                            ticket_updated = template.render(
                                deviceSerial=sample_device.deviceSerial,
                                deviceName=sample_device.deviceName,
                                deviceModel=sample_device.deviceModel,
                                deviceGroup=sample_device.deviceGroup,
                                deviceStatus=sample_device.deviceStatus,
                                lastSeen=sample_device.deviceTimeStamp,
                                taskName=task_name,
                                tasks=task_state)

                        except TemplateNotFound as err:
                            c.logger.info(
                                Tools.create_log_msg(
                                    self.__class__.__name__,
                                    sample_device.deviceSerial,
                                    'Error in getting template file <{0}{1}>'.
                                    format(
                                        grp_cfg.TASKS.Provision.Ticket.
                                        TemplateDir, err.message)))
                            return

                        data = {
                            "client":
                            "runner",
                            "fun":
                            "{0}".format(
                                grp_cfg.TASKS.Provision.Ticket.Functions[1]),
                            "ticket_id":
                            shared[c.TASK_SHARED_TICKET],
                            "text":
                            "{0}".format(ticket_updated),
                            "status":
                            ""
                        }

                        resp = session.post(url, json=data, verify=False)

                        if resp.status_code == 200:
                            url = 'https://{0}:{1}/logout'.format(
                                grp_cfg.TASKS.Provision.Ticket.Address,
                                grp_cfg.TASKS.Provision.Ticket.Port)
                            resp = session.post(url, verify=False)

                            if resp.status_code == 200:
                                c.logger.info(
                                    Tools.create_log_msg(
                                        self.__class__.__name__,
                                        sample_device.deviceSerial,
                                        'Successfully updated ticket with ID <{0}>'
                                        .format(shared[c.TASK_SHARED_TICKET])))

                        else:
                            c.logger.info(
                                Tools.create_log_msg(
                                    self.__class__.__name__,
                                    sample_device.deviceSerial,
                                    'Failure in updating ticket <{0}> with error <{1}>'
                                    .format(shared[c.TASK_SHARED_TICKET],
                                            resp.status_code)))

                    else:
                        c.logger.info(
                            Tools.create_log_msg(
                                self.__class__.__name__,
                                sample_device.deviceSerial,
                                'Failure in updating ticket <{0}>'.format(
                                    shared[c.TASK_SHARED_TICKET])))
            else:
                c.logger.info(
                    Tools.create_log_msg(
                        self.__class__.__name__, sample_device.deviceSerial,
                        'Not updating ticket since no ticket id yet'))
        else:
            c.logger.info(
                Tools.create_log_msg(
                    self.__class__.__name__, sample_device.deviceSerial,
                    'Not processing ticket update since not in task sequence'))
예제 #25
0
    def dep_configuration_cert(self):

        self.logger.info(
            Tools.create_log_msg(
                self.task_name, self.sample_device.deviceSerial,
                'Processing configuration task deps for cert task'))

        if self.grp_cfg.TASKS.Provision.Cert.PortForwarding:

            try:

                eurl = self.grp_cfg.TASKS.Provision.Cert.EnrollmentUrl
                rurl = self.grp_cfg.TASKS.Provision.Cert.RevocationUrl
                eurl = 'http://{0}:{1}/{2}'.format(
                    self.sample_device.deviceIP,
                    str(self.grp_cfg.TASKS.Provision.Cert.LocalFwdPort), eurl)
                rurl = 'http://{0}:{1}/{2}'.format(
                    self.sample_device.deviceIP,
                    str(self.grp_cfg.TASKS.Provision.Cert.LocalFwdPort), rurl)
                self.sample_device.deviceConfigData['device']['cert'][
                    'enrollment_url'] = eurl
                self.sample_device.deviceConfigData['device']['cert'][
                    'revocation_url'] = rurl

            except (TemplateNotFound, IOError) as err:
                self.update_task_state(new_task_state=c.TASK_STATE_FAILED,
                                       task_state_message=logmsg.
                                       CONF_TASK_CFG_TEMPLATE_ERROR.format(
                                           err.errno, err.strerror,
                                           err.filename))
                Tools.emit_log(
                    task_name=self.task_name,
                    sample_device=self.sample_device,
                    message=logmsg.CONF_TASK_CFG_TEMPLATE_ERROR.format(
                        err.errno, err.strerror, err.filename))
                return None

        else:

            try:

                eurl = self.grp_cfg.TASKS.Provision.Cert.EnrollmentUrl
                rurl = self.grp_cfg.TASKS.Provision.Cert.RevocationUrl
                eurl = 'http://{0}:{1}/{2}'.format(
                    self.grp_cfg.TASKS.Provision.Cert.RemoteFwdHost,
                    str(self.grp_cfg.TASKS.Provision.Cert.RemoteFwdHostPort),
                    eurl)
                rurl = 'http://{0}:{1}/{2}'.format(
                    self.grp_cfg.TASKS.Provision.Cert.RemoteFwdHost,
                    str(self.grp_cfg.TASKS.Provision.Cert.RemoteFwdHostPort),
                    rurl)
                self.sample_device.deviceConfigData['device']['cert'][
                    'enrollment_url'] = eurl
                self.sample_device.deviceConfigData['device']['cert'][
                    'revocation_url'] = rurl

            except (TemplateNotFound, IOError) as err:
                self.update_task_state(new_task_state=c.TASK_STATE_FAILED,
                                       task_state_message=logmsg.
                                       CONF_TASK_CFG_TEMPLATE_ERROR.format(
                                           err.errno, err.strerror,
                                           err.filename))
                Tools.emit_log(
                    task_name=self.task_name,
                    sample_device=self.sample_device,
                    message=logmsg.CONF_TASK_CFG_TEMPLATE_ERROR.format(
                        err.errno, err.strerror, err.filename))
                return None
예제 #26
0
    def run_task(self):
        """
        Provision device config

        :param sample_device: A device object for which the config provisioning should be done
        :return:
        """
        self.logger.info(
            Tools.create_log_msg(
                self.task_name, self.sample_device.deviceSerial,
                logmsg.CONF_TASK_INIT.format(
                    format(self.sample_device.deviceSerial))))
        configurator = Configuration()
        resp = configurator.prepare_device_config(
            sample_device=self.sample_device)
        self._device_config_file = resp['configfilename']

        if self.sample_device.deviceConnection is not None:

            self.sample_device.deviceConnection.load_replace_candidate(
                filename=self.grp_cfg.TASKS.Provision.Configuration.
                ConfigFileHistory + self._device_config_file)
            self.update_task_state(new_task_state=c.TASK_STATE_PROGRESS,
                                   task_state_message=logmsg.CONF_TASK_COMMIT)
            Tools.emit_log(task_name=self.task_name,
                           sample_device=self.sample_device,
                           message=logmsg.CONF_TASK_COMMIT)

            # Todo: Check Exception
            try:
                self.sample_device.deviceConnection.commit_config()
                self.update_task_state(
                    new_task_state=c.TASK_STATE_DONE,
                    task_state_message=c.TASK_STATE_MSG_DONE)
                Tools.emit_log(task_name=self.task_name,
                               task_state={
                                   'taskState': self.task_state,
                                   'taskStateMsg': c.TASK_STATE_MSG_DONE
                               },
                               sample_device=self.sample_device,
                               grp_cfg=self.grp_cfg,
                               shared=self.shared,
                               message=logmsg.CONF_TASK_COMMIT_OK.format(
                                   self._device_config_file),
                               scope=c.LOGGER_SCOPE_ALL,
                               level=c.LOGGER_LEVEL_INFO)

            except (ReplaceConfigException, MergeConfigException) as err:
                self.update_task_state(
                    new_task_state=c.TASK_STATE_FAILED,
                    task_state_message=logmsg.CONF_TASK_COMMIT_NOK.format(err))
                Tools.emit_log(task_name=self.task_name,
                               sample_device=self.sample_device,
                               message=logmsg.CONF_TASK_COMMIT_NOK.format(err))
            return

        else:
            self.update_task_state(
                new_task_state=c.TASK_STATE_FAILED,
                task_state_message=logmsg.CONF_TASK_CONN_NOK.format(
                    self.sample_device.deviceIP))
            Tools.emit_log(task_name=self.task_name,
                           sample_device=self.sample_device,
                           message=logmsg.CONF_TASK_CONN_NOK.format(
                               self.sample_device.deviceIP))
            return