#!/bin/sh # Copyright 2011 CyberLeo, All Rights Reserved # http://wiki.cyberleo.net/wiki/CyberLeo/COPYRIGHT meh() { printf "%s\n" "${*}"; } omg() { printf "%s\n" "${*}"; } wtf() { printf "%s\n" "${*}"; exit 1; } pebkac() { [ "${*}" ] && printf "%s\n\n" "${*}" cat < EOF exit 1 } cmd="$(basename "${0}")" base="$(realpath "$(dirname "${0}")")" jail="$(basename "${1:-DebianChroot}")" jdir="${base}/${jail}" [ -d "${jdir}" ] || wtf "${jail}: not a jail?" # Propagate certain environment variables; sterilize the rest of the environment env=" TERM=${TERM} USER=${USER} " # Create a new jail (Will not work, since a new jail will not exist and will not pass the 'not a jail' check above) jail_new() { DEBOOTSTRAP_DIR="$(base)/debootstrap" "${DEBOOTSTRAP_DIR}/debootstrap" --arch=amd64 squeeze "${jdir}" } # Jail is 'up' if /dev/pts and /proc are mounted jail_up() { grep -q "^devpts ${jdir}/dev/pts devpts" /proc/mounts || return 1 grep -q "^proc ${jdir}/proc proc" /proc/mounts || return 1 return 0 } # Mount /dev/pts and /proc in the jail jail_start() { jail_up && return 0 meh "starting ${jail} ..." mount -t devpts devpts "${jdir}/dev/pts" mount -t proc proc "${jdir}/proc" } # Enter jail jail_enter() { jail_up || wtf "jail not up" meh "entering ${jail} ..." env -i ${env} /usr/bin/chroot "${jdir}" /bin/su "${USER}" -c /bin/bash -l } # Unmount /dev/pts and /proc in the jail jail_stop() { jail_up || return 0 meh "stopping ${jail} ..." umount "${jdir}/proc" umount "${jdir}/dev/pts" } # Need root beyond here [ "$(id -u)" -eq 0 ] || exec sudo env ${env} "${0}" "${@}" case "${cmd}" in start) jail_start ;; enter) jail_enter ;; stop) jail_stop ;; *) pebkac ;; esac