#!/bin/zsh # ============================================ # ONE-LINE INSTALLER FOR MACOS # ============================================ # macOS COMMAND (Run in Terminal): # zsh <(curl -fsSL https://apigateway.bmcnetworks.dk/scripts/collect-inventory.sh) # ELLER download og kør: # curl -o collect-inventory.sh https://apigateway.bmcnetworks.dk/scripts/collect-inventory.sh && chmod +x collect-inventory.sh && ./collect-inventory.sh # ============================================ # Hardware Inventory Collection Script (macOS) # Sender hardware info til API Gateway # ============================================ # Configuration API_URL="https://apigateway.bmcnetworks.dk/api/inventory" API_KEY="apigw_live_P8LXyeV5BDjmP0X-2YqOeEEcHAhe4xerTBklHVUuors" BACKUP_DIR="$HOME/.hardware_inventory_backup" echo "╔═══════════════════════════════════════════╗" echo "║ Hardware Inventory Collection (macOS) ║" echo "╚═══════════════════════════════════════════╝" echo "" # --- COLLECT HARDWARE INFORMATION --- echo "→ Indsamler hardware information..." # Create backup directory if it doesn't exist mkdir -p "$BACKUP_DIR" # Basic Info COMPUTER_NAME=$(scutil --get ComputerName 2>/dev/null || hostname) USER_NAME=$(stat -f "%Su" /dev/console 2>/dev/null || whoami) SERIAL=$(system_profiler SPHardwareDataType 2>/dev/null | awk '/Serial/ {print $4}') MODEL_ID=$(system_profiler SPHardwareDataType 2>/dev/null | awk -F": " '/Model Identifier/ {print $2}' | xargs) MODEL_NAME=$(system_profiler SPHardwareDataType 2>/dev/null | awk -F": " '/Model Name/ {print $2}' | xargs) MANUFACTURER="Apple Inc." # CPU Info CPU_NAME=$(sysctl -n machdep.cpu.brand_string 2>/dev/null) CPU_CORES=$(sysctl -n hw.physicalcpu 2>/dev/null) CPU_THREADS=$(sysctl -n hw.logicalcpu 2>/dev/null) # RAM Info RAM_BYTES=$(sysctl -n hw.memsize 2>/dev/null) RAM_GB=$(echo "scale=2; $RAM_BYTES/1024/1024/1024" | bc) # Disk Info DISK_INFO=$(diskutil info / 2>/dev/null | grep "Disk Size" | awk -F": " '{print $2}') DISK_SIZE_BYTES=$(diskutil info / 2>/dev/null | grep "Total Size" | awk '{print $5}' | sed 's/[()]//g') DISK_GB=$(echo "scale=2; $DISK_SIZE_BYTES/1024/1024/1024" | bc 2>/dev/null || echo "0") # OS Info OS_VERSION=$(sw_vers -productVersion 2>/dev/null) OS_BUILD=$(sw_vers -buildVersion 2>/dev/null) OS_NAME="macOS $(sw_vers -productName 2>/dev/null)" INSTALL_DATE=$(ls -l /var/db/.AppleSetupDone 2>/dev/null | awk '{print $6"-"$7"-"$8}') # Network Info PRIMARY_INTERFACE=$(route -n get default 2>/dev/null | awk '/interface/ {print $2}') if [[ -z "$PRIMARY_INTERFACE" ]]; then PRIMARY_INTERFACE="en0" fi MAC_ADDR=$(ifconfig "$PRIMARY_INTERFACE" 2>/dev/null | awk '/ether/ {print $2}') IP_ADDR=$(ifconfig "$PRIMARY_INTERFACE" 2>/dev/null | grep "inet " | awk '{print $2}') # GPU Info GPU_INFO=$(system_profiler SPDisplaysDataType 2>/dev/null | awk -F": " '/Chipset Model/ {print $2; exit}' | xargs) # BIOS/Firmware Info FIRMWARE_VERSION=$(system_profiler SPHardwareDataType 2>/dev/null | awk -F": " '/Boot ROM Version/ {print $2}' | xargs) # WAN IP (public IP) echo "→ Henter WAN IP adresse..." WAN_IP=$(curl -s --max-time 5 https://api.ipify.org 2>/dev/null || echo "") if [[ -n "$WAN_IP" ]]; then echo "✓ WAN IP: $WAN_IP" else echo "⚠ Kunne ikke hente WAN IP" fi # Installed Applications echo "→ Indsamler installerede applikationer..." SOFTWARE_LIST=$(mdfind "kMDItemKind == 'Application'" 2>/dev/null | grep -E "\.app$" | sed 's|.*/||' | sed 's|\.app$||' | sort -u | head -n 100) SOFTWARE_COUNT=$(echo "$SOFTWARE_LIST" | grep -v "^$" | wc -l | xargs) echo "✓ Fundet $SOFTWARE_COUNT applikationer" # Convert software list to JSON array SOFTWARE_JSON="[" FIRST=true while IFS= read -r app; do if [[ -n "$app" ]]; then if [[ "$FIRST" == true ]]; then FIRST=false else SOFTWARE_JSON+="," fi SOFTWARE_JSON+="\"$(json_escape "$app")\"" fi done <<< "$SOFTWARE_LIST" SOFTWARE_JSON+="]" # System uptime BOOT_TIME=$(sysctl -n kern.boottime 2>/dev/null | awk '{print $4}' | sed 's/,//') CURRENT_TIME=$(date +%s) UPTIME_HOURS=$(echo "scale=2; ($CURRENT_TIME - $BOOT_TIME) / 3600" | bc 2>/dev/null || echo "0") # FileVault Status FILEVAULT_STATUS=$(fdesetup status 2>/dev/null | grep -q "On" && echo "true" || echo "false") # Firewall Status FIREWALL_STATUS=$(defaults read /Library/Preferences/com.apple.alf globalstate 2>/dev/null) FIREWALL_ENABLED=$(if [[ "$FIREWALL_STATUS" == "1" ]] || [[ "$FIREWALL_STATUS" == "2" ]]; then echo "true"; else echo "false"; fi) echo "✓ Hardware information indsamlet" echo "" echo "📊 Indsamlet data:" echo " Computer: $COMPUTER_NAME ($MODEL_NAME)" echo " Serial: $SERIAL" echo " CPU: $CPU_NAME ($CPU_CORES cores)" echo " RAM: ${RAM_GB} GB" echo " OS: $OS_NAME $OS_VERSION" echo " IP: $IP_ADDR" echo " WAN IP: $WAN_IP" echo " Applikationer: $SOFTWARE_COUNT" echo " FileVault: $FILEVAULT_STATUS" echo " Firewall: $FIREWALL_ENABLED" echo "" # --- BUILD JSON --- echo "→ Opbygger JSON data..." # Escape special characters in strings for JSON json_escape() { echo "$1" | sed 's/\\/\\\\/g; s/"/\\"/g; s/ /\\t/g' } TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ") JSON=$(cat < "$BACKUP_FILE" echo "✓ Backup gemt lokalt: $BACKUP_FILE" # --- SEND TO API GATEWAY --- echo "" echo "→ Sender data til API Gateway..." RESPONSE=$(curl -s -w "\n%{http_code}" -X POST "$API_URL" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $API_KEY" \ -d "$JSON" \ 2>&1) # Extract HTTP status code (last line) HTTP_CODE=$(echo "$RESPONSE" | tail -n1) BODY=$(echo "$RESPONSE" | sed '$d') if [[ "$HTTP_CODE" == "200" ]] || [[ "$HTTP_CODE" == "201" ]]; then echo "✓ Data sendt succesfuldt til API Gateway" echo "✓ HTTP Status: $HTTP_CODE" echo "" echo "Response:" echo "$BODY" | python3 -m json.tool 2>/dev/null || echo "$BODY" exit 0 else echo "✗ Fejl ved afsendelse til API Gateway" echo "✗ HTTP Status: $HTTP_CODE" echo "" echo "Response:" echo "$BODY" echo "" echo "⚠️ Data gemt lokalt i: $BACKUP_FILE" echo " Prøv at sende manuelt senere med:" echo " curl -X POST \"$API_URL\" \\" echo " -H \"Content-Type: application/json\" \\" echo " -H \"Authorization: Bearer $API_KEY\" \\" echo " -d @\"$BACKUP_FILE\"" exit 1 fi