From 93be17a3c05a0928418f504e8897b3cedf4c6572 Mon Sep 17 00:00:00 2001 From: erdgeist Date: Mon, 24 Apr 2006 14:31:55 +0000 Subject: HEADS UP: Common elements in update and install have been moved to a function. portsnap now is default way to maintain your copy of ports tree. --- ezjail-admin | 165 +++++++++++++++++++++++++++++------------------------------ 1 file changed, 82 insertions(+), 83 deletions(-) diff --git a/ezjail-admin b/ezjail-admin index 0b99d4b..1fc8494 100755 --- a/ezjail-admin +++ b/ezjail-admin @@ -15,9 +15,10 @@ ezjail_jaildir=${ezjail_jaildir:-"/usr/jails"} ezjail_jailtemplate=${ezjail_jailtemplate:-"${ezjail_jaildir}/newjail"} ezjail_jailbase=${ezjail_jailbase:-"${ezjail_jaildir}/basejail"} ezjail_jailfull=${ezjail_jailfull:-"${ezjail_jaildir}/fulljail"} +ezjail_jailtemp=${ezjail_jaildir:-"${ezjail_jaildir}/ezjailtemp"} ezjail_flavours=${ezjail_flavours:-"${ezjail_jaildir}/flavours"} -ezjail_sourcetree=${ezjail_sourcetree:-"/usr/src"} ezjail_portscvsroot=${ezjail_portscvsroot:-":pserver:anoncvs@anoncvs.at.FreeBSD.org:/home/ncvs"} +ezjail_sourcetree=${ezjail_sourcetree:-"/usr/src"} ezjail_uglyperlhack=${ezjail_uglyperlhack:-"YES"} ezjail_mount_enable=${ezjail_mount_enable:-"YES"} @@ -28,6 +29,10 @@ ezjail_fdescfs_enable=${ezjail_fdescfs_enable:-"YES"} ezjail_dirlist="bin boot lib libexec rescue sbin usr/bin usr/games usr/include usr/lib usr/libdata usr/libexec usr/sbin usr/src usr/share" +################################ +# End of variable initialization +# + # define our bail out shortcut exerr () { echo -e "$*"; exit 1; } @@ -66,6 +71,67 @@ fetchjailinfo () { ezjail_id=`jls | grep " ${ezjail_hostname} " | head -n 1 | awk {'print $1'}` } +# fill the base jail - this function is used by install and update +ezjail_splitworld() { + # Fill basejail from installed world + cd ${ezjail_jailfull} || exerr "Cant access temporary Jail directory." + + # This mkdir is important, since cpio will create intermediate + # directories with permission 0700 which is bad + mkdir -p ${ezjail_jailbase}/usr + for dir in ${ezjail_dirlist}; do + find ${dir} | cpio -d -p -v ${ezjail_jailbase} || exerr "Installation of ${dir} failed." + chflags -R noschg ${dir}; rm -r ${dir}; ln -s /basejail/${dir} ${dir} + done + mkdir basejail + + # Try to remove the old template jail + [ -d ${ezjail_jailtemplate} ] && chflags -R noschg ${ezjail_jailtemplate} && rm -rf ${ezjail_jailtemplate} + mv ${ezjail_jailfull} ${ezjail_jailtemplate} + + # If the default flavour example has not yet been copied, do it now + [ -d ${ezjail_flavours}/default ] || mkdir -p ${ezjail_flavours} && cp -p -R ${ezjail_examples}/default ${ezjail_flavours} + + # A ports collection inside jails is hardly useful w/o an appropriate + # /etc/make.conf. If we find basejail/usr/ports/Makefile, assume that + # the admin wants a working make.conf in new jails also a softlink to + # the ports in basejail is provided + if [ -f ${ezjail_jailbase}/usr/ports/Makefile ]; then + # no /usr/ports? link to /basejail/usr/ports + [ -e ${ezjail_jailtemplate}/usr/ports ] || ln -s /basejail/usr/ports ${ezjail_jailtemplate}/usr/ports + + if [ -f ${ezjail_examples}/default/etc/make.conf -a ! -f ${ezjail_jailtemplate}/etc/make.conf ]; then + cp -p ${ezjail_examples}/default/etc/make.conf ${ezjail_jailtemplate}/etc/ + echo "Note: a non-standard /etc/make.conf was copied to the template jail in order to get the ports collection running inside jails." + fi + fi + + # The ugly perl hack[tm]. Note: we wont do such things for any given + # port :( + [ "${ezjail_uglyperlhack}" = "YES" -a ! -L ${ezjail_jailbase}/usr/bin/perl ] && ln -s /usr/local/bin/perl ${ezjail_jailbase}/usr/bin/perl +} + +# The user may want to have a ports tree in basejail +ezjail_updateports () { + # if /usr/ports/CVS exists, assume cvs up is safe + # this is legacy + if [ -f ${ezjail_jailbase}/usr/ports/CVS/Root ]; then + echo -n "Updating ports from "; cat ${ezjail_jailbase}/usr/ports/CVS/Root + echo "Warning: Upgrading legacy ports copy. Consider removing ${ezjail_jailbase}/usr/ports and use the new portsnap strategy instead." + echo "Gathering local information may take a while." + cd ${ezjail_jailbase}/usr/ports/ && cvs -d ${ezjail_portscvsroot} up -Pd + else + portsnap fetch + [ -d ${ezjail_jailbase}/usr/ports ] && ezjail_portsnapaction=update + portsnap ${ezjail_portsnapaction:-"extract"} + fi + [ $? = 0 ] || exerr "Updating ports failed." +} + +############################# +# End of function definitions +# + # check for command [ "$1" ] || exerr "Usage: `basename -- $0` [config|create|delete|install|list|update] {params}" @@ -326,7 +392,6 @@ setup|update) # Clean variables, prevent polution unset ezjail_provideports - ezjail_installaction="world" set -- ${args} @@ -354,64 +419,15 @@ setup|update) [ -d "${ezjail_jailfull}" ] && chflags -R noschg ${ezjail_jailfull} && rm -rf ${ezjail_jailfull} mkdir -p ${ezjail_jailfull} || exerr "Cannot create temporary Jail directory." - # make our world + # make and setup our world, then split basejail and newjail cd ${ezjail_sourcetree} && make ${ezjail_installaction} DESTDIR=${ezjail_jailfull} || exerr "make ${ezjail_installaction} failed." - - # setup world cd ${ezjail_sourcetree}/etc && make distribution DESTDIR=${ezjail_jailfull} || exerr "make distribution failed." - - # Fill basejail from installed world - cd ${ezjail_jailfull} || exerr "Cant access temporary Jail directory." - # This mkdir is important, since cpio will create intermediate - # directories with permission 0700 which is bad - mkdir -p ${ezjail_jailbase}/usr - for dir in ${ezjail_dirlist}; do - find ${dir} | cpio -d -p -v ${ezjail_jailbase} || exerr "Installation of ${dir} failed." - chflags -R noschg ${dir}; rm -r ${dir}; ln -s /basejail/${dir} ${dir} - done - mkdir basejail - - # Try to remove the old template jail - [ -d ${ezjail_jailtemplate} ] && chflags -R noschg ${ezjail_jailtemplate} && rm -rf ${ezjail_jailtemplate} - mv ${ezjail_jailfull} ${ezjail_jailtemplate} - - # If the default flavour example has not yet been copied, do it now - [ -d ${ezjail_flavours}/default ] || mkdir -p ${ezjail_flavours} && cp -p -R ${ezjail_examples}/default ${ezjail_flavours} + ezjail_splitworld fi # installaction="none" - # The user may want to have a ports tree in basejail - if [ "${ezjail_provideports}" = "YES" ]; then - # if /usr/ports/CVS exists, assume cvs up is safe - if [ -f ${ezjail_jailbase}/usr/ports/CVS/Root ]; then - echo -n "Updating ports from "; cat ${ezjail_jailbase}/usr/ports/CVS/Root - echo "Gathering local information may take a while." - cd ${ezjail_jailbase}/usr/ports/ && cvs -d ${ezjail_portscvsroot} up -Pd - else - echo "Checking out ports from ${ezjail_portscvsroot}" - mkdir -p ${ezjail_jailbase}/usr/ports/ - cd ${ezjail_jailbase}/usr/ && cvs -d ${ezjail_portscvsroot} co ports - fi - [ $? = 0 ] || exerr "Updating ports failed." - fi - - # A ports collection inside jails is hardly useful w/o an appropriate - # /etc/make.conf. If we find basejail/usr/ports/Makefile, assume that - # the admin wants a working make.conf in new jails also a softlink to - # the ports in basejail is provided - if [ -f ${ezjail_jailbase}/usr/ports/Makefile ]; then - # no /usr/ports? link to /basejail/usr/ports - [ -e ${ezjail_jailtemplate}/usr/ports ] || ln -s /basejail/usr/ports ${ezjail_jailtemplate}/usr/ports - - if [ -f ${ezjail_examples}/default/etc/make.conf -a ! -f ${ezjail_jailtemplate}/etc/make.conf ]; then - cp -p ${ezjail_examples}/default/etc/make.conf ${ezjail_jailtemplate}/etc/ - echo "Note: a non-standard /etc/make.conf was copied to the template jail in order to get the ports collection running inside jails." - fi - fi - - # The ugly perl hack[tm]. Note: we wont do such things for any given - # port :( - [ "${ezjail_uglyperlhack}" = "YES" -a ! -L ${ezjail_jailbase}/usr/bin/perl ] && ln -s /usr/local/bin/perl ${ezjail_jailbase}/usr/bin/perl + # Provide a copy of ports tree in basejail + [ "${ezjail_provideports}" = "YES" ] && ezjail_updateports ;; ######################## ezjail-admin INSTALL ######################## @@ -420,14 +436,14 @@ install) args=`getopt mpsh:r: $*` || exerr "Usage: `basename -- $0` install [-mps] [-h host] [-r release]" # Clean variables, prevent polution - unset ezjail_release ezjail_ftphost ezjail_installmanpages ezjail_installports ezjail_installsources ezjail_dir ezjail_reldir ezjail_temp + unset ezjail_release ezjail_ftphost ezjail_installmanpages ezjail_installports ezjail_installsources ezjail_dir ezjail_reldir set -- ${args} for arg do case ${arg} in -m) ezjail_installmanpages=" manpages"; shift;; - -p) ezjail_installports=" ports"; shift;; -s) ezjail_installsources=" src"; shift;; + -p) ezjail_installports="YES"; shift;; -h) ezjail_ftphost="$2"; shift 2;; -r) ezjail_release="$2"; shift 2;; --) shift; break;; @@ -439,8 +455,6 @@ install) ezjail_ftphost=${ezjail_ftphost#ftp://} ezjail_dir=${ezjail_ftphost#file://} [ "${ezjail_dir%%[!/]*}" ] || ezjail_reldir=${PWD} - # XXX - ezjail_temp=${ezjail_jaildir}/ezjailtemp # ftp servers normally wont provide CURRENT-builds if [ -z "${ezjail_release}" ]; then @@ -459,15 +473,14 @@ install) mkdir -p ${ezjail_jailfull} || exerr "Cannot create temporary Jail directory." DESTDIR=${ezjail_jailfull} - # XXX - rm -rf ${ezjail_temp} - for pkg in base ${ezjail_installmanpages} ${ezjail_installports} ${ezjail_installsources}; do + rm -rf ${ezjail_jailtemp} + for pkg in base ${ezjail_installmanpages} ${ezjail_installsources}; do # The first case means, that a remote host has been specified. if [ "${ezjail_dir}" = "${ezjail_ftphost}" ]; then # Create and try to access temp dir - mkdir -p ${ezjail_temp} || exerr "Could not create temporary base jail directory ${ezjail_temp}." - cd ${ezjail_temp} || exerr "Could not cd to ${ezjail_temp}." + mkdir -p ${ezjail_jailtemp} || exerr "Could not create temporary base jail directory ${ezjail_jailtemp}." + cd ${ezjail_jailtemp} || exerr "Could not cd to ${ezjail_jailtemp}." # Try all paths as stolen from sysinstall, break on success. for ezjail_path in pub/FreeBSD/releases pub/FreeBSD/snapshot pub/FreeBSD releases snapshots NO; do @@ -482,7 +495,7 @@ install) [ -f install.sh ] && yes | . install.sh # XXX error checking. - rm -rf ${ezjail_temp} + rm -rf ${ezjail_jailtemp} else cd ${basejail_reldir}/${basejail_dir}/${pkg} || exerr "Could not cd to ${basejail_dir}." set -- all @@ -490,25 +503,11 @@ install) fi done - # Fill basejail from installed world - cd ${ezjail_jailfull} || exerr "Cant access temporary Jail directory." - # This mkdir is important, since cpio will create intermediate - # directories with permission 0700 which is bad - mkdir -p ${ezjail_jailbase}/usr - for dir in ${ezjail_dirlist}; do - find ${dir} | cpio -d -p -v ${ezjail_jailbase} || exerr "Installation of ${dir} failed." - chflags -R noschg ${dir}; rm -r ${dir}; ln -s /basejail/${dir} ${dir} - done - mkdir basejail - - # Try to remove the old template jail - [ -d ${ezjail_jailtemplate} ] && chflags -R noschg ${ezjail_jailtemplate} && rm -rf ${ezjail_jailtemplate} - mv ${ezjail_jailfull} ${ezjail_jailtemplate} - - # If the default flavour example has not yet been copied, do it now - [ -d ${ezjail_flavours}/default ] || mkdir -p ${ezjail_flavours} && cp -p -R ${ezjail_examples}/default ${ezjail_flavours} + # Split basejail and newjail + ezjail_splitworld - # XXX ports stuff still missing + # Fill ports, if requested + [ "${ezjail_installports} = "YES" ] && ezjail_updateports ;; ######################## ezjail-admin CONFIG ######################## -- cgit v1.2.3