diff options
author | erdgeist <erdgeist@erdgeist.org> | 2008-07-07 04:29:32 +0000 |
---|---|---|
committer | erdgeist <erdgeist@erdgeist.org> | 2008-07-07 04:29:32 +0000 |
commit | 7d9d19af7fb5b140e15315a6bfca38b573818baf (patch) | |
tree | 9570d322d18cc048024162aebbc1b023df465192 /ezjail-admin | |
parent | 518ef661e17b170431d19fcc4d2b4fa02095a156 (diff) |
Fix a problem where we can not detach a jail after its creation, because we're still inside its root directory.
Also put image size for image jails into the properties list.
Auto attach image jails for archive (if possible, aka non-blocking).
Actually call ezjail-admin create from ezjail-admin restore.
This means, that restore is rudimentary up and running.
Diffstat (limited to 'ezjail-admin')
-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 | ;; |