View file File name : lcf Content :#!/bin/bash # -*- Mode: Sh -*- # lcf --- # Author : Manoj Srivastava ( srivasta@glaurung.green-gryphon.com ) # Created On : Mon Feb 25 12:04:52 2002 # Created On Node : glaurung.green-gryphon.com # Last Modified By : Manoj Srivastava # Last Modified On : Mon Feb 25 12:06:54 2002 # Last Machine Used: glaurung.green-gryphon.com # Update Count : 2 # Status : Unknown, Use with caution! # HISTORY : # Description : # # # make sure we exit on error set -e # set the version and revision progname="$(basename $0)" pversion='Revision: 3.00' ###################################################################### ######## ######### ######## Utility functions ######### ######## ######### ###################################################################### setq() { # Variable Value Doc_string if [ "x$2" = "x" ]; then echo >&2 "$progname: Unable to determine $3" exit 1; else if [ "x$VERBOSE" != "x" ]; then echo "$progname: $3 is $2"; fi eval "$1=\"\$2\""; fi } withecho () { echo "$@" >&2 "$@" } usageversion () { cat >&2 <<END Debian GNU/Linux $progname $pversion. Copyright (C) 2002 Manoj Srivastava. This is free software; see the GNU General Public Licence for copying conditions. There is NO warranty. Usage: $progname [options] dest_file src_dir Options: -h, --help print this message -s foo, --src-dir foo Set the src dir (historical md5sums live here) -d [n], --debug [n] Set the Debug level to N -n, --no-action Dry run. No action is actually taken. -v, --verbose Make the script verbose By default, the directory the new_file lives in is assumed to be the src-dir, which is where we look for any historical md5sums. END } ###################################################################### ######## ######### ######## Command line args ######### ######## ######### ###################################################################### # # Long term variables# # docmd='YES' action='withecho' DEBUG=0 VERBOSE='' statedir='/var/lib/ucf'; # Note that we use `"$@"' to let each command-line parameter expand to a # separate word. The quotes around `$@' are essential! # We need TEMP as the `eval set --' would nuke the return value of getopt. TEMP=$(getopt -o hs:d:D::nv -n "$progname" \ --long help,src-dir:,dest-dir:DEBUG::,no-action,verbose \ -- "$@") if [ $? != 0 ] ; then echo "Error handling options.Terminating..." >&2 ; exit 1 ; fi # Note the quotes around `$TEMP': they are essential! eval set -- "$TEMP" while true ; do case "$1" in -h|--help) usageversion; exit 0 ;; -n|--no-action) action='echo'; docmd='NO'; shift ;; -v|--verbose) VERBOSE=1; shift ;; -s|--src-dir) opt_source_dir="$2"; shift 2 ;; -d|--debug) # d has an optional argument. As we are in quoted mode, # an empty parameter will be generated if its optional # argument is not found. case "$2" in "") setq DEBUG 1 "The Debug value"; shift 2 ;; *) setq DEBUG "$2" "The Debug value"; shift 2 ;; esac ;; --) shift ; break ;; *) echo "Internal error!" ; exit 1 ;; esac done if [ $# != 2 ]; then echo >&2 "*** ERROR: Need exactly two arguments, got $#"; echo >&2 "" usageversion; exit 0 ; fi setq dest_file "$1" "The Destination file"; setq source_dir "$2" "The source directory"; # Load site defaults and over rides. if [ -f /etc/ucf.conf ]; then . /etc/ucf.conf fi # Command line, env variable, config file, or default if [ "X$source_dir" = "X" ]; then if [ ! "x$opt_source_dir" = "x" ]; then setq source_dir "$opt_source_dir" "The Source directory" elif [ ! "x$UCF_SOURCE_DIR" = "x" ]; then setq source_dir "$UCF_SOURCE_DIR" "The Source directory" elif [ ! "x$conf_source_dir" = "x" ]; then setq source_dir "$conf_source_dir" "The Source directory" fi fi if [ ! -d "$source_dir" ]; then echo >&2 "The source dir does not exist. Stopping now." exit 2; fi if [ "X$dest_file" = "X" ]; then echo >&2 "Uknown file to search for. Stopping now." exit 2; fi old_mdsum_dir="$source_dir/$(basename ${new_file}).md5sum.d"; old_mdsum_file="$source_dir/$(basename ${new_file}).md5sum"; if [ -e "$statedir/hashfile" -a ! -r "$statedir/hashfile" ]; then echo >&2 "$progname: do not have read privilege to the state data" if [ "X$docmd" = "XYES" ]; then exit 1; fi fi # test and see if this file exists in the database if [ -e "$statedir/hashfile" ]; then if [ "X$VERBOSE" != "X" ]; then echo >&2 "The hash file exists"; echo grep "[[:space:]]${dest_file}$" "$statedir/hashfile"; grep "[[:space:]]${dest_file}$" "$statedir/hashfile" ; fi lastsum=$(grep "[[:space:]]${dest_file}$" "$statedir/hashfile" | \ awk '{print $1;}' ); fi if [ "X$lastsum" = "X" ]; then echo >&2 "$progname: No record of file in databse. Stopping now." exit 2; fi if [ $DEBUG -gt 0 ]; then cat <<EOF The new start file is \`$new_file\' The destination is \`$dest_file\' The history is kept under \'$source_dir\' EOF if [ -s "$dest_file" ]; then echo "The destination file exists, and has md5sum:" $action md5sum "$dest_file" else echo "The destination file does not exist." fi if [ "X$lastsum" != "X" ]; then echo "The old md5sum exists, and is:" echo "$lastsum" else echo "The old md5sum does not exist." fi if [ -e "$new_file" ]; then echo "The new file exists, and has md5sum:" $action md5sum "$new_file" else echo "The new file does not exist." fi if [ -d "$old_mdsum_dir" ]; then echo "The historical md5sum dir $old_mdsum_dir exists" elif [ -f "$old_mdsum_file" ]; then echo "The histotical md5sum file $old_mdsum_file exists" else echo "Historical md5sums are not available" fi fi if [ -d "$old_mdsum_dir" -o -f "$old_mdsum_file" ]; then if [ -d "$old_mdsum_dir" ]; then for file in ${old_mdsum_dir}/*; do oldsum="$(awk '{print $1}' $file)"; if [ "$oldsum" = "$destsum" ]; then # Bingo! echo "$(awk '{print $2}' $file)"; exit 0; fi done elif [ -f "$old_mdsum_file" ]; then oldsum=$(grep "^${destsum}" "$old_mdsum_file") if [ "X$oldsum" != "X" ]; then # Bingo echo $(grep "^${destsum}" "$old_mdsum_file" | awk '{print $2}') exit 0; fi fi # Well, nothing matched. We now check to see if the # maintainer has an opinion on how to set the ``md5sum of the # previously installed version'', since we have no way of # determining that automatically. Please note that unless # there are limited number of previously released packages # (like just one), the maintainer is also making a guess at # this point by supplying a historical md5sum default file. if [ "X$VERBOSE" != "X" ]; then echo >&2 "Histotical md5sums did not match." fi if [ -d "$old_mdsum_dir" ]; then if [ -e "${old_mdsum_dir}/default" ]; then echo default; exit 0; fi elif [ -f "$old_mdsum_file" ]; then oldsum=$(grep "[[:space:]]default$" "$old_mdsum_file" | \ awk '{print $1;}') if [ "X$oldsum" != "X" ]; then # Bingo echo default; exit 0; fi fi fi exit 0;