diff options
| -rwxr-xr-x | ezjail-admin | 70 |
1 files changed, 53 insertions, 17 deletions
diff --git a/ezjail-admin b/ezjail-admin index b5715c1..5b314ff 100755 --- a/ezjail-admin +++ b/ezjail-admin | |||
| @@ -85,6 +85,9 @@ attach_images () { | |||
| 85 | 85 | ||
| 86 | # define detach strategy for image jails | 86 | # define detach strategy for image jails |
| 87 | detach_images () { | 87 | detach_images () { |
| 88 | # Avoid ending up inside mount point | ||
| 89 | cd / | ||
| 90 | |||
| 88 | # unmount and detach memory disc | 91 | # unmount and detach memory disc |
| 89 | if [ "${ezjail_imagedevice}" ]; then | 92 | if [ "${ezjail_imagedevice}" ]; then |
| 90 | umount "${ezjail_rootdir}" > /dev/null 2> /dev/null | 93 | umount "${ezjail_rootdir}" > /dev/null 2> /dev/null |
| @@ -131,8 +134,12 @@ fetchjailinfo () { | |||
| 131 | 134 | ||
| 132 | ezjail_safename=`echo -n "${ezjail_name}" | tr -c '[:alnum:]' _` | 135 | ezjail_safename=`echo -n "${ezjail_name}" | tr -c '[:alnum:]' _` |
| 133 | 136 | ||
| 134 | [ -e "${ezjail_jailcfgs}/${ezjail_safename}" ] && ezjail_config="${ezjail_jailcfgs}/${ezjail_safename}" | 137 | if [ -z "$2" ]; then |
| 135 | [ -e "${ezjail_jailcfgs}/${ezjail_safename}.norun" ] && ezjail_config="${ezjail_jailcfgs}/${ezjail_safename}.norun" | 138 | [ -e "${ezjail_jailcfgs}/${ezjail_safename}" ] && ezjail_config="${ezjail_jailcfgs}/${ezjail_safename}" |
| 139 | [ -e "${ezjail_jailcfgs}/${ezjail_safename}.norun" ] && ezjail_config="${ezjail_jailcfgs}/${ezjail_safename}.norun" | ||
| 140 | else | ||
| 141 | ezjail_config=$2 | ||
| 142 | fi | ||
| 136 | [ "${ezjail_config}" ] || return 0 | 143 | [ "${ezjail_config}" ] || return 0 |
| 137 | 144 | ||
| 138 | . "${ezjail_config}" | 145 | . "${ezjail_config}" |
| @@ -160,8 +167,8 @@ fetchjailinfo () { | |||
| 160 | *) ezjail_imagedevice=${ezjail_device_geom} ;; | 167 | *) ezjail_imagedevice=${ezjail_device_geom} ;; |
| 161 | esac | 168 | esac |
| 162 | 169 | ||
| 163 | mount -p -v | grep -q -E "^${ezjail_devicelink}.${ezjail_rootdir}" && ezjail_attached="YES" | 170 | mount -p -v | grep -q -E "^${ezjail_devicelink}[[:space:]]+${ezjail_rootdir}" && ezjail_attached="YES" |
| 164 | mount -p -v | grep -q -E "^${ezjail_device}.${ezjail_rootdir}" && ezjail_attached="YES" | 171 | mount -p -v | grep -q -E "^${ezjail_device}[[:space:]]+${ezjail_rootdir}" && ezjail_attached="YES" |
| 165 | 172 | ||
| 166 | # Stale device link detected. Remove and clean. | 173 | # Stale device link detected. Remove and clean. |
| 167 | [ -z "${ezjail_attached}" ] && unset ezjail_device && rm -f "${ezjail_devicelink}" | 174 | [ -z "${ezjail_attached}" ] && unset ezjail_device && rm -f "${ezjail_devicelink}" |
| @@ -303,11 +310,12 @@ case "$1" in | |||
| 303 | create) | 310 | create) |
| 304 | # Clean variables, prevent polution | 311 | # Clean variables, prevent polution |
| 305 | unset ezjail_rootdir ezjail_flavour ezjail_softlink ezjail_image ezjail_imagetype ezjail_imageparams ezjail_imagesize ezjail_device ezjail_devicelink ezjail_config ezjail_attachparams ezjail_exists ezjail_attachblocking ezjail_forceblocking ezjail_sourcedevice ezjail_rootdirempty ezjail_fromarchive | 312 | unset ezjail_rootdir ezjail_flavour ezjail_softlink ezjail_image ezjail_imagetype ezjail_imageparams ezjail_imagesize ezjail_device ezjail_devicelink ezjail_config ezjail_attachparams ezjail_exists ezjail_attachblocking ezjail_forceblocking ezjail_sourcedevice ezjail_rootdirempty ezjail_fromarchive |
| 306 | shift; while getopts :f:r:s:xbic:C:a: arg; do case ${arg} in | 313 | shift; while getopts :f:r:s:xbic:C:a:A: arg; do case ${arg} in |
| 307 | x) ezjail_exists="YES";; | 314 | x) ezjail_exists="YES";; |
| 308 | r) ezjail_rootdir=${OPTARG};; | 315 | r) ezjail_rootdir=${OPTARG};; |
| 309 | f) ezjail_flavour=${OPTARG};; | 316 | f) ezjail_flavour=${OPTARG};; |
| 310 | a) ezjail_fromarchive=${OPTARG};; | 317 | a) ezjail_fromarchive=${OPTARG};; |
| 318 | A) ezjail_fromarchive_config=${OPTARG};; | ||
| 311 | c) ezjail_imagetype=${OPTARG};; | 319 | c) ezjail_imagetype=${OPTARG};; |
| 312 | C) ezjail_imageparams=${OPTARG};; | 320 | C) ezjail_imageparams=${OPTARG};; |
| 313 | b) ezjail_forceblocking="YES";; | 321 | b) ezjail_forceblocking="YES";; |
| @@ -823,6 +831,8 @@ archive) | |||
| 823 | [ "${ezjail_archivealljails}" -a -d "${ezjail_prefix}/etc/ezjail/" ] && cd "${ezjail_prefix}/etc/ezjail/" && set - `ls | xargs rcorder` | 831 | [ "${ezjail_archivealljails}" -a -d "${ezjail_prefix}/etc/ezjail/" ] && cd "${ezjail_prefix}/etc/ezjail/" && set - `ls | xargs rcorder` |
| 824 | 832 | ||
| 825 | for ezjail in $@; do | 833 | for ezjail in $@; do |
| 834 | unset ezjail_imagesize | ||
| 835 | |||
| 826 | # Jail name mandatory | 836 | # Jail name mandatory |
| 827 | fetchjailinfo ${ezjail%.norun} | 837 | fetchjailinfo ${ezjail%.norun} |
| 828 | 838 | ||
| @@ -830,7 +840,21 @@ archive) | |||
| 830 | [ "${ezjail_config}" ] || exerr "Error: Nothing known about jail ${ezjail_name}." | 840 | [ "${ezjail_config}" ] || exerr "Error: Nothing known about jail ${ezjail_name}." |
| 831 | 841 | ||
| 832 | # If jail is still running, refuse to go any further - unless forced | 842 | # If jail is still running, refuse to go any further - unless forced |
| 833 | [ "${ezjail_id}" -a -z "${ezjail_force}" ] && exerr "Error: Jail appears to be still running, stop it first or [-f]orce archiving." | 843 | if [ "${ezjail_id}" -a -z "${ezjail_force}" ]; then |
| 844 | echo "Warning: Jail ${ezjail_name} appears to be still running, stop it first or [-f]orce archiving." | ||
| 845 | continue | ||
| 846 | fi | ||
| 847 | |||
| 848 | # Attach non-attached jails, if they can be attached non blocking | ||
| 849 | if [ "${ezjail_imagetype}" -a -z "${ezjail_attached}" ]; then | ||
| 850 | if [ "${ezjail_attachblocking}" ]; then | ||
| 851 | echo "Warning: Jail ${ezjail_name} is an image jail and can not be attached automatically." | ||
| 852 | echo " Use ezjail-admin config -i attach ${ezjail_name} to attach it first." | ||
| 853 | continue | ||
| 854 | fi | ||
| 855 | $0 config -i attach ${ezjail_name} || exerr "Error: Can not attach ${ezjail_image} for ${ezjail_name}" | ||
| 856 | ezjail_imagesize=-`stat -f %z ${ezjail_image}` | ||
| 857 | fi | ||
| 834 | 858 | ||
| 835 | # This one goes into archive to identify jail by name and restore date | 859 | # This one goes into archive to identify jail by name and restore date |
| 836 | ezjail_archive_tag="${ezjail_safename}-`date +%Y%m%d%H%M.%S`" | 860 | ezjail_archive_tag="${ezjail_safename}-`date +%Y%m%d%H%M.%S`" |
| @@ -845,12 +869,11 @@ archive) | |||
| 845 | ezjail_hostsystem_version=$( echo -n `uname -r` | tr -c '[:alnum:].' _ ) | 869 | ezjail_hostsystem_version=$( echo -n `uname -r` | tr -c '[:alnum:].' _ ) |
| 846 | ezjail_hostsystem_cpu=$( echo -n `uname -p` | tr -c '[:alnum:].' _ ) | 870 | ezjail_hostsystem_cpu=$( echo -n `uname -p` | tr -c '[:alnum:].' _ ) |
| 847 | 871 | ||
| 848 | ezjail_archive_tag="${ezjail_archive_tag}-${ezjail_hostsystem_name}-${ezjail_hostsystem_version}-${ezjail_hostsystem_cpu}" | 872 | ezjail_archive_tag="${ezjail_archive_tag}-${ezjail_hostsystem_name}-${ezjail_hostsystem_version}-${ezjail_hostsystem_cpu}${ezjail_imagesize}" |
| 849 | echo $ezjail_archive_tag | ||
| 850 | 873 | ||
| 851 | # If archive location is not absolute, prepend archive directory | 874 | # If archive location is not absolute, prepend archive directory |
| 852 | ezjail_makeabsolute ezjail_archive ${ezjail_archivedir} | 875 | ezjail_makeabsolute ezjail_archive ${ezjail_archivedir} |
| 853 | echo ${ezjail_archive} | 876 | |
| 854 | # It's a tar archive, after all | 877 | # It's a tar archive, after all |
| 855 | case ${ezjail_archive} in | 878 | case ${ezjail_archive} in |
| 856 | *.tar.gz|*.tgz|-) ;; | 879 | *.tar.gz|*.tgz|-) ;; |
| @@ -870,11 +893,16 @@ echo ${ezjail_archive} | |||
| 870 | -s:"^\\.":ezjail: \ | 893 | -s:"^\\.":ezjail: \ |
| 871 | "${ezjail_config}" ${ezjail_addfiles} . | 894 | "${ezjail_config}" ${ezjail_addfiles} . |
| 872 | 895 | ||
| 896 | ezjail_paxresult=$? | ||
| 897 | |||
| 898 | # Detach previously attached jail | ||
| 899 | [ "${ezjail_imagesize}" ] && cd / && $0 config -i detach ${ezjail_name} | ||
| 900 | |||
| 873 | # An error on a jail not running is bad | 901 | # An error on a jail not running is bad |
| 874 | [ $? -eq 0 -o "${ezjail_force}" ] || exerr "Error: Archiving jail failed. You might want to check ${ezjail_archive}." | 902 | [ ${ezjail_paxresult} -eq 0 -o "${ezjail_force}" ] || exerr "Error: Archiving jail failed. You might want to check ${ezjail_archive}." |
| 875 | 903 | ||
| 876 | # When archiving a running jail, some errors might occur | 904 | # When archiving a running jail, some errors might occur |
| 877 | [ $? -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}." | 905 | [ ${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}." |
| 878 | 906 | ||
| 879 | unset ezjail_archive ezjail_archive_opt ezjail_addfiles | 907 | unset ezjail_archive ezjail_archive_opt ezjail_addfiles |
| 880 | done | 908 | done |
| @@ -895,7 +923,7 @@ restore) | |||
| 895 | ezjail_archivedir=${ezjail_archivedir:-`pwd -P`} | 923 | ezjail_archivedir=${ezjail_archivedir:-`pwd -P`} |
| 896 | 924 | ||
| 897 | for ezjail_fromarchive in $@; do | 925 | for ezjail_fromarchive in $@; do |
| 898 | unset ezjail_safename | 926 | unset ezjail_safename ezjail_imagedata ezjail_nameprop |
| 899 | 927 | ||
| 900 | # if archive location is absolute and doesn't exist, fail | 928 | # if archive location is absolute and doesn't exist, fail |
| 901 | [ "${ezjail_fromarchive%%[!/]*}" -a ! -f "${ezjail_fromarchive}" ] && exerr "Error: File for archive ${ezjail_fromarchive} not found." | 929 | [ "${ezjail_fromarchive%%[!/]*}" -a ! -f "${ezjail_fromarchive}" ] && exerr "Error: File for archive ${ezjail_fromarchive} not found." |
| @@ -928,7 +956,7 @@ restore) | |||
| 928 | 956 | ||
| 929 | # Figure out, what jail and jail enviroment archive claims to contain | 957 | # Figure out, what jail and jail enviroment archive claims to contain |
| 930 | TIFS=${IFS}; IFS=-; set - ${ezjail_nameprop} | 958 | TIFS=${IFS}; IFS=-; set - ${ezjail_nameprop} |
| 931 | ezjail_nameprop_safename=$2 ezjail_nameprop_hsname=$4 ezjail_nameprop_hsversion=$5 ezjail_nameprop_hscpu=$6 | 959 | ezjail_nameprop_safename=$2 ezjail_nameprop_hsname=$4 ezjail_nameprop_hsversion=$5 ezjail_nameprop_hscpu=$6 ezjail_nameporp_imgagesize=$7 |
| 932 | IFS=${TIFS} | 960 | IFS=${TIFS} |
| 933 | 961 | ||
| 934 | # Figure out current system environment | 962 | # Figure out current system environment |
| @@ -942,11 +970,19 @@ restore) | |||
| 942 | [ "${ezjail_hscpu}" != "${ezjail_nameprop_hscpu}" ] && exerr "Error: Archive was created on a different CPU. Can not restore. Consider using \"ezjail-admin create -a\" when migrating ezjails." | 970 | [ "${ezjail_hscpu}" != "${ezjail_nameprop_hscpu}" ] && exerr "Error: Archive was created on a different CPU. Can not restore. Consider using \"ezjail-admin create -a\" when migrating ezjails." |
| 943 | 971 | ||
| 944 | # Save config to tempfile and source it | 972 | # Save config to tempfile and source it |
| 945 | ezjail_tmpfile=`mktemp /tmp/ezjail.prop.XXXXXXXX` | 973 | ezjail_config=`mktemp /tmp/ezjail.prop.XXXXXXXX` |
| 946 | [ $? -ne 0 ] && exerr "Error: Can't create temporary file." | 974 | [ $? -ne 0 ] && exerr "Error: Can't create temporary file." |
| 947 | pax -rzn -s:${ezjail_nameprop}:${ezjail_tmpfile}: -f ${ezjail_fromarchive} ${ezjail_nameprop} | 975 | pax -rzn -s:${ezjail_nameprop}:${ezjail_config}: -f ${ezjail_fromarchive} ${ezjail_nameprop} |
| 948 | . "${ezjail_tmpfile}" | 976 | fetchjailinfo ${ezjail_safename} ${ezjail_config} |
| 949 | rm -f "${ezjail_tmpfile}" | 977 | |
| 978 | # Now all parameters are here, invoke ezjail-admin create | ||
| 979 | if [ "${ezjail_imagetype}" ]; then | ||
| 980 | ezjail_imagedata="-c ${ezjail_imagetype} -C '${ezjail_attachparams}' -s ${ezjail_nameporp_imgagesize}" | ||
| 981 | fi | ||
| 982 | |||
| 983 | echo $0 create -a "${ezjail_fromarchive}" -A "${ezjail_config}" ${ezjail_imagedata} -r "${ezjail_rootdir}" "${ezjail_hostname}" "${ezjail_ip}" | ||
| 984 | $0 create -a "${ezjail_fromarchive}" -A "${ezjail_config}" ${ezjail_imagedata} -r "${ezjail_rootdir}" "${ezjail_hostname}" "${ezjail_ip}" || exerr "Error: create failed." | ||
| 985 | rm -f "${ezjail_config}" | ||
| 950 | 986 | ||
| 951 | done | 987 | done |
| 952 | ;; | 988 | ;; |
