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