Check file contents directly instead of using cat. Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
		
			
				
	
	
		
			131 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/sh
 | 
						|
#
 | 
						|
# Package checksums checking script
 | 
						|
# (C) 2018 CZ.NIC, z.s.p.o.
 | 
						|
#
 | 
						|
# This program is free software: you can redistribute it and/or modify
 | 
						|
# it under the terms of the GNU General Public License as published by
 | 
						|
# the Free Software Foundation, either version 3 of the License, or
 | 
						|
# (at your option) any later version.
 | 
						|
#
 | 
						|
# This program is distributed in the hope that it will be useful,
 | 
						|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
# GNU General Public License for more details.
 | 
						|
#
 | 
						|
# You should have received a copy of the GNU General Public License
 | 
						|
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
						|
 | 
						|
 | 
						|
ERRFATAL="no"
 | 
						|
QUIET="yes"
 | 
						|
MISSING=""
 | 
						|
SUMMARY=""
 | 
						|
NL="
 | 
						|
"
 | 
						|
 | 
						|
# Arguments parsing
 | 
						|
while expr "x$1" : "x-" > /dev/null; do
 | 
						|
	if [ "x$1" = "x-s" ]; then
 | 
						|
		ERRFATAL="yes"
 | 
						|
		shift
 | 
						|
	elif [ "x$1" = "x-v" ]; then
 | 
						|
		QUIET="	no"
 | 
						|
		shift
 | 
						|
	else
 | 
						|
		echo "Usage: $(basename $0) [-s] [-v] [pkg1 pkg2 ...]"
 | 
						|
		echo
 | 
						|
		echo "   -s   Stop on first change"
 | 
						|
		echo "   -v   Verbose"
 | 
						|
		if [ "x$1" = "x-h" ]; then
 | 
						|
			exit 0
 | 
						|
		else
 | 
						|
			echo
 | 
						|
			echo "ERROR: Unknown option '$1'"
 | 
						|
			exit 1
 | 
						|
		fi
 | 
						|
	fi
 | 
						|
done
 | 
						|
 | 
						|
# Check all packages by default
 | 
						|
if [ -z "$1" ]; then
 | 
						|
	set $(cd /usr/lib/opkg/info/; for i in *.files-sha256sum; do basename $i .files-sha256sum; done)
 | 
						|
fi
 | 
						|
 | 
						|
# Iterate over packages
 | 
						|
while [ "$1" ]; do
 | 
						|
	if [ \! -f "/usr/lib/opkg/info/$1.files-sha256sum" ]; then
 | 
						|
		if [ "$ERRFATAL" = no ]; then
 | 
						|
			echo " * No checksums for $1 - skipping"
 | 
						|
			echo
 | 
						|
		else
 | 
						|
			echo " * No checksums for $1 - exiting"
 | 
						|
			exit 1
 | 
						|
		fi
 | 
						|
		if [ -z "$MISSING" ]; then
 | 
						|
			MISSING="$1"
 | 
						|
		else
 | 
						|
			MISSING="$MISSING, $1"
 | 
						|
		fi
 | 
						|
		shift
 | 
						|
		continue
 | 
						|
	fi
 | 
						|
	[ $QUIET = yes ] || echo " * Checking package $1:"
 | 
						|
	ERR=""
 | 
						|
	CHECK="$(sha256sum -c /usr/lib/opkg/info/$1.files-sha256sum 2> /dev/null)"
 | 
						|
 | 
						|
	# Are the changed files config files?
 | 
						|
	if [ $? -ne 0 ] && [ "$(cat "/usr/lib/opkg/info/$1.files-sha256sum")" ]; then
 | 
						|
		NEWCHECK="$(echo "$CHECK" | grep '^.*: OK$')"
 | 
						|
		for i in $(echo "$CHECK" | sed -n 's|^\(.*\): FAILED$|\1|p'); do
 | 
						|
			if [ "$(grep "^$i\$" "/usr/lib/opkg/info/$1.conffiles" 2> /dev/null)" ] || \
 | 
						|
			   [ "$(echo "$i" | grep "^/etc/uci-defaults/")" ]; then
 | 
						|
				NEWCHECK="${NEWCHECK}${NL}${i}: CONFIGURED"
 | 
						|
			else
 | 
						|
				NEWCHECK="${NEWCHECK}${NL}${i}: FAILED"
 | 
						|
				ERR="y"
 | 
						|
			fi
 | 
						|
		done
 | 
						|
		CHECK="$NEWCHECK"
 | 
						|
	fi
 | 
						|
 | 
						|
	# Do we have changed files or not?
 | 
						|
	if [ -z "$ERR" ]; then
 | 
						|
		[ $QUIET = yes ] || [ ! -s "/usr/lib/opkg/info/$1.files-sha256sum" ] || echo "$CHECK" | sed 's|^|   - |'
 | 
						|
		[ $QUIET = yes ] || echo " * Package $1 is ok"
 | 
						|
		[ $QUIET = yes ] || echo
 | 
						|
	else
 | 
						|
		if [ $QUIET = yes ]; then
 | 
						|
			echo " * Changes found in package $1:"
 | 
						|
			echo "$CHECK" | sed -n 's|^\(.*:[[:blank:]]*FAILED\)$|   - \1|p'
 | 
						|
		else
 | 
						|
			echo "$CHECK" | sed 's|^|   - |'
 | 
						|
			echo " * Changes found in package $1!"
 | 
						|
		fi
 | 
						|
		if [ "$ERRFATAL" = yes ]; then
 | 
						|
			echo
 | 
						|
			echo "Exiting on first change found!"
 | 
						|
			exit 1
 | 
						|
		fi
 | 
						|
		for i in $(echo "$CHECK" | sed -n 's|^\(.*\): FAILED$|\1|p'); do
 | 
						|
			SUMMARY="${SUMMARY}${NL} - $1: $i"
 | 
						|
		done
 | 
						|
		echo
 | 
						|
	fi
 | 
						|
	shift
 | 
						|
done
 | 
						|
 | 
						|
# If there are changed files, report them
 | 
						|
if [ "$SUMMARY" ]; then
 | 
						|
	echo "Some packages contain changed files!"
 | 
						|
	echo "Maybe something worth looking into?"
 | 
						|
	echo "Here is the list of packages and changed files:"
 | 
						|
	echo "$SUMMARY"
 | 
						|
fi
 | 
						|
if [ "$MISSING" ]; then
 | 
						|
	echo "Following packages are missing checksums: $MISSING"
 | 
						|
fi
 | 
						|
if [ "$MISSING" ] || [ "$SUMMARY" ]; then
 | 
						|
	exit 1
 | 
						|
fi
 |