コード例 #1
0
ファイル: tasktools.py プロジェクト: darkisildur/YAPT
    def prepare_vnf_boostrap_config(self, serialnumber=None, grp_cfg=None, vnf_type=None):

        now = datetime.datetime.now().strftime('%Y-%m-%d-%H%M')
        status, data = Tools.get_config(lookup_type=c.CONFIG_LOOKUP_TYPE_GET_DEVICE_CFG,
                                        serialnumber=None, deviceOsshId=serialnumber)

        if status:

            if vnf_type == c.VNF_TYPE_JUNIPER:
                data['device']['ossh_secret'] = data['device']['ossh_secret']
                data['device']['ossh_ip'] = c.conf.SERVICES.Ossh.ServiceBindAddress
                data['device']['ossh_port'] = c.conf.SERVICES.Ossh.ServiceListenPort

            heading = "## Last changed: " + now + "\n"
            data['heading'] = heading
            status, template = Tools.get_config(lookup_type=c.CONFIG_LOOKUP_TYPE_GET_TEMPLATE,
                                                serialnumber=None,
                                                deviceOsshId=serialnumber,
                                                path=data['yapt']['bootstrap_template_dir'],
                                                file=data['yapt']['bootstrap_template_file'])
            if status:
                config = template.render(data, deviceId=serialnumber)
                _device_config_file = '{0}-bootstrap-{1}.conf'.format(serialnumber, now)
                target = open(grp_cfg.TASKS.Provision.Configuration.ConfigFileHistory + _device_config_file, 'w')
                target.write(config)
                target.close()
                return _device_config_file

        else:
            self.logger.info(Tools.create_log_msg(logmsg.CONF_DEV_CFG, serialnumber,
                                                  logmsg.CONF_DEV_CFG_DEV_DATA_ERROR))
            return None
コード例 #2
0
    def init(self, **params):

        self.deviceIP = cherrypy.request.headers['Remote-Addr']
        self.sn_nr = params['uid']
        status, data = Tools.get_config(
            lookup_type=c.CONFIG_LOOKUP_TYPE_GET_DEVICE_CFG,
            serialnumber=self.sn_nr,
            deviceOsshId=None)

        if status:

            try:

                self.device_type = data['yapt']['device_type']
                self.service_chain = data['yapt']['service_chain']

            except KeyError as ke:
                self.logger.info('{0} {1}'.format(
                    logmsg.PHS_SERVICE + ':',
                    logmsg.PHS_CONF_KEY_ERROR.format(ke.message)))
                return

            _boostrap_init_file = c.conf.SERVICES.Phs.InitConfPath + self.device_type + '.xml'

            if os.path.isfile(_boostrap_init_file):
                response = None

                try:
                    env = Environment(autoescape=select_autoescape(['xml']),
                                      loader=FileSystemLoader(
                                          c.conf.SERVICES.Phs.InitConfPath),
                                      trim_blocks=True,
                                      lstrip_blocks=True)
                    response = env.get_template(self.device_type +
                                                '.xml').render(
                                                    serial=self.sn_nr)

                except (TemplateNotFound, IOError) as err:
                    self.logger.info(
                        Tools.create_log_msg(
                            logmsg.PHS_SERVICE, self.sn_nr,
                            logmsg.PHS_TEMPLATE_ERROR.format(
                                err.errno, err.strerror, err.filename)))
                return response

            else:
                self.logger.info(
                    Tools.create_log_msg(
                        logmsg.PHS_SERVICE, self.sn_nr,
                        logmsg.PHS_BOOSTRAP_FILE_FAILED.format(
                            _boostrap_init_file)))

        else:
            self.logger.info(
                Tools.create_log_msg(logmsg.PHS_SERVICE, self.sn_nr,
                                     logmsg.PHS_DEV_CONF_FAILED))
コード例 #3
0
ファイル: tasktools.py プロジェクト: abacuspix/YAPT
    def prepare_device_config(self, sample_device=None):

        version = sample_device.softwareVersion
        now = datetime.datetime.now().strftime('%Y-%m-%d-%H%M')
        grp_cfg = Tools.create_config_view(
            config_type=c.CONFIG_TYPE_GROUP,
            stream=sample_device.deviceGroupData)

        if c.SERVICEPLUGIN_OSSH in sample_device.deviceServicePlugin:
            sample_device.deviceConfigData['device'][
                'ossh_secret'] = sample_device.deviceConfigData['device'][
                    'ossh_secret']
            sample_device.deviceConfigData['device'][
                'ossh_ip'] = c.conf.SERVICES.Ossh.ServiceBindAddress
            sample_device.deviceConfigData['device'][
                'ossh_port'] = c.conf.SERVICES.Ossh.ServiceListenPort

        if sample_device.deviceConfigData:

            heading = "## Last changed: " + now + "\n"
            heading += "version " + version + ";"
            sample_device.deviceConfigData['heading'] = heading
            status, data = Tools.get_config(
                lookup_type=c.CONFIG_LOOKUP_TYPE_GET_TEMPLATE,
                sample_device=sample_device)

            if status:
                config = data.render(sample_device.deviceConfigData)
                sample_device.deviceConfiguration = config
                _device_config_file = '{0}-{1}.conf'.format(
                    sample_device.deviceSerial, now)
                target = open(
                    grp_cfg.TASKS.Provision.Configuration.ConfigFileHistory +
                    _device_config_file, 'w')
                target.write(sample_device.deviceConfiguration)
                target.close()
                return {
                    'status': True,
                    'sample_device': sample_device,
                    'configfilename': _device_config_file
                }

            else:
                return {
                    'status': False,
                    'sample_device': sample_device,
                    'configfilename': data
                }

        else:
            self.logger.info(
                Tools.create_log_msg(logmsg.CONF_DEV_CFG,
                                     sample_device.deviceSerial,
                                     logmsg.CONF_DEV_CFG_DEV_DATA_ERROR))
            return None
コード例 #4
0
ファイル: processor.py プロジェクト: darkisildur/YAPT
    def receive_message(self, ch, method, properties, body):

        if body is not None:

            ch.basic_ack(delivery_tag=method.delivery_tag)
            body_decoded = jsonpickle.decode(body)
            Tools.amqp_receive_to_logger(routing_key=method.routing_key, body_decoded=body_decoded)

            if isinstance(body_decoded,
                          AMQPMessage) and c.AMQP_MSG_TYPE_DEVICE_ADD == body_decoded.message_type:

                sample_device = body_decoded.payload
                status, sample_device = Tools.create_dev_conn(sample_device=sample_device)

                if status:

                    sample_device = Tools.get_device_facts(sample_device=sample_device)

                    status, data = Tools.get_config(lookup_type=c.CONFIG_LOOKUP_TYPE_GET_DEVICE_CFG,
                                                    sample_device=sample_device)

                    if status:

                        sample_device.deviceConfigData = data

                        try:

                            sample_device.deviceGroup = data['yapt']['device_group']

                        except KeyError as ke:
                            self._logger.info(Tools.create_log_msg(logmsg.TASKP, sample_device.deviceSerial,
                                                                   logmsg.TASKP_STOP_NO_DEVGRP.format(ke.message)))
                            return

                        status, grp_cfg = Tools.get_config(lookup_type=c.CONFIG_LOOKUP_TYPE_GET_GROUP,
                                                           sample_device=sample_device)

                        if status:

                            sample_device.deviceGroupData = grp_cfg
                            grp_cfg = Tools.create_config_view(config_type=c.CONFIG_TYPE_GROUP, stream=grp_cfg)
                            sample_device.deviceTemplate = grp_cfg.TASKS.Provision.Configuration.DeviceConfTemplateFile
                            sample_device.deviceTaskSeq = list(grp_cfg.TASKS.Sequence)
                            dev_conn = sample_device.deviceConnection
                            sample_device.deviceConnection = hex(id(sample_device.deviceConnection))
                            message = AMQPMessage(message_type=c.AMQP_MSG_TYPE_DEVICE_ADD, payload=sample_device,
                                                  source=c.AMQP_PROCESSOR_TASK)
                            resp = self._backendp.call(message=message)
                            resp = jsonpickle.decode(resp)
                            sample_device = resp.payload[1]
                            sample_device.deviceConnection = dev_conn
                            self._logger.info(Tools.create_log_msg(logmsg.TASKP, sample_device.deviceSerial,
                                                                   logmsg.TASKP_LOAD_TASK_SEQ.format(
                                                                       sample_device.deviceTaskSeq)))
                            c.taskq.add_device_task_q(sample_device=sample_device, grp_cfg=grp_cfg)
                            taskq = c.taskq.get_device_task_q(sn=sample_device.deviceSerial)
                            self._logger.debug(Tools.create_log_msg(self.name, sample_device.deviceSerial,
                                                                    'Device status: <{0}>'.format(
                                                                        sample_device.deviceStatus)))
                            if taskq:

                                for task in taskq:
                                    self._logger.debug(Tools.create_log_msg(self.name, sample_device.deviceSerial,
                                                                            'Task: <{0}> status: <{1}>'.format(
                                                                                task.task_name, task.task_state)))

                                    if task.task_state == c.TASK_STATE_INIT:
                                        task.pre_run_task()
                                        task.run_task()
                                        task.post_run_task()

                                        if task.task_state == c.TASK_STATE_REBOOTING:
                                            self._logger.debug(
                                                Tools.create_log_msg(self.name, sample_device.deviceSerial,
                                                                     'Task: <{0}> status: <{1}>'.format(
                                                                         task.task_name, task.task_state)))
                                            self._logger.info(
                                                Tools.create_log_msg(logmsg.TASKP, sample_device.deviceSerial,
                                                                     logmsg.TASKP_STOP_DEV_REBOOT.format(
                                                                         sample_device.deviceSerial)))
                                            break

                                        elif task.task_state == c.TASK_STATE_FAILED:
                                            self._logger.debug(
                                                Tools.create_log_msg(self.name, sample_device.deviceSerial,
                                                                     'Task: <{0}> status: <{1}>'.format(
                                                                         task.task_name, task.task_state)))
                                            self._logger.info(
                                                Tools.create_log_msg(logmsg.TASKP, sample_device.deviceSerial,
                                                                     logmsg.TASKP_TASK_ERROR.format(
                                                                         task.task_name, )))
                                            self.close_dev_conn(sample_device=sample_device)
                                            break

                                    elif task.task_state == c.TASK_STATE_REBOOTING:
                                        task.pre_run_task()
                                        task.run_task()
                                        task.post_run_task()

                                        if task.task_state == c.TASK_STATE_FAILED:
                                            self._logger.debug(
                                                Tools.create_log_msg(self.name, sample_device.deviceSerial,
                                                                     'Task: <{0}> status: <{1}>'.format(
                                                                         task.task_name, task.task_state)))
                                            self._logger.info(
                                                Tools.create_log_msg(logmsg.TASKP, sample_device.deviceSerial,
                                                                     logmsg.TASKP_TASK_ERROR.format(
                                                                         task.task_name, )))
                                            self.close_dev_conn(sample_device=sample_device)
                                            break

                                    elif task.task_state == c.TASK_STATE_DONE:
                                        pass

                                    elif task.task_state == c.TASK_STATE_FAILED:
                                        self._logger.debug(
                                            Tools.create_log_msg(self.name, sample_device.deviceSerial,
                                                                 'Task: <{0}> status: <{1}>'.format(
                                                                     task.task_name, task.task_state)))
                                        self._logger.info(
                                            Tools.create_log_msg(logmsg.TASKP, sample_device.deviceSerial,
                                                                 logmsg.TASKP_TASK_ERROR.format(
                                                                     task.task_name, )))
                                        self.close_dev_conn(sample_device=sample_device)
                                        break

                                    else:
                                        self._logger.info(Tools.create_log_msg(logmsg.TASKP, sample_device.deviceSerial,
                                                                               'Task <{0}> state: <{1}> unknown'.format(
                                                                                   task.task_name, task.task_state)))
                                        break

                                # print 'After running all tasks device status is: <{0}>'.format(
                                #    sample_device.deviceStatus)

                                if sample_device.deviceStatus == c.DEVICE_STATUS_DONE:
                                    c.taskq.del_device_task_q(sample_device.deviceSerial)
                        else:
                            self._logger.info(Tools.create_log_msg(logmsg.TASKP, sample_device.deviceSerial,
                                                                   logmsg.TASKP_STOP_NO_DEVGRP_CFG.format(grp_cfg)))
                            self.close_dev_conn(sample_device=sample_device)
                            return

                    else:
                        self._logger.info(Tools.create_log_msg(logmsg.TASKP, sample_device.deviceSerial,
                                                               logmsg.TASKP_STOP_NO_DEV_CFG.format(data)))
                        self.close_dev_conn(sample_device=sample_device)
                        return
                else:
                    self._logger.info(Tools.create_log_msg(logmsg.TASKP, sample_device.deviceSerial,
                                                           logmsg.TASKP_CONN_ERR.format(sample_device.deviceSerial)))
                    return
            else:
                Tools.amqp_receive_error_to_logger(routing_key=method.routing_key, body_decoded=body_decoded)

        else:
            self._logger.info(Tools.create_log_msg(logmsg.TASKP, None, logmsg.TASKP_DEFECT_MSG))
コード例 #5
0
ファイル: ansibleapi.py プロジェクト: darkisildur/YAPT
    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
コード例 #6
0
    def run_task(self):

        cancel_chan = ChannelCancellation()
        e = threading.Event()
        status, data = Tools.get_config(
            lookup_type=c.CONFIG_LOOKUP_TYPE_GET_DEVICE_CFG,
            sample_device=self.sample_device)
        if status:

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

                if self.sample_device.deviceServicePlugin != c.SERVICEPLUGIN_OSSH:

                    with SCP(self.sample_device.deviceConnection,
                             progress=False) as scp:
                        scp.put(c.conf.SERVICES.Ossh.LocalConfigFile,
                                c.SSHD_PORT_FWD_PATH)
                        self.logger.info(
                            Tools.create_log_msg(
                                self.task_name,
                                self.sample_device.deviceSerial,
                                logmsg.CERT_FILE_OK.format(
                                    self.sample_device.deviceSerial)))

                    self.sample_device.deviceConnection.close()
                    status, self.sample_device = Tools.create_dev_conn(
                        self.sample_device)

                    if status:

                        thr = threading.Thread(target=self.do_cert_requests,
                                               args=(
                                                   data,
                                                   e,
                                                   cancel_chan,
                                               ))
                        thr.start()

                        ssh_pfwd = SSHPortForward(
                            sample_device=self.sample_device,
                            grp_cfg=self.grp_cfg,
                            event=e,
                            cancel_chan=cancel_chan)
                        ssh_pfwd.init_port_fwd()

                    else:
                        return False, 'Error in device connection'

                else:

                    thr = threading.Thread(target=self.do_cert_requests,
                                           args=(
                                               data,
                                               e,
                                               cancel_chan,
                                           ))
                    thr.start()
                    ssh_pfwd = SSHPortForward(sample_device=self.sample_device,
                                              grp_cfg=self.grp_cfg,
                                              event=e,
                                              cancel_chan=cancel_chan)
                    ssh_pfwd.init_port_fwd()

            else:
                self.do_cert_requests(datavars=data, event=None)

        else:
            self.logger.info(
                Tools.create_log_msg(self.task_name,
                                     self.sample_device.deviceSerial,
                                     logmsg.CERT_DEV_DATA_NOK))