"""Compact, evidence-based presentation of the full assessment.""" import re from samsara.analyzers.dependencies import service_family # Name hints for server workloads, not a comprehensive application classifier. WORKLOAD = re.compile(r'(?:nginx|apache|httpd|iis|w3svc|sql|postgres|mariadb|mysql|redis|mongo|oracle|tomcat|haproxy|docker|containerd|podman|samba|smbd|nfs|bind|named|rabbitmq|kafka|jenkins|backup|reporting|dedicated server|minecraft|valheim|rustdedicated)', re.I) def summarize(data, assessment): server, inventory = data['server'], data['inventory'] os_name = str(server.get('operating_system') or 'Not collected') version = server.get('os_version') if not version: match = re.search(r'\b(?:20\d{2}|\d+(?:\.\d+)+)\b', os_name) version = match[0] if match else 'Not collected' version = str(version) important = [] for row in inventory.get('software', []): if WORKLOAD.search(row['name']) and not row['name'].lower().startswith('lib') and not row['name'].lower().endswith(('-dev', '-devel', '-doc')): important.append({'name': row['name'], 'version': row.get('version', 'Not collected'), 'evidence': 'Installed software name matches a server-workload hint; use unverified'}) names = {row['name'].lower().split(':')[0] for row in important} for row in inventory.get('services', []): if row.get('state') == 'Running' and service_family(row['name']) is not None and row['name'].lower().removesuffix('.service') not in names: important.append({'name': row['name'], 'version': 'Not collected', 'evidence': 'Running service; application ownership requires review'}) jobs = [] task_classes = {row['inventory_index']: row['classification'] for row in assessment.get('task_observations', [])} for index, row in enumerate(inventory.get('tasks', [])): if (row.get('enabled') or row.get('state') == 'Running') and task_classes.get(index) != 'Standard operating system activity': jobs.append({'name': row['name'], 'schedule': row.get('triggers', 'Schedule not collected'), 'status': row.get('state', 'Enabled schedule; execution unverified'), 'account': row.get('account', 'Not collected')}) return {'os_type': os_name, 'version': version, 'risk_score': assessment['score'], 'risk_level': assessment['level'], 'software': important, 'jobs': jobs, 'incomplete': len(assessment['coverage']['incomplete_checks']), 'coverage_percent': assessment['coverage']['percent'], 'confidence': assessment['confidence']['level']}