1 1.3 mikel #! /bin/sh -- 2 1.3 mikel # 3 1.33 dbj # $NetBSD: checkflist,v 1.33 2006/09/11 22:16:10 dbj Exp $ 4 1.3 mikel # 5 1.30 apb # Verify output of makeflist against contents of ${DESTDIR} and ${metalog}. 6 1.1 cgd 7 1.29 apb if [ -z "${DESTDIR}" ]; then 8 1.15 lukem echo "DESTDIR must be set" 9 1.1 cgd exit 1 10 1.15 lukem fi 11 1.15 lukem 12 1.29 apb prog="${0##*/}" 13 1.27 apb rundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/" 14 1.27 apb . "${rundir}/sets.subr" 15 1.1 cgd 16 1.29 apb SDIR="$(${MKTEMP} -d "/tmp/${prog}.XXXXXX")" 17 1.20 lukem 18 1.20 lukem es=0 19 1.20 lukem cleanup() 20 1.20 lukem { 21 1.29 apb /bin/rm -rf "${SDIR}" 22 1.32 apb if [ ${es} -gt 255 ]; then 23 1.20 lukem es=255 24 1.20 lukem fi 25 1.29 apb exit ${es} 26 1.20 lukem } 27 1.20 lukem trap cleanup 0 2 3 13 # EXIT INT QUIT PIPE 28 1.20 lukem 29 1.9 ross origin=. 30 1.10 perry xargs="" 31 1.10 perry dargs="" 32 1.15 lukem metalog= 33 1.22 lukem allowextra=false 34 1.22 lukem allowmissing=false 35 1.10 perry 36 1.10 perry # handle args 37 1.24 lukem while getopts xbM:em ch; do 38 1.24 lukem case ${ch} in 39 1.24 lukem x) 40 1.10 perry xargs="-x" 41 1.18 tron origin="./etc/X11 ./etc/fonts ./usr/X11R6" 42 1.10 perry ;; 43 1.24 lukem b) 44 1.10 perry xargs="-b" 45 1.10 perry ;; 46 1.24 lukem M) 47 1.29 apb metalog="${OPTARG}" 48 1.15 lukem ;; 49 1.24 lukem e) 50 1.22 lukem allowextra=true 51 1.22 lukem ;; 52 1.24 lukem m) 53 1.22 lukem allowmissing=true 54 1.22 lukem ;; 55 1.24 lukem *) 56 1.10 perry cat 1>&2 <<USAGE 57 1.24 lukem Usage: ${prog} [-x|-b] [-M metalog] [-e] [-m] 58 1.24 lukem -x check only x11 lists 59 1.24 lukem -b check netbsd + x11 lists 60 1.15 lukem -M metalog metalog file 61 1.22 lukem -e extra files are not considered an error 62 1.22 lukem -m missing files are not considered an error 63 1.10 perry USAGE 64 1.10 perry exit 1 65 1.10 perry ;; 66 1.10 perry esac 67 1.10 perry done 68 1.24 lukem shift $((${OPTIND} - 1)) 69 1.10 perry 70 1.30 apb # 71 1.30 apb # Exceptions to flist checking (all begin with "./"): 72 1.30 apb # 73 1.30 apb # * ignore var/db/syspkg and its contents 74 1.30 apb # * ignore ${metalog} 75 1.30 apb # * ignore METALOG 76 1.30 apb # * ignore etc/mtree/set.* 77 1.30 apb # 78 1.30 apb IGNORE_REGEXP="^\./var/db/syspkg(\$|/)" 79 1.29 apb if [ -n "${metalog}" ]; then 80 1.30 apb ml="${metalog#${DESTDIR}/}" 81 1.30 apb ml2="METALOG" 82 1.30 apb IGNORE_REGEXP="${IGNORE_REGEXP}|^\./${ml}\$|^\./${ml2}\$" 83 1.30 apb IGNORE_REGEXP="${IGNORE_REGEXP}|^\./etc/mtree/set\.[a-z]*\$" 84 1.15 lukem fi 85 1.15 lukem 86 1.30 apb # 87 1.30 apb # Here would be a good place to add custom exceptions to flist checking. 88 1.30 apb # 89 1.15 lukem 90 1.30 apb # 91 1.30 apb # Make three lists: 92 1.30 apb # * ${SDIR}/files: files present in DESTDIR. 93 1.30 apb # * ${SDIR}/flist: files mentioned in flist; 94 1.30 apb # * ${SDIR}/mlist: files mentioned in metalog; 95 1.30 apb # 96 1.30 apb ( cd "${DESTDIR}" && ${FIND} ${origin} \ 97 1.30 apb \( -type d -o -type f -o -type l \) -print ) \ 98 1.30 apb | ${SORT} -u | ${EGREP} -v -e "${IGNORE_REGEXP}" >"${SDIR}/files" 99 1.30 apb ${HOST_SH} "${rundir}/makeflist" ${xargs} ${dargs} \ 100 1.30 apb | ${SORT} -u | ${EGREP} -v -e "${IGNORE_REGEXP}" >"${SDIR}/flist" 101 1.30 apb if [ -n "${metalog}" ]; then 102 1.30 apb ${AWK} '{print $1}' <"${metalog}" \ 103 1.30 apb | ${SORT} -u | ${EGREP} -v -e "${IGNORE_REGEXP}" >"${SDIR}/mlist" 104 1.30 apb fi 105 1.10 perry 106 1.30 apb # 107 1.30 apb # compare DESTDIR with METALOG, and report on differences. 108 1.30 apb # 109 1.31 apb # XXX: Temporarily disabled due to problems with obsolete files in metalog 110 1.31 apb # 111 1.31 apb if false && [ -n "${metalog}" ]; then 112 1.30 apb ${COMM} -23 "${SDIR}/files" "${SDIR}/mlist" > "${SDIR}/missing" 113 1.30 apb ${COMM} -13 "${SDIR}/files" "${SDIR}/mlist" > "${SDIR}/extra" 114 1.15 lukem 115 1.33 dbj # Handle case insensitive filesystems 116 1.33 dbj mv -f "${SDIR}/extra" "${SDIR}/extra.all" 117 1.33 dbj while read f; do 118 1.33 dbj [ -f "${DESTDIR}/${f}" ] || \ 119 1.33 dbj [ -d "${DESTDIR}/${f}" ] || \ 120 1.33 dbj [ -L "${DESTDIR}/${f}" ] || echo "$f" 121 1.33 dbj done < "${SDIR}/extra.all" > "${SDIR}/extra" 122 1.33 dbj 123 1.30 apb if [ -s "${SDIR}/extra" ]; then 124 1.30 apb count="$(${AWK} 'END {print NR}' "${SDIR}/extra")" 125 1.30 apb echo "" 126 1.30 apb echo "======= ${count} extra files in METALOG =========" 127 1.30 apb echo "Files in METALOG but missing from DESTDIR." 128 1.30 apb echo "File was deleted after installation ?" 129 1.30 apb echo "------------------------------------------" 130 1.30 apb cat "${SDIR}/extra" 131 1.30 apb echo "========= end of ${count} extra files ===========" 132 1.30 apb echo "" 133 1.30 apb es=1 # this is fatal even if ${allowextra} is true 134 1.30 apb fi 135 1.30 apb 136 1.30 apb if [ -s "${SDIR}/missing" ]; then 137 1.30 apb count="$(${AWK} 'END {print NR}' "${SDIR}/missing")" 138 1.30 apb echo "" 139 1.30 apb echo "====== ${count} missing files in METALOG ========" 140 1.30 apb echo "Files in DESTDIR but missing from METALOG." 141 1.30 apb echo "File installed but not registered in METALOG ?" 142 1.30 apb echo "------------------------------------------" 143 1.30 apb cat "${SDIR}/missing" 144 1.30 apb echo "======== end of ${count} missing files ==========" 145 1.30 apb echo "" 146 1.30 apb es=1 # this is fatal even if ${allowmissing} is true 147 1.30 apb fi 148 1.30 apb fi 149 1.30 apb 150 1.30 apb # 151 1.30 apb # compare flist with DESTDIR, and report on differences. 152 1.30 apb # 153 1.30 apb ${COMM} -23 "${SDIR}/flist" "${SDIR}/files" > "${SDIR}/missing" 154 1.30 apb ${COMM} -13 "${SDIR}/flist" "${SDIR}/files" > "${SDIR}/extra" 155 1.15 lukem 156 1.33 dbj # Handle case insensitive filesystems 157 1.33 dbj mv -f "${SDIR}/missing" "${SDIR}/missing.all" 158 1.33 dbj while read f; do 159 1.33 dbj [ -f "${DESTDIR}/${f}" ] || \ 160 1.33 dbj [ -d "${DESTDIR}/${f}" ] || \ 161 1.33 dbj [ -L "${DESTDIR}/${f}" ] || echo "$f" 162 1.33 dbj done < "${SDIR}/missing.all" > "${SDIR}/missing" 163 1.33 dbj 164 1.29 apb if [ -s "${SDIR}/extra" ]; then 165 1.29 apb count="$(${AWK} 'END {print NR}' "${SDIR}/extra")" 166 1.20 lukem echo "" 167 1.30 apb echo "======= ${count} extra files in DESTDIR =========" 168 1.20 lukem echo "Files in DESTDIR but missing from flist." 169 1.20 lukem echo "File is obsolete or flist is out of date ?" 170 1.22 lukem if ${allowextra}; then 171 1.30 apb echo "This is non-fatal, due to '-e' option." 172 1.22 lukem else 173 1.22 lukem es=1 174 1.22 lukem fi 175 1.20 lukem echo "------------------------------------------" 176 1.29 apb cat "${SDIR}/extra" 177 1.25 lukem echo "========= end of ${count} extra files ===========" 178 1.20 lukem echo "" 179 1.20 lukem fi 180 1.20 lukem 181 1.29 apb if [ -s "${SDIR}/missing" ]; then 182 1.29 apb count="$(${AWK} 'END {print NR}' "${SDIR}/missing")" 183 1.20 lukem echo "" 184 1.30 apb echo "====== ${count} missing files in DESTDIR ========" 185 1.20 lukem echo "Files in flist but missing from DESTDIR." 186 1.20 lukem echo "File wasn't installed ?" 187 1.22 lukem if ${allowmissing}; then 188 1.30 apb echo "This is non-fatal, due to '-m' option." 189 1.22 lukem else 190 1.22 lukem es=1 191 1.22 lukem fi 192 1.20 lukem echo "------------------------------------------" 193 1.29 apb cat "${SDIR}/missing" 194 1.25 lukem echo "======== end of ${count} missing files ==========" 195 1.20 lukem echo "" 196 1.15 lukem fi 197 1.20 lukem 198 1.29 apb exit 0 # cleanup will exit with ${es} 199