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>