#!/usr/bin/env bash set -euo pipefail # === METADATA === SCRIPT_NAME="$(basename "$0")" SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" SKILL_ROOT="$(dirname "$SCRIPT_DIR")" # === CONFIGURATION === : "${NODE_NAME:=node-a}" : "${OUTPUT_DIR:=$SKILL_ROOT/outputs}" : "${BACKUP_DIR:=$OUTPUT_DIR/backups}" # === FUNCTIONS === log_info() { echo "[INFO] $(date -Iseconds) $*"; } get_ufw_status() { if command -v ufw &>/dev/null; then if sudo ufw status 2>/dev/null | grep -q "Status: active"; then echo "Active" else echo "Inactive" fi else echo "Not installed" fi } get_ssh_status() { if systemctl is-active ssh &>/dev/null || systemctl is-active sshd &>/dev/null; then echo "Running" else echo "Not running" fi } get_fail2ban_status() { if command -v fail2ban-client &>/dev/null; then if systemctl is-active fail2ban &>/dev/null; then echo "Active" else echo "Inactive" fi else echo "Not installed" fi } get_auditd_status() { if command -v auditctl &>/dev/null; then if systemctl is-active auditd &>/dev/null; then echo "Active" else echo "Inactive" fi else echo "Not installed" fi } list_backups() { if [[ -d "$BACKUP_DIR" ]]; then ls -1 "$BACKUP_DIR" 2>/dev/null | while read -r f; do echo "| $f | $(stat -c%s "$BACKUP_DIR/$f" 2>/dev/null || echo "?") bytes |" done else echo "| (no backups) | - |" fi } main() { mkdir -p "$OUTPUT_DIR" log_info "Starting $SCRIPT_NAME..." local report="$OUTPUT_DIR/audit_report.md" local status_file="$OUTPUT_DIR/status_matrix.json" cat > "$report" <