mirror of https://gitee.com/openkylin/ucf.git
261 lines
7.6 KiB
Bash
Executable File
261 lines
7.6 KiB
Bash
Executable File
#!/bin/sh
|
|
# -*- 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 historical 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 "Historical 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;
|