]> CyberLeo.Net >> Repos - CDN/j.git/blob - j
j: refactor param population to work per-function instead of globally
[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:-${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 # List available jails
50 j_ls() {
51   ( cd "${jbase}"; ls -1 ) | while read jname
52   do
53     something
54   done
55 }
56
57 # Create a new chroot, somehow
58 j_init() {
59   # Either a debian jail with debootstrap or a gentoo jail with stage3 + portage tarballs
60   DEBOOTSTRAP_DIR="$(base)/debootstrap" "${DEBOOTSTRAP_DIR}/debootstrap" --arch=amd64 squeeze "${jdir}"
61 }
62
63 # Figure out and set jail parameters; needed for all functions that follow
64 j_params() {
65   ( jname="${1:-jname}"
66
67     # Make sure jname is not empty
68     if [ -z "${jname}" ]
69     then
70       printf "jerror='%s'\n" "jname empty"
71       return 1
72     fi
73
74     # Given a jail name, find and set up the jail dir
75     jdir="${jbase}/${jname}"
76     if [ ! -d "${jdir}" ]
77     then
78       printf "jerror='%s'\n" "not a directory"
79       return 1
80     fi
81
82     # Where is the shell?
83     for shell in /bin/bash /usr/bin/bash /usr/local/bin/bash /bin/sh
84     do
85       if [ -f "${jdir}/${shell}" ]
86       then
87         jshell=${shell}
88         break
89       fi
90     done
91     if [ -z "${jshell}" ]
92     then
93       printf "jerror='%s'\n", "unable to locate usable shell; is this a jail?"
94       return 1
95     fi
96
97     printf "jname='%s' jdir='%s' jshell='%s'\n" "${jname}" "${jdir}" "${jshell}"
98   )
99 }
100
101 # Jail is 'up' if /dev/pts and /proc are mounted
102 j_up() {
103   jname="${1:-${jname}}"
104   eval "$(j_params "${jname}")"
105   [ "${jerror}" ] && wtf "${jerror}"
106   grep -q "^devpts ${jdir}/dev/pts devpts" /proc/mounts || return 1
107   grep -q "^proc ${jdir}/proc proc" /proc/mounts || return 1
108   return 0
109 }
110
111 j_status() {
112   j_up "${1}" && meh "$(printf '\033[1;32mup\033[0m')" || meh "$(printf '\033[1;31mdown\033[0m')"
113 }
114
115 # Mount /dev/pts and /proc in the chroot
116 j_start() {
117   jname="${1:-${jname}}"
118   j_up "${jname}" && return 0
119   eval "$(j_params "${jname}")"
120   meh "starting ${jail} ..."
121   mount -t devpts devpts "${jdir}/dev/pts"
122   mount -t proc proc "${jdir}/proc"
123 }
124
125 # Execute command in chroot
126 j_eval() {
127   jname="${1:-${jname}}"
128   j_up "${jname}" || wtf "jail not up"
129   eval "$(j_params "${jname}")"
130   shift
131   env -i ${jenv} /usr/bin/chroot "${jdir}" /bin/su "${juser:-${USER}}" -c "${*}"
132 }
133
134 j_shell() {
135   jname="${1:-${jname}}"
136   eval "$(j_params "${jname}")"
137   j_eval "${jname}" "${jshell} -l"
138 }
139
140 # Unmount /dev/pts and /proc in the chroot
141 j_stop() {
142   jname="${1:-${jname}}"
143   eval "$(j_params "${jname}")"
144   j_up "${jname}" || return 0
145   meh "stopping ${jail} ..."
146   umount "${jdir}/proc"
147   umount "${jdir}/dev/pts"
148 }
149
150 case "${cmd}" in
151 status) j_status "${jname}" ;;
152 start) j_start "${jname}" ;;
153 shell|enter) j_shell "${jname}" ;;
154 eval) j_eval "${jname}" "${*}" ;;
155 stop) j_stop "${jname}" ;;
156 *) pebkac ;;
157 esac