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
8267864Sgavin# use of mergemaster's -U option to update their files after updating
9196434Sdougb# to -stable.
10196434Sdougb
11196434Sdougb# Copyright 2009 Douglas Barton
12196434Sdougb# dougb@FreeBSD.org
13196434Sdougb
14196434Sdougb# $FreeBSD$
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#
33290565SsjgTEMPROOT=`TMPDIR=/var/tmp mktemp -d -t 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
84254951Swillobjp=${MAKEOBJDIRPREFIX}
85254951Swill[ -z "${objp}" ] && objp=/usr/obj
86254951Swilllegacydir=${objp}${SOURCEDIR}/tmp/legacy
87254951Swilllegacypath=${legacydir}/usr/sbin:${legacydir}/usr/bin:${legacydir}/bin
88254951SwillMM_MAKE_ARGS="${MM_MAKE_ARGS} PATH=${legacypath}:${PATH}"
89196434SdougbMM_MAKE="make ${ARCHSTRING} ${MM_MAKE_ARGS} -m ${SOURCEDIR}/share/mk"
90196434Sdougb
91196434Sdougbdelete_temproot () {
92196434Sdougb  rm -rf "${TEMPROOT}" 2>/dev/null
93196434Sdougb  chflags -R 0 "${TEMPROOT}" 2>/dev/null
94196434Sdougb  rm -rf "${TEMPROOT}" || exit 1
95196434Sdougb}
96196434Sdougb
97196434Sdougb[ -d "${TEMPROOT}" ] && delete_temproot
98196434Sdougb
99196434Sdougbecho "*** Creating the temporary root environment in ${TEMPROOT}"
100196434Sdougb
101196434Sdougbif mkdir -p "${TEMPROOT}"; then
102196434Sdougb  echo " *** ${TEMPROOT} ready for use"
103196434Sdougbfi
104196434Sdougb
105196434Sdougbif [ ! -d "${TEMPROOT}" ]; then
106196434Sdougb  echo ''
107196434Sdougb  echo "  *** FATAL ERROR: Cannot create ${TEMPROOT}"
108196434Sdougb  echo ''
109196434Sdougb  exit 1
110196434Sdougbfi
111196434Sdougb
112196434Sdougbecho " *** Creating and populating directory structure in ${TEMPROOT}"
113196434Sdougbecho ''
114196434Sdougb
115196434Sdougb{ cd ${SOURCEDIR} || { echo "*** Cannot cd to ${SOURCEDIR}" ; exit 1;}
116196434Sdougb  case "${DESTDIR}" in
117196434Sdougb  '') ;;
118196434Sdougb  *)
119196434Sdougb    ${MM_MAKE} DESTDIR=${DESTDIR} distrib-dirs
120196434Sdougb    ;;
121196434Sdougb  esac
122196434Sdougb  od=${TEMPROOT}/usr/obj
123196434Sdougb  ${MM_MAKE} DESTDIR=${TEMPROOT} distrib-dirs &&
124196434Sdougb  MAKEOBJDIRPREFIX=$od ${MM_MAKE} _obj SUBDIR_OVERRIDE=etc &&
125196434Sdougb  MAKEOBJDIRPREFIX=$od ${MM_MAKE} everything SUBDIR_OVERRIDE=etc &&
126196434Sdougb  MAKEOBJDIRPREFIX=$od ${MM_MAKE} DESTDIR=${TEMPROOT} distribution;} ||
127196434Sdougb  { echo '';
128196434Sdougb    echo "  *** FATAL ERROR: Cannot 'cd' to ${SOURCEDIR} and install files to";
129196434Sdougb    echo "      the temproot environment";
130196434Sdougb    echo '';
131196434Sdougb    exit 1;}
132196434Sdougb
133196434Sdougb# We really don't want to have to deal with files like login.conf.db, pwd.db,
134196434Sdougb# or spwd.db.  Instead, we want to compare the text versions, and run *_mkdb.
135196434Sdougb# Prompt the user to do so below, as needed.
136196434Sdougb#
137196434Sdougbrm -f ${TEMPROOT}/etc/*.db ${TEMPROOT}/etc/passwd
138196434Sdougb
139196434Sdougb# We only need to compare things like freebsd.cf once
140196434Sdougbfind ${TEMPROOT}/usr/obj -type f -delete 2>/dev/null
141196434Sdougb
142196434Sdougb# Delete stuff we do not need to keep the mtree database small,
143196434Sdougb# and to make the actual comparison faster.
144196434Sdougbfind ${TEMPROOT}/usr -type l -delete 2>/dev/null
145196434Sdougbfind ${TEMPROOT} -type f -size 0 -delete 2>/dev/null
146196434Sdougbfind -d ${TEMPROOT} -type d -empty -delete 2>/dev/null
147196434Sdougb
148196434Sdougb# Build the mtree database in a temporary location.
149196434SdougbMTREENEW=`mktemp -t mergemaster.mtree`
150301584Sdelphijmtree -nci -p ${TEMPROOT} -k size,md5digest > ${MTREENEW} 2>/dev/null
151196434Sdougb
152196434Sdougbif [ -s "${MTREENEW}" ]; then
153196434Sdougb  echo "*** Saving mtree database for future upgrades"
154196434Sdougb  test -e "${DESTDIR}${MTREEFILE}" && unlink ${DESTDIR}${MTREEFILE}
155196434Sdougb  mv ${MTREENEW} ${DESTDIR}${MTREEFILE}
156196434Sdougbfi
157196434Sdougb
158196434Sdougbdelete_temproot
159196434Sdougb
160196434Sdougbexit 0
161