File: lcf

package info (click to toggle)
ucf 3.0038%2Bnmu1
  • links: PTS
  • area: main
  • in suites: buster
  • size: 476 kB
  • sloc: sh: 1,429; perl: 400; makefile: 51
file content (260 lines) | stat: -rwxr-xr-x 7,786 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
#!/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;