blob: 51bf9ed634ac9043897305bfba09d45026edd8a4 (
plain)
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
|
#!/bin/bash
#
# Generate MD5 Files for Release Tracking
#
# This Script can be used on both sides - the host and the target
#
FULLARGS="$@"
DEBUG=${DEBUG:="false"}
# DEFAULTS:
RELEASE="release"
ACTION="check"
ROOT="/"
REPORT="false"
LOCALSTATS="local"
STORE="var/cache/file-check"
#
# helper functions
#
debug_out(){
[ "$DEBUG" = "true" ] && echo "$0: $1" >&2
}
debug_out "Debugging is enabled - Turn off with DEBUG=false"
my_exit(){
debug_out "$0: $1"
exit $2
}
check_argument(){
case "$1" in
--*|"")
debug_out "missing argument"
return 1
;;
[[:alnum:]/]*)
#debug_out "argument $1 accepted"
return 0
;;
esac
}
usage() {
echo
[ -n "$1" ] && echo -e "${PREFIX} error: $1\n"
echo "Generate / Check MD5 Files for Release Tracking"
echo
echo "usage: $0 <args>"
echo
echo " Arguments:"
echo
echo " --action create | check Default: check"
echo " --root <path> Path of the root directory Default: /"
echo " --release <name> the release name Default: release"
echo " --report print a report on stdout Default: deactivated"
echo " --store <path> path of the release store Default: $STORE"
echo
echo " $0 returns with an exit status != 0, if something failed."
echo
exit 0
}
#
# Option parser
#
while [ $# -gt 0 ]; do
case "$1" in
--help) usage ;;
--action)
check_argument $2
if [ "$?" = "0" ] ; then
ACTION="$2";
shift 2 ;
else
debug_out "skipping option $1";
shift 1 ;
fi
;;
--release)
check_argument $2
if [ "$?" = "0" ] ; then
RELEASE="$2";
shift 2 ;
else
debug_out "skipping option $1";
shift 1 ;
fi
;;
--root)
check_argument $2
if [ "$?" = "0" ] ; then
ROOT="$2";
shift 2 ;
else
debug_out "skipping option $1";
shift 1 ;
fi
;;
--store)
check_argument $2
if [ "$?" = "0" ] ; then
STORE="$2";
shift 2 ;
else
debug_out "skipping option $1";
shift 1 ;
fi
;;
--report)
REPORT="true";
shift 1 ;
;;
*)
usage "unknown option $1"
;;
esac
done
#
# sanity checks
#
#
# functions
#
create_md5(){
if [ -d "$ROOT" ]; then
cd $ROOT
debug_out "ROOT Directory is >$(pwd)<"
RELEASEDIR=$STORE/$RELEASE
mkdir -p "$RELEASEDIR" || my_exit "mkdir $ROOT/$RELEASEDIR failed" 1
find . -type f | egrep -v "/sys/|/proc/|/dev/|/mnt|/$STORE" > $RELEASEDIR/files.list
LC_ALL=C sort -u $RELEASEDIR/files.list > $RELEASEDIR/files.list.tmp && mv $RELEASEDIR/files.list.tmp $RELEASEDIR/files.list
while read line ; do
md5sum $line
done < $RELEASEDIR/files.list > $RELEASEDIR/files.md5
else
my_exit "directory $ROOT was not found" 1
fi
}
check_md5(){
if [ -d "$ROOT" ]; then
cd $ROOT
debug_out "ROOT Directory is >$(pwd)<"
RELEASEDIR=$STORE/$RELEASE
[ -d "$RELEASEDIR" ] || my_exit "release >$RELEASE< invalid" 1
LOCALSTATSDIR=$STORE/$LOCALSTATS
mkdir -p "$LOCALSTATSDIR" || my_exit "mkdir $ROOT/$LOCALSTATSDIR failed" 1
echo "# $(date)" > $LOCALSTATSDIR/check-md5.status
echo "# These files differ from release $RELEASE:" >> $LOCALSTATSDIR/check-md5.status
echo "# " >> $LOCALSTATSDIR/check-md5.status
echo "----------- START ------------" >> $LOCALSTATSDIR/check-md5.status
md5sum -c $RELEASEDIR/files.md5 | grep -v OK | sed s/:\ FAILED//g>> $LOCALSTATSDIR/check-md5.status
echo "------------ END -------------" >> $LOCALSTATSDIR/check-md5.status
#
find . -type f | egrep -v "/sys/|/proc/|/dev/|/mnt|/$STORE" > $LOCALSTATSDIR/files.list
LC_ALL=C sort -u $LOCALSTATSDIR/files.list > $LOCALSTATSDIR/files.list.tmp && mv $LOCALSTATSDIR/files.list.tmp $LOCALSTATSDIR/files.list
echo "# $(date)" > $LOCALSTATSDIR/check-files.status
echo "# These files do not appear in release $RELEASE, " >> $LOCALSTATSDIR/check-files.status
echo "# however - they appear on the system:" >> $LOCALSTATSDIR/check-files.status
echo "# " >> $LOCALSTATSDIR/check-files.status
echo "----------- START ------------" >> $LOCALSTATSDIR/check-files.status
diff $RELEASEDIR/files.list $LOCALSTATSDIR/files.list | egrep "<|>" | sed s/'[><][ ][\.]'//g >> $LOCALSTATSDIR/check-files.status
echo "------------ END -------------" >> $LOCALSTATSDIR/check-files.status
#
if [ "$REPORT" = "true" ]; then
echo
cat $LOCALSTATSDIR/check-md5.status
echo
cat $LOCALSTATSDIR/check-files.status
echo
fi
else
my_exit "directory $ROOT was not found" 1
fi
}
create_ipkglist(){
which ipkg 2>&1 >/dev/null || return
if [ -d "$ROOT" ]; then
cd $ROOT
debug_out "ROOT Directory is >$(pwd)<"
RELEASEDIR=$STORE/$RELEASE
mkdir -p "$RELEASEDIR" || my_exit "mkdir $ROOT/$RELEASEDIR failed" 1
ipkg list > $RELEASEDIR/ipkg.list
LC_ALL=C sort -u $RELEASEDIR/ipkg.list > $RELEASEDIR/ipkg.list.tmp && mv $RELEASEDIR/ipkg.list.tmp $RELEASEDIR/ipkg.list
else
my_exit "directory $ROOT was not found" 1
fi
}
check_ipkglist(){
which ipkg 2>&1 >/dev/null || return
if [ -d "$ROOT" ]; then
cd $ROOT
debug_out "ROOT Directory is >$(pwd)<"
RELEASEDIR=$STORE/$RELEASE
[ -d "$RELEASEDIR" ] || my_exit "release >$RELEASE< invalid" 1
[ -e "$RELEASEDIR/ipkg.list" ] || return
LOCALSTATSDIR=$STORE/$LOCALSTATS
mkdir -p "$LOCALSTATSDIR" || my_exit "mkdir $ROOT/$LOCALSTATSDIR failed" 1
ipkg list > $LOCALSTATSDIR/ipkg.list
LC_ALL=C sort -u $LOCALSTATSDIR/ipkg.list > $LOCALSTATSDIR/ipkg.list.tmp && mv $LOCALSTATSDIR/ipkg.list.tmp $LOCALSTATSDIR/ipkg.list
echo "# $(date)" > $LOCALSTATSDIR/check-ipkglist.status
echo "# These package versions differ from release $RELEASE:" >> $LOCALSTATSDIR/check-ipkglist.status
echo "# " >> $LOCALSTATSDIR/check-ipkglist.status
echo "----------- START ------------" >> $LOCALSTATSDIR/check-ipkglist.status
diff $RELEASEDIR/ipkg.list $LOCALSTATSDIR/ipkg.list | egrep ">" | sed s/'[><][ ]'//g >> $LOCALSTATSDIR/check-ipkglist.status
echo "------------ END -------------" >> $LOCALSTATSDIR/check-ipkglist.status
#
if [ "$REPORT" = "true" ]; then
cat $LOCALSTATSDIR/check-ipkglist.status
echo
fi
else
my_exit "directory $ROOT was not found" 1
fi
}
#
# argument handling
#
case $ACTION in
create)
create_md5
create_ipkglist
;;
check)
check_md5
check_ipkglist
;;
*)
my_exit "Sorry, unknown --action specified: $ACTION"
;;
esac
# vim: syntax=sh
# vim: tabstop=4
|