Sindbad~EG File Manager
#!/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 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;
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists