2 # Copyright 2011 CyberLeo, All Rights Reserved
3 # http://wiki.cyberleo.net/wiki/CyberLeo/COPYRIGHT
5 # Need root beyond here
6 [ "$(id -u)" -eq 0 ] || exec sudo env J_BASE=${J_BASE} J_NAME=${J_NAME} J_USER=${J_USER:-${USER}} "${0}" "${@}"
8 meh() { printf " \033[1;32m*\033[0m %s%s\n" "${jname:+${jname}: }" "${*}"; }
9 omg() { printf " \033[1;33m*\033[0m %s%s\n" "${jname:+${jname}: }" "${*}"; }
10 wtf() { printf " \033[1;31m*\033[0m %s%s\n" "${jname:+${jname}: }" "${*}"; exit 1; }
12 [ "${*}" ] && printf "%s\n\n" "${*}"
15 <command> <name> [arguments]
17 ls list available chroots
19 status show jail status
21 start prepare an existing chroot for use
23 stop undo what 'start' did
26 shell spawn a shell or command within the chroot
28 eval evaluate a shell command line within the chroot
34 cmd="$(basename "${0}")"
35 jbase="${J_BASE:-$(realpath "$(dirname "${0}")/../")}"
36 jname="${J_NAME:-$(basename "${1}")}" #"
39 # Remove chroot name from argument stack, if passed in
40 [ "${J_NAME}" ] || shift
42 # Propagate certain environment variables; sterilize the rest of the environment
49 # Create a new chroot, somehow
51 # Either a debian chroot with debootstrap or a gentoo chroot with stage3 + portage tarballs
52 DEBOOTSTRAP_DIR="$(base)/debootstrap" "${DEBOOTSTRAP_DIR}/debootstrap" --arch=amd64 squeeze "${jdir}"
55 # Figure out and set chroot parameters; needed for all functions that follow
59 # Make sure jname is not empty
62 printf "jerror='%s'\n" "jname empty"
66 # Given a chroot name, find and set up the chroot dir
67 jdir="${jbase}/${jname}"
70 printf "jerror='%s'\n" "not a directory"
76 for shell in /bin/bash /usr/bin/bash /usr/local/bin/bash /bin/sh
78 if [ -f "${jdir}/${shell}" ]
86 printf "jerror='%s'\n" "unable to locate usable shell; is this a jail?"
90 printf "jerror='' jname='%s' jdir='%s' jshell='%s'\n" "${jname}" "${jdir}" "${jshell}"
96 eval $(j_params "${1}")
97 [ "${jerror}" ] && return 1 || return 0
100 # List available chroots
102 ( cd "${jbase}"; ls -1 ) | while read jname
104 j_is "${jname}" && echo "${jname}"
108 # Chroot is 'up' if /dev/pts and /proc are mounted
110 jname="${1:-${jname}}"
111 eval "$(j_params "${jname}")"
112 [ "${jerror}" ] && wtf "${jerror}"
113 grep -q "^devpts ${jdir}/dev/pts devpts" /proc/mounts || return 1
114 grep -q "^proc ${jdir}/proc proc" /proc/mounts || return 1
118 # Poll chroot status (j_up)
120 [ -z "${1}" ] && set - $(l_ls)
123 j_up "${1}" && meh "$(printf '\033[1;32mup\033[0m')" || meh "$(printf '\033[1;31mdown\033[0m')"
128 # Mount /dev/pts and /proc in the chroot
130 jname="${1:-${jname}}"
131 j_up "${jname}" && return 0
132 eval "$(j_params "${jname}")"
133 meh "starting ${jname} ..."
134 mount -t devpts devpts "${jdir}/dev/pts"
135 mount -t proc proc "${jdir}/proc"
137 # Start all services in /etc/rcJ.d
138 j_root_eval "${jname}" '[ -d /etc/rcJ.d ] && ( ls -1 /etc/rcJ.d/* 2>&- | grep /S | sort | sed -e "s/$/ start/" | sh )'
141 # Execute command in chroot as root
143 jname="${1:-${jname}}"
144 j_up "${jname}" || wtf "chroot not running"
145 eval "$(j_params "${jname}")"
147 env -i ${jenv} /usr/bin/chroot "${jdir}" /bin/sh -c "${*}"
150 # Execute command in chroot
152 jname="${1:-${jname}}"
153 j_up "${jname}" || wtf "chroot not running"
154 eval "$(j_params "${jname}")"
156 env -i ${jenv} /usr/bin/chroot "${jdir}" /bin/su "${juser:-${USER}}" -c "${*}"
160 jname="${1:-${jname}}"
161 eval "$(j_params "${jname}")"
162 j_eval "${jname}" "cd; exec ${jshell} -l"
165 # Unmount /dev/pts and /proc in the chroot
167 jname="${1:-${jname}}"
168 eval "$(j_params "${jname}")"
169 j_up "${jname}" || return 0
170 meh "stopping ${jname} ..."
172 # Stop all services in /etc/rcJ.d
173 j_root_eval "${jname}" '[ -d /etc/rcJ.d ] && ( ls -1 /etc/rcJ.d/* 2>&- | grep /S | sort -r | sed -e "s/$/ stop/" | sh )'
175 umount "${jdir}/proc"
176 umount "${jdir}/dev/pts"
181 status) j_status "${jname}" "${@}" ;;
182 start) j_start "${jname}" ;;
183 shell|enter) j_shell "${jname}" ;;
184 eval) j_eval "${jname}" "${*}" ;;
185 stop) j_stop "${jname}" ;;