]> CyberLeo.Net >> Repos - CDN/j.git/blob - j
j: clean up entry routines; eval instead of exec
[CDN/j.git] / j
1 #!/bin/sh
2 # Copyright 2011 CyberLeo, All Rights Reserved
3 # http://wiki.cyberleo.net/wiki/CyberLeo/COPYRIGHT
4
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} "${0}" "${@}"
7
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; }
11 pebkac() {
12   [ "${*}" ] && printf "%s\n\n" "${*}"
13   cat <<EOF
14 Usage:
15   <command> <name> [arguments]
16   list
17   ls      list available chroots
18
19   status  show jail status
20
21   start   prepare an existing chroot for use
22
23   stop    undo what 'start' did
24
25   enter
26   shell   spawn a shell or command within the chroot
27
28   eval    evaluate a shell command line within the chroot
29
30 EOF
31   exit 1
32 }
33
34 cmd="$(basename "${0}")"
35 jbase="${J_BASE:-$(realpath "$(dirname "${0}")/../")}"
36 jname="${J_NAME:-$(basename "${1}")}" #"
37 juser="${J_USER}"
38
39 # Remove jail name from argument stack, if passed in
40 [ "${J_NAME}" ] || shift
41
42 # Propagate certain environment variables; sterilize the rest of the environment
43 jenv="
44   LANG=${LANG}
45   TERM=${TERM}
46   USER=${USER}
47 "
48
49 # Create a new chroot, somehow
50 j_init() {
51   # Either a debian jail with debootstrap or a gentoo jail with stage3 + portage tarballs
52   DEBOOTSTRAP_DIR="$(base)/debootstrap" "${DEBOOTSTRAP_DIR}/debootstrap" --arch=amd64 squeeze "${jdir}"
53 }
54
55 # Figure out and set jail parameters; needed for all functions that follow
56 j_params() {
57   jname="${1:-jname}"
58   # Given a jail name, find and set up the jail dir
59   jdir="${jbase}/${jname}"
60   [ -d "${jdir}" ] || wtf "not a directory"
61
62   # Where is the shell?
63   for shell in /bin/bash /usr/bin/bash /usr/local/bin/bash /bin/sh
64   do
65     if [ -f "${jdir}/${shell}" ]
66     then
67       jshell=${shell}
68       break
69     fi
70     wtf "cannot locate usable shell; is this a real jail?"
71   done
72 }
73
74 # Jail is 'up' if /dev/pts and /proc are mounted
75 j_up() {
76   grep -q "^devpts ${jdir}/dev/pts devpts" /proc/mounts || return 1
77   grep -q "^proc ${jdir}/proc proc" /proc/mounts || return 1
78   return 0
79 }
80
81 j_status() {
82   j_up && meh "$(printf '\033[1;32mup\033[0m')" || meh "$(printf '\033[1;31mdown\033[0m')"
83 }
84
85 # Mount /dev/pts and /proc in the chroot
86 j_start() {
87   j_up && return 0
88   meh "starting ${jail} ..."
89   mount -t devpts devpts "${jdir}/dev/pts"
90   mount -t proc proc "${jdir}/proc"
91 }
92
93 # Execute command in chroot
94 j_eval() {
95   j_up || wtf "jail not up"
96   meh "entering ${jail} ..."
97   env -i ${jenv} /usr/bin/chroot "${jdir}" /bin/su "${juser:-${USER}}" -c "${*}"
98 }
99
100 j_shell() {
101   j_eval "${jshell} -l"
102 }
103
104 # Unmount /dev/pts and /proc in the chroot
105 j_stop() {
106   j_up || return 0
107   meh "stopping ${jail} ..."
108   umount "${jdir}/proc"
109   umount "${jdir}/dev/pts"
110 }
111
112 # Populate jvars
113 j_params "${jname}"
114
115 case "${cmd}" in
116 status) j_status ;;
117 start) j_start ;;
118 shell|enter) j_shell ;;
119 eval) j_eval "${*}" ;;
120 stop)  j_stop  ;;
121 *) pebkac ;;
122 esac