diff options
| -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 |
