#!/bin/bash

ROOTS="/bin /sbin /usr/bin /usr/sbin /lib64 /usr/lib64"

tmp_elf=$(mktemp)
tmp_missing=$(mktemp)
tmp_symlinks=$(mktemp)
tmp_files=$(mktemp)

echo "Snukware System Integrity Check (snuk-doctor v6.1)"
echo

########################################
# FILE LIST
########################################

find $ROOTS -type f 2>/dev/null > "$tmp_files"

TOTAL=$(wc -l < "$tmp_files")
COUNT=0

########################################
# BROKEN SYMLINK CHECK
########################################

find $ROOTS -xtype l -print 2>/dev/null | while read -r link
do
target=$(readlink "$link")
echo "$link -> $target" >> "$tmp_symlinks"
done

########################################
# SCAN
########################################

while read -r file
do
COUNT=$((COUNT + 1))
PERCENT=$((COUNT * 100 / TOTAL))

printf "\r[snuk-doctor] scanning: %d/%d (%d%%)" \
"$COUNT" "$TOTAL" "$PERCENT"

# ELF?
head -c 4 "$file" 2>/dev/null | grep -q $'\x7fELF' || continue

####################################
# ELF HEADER CHECK
####################################

if ! readelf -h "$file" >/dev/null 2>&1
then
echo "$file" >> "$tmp_elf"
continue
fi

####################################
# RUNTIME DEPENDENCY CHECK
####################################

ldd "$file" 2>/dev/null |
grep "not found" |
while read -r line
do
echo "$file :: $line" >> "$tmp_missing"
done

done < "$tmp_files"

echo
echo

########################################
# OUTPUT
########################################

echo "=== BROKEN ELF FILES ==="

if [ -s "$tmp_elf" ]
then
sort -u "$tmp_elf"
else
echo "none"
fi

echo
echo "=== MISSING DEPENDENCIES ==="

if [ -s "$tmp_missing" ]
then
sort -u "$tmp_missing"
else
echo "none"
fi

echo
echo "=== BROKEN SYMLINKS ==="

if [ -s "$tmp_symlinks" ]
then
sort -u "$tmp_symlinks"
else
echo "none"
fi

echo
echo "=== SUMMARY ==="

echo "Broken ELF files: $(sort -u "$tmp_elf" | wc -l)"
echo "Missing dependencies: $(sort -u "$tmp_missing" | wc -l)"
echo "Broken symlinks: $(sort -u "$tmp_symlinks" | wc -l)"

########################################
# CLEANUP
########################################

rm -f "$tmp_elf" "$tmp_missing" "$tmp_symlinks" "$tmp_files"
