mm-mtree.sh revision 196434
1196434Sdougb#!/bin/sh 2196434Sdougb 3196434Sdougb# mergemaster mtree database generator 4196434Sdougb 5196434Sdougb# This script is intended to be used as part of the release building 6196434Sdougb# process to generate the /var/db/mergemaster.mtree file relevant to 7196434Sdougb# the source tree used to create the release so that users can make 8196434Sdougb# use of mergemaster's -U option to update their files after csup'ing 9196434Sdougb# to -stable. 10196434Sdougb 11196434Sdougb# Copyright 2009 Douglas Barton 12196434Sdougb# dougb@FreeBSD.org 13196434Sdougb 14196434Sdougb# $FreeBSD: head/release/scripts/mm-mtree.sh 196434 2009-08-23 05:42:50Z dougb $ 15196434Sdougb 16196434SdougbPATH=/bin:/usr/bin:/usr/sbin 17196434Sdougb 18196434Sdougbdisplay_usage () { 19196434Sdougb VERSION_NUMBER=`grep "[$]FreeBSD:" $0 | cut -d ' ' -f 4` 20196434Sdougb echo "${0##*/} version ${VERSION_NUMBER}" 21196434Sdougb echo "Usage: ${0##*/} [-m /path] [-t /path] [-A arch] [-F <make args>] [-D /path]" 22196434Sdougb echo "Options:" 23196434Sdougb echo " -m /path/directory Specify location of source to do the make in" 24196434Sdougb echo " -t /path/directory Specify temp root directory" 25196434Sdougb echo " -A architecture Alternative architecture name to pass to make" 26196434Sdougb echo " -F <arguments for make> Specify what to put on the make command line" 27196434Sdougb echo ' -D /path/directory Specify the destination directory to install files to' 28196434Sdougb echo '' 29196434Sdougb} 30196434Sdougb 31196434Sdougb# Set the default path for the temporary root environment 32196434Sdougb# 33196434SdougbTEMPROOT='/var/tmp/temproot' 34196434Sdougb 35196434Sdougb# Assign the location of the mtree database 36196434Sdougb# 37196434SdougbMTREEDB=${MTREEDB:-/var/db} 38196434SdougbMTREEFILE="${MTREEDB}/mergemaster.mtree" 39196434Sdougb 40196434Sdougb# Check the command line options 41196434Sdougb# 42196434Sdougbwhile getopts "m:t:A:F:D:h" COMMAND_LINE_ARGUMENT ; do 43196434Sdougb case "${COMMAND_LINE_ARGUMENT}" in 44196434Sdougb m) 45196434Sdougb SOURCEDIR=${OPTARG} 46196434Sdougb ;; 47196434Sdougb t) 48196434Sdougb TEMPROOT=${OPTARG} 49196434Sdougb ;; 50196434Sdougb A) 51196434Sdougb ARCHSTRING='TARGET_ARCH='${OPTARG} 52196434Sdougb ;; 53196434Sdougb F) 54196434Sdougb MM_MAKE_ARGS="${OPTARG}" 55196434Sdougb ;; 56196434Sdougb D) 57196434Sdougb DESTDIR=${OPTARG} 58196434Sdougb ;; 59196434Sdougb h) 60196434Sdougb display_usage 61196434Sdougb exit 0 62196434Sdougb ;; 63196434Sdougb *) 64196434Sdougb echo '' 65196434Sdougb display_usage 66196434Sdougb exit 1 67196434Sdougb ;; 68196434Sdougb esac 69196434Sdougbdone 70196434Sdougb 71196434Sdougb# Assign the source directory 72196434Sdougb# 73196434SdougbSOURCEDIR=${SOURCEDIR:-/usr/src} 74196434Sdougbif [ ! -f ${SOURCEDIR}/Makefile.inc1 -a \ 75196434Sdougb -f ${SOURCEDIR}/../Makefile.inc1 ]; then 76196434Sdougb echo " *** The source directory you specified (${SOURCEDIR})" 77196434Sdougb echo " will be reset to ${SOURCEDIR}/.." 78196434Sdougb echo '' 79196434Sdougb sleep 3 80196434Sdougb SOURCEDIR=${SOURCEDIR}/.. 81196434Sdougbfi 82196434Sdougb 83196434Sdougb# Setup make to use system files from SOURCEDIR 84196434SdougbMM_MAKE="make ${ARCHSTRING} ${MM_MAKE_ARGS} -m ${SOURCEDIR}/share/mk" 85196434Sdougb 86196434Sdougbdelete_temproot () { 87196434Sdougb rm -rf "${TEMPROOT}" 2>/dev/null 88196434Sdougb chflags -R 0 "${TEMPROOT}" 2>/dev/null 89196434Sdougb rm -rf "${TEMPROOT}" || exit 1 90196434Sdougb} 91196434Sdougb 92196434Sdougb[ -d "${TEMPROOT}" ] && delete_temproot 93196434Sdougb 94196434Sdougbecho "*** Creating the temporary root environment in ${TEMPROOT}" 95196434Sdougb 96196434Sdougbif mkdir -p "${TEMPROOT}"; then 97196434Sdougb echo " *** ${TEMPROOT} ready for use" 98196434Sdougbfi 99196434Sdougb 100196434Sdougbif [ ! -d "${TEMPROOT}" ]; then 101196434Sdougb echo '' 102196434Sdougb echo " *** FATAL ERROR: Cannot create ${TEMPROOT}" 103196434Sdougb echo '' 104196434Sdougb exit 1 105196434Sdougbfi 106196434Sdougb 107196434Sdougbecho " *** Creating and populating directory structure in ${TEMPROOT}" 108196434Sdougbecho '' 109196434Sdougb 110196434Sdougb{ cd ${SOURCEDIR} || { echo "*** Cannot cd to ${SOURCEDIR}" ; exit 1;} 111196434Sdougb case "${DESTDIR}" in 112196434Sdougb '') ;; 113196434Sdougb *) 114196434Sdougb ${MM_MAKE} DESTDIR=${DESTDIR} distrib-dirs 115196434Sdougb ;; 116196434Sdougb esac 117196434Sdougb od=${TEMPROOT}/usr/obj 118196434Sdougb ${MM_MAKE} DESTDIR=${TEMPROOT} distrib-dirs && 119196434Sdougb MAKEOBJDIRPREFIX=$od ${MM_MAKE} _obj SUBDIR_OVERRIDE=etc && 120196434Sdougb MAKEOBJDIRPREFIX=$od ${MM_MAKE} everything SUBDIR_OVERRIDE=etc && 121196434Sdougb MAKEOBJDIRPREFIX=$od ${MM_MAKE} DESTDIR=${TEMPROOT} distribution;} || 122196434Sdougb { echo ''; 123196434Sdougb echo " *** FATAL ERROR: Cannot 'cd' to ${SOURCEDIR} and install files to"; 124196434Sdougb echo " the temproot environment"; 125196434Sdougb echo ''; 126196434Sdougb exit 1;} 127196434Sdougb 128196434Sdougb# We really don't want to have to deal with files like login.conf.db, pwd.db, 129196434Sdougb# or spwd.db. Instead, we want to compare the text versions, and run *_mkdb. 130196434Sdougb# Prompt the user to do so below, as needed. 131196434Sdougb# 132196434Sdougbrm -f ${TEMPROOT}/etc/*.db ${TEMPROOT}/etc/passwd 133196434Sdougb 134196434Sdougb# We only need to compare things like freebsd.cf once 135196434Sdougbfind ${TEMPROOT}/usr/obj -type f -delete 2>/dev/null 136196434Sdougb 137196434Sdougb# Delete stuff we do not need to keep the mtree database small, 138196434Sdougb# and to make the actual comparison faster. 139196434Sdougbfind ${TEMPROOT}/usr -type l -delete 2>/dev/null 140196434Sdougbfind ${TEMPROOT} -type f -size 0 -delete 2>/dev/null 141196434Sdougbfind -d ${TEMPROOT} -type d -empty -delete 2>/dev/null 142196434Sdougb 143196434Sdougb# Build the mtree database in a temporary location. 144196434SdougbMTREENEW=`mktemp -t mergemaster.mtree` 145196434Sdougbmtree -ci -p ${TEMPROOT} -k size,md5digest > ${MTREENEW} 2>/dev/null 146196434Sdougb 147196434Sdougbif [ -s "${MTREENEW}" ]; then 148196434Sdougb echo "*** Saving mtree database for future upgrades" 149196434Sdougb test -e "${DESTDIR}${MTREEFILE}" && unlink ${DESTDIR}${MTREEFILE} 150196434Sdougb mv ${MTREENEW} ${DESTDIR}${MTREEFILE} 151196434Sdougbfi 152196434Sdougb 153196434Sdougbdelete_temproot 154196434Sdougb 155196434Sdougbexit 0 156