[BACK]Return to mksandbox CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / pkgsrc / pkgtools / mksandbox / files

Annotation of pkgsrc/pkgtools/mksandbox/files/mksandbox, Revision 1.1

1.1     ! wiz         1: #! /bin/sh
        !             2:
        !             3: # $NetBSD: mksandbox,v 1.56 2012/07/08 21:25:44 jperkin Exp $
        !             4: #
        !             5: #
        !             6: # Copyright (c) 2002 Alistair G. Crooks.  All rights reserved.
        !             7: #
        !             8: # Redistribution and use in source and binary forms, with or without
        !             9: # modification, are permitted provided that the following conditions
        !            10: # are met:
        !            11: # 1. Redistributions of source code must retain the above copyright
        !            12: #    notice, this list of conditions and the following disclaimer.
        !            13: # 2. Redistributions in binary form must reproduce the above copyright
        !            14: #    notice, this list of conditions and the following disclaimer in the
        !            15: #    documentation and/or other materials provided with the distribution.
        !            16: # 3. All advertising materials mentioning features or use of this software
        !            17: #    must display the following acknowledgement:
        !            18: #      This product includes software developed by Alistair G. Crooks
        !            19: #      for the NetBSD project.
        !            20: # 4. The name of the author may not be used to endorse or promote
        !            21: #    products derived from this software without specific prior written
        !            22: #    permission.
        !            23: #
        !            24: # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
        !            25: # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
        !            26: # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            27: # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
        !            28: # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            29: # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
        !            30: # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
        !            31: # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
        !            32: # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
        !            33: # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
        !            34: # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            35: #
        !            36:
        !            37: # Usage: mksandbox [--pkgsrc=dir] [--src=srcdir] [--xsrc=xsrcdir] [--without-x] [--verbose] sandbox-dir
        !            38: #
        !            39: # A small shell script to set up a sandbox (usually for a pkgsrc bulk
        !            40: # build), using null mounts.
        !            41:
        !            42: pkgsrc=/usr/pkgsrc
        !            43: src=/usr/src
        !            44: xsrc=/usr/xsrc
        !            45: with_x=yes
        !            46:
        !            47: kernel=""
        !            48: sandboxWriteDirs=""
        !            49: sandboxMountDirs="/bin /sbin /lib /libexec /usr/X11R7 /usr/bin /usr/games /usr/include /usr/lib /usr/libdata /usr/libexec /usr/lkm /usr/share /usr/sbin /var/mail"
        !            50: sandboxEmptyDirs="/var/run /var/log /var/spool/lock /var/spool/mqueue"
        !            51: sandboxEmptyFiles="/var/run/utmp /var/run/utmpx /var/log/wtmp /var/log/wtmpx /var/log/lastlog /var/log/lastlogx"
        !            52:
        !            53: usage()
        !            54: {
        !            55:        echo "Usage: mksandbox [--mounthost=host] [--pkgsrc=dir] [--src=srcdir] [--xsrc=xsrcdir] [--without-x] [--verbose] sandbox-dir"
        !            56:        exit 1
        !            57: }
        !            58:
        !            59: err()
        !            60: {
        !            61:        echo "error: $1"
        !            62:        exit 1
        !            63: }
        !            64:
        !            65: # by default, don't require src and xsrc to be available
        !            66: need_src=no
        !            67: need_xsrc=no
        !            68:
        !            69: opsys=`uname -s`
        !            70: case "$opsys" in
        !            71: Darwin)
        !            72:        bmakeprog=bmake
        !            73:        chmodprog=/bin/chmod
        !            74:        chownprog=/usr/sbin/chown
        !            75:        cpprog=/bin/cp
        !            76:        gtarprog=/usr/bin/gnutar
        !            77:        idprog=/usr/bin/id
        !            78:        kernel=/mach_kernel
        !            79:        mkdirprog="/bin/mkdir -p"
        !            80:        mountflags="-t nfs"
        !            81:        mounthost="localhost"
        !            82:        mountprog=/sbin/mount
        !            83:        paxprog=/bin/pax
        !            84:        sedprog=/usr/bin/sed
        !            85:        sandboxEmptyDirs="$sandboxEmptyDirs /var/root"
        !            86:        sandboxMountDirs="$sandboxMountDirs /usr/llvm-gcc-4.2 /usr/X11 /System/Library /Library"
        !            87:        sandboxWriteDirs="$sandboxWriteDirs /Library/Server/Mail/Data"
        !            88:        ;;
        !            89: FreeBSD)
        !            90:        bmakeprog=bmake
        !            91:        chmodprog=/bin/chmod
        !            92:        chownprog=/usr/sbin/chown
        !            93:        cpprog=/bin/cp
        !            94:        gtarprog=/usr/bin/tar
        !            95:        idprog=/usr/bin/id
        !            96:        mkdirprog="/bin/mkdir -p"
        !            97:        mountflags="-t nullfs"
        !            98:        mountprog=/sbin/mount
        !            99:        paxprog=/bin/pax
        !           100:        sedprog=/usr/bin/sed
        !           101:        ;;
        !           102: Interix)
        !           103:        echo >&2 "This script cannot be used on Interix; a different procedure is required."
        !           104:        echo >&2 "(To be documented.)"
        !           105:        exit 1
        !           106:        ;;
        !           107: Linux)
        !           108:        bmakeprog=bmake
        !           109:        chmodprog=/bin/chmod
        !           110:        chownprog=/bin/chown
        !           111:        cpprog=/bin/cp
        !           112:        gtarprog=/bin/tar
        !           113:        idprog=/usr/bin/id
        !           114:        mkdirprog="/bin/mkdir -p"
        !           115:        mountflags="--bind"
        !           116:        if [ -f /bin/mount ]; then
        !           117:                mountprog=/bin/mount
        !           118:        else
        !           119:                mountprog=/sbin/mount
        !           120:        fi
        !           121:        paxprog=""
        !           122:        sedprog=/bin/sed
        !           123:        sandboxMountDirs="$sandboxMountDirs /proc /usr/kerberos"
        !           124:        ;;
        !           125: NetBSD)
        !           126:        bmakeprog=make
        !           127:        chmodprog=/bin/chmod
        !           128:        chownprog=/usr/sbin/chown
        !           129:        cpprog=/bin/cp
        !           130:        gtarprog=/usr/bin/tar
        !           131:        idprog=/usr/bin/id
        !           132:        kernel=/netbsd
        !           133:        mkdirprog="/bin/mkdir -p"
        !           134:        mountflags="-t null"
        !           135:        mountprog=/sbin/mount
        !           136:        paxprog=/bin/pax
        !           137:        sedprog=/usr/bin/sed
        !           138:        need_src=yes
        !           139:        need_xsrc=yes
        !           140:        ;;
        !           141: SunOS)
        !           142:        bmakeprog=bmake
        !           143:        chmodprog=/usr/bin/chmod
        !           144:        chownprog=/usr/bin/chown
        !           145:        cpprog=/usr/bin/cp
        !           146:        gtarprog=""
        !           147:        idprog=/usr/xpg4/bin/id
        !           148:        mkdirprog="/usr/bin/mkdir -p"
        !           149:        mountflags="-F lofs"
        !           150:        mountprog=/sbin/mount
        !           151:        paxprog=/bin/pax
        !           152:        sedprog=/usr/xpg4/bin/sed
        !           153:        sandboxMountDirs="/bin /sbin /kernel /lib /proc /opt/SUNWspro /usr/X11R6 /usr/5bin /usr/bin /usr/ccs /usr/dt /usr/games /usr/include /usr/lib /usr/openwin /usr/share /usr/sbin /usr/sadm /usr/ucb /usr/ucblib /usr/xpg4 /var/mail /var/sadm"
        !           154:        sandboxEmptyDirs="$sandboxEmptyDirs /usr/tmp /var/tmp"
        !           155:        ;;
        !           156: *)
        !           157:        echo "Unknown Operating System ($opsys) - good luck"
        !           158:        bmakeprog=bmake
        !           159:        chmodprog=chmod
        !           160:        chownprog=chown
        !           161:        cpprog=cp
        !           162:        gtarprog="tar"
        !           163:        idprog="id"
        !           164:        mkdirprog="mkdir -p"
        !           165:        mountflags="-t null"
        !           166:        mountprog=mount
        !           167:        paxprog=pax
        !           168:        sedprog=sed
        !           169:        ;;
        !           170: esac
        !           171:
        !           172: while [ $# -gt 0 ]; do
        !           173:        case "$1" in
        !           174:        --mounthost=*)  mounthost=`echo $1 | $sedprog -e 's|^--mounthost=||'` ;;
        !           175:        --pkgsrc=*)     pkgsrc=`echo $1 | $sedprog -e 's|^--pkgsrc=||'` ;;
        !           176:        --src=*)        src=`echo $1 | $sedprog -e 's|^--src=||'` ;;
        !           177:        --xsrc=*)       xsrc=`echo $1 | $sedprog -e 's|^--xsrc=||'` ;;
        !           178:        --without-x)    with_x=no ;;
        !           179:        --verbose)      set -x ;;
        !           180:        -*)             usage ;;
        !           181:        *)              break ;;
        !           182:        esac
        !           183:        shift
        !           184: done
        !           185:
        !           186: if [ $# -ne 1 ]; then
        !           187:        usage
        !           188: fi
        !           189:
        !           190: if [ "$with_x" = "no" ]; then
        !           191:        need_xsrc=no
        !           192: fi
        !           193:
        !           194: if [ `$idprog -u` -ne 0 ]; then
        !           195:        err "You must be root to run this script."
        !           196: fi
        !           197:
        !           198: if [ -n "$mounthost" ]; then
        !           199:        mounthost="$mounthost:"
        !           200: fi
        !           201:
        !           202: if [ ! -d $pkgsrc ]; then
        !           203:        err "pkgsrc directory $pkgsrc does not exist."
        !           204: fi
        !           205:
        !           206: if [ ! -d $src -a "$need_src" = "yes" ]; then
        !           207:        err "source directory $src does not exist."
        !           208: fi
        !           209:
        !           210: if [ ! -d $xsrc -a "$need_xsrc" = "yes" ]; then
        !           211:        err "xsrc directory $xsrc does not exist."
        !           212: fi
        !           213:
        !           214: sandbox=$1
        !           215: sandbox_script="$sandbox/sandbox"
        !           216:
        !           217: packages=`(cd $pkgsrc/pkgtools/lintpkgsrc; $bmakeprog show-var VARNAME=PACKAGES)`
        !           218: distfiles=`(cd $pkgsrc/pkgtools/lintpkgsrc; $bmakeprog show-var VARNAME=DISTDIR)`
        !           219: localbase=`(cd $pkgsrc/pkgtools/lintpkgsrc; $bmakeprog show-var VARNAME=LOCALBASE)`
        !           220: pkg_dbdir=`(cd $pkgsrc/pkgtools/lintpkgsrc; $bmakeprog show-var VARNAME=PKG_DBDIR)`
        !           221: localpatches=`(cd $pkgsrc/pkgtools/lintpkgsrc; $bmakeprog show-var VARNAME=LOCALPATCHES)`
        !           222:
        !           223: test -d "$localpatches" || echo "WARNING: LOCALPATCHES directory does not exist - ignoring"
        !           224:
        !           225: $mkdirprog $sandbox
        !           226: cat > $sandbox_script <<EOS
        !           227: #! /bin/sh -
        !           228: mounthost=$mounthost
        !           229: opsys=$opsys
        !           230: sandbox=$sandbox
        !           231:
        !           232: r3() {
        !           233:        _R=
        !           234:        while [ \$# -ge 3 ]
        !           235:        do
        !           236:                _R="\$1 \$2 \$3 \$_R"
        !           237:                shift; shift; shift
        !           238:        done
        !           239:        echo "\$_R"
        !           240: }
        !           241:
        !           242: fses="\\
        !           243: EOS
        !           244:
        !           245: if [ ! -z "$kernel" ]; then
        !           246:        echo "Copying the kernel"
        !           247:        $cpprog $kernel $sandbox
        !           248: fi
        !           249:
        !           250: echo "Checking package hierarchy in $localbase and package database in $pkg_dbdir exist"
        !           251: $mkdirprog $sandbox/$localbase $sandbox/$pkg_dbdir
        !           252:
        !           253: echo "Make and populate $sandbox/dev"
        !           254: $mkdirprog $sandbox/dev
        !           255:
        !           256: case "$opsys" in
        !           257: Darwin|FreeBSD)
        !           258:        $mountprog -t devfs devfs $sandbox/dev
        !           259:        ;;
        !           260: SunOS)
        !           261:        /usr/sbin/devfsadm -r $sandbox
        !           262:        if [ -f /usr/ucblib/ucblinks.awk -a -x /usr/ucb/ucblinks ]; then
        !           263:                /usr/ucb/ucblinks -r $sandbox
        !           264:        fi
        !           265:        ;;
        !           266: Linux)
        !           267:        $mountprog $mountflags /dev $sandbox/dev
        !           268:        ;;
        !           269: *)
        !           270:        $cpprog /dev/MAKEDEV* $sandbox/dev
        !           271:        (cd $sandbox/dev; ./MAKEDEV all)
        !           272: esac
        !           273:
        !           274: echo "Make and populate $sandbox/etc"
        !           275: $mkdirprog $sandbox/etc
        !           276: case "$paxprog" in
        !           277: "")    (cd /etc; $gtarprog -cf - . | (cd $sandbox/etc; $gtarprog xf - )) ;;
        !           278: *)     (cd /etc; $paxprog -rwpe . $sandbox/etc) ;;
        !           279: esac
        !           280: rm -f $sandbox/etc/localtime
        !           281:
        !           282: case "$opsys" in
        !           283: SunOS)
        !           284:        $cpprog /etc/TIMEZONE $sandbox/etc/TIMEZONE
        !           285:        ;;
        !           286: *)
        !           287:        $cpprog /usr/share/zoneinfo/GMT $sandbox/etc/localtime
        !           288:        ;;
        !           289: esac
        !           290:
        !           291: echo "Make empty dirs upon which to mount the null mounts"
        !           292: for d in $sandboxMountDirs; do
        !           293:        test -d $d || continue;
        !           294:        case $d in
        !           295:        *X11*)  test "$with_x" = "yes" || continue ;;
        !           296:        esac
        !           297:        $mkdirprog $sandbox$d;
        !           298:        $mountprog $mountflags -r $mounthost$d $sandbox$d;
        !           299:        echo "$mounthost$d $d ro \\" >> $sandbox_script
        !           300: done
        !           301: for d in $sandboxWriteDirs; do
        !           302:        test -d $d || continue;
        !           303:        $mkdirprog $sandbox$d;
        !           304:        $mountprog $mountflags $mounthost$d $sandbox$d;
        !           305:        echo "$mounthost$d $d rw \\" >> $sandbox_script
        !           306: done
        !           307:
        !           308: echo "Making /tmp in $sandbox"
        !           309: $mkdirprog $sandbox/tmp $sandbox/var/tmp
        !           310: $chmodprog 1777 $sandbox/tmp $sandbox/var/tmp
        !           311:
        !           312: echo "Making /var/games in $sandbox"
        !           313: $mkdirprog $sandbox/var/games
        !           314: $chownprog games:games $sandbox/var/games
        !           315: $chmodprog 2775 $sandbox/var/games
        !           316:
        !           317: for d in $sandboxEmptyDirs; do
        !           318:        test -d $d || continue
        !           319:        echo "Making $d in $sandbox"
        !           320:        $mkdirprog $sandbox$d
        !           321: done
        !           322:
        !           323: for f in $sandboxEmptyFiles; do
        !           324:        test -f $f || continue
        !           325:        echo "Making $f in $sandbox"
        !           326:        $cpprog /dev/null $sandbox$f
        !           327: done
        !           328:
        !           329: if [ "$need_src" = "yes" ]; then
        !           330:        echo "Mount $src from $sandbox"
        !           331:        $mkdirprog $sandbox/usr/src
        !           332:        $mountprog $mountflags -r $mounthost$src $sandbox/usr/src
        !           333:        echo "$mounthost$src /usr/src ro \\" >> $sandbox_script
        !           334: fi
        !           335:
        !           336: echo "Mount $pkgsrc from $sandbox"
        !           337: $mkdirprog $sandbox/usr/pkgsrc
        !           338: $mountprog $mountflags $mounthost$pkgsrc $sandbox/usr/pkgsrc
        !           339: echo "$mounthost$pkgsrc /usr/pkgsrc rw \\" >> $sandbox_script
        !           340:
        !           341: if [ "$need_xsrc" = "yes" ]; then
        !           342:        echo "Mount $xsrc from $sandbox"
        !           343:        $mkdirprog $sandbox/usr/xsrc
        !           344:        $mountprog $mountflags -r $mounthost$xsrc $sandbox/usr/xsrc
        !           345:        echo "$mounthost$xsrc /usr/xsrc ro \\" >> $sandbox_script
        !           346: fi
        !           347:
        !           348: echo "Mounting $packages and $distfiles from $sandbox"
        !           349: $mkdirprog $sandbox/$packages $sandbox/$distfiles
        !           350: $mkdirprog $packages $distfiles
        !           351: $mountprog $mountflags $mounthost$packages $sandbox/$packages
        !           352: $mountprog $mountflags $mounthost$distfiles $sandbox/$distfiles
        !           353: echo "$mounthost$packages $packages rw \\" >> $sandbox_script
        !           354: echo "$mounthost$distfiles $distfiles rw \\" >> $sandbox_script
        !           355:
        !           356: if [ -n "$localpatches" ] && [ -d "$localpatches" ]; then
        !           357:        echo "Mounting $localpatches from $sandbox"
        !           358:        $mkdirprog $sandbox/$localpatches
        !           359:        $mountprog $mountflags $mounthost$localpatches $sandbox/$localpatches
        !           360:        echo "$mounthost$localpatches $localpatches rw \\" >> $sandbox_script
        !           361: fi
        !           362:
        !           363: cat >> $sandbox_script <<EOS
        !           364: "
        !           365: case x\$1 in
        !           366: xmount)
        !           367:        set dummy \$fses
        !           368:        shift
        !           369:        while [ \$# -ge 3 ]; do
        !           370:                fs=\$1; shift
        !           371:                mntpoint=\$1; shift
        !           372:                rwro=\$1; shift
        !           373:                case \$rwro in
        !           374:                        ro) $mountprog $mountflags -r \$fs \$sandbox/\$mntpoint || exit 1 ;;
        !           375:                        rw) $mountprog $mountflags \$fs \$sandbox/\$mntpoint || exit 1 ;;
        !           376:                esac
        !           377:        done
        !           378:        case \$opsys in
        !           379:        Darwin|FreeBSD)
        !           380:                $mountprog -t devfs devfs \$sandbox/dev
        !           381:                ;;
        !           382:        Linux)
        !           383:                $mountprog $mountflags /dev \$sandbox/dev
        !           384:                ;;
        !           385:        esac
        !           386:        ;;
        !           387: xumount)
        !           388:        set dummy \`r3 \$fses\`
        !           389:        shift
        !           390:        while [ \$# -ge 3 ]; do
        !           391:                fs=\$1; shift
        !           392:                mntpoint=\$1; shift
        !           393:                dummy=\$1; shift
        !           394:                umount \$sandbox/\$mntpoint
        !           395:        done
        !           396:        case \$opsys in
        !           397:        Darwin|FreeBSD|Linux)
        !           398:                umount \$sandbox/dev
        !           399:                ;;
        !           400:        esac
        !           401:        ;;
        !           402: xchroot)
        !           403:        case x\$2 in
        !           404:        x)      rootshell=/bin/ksh ;;
        !           405:        *)      rootshell="\$2" ;;
        !           406:        esac
        !           407:        script="\$sandbox/tmp/script.\$\$"
        !           408:        echo "#!/bin/sh" > \$script
        !           409:        echo "ENV=/etc/shrc \$rootshell" >> \$script
        !           410:        chmod +x \$script
        !           411:        ENV=/etc/shrc chroot \$sandbox /tmp/\`basename \$script\`
        !           412:        rm -f \$script
        !           413:        ;;
        !           414: *)
        !           415:        if [ \$# -eq 0 ]; then
        !           416:                set dummy /bin/sh
        !           417:                shift
        !           418:        fi
        !           419:        chroot \$sandbox "\$@"
        !           420:        ;;
        !           421: esac
        !           422: EOS
        !           423:
        !           424: chmod +x $sandbox_script
        !           425:
        !           426: case $opsys in
        !           427: Darwin)
        !           428:        $cpprog /var/run/resolv.conf $sandbox/var/run/resolv.conf
        !           429:        ;;
        !           430: SunOS)
        !           431:        $cpprog /etc/mnttab $sandbox/etc/mnttab
        !           432:        ;;
        !           433: *)
        !           434: esac
        !           435:
        !           436: echo "Sandbox creation is now complete"
        !           437:
        !           438: exit 0

CVSweb <webmaster@jp.NetBSD.org>