Пример #1
0
 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}"
     }
Пример #2
0
 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"}
Пример #3
0
 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,
     }