]> git.donarmstrong.com Git - dsa-puppet.git/blobdiff - modules/porterbox/files/setup-dchroot
Do not savelog with -d
[dsa-puppet.git] / modules / porterbox / files / setup-dchroot
index 53ca8f225c927abf1ed5476a2d1c3b01ae3b208a..39f1e19c1d14c98216451a39ab93172b8fd68e79 100755 (executable)
@@ -38,10 +38,23 @@ usage: $0 <suite>
 OPTIONS:
     -a ARCH    debootstrap arch [$arch]
     -m MIRROR  http mirror to use [$mirror]
-    -b basedir place where to build the chroot/tarball [$basedir]
-    -f         overwrite stuff.
-    -c         write config only.
-    -h         this help.
+    -b basedir place where to put the tarball [$basedir]
+    -B         install less stuff into chroot [$bare]
+    -c         write config only
+    -D         set up a buildd schroot - changes conffile name and various defaults.  Run -D -h)."
+    -d dir     place where to build the chroot [${builddir:-$basedir}]
+    -f         overwrite config and target tarball
+    -g GROUPS  groups that should have access to the schroot [$groupuser]
+    -K         keep old tarballs around for a while (4 iterations)
+    -k KEYRING use an alternate keyring [$keyring]
+    -o USER    users that should have access to the schroot [$users]
+    -O USER    users that should have root in the schroot [$usersroot]
+    -p PERS    use a different sbuild personality [$personality]
+    -r GROUPS  groups that should have root in the schroot [$grouproot]
+    -s         use sbuild compatible naming scheme [$sbuildnames]
+    -S SUFFIX  conffile suffix [$suffix]
+    -u         Ubuntu target
+    -h         this help
 EOF
 }
 
@@ -68,43 +81,60 @@ genschrootconf() {
         local suite="${suite}-${extra}"
     fi
 
+    if [ -n "$sbuildnames" ]; then
+        local name="${suite}-${arch}-sbuild"
+    else
+        local name="${suite}_${arch}-dchroot"
+    fi
+
+
 cat << EOF
-[${suite}_${arch}-dchroot]
-description=[${suite}_${arch}-dchroot] Debian $suite chroot for $arch
+[${name}]
+description=[${name}] Debian $suite chroot for $arch
 type=file
 file=$target
-groups=Debian,guest
-root-groups=adm
-source-groups=adm
-source-root-groups=adm
-script-config=dsa/config
 EOF
+[ -n "$groupuser" ] && echo "groups=$groupuser"
+[ -n "$grouproot" ] && echo "root-groups=$grouproot"
+[ -n "$users" ] &&     echo "users=$users"
+[ -n "$usersroot" ] && echo "root-users=$usersroot"
+
+    echo "profile=$personality"
 
     if [ "$THISARCH" = "$arch" ]; then
         echo "aliases=$suite"
-    else
-        case "$arch" in
-            armel|armhf|i386|powerpc|s390|sparc)
-                echo "personality=linux32"
-                ;;
-        esac
     fi
+    case "$arch" in
+        armel|armhf|i386|powerpc|s390|sparc)
+            echo "personality=linux32"
+            ;;
+    esac
     echo
 
     case "$suite" in
         sid)
             genschrootconf "experimental" "$arch" "$target"
             ;;
-        experimental)
+        experimental|jessie)
             :
             ;;
         *)
-            if [ -z "$extra" ]; then
+            if [ -z "$extra" ] && [ -z "$ubuntu" ]; then
                 genschrootconf "$suite" "$arch" "$target" "backports"
             fi
     esac
 }
 
+do_config() {
+    local tmpschrootconf=$(tempfile)
+    cleanup+=("rm -f $tmpschrootconf")
+    genschrootconf "$suite" "$arch" "$target" > "$tmpschrootconf"
+    if ! [ -e "$schrootconfig" ] || ! diff "$schrootconfig" "$tmpschrootconf" > /dev/null; then
+        mv "$tmpschrootconf" "$schrootconfig"
+        chmod 644 "$schrootconfig"
+    fi
+}
+
 
 set -e
 set -u
@@ -117,10 +147,23 @@ mirror="${mirror:-http://cdn.debian.net/debian}"
 configonly=""
 force=""
 basedir="/srv/chroot"
+builddir=""
+keyring=/usr/share/keyrings/debian-archive-keyring.gpg
+personality="dsa"
+sbuildnames=""
+ubuntu=""
+groupuser="Debian,guest"
+grouproot=""
+users=""
+usersroot=""
+bare=""
+keep=""
+suffix="dchroot"
 declare -a cleanup
+cleanup+=(":")
 trap do_cleanup EXIT
 
-while getopts "a:b:cfhm:" OPTION
+while getopts "a:b:Bcd:Dfg:hKk:m:o:O:p:r:sS:u" OPTION
 do
     case $OPTION in
         a)
@@ -129,19 +172,65 @@ do
         b)
             basedir="$OPTARG"
             ;;
+        B)
+            bare="1"
+            ;;
         c)
             configonly="1"
             ;;
+        D)
+            sbuildnames="0"
+            bare="1"
+            groupuser=""
+            grouproot=""
+            users="buildd"
+            usersroot="buildd"
+            personality="buildd-dsa"
+            suffix="sbuild"
+            ;;
+        d)
+            builddir="$OPTARG"
+            ;;
         f)
             force="1"
             ;;
+        g)
+            groupuser="$OPTARG"
+            ;;
         h)
-            help
+            usage
             exit 0
             ;;
+        K)
+            keep="4"
+            ;;
+        k)
+            keyring="$OPTARG"
+            ;;
         m)
             mirror="$OPTARG"
             ;;
+        o)
+            users="$OPTARG"
+            ;;
+        O)
+            usersroot="$OPTARG"
+            ;;
+        p)
+            personality="$OPTARG"
+            ;;
+        r)
+            grouproot="$OPTARG"
+            ;;
+        s)
+            sbuildnames="1"
+            ;;
+        S)
+            suffix="$OPTARG"
+            ;;
+        u)
+            ubuntu="1"
+            ;;
         *)
             usage >&2
             exit 1
@@ -157,37 +246,64 @@ fi
 suite="$1"; shift
 tuple="${suite}_${arch}"
 
+builddir=${builddir:-$basedir}
 [ -d "$basedir" ] || die "Error: $basedir does not exist (or is not a directory)."
+[ -d "$builddir" ] || die "Error: $builddir does not exist (or is not a directory)."
 
 target="$basedir/$tuple.tar.gz"
 ! [ -e "$target" ] || [ -n "$force" ] || die "Error: $target already exists."
 
-schrootconfig="/etc/schroot/chroot.d/${tuple}-dchroot"
+schrootconfig="/etc/schroot/chroot.d/${tuple}-$suffix"
 ! [ -e "$schrootconfig" ] || [ -n "$force" ] || die "Error: $schrootconfig already exists."
 
 
 #
 # let's go
 #
-genschrootconf "$suite" "$arch" "$target" | tee "$schrootconfig"
 
-if [ -n "$configonly" ]; then exit 0; fi
+if [ -n "$configonly" ]; then
+    do_config
+    exit 0
+fi
 
-rootdir=$(mktemp -d "$basedir/create-$suite-XXXXXX")
+rootdir=$(mktemp -d "$builddir/create-$suite-XXXXXX")
 cleanup+=("rm -r $rootdir")
 cleanup+=("umount $rootdir/sys")
+script=/usr/share/debootstrap/scripts/"$suite"
+if ! [ -e "$script" ]; then
+    if [ -z "$ubuntu" ]; then
+        script=/usr/share/debootstrap/scripts/sid
+    else
+        script=/usr/share/debootstrap/scripts/gutsy
+    fi
+fi
 
 set -x
 debootstrap \
-    --keyring /usr/share/keyrings/debian-archive-keyring.gpg \
+    --keyring "$keyring" \
     --include="apt" \
     --variant=buildd \
     --arch="$arch" \
-    "$suite" "$rootdir" "$mirror"
-echo "$tuple" > $rootdir/etc/debian_chroot
+    "$suite" "$rootdir" "$mirror" "$script"
+echo "$tuple" > "$rootdir/etc/debian_chroot"
+echo "force-unsafe-io" > "$rootdir/etc/dpkg/dpkg.cfg.d/force-unsafe-io"
+echo "force-confnew" > "$rootdir/etc/dpkg/dpkg.cfg.d/force-confnew"
+
+cleanup+=("umount $rootdir/dev")
+case "$(uname -s)" in
+  Linux)
+    ;;
+  GNU/kFreeBSD)
+    mount -t devfs none "$rootdir/dev"
+    ;;
+  *)
+    echo >&2 "Warning: Unexpected uname -s output."
+    ;;
+esac
+
 
 chroot "$rootdir" apt-get update
-chroot "$rootdir" apt-get install -y --no-install-recommends policyrcd-script-zg2
+chroot "$rootdir" apt-get install -y --force-yes --no-install-recommends policyrcd-script-zg2
 cat > "$rootdir/usr/local/sbin/policy-rc.d" << 'EOF'
 #!/bin/sh
 
@@ -206,8 +322,23 @@ while true; do
 done
 EOF
 chmod +x "$rootdir/usr/local/sbin/policy-rc.d"
-chroot "$rootdir" apt-get install -y --no-install-recommends zsh locales-all build-essential less vim fakeroot devscripts gdb
+[ -z "$bare" ] && [ -z "$ubuntu" ] && chroot "$rootdir" apt-get install -y --force-yes --no-install-recommends locales-all
+chroot "$rootdir" apt-get install -y --force-yes --no-install-recommends build-essential
+[ -z "$bare" ] && chroot "$rootdir" apt-get install -y --force-yes --no-install-recommends zsh less vim fakeroot devscripts gdb
 rm -f "$rootdir/etc/apt/sources.list" "$rootdir/etc/apt/sources.list.d/*"
-umount "$rootdir/sys" || true
+chroot "$rootdir" apt-get clean
+umount "$rootdir/dev" 2>/dev/null || true
+umount "$rootdir/sys" 2>/dev/null || true
+
+tartmp=$(tempfile --directory "$basedir" --suffix=".tar.gz")
+cleanup+=("rm -f $tartmp")
+(
+  cd "$rootdir"
+  tar caf "$tartmp" .
+  if ! [ -z "$keep" ]; then
+    savelog -l -c 4 "$target"
+  fi
+  mv "$tartmp" "$target"
+)
 
-(cd "$rootdir" && tar caf "$target" .)
+do_config