mm-mtree.sh revision 254951
1222998Snwhitehorn#!/bin/sh 2245759Snwhitehorn 3222998Snwhitehorn# mergemaster mtree database generator 4222998Snwhitehorn 5222998Snwhitehorn# This script is intended to be used as part of the release building 6222998Snwhitehorn# process to generate the /var/db/mergemaster.mtree file relevant to 7222998Snwhitehorn# the source tree used to create the release so that users can make 8222998Snwhitehorn# use of mergemaster's -U option to update their files after csup'ing 9222998Snwhitehorn# to -stable. 10222998Snwhitehorn 11222998Snwhitehorn# Copyright 2009 Douglas Barton 12222998Snwhitehorn# dougb@FreeBSD.org 13222998Snwhitehorn 14222998Snwhitehorn# $FreeBSD: head/release/scripts/mm-mtree.sh 254951 2013-08-27 04:42:42Z will $ 15222998Snwhitehorn 16222998SnwhitehornPATH=/bin:/usr/bin:/usr/sbin 17222998Snwhitehorn 18222998Snwhitehorndisplay_usage () { 19222998Snwhitehorn VERSION_NUMBER=`grep "[$]FreeBSD:" $0 | cut -d ' ' -f 4` 20222998Snwhitehorn echo "${0##*/} version ${VERSION_NUMBER}" 21222998Snwhitehorn echo "Usage: ${0##*/} [-m /path] [-t /path] [-A arch] [-F <make args>] [-D /path]" 22222998Snwhitehorn echo "Options:" 23222998Snwhitehorn echo " -m /path/directory Specify location of source to do the make in" 24222998Snwhitehorn echo " -t /path/directory Specify temp root directory" 25222998Snwhitehorn echo " -A architecture Alternative architecture name to pass to make" 26222998Snwhitehorn echo " -F <arguments for make> Specify what to put on the make command line" 27222998Snwhitehorn echo ' -D /path/directory Specify the destination directory to install files to' 28274216Snwhitehorn echo '' 29233473Sjoel} 30222998Snwhitehorn 31222998Snwhitehorn# Set the default path for the temporary root environment 32222998Snwhitehorn# 33222998SnwhitehornTEMPROOT='/var/tmp/temproot' 34222998Snwhitehorn 35222998Snwhitehorn# Assign the location of the mtree database 36258421Sdteske# 37222998SnwhitehornMTREEDB=${MTREEDB:-/var/db} 38222998SnwhitehornMTREEFILE="${MTREEDB}/mergemaster.mtree" 39222998Snwhitehorn 40222998Snwhitehorn# Check the command line options 41222998Snwhitehorn# 42222998Snwhitehornwhile getopts "m:t:A:F:D:h" COMMAND_LINE_ARGUMENT ; do 43222998Snwhitehorn case "${COMMAND_LINE_ARGUMENT}" in 44222998Snwhitehorn m) 45222998Snwhitehorn SOURCEDIR=${OPTARG} 46222998Snwhitehorn ;; 47222998Snwhitehorn t) 48222998Snwhitehorn TEMPROOT=${OPTARG} 49222998Snwhitehorn ;; 50222998Snwhitehorn A) 51222998Snwhitehorn ARCHSTRING='TARGET_ARCH='${OPTARG} 52222998Snwhitehorn ;; 53258421Sdteske F) 54258421Sdteske MM_MAKE_ARGS="${OPTARG}" 55258421Sdteske ;; 56258421Sdteske D) 57258421Sdteske DESTDIR=${OPTARG} 58258421Sdteske ;; 59258421Sdteske h) 60258421Sdteske display_usage 61258421Sdteske exit 0 62258421Sdteske ;; 63258421Sdteske *) 64258421Sdteske echo '' 65222998Snwhitehorn display_usage 66222998Snwhitehorn exit 1 67222998Snwhitehorn ;; 68245758Snwhitehorn esac 69245758Snwhitehorndone 70222998Snwhitehorn 71245758Snwhitehorn# Assign the source directory 72222998Snwhitehorn# 73222998SnwhitehornSOURCEDIR=${SOURCEDIR:-/usr/src} 74222998Snwhitehornif [ ! -f ${SOURCEDIR}/Makefile.inc1 -a \ 75222998Snwhitehorn -f ${SOURCEDIR}/../Makefile.inc1 ]; then 76222998Snwhitehorn echo " *** The source directory you specified (${SOURCEDIR})" 77222998Snwhitehorn echo " will be reset to ${SOURCEDIR}/.." 78222998Snwhitehorn echo '' 79222998Snwhitehorn sleep 3 80222998Snwhitehorn SOURCEDIR=${SOURCEDIR}/.. 81222998Snwhitehornfi 82222998Snwhitehorn 83222998Snwhitehorn# Setup make to use system files from SOURCEDIR 84222998Snwhitehornobjp=${MAKEOBJDIRPREFIX} 85245758Snwhitehorn[ -z "${objp}" ] && objp=/usr/obj 86245758Snwhitehornlegacydir=${objp}${SOURCEDIR}/tmp/legacy 87245758Snwhitehornlegacypath=${legacydir}/usr/sbin:${legacydir}/usr/bin:${legacydir}/bin 88245758SnwhitehornMM_MAKE_ARGS="${MM_MAKE_ARGS} PATH=${legacypath}:${PATH}" 89245758SnwhitehornMM_MAKE="make ${ARCHSTRING} ${MM_MAKE_ARGS} -m ${SOURCEDIR}/share/mk" 90245758Snwhitehorn 91222998Snwhitehorndelete_temproot () { 92222998Snwhitehorn rm -rf "${TEMPROOT}" 2>/dev/null 93222998Snwhitehorn chflags -R 0 "${TEMPROOT}" 2>/dev/null 94271095Sse rm -rf "${TEMPROOT}" || exit 1 95271095Sse} 96222998Snwhitehorn 97222998Snwhitehorn[ -d "${TEMPROOT}" ] && delete_temproot 98222998Snwhitehorn 99222998Snwhitehornecho "*** Creating the temporary root environment in ${TEMPROOT}" 100222998Snwhitehorn 101222998Snwhitehornif mkdir -p "${TEMPROOT}"; then 102222998Snwhitehorn echo " *** ${TEMPROOT} ready for use" 103222998Snwhitehornfi 104222998Snwhitehorn 105222998Snwhitehornif [ ! -d "${TEMPROOT}" ]; then 106222998Snwhitehorn echo '' 107222998Snwhitehorn echo " *** FATAL ERROR: Cannot create ${TEMPROOT}" 108222998Snwhitehorn echo '' 109222998Snwhitehorn exit 1 110233648Seadlerfi 111222998Snwhitehorn 112222998Snwhitehornecho " *** Creating and populating directory structure in ${TEMPROOT}" 113222998Snwhitehornecho '' 114222998Snwhitehorn 115222998Snwhitehorn{ cd ${SOURCEDIR} || { echo "*** Cannot cd to ${SOURCEDIR}" ; exit 1;} 116222998Snwhitehorn case "${DESTDIR}" in 117222998Snwhitehorn '') ;; 118274216Snwhitehorn *) 119258421Sdteske ${MM_MAKE} DESTDIR=${DESTDIR} distrib-dirs 120274216Snwhitehorn ;; 121258421Sdteske esac 122258421Sdteske od=${TEMPROOT}/usr/obj 123274216Snwhitehorn ${MM_MAKE} DESTDIR=${TEMPROOT} distrib-dirs && 124274216Snwhitehorn MAKEOBJDIRPREFIX=$od ${MM_MAKE} _obj SUBDIR_OVERRIDE=etc && 125274216Snwhitehorn MAKEOBJDIRPREFIX=$od ${MM_MAKE} everything SUBDIR_OVERRIDE=etc && 126274216Snwhitehorn MAKEOBJDIRPREFIX=$od ${MM_MAKE} DESTDIR=${TEMPROOT} distribution;} || 127274216Snwhitehorn { echo ''; 128274216Snwhitehorn echo " *** FATAL ERROR: Cannot 'cd' to ${SOURCEDIR} and install files to"; 129258421Sdteske echo " the temproot environment"; 130274216Snwhitehorn echo ''; 131274216Snwhitehorn exit 1;} 132274216Snwhitehorn 133274216Snwhitehorn# We really don't want to have to deal with files like login.conf.db, pwd.db, 134222998Snwhitehorn# or spwd.db. Instead, we want to compare the text versions, and run *_mkdb. 135274216Snwhitehorn# Prompt the user to do so below, as needed. 136274216Snwhitehorn# 137274216Snwhitehornrm -f ${TEMPROOT}/etc/*.db ${TEMPROOT}/etc/passwd 138274216Snwhitehorn 139274216Snwhitehorn# We only need to compare things like freebsd.cf once 140245758Snwhitehornfind ${TEMPROOT}/usr/obj -type f -delete 2>/dev/null 141245758Snwhitehorn 142245758Snwhitehorn# Delete stuff we do not need to keep the mtree database small, 143245758Snwhitehorn# and to make the actual comparison faster. 144245758Snwhitehornfind ${TEMPROOT}/usr -type l -delete 2>/dev/null 145245758Snwhitehornfind ${TEMPROOT} -type f -size 0 -delete 2>/dev/null 146245758Snwhitehornfind -d ${TEMPROOT} -type d -empty -delete 2>/dev/null 147245758Snwhitehorn 148245758Snwhitehorn# Build the mtree database in a temporary location. 149245792SnwhitehornMTREENEW=`mktemp -t mergemaster.mtree` 150245792Snwhitehornmtree -ci -p ${TEMPROOT} -k size,md5digest > ${MTREENEW} 2>/dev/null 151245792Snwhitehorn 152245758Snwhitehornif [ -s "${MTREENEW}" ]; then 153245758Snwhitehorn echo "*** Saving mtree database for future upgrades" 154245758Snwhitehorn test -e "${DESTDIR}${MTREEFILE}" && unlink ${DESTDIR}${MTREEFILE} 155245758Snwhitehorn mv ${MTREENEW} ${DESTDIR}${MTREEFILE} 156245758Snwhitehornfi 157245758Snwhitehorn 158245758Snwhitehorndelete_temproot 159245758Snwhitehorn 160245758Snwhitehornexit 0 161245758Snwhitehorn