diff options
Diffstat (limited to 'ezjail-admin')
-rwxr-xr-x | ezjail-admin | 94 |
1 files changed, 42 insertions, 52 deletions
diff --git a/ezjail-admin b/ezjail-admin index cf3ddf9..b5d2df0 100755 --- a/ezjail-admin +++ b/ezjail-admin | |||
@@ -35,8 +35,7 @@ case "$1" in | |||
35 | ######################## ezjail-admin CREATE ######################## | 35 | ######################## ezjail-admin CREATE ######################## |
36 | create) | 36 | create) |
37 | shift | 37 | shift |
38 | args=`getopt xf:r: $*` | 38 | args=`getopt xf:r: $*` || exerr "Usage: `basename -- $0` create [-f flavour] [-r jailroot] [-x] jailname jailip" |
39 | [ $? = 0 ] || exerr "Usage: `basename -- $0` create [-f flavour] [-r jailroot] [-x] jailname jailip" | ||
40 | 39 | ||
41 | newjail_root= | 40 | newjail_root= |
42 | newjail_flavour= | 41 | newjail_flavour= |
@@ -57,17 +56,16 @@ create) | |||
57 | # we need at least a name and an ip for new jail | 56 | # we need at least a name and an ip for new jail |
58 | [ "${newjail_name}" -a "${newjail_ip}" -a $# = 2 ] || exerr "Usage: `basename -- $0` create [-f flavour] [-r jailroot] [-x] jailname jailip" | 57 | [ "${newjail_name}" -a "${newjail_ip}" -a $# = 2 ] || exerr "Usage: `basename -- $0` create [-f flavour] [-r jailroot] [-x] jailname jailip" |
59 | 58 | ||
60 | # check, whether ezjail-update has been called. existence of | 59 | # check, whether ezjail-update has been called. existence of |
61 | # ezjail_jailbase is our indicator | 60 | # ezjail_jailbase is our indicator |
62 | [ -d ${ezjail_jailbase} ] || exerr "Error: base jail does not exist. Please run 'ezjail-admin update' first." | 61 | [ -d ${ezjail_jailbase} ] || exerr "Error: base jail does not exist. Please run 'ezjail-admin update' first." |
63 | 62 | ||
64 | # relative paths don't make sense in rc.scripts | 63 | # relative paths don't make sense in rc.scripts |
65 | [ "${ezjail_jaildir#/}" = "${ezjail_jaildir}" ] && exerr "Error: Need an absolute path in ezjail_jaildir, it currently is set to: ${ezjail_jaildir}." | 64 | [ ${ezjail_jaildir%%[!/]*} ] && exerr "Error: Need an absolute path in ezjail_jaildir, it currently is set to: ${ezjail_jaildir}." |
66 | 65 | ||
67 | # jail names must not irritate file systems, excluding dots | 66 | # jail names must not irritate file systems, excluding dots from this list |
68 | # from this list was done intentionally to permit foo.com | 67 | # was done intentionally to permit foo.com style directory names, however, |
69 | # style directory names, however, the jail name will be | 68 | # the jail name will be foo_com in most scripts |
70 | # foo_com in most scripts | ||
71 | 69 | ||
72 | newjail_name=`echo -n ${newjail_name} | tr /~ __` | 70 | newjail_name=`echo -n ${newjail_name} | tr /~ __` |
73 | newjail_nname=`echo -n "${newjail_name}" | tr -c [:alnum:] _` | 71 | newjail_nname=`echo -n "${newjail_name}" | tr -c [:alnum:] _` |
@@ -77,24 +75,23 @@ create) | |||
77 | # so check, whether we might be running into problems | 75 | # so check, whether we might be running into problems |
78 | [ -e ${ezjail_jailcfgs}/${newjail_nname} ] && exerr "Error: an ezjail config already exists at ${ezjail_jailcfgs}/${newjail_nname}. Please rename the ezjail." | 76 | [ -e ${ezjail_jailcfgs}/${newjail_nname} ] && exerr "Error: an ezjail config already exists at ${ezjail_jailcfgs}/${newjail_nname}. Please rename the ezjail." |
79 | 77 | ||
80 | # if jail root specified on command line is not absolute, | 78 | # if jail root specified on command line is not absolute, make it absolute |
81 | # make it absolute inside our jail directory | 79 | # inside our jail directory |
82 | [ "${newjail_root#/}" = "${newjail_root}" ] && newjail_root=${ezjail_jaildir}/${newjail_root} | 80 | [ ${newjail_root%%[!/]*} ] && newjail_root=${ezjail_jaildir}/${newjail_root} |
83 | 81 | ||
84 | # if jail root specified on command line does not lie | 82 | # if jail root specified on command line does not lie within our jail |
85 | # within our jail directory, we need to create a softlink | 83 | # directory, we need to create a softlink |
86 | if [ "${newjail_root##${ezjail_jaildir}}" = "${newjail_root}" ]; then | 84 | if [ "${newjail_root##${ezjail_jaildir}}" = "${newjail_root}" ]; then |
87 | newjail_softlink=${ezjail_jaildir}/`basename -- ${newjail_root}` | 85 | newjail_softlink=${ezjail_jaildir}/`basename -- ${newjail_root}` |
88 | [ -e ${newjail_softlink} -a "${newjail_fill}" = "YES" ] && exerr "Error: an ezjail already exists at ${newjail_softlink}." | 86 | [ -e ${newjail_softlink} -a "${newjail_fill}" = "YES" ] && exerr "Error: an ezjail already exists at ${newjail_softlink}." |
89 | fi | 87 | fi |
90 | 88 | ||
91 | # do some sanity checks on the selected flavour (if any) | 89 | # do some sanity checks on the selected flavour (if any) |
92 | if [ ${newjail_flavour} ]; then | 90 | [ "${newjail_flavour}" -a ! -d ${ezjail_flavours}/${newjail_flavour} ] && exerr "Error: Flavour config directory ${ezjail_flavours}/${newjail_flavour} not found." |
93 | [ -d ${ezjail_flavours}/${newjail_flavour}/ ] || exerr "Error: Flavour config directory ${ezjail_flavours}/${newjail_flavour} not found." | ||
94 | fi | ||
95 | 91 | ||
96 | # All sanity checks that may lead to errors are hopefully | 92 | # |
97 | # passed here | 93 | # All sanity checks that may lead to errors are hopefully passed here |
94 | # | ||
98 | 95 | ||
99 | # now take a copy of our template jail | 96 | # now take a copy of our template jail |
100 | if [ "${newjail_fill}" = "YES" ]; then | 97 | if [ "${newjail_fill}" = "YES" ]; then |
@@ -106,12 +103,12 @@ create) | |||
106 | # if a soft link is necessary, create it now | 103 | # if a soft link is necessary, create it now |
107 | [ ${newjail_softlink} ] && ln -s ${newjail_root} ${newjail_softlink} | 104 | [ ${newjail_softlink} ] && ln -s ${newjail_root} ${newjail_softlink} |
108 | 105 | ||
109 | # if the automount feature is not disabled, this | 106 | # if the automount feature is not disabled, this fstab entry for new jail |
110 | # fstab entry for new jail will be obeyed | 107 | # will be obeyed |
111 | echo ${ezjail_jailbase} ${newjail_root}/basejail nullfs ro 0 0 > /etc/fstab.${newjail_nname} | 108 | echo ${ezjail_jailbase} ${newjail_root}/basejail nullfs ro 0 0 > /etc/fstab.${newjail_nname} |
112 | 109 | ||
113 | # now, where everything seems to have gone right, | 110 | # now, where everything seems to have gone right, create control file in |
114 | # create control file in ezjails config dir | 111 | # ezjails config dir |
115 | mkdir -p ${ezjail_jailcfgs} | 112 | mkdir -p ${ezjail_jailcfgs} |
116 | echo export jail_${newjail_nname}_hostname=\"${newjail_name}\" > ${ezjail_jailcfgs}/${newjail_nname} | 113 | echo export jail_${newjail_nname}_hostname=\"${newjail_name}\" > ${ezjail_jailcfgs}/${newjail_nname} |
117 | echo export jail_${newjail_nname}_ip=\"${newjail_ip}\" >> ${ezjail_jailcfgs}/${newjail_nname} | 114 | echo export jail_${newjail_nname}_ip=\"${newjail_ip}\" >> ${ezjail_jailcfgs}/${newjail_nname} |
@@ -125,20 +122,19 @@ create) | |||
125 | 122 | ||
126 | # Final steps for flavour installation | 123 | # Final steps for flavour installation |
127 | if [ ${newjail_flavour} ]; then | 124 | if [ ${newjail_flavour} ]; then |
128 | # install files, packages and config to new jail | 125 | # install files and config to new jail |
129 | # user creating, chown and package installation on jails startup | ||
130 | cd ${ezjail_flavours}/${newjail_flavour} | 126 | cd ${ezjail_flavours}/${newjail_flavour} |
131 | find * | cpio -p -v ${newjail_root} > /dev/null | 127 | find * | cpio -p -v ${newjail_root} > /dev/null |
132 | 128 | ||
133 | if [ -f ${ezjail_share}/ezjail.flavour ]; then | 129 | # If a config is found, make it auto run on jails startup |
130 | if [ -f ${newjail_root}/ezjail.flavour ]; then | ||
134 | ln -s /ezjail.flavour ${newjail_root}/etc/rc.d/ezjail-config.sh | 131 | ln -s /ezjail.flavour ${newjail_root}/etc/rc.d/ezjail-config.sh |
135 | chmod 0700 ${newjail_root}/etc/rc.d/ezjail-config.sh | 132 | chmod 0700 ${newjail_root}/etc/rc.d/ezjail-config.sh |
136 | echo "Note: Shell scripts installed, flavourizing on jails first startup." | 133 | echo "Note: Shell scripts installed, flavourizing on jails first startup." |
137 | fi | 134 | fi |
138 | fi | 135 | fi |
139 | 136 | ||
140 | # For user convenience, some scenarios commonly causing | 137 | # For user convenience some scenarios commonly causing headaches are checked |
141 | # headaches are checked | ||
142 | 138 | ||
143 | # check, whether IP is configured on a local interface, warn if it isnt | 139 | # check, whether IP is configured on a local interface, warn if it isnt |
144 | ping -c 1 -m 1 -t 1 -q ${newjail_ip} > /dev/null | 140 | ping -c 1 -m 1 -t 1 -q ${newjail_ip} > /dev/null |
@@ -157,9 +153,8 @@ create) | |||
157 | ######################## ezjail-admin DELETE ######################## | 153 | ######################## ezjail-admin DELETE ######################## |
158 | delete) | 154 | delete) |
159 | shift | 155 | shift |
160 | args=`getopt w $*` | 156 | args=`getopt w $*` || exerr "Usage: `basename -- $0` delete [-w] jailname" |
161 | [ $? = 0 ] || exerr "Usage: `basename -- $0` delete [-w] jailname" | 157 | |
162 | |||
163 | oldjail_wipe= | 158 | oldjail_wipe= |
164 | 159 | ||
165 | set -- ${args} | 160 | set -- ${args} |
@@ -180,19 +175,16 @@ delete) | |||
180 | # check for existence of jail in our records | 175 | # check for existence of jail in our records |
181 | [ -f ${ezjail_jailcfgs}/${oldjail_nname} ] || exerr "Error: Nothing known about jail ${oldjail_name}." | 176 | [ -f ${ezjail_jailcfgs}/${oldjail_nname} ] || exerr "Error: Nothing known about jail ${oldjail_name}." |
182 | 177 | ||
183 | # fetch information about the jail to be gone | 178 | # fetch information about the jail to be gone by parsing our records |
184 | # by parsing our records | ||
185 | . ${ezjail_jailcfgs}/${oldjail_nname} | 179 | . ${ezjail_jailcfgs}/${oldjail_nname} |
186 | eval oldjail_rootdir=\"\$jail_${oldjail_nname}_rootdir\" | 180 | eval oldjail_rootdir=\"\$jail_${oldjail_nname}_rootdir\" |
187 | 181 | ||
188 | # if jail is still running, refuse to go any further | 182 | # if jail is still running, refuse to go any further |
189 | [ -f /var/run/jail_${oldjail_nname}.id ] && exerr "Error: Jail appears to be still running, stop it first.\n(/var/run/jail_${oldjail_nname}.id exists)." | 183 | [ -f /var/run/jail_${oldjail_nname}.id ] && exerr "Error: Jail appears to be still running, stop it first.\n(/var/run/jail_${oldjail_nname}.id exists)." |
190 | 184 | ||
191 | # now we know everything we need to let the jail be gone | 185 | # now we know everything we need to let the jail be gone remove entry |
192 | # remove entry from ezjail resource structure | 186 | # from ezjail resource structure, delete fstab.JAILNAME |
193 | rm -f ${ezjail_jailcfgs}/${oldjail_nname} | 187 | rm -f ${ezjail_jailcfgs}/${oldjail_nname} |
194 | |||
195 | # delete fstab.JAILNAME | ||
196 | rm -f /etc/fstab.${oldjail_nname} | 188 | rm -f /etc/fstab.${oldjail_nname} |
197 | 189 | ||
198 | # if there is a soft link pointing to the jail root, remove it | 190 | # if there is a soft link pointing to the jail root, remove it |
@@ -200,11 +192,11 @@ delete) | |||
200 | [ -L ${oldjail_softlink} ] && rm ${oldjail_softlink} | 192 | [ -L ${oldjail_softlink} ] && rm ${oldjail_softlink} |
201 | 193 | ||
202 | # if wiping the jail was requested, remove it | 194 | # if wiping the jail was requested, remove it |
203 | [ "${oldjail_wipe}" = "YES" ] && rm -rf ${oldjail_rootdir} | 195 | [ ${oldjail_wipe} ] && rm -rf ${oldjail_rootdir} |
204 | 196 | ||
205 | ;; | 197 | ;; |
206 | ######################## ezjail-admin LIST ######################## | 198 | ######################## ezjail-admin LIST ######################## |
207 | list) | 199 | list) |
208 | jail_list=`ls ${ezjail_jailcfgs}` | 200 | jail_list=`ls ${ezjail_jailcfgs}` |
209 | for jail in ${jail_list}; do | 201 | for jail in ${jail_list}; do |
210 | . ${ezjail_jailcfgs}/${jail} | 202 | . ${ezjail_jailcfgs}/${jail} |
@@ -218,8 +210,7 @@ delete) | |||
218 | ######################## ezjail-admin UPDATE ######################## | 210 | ######################## ezjail-admin UPDATE ######################## |
219 | setup|update) | 211 | setup|update) |
220 | shift | 212 | shift |
221 | args=`getopt ipPs: $*` | 213 | args=`getopt ipPs: $*` || exerr "Usage: `basename -- $0` update [-s sourcetree] [-i] [-pP]" |
222 | [ $? = 0 ] || exerr "Usage: `basename -- $0` update [-s sourcetree] [-i] [-pP]" | ||
223 | 214 | ||
224 | updatejail_installaction="world" | 215 | updatejail_installaction="world" |
225 | updatejail_provideports= | 216 | updatejail_provideports= |
@@ -236,7 +227,7 @@ setup|update) | |||
236 | done | 227 | done |
237 | 228 | ||
238 | if [ "${updatejail_installaction}" = "none" ]; then | 229 | if [ "${updatejail_installaction}" = "none" ]; then |
239 | # check, whether ezjail-update has been called. existence of | 230 | # check, whether ezjail-update has been called. existence of |
240 | # ezjail_jailbase is our indicator | 231 | # ezjail_jailbase is our indicator |
241 | [ -d ${ezjail_jailbase} ] || exerr "Error: base jail does not exist. You cannot fill base jails ports tree before creating it. Please run 'ezjail-admin update' first." | 232 | [ -d ${ezjail_jailbase} ] || exerr "Error: base jail does not exist. You cannot fill base jails ports tree before creating it. Please run 'ezjail-admin update' first." |
242 | else | 233 | else |
@@ -244,18 +235,17 @@ setup|update) | |||
244 | [ -d ${ezjail_sourcetree} ] || exerr "Cannot find your copy of the FreeBSD source tree in ${ezjail_sourcetree}." | 235 | [ -d ${ezjail_sourcetree} ] || exerr "Cannot find your copy of the FreeBSD source tree in ${ezjail_sourcetree}." |
245 | [ -e ${ezjail_sourcetree}/Makefile ] || exerr "Your source tree in ${ezjail_sourcetree} seems to be incomplete (Makefile missing)." | 236 | [ -e ${ezjail_sourcetree}/Makefile ] || exerr "Your source tree in ${ezjail_sourcetree} seems to be incomplete (Makefile missing)." |
246 | 237 | ||
247 | # Normally fulljail should be renamed by past ezjail-admin commands | 238 | # Normally fulljail should be renamed by past ezjail-admin commands. |
248 | # However those may have failed | 239 | # However those may have failed |
249 | rm -rf ${ezjail_jailfull}; mkdir -p ${ezjail_jailfull} | 240 | chflags -R noschg ${ezjail_jailfull}; rm -rf ${ezjail_jailfull}; |
241 | mkdir -p ${ezjail_jailfull} | ||
250 | 242 | ||
251 | # make our world | 243 | # make our world |
252 | cd ${ezjail_sourcetree} | 244 | cd ${ezjail_sourcetree} |
253 | make ${updatejail_installaction} DESTDIR=${ezjail_jailfull} | 245 | make ${updatejail_installaction} DESTDIR=${ezjail_jailfull} || exerr "make ${updatejail_installaction} failed." |
254 | [ $? = 0 ] || exerr "make ${updatejail_installaction} failed." | ||
255 | 246 | ||
256 | # setup world | 247 | # setup world |
257 | make distribution DESTDIR=${ezjail_jailfull} | 248 | make distribution DESTDIR=${ezjail_jailfull} || exerr "make distribution failed." |
258 | [ $? = 0 ] || exerr "make distribution failed." | ||
259 | 249 | ||
260 | # Fill basejail from installed world | 250 | # Fill basejail from installed world |
261 | cd ${ezjail_jailfull} | 251 | cd ${ezjail_jailfull} |
@@ -263,8 +253,7 @@ setup|update) | |||
263 | # directories with permission 0700 which is bad | 253 | # directories with permission 0700 which is bad |
264 | mkdir -p ${ezjail_jailbase}/usr | 254 | mkdir -p ${ezjail_jailbase}/usr |
265 | for dir in bin lib libexec sbin usr/bin usr/include usr/lib usr/libexec usr/sbin usr/src usr/share; do | 255 | for dir in bin lib libexec sbin usr/bin usr/include usr/lib usr/libexec usr/sbin usr/src usr/share; do |
266 | find ${dir} | cpio -d -p -v ${ezjail_jailbase} | 256 | find ${dir} | cpio -d -p -v ${ezjail_jailbase} || exerr "Installation of ${dir} failed." |
267 | [ $? = 0 ] || exerr "Installation of ${dir} failed." | ||
268 | chflags -R noschg ${dir}; rm -r ${dir}; ln -s /basejail/${dir} ${dir} | 257 | chflags -R noschg ${dir}; rm -r ${dir}; ln -s /basejail/${dir} ${dir} |
269 | done | 258 | done |
270 | mkdir basejail | 259 | mkdir basejail |
@@ -299,9 +288,10 @@ setup|update) | |||
299 | [ $? = 0 ] || exerr "Updating ports failed." | 288 | [ $? = 0 ] || exerr "Updating ports failed." |
300 | fi | 289 | fi |
301 | 290 | ||
302 | # A ports collection inside jails is hardly useful w/o an appropriate /etc/make.conf | 291 | # A ports collection inside jails is hardly useful w/o an appropriate |
303 | # if we find basejail/usr/ports/Makefile, assume that the admin wants a working make.conf in new jails | 292 | # /etc/make.conf. If we find basejail/usr/ports/Makefile, assume that |
304 | # also a softlink to the ports in basejail is provided | 293 | # the admin wants a working make.conf in new jails also a softlink to |
294 | # the ports in basejail is provided | ||
305 | if [ -f ${ezjail_jailbase}/usr/ports/Makefile ]; then | 295 | if [ -f ${ezjail_jailbase}/usr/ports/Makefile ]; then |
306 | # no /usr/ports? link to /basejail/usr/ports | 296 | # no /usr/ports? link to /basejail/usr/ports |
307 | [ -e ${ezjail_jailtemplate}/usr/ports ] || ln -s /basejail/usr/ports ${ezjail_jailtemplate}/usr/ports | 297 | [ -e ${ezjail_jailtemplate}/usr/ports ] || ln -s /basejail/usr/ports ${ezjail_jailtemplate}/usr/ports |