diff options
| -rwxr-xr-x | ezjail.sh | 95 |
1 files changed, 86 insertions, 9 deletions
| @@ -14,7 +14,8 @@ | |||
| 14 | # Please do not change this file, configure in EZJAIL_PREFIX/etc/ezjail.conf | 14 | # Please do not change this file, configure in EZJAIL_PREFIX/etc/ezjail.conf |
| 15 | 15 | ||
| 16 | # ugly: this variable is set on port install time | 16 | # ugly: this variable is set on port install time |
| 17 | ezjail_prefix=EZJAIL_PREFIX | 17 | #ezjail_prefix=EZJAIL_PREFIX |
| 18 | ezjail_prefix=/usr/local | ||
| 18 | 19 | ||
| 19 | . /etc/rc.subr | 20 | . /etc/rc.subr |
| 20 | 21 | ||
| @@ -32,18 +33,94 @@ do_cmd() | |||
| 32 | { | 33 | { |
| 33 | action=$1; message=$2; shift 2; | 34 | action=$1; message=$2; shift 2; |
| 34 | ezjail_list= | 35 | ezjail_list= |
| 35 | [ -n "$*" ] && ezjail_list=`echo -n $* | tr -c "[:alnum:] " _` || echo -n "${message##_}" | ||
| 36 | ezjail_list=${ezjail_list:-`ls ${ezjail_prefix}/etc/ezjail/`} | ||
| 37 | ezjail_pass= | 36 | ezjail_pass= |
| 37 | ezjail_mds= | ||
| 38 | ezjail_fromrc="YES" | ||
| 39 | |||
| 40 | # If a jail list is given on command line, process it | ||
| 41 | # If not, fetch it from our config directory | ||
| 42 | if [ -n "$*" ]; then | ||
| 43 | ezjail_list=`echo -n $* | tr -c "[:alnum:] " _` | ||
| 44 | ezjail_fromrc="NO" | ||
| 45 | else | ||
| 46 | ezjail_list=${ezjail_list:-`ls ${ezjail_prefix}/etc/ezjail/`} | ||
| 47 | echo -n "${message##_}" | ||
| 48 | fi | ||
| 49 | |||
| 38 | for ezjail in ${ezjail_list}; do | 50 | for ezjail in ${ezjail_list}; do |
| 39 | if [ -f ${ezjail_prefix}/etc/ezjail/${ezjail} ]; then | 51 | # If jail is temporary disabled (dot in name), skip it |
| 40 | . ${ezjail_prefix}/etc/ezjail/${ezjail} | 52 | [ ${ezjail%.*} = ${ezjail} ] || continue |
| 41 | ezjail_pass="${ezjail_pass} ${ezjail}" | 53 | |
| 42 | else | 54 | # Check for jails config |
| 43 | echo " Warning: Jail ${ezjail} not found." | 55 | [ ! -r ${ezjail_prefix}/etc/ezjail/${ezjail} ] && echo " Warning: Jail ${ezjail} not found." && continue |
| 44 | fi | 56 | |
| 57 | # Read config file | ||
| 58 | . ${ezjail_prefix}/etc/ezjail/${ezjail} | ||
| 59 | |||
| 60 | eval ezjail_root=\"\$jail_${ezjail}_rootdir\" | ||
| 61 | eval ezjail_image=\"\$jail_${ezjail}_image\" | ||
| 62 | eval ezjail_crypt=\"\$jail_${ezjail}_cryptimage\" | ||
| 63 | |||
| 64 | # Cannot auto mount crypto jails without interrupting boot process | ||
| 65 | [ "${ezjail_fromrc}" = "YES" -a "${ezjail_crypt}" = "YES" ] && continue | ||
| 66 | |||
| 67 | # Try to attach (crypto) devices | ||
| 68 | [ "${ezjail_image}" ] && attach_detach_pre | ||
| 69 | |||
| 70 | ezjail_pass="${ezjail_pass} ${ezjail}" | ||
| 45 | done | 71 | done |
| 72 | |||
| 73 | # Pass control to jail script which does the actual work | ||
| 46 | [ "${ezjail_pass}" ] && sh /etc/rc.d/jail one${action} ${ezjail_pass} | 74 | [ "${ezjail_pass}" ] && sh /etc/rc.d/jail one${action} ${ezjail_pass} |
| 75 | |||
| 76 | # Can only detach after unmounting (from fstab.JAILNAME in /etc/rc.d/jail) | ||
| 77 | attach_detach_post | ||
| 78 | } | ||
| 79 | |||
| 80 | attach_detach_pre () | ||
| 81 | { | ||
| 82 | if [ "${action}" = start ]; then | ||
| 83 | # If jail is running, do not mount devices, this is the same check as | ||
| 84 | # /etc/rc.d/jail does | ||
| 85 | [ -e /var/run/jail_${ezjail}.id ] && return | ||
| 86 | |||
| 87 | # Create a memory disc from jail image | ||
| 88 | ezjail_device=`mdconfig -a -t vnode -f ${ezjail_image}` | ||
| 89 | |||
| 90 | # If this is a crypto jail, try to mount it, remind user, which jail | ||
| 91 | # this is. In this case, the device to mount is | ||
| 92 | if [ "${ezjail_crypt}" = "YES" ]; then | ||
| 93 | echo "Attaching gbde device for image jail ${ezjail}..." | ||
| 94 | gbde attach /dev/${ezjail_device} -l ${ezjail_image%.img}.lock | ||
| 95 | |||
| 96 | # Device to mount is not md anymore | ||
| 97 | ezjail_device=${ezjail_device}.bde | ||
| 98 | fi | ||
| 99 | |||
| 100 | # relink image device | ||
| 101 | rm -f ${ezjail_root}.device | ||
| 102 | ln -s /dev/${ezjail_device} ${ezjail_root}.device | ||
| 103 | else | ||
| 104 | # If soft link to device is not set, we cannot unmount | ||
| 105 | [ -e ${ezjail_root}.device ] || return | ||
| 106 | |||
| 107 | # Fetch destination of soft link | ||
| 108 | ezjail_device=`stat -f "%Y" ${ezjail_root}.device` | ||
| 109 | |||
| 110 | # Add this device to the list of devices to be unmounted | ||
| 111 | ezjail_mds="${ezjail_mds} ${ezjail_device%.bde}" | ||
| 112 | |||
| 113 | # Remove soft link (which acts as a lock) | ||
| 114 | rm -f ${ezjail_root}.device | ||
| 115 | fi | ||
| 116 | } | ||
| 117 | |||
| 118 | attach_detach_post () { | ||
| 119 | # In case of a stop, unmount image devices after stopping jails | ||
| 120 | for md in ${ezjail_mds}; do | ||
| 121 | [ -e ${md}.bde ] && gbde detach ${md} | ||
| 122 | mdconfig -d -u ${md#/dev/} | ||
| 123 | done | ||
| 47 | } | 124 | } |
| 48 | 125 | ||
| 49 | run_rc_command $* | 126 | run_rc_command $* |
