#!/bin/sh # gentoo_snapshot.sh - collect a system snapshot on Gentoo/OpenRC systems # Usage: gentoo_snapshot.sh [output_file] # Default output file is gentoo_snapshot.txt in the current directory. set -e OUTPUT=${1:-gentoo_snapshot.txt} TMPDIR=$(mktemp -d) cleanup() { rm -rf "$TMPDIR" } trap cleanup EXIT printf "===== Gentoo System Snapshot: %s =====\n" "$(date)" > "$OUTPUT" printf "\n## Kernel\n" >> "$OUTPUT" uname -a >> "$OUTPUT" 2>/dev/null || printf "uname not available\n" >> "$OUTPUT" printf "\n## CPU\n" >> "$OUTPUT" (lscpu 2>/dev/null || printf "lscpu not available\n") >> "$OUTPUT" printf "\n## Memory\n" >> "$OUTPUT" (free -h 2>/dev/null || printf "free not available\n") >> "$OUTPUT" printf "\n## Block Devices\n" >> "$OUTPUT" (lsblk 2>/dev/null || printf "lsblk not available\n") >> "$OUTPUT" printf "\n## Storage Usage\n" >> "$OUTPUT" (df -h 2>/dev/null || printf "df not available\n") >> "$OUTPUT" # Installed packages printf "\n## Installed Packages\n" >> "$OUTPUT" if command -v qlist >/dev/null 2>&1; then qlist -I >> "$OUTPUT" elif command -v equery >/dev/null 2>&1; then equery list '*' >> "$OUTPUT" else printf "Package manager tools (qlist/equery) not found\n" >> "$OUTPUT" fi # OpenRC services printf "\n## OpenRC Services\n" >> "$OUTPUT" if command -v rc-update >/dev/null 2>&1; then printf "\n### Enabled\n" >> "$OUTPUT" rc-update show | awk '{print $1}' | sort -u >> "$OUTPUT" printf "\n### Disabled\n" >> "$OUTPUT" ENAB="$TMPDIR/enabled" ALL="$TMPDIR/all" rc-update show | awk '{print $1}' | sort -u > "$ENAB" ls /etc/init.d 2>/dev/null | sort > "$ALL" || true if [ -s "$ALL" ]; then comm -23 "$ALL" "$ENAB" >> "$OUTPUT" || true else printf "/etc/init.d not accessible\n" >> "$OUTPUT" fi else printf "rc-update not found\n" >> "$OUTPUT" fi # Largest files printf "\n## Largest Files\n" >> "$OUTPUT" (find / -xdev -type f -printf '%s\t%p\n' 2>/dev/null | sort -nr | head -n 20 2>/dev/null || printf "find not available\n") >> "$OUTPUT" # Cleanup suggestions printf "\n## Cleanup Suggestions\n" >> "$OUTPUT" if [ -d /var/cache/distfiles ]; then du -sh /var/cache/distfiles 2>/dev/null | awk '{print "Distfiles cache: "$1}' >> "$OUTPUT" fi if [ -d /var/tmp/portage ]; then du -sh /var/tmp/portage 2>/dev/null | awk '{print "Portage build dir: "$1}' >> "$OUTPUT" fi printf "Consider running 'eclean packages' and 'eclean distfiles'\n" >> "$OUTPUT" # Additional information printf "\n## Environment\n" >> "$OUTPUT" (printenv 2>/dev/null || printf "printenv not available\n") >> "$OUTPUT" printf "\nSnapshot saved to %s\n" "$OUTPUT" >> "$OUTPUT"