1 1.3 mikel #! /bin/sh -- 2 1.3 mikel # 3 1.34 apb # $NetBSD: checkflist,v 1.34 2009/04/23 09:30:56 apb 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.34 apb # * ignore METALOG and METALOG.* 75 1.30 apb # * ignore etc/mtree/set.* 76 1.30 apb # 77 1.30 apb IGNORE_REGEXP="^\./var/db/syspkg(\$|/)" 78 1.34 apb IGNORE_REGEXP="${IGNORE_REGEXP}|^\./METALOG(\..*)?\$" 79 1.34 apb IGNORE_REGEXP="${IGNORE_REGEXP}|^\./etc/mtree/set\.[a-z]*\$" 80 1.15 lukem 81 1.30 apb # 82 1.30 apb # Here would be a good place to add custom exceptions to flist checking. 83 1.30 apb # 84 1.15 lukem 85 1.30 apb # 86 1.30 apb # Make three lists: 87 1.30 apb # * ${SDIR}/files: files present in DESTDIR. 88 1.30 apb # * ${SDIR}/flist: files mentioned in flist; 89 1.30 apb # * ${SDIR}/mlist: files mentioned in metalog; 90 1.30 apb # 91 1.34 apb # All three lists are filtered against ${IGNORE_REGEXP}. 92 1.34 apb # 93 1.30 apb ( cd "${DESTDIR}" && ${FIND} ${origin} \ 94 1.30 apb \( -type d -o -type f -o -type l \) -print ) \ 95 1.30 apb | ${SORT} -u | ${EGREP} -v -e "${IGNORE_REGEXP}" >"${SDIR}/files" 96 1.30 apb ${HOST_SH} "${rundir}/makeflist" ${xargs} ${dargs} \ 97 1.30 apb | ${SORT} -u | ${EGREP} -v -e "${IGNORE_REGEXP}" >"${SDIR}/flist" 98 1.30 apb if [ -n "${metalog}" ]; then 99 1.30 apb ${AWK} '{print $1}' <"${metalog}" \ 100 1.30 apb | ${SORT} -u | ${EGREP} -v -e "${IGNORE_REGEXP}" >"${SDIR}/mlist" 101 1.30 apb fi 102 1.10 perry 103 1.30 apb # 104 1.30 apb # compare DESTDIR with METALOG, and report on differences. 105 1.30 apb # 106 1.31 apb # XXX: Temporarily disabled due to problems with obsolete files in metalog 107 1.31 apb # 108 1.31 apb if false && [ -n "${metalog}" ]; then 109 1.30 apb ${COMM} -23 "${SDIR}/files" "${SDIR}/mlist" > "${SDIR}/missing" 110 1.30 apb ${COMM} -13 "${SDIR}/files" "${SDIR}/mlist" > "${SDIR}/extra" 111 1.15 lukem 112 1.33 dbj # Handle case insensitive filesystems 113 1.33 dbj mv -f "${SDIR}/extra" "${SDIR}/extra.all" 114 1.33 dbj while read f; do 115 1.33 dbj [ -f "${DESTDIR}/${f}" ] || \ 116 1.33 dbj [ -d "${DESTDIR}/${f}" ] || \ 117 1.33 dbj [ -L "${DESTDIR}/${f}" ] || echo "$f" 118 1.33 dbj done < "${SDIR}/extra.all" > "${SDIR}/extra" 119 1.33 dbj 120 1.30 apb if [ -s "${SDIR}/extra" ]; then 121 1.30 apb count="$(${AWK} 'END {print NR}' "${SDIR}/extra")" 122 1.30 apb echo "" 123 1.30 apb echo "======= ${count} extra files in METALOG =========" 124 1.30 apb echo "Files in METALOG but missing from DESTDIR." 125 1.30 apb echo "File was deleted after installation ?" 126 1.30 apb echo "------------------------------------------" 127 1.30 apb cat "${SDIR}/extra" 128 1.30 apb echo "========= end of ${count} extra files ===========" 129 1.30 apb echo "" 130 1.30 apb es=1 # this is fatal even if ${allowextra} is true 131 1.30 apb fi 132 1.30 apb 133 1.30 apb if [ -s "${SDIR}/missing" ]; then 134 1.30 apb count="$(${AWK} 'END {print NR}' "${SDIR}/missing")" 135 1.30 apb echo "" 136 1.30 apb echo "====== ${count} missing files in METALOG ========" 137 1.30 apb echo "Files in DESTDIR but missing from METALOG." 138 1.30 apb echo "File installed but not registered in METALOG ?" 139 1.30 apb echo "------------------------------------------" 140 1.30 apb cat "${SDIR}/missing" 141 1.30 apb echo "======== end of ${count} missing files ==========" 142 1.30 apb echo "" 143 1.30 apb es=1 # this is fatal even if ${allowmissing} is true 144 1.30 apb fi 145 1.30 apb fi 146 1.30 apb 147 1.30 apb # 148 1.30 apb # compare flist with DESTDIR, and report on differences. 149 1.30 apb # 150 1.30 apb ${COMM} -23 "${SDIR}/flist" "${SDIR}/files" > "${SDIR}/missing" 151 1.30 apb ${COMM} -13 "${SDIR}/flist" "${SDIR}/files" > "${SDIR}/extra" 152 1.15 lukem 153 1.33 dbj # Handle case insensitive filesystems 154 1.33 dbj mv -f "${SDIR}/missing" "${SDIR}/missing.all" 155 1.33 dbj while read f; do 156 1.33 dbj [ -f "${DESTDIR}/${f}" ] || \ 157 1.33 dbj [ -d "${DESTDIR}/${f}" ] || \ 158 1.33 dbj [ -L "${DESTDIR}/${f}" ] || echo "$f" 159 1.33 dbj done < "${SDIR}/missing.all" > "${SDIR}/missing" 160 1.33 dbj 161 1.29 apb if [ -s "${SDIR}/extra" ]; then 162 1.29 apb count="$(${AWK} 'END {print NR}' "${SDIR}/extra")" 163 1.20 lukem echo "" 164 1.30 apb echo "======= ${count} extra files in DESTDIR =========" 165 1.20 lukem echo "Files in DESTDIR but missing from flist." 166 1.20 lukem echo "File is obsolete or flist is out of date ?" 167 1.22 lukem if ${allowextra}; then 168 1.30 apb echo "This is non-fatal, due to '-e' option." 169 1.22 lukem else 170 1.22 lukem es=1 171 1.22 lukem fi 172 1.20 lukem echo "------------------------------------------" 173 1.29 apb cat "${SDIR}/extra" 174 1.25 lukem echo "========= end of ${count} extra files ===========" 175 1.20 lukem echo "" 176 1.20 lukem fi 177 1.20 lukem 178 1.29 apb if [ -s "${SDIR}/missing" ]; then 179 1.29 apb count="$(${AWK} 'END {print NR}' "${SDIR}/missing")" 180 1.20 lukem echo "" 181 1.30 apb echo "====== ${count} missing files in DESTDIR ========" 182 1.20 lukem echo "Files in flist but missing from DESTDIR." 183 1.20 lukem echo "File wasn't installed ?" 184 1.22 lukem if ${allowmissing}; then 185 1.30 apb echo "This is non-fatal, due to '-m' option." 186 1.22 lukem else 187 1.22 lukem es=1 188 1.22 lukem fi 189 1.20 lukem echo "------------------------------------------" 190 1.29 apb cat "${SDIR}/missing" 191 1.25 lukem echo "======== end of ${count} missing files ==========" 192 1.20 lukem echo "" 193 1.15 lukem fi 194 1.20 lukem 195 1.29 apb exit 0 # cleanup will exit with ${es} 196