Add Server Buddy desktop app with local Linux assessment and reporting

This commit is contained in:
2026-10-30 09:46:01 -07:00
commit 365f97942a
29 changed files with 1789 additions and 0 deletions

49
tests/test_import.py Normal file
View File

@@ -0,0 +1,49 @@
import json
from pathlib import Path
import tempfile
import unittest
from server_buddy.collectors.demo import collect_demo, LINUX_DEMO_HOST
from server_buddy.analyzers.assessment import assess
try:
from server_buddy.collectors.importer import load_inventory
except ImportError:
load_inventory = None
@unittest.skipIf(load_inventory is None, 'jsonschema not installed')
class ImportTests(unittest.TestCase):
def load(self, data):
with tempfile.TemporaryDirectory() as folder:
path = Path(folder) / 'inventory.json'
path.write_text(json.dumps(data))
return load_inventory(path)
def test_linux_inventory_and_nfs_evidence(self):
data = self.load(collect_demo(LINUX_DEMO_HOST))
self.assertEqual(data['server']['platform'], 'linux')
result = assess(data)
self.assertTrue(any('/srv/reports' in item['evidence'] for item in result['findings']))
self.assertTrue(any('certificates:' in item['evidence'] for item in result['findings']))
def test_report_wrapper_recomputed_and_sensitive_fields_removed(self):
data = collect_demo(LINUX_DEMO_HOST)
data['synthetic'] = False
data['inventory']['services'][0]['arguments'] = '--password=SECRET'
data['checks']['services']['message'] = 'SECRET command diagnostics'
imported = self.load({'inventory_result': data, 'assessment': {'level': 'safe'}})
self.assertFalse(imported['synthetic'])
self.assertNotIn('SECRET', json.dumps(imported))
self.assertNotEqual(assess(imported)['level'], 'safe')
def test_rejects_missing_checks_and_malformed_rows(self):
for mutation in ['check', 'row', 'version']:
data = collect_demo(LINUX_DEMO_HOST)
if mutation == 'check':
del data['checks']['services']
elif mutation == 'row':
data['inventory']['services'] = [{}]
else:
data['schema_version'] = '99'
with self.subTest(mutation=mutation), self.assertRaises(ValueError):
self.load(data)