forked from mediamicroservices/mm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchecksumpackage
executable file
·190 lines (182 loc) · 8.42 KB
/
checksumpackage
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
#!/bin/bash
# checksumpackage
# make checksum.md5 via md5deep for package
# version 1.1 adds use of dfxml
# version 1.2 fixes + add options to check and verify existing checksums
version=1.2
scriptdir=$(dirname "${0}")
. "${scriptdir}/mmfunctions" || { echo "Missing '${scriptdir}/mmfunctions'. Exiting." ; exit 1 ;};
unset dependencies
dependencies=(md5deep xml "${scriptdir}/removeDSStore")
# local variables
CHECKSUMNAME="checksum.md5"
DFXMLNAME="dfxml.xml"
CHECKSUMPROCESSLOG="checksumchecks.log"
usage(){
echo
echo "$(basename "${0}") ${version}"
echo "This application will create a checksum from a directory or package input with the following options. Actions and results will be logged to ${CHECKSUMPROCESSLOG}."
echo "Dependencies: ${dependencies[@]}"
echo "Usage: $(basename "${0}") directoryorpackage1 [ directoryorpackage2 ...]"
echo " -c ( check filenames and filesizes in objects directory are the same as in existing checksum files, if none exists it will make the initial ones )"
echo " -u ( valid only if -c is used. If the check is unsuccessful then make new checksums and version the previous ones. )"
echo " -v ( fully verify checksum files against checksum files, if none exists it will make the initial ones. Note verification will version existing checksums and make new ones and log the difference to ${CHECKSUMPROCESSLOG})"
echo " -h ( display this help )"
echo
exit
}
[ "${#}" = 0 ] && usage
check_dependencies "${dependencies[@]}"
if [[ $(echo "$(md5deep -v) >= 4.4" | bc) = 0 ]] ; then
report -wt "$(basename "${0}") requires md5deep 4.4 or greater."
exit 1
fi
cleanup(){
_log -a "Process aborted"
exit 1
}
# command-line options
check=""
verify=""
update=""
OPTIND=1
while getopts ":cvuh" opt ; do
case "${opt}" in
c) check="Y";;
v) verify="Y";;
u) update="Y";;
h) usage ;;
*) echo "bad option -$OPTARG" ; usage ;;
:) echo "Option -$OPTARG requires an argument" ; exit 1 ;;
esac
done
shift $(( ${OPTIND} - 1 ))
trap cleanup SIGHUP SIGINT SIGTERM
_check_dfxml(){
PACKAGE="${1}"
# make temp file that lists filenames and filesizes from dfxml.xml
DFXML_FILELIST="$(maketemp)"
if [ ! -z "$(xml sel -T -t -m "/_:dfxml/_:fileobject" -v "_:filename" -o " " -v "_:filesize" -n "${PACKAGE}/${OUTDIR}/${DFXMLNAME}" 2>/dev/null)" ] ; then
xml sel -T -t -m "/_:dfxml/_:fileobject" -v "_:filename" -o " " -v "_:filesize" -n "${PACKAGE}/${OUTDIR}/${DFXMLNAME}" | sort > "${DFXML_FILELIST}"
else
xml sel -T -t -m "/dfxml/fileobject" -v "filename" -o " " -v "filesize" -n "${PACKAGE}/${OUTDIR}/${DFXMLNAME}" | sort > "${DFXML_FILELIST}"
fi
pwd=$(pwd)
# make temp file that lists filenames and filesizes from current objects directory
NEW_FILELIST="$(maketemp)"
cd "${PACKAGE}/${INDIR}"
find . -type f ! -name '.DS_Store' | while read i ; do
echo -n "$i "
ls -l "$i" | awk '{print $5}'
done | sort > "${NEW_FILELIST}"
cd "${pwd}"
# compare them
if [[ $(diff "${DFXML_FILELIST}" "${NEW_FILELIST}") ]] ; then
report -wt "filepaths and sizes are different for ${1}"
diff "${DFXML_FILELIST}" "${NEW_FILELIST}"
echo "$(get_iso8601): $(basename "${0}"):${version}: failed to verify by filepath and size" >> "${PACKAGE}/${OUTDIR}/${CHECKSUMPROCESSLOG}"
rm "${DFXML_FILELIST}" "${NEW_FILELIST}"
checkerr=0
else
report -dt "filepaths and sizes are still valid for ${1}"
echo "$(get_iso8601): $(basename "${0}"):${version}: verified by filepath and size" >> "${PACKAGE}/${OUTDIR}/${CHECKSUMPROCESSLOG}"
rm "${DFXML_FILELIST}" "${NEW_FILELIST}"
checkerr=1
fi
}
_version_dfxml(){
PACKAGE="${1}"
report -wdt "Creating a new version of the checksum files."
LASTMD5="${PACKAGE}/${OUTDIR}/${CHECKSUMNAME%.*}_$(stat -t '%Y%m%d-%H%M%S' -l "${PACKAGE}/${OUTDIR}/${CHECKSUMNAME}" | awk '{print $6}').md5"
LASTDFXML="${PACKAGE}/${OUTDIR}/${DFXMLNAME%.*}_$(stat -t '%Y%m%d-%H%M%S' -l "${PACKAGE}/${OUTDIR}/${DFXMLNAME}" | awk '{print $6}').xml"
mv -v "${PACKAGE}/${OUTDIR}/${CHECKSUMNAME}" "${LASTMD5}"
mv -v "${PACKAGE}/${OUTDIR}/${DFXMLNAME}" "${LASTDFXML}"
echo "$(get_iso8601): $(basename "${0}"):${version}: checksums are versioned - ${DFXMLNAME} -> ${LASTDFXML}" >> "${PACKAGE}/${OUTDIR}/${CHECKSUMPROCESSLOG}"
echo "$(get_iso8601): $(basename "${0}"):${version}: checksums are versioned - ${CHECKSUMNAME} -> ${LASTMD5}" >> "${PACKAGE}/${OUTDIR}/${CHECKSUMPROCESSLOG}"
}
while [ "${*}" != "" ] ; do
_log -b
PACKAGE="${1}"
if [ -d "${PACKAGE}" ] ; then
PWD=$(pwd)
"${scriptdir}/removeDSStore" "${PACKAGE}"
if [ -d "${PACKAGE}/objects" ] ; then
INDIR="objects"
OUTDIR="metadata"
else
INDIR="."
OUTDIR="."
fi
if [ "${check}" = "Y" ] ; then
if [ -s "${PACKAGE}/${OUTDIR}/${DFXMLNAME}" ] ; then
_check_dfxml "${PACKAGE}"
if [ "${checkerr}" != "0" ] ; then
shift
continue
else
if [ "${update}" = "Y" ] ; then
_version_dfxml "${PACKAGE}"
else
shift
continue
fi
fi
else
report -dt "There is no dfxml.xml to check in ${PACKAGE}, skipping."
shift
continue
fi
elif [ "${verify}" = "Y" ] ; then
if [ -s "${PACKAGE}/${OUTDIR}/${CHECKSUMNAME}" ] ; then
report -dt "Prepping for dfxml.xml verification."
else
report -dt "There is no dfxml.xml to verify in ${PACKAGE}, skipping."
shift
continue
fi
else
if [ -s "${PACKAGE}/${OUTDIR}/${CHECKSUMNAME}" ] ; then
report -dt "${CHECKSUMNAME} already exists, skipping for ${PACKAGE}"
shift
continue
fi
fi
report -dt "making Digital Forensics XML (${DFXMLNAME}) and (${CHECKSUMNAME}) for ${PACKAGE}"
cd "${PACKAGE}/${INDIR}"
DFXMLTMP=$(maketemp)
md5deep -drl . > $DFXMLTMP
cd "${PWD}"
[ ! -d "${PACKAGE}/${OUTDIR}" ] && mkdir -p "${PACKAGE}/${OUTDIR}"
echo "$(get_iso8601): $(basename "${0}"):${version}: ${DFXMLNAME} is generated" >> "${PACKAGE}/${OUTDIR}/${CHECKSUMPROCESSLOG}"
_version_dfxml "${PACKAGE}"
cat "${DFXMLTMP}" > "${PACKAGE}/${OUTDIR}/${DFXMLNAME}"
if [ ! -z "$(xml sel -T -t -m "/_:dfxml/_:fileobject" -v "_:filename" -o " " -v "_:filesize" -n "${PACKAGE}/${OUTDIR}/${DFXMLNAME}" 2>/dev/null)" ] ; then
xml sel -T -t -m "/_:dfxml/_:fileobject" -v "_:hashdigest" -o " " -v "_:filename" -n "${PACKAGE}/${OUTDIR}/${DFXMLNAME}" > "${PACKAGE}/${OUTDIR}/${CHECKSUMNAME}"
else
xml sel -T -t -m "/dfxml/fileobject" -v "hashdigest" -o " " -v "filename" -n "${PACKAGE}/${OUTDIR}/${DFXMLNAME}" > "${PACKAGE}/${OUTDIR}/${CHECKSUMNAME}"
fi
echo "$(get_iso8601): $(basename "${0}"):${version}: ${CHECKSUMNAME} is generated" >> "${PACKAGE}/${OUTDIR}/${CHECKSUMPROCESSLOG}"
if [ "${verify}" = "Y" ] ; then
CHECKSUMCMP1=$(maketemp)
sort -k2 "${PACKAGE}/${OUTDIR}/${CHECKSUMNAME}" > "${CHECKSUMCMP1}"
CHECKSUMCMP2=$(maketemp)
sort -k2 "${LASTMD5}" > "${CHECKSUMCMP2}"
if [[ $(diff "${CHECKSUMCMP1}" "${CHECKSUMCMP2}") ]] ; then
report -wt "checksums are different for ${PACKAGE}"
diff "${CHECKSUMCMP1}" "${CHECKSUMCMP2}"
echo "$(get_iso8601): $(basename "${0}"):${version}: FAILED to VERIFY by checksums - compare ${CHECKSUMNAME} and $(basename "${LASTMD5}")" >> "${PACKAGE}/${OUTDIR}/${CHECKSUMPROCESSLOG}"
else
report -dt "checksums are still valid for ${PACKAGE}"
echo "$(get_iso8601): $(basename "${0}"):${version}: verified by checksums" >> "${PACKAGE}/${OUTDIR}/${CHECKSUMPROCESSLOG}"
fi
rm "${CHECKSUMCMP1}" "${CHECKSUMCMP2}"
fi
#if [ "$FILEMAKER_XML_URL" ] ; then
#"${scriptdir}/checksum2filemaker" "${PACKAGE}"
#fi
else
report -dt "ERROR: ${0} requires directories as input and ${PACKAGE} is not a directory."
fi
_log -e
shift
done