Resolve all active findings for a given host across networks.
(self, host: str, reason: str = "host_offline")
| 495 | return open_vulns |
| 496 | |
| 497 | def resolve_host_findings(self, host: str, reason: str = "host_offline"): |
| 498 | """Resolve all active findings for a given host across networks.""" |
| 499 | try: |
| 500 | resolved_any = False |
| 501 | for network_id, vulns in list(self.active_vulnerabilities.items()): |
| 502 | for vuln_id, vuln_data in list(vulns.items()): |
| 503 | if vuln_data.get('host') == host: |
| 504 | self.active_vulnerabilities[network_id].pop(vuln_id, None) |
| 505 | vuln_data['status'] = 'resolved' |
| 506 | vuln_data['resolved'] = datetime.now().isoformat() |
| 507 | vuln_data['resolution_reason'] = reason |
| 508 | if network_id not in self.resolved_vulnerabilities: |
| 509 | self.resolved_vulnerabilities[network_id] = {} |
| 510 | self.resolved_vulnerabilities[network_id][vuln_id] = vuln_data |
| 511 | resolved_any = True |
| 512 | |
| 513 | for network_id, creds in list(self.active_credentials.items()): |
| 514 | for cred_id, cred_data in list(creds.items()): |
| 515 | if cred_data.get('host') == host: |
| 516 | self.active_credentials[network_id].pop(cred_id, None) |
| 517 | cred_data['status'] = 'resolved' |
| 518 | cred_data['resolved'] = datetime.now().isoformat() |
| 519 | cred_data['resolution_reason'] = reason |
| 520 | if network_id not in self.resolved_credentials: |
| 521 | self.resolved_credentials[network_id] = {} |
| 522 | self.resolved_credentials[network_id][cred_id] = cred_data |
| 523 | resolved_any = True |
| 524 | |
| 525 | if resolved_any: |
| 526 | self.save_intelligence_data() |
| 527 | self.logger.info(f"Resolved findings for host {host} due to {reason}") |
| 528 | except Exception as e: |
| 529 | self.logger.error(f"Error resolving findings for host {host}: {e}") |
| 530 | |
| 531 | def get_all_findings_for_netkb(self) -> Dict: |
| 532 | """Get all findings (active + resolved) for NetKB view""" |
no test coverage detected