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