mergemaster and better support for ezjails

Ian Smith smithi at nimnet.asn.au
Sun Jul 13 05:37:48 UTC 2014


On Sat, 12 Jul 2014 20:08:52 -0600, Warren Block wrote:
 > A couple of patches to make mergemaster work better with ezjails.
 > 
 > These are only very superficially tested.  Feedback welcome.
 > 
 > 1. If /etc/mergemaster.rc exists in the jail, it is sourced.  This
 >    allows IGNORE_FILES to be set in the jail.  And other settings, but
 >    that's the one I wanted.

 # Read /etc/mergemaster.rc first so the one in $HOME can override
 #
 if [ -r /etc/mergemaster.rc ]; then
-  . /etc/mergemaster.rc
+  . "${DESTDIR}/etc/mergemaster.rc"
 fi

 # Read .mergemasterrc before command line so CLI can override
 #
 if [ -r "$HOME/.mergemasterrc" ]; then
-  . "$HOME/.mergemasterrc"
+  . "${DESTDIR}/$HOME/.mergemasterrc"
 fi

Maybe a dumb question, but ..

In both cases, don't we need to test the readability of those files with 
${DESTDIR} prepended, rather than the originals, before sourcing them?  
Or can we here safely assume that they will exist? Or doesn't it matter?

cheers, Ian
-------------- next part --------------
--- /usr/src/usr.sbin/mergemaster/mergemaster.sh	2014-06-03 06:16:06.000000000 -0600
+++ /usr/sbin/mergemaster	2014-07-12 19:40:22.000000000 -0600
@@ -251,16 +251,29 @@
 #
 TEMPROOT='/var/tmp/temproot'
 
+# Options string for getopts
+OPT_STR=":ascrvhipCPm:t:du:w:A:D:FU"
+
+# if -D DESTDIR is set, process it first
+DESTDIR=""
+while getopts "${OPT_STR}" COMMAND_LINE_ARGUMENT ; do
+  case "${COMMAND_LINE_ARGUMENT}" in
+  D)
+    DESTDIR=${OPTARG}
+    ;;
+  esac
+done
+
 # Read /etc/mergemaster.rc first so the one in $HOME can override
 #
 if [ -r /etc/mergemaster.rc ]; then
-  . /etc/mergemaster.rc
+  . "${DESTDIR}/etc/mergemaster.rc"
 fi
 
 # Read .mergemasterrc before command line so CLI can override
 #
 if [ -r "$HOME/.mergemasterrc" ]; then
-  . "$HOME/.mergemasterrc"
+  . "${DESTDIR}/$HOME/.mergemasterrc"
 fi
 
 for var in "$@" ; do
@@ -279,7 +292,8 @@
 
 # Check the command line options
 #
-while getopts ":ascrvhipCPm:t:du:w:D:A:FU" COMMAND_LINE_ARGUMENT ; do
+OPTIND=1
+while getopts "${OPT_STR}" COMMAND_LINE_ARGUMENT ; do
   case "${COMMAND_LINE_ARGUMENT}" in
   A)
     ARCHSTRING='TARGET_ARCH='${OPTARG}
@@ -344,7 +358,7 @@
     SCREEN_WIDTH=${OPTARG}
     ;;
   D)
-    DESTDIR=${OPTARG}
+    # has already been processed
     ;;
   *)
     display_usage
@@ -1335,10 +1349,20 @@
 
 if [ -e "${DESTDIR}/etc/localtime" -a ! -L "${DESTDIR}/etc/localtime" -a -z "${PRE_WORLD}" ]; then	# Ignore if TZ == UTC
   echo ''
-  [ -n "${DESTDIR}" ] && tzs_args="-C ${DESTDIR}"
-  if [ -f "${DESTDIR}/var/db/zoneinfo" ]; then
-    echo "*** Reinstalling `cat ${DESTDIR}/var/db/zoneinfo` as ${DESTDIR}/etc/localtime"
-    tzsetup $tzs_args -r
+  if [ -n "${DESTDIR}" ]; then
+    SHARE="${DESTDIR}/usr/share"
+    ZONE_INFO="${SHARE}/zoneinfo"
+    if [ -L "${SHARE}" -a ! -e "${ZONE_INFO}" ]; then
+      # /usr/share is a link, /usr/share/zoneinfo does not exist, this is an ezjail
+      tzs_args="-r \"${DESTDIR}\""
+    else
+      # this is a full jail
+      tzs_args="-r -C \"${DESTDIR}\""
+    fi
+    if [ -f "${DESTDIR}/var/db/zoneinfo" ]; then
+      echo "*** Reinstalling `cat ${DESTDIR}/var/db/zoneinfo` as ${DESTDIR}/etc/localtime"
+      tzsetup $tzs_args
+    fi
   else
     echo "*** There is no ${DESTDIR}/var/db/zoneinfo file to update ${DESTDIR}/etc/localtime."
     echo '    You should run tzsetup'


More information about the freebsd-jail mailing list