diff options
| -rwxr-xr-x | ezjail-admin | 147 | ||||
| -rwxr-xr-x | man1/ezjail-admin.1 | 4 |
2 files changed, 82 insertions, 69 deletions
diff --git a/ezjail-admin b/ezjail-admin index ec375ba..34cbe49 100755 --- a/ezjail-admin +++ b/ezjail-admin | |||
| @@ -37,8 +37,8 @@ ezjail_basesystem="base" | |||
| 37 | case `uname -p` in amd64) ezjail_dirlist="${ezjail_dirlist} usr/lib32"; ezjail_basesystem="${ezjail_basesystem} lib32";; esac | 37 | case `uname -p` in amd64) ezjail_dirlist="${ezjail_dirlist} usr/lib32"; ezjail_basesystem="${ezjail_basesystem} lib32";; esac |
| 38 | 38 | ||
| 39 | # Synopsis messages | 39 | # Synopsis messages |
| 40 | ezjail_usage_ezjailadmin="ezjail-admin v3.0b\nUsage: ${ezjail_admin} [archive|config|console|create|delete|install|list|restore|update] {params}" | 40 | ezjail_usage_ezjailadmin="${ezjail_admin} v3.0b\nUsage: ${ezjail_admin} [archive|config|console|create|delete|install|list|restore|update] {params}" |
| 41 | ezjail_usage_install="Usage: ${ezjail_admin} install [-mps] [-h host] [-r release]" | 41 | ezjail_usage_install="Usage: ${ezjail_admin} install [-mMpPsS] [-h host] [-r release]" |
| 42 | ezjail_usage_create="Usage: ${ezjail_admin} create [-xbi] [-f flavour] [-r jailroot] [-s size] [-c bde|eli] [-C args] [-a archive] jailname jailip" | 42 | ezjail_usage_create="Usage: ${ezjail_admin} create [-xbi] [-f flavour] [-r jailroot] [-s size] [-c bde|eli] [-C args] [-a archive] jailname jailip" |
| 43 | ezjail_usage_delete="Usage: ${ezjail_admin} delete [-w] jailname" | 43 | ezjail_usage_delete="Usage: ${ezjail_admin} delete [-w] jailname" |
| 44 | ezjail_usage_update="Usage: ${ezjail_admin} update [-s sourcetree] [-i] [-pP]" | 44 | ezjail_usage_update="Usage: ${ezjail_admin} update [-s sourcetree] [-i] [-pP]" |
| @@ -132,12 +132,12 @@ start_stop_jail_by_script () { | |||
| 132 | elif [ -x "${ezjail_prefix}/etc/rc.d/ezjail.sh" ]; then | 132 | elif [ -x "${ezjail_prefix}/etc/rc.d/ezjail.sh" ]; then |
| 133 | (exec "${ezjail_prefix}/etc/rc.d/ezjail.sh" ${ezjail_action} ${ezjail_name}); | 133 | (exec "${ezjail_prefix}/etc/rc.d/ezjail.sh" ${ezjail_action} ${ezjail_name}); |
| 134 | else | 134 | else |
| 135 | exerr "Could not find ezjail's rc.d script in ${ezjail_prefix}/etc/rc.d/. You need to ${ezjail_action} ${ezjail_name} by hand." | 135 | exerr "Error: Could not find ezjail's rc.d script in ${ezjail_prefix}/etc/rc.d/.\n You need to ${ezjail_action} ${ezjail_name} by hand." |
| 136 | fi | 136 | fi |
| 137 | 137 | ||
| 138 | # Check for success of our operation | 138 | # Check for success of our operation |
| 139 | fetchjailinfo ${ezjail_name} | 139 | fetchjailinfo ${ezjail_name} |
| 140 | [ ${ezjail_success_check} "${ezjail_id}" ] || exerr "Error: Could not ${ezjail_action} ${ezjail_name}. You need to ${ezjail_action} it by hand." | 140 | [ ${ezjail_success_check} "${ezjail_id}" ] || exerr "Error: Could not ${ezjail_action} ${ezjail_name}.\n You need to ${ezjail_action} it by hand." |
| 141 | } | 141 | } |
| 142 | 142 | ||
| 143 | # fetch everything we need to know about an ezjail from config | 143 | # fetch everything we need to know about an ezjail from config |
| @@ -196,13 +196,13 @@ fetchjailinfo () { | |||
| 196 | # fill the base jail - this function is used by install and update | 196 | # fill the base jail - this function is used by install and update |
| 197 | ezjail_splitworld() { | 197 | ezjail_splitworld() { |
| 198 | # Fill basejail from installed world | 198 | # Fill basejail from installed world |
| 199 | cd "${ezjail_jailfull}" || exerr "Cant access temporary Jail directory." | 199 | cd "${ezjail_jailfull}" || exerr "Error: Cant access temporary Jail directory." |
| 200 | 200 | ||
| 201 | # This mkdir is important, since cpio will create intermediate | 201 | # This mkdir is important, since cpio will create intermediate |
| 202 | # directories with permission 0700 which is bad | 202 | # directories with permission 0700 which is bad |
| 203 | mkdir -p "${ezjail_jailbase}/usr" | 203 | mkdir -p "${ezjail_jailbase}/usr" |
| 204 | for dir in ${ezjail_dirlist}; do | 204 | for dir in ${ezjail_dirlist}; do |
| 205 | find ${dir} | cpio -d -p -v "${ezjail_jailbase}" || exerr "Installation of ${dir} failed." | 205 | find ${dir} | cpio -d -p -v "${ezjail_jailbase}" || exerr "Error: Installation of ${dir} failed." |
| 206 | chflags -R noschg ${dir}; rm -r ${dir}; ln -s /basejail/${dir} ${dir} | 206 | chflags -R noschg ${dir}; rm -r ${dir}; ln -s /basejail/${dir} ${dir} |
| 207 | done | 207 | done |
| 208 | mkdir basejail | 208 | mkdir basejail |
| @@ -245,7 +245,7 @@ ezjail_updateports () { | |||
| 245 | [ -d "${ezjail_jailbase}/usr/ports" ] && ezjail_portsnapaction="update" | 245 | [ -d "${ezjail_jailbase}/usr/ports" ] && ezjail_portsnapaction="update" |
| 246 | portsnap -p "${ezjail_jailbase}/usr/ports" ${ezjail_portsnapaction:-"extract"} | 246 | portsnap -p "${ezjail_jailbase}/usr/ports" ${ezjail_portsnapaction:-"extract"} |
| 247 | fi | 247 | fi |
| 248 | [ $? -eq 0 ] || exerr "Updating ports failed." | 248 | [ $? -eq 0 ] || exerr "Error: Updating ports failed." |
| 249 | } | 249 | } |
| 250 | 250 | ||
| 251 | # Try to fetch the list of releases the server provides | 251 | # Try to fetch the list of releases the server provides |
| @@ -345,7 +345,7 @@ create) | |||
| 345 | [ "${ezjail_name}" -a "${ezjail_ip}" -a $# -eq 2 ] || exerr ${ezjail_usage_create} | 345 | [ "${ezjail_name}" -a "${ezjail_ip}" -a $# -eq 2 ] || exerr ${ezjail_usage_create} |
| 346 | 346 | ||
| 347 | # check for sanity of settings concerning the image feature | 347 | # check for sanity of settings concerning the image feature |
| 348 | [ -z "${ezjail_imagetype}" -o "${ezjail_exists}" -o "${ezjail_imagesize}" ] || exerr "Image jails need an image size." | 348 | [ -z "${ezjail_imagetype}" -o "${ezjail_exists}" -o "${ezjail_imagesize}" ] || exerr "Error: Image jails need an image size." |
| 349 | 349 | ||
| 350 | # check for a sane image type | 350 | # check for a sane image type |
| 351 | case ${ezjail_imagetype} in ""|simple|bde|eli) ;; *) exerr ${ezjail_usage_create};; esac | 351 | case ${ezjail_imagetype} in ""|simple|bde|eli) ;; *) exerr ${ezjail_usage_create};; esac |
| @@ -360,10 +360,10 @@ create) | |||
| 360 | 360 | ||
| 361 | # check, whether ezjail has been set up correctly. existence of | 361 | # check, whether ezjail has been set up correctly. existence of |
| 362 | # ezjail_jailbase is our indicator | 362 | # ezjail_jailbase is our indicator |
| 363 | [ -d "${ezjail_jailbase}" ] || exerr "Error: base jail does not exist. Please run '${ezjail_admin} install' or '${ezjail_admin} update' first." | 363 | [ -d "${ezjail_jailbase}" ] || exerr "Error: base jail does not exist.\n Please run '${ezjail_admin} install' or '${ezjail_admin} update' first." |
| 364 | 364 | ||
| 365 | # relative paths don't make sense in rc.scripts | 365 | # relative paths don't make sense in rc.scripts |
| 366 | [ "${ezjail_jaildir%%[!/]*}" ] || exerr "Error: Need an absolute path in ezjail_jaildir, it currently is set to: ${ezjail_jaildir}." | 366 | [ "${ezjail_jaildir%%[!/]*}" ] || exerr "Error: Need an absolute path in ezjail_jaildir.\n It is currently set to: ${ezjail_jaildir}." |
| 367 | 367 | ||
| 368 | # jail names must not irritate file systems, excluding dots from this list | 368 | # jail names must not irritate file systems, excluding dots from this list |
| 369 | # was done intentionally to permit foo.com style directory names, however, | 369 | # was done intentionally to permit foo.com style directory names, however, |
| @@ -377,11 +377,11 @@ create) | |||
| 377 | # This scenario really will only lead to real troubles in the 'fulljail' | 377 | # This scenario really will only lead to real troubles in the 'fulljail' |
| 378 | # case, but I should still explain this to the user and not claim that | 378 | # case, but I should still explain this to the user and not claim that |
| 379 | # "an ezjail would already exist" | 379 | # "an ezjail would already exist" |
| 380 | case ${ezjail_hostname} in basejail|newjail|fulljail|flavours|ezjailtemp) exerr "Error: ezjail needs the ${ezjail_hostname} directory for its own administrative purposes. Please rename the ezjail.";; esac | 380 | case ${ezjail_hostname} in basejail|newjail|fulljail|flavours|ezjailtemp) exerr "Error: Cannot name the jail ${ezjail_hostname}.\n ezjail needs the ${ezjail_hostname} directory for its own administrative purposes.\n Please rename the ezjail.";; esac |
| 381 | 381 | ||
| 382 | # jail names may lead to identical configs, eg. foo.bar.com == foo-bar.com | 382 | # jail names may lead to identical configs, eg. foo.bar.com == foo-bar.com |
| 383 | # so check, whether we might be running into problems | 383 | # so check, whether we might be running into problems |
| 384 | [ -e "${ezjail_config}" -o -e "${ezjail_config}.norun" ] && exerr "Error: an ezjail config already exists at ${ezjail_config}. Please rename the ezjail." | 384 | if [ -e "${ezjail_config}" -o -e "${ezjail_config}.norun" ] && exerr "Error: An ezjail config already exists at ${ezjail_config}.\n This can happen because ezjail converts non alphanumeric characters in jail names to '_'.\n Please rename the ezjail." |
| 385 | 385 | ||
| 386 | # if jail root specified on command line is not absolute, make it absolute | 386 | # if jail root specified on command line is not absolute, make it absolute |
| 387 | # inside our jail directory | 387 | # inside our jail directory |
| @@ -391,22 +391,25 @@ create) | |||
| 391 | # install. Empty root dirs are considered okay, sometimes they are | 391 | # install. Empty root dirs are considered okay, sometimes they are |
| 392 | # mount points to be filled by ezjail. | 392 | # mount points to be filled by ezjail. |
| 393 | [ -d "${ezjail_rootdir}" ] && [ -z "`ls -I ${ezjail_rootdir}`" ] && ezjail_rootdirempty="YES" | 393 | [ -d "${ezjail_rootdir}" ] && [ -z "`ls -I ${ezjail_rootdir}`" ] && ezjail_rootdirempty="YES" |
| 394 | [ -e "${ezjail_rootdir}" -a -z "${ezjail_rootdirempty}" -a -z "${ezjail_exists}" ] && exerr "Error: the specified jail root ${ezjail_rootdir} already exists." | 394 | [ -e "${ezjail_rootdir}" -a -z "${ezjail_rootdirempty}" -a -z "${ezjail_exists}" ] && exerr "Error: A file or a non empty directory already exists at the specified jail root ${ezjail_rootdir}.\n Maybe you want to '${ezjail_admin} create -x' an existing jail?\n Please specify another jail root with the -r switch." |
| 395 | 395 | ||
| 396 | # if jail root specified on command line does not lie within our jail | 396 | # if jail root specified on command line does not lie within our jail |
| 397 | # directory, we need to create a softlink | 397 | # directory, we need to create a softlink |
| 398 | if [ "${ezjail_rootdir##${ezjail_jaildir}}" = "${ezjail_rootdir}" ]; then | 398 | if [ "${ezjail_rootdir##${ezjail_jaildir}}" = "${ezjail_rootdir}" ]; then |
| 399 | ezjail_softlink=${ezjail_jaildir}/`basename -- "${ezjail_rootdir}"` | 399 | ezjail_softlink=${ezjail_jaildir}/`basename -- "${ezjail_rootdir}"` |
| 400 | [ -e "${ezjail_softlink}" ] && exerr "Error: an ezjail already exists at ${ezjail_softlink}." | 400 | [ -e "${ezjail_softlink}" ] && exerr "Error: An ezjail already exists at ${ezjail_softlink}.\n Please specify another jail root with the -r switch." |
| 401 | fi | 401 | fi |
| 402 | 402 | ||
| 403 | # do some sanity checks on the selected flavour (if any) | 403 | # do some sanity checks on the selected flavour (if any) |
| 404 | [ "${ezjail_flavour}" -a ! -d "${ezjail_flavours}/${ezjail_flavour}" ] && exerr "Error: Flavour config directory ${ezjail_flavours}/${ezjail_flavour} not found." | 404 | [ "${ezjail_flavour}" -a ! -d "${ezjail_flavours}/${ezjail_flavour}" ] && exerr "Error: Flavour config directory ${ezjail_flavours}/${ezjail_flavour} not found.\n Refer to ${ezjail_admin}s man page for details on flavours." |
| 405 | 405 | ||
| 406 | # check for restore circumstances, normally this is invoked by the restore command | 406 | # check for restore circumstances, normally this is invoked by the restore command |
| 407 | [ "${ezjail_fromarchive}" -a "${ezjail_exists}" ] && exerr "Error: Cannot restore a jail that exists." | 407 | [ "${ezjail_fromarchive}" -a "${ezjail_exists}" ] && exerr "Error: You can not restore an archive over an existing jail.\n '${ezjail_admin} delete -w ${ezjail_name}' the old version first." |
| 408 | [ "${ezjail_fromarchive}" -a "${ezjail_flavour}" ] && exerr "Error: Cannot apply flavours to a restored jail." | 408 | [ "${ezjail_fromarchive}" -a "${ezjail_flavour}" ] && exerr "Error: Cannot apply flavours to a jail being restored." |
| 409 | [ "${ezjail_fromarchive}" -a "${ezjail_fromarchive}" != "-" -a ! -r "${ezjail_fromarchive}" ] && exerr "Error: Cannot restore from non existing archive: ${ezjail_fromarchive}." | 409 | [ "${ezjail_fromarchive}" -a "${ezjail_fromarchive}" != "-" -a ! -r "${ezjail_fromarchive}" ] && exerr "Error: No archive found at ${ezjail_fromarchive}." |
| 410 | |||
| 411 | # Ensure existence of our control directory | ||
| 412 | mkdir -p "${ezjail_jailcfgs}" || exerr "Error: ezjail can not create its control directory ${ezjail_jailcfgs}." | ||
| 410 | 413 | ||
| 411 | # | 414 | # |
| 412 | # All sanity checks that may lead to errors are hopefully passed here | 415 | # All sanity checks that may lead to errors are hopefully passed here |
| @@ -415,7 +418,7 @@ create) | |||
| 415 | if [ "${ezjail_imagetype}" ]; then | 418 | if [ "${ezjail_imagetype}" ]; then |
| 416 | # Strip trailing slashes from jail root, those would confuse image path | 419 | # Strip trailing slashes from jail root, those would confuse image path |
| 417 | ezjail_image=${ezjail_rootdir%/}; while [ "${ezjail_image}" -a -z "${ezjail_image%%*/}" ]; do ezjail_image=${ezjail_image%/}; done | 420 | ezjail_image=${ezjail_rootdir%/}; while [ "${ezjail_image}" -a -z "${ezjail_image%%*/}" ]; do ezjail_image=${ezjail_image%/}; done |
| 418 | [ "${ezjail_image}" ] || exerr "Error: Could not determine image file name, something is wrong with the jail root: ${ezjail_rootdir}." | 421 | [ "${ezjail_image}" ] || exerr "Error: Could not determine image file name.\n Something is wrong with the jail root: ${ezjail_rootdir}." |
| 419 | 422 | ||
| 420 | # Location of our image file | 423 | # Location of our image file |
| 421 | ezjail_image="${ezjail_image}.img" | 424 | ezjail_image="${ezjail_image}.img" |
| @@ -426,23 +429,23 @@ create) | |||
| 426 | 429 | ||
| 427 | # If NOT exist, create image | 430 | # If NOT exist, create image |
| 428 | if [ -z "${ezjail_exists}" ]; then | 431 | if [ -z "${ezjail_exists}" ]; then |
| 429 | [ -e "${ezjail_image}" ] && exerr "Error: a file exists at the location ${ezjail_image}, preventing our own image file to be created." | 432 | [ -e "${ezjail_image}" ] && exerr "Error: A file exists at ${ezjail_image}.\n Won't overwrite an existing image." |
| 430 | 433 | ||
| 431 | # Now create jail disc image | 434 | # Now create jail disc image |
| 432 | touch "${ezjail_image}" | 435 | touch "${ezjail_image}" |
| 433 | echo "Creating jail image ${ezjail_image}. This may take a while." | 436 | echo "Creating jail image ${ezjail_image}. This may take a while." |
| 434 | if [ "${ezjail_imageblockcount}" -gt 0 ]; then | 437 | if [ "${ezjail_imageblockcount}" -gt 0 ]; then |
| 435 | dd if="${ezjail_sourcedevice}" of="${ezjail_image}" bs=1m count=${ezjail_imageblockcount} || exerr "Error: Could not (or not fully) create the image file. You might want to check (and possibly remove) the file ${ezjail_image}. The image size provided was ${ezjail_imagesize}." | 438 | dd if="${ezjail_sourcedevice}" of="${ezjail_image}" bs=1m count=${ezjail_imageblockcount} || exerr "Error: Could not (or not fully) create the image file.\n You might want to check (and possibly remove) the file ${ezjail_image}.\n The image size provided was ${ezjail_imagesize}." |
| 436 | fi | 439 | fi |
| 437 | if [ "${ezjail_imagerestbytes}" -gt 0 ]; then | 440 | if [ "${ezjail_imagerestbytes}" -gt 0 ]; then |
| 438 | ( dd if="${ezjail_sourcedevice}" bs=${ezjail_imagerestbytes} count=1 >> "${ezjail_image}" ) || exerr "Error: Could not (or not fully) create the image file. You might want to check (and possibly remove) the file ${ezjail_image}. The image size provided was ${ezjail_imagesize}." | 441 | ( dd if="${ezjail_sourcedevice}" bs=${ezjail_imagerestbytes} count=1 >> "${ezjail_image}" ) || exerr "Error: Could not (or not fully) create the image file.\n You might want to check (and possibly remove) the file ${ezjail_image}.\n The image size provided was ${ezjail_imagesize}." |
| 439 | fi | 442 | fi |
| 440 | 443 | ||
| 441 | # Attach device | 444 | # Attach device |
| 442 | ezjail_imagedevice=`mdconfig -a -t vnode -f "${ezjail_image}"` | 445 | ezjail_imagedevice=`mdconfig -a -t vnode -f "${ezjail_image}"` |
| 443 | ezjail_devicelink="${ezjail_rootdir}.device" | 446 | ezjail_devicelink="${ezjail_rootdir}.device" |
| 444 | 447 | ||
| 445 | [ $? -eq 0 ] || detach_images || exerr "Error: Could not attach image device. (Command failed was 'mdconfig -a -t vnode -f ${ezjail_image}')" | 448 | [ $? -eq 0 ] || detach_images || exerr "Error: Could not attach image device.\n Command failed was 'mdconfig -a -t vnode -f ${ezjail_image}'." |
| 446 | fi | 449 | fi |
| 447 | 450 | ||
| 448 | case ${ezjail_imagetype} in | 451 | case ${ezjail_imagetype} in |
| @@ -481,7 +484,10 @@ create) | |||
| 481 | mkdir -p "${ezjail_rootdir}" || detach_images || exerr "Error: Could not create jail root mount point ${ezjail_rootdir}." | 484 | mkdir -p "${ezjail_rootdir}" || detach_images || exerr "Error: Could not create jail root mount point ${ezjail_rootdir}." |
| 482 | mount "/dev/${ezjail_device}" "${ezjail_rootdir}" || detach_images || exerr "Error: Could not mount /dev/${ezjail_device} to ${ezjail_root}." | 485 | mount "/dev/${ezjail_device}" "${ezjail_rootdir}" || detach_images || exerr "Error: Could not mount /dev/${ezjail_device} to ${ezjail_root}." |
| 483 | else | 486 | else |
| 484 | [ -e "${ezjail_rootdir}" -a ! -d "${ezjail_rootdir}" ] && exerr "Error: Could not create mount point for your jail image. A file exists at its location. (For existing image jails, call this tool without the .img suffix when specifying jail root.)" | 487 | if [ -e "${ezjail_rootdir}" -a ! -d "${ezjail_rootdir}" ]; then |
| 488 | [ "${ezjail_rootdir%%*.img}" ] || exerr "Error: Could not create mount point for your jails image.\n A file exists at its location.\n Try '${ezjail_admin} create -x -r ${ezjail_rootdir%%.img} ${ezjail_name} ${ezjail_ip}' instead." | ||
| 489 | exerr "Error: Could not create mount point for your jails image.\n A file exists at its location." | ||
| 490 | fi | ||
| 485 | [ -d "${ezjail_rootdir}" ] || mkdir -p "${ezjail_rootdir}" | 491 | [ -d "${ezjail_rootdir}" ] || mkdir -p "${ezjail_rootdir}" |
| 486 | fi | 492 | fi |
| 487 | fi | 493 | fi |
| @@ -510,7 +516,6 @@ create) | |||
| 510 | 516 | ||
| 511 | # now, where everything seems to have gone right, create control file in | 517 | # now, where everything seems to have gone right, create control file in |
| 512 | # ezjails config dir | 518 | # ezjails config dir |
| 513 | mkdir -p "${ezjail_jailcfgs}" || exerr "Error: can't create ezjails control directory (${ezjail_jailcfgs})." | ||
| 514 | ( | 519 | ( |
| 515 | if [ "${ezjail_fromarchive_config}" ]; then | 520 | if [ "${ezjail_fromarchive_config}" ]; then |
| 516 | grep -E ^\# ${ezjail_fromarchive_config}; echo | 521 | grep -E ^\# ${ezjail_fromarchive_config}; echo |
| @@ -595,7 +600,7 @@ delete) | |||
| 595 | 600 | ||
| 596 | if [ "${ezjail_id}" ]; then | 601 | if [ "${ezjail_id}" ]; then |
| 597 | # if jail is still running, refuse to go any further | 602 | # if jail is still running, refuse to go any further |
| 598 | [ "${ezjail_forcestop}" ] || exerr "Error: Jail appears to be still running, stop it first (or use delete -f for force stop)." | 603 | [ "${ezjail_forcestop}" ] || exerr "Error: Jail appears to be still running.\n '${ezjail_admin} stop ${ezjail_name}' it first or use '${ezjail_admin} delete -f ${ezjail_name}' to force stop." |
| 599 | 604 | ||
| 600 | # This one will also exerr on failure | 605 | # This one will also exerr on failure |
| 601 | start_stop_jail_by_script stop | 606 | start_stop_jail_by_script stop |
| @@ -603,13 +608,13 @@ delete) | |||
| 603 | 608 | ||
| 604 | if [ "${ezjail_attached}" ]; then | 609 | if [ "${ezjail_attached}" ]; then |
| 605 | # if jail is attached and detach is not forced, refuse to go any further | 610 | # if jail is attached and detach is not forced, refuse to go any further |
| 606 | [ "${ezjail_forcestop}" ] || exerr "Error: Jail image file ${ezjail_image} is attached as ${ezjail_device}. '${ezjail_admin} config -i detach' it first, or (or use delete -f for force detach)." | 611 | [ "${ezjail_forcestop}" ] || exerr "Error: Jail image file ${ezjail_image} is attached as ${ezjail_device}.\n '${ezjail_admin} config -i detach ${ezjail_name}' it first, or use '${ezjail_admin} delete -f ${ezjail_name}' to force detach." |
| 607 | 612 | ||
| 608 | detach_images keep | 613 | detach_images keep |
| 609 | 614 | ||
| 610 | # See, if it successfully detached | 615 | # See, if it successfully detached |
| 611 | fetchjailinfo ${ezjail_name} | 616 | fetchjailinfo ${ezjail_name} |
| 612 | [ "${ezjail_attached}" ] && exerr "Error: Could not detach ${ezjail_name}. You need to detach it by hand." | 617 | [ "${ezjail_attached}" ] && exerr "Error: Could not detach ${ezjail_name}.\n You need to detach it by hand." |
| 613 | fi | 618 | fi |
| 614 | 619 | ||
| 615 | # now we know everything we need to let the jail be gone. remove entry | 620 | # now we know everything we need to let the jail be gone. remove entry |
| @@ -668,21 +673,21 @@ setup|update) | |||
| 668 | if [ "${ezjail_installaction}" = "none" ]; then | 673 | if [ "${ezjail_installaction}" = "none" ]; then |
| 669 | # check, whether ezjail has been setup correctly. existence of | 674 | # check, whether ezjail has been setup correctly. existence of |
| 670 | # ezjail_jailbase is our indicator | 675 | # ezjail_jailbase is our indicator |
| 671 | [ -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' or '${ezjail_admin} install' first." | 676 | [ -d "${ezjail_jailbase}" ] || exerr "Error: base jail does not exist.\n You cannot fill base jails ports tree before creating it.\n Please run '${ezjail_admin} update' or '${ezjail_admin} install' first." |
| 672 | else | 677 | else |
| 673 | # Bump the user for some of the most common errors | 678 | # Bump the user for some of the most common errors |
| 674 | [ -d "${ezjail_sourcetree}" ] || exerr "Cannot find your copy of the FreeBSD source tree in ${ezjail_sourcetree}." | 679 | [ -d "${ezjail_sourcetree}" ] || exerr "Error: Cannot find your copy of the FreeBSD source tree in ${ezjail_sourcetree}.\n Consider using '${ezjail_admin} install' to create the base jail from an ftp server." |
| 675 | [ -e "${ezjail_sourcetree}/Makefile" ] || exerr "Your source tree in ${ezjail_sourcetree} seems to be incomplete (Makefile missing)." | 680 | [ -e "${ezjail_sourcetree}/Makefile" ] || exerr "Error: Your source tree in ${ezjail_sourcetree} seems to be incomplete (Makefile is missing)." |
| 676 | [ "`sysctl -n kern.securelevel`" -gt 0 ] && exerr "You're running in a secure level higher than 0. ezjail will not run correctly." | 681 | [ "`sysctl -n kern.securelevel`" -gt 0 ] && exerr "Error: You are running in a secure level higher than 0.\n ${ezjail_admin} will not update correctly.\n Please reboot into a lower secure level." |
| 677 | 682 | ||
| 678 | # Normally fulljail should be renamed by past ezjail-admin commands. | 683 | # Normally fulljail should be renamed by past ezjail-admin commands. |
| 679 | # However those may have failed | 684 | # However those may have failed |
| 680 | [ -d "${ezjail_jailfull}" ] && chflags -R noschg "${ezjail_jailfull}" && rm -rf "${ezjail_jailfull}" | 685 | [ -d "${ezjail_jailfull}" ] && chflags -R noschg "${ezjail_jailfull}" && rm -rf "${ezjail_jailfull}" |
| 681 | mkdir -p "${ezjail_jailfull}" || exerr "Cannot create temporary Jail directory." | 686 | mkdir -p "${ezjail_jailfull}" || exerr "Error: Cannot create temporary Jail directory." |
| 682 | 687 | ||
| 683 | # make and setup our world, then split basejail and newjail | 688 | # make and setup our world, then split basejail and newjail |
| 684 | cd "${ezjail_sourcetree}" && env DESTDIR="${ezjail_jailfull}" make ${ezjail_installaction} || exerr "make ${ezjail_installaction} failed." | 689 | cd "${ezjail_sourcetree}" && env DESTDIR="${ezjail_jailfull}" make ${ezjail_installaction} || exerr "Error: The command 'make ${ezjail_installaction}' failed.\n Refer to the error report(s) above." |
| 685 | cd "${ezjail_sourcetree}/etc" && env DESTDIR="${ezjail_jailfull}" make distribution || exerr "make distribution failed." | 690 | cd "${ezjail_sourcetree}/etc" && env DESTDIR="${ezjail_jailfull}" make distribution || exerr "Error: The command 'make distribution' failed.\n Refer to the error report(s) above." |
| 686 | ezjail_splitworld | 691 | ezjail_splitworld |
| 687 | 692 | ||
| 688 | fi # installaction="none" | 693 | fi # installaction="none" |
| @@ -696,10 +701,13 @@ install) | |||
| 696 | # Clean variables, prevent polution | 701 | # Clean variables, prevent polution |
| 697 | unset ezjail_release ezjail_installmanpages ezjail_installports ezjail_installsources ezjail_dir ezjail_reldir ezjail_ftpserverqueried | 702 | unset ezjail_release ezjail_installmanpages ezjail_installports ezjail_installsources ezjail_dir ezjail_reldir ezjail_ftpserverqueried |
| 698 | 703 | ||
| 699 | shift; while getopts :mpsh:r: arg; do case ${arg} in | 704 | shift; while getopts :mMpPsSh:r: arg; do case ${arg} in |
| 700 | m) ezjail_installmanpages=" manpages";; | 705 | m) ezjail_installmanpages=" manpages";; |
| 706 | M) ezjail_installmanpages=" manpages"; unset ezjail_basesystem;; | ||
| 701 | s) ezjail_installsources=" src";; | 707 | s) ezjail_installsources=" src";; |
| 708 | S) ezjail_installsources=" src"; unset ezjail_basesystem;; | ||
| 702 | p) ezjail_installports="YES";; | 709 | p) ezjail_installports="YES";; |
| 710 | P) ezjail_installports="YES"; unset ezjail_basesystem;; | ||
| 703 | h) ezjail_ftphost=${OPTARG};; | 711 | h) ezjail_ftphost=${OPTARG};; |
| 704 | r) ezjail_release=${OPTARG};; | 712 | r) ezjail_release=${OPTARG};; |
| 705 | ?) exerr ${ezjail_usage_install};; | 713 | ?) exerr ${ezjail_usage_install};; |
| @@ -713,7 +721,10 @@ install) | |||
| 713 | ezjail_dir=${ezjail_ftphost#file://} | 721 | ezjail_dir=${ezjail_ftphost#file://} |
| 714 | [ "${ezjail_dir%%[!/]*}" ] || ezjail_reldir=`pwd -P` | 722 | [ "${ezjail_dir%%[!/]*}" ] || ezjail_reldir=`pwd -P` |
| 715 | 723 | ||
| 716 | [ "`sysctl -n kern.securelevel`" -gt 0 ] && exerr "You're running in a secure level higher than 0. ezjail will not run correctly." | 724 | [ "`sysctl -n kern.securelevel`" -gt 0 ] && exerr "Error: You are running in a secure level higher than 0.\n ${ezjail_admin} will not install correctly.\n Please reboot into a lower secure level." |
| 725 | |||
| 726 | # Check for basejail when not installing base jail | ||
| 727 | [ "${ezjail_basesystem}" -o -d "${ezjail_jailbase}" ] || exerr "Error: The basejail does not exist.\n You cannot install distribution packages before creating ezjails environment.\n Please run '${ezjail_admin} update' or '${ezjail_admin} install' using lower case parameters first." | ||
| 717 | 728 | ||
| 718 | # ftp servers normally wont provide non-RELEASE-builds | 729 | # ftp servers normally wont provide non-RELEASE-builds |
| 719 | if [ -z "${ezjail_release}" -a "${ezjail_dir}" = "${ezjail_ftphost}" ]; then | 730 | if [ -z "${ezjail_release}" -a "${ezjail_dir}" = "${ezjail_ftphost}" ]; then |
| @@ -731,7 +742,7 @@ install) | |||
| 731 | # Normally fulljail should be renamed by past ezjail-admin commands. | 742 | # Normally fulljail should be renamed by past ezjail-admin commands. |
| 732 | # However those may have failed | 743 | # However those may have failed |
| 733 | [ -d "${ezjail_jailfull}" ] && chflags -R noschg "${ezjail_jailfull}" && rm -rf "${ezjail_jailfull}" | 744 | [ -d "${ezjail_jailfull}" ] && chflags -R noschg "${ezjail_jailfull}" && rm -rf "${ezjail_jailfull}" |
| 734 | mkdir -p "${ezjail_jailfull}" || exerr "Cannot create temporary Jail directory." | 745 | mkdir -p "${ezjail_jailfull}" || exerr "Error: Cannot create temporary jail directory." |
| 735 | DESTDIR=${ezjail_jailfull} | 746 | DESTDIR=${ezjail_jailfull} |
| 736 | 747 | ||
| 737 | rm -rf "${ezjail_jailtemp}" | 748 | rm -rf "${ezjail_jailtemp}" |
| @@ -740,13 +751,13 @@ install) | |||
| 740 | # The first case means, that a remote host has been specified. | 751 | # The first case means, that a remote host has been specified. |
| 741 | if [ "${ezjail_dir}" = "${ezjail_ftphost}" ]; then | 752 | if [ "${ezjail_dir}" = "${ezjail_ftphost}" ]; then |
| 742 | # Create and try to access temp dir | 753 | # Create and try to access temp dir |
| 743 | mkdir -p "${ezjail_jailtemp}" || exerr "Could not create temporary base jail directory ${ezjail_jailtemp}." | 754 | mkdir -p "${ezjail_jailtemp}" || exerr "Error: Could not create temporary base jail directory ${ezjail_jailtemp}." |
| 744 | cd "${ezjail_jailtemp}" || exerr "Could not cd to ${ezjail_jailtemp}." | 755 | cd "${ezjail_jailtemp}" || exerr "Error: Could not cd to ${ezjail_jailtemp}." |
| 745 | 756 | ||
| 746 | # Try all paths as stolen from sysinstall, break on success. | 757 | # Try all paths as stolen from sysinstall, break on success. |
| 747 | for ezjail_path in pub/FreeBSD/releases pub/FreeBSD/snapshot pub/FreeBSD releases snapshots NO; do | 758 | for ezjail_path in pub/FreeBSD/releases pub/FreeBSD/snapshot pub/FreeBSD releases snapshots NO; do |
| 748 | if [ "${ezjail_path}" = "NO" ]; then | 759 | if [ "${ezjail_path}" = "NO" ]; then |
| 749 | echo -e "\nCould not fetch ${pkg} from ${ezjail_ftphost}.\nMaybe your release (${ezjail_release}) is specified incorrectly or the host ${ezjail_ftphost} does not provide that release build.\nUse the -r option to specify an existing release or the -h option to specify an alternative ftp server." >&2 | 760 | echo -e "\nCould not fetch ${pkg} from ${ezjail_ftphost}.\n Maybe your release (${ezjail_release}) is specified incorrectly or the host ${ezjail_ftphost} does not provide that release build.\n Use the -r option to specify an existing release or the -h option to specify an alternative ftp server." >&2 |
| 750 | [ "${ezjail_ftpserverqueried}" ] || ezjail_queryftpserver | 761 | [ "${ezjail_ftpserverqueried}" ] || ezjail_queryftpserver |
| 751 | exit 1 | 762 | exit 1 |
| 752 | fi | 763 | fi |
| @@ -759,19 +770,19 @@ install) | |||
| 759 | [ "${pkg}" = "base" ] && echo "Ignore the next question, ezjail answers it for you." | 770 | [ "${pkg}" = "base" ] && echo "Ignore the next question, ezjail answers it for you." |
| 760 | set -- all | 771 | set -- all |
| 761 | [ -f install.sh ] && yes | . install.sh | 772 | [ -f install.sh ] && yes | . install.sh |
| 762 | [ $? -eq 0 ] || exerr "Package install script for ${pkg} failed." | 773 | [ $? -eq 0 ] || exerr "Error: Package install script for ${pkg} failed." |
| 763 | 774 | ||
| 764 | rm -rf "${ezjail_jailtemp}" | 775 | rm -rf "${ezjail_jailtemp}" |
| 765 | else | 776 | else |
| 766 | cd "${ezjail_reldir}/${ezjail_dir}/${pkg}" || exerr "Could not cd to ${ezjail_dir}." | 777 | cd "${ezjail_reldir}/${ezjail_dir}/${pkg}" || exerr "Error: Could not cd to ${ezjail_dir}." |
| 767 | set -- all | 778 | set -- all |
| 768 | [ -f install.sh ] && yes | . install.sh | 779 | [ -f install.sh ] && yes | . install.sh |
| 769 | [ $? -eq 0 ] || exerr "Package install script for ${pkg} failed." | 780 | [ $? -eq 0 ] || exerr "Error: Package install script for ${pkg} failed." |
| 770 | fi | 781 | fi |
| 771 | done | 782 | done |
| 772 | 783 | ||
| 773 | # Split basejail and newjail | 784 | # Split basejail and newjail |
| 774 | ezjail_splitworld | 785 | [ "${ezjail_basesystem}" ] && ezjail_splitworld |
| 775 | 786 | ||
| 776 | # Fill ports, if requested | 787 | # Fill ports, if requested |
| 777 | [ "${ezjail_installports}" ] && ezjail_updateports | 788 | [ "${ezjail_installports}" ] && ezjail_updateports |
| @@ -782,7 +793,7 @@ install) | |||
| 782 | [ -x "${ezjail_prefix}/etc/rc.d/ezjail" ] && exec "${ezjail_prefix}/etc/rc.d/ezjail" $@ | 793 | [ -x "${ezjail_prefix}/etc/rc.d/ezjail" ] && exec "${ezjail_prefix}/etc/rc.d/ezjail" $@ |
| 783 | [ -x "${ezjail_prefix}/etc/rc.d/ezjail.sh" ] && exec "${ezjail_prefix}/etc/rc.d/ezjail.sh" $@ | 794 | [ -x "${ezjail_prefix}/etc/rc.d/ezjail.sh" ] && exec "${ezjail_prefix}/etc/rc.d/ezjail.sh" $@ |
| 784 | 795 | ||
| 785 | exerr "Could not find ezjail's rc.d script in ${ezjail_prefix}/etc/rc.d/. You need to type it the long way." | 796 | exerr "Error: Could not find ezjail's rc.d script in ${ezjail_prefix}/etc/rc.d/.\n You need to type it the long way." |
| 786 | ;; | 797 | ;; |
| 787 | ######################## ezjail-admin CONSOLE ######################## | 798 | ######################## ezjail-admin CONSOLE ######################## |
| 788 | console) | 799 | console) |
| @@ -808,7 +819,7 @@ console) | |||
| 808 | if [ -z "${ezjail_id}" ]; then | 819 | if [ -z "${ezjail_id}" ]; then |
| 809 | 820 | ||
| 810 | # If force start is requested, try that | 821 | # If force start is requested, try that |
| 811 | [ "$ezjail_forcestart}" ] || exerr "Error: Jail ${ezjail_name} appears not to be running, start it first (or use console -f for force start)." | 822 | [ "$ezjail_forcestart}" ] || exerr "Error: Jail ${ezjail_name} appears not to be running\n Start it first, or use '${ezjail_admin} console -f ${ezjail_name}' to force start." |
| 812 | 823 | ||
| 813 | # This one will also exerr on failure | 824 | # This one will also exerr on failure |
| 814 | start_stop_jail_by_script start | 825 | start_stop_jail_by_script start |
| @@ -839,13 +850,13 @@ archive) | |||
| 839 | ezjail_archivedir=${ezjail_archivedir:-`pwd -P`} | 850 | ezjail_archivedir=${ezjail_archivedir:-`pwd -P`} |
| 840 | 851 | ||
| 841 | # Will not backup more than one jail per archive | 852 | # Will not backup more than one jail per archive |
| 842 | [ "${ezjail_archive}" -a "${ezjail_archivealljails}" ] && exerr "Error: Must not specify an archive location for multiple archives." | 853 | [ "${ezjail_archive}" -a "${ezjail_archivealljails}" ] && exerr "Error: Must not specify an archive location for multiple archives.\n Can not archive multiple jails into one archive." |
| 843 | 854 | ||
| 844 | # Will not backup more than one jail per archive | 855 | # Will not backup more than one jail per archive |
| 845 | [ $# -gt 1 -a "${ezjail_archive}" ] && exerr "Error: Must not specify an archive location for multiple archives." | 856 | [ $# -gt 1 -a "${ezjail_archive}" ] && exerr "Error: Must not specify an archive location for multiple archives.\n Can not archive multiple jails into one archive." |
| 846 | 857 | ||
| 847 | # Either all or only some. Decide. | 858 | # Either all or only some. Decide. |
| 848 | [ $# -gt 0 -a "${ezjail_archivealljails}" ] && exerr "Error: Must not specify an ezjail to backup with -A." | 859 | [ $# -gt 0 -a "${ezjail_archivealljails}" ] && exerr "Error: Must not specify an ezjail to backup with -A.\n Please use either '${ezjail_admin} archive -A' or '${ezjail_admin} archive $*'." |
| 849 | 860 | ||
| 850 | # Fetch list of all ezjails | 861 | # Fetch list of all ezjails |
| 851 | [ "${ezjail_archivealljails}" -a -d "${ezjail_prefix}/etc/ezjail/" ] && cd "${ezjail_prefix}/etc/ezjail/" && set - `ls | xargs rcorder` | 862 | [ "${ezjail_archivealljails}" -a -d "${ezjail_prefix}/etc/ezjail/" ] && cd "${ezjail_prefix}/etc/ezjail/" && set - `ls | xargs rcorder` |
| @@ -861,7 +872,7 @@ archive) | |||
| 861 | 872 | ||
| 862 | # If jail is still running, refuse to go any further - unless forced | 873 | # If jail is still running, refuse to go any further - unless forced |
| 863 | if [ "${ezjail_id}" -a -z "${ezjail_force}" ]; then | 874 | if [ "${ezjail_id}" -a -z "${ezjail_force}" ]; then |
| 864 | echo "Warning: Jail ${ezjail_name} appears to be still running, stop it first or [-f]orce archiving." | 875 | echo "Warning: Jail ${ezjail_name} appears to be still running.\n Stop it first, or use '${ezjail_admin} -f ${ezjail_name}' to force archiving." |
| 865 | continue | 876 | continue |
| 866 | fi | 877 | fi |
| 867 | 878 | ||
| @@ -869,11 +880,11 @@ archive) | |||
| 869 | if [ "${ezjail_imagetype}" -a -z "${ezjail_attached}" ]; then | 880 | if [ "${ezjail_imagetype}" -a -z "${ezjail_attached}" ]; then |
| 870 | if [ "${ezjail_attachblocking}" ]; then | 881 | if [ "${ezjail_attachblocking}" ]; then |
| 871 | echo "Warning: Jail ${ezjail_name} is an image jail and can not be attached automatically." | 882 | echo "Warning: Jail ${ezjail_name} is an image jail and can not be attached automatically." |
| 872 | echo " Use ezjail-admin config -i attach ${ezjail_name} to attach it first." | 883 | echo " Use '${ezjail_admin} config -i attach ${ezjail_name}' to attach it first." |
| 873 | continue | 884 | continue |
| 874 | fi | 885 | fi |
| 875 | mount_images | 886 | mount_images |
| 876 | ezjail_imagesize=-`stat -Lf %z ${ezjail_image}` | 887 | ezjail_imagesize=-`stat -Lf %z "${ezjail_image}"` |
| 877 | fi | 888 | fi |
| 878 | 889 | ||
| 879 | # This one goes into archive to identify jail by name and restore date | 890 | # This one goes into archive to identify jail by name and restore date |
| @@ -905,7 +916,7 @@ archive) | |||
| 905 | 916 | ||
| 906 | [ -f "/etc/fstab.${ezjail_safename}" ] && ezjail_addfiles=/etc/fstab.${ezjail_safename} | 917 | [ -f "/etc/fstab.${ezjail_safename}" ] && ezjail_addfiles=/etc/fstab.${ezjail_safename} |
| 907 | 918 | ||
| 908 | cd "${ezjail_rootdir}" || exerr "Error: can't cd to ${ezjail_root}." | 919 | cd "${ezjail_rootdir}" || exerr "Error: Can't cd to ${ezjail_root}." |
| 909 | pax -wzXt -x ustar ${ezjail_archive_opt} \ | 920 | pax -wzXt -x ustar ${ezjail_archive_opt} \ |
| 910 | -s:"^[^\\.].*/${ezjail_safename}\$":prop.ezjail-${ezjail_archive_tag}: \ | 921 | -s:"^[^\\.].*/${ezjail_safename}\$":prop.ezjail-${ezjail_archive_tag}: \ |
| 911 | -s:"^[^\\.].*/${ezjail_safename}.norun\$":prop.ezjail-${ezjail_archive_tag}.norun: \ | 922 | -s:"^[^\\.].*/${ezjail_safename}.norun\$":prop.ezjail-${ezjail_archive_tag}.norun: \ |
| @@ -919,10 +930,10 @@ archive) | |||
| 919 | [ "${ezjail_imagesize}" ] && detach_images keep | 930 | [ "${ezjail_imagesize}" ] && detach_images keep |
| 920 | 931 | ||
| 921 | # An error on a jail not running is bad | 932 | # An error on a jail not running is bad |
| 922 | [ ${ezjail_paxresult} -eq 0 -o "${ezjail_force}" ] || exerr "Error: Archiving jail failed. You might want to check ${ezjail_archive}." | 933 | [ ${ezjail_paxresult} -eq 0 -o "${ezjail_force}" ] || exerr "Error: Archiving jail failed.\n You might want to check and remove ${ezjail_archive}." |
| 923 | 934 | ||
| 924 | # When archiving a running jail, some errors might occur | 935 | # When archiving a running jail, some errors might occur |
| 925 | [ ${ezjail_paxresult} -eq 0 ] || echo "Warning: Archiving jail ${ezjail_name} was not completely successful. For a running jail this is not unusual. You might want to check ${ezjail_archive}." | 936 | [ ${ezjail_paxresult} -eq 0 ] || echo "Warning: Archiving jail ${ezjail_name} was not completely successful. For a running jail this is not unusual." |
| 926 | 937 | ||
| 927 | unset ezjail_archive ezjail_archive_opt ezjail_addfiles | 938 | unset ezjail_archive ezjail_archive_opt ezjail_addfiles |
| 928 | done | 939 | done |
| @@ -947,7 +958,7 @@ restore) | |||
| 947 | unset ezjail_safename ezjail_imagedata ezjail_nameprop | 958 | unset ezjail_safename ezjail_imagedata ezjail_nameprop |
| 948 | 959 | ||
| 949 | # if archive location is absolute and doesn't exist, fail | 960 | # if archive location is absolute and doesn't exist, fail |
| 950 | [ "${ezjail_fromarchive%%[!/]*}" -a ! -f "${ezjail_fromarchive}" ] && exerr "Error: File for archive ${ezjail_fromarchive} not found." | 961 | [ "${ezjail_fromarchive%%[!/]*}" -a ! -f "${ezjail_fromarchive}" ] && exerr "Error: Archive ${ezjail_fromarchive} not found." |
| 951 | if [ -z "${ezjail_fromarchive%%[!/]*}" ]; then | 962 | if [ -z "${ezjail_fromarchive%%[!/]*}" ]; then |
| 952 | # Try archive location | 963 | # Try archive location |
| 953 | if [ -r "${ezjail_archivedir}/${ezjail_fromarchive}" ]; then | 964 | if [ -r "${ezjail_archivedir}/${ezjail_fromarchive}" ]; then |
| @@ -969,8 +980,8 @@ restore) | |||
| 969 | # | 980 | # |
| 970 | # However, this does not protect against admins transporting | 981 | # However, this does not protect against admins transporting |
| 971 | # archives over insecure lines over the net. | 982 | # archives over insecure lines over the net. |
| 972 | [ `stat -f %u "${ezjail_fromarchive}"` -eq 0 ] || exerr "Error: Insecure ownership of archive ${ezjail_fromarchive}. Please check the file and chown it to root if you trust its source." | 983 | [ `stat -f %u "${ezjail_fromarchive}"` -eq 0 ] || exerr "Error: Insecure ownership of archive ${ezjail_fromarchive}.\n Please check the file and chown it to root if you trust its source." |
| 973 | [ $(( `stat -f %OLp "${ezjail_fromarchive}"` & 0022 )) -eq 0 ] || exerr "Error: Insecure permissions for archive ${ezjail_fromarchive}. Please check the file and fix permission (chmod og-w) if you trust its source." | 984 | [ $(( `stat -f %OLp "${ezjail_fromarchive}"` & 0022 )) -eq 0 ] || exerr "Error: Insecure permissions for archive ${ezjail_fromarchive}.\n Please check the file and fix permission (chmod og-w) if you trust its source." |
| 974 | 985 | ||
| 975 | ezjail_nameprop=`pax -zn -f ${ezjail_fromarchive} prop.ezjail-\*` | 986 | ezjail_nameprop=`pax -zn -f ${ezjail_fromarchive} prop.ezjail-\*` |
| 976 | [ $? -eq 0 -a "${ezjail_nameprop}" ] || exerr "Error: File ${ezjail_fromarchive} is not an ezjail archive." | 987 | [ $? -eq 0 -a "${ezjail_nameprop}" ] || exerr "Error: File ${ezjail_fromarchive} is not an ezjail archive." |
| @@ -987,8 +998,8 @@ restore) | |||
| 987 | 998 | ||
| 988 | # Catch all errors that will likely create a broken backup | 999 | # Catch all errors that will likely create a broken backup |
| 989 | [ "${ezjail_safename}" -a "${ezjail_safename}" != "${ezjail_nameprop_safename}" ] && exerr "Error: Archive name ${ezjail_fromarchive} does not match archived jail ${ezjail_nameprop_safename}." | 1000 | [ "${ezjail_safename}" -a "${ezjail_safename}" != "${ezjail_nameprop_safename}" ] && exerr "Error: Archive name ${ezjail_fromarchive} does not match archived jail ${ezjail_nameprop_safename}." |
| 990 | [ "${ezjail_hsname}" != "${ezjail_nameprop_hsname}" -a -z "${ezjail_forcerestore}" ] && exerr "Error: Archive was created on host named ${ezjail_nameprop_hsname}. Consider using \"ezjail-admin create -a\" when migrating ezjails or -f to force restore." | 1001 | [ "${ezjail_hsname}" != "${ezjail_nameprop_hsname}" -a -z "${ezjail_forcerestore}" ] && exerr "Error: Archive was created on host named ${ezjail_nameprop_hsname}.\n Consider using '${ezjail_admin} create -a ${ezjail_fromarchive}' when migrating ezjails, or '${ezjail_admin} restore -f ${ezjail_fromarchive}' to force restore." |
| 991 | [ "${ezjail_hscpu}" != "${ezjail_nameprop_hscpu}" -a -z "${ezjail_forcerestore}" ] && exerr "Error: Archive was created on a different CPU. Can not restore. Consider using \"ezjail-admin create -a\" when migrating ezjails or -f to force restore." | 1002 | [ "${ezjail_hscpu}" != "${ezjail_nameprop_hscpu}" -a -z "${ezjail_forcerestore}" ] && exerr "Error: Archive was created on a different CPU. Can not restore.\n Consider using '${ezjail_admin} create -a ${ezjail_fromarchive}' when migrating ezjails, or '${ezjail_admin} restore -f ${ezjail_fromarchive}' to force restore." |
| 992 | 1003 | ||
| 993 | # Save config to tempfile and source it | 1004 | # Save config to tempfile and source it |
| 994 | ezjail_config=`mktemp /tmp/ezjail.prop.XXXXXXXX` | 1005 | ezjail_config=`mktemp /tmp/ezjail.prop.XXXXXXXX` |
| @@ -997,10 +1008,10 @@ restore) | |||
| 997 | fetchjailinfo ${ezjail_safename} ${ezjail_config} | 1008 | fetchjailinfo ${ezjail_safename} ${ezjail_config} |
| 998 | 1009 | ||
| 999 | # Now all parameters are here, invoke ezjail-admin create | 1010 | # Now all parameters are here, invoke ezjail-admin create |
| 1000 | [ "${ezjail_rootdir}" -a "${ezjail_ip}" -a "${ezjail_hostname}" ] || exerr "Error: Archive does not contain a valid ezjail properties file." | 1011 | [ "${ezjail_rootdir}" -a "${ezjail_ip}" -a "${ezjail_hostname}" ] || exerr "Error: Archive does not contain a valid ezjail properties file.\n Some jails properties are missing." |
| 1001 | [ "${ezjail_imagetype}" ] && ezjail_imagedata="-c ${ezjail_imagetype} -C '${ezjail_attachparams}' -s ${ezjail_nameprop_imgagesize}" | 1012 | [ "${ezjail_imagetype}" ] && ezjail_imagedata="-c ${ezjail_imagetype} -C '${ezjail_attachparams}' -s ${ezjail_nameprop_imgagesize}" |
| 1002 | 1013 | ||
| 1003 | $0 create -a "${ezjail_fromarchive}" -A "${ezjail_config}" ${ezjail_imagedata} -r "${ezjail_rootdir}" "${ezjail_hostname}" "${ezjail_ip}" || exerr "Error: create failed." | 1014 | $0 create -a "${ezjail_fromarchive}" -A "${ezjail_config}" ${ezjail_imagedata} -r "${ezjail_rootdir}" "${ezjail_hostname}" "${ezjail_ip}" || exerr "Error: Create failed." |
| 1004 | rm -f "${ezjail_config}" | 1015 | rm -f "${ezjail_config}" |
| 1005 | 1016 | ||
| 1006 | done | 1017 | done |
| @@ -1031,10 +1042,10 @@ config) | |||
| 1031 | # Do we want a new name for our jail? | 1042 | # Do we want a new name for our jail? |
| 1032 | if [ "${ezjail_new_name}" ]; then | 1043 | if [ "${ezjail_new_name}" ]; then |
| 1033 | # if jail is still running, refuse to go any further | 1044 | # if jail is still running, refuse to go any further |
| 1034 | [ "${ezjail_id}" ] && exerr "Error: Jail appears to be still running, stop it first." | 1045 | [ "${ezjail_id}" ] && exerr "Error: Jail appears to be still running.\n '${ezjail_admin} stop ${ezjail_name}' it first ." |
| 1035 | 1046 | ||
| 1036 | # Cannot rename an attached jail | 1047 | # Cannot rename an attached jail |
| 1037 | [ "${ezjail_attached}" ] && exerr "Error: Jail image file ${ezjail_image} is attached as ${ezjail_device}. '${ezjail_admin} config -i detach' it first." | 1048 | [ "${ezjail_attached}" ] && exerr "Error: Jail image file ${ezjail_image} is attached as ${ezjail_device}.\n '${ezjail_admin} config -i detach ${ezjail_name}' it first." |
| 1038 | 1049 | ||
| 1039 | # The new values for the jail | 1050 | # The new values for the jail |
| 1040 | ezjail_new_hostname=`echo -n ${ezjail_new_name} | tr '/~' '__'` | 1051 | ezjail_new_hostname=`echo -n ${ezjail_new_name} | tr '/~' '__'` |
| @@ -1060,11 +1071,11 @@ config) | |||
| 1060 | # This scenario really will only lead to real troubles in the 'fulljail' | 1071 | # This scenario really will only lead to real troubles in the 'fulljail' |
| 1061 | # case, but I should still explain this to the user and not claim that | 1072 | # case, but I should still explain this to the user and not claim that |
| 1062 | # "an ezjail would already exist" | 1073 | # "an ezjail would already exist" |
| 1063 | case ${ezjail_new_hostname} in basejail|newjail|fulljail|flavours|ezjailtemp) exerr "Error: ezjail needs the ${ezjail_new_hostname} directory for its own administrative purposes. Please rename the ezjail.";; esac | 1074 | case ${ezjail_new_hostname} in basejail|newjail|fulljail|flavours|ezjailtemp) exerr "Error: ezjail needs the ${ezjail_new_hostname} directory for its own administrative purposes.\n Please chose another name.";; esac |
| 1064 | 1075 | ||
| 1065 | # jail names may lead to identical configs, eg. foo.bar.com == foo-bar.com | 1076 | # jail names may lead to identical configs, eg. foo.bar.com == foo-bar.com |
| 1066 | # so check, whether we might be running into problems | 1077 | # so check, whether we might be running into problems |
| 1067 | [ -e "${ezjail_new_config}" -o -e "${ezjail_new_config}.norun" ] && exerr "Error: an ezjail config already exists at ${ezjail_new_config}. Please rename the ezjail." | 1078 | [ -e "${ezjail_new_config}" -o -e "${ezjail_new_config}.norun" ] && exerr "Error: An ezjail config already exists at ${ezjail_new_config}.\n Please chose another name." |
| 1068 | 1079 | ||
| 1069 | # since we just used the old rootdir prefix and added the new hostname, | 1080 | # since we just used the old rootdir prefix and added the new hostname, |
| 1070 | # we might end up at an existing directory | 1081 | # we might end up at an existing directory |
| @@ -1153,7 +1164,7 @@ config) | |||
| 1153 | ;; | 1164 | ;; |
| 1154 | detach) | 1165 | detach) |
| 1155 | # Check, if image really attached or running | 1166 | # Check, if image really attached or running |
| 1156 | [ "${ezjail_id}" ] && exerr "Error: Jail ${ezjail_name} still running. Can not detach." | 1167 | [ "${ezjail_id}" ] && exerr "Error: Jail ${ezjail_name} still running\n Can not detach.\n '${ezjail_admin} stop ${ezjail_name}' it first." |
| 1157 | [ "${ezjail_attached}" ] || exerr "Error: Jail image file ${ezjail_name} is not attached." | 1168 | [ "${ezjail_attached}" ] || exerr "Error: Jail image file ${ezjail_name} is not attached." |
| 1158 | 1169 | ||
| 1159 | # Unmount/detach everything | 1170 | # Unmount/detach everything |
diff --git a/man1/ezjail-admin.1 b/man1/ezjail-admin.1 index 8cba99d..02b5ee1 100755 --- a/man1/ezjail-admin.1 +++ b/man1/ezjail-admin.1 | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | ezjail-admin \- Administrate ezjail | 3 | ezjail-admin \- Administrate ezjail |
| 4 | .SH SYNOPSIS | 4 | .SH SYNOPSIS |
| 5 | .T | 5 | .T |
| 6 | .B ezjail-admin install\fR [-mps] [-h host] [-r release] | 6 | .B ezjail-admin install\fR [-mMpPsS] [-h host] [-r release] |
| 7 | 7 | ||
| 8 | .T | 8 | .T |
| 9 | .B ezjail-admin create | 9 | .B ezjail-admin create |
| @@ -48,6 +48,8 @@ is around 120MB). | |||
| 48 | The -m and -s option will fetch and install man pages (ca. 10MB) and | 48 | The -m and -s option will fetch and install man pages (ca. 10MB) and |
| 49 | sources packages (ca. 450MB) respectively. The -p option invokes the | 49 | sources packages (ca. 450MB) respectively. The -p option invokes the |
| 50 | portsnap utility to fetch and extract a FreeBSD ports tree (ca. 475MB). | 50 | portsnap utility to fetch and extract a FreeBSD ports tree (ca. 475MB). |
| 51 | Parameters -M, -P or -S behave like their lower case pendants, plus they | ||
| 52 | disable (re)installing your basejail. | ||
| 51 | 53 | ||
| 52 | Default OS version is, whatever uname -r returns. If this does not match | 54 | Default OS version is, whatever uname -r returns. If this does not match |
| 53 | "*-RELEASE", you will be prompted for a better guess. (Normally | 55 | "*-RELEASE", you will be prompted for a better guess. (Normally |
