1 #! /bin/sh -- 2 # 3 # $NetBSD: checkflist,v 1.46 2022/08/21 07:10:03 lukem Exp $ 4 # 5 # Verify output of makeflist against contents of ${DESTDIR} and ${metalog}. 6 7 if [ -z "${DESTDIR}" ]; then 8 echo "DESTDIR must be set" 9 exit 1 10 fi 11 12 prog="${0##*/}" 13 rundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/" 14 . "${rundir}/sets.subr" 15 16 # 17 # * ${SETS_DLIST}: files present in DESTDIR. 18 # * ${SETS_FLIST}: files mentioned in flist; 19 # * ${SETS_MLIST}: files mentioned in metalog; 20 # 21 SETS_DLIST="${DESTDIR}/SETS.dlist" 22 SETS_FLIST="${DESTDIR}/SETS.flist" 23 SETS_MLIST="${DESTDIR}/SETS.mlist" 24 25 # 26 # * ${SETS_METALOG_EXTRA}: Files in METALOG but missing from DESTDIR." 27 # * ${SETS_METALOG_MISSING}: Files in DESTDIR but missing from METALOG." 28 # * ${SETS_DESTDIR_EXTRA}: Files in DESTDIR but missing from setlist." 29 # * ${SETS_DESTDIR_MISSING}: Files in setlist but missing from DESTDIR." 30 # 31 SETS_METALOG_EXTRA="${DESTDIR}/SETS.metalog.extra" 32 SETS_METALOG_MISSING="${DESTDIR}/SETS.metalog.missing" 33 SETS_DESTDIR_EXTRA="${DESTDIR}/SETS.destdir.extra" 34 SETS_DESTDIR_MISSING="${DESTDIR}/SETS.destdir.missing" 35 36 es=0 37 cleanup() 38 { 39 if [ ${es} -gt 255 ]; then 40 es=255 41 fi 42 exit ${es} 43 } 44 trap cleanup 0 2 3 13 # EXIT INT QUIT PIPE 45 46 origin=. 47 xargs="" 48 dargs="" 49 metalog= 50 allowextra=false 51 allowmissing=false 52 53 # handle args 54 while getopts xbL:M:em ch; do 55 case ${ch} in 56 x) 57 xargs="-x" 58 origin="./etc/X11 ./etc/fonts ./usr/X11R7" 59 ;; 60 # backward compat 61 b) 62 xargs="-b" 63 ;; 64 L) 65 xargs="-L ${OPTARG}" 66 ;; 67 M) 68 metalog="${OPTARG}" 69 ;; 70 e) 71 allowextra=true 72 ;; 73 m) 74 allowmissing=true 75 ;; 76 *) 77 cat 1>&2 <<USAGE 78 Usage: ${prog} [-x|-b|-L lists] [-M metalog] [-e] [-m] 79 -x check only x11 lists 80 -b check netbsd + x11 lists 81 -L base,x,ext check specified lists 82 -M metalog metalog file 83 -e extra files are not considered an error 84 -m missing files are not considered an error 85 USAGE 86 exit 1 87 ;; 88 esac 89 done 90 shift $((${OPTIND} - 1)) 91 92 # 93 # Exceptions to flist checking (all begin with "./"): 94 # 95 # * ignore var/db/syspkg and its contents 96 # * ignore METALOG and METALOG.* 97 # * ignore etc/mtree/set.* 98 # 99 ignore_exceptions() 100 { 101 IGNORE_REGEXP_SYSPKG="^\./var/db/syspkg(\$|/)" 102 IGNORE_REGEXP_METALOG="^\./METALOG(\..*)?\$" 103 IGNORE_REGEXP_SETS="^\./SETS\..*\$" 104 IGNORE_REGEXP_MTREE="^\./etc/mtree/set\.[a-z]*\$" 105 106 ${EGREP} -v \ 107 -e "${IGNORE_REGEXP_SYSPKG}" \ 108 -e "${IGNORE_REGEXP_METALOG}" \ 109 -e "${IGNORE_REGEXP_SETS}" \ 110 -e "${IGNORE_REGEXP_MTREE}" 111 } 112 113 # 114 # Here would be a good place to add custom exceptions to flist checking. 115 # 116 117 # 118 # Make three lists: 119 # 120 # All three lists are filtered against ${IGNORE_REGEXP}. 121 # 122 123 generate_dlist() 124 { 125 ( cd "${DESTDIR}" && ${FIND} ${origin} \ 126 \( -type d -o -type f -o -type l \) -print ) \ 127 | ${SORT} -u | ignore_exceptions >"${SETS_DLIST}" 128 } 129 130 generate_flist() 131 { 132 ${HOST_SH} "${rundir}/makeflist" ${xargs} ${dargs} \ 133 | ${SORT} -u | ignore_exceptions >"${SETS_FLIST}" 134 } 135 136 generate_mlist() 137 { 138 if [ -n "${metalog}" ]; then 139 ${AWK} '{print $1}' <"${metalog}" \ 140 | ${SORT} -u | ignore_exceptions >"${SETS_MLIST}" 141 else 142 SETS_MLIST=/dev/null 143 fi 144 } 145 146 generate_mlist_missing() 147 { 148 ${COMM} -23 "${SETS_DLIST}" "${SETS_MLIST}" > "${SETS_METALOG_MISSING}" 149 } 150 151 generate_mlist_extra() 152 { 153 ${COMM} -13 "${SETS_DLIST}" "${SETS_MLIST}" > "${SETS_METALOG_EXTRA}" 154 } 155 156 generate_dlist_missing() 157 { 158 ${COMM} -23 "${SETS_FLIST}" "${SETS_DLIST}" > "${SETS_DESTDIR_MISSING}" 159 } 160 161 generate_dlist_extra() 162 { 163 ${COMM} -13 "${SETS_FLIST}" "${SETS_DLIST}" > "${SETS_DESTDIR_EXTRA}" 164 } 165 166 exist_case_insensitive() 167 { 168 while read f; do 169 [ -f "${DESTDIR}/${f}" ] || \ 170 [ -d "${DESTDIR}/${f}" ] || \ 171 [ -L "${DESTDIR}/${f}" ] || \ 172 echo "$f" 173 done 174 } 175 176 # 177 # compare DESTDIR with METALOG, and report on differences. 178 # 179 compare_metalog() 180 { 181 # Handle case insensitive filesystems 182 mv -f "${SETS_METALOG_EXTRA}" "${SETS_METALOG_EXTRA}.all" 183 exist_case_insensitive < "${SETS_METALOG_EXTRA}.all" > "${SETS_METALOG_EXTRA}" 184 rm -f "${SETS_METALOG_EXTRA}.all" 185 186 check_metalog_extra 187 check_metalog_missing 188 } 189 190 check_metalog_extra() 191 { 192 if [ -s "${SETS_METALOG_EXTRA}" ]; then 193 count="$(${AWK} 'END {print NR}' "${SETS_METALOG_EXTRA}")" 194 echo "" 195 echo "======= ${count} extra files in METALOG =========" 196 echo "Files in METALOG but missing from DESTDIR." 197 echo "File was deleted after installation ?" 198 echo "------------------------------------------" 199 cat "${SETS_METALOG_EXTRA}" 200 echo "========= end of ${count} extra files ===========" 201 echo "" 202 es=1 # this is fatal even if ${allowextra} is true 203 fi 204 } 205 206 check_metalog_missing() 207 { 208 if [ -s "${SETS_METALOG_MISSING}" ]; then 209 count="$(${AWK} 'END {print NR}' "${SETS_METALOG_MISSING}")" 210 echo "" 211 echo "====== ${count} missing files in METALOG ========" 212 echo "Files in DESTDIR but missing from METALOG." 213 echo "File installed but not registered in METALOG ?" 214 echo "------------------------------------------" 215 cat "${SETS_METALOG_MISSING}" 216 echo "======== end of ${count} missing files ==========" 217 echo "" 218 es=1 # this is fatal even if ${allowmissing} is true 219 fi 220 } 221 222 # 223 # compare flist with DESTDIR, and report on differences. 224 # 225 compare_destdir() 226 { 227 # Handle case insensitive filesystems 228 mv -f "${SETS_DESTDIR_MISSING}" "${SETS_DESTDIR_MISSING}.all" 229 exist_case_insensitive < "${SETS_DESTDIR_MISSING}.all" > "${SETS_DESTDIR_MISSING}" 230 rm -f "${SETS_DESTDIR_MISSING}.all" 231 232 check_destdir_extra 233 check_destdir_missing 234 } 235 236 check_destdir_extra() 237 { 238 if [ -s "${SETS_DESTDIR_EXTRA}" ]; then 239 count="$(${AWK} 'END {print NR}' "${SETS_DESTDIR_EXTRA}")" 240 echo "" 241 echo "======= ${count} extra files in DESTDIR =========" 242 echo "Files in DESTDIR but missing from flist." 243 echo "File is obsolete or flist is out of date ?" 244 if ${allowextra}; then 245 echo "This is non-fatal, due to '-e' option." 246 else 247 es=1 248 fi 249 echo "------------------------------------------" 250 cat "${SETS_DESTDIR_EXTRA}" 251 echo "========= end of ${count} extra files ===========" 252 echo "" 253 fi 254 } 255 256 check_destdir_missing() 257 { 258 if [ -s "${SETS_DESTDIR_MISSING}" ]; then 259 count="$(${AWK} 'END {print NR}' "${SETS_DESTDIR_MISSING}")" 260 echo "" 261 echo "====== ${count} missing files in DESTDIR ========" 262 echo "Files in flist but missing from DESTDIR." 263 echo "File wasn't installed ?" 264 if ${allowmissing}; then 265 echo "This is non-fatal, due to '-m' option." 266 else 267 es=1 268 fi 269 echo "------------------------------------------" 270 cat "${SETS_DESTDIR_MISSING}" 271 echo "======== end of ${count} missing files ==========" 272 echo "" 273 fi 274 } 275 276 generate_dlist 277 generate_flist 278 generate_mlist 279 280 generate_mlist_missing 281 generate_mlist_extra 282 283 generate_dlist_missing 284 generate_dlist_extra 285 286 if false && [ -n "${metalog}" ]; then 287 # XXX: Temporarily disabled due to problems with obsolete files in metalog 288 compare_metalog 289 else 290 compare_destdir 291 fi 292 293 exit 0 # cleanup will exit with ${es} 294