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