def job(self, payload: dict, device: Device) -> dict: now = datetime.now() path_configurations = Path.cwd() / "git" / "configurations" netmiko_handler = self.netmiko_connection(device) try: netmiko_handler.enable() except Exception: pass try: config = netmiko_handler.send_command(self.configuration_command) device.last_status = "Success" device.last_runtime = (datetime.now() - now).total_seconds() netmiko_handler.disconnect() if device.configurations: last_config = device.configurations[max(device.configurations)] if config == last_config: return {"success": True, "result": "no change"} device.configurations[now] = device.current_configuration = config with open(path_configurations / device.name, "w") as file: file.write(config) device.last_update = now except Exception as e: netmiko_handler.disconnect() device.last_status = "Failure" device.last_failure = now return {"success": False, "result": str(e)} if len(device.configurations) > self.number_of_configuration: device.configurations.pop(min(device.configurations)) return { "success": True, "result": f"Command: {self.configuration_command}" }
def job(self, payload: dict, device: Device) -> dict: try: now = datetime.now() path_configurations = Path.cwd() / "git" / "configurations" path_device_config = path_configurations / device.name path_device_config.mkdir(parents=True, exist_ok=True) napalm_driver = self.napalm_connection(device) napalm_driver.open() self.logs.append( f"Fetching configuration on {device.name} (Napalm)") config = str_dict(napalm_driver.get_config()) napalm_driver.close() device.last_status = "Success" device.last_runtime = (datetime.now() - now).total_seconds() if device.configurations: last_config = device.configurations[max(device.configurations)] if config == last_config: return {"success": True, "result": "no change"} device.configurations[now] = device.current_configuration = config with open(path_device_config / device.name, "w") as file: file.write(config) device.last_update = now self.generate_yaml_file(path_device_config, device) except Exception as e: device.last_status = "Failure" device.last_failure = now self.generate_yaml_file(path_device_config, device) return {"success": False, "result": str(e)} if len(device.configurations) > self.number_of_configuration: device.configurations.pop(min(device.configurations)) return {"success": True, "result": "Get Config via Napalm"}
def job(self, payload: dict, device: Device) -> dict: arguments = self.sub(self.arguments, locals()).split() command, extra_args = ["ansible-playbook"], {} if self.pass_device_properties: extra_args = device.get_properties() extra_args["password"] = device.password if self.options: extra_args.update(self.options) if extra_args: command.extend(["-e", dumps(extra_args)]) if self.has_targets: command.extend(["-i", device.ip_address + ","]) command.append(self.sub(self.playbook_path, locals())) self.logs.append( f"Sending Ansible playbook: {' '.join(command + arguments)}") result = check_output(command + arguments) try: result = result.decode("utf-8") except AttributeError: pass try: result = loads(result) except JSONDecodeError: pass if self.validation_method == "text": success = self.match_content( str(result), self.sub(self.content_match, locals())) else: success = self.match_dictionary(result) return { "negative_logic": self.negative_logic, "result": result, "success": success, }