From fc47c6694d3ed48f9d31085ebff8ecb0e3dfef4c Mon Sep 17 00:00:00 2001 From: CyberLeo Date: Wed, 11 Jul 2012 09:42:28 -0500 Subject: [PATCH] j: add seed support for scripted chroot creation --- .gitignore | 1 + j | 69 ++++++++++--------------------------------------- seeds/acs.sh | 3 +++ seeds/cnuapp.sh | 16 ++++++++++++ seeds/debian.sh | 47 +++++++++++++++++++++++++++++++++ seeds/gentoo.sh | 26 +++++++++++++++++++ seeds/rvm.sh | 10 +++++++ 7 files changed, 117 insertions(+), 55 deletions(-) create mode 100644 seeds/acs.sh create mode 100644 seeds/cnuapp.sh create mode 100644 seeds/debian.sh create mode 100644 seeds/gentoo.sh create mode 100644 seeds/rvm.sh diff --git a/.gitignore b/.gitignore index e69de29..e3b0ea9 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1 @@ +seeds/*/** \ No newline at end of file diff --git a/j b/j index 06d242d..0537024 100755 --- a/j +++ b/j @@ -35,13 +35,18 @@ Usage: umount umount chroot filesystems that were mounted with 'mount' + init [seed-specific options] + initialize a chroot using the specified seed in seeds/ + EOF exit 1 } cmd="$(basename "${0}")" +j="$(realpath "$(dirname "${0}")")" jarch="${J_ARCH:-$(uname -m)}" -jbase="${J_BASE:-$(realpath "$(dirname "${0}")/../")}" +jbase="${J_BASE:-$(realpath "${j}/../")}" +jseed="${j}/seeds" jname="${J_NAME:-$(basename "${1}")}" #" juser="${J_USER}" @@ -60,64 +65,18 @@ jenv=" USER=${USER} " -# Debian-specific init: prepare Debian chroot with debootstrap -j_init_debian() { - jdir="${1}" - suite="$(echo "${2:-squeeze}" | tr 'A-Z' 'a-z')" - - # Validation - [ "$(which debootstrap 2>&-)" ] || pebkac "j_init_debian: debootstrap not found" - [ "${jdir}" ] || pebkac "j_init_debian: jdir must be specified" - [ ! -d "${jdir}" ] || pebkac "j_init_debian: jdir must not exist ('${jdir}')" - [ -d "$(dirname "${jdir}")" ] || pebkac "j_init_debian: parent of jdir must exist ('${jdir}')" - - # Figure out arch - case "${jarch}" in - x86|i386) arch=i386 ;; - amd64|x86_64|x64) arch=amd64 ;; - *) pebkac "Unsupported arch '${jarch}'" ;; - esac - - cmd="debootstrap --arch=${arch} --include=curl,file,less,locales,sudo,build-essential,libreadline-dev,zlib1g-dev '${suite}' '${jdir}'" - echo "Executing ${cmd}" - eval "${cmd}" - - # Make sure locales are generated on first start - mkdir -p "${jdir}/etc/rcJ.d" - cat > "${jdir}/etc/rcJ.d/S00localegen" <<"EOF" -#!/bin/sh -/bin/sed -i '/en_US/s/^# //' /etc/locale.gen -/usr/sbin/locale-gen -/bin/rm -f "${0}" -EOF - chmod 755 "${jdir}/etc/rcJ.d/S00localegen" -} - -# Gentoo-specific init: prepare Gentoo chroot with stage3+portage tarballs -j_init_gentoo() { - arch="$(uname -m)" - base="http://distfiles.gentoo.org/releases/${arch}/autobuilds" - pointer="${base}/latest-stage3.txt" - # Fetch stage3 - # Fetch portage - # Validate signatures - # Unpack stage3 - # Unpack portage -} - -# Create a new chroot, somehow +# Create a new chroot, using a seed script in seeds/ j_init() { # Make sure this does NOT exist - jname="${1:-jname}" - dist="$(echo "${2:-debian}" | tr 'A-Z' 'a-z')" + jname="${1}"; shift + [ "${jname}" ] || pebkac "j_init: no name provided" + seed="$(echo "${1}" | tr 'A-Z' 'a-z')"; shift + [ -f "${jbase}/j/seeds/${seed}.sh" ] || pebkac "Unknown seed '${seed}'" jdir="${jbase}/${jname}" [ -d "${jdir}" ] && pebkac "j_init: ${jname} already exists" - shift 2 - case "${dist}" in - debian) j_init_debian "${jdir}" "${@}" ;; - gentoo) j_init_gentoo "${jdir}" "${@}" ;; - *) pebkac "Unsupported distro '${dist}'" ;; - esac + jroot="${jdir}/root" + set -e + . "${jbase}/j/seeds/${seed}.sh" "${@}" } # Figure out and set chroot parameters; needed for all functions that follow diff --git a/seeds/acs.sh b/seeds/acs.sh new file mode 100644 index 0000000..37c60ff --- /dev/null +++ b/seeds/acs.sh @@ -0,0 +1,3 @@ +# ACS seed + +. "${jseed}/rvm.sh" diff --git a/seeds/cnuapp.sh b/seeds/cnuapp.sh new file mode 100644 index 0000000..b66d8b9 --- /dev/null +++ b/seeds/cnuapp.sh @@ -0,0 +1,16 @@ +# Initialize a cnuapp chroot using the debian seed + +arch=i386 +suite=lenny +include=curl,file,less,locales,sudo,vim,whois,htop,openssh-client + +. "${jseed}/debian.sh" + +# Install instant-cnuapp script +( cd "${jroot}/root" + wget -O- "https://git.cashnetusa.com/gist/gists/17/download" | tar zxf - --strip-components 1 + patch -p0 < "${jseed}/cnuapp/instant-cnuapp-local-repos.patch" + chmod 755 instant-cnuapp.sh +) + +echo "instant-cnuapp.sh installed into /root" >&2 diff --git a/seeds/debian.sh b/seeds/debian.sh new file mode 100644 index 0000000..3c02073 --- /dev/null +++ b/seeds/debian.sh @@ -0,0 +1,47 @@ +# Initialize a debian chroot using debootstrap into the provided directory + +# Parameters that I want on the command line: +# + +[ "$(which debootstrap 2>&-)" ] || pebkac "j_init: debian: debootstrap not found" + +: ${arch=${1}} +: ${suite=${2}} +: ${repo=${3}} +: ${include=curl,file,less,locales,sudo,vim,whois} + +case "${arch}" in +x86|i386) arch=i386 ;; +amd64|x86_64|x64) arch=amd64 ;; +*) pebkac "Unsupported arch '${arch}'" ;; +esac + +[ "${suite}" ] || pebkac "Debian seed needs [repo]" + +[ "${repo}" ] || repo="file://${jseed}/debian" + +mkdir -p "${jroot}/var/cache/apt/archives" + +echo "Seeding deb archives" >&2 +( cd "${jseed}/debian/debs"; find . | cpio -pl "${jroot}/var/cache/apt/archives" ) + +cmd="debootstrap '--arch=${arch}' '--keyring=${jseed}/debian/debian-archive-keyring.gpg' '--include=${include}' '${suite}' '${jroot}' '${repo}'" +echo "Executing: ${cmd}" +eval "${cmd}" + +# Make sure locales are generated on first start +mkdir -p "${jroot}/etc/rcJ.d" +cat > "${jroot}/etc/rcJ.d/S00localegen" <<"EOF" +#!/bin/sh +/bin/sed -i '/en_US/s/^# //' /etc/locale.gen +/usr/sbin/locale-gen +/bin/rm -f "${0}" +EOF +chmod 755 "${jroot}/etc/rcJ.d/S00localegen" + +echo "Adding user" +sed -i '/%sudo/s/^# *//' "${jroot}/etc/sudoers" +user="${ORIG_USER}" +uid="$(id -u "${ORIG_USER}")" +[ "${user}" -a "${uid}" ] || { echo "Cannot add nonexistent user"; false; } +chroot "${jroot}" /usr/sbin/useradd -m -o -u "${uid}" -G root,sudo "${user}" diff --git a/seeds/gentoo.sh b/seeds/gentoo.sh new file mode 100644 index 0000000..cb37993 --- /dev/null +++ b/seeds/gentoo.sh @@ -0,0 +1,26 @@ +# Initialize a debian chroot using debootstrap into the provided directory + +# Parameters that I want on the command line: +# + +case "${jarch}" in +x86|i386) arch=i686 ;; +amd64|x86_64|x64) arch=amd64 ;; +*) pebkac "Unsupported arch '${jarch}'" ;; +esac + +mkdir -p "${jroot}" + +seed="${jseed}/gentoo/stage3-${arch}"-*.tar.bz2 +[ -f "${seed}" ] || pebkac "Seed ${seed} not found" +tar jxvCf "${jroot}" "${seed}" + +# Make sure locales are generated on first start +mkdir -p "${jroot}/etc/rcJ.d" +cat > "${jroot}/etc/rcJ.d/S00localegen" <<"EOF" +#!/bin/sh +/bin/sed -i '/en_US/s/^# //' /etc/locale.gen +/usr/sbin/locale-gen +/bin/rm -f "${0}" +EOF +chmod 755 "${jroot}/etc/rcJ.d/S00localegen" diff --git a/seeds/rvm.sh b/seeds/rvm.sh new file mode 100644 index 0000000..2740242 --- /dev/null +++ b/seeds/rvm.sh @@ -0,0 +1,10 @@ +# Initialize an rvm chroot using the debian seed + +arch=i386 +suite=lenny +include=curl,file,less,locales,sudo,vim,whois,htop,openssh-client,rsync,git-core,build-essential,libreadline5-dev,zlib1g-dev + +. "${jseed}/debian.sh" + +echo "Installing RVM" +chroot --userspec=$(id -u "${ORIG_USER}"):$(id -g "${ORIG_USER}") "${jroot}" env -i ${jenv} HOME=/home/${ORIG_USER} sh -lc 'cd; curl -L http://get.rvm.io/ | bash -s stable' -- 2.42.0