-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlcf
executable file
·260 lines (230 loc) · 7.6 KB
/
lcf
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/sh
# -*- Mode: Sh -*-
# lcf ---
# Author : Manoj Srivastava ( [email protected] )
# 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;