Changeset d2b5358


Ignore:
Timestamp:
06/23/14 11:56:21 (9 months ago)
Author:
Kris Moore <kris@…>
Branches:
master, releng/10.0.3, releng/10.1, releng/10.1.1
Children:
19bab26
Parents:
fd6b78d
Message:

Large update to warden backend.

  1. Start by updating various commands, remove {zfs} prefix from them
  1. Create a new "snap" sub-command, which will handle aspects of snapshot management, such as listing, creation, removal, reverting
  1. Rewrite our "clone" functionality. Instead of just cloning to a new directory for the user to inspect, now you can run:

# warden clone myjail newjail --ipv4=127.0.0.9/24

This command will take an instant snapshot of "myjail" and clone it
to the new jail "newjail", setting the new IP address optionally

  1. Remove some legacy cloning cruft, and re-do help pages for all the effected commands

These changes mean that you can now create a master jail, and manually
or scripted create as many new "clones" of that jail as you like.

Location:
src-sh/warden
Files:
1 added
3 deleted
2 edited

Legend:

Unmodified
Added
Removed
  • src-sh/warden/bin/warden

    rcca8f57 rd2b5358  
    6464         type - Set the jail type (pluginjail|portjail|standard) 
    6565     template - Manage jail templates 
    66     zfsmksnap - Create a ZFS snapshot of a jail  
    67  zfslistclone - List clones of jail snapshots 
    68   zfslistsnap - List snapshots of a jail 
    69  zfsclonesnap - Clone a jail snapshot 
    70   zfscronsnap - Schedule snapshot creation via cron 
    71 zfsrevertsnap - Revert jail to a snapshot 
    72    zfsrmclone - Remove a clone directory 
    73     zfsrmsnap - Remove snapshot of a jail 
     66         snap - Jail snapshot management 
     67        clone - Clone an existing jail to a new jail 
     68         cron - Schedule snapshot creation via cron 
    7469__EOF__ 
    7570}; 
     
    170165}; 
    171166 
    172 help_zfslistclone() 
    173 { 
    174  title 
    175  echo "Help zfslistclone 
    176  
    177 List ZFS clones of a jail 
    178  
    179 Usage: 
    180  
    181   warden zfslistclone <Jail> 
    182  
    183 Example: 
    184  
    185   warden zfslistclone myjail 
    186 " 
    187 }; 
    188  
    189 help_zfslistsnap() 
    190 { 
    191  title 
    192  echo "Help zfslistsnap 
    193  
    194 List ZFS snapshots of a jail 
    195  
    196 Usage: 
    197  
    198   warden zfslistsnap <Jail> 
    199  
    200 Example: 
    201  
    202   warden zfslistsnap myjail 
    203 " 
    204 }; 
    205  
    206 help_zfsclonesnap() 
    207 { 
    208  title 
    209  echo "Help zfsclonesnap 
    210  
    211 Clone a ZFS jail snapshot 
    212  
    213 Usage: 
    214  
    215   warden zfsclonesnap <Jail> <SNAP> 
    216  
    217 Example: 
    218  
    219   warden zfsclonesnap myjail 20120505-140510 
    220 " 
    221 }; 
    222  
    223 help_zfscronsnap() 
    224 { 
    225  title 
    226  echo "Help zfscronsnap 
    227  
    228 Schedule a ZFS jail snapshot 
    229  
    230 Usage: 
    231  
    232   warden zfscronsnap <Jail> <action> <frequency> <daysToKeep> 
     167help_snap() 
     168{ 
     169 title 
     170 echo "Help snap 
     171 
     172Perform Snapshot operations on a jail 
     173 
     174Available Sub-Commands: list make remove revert 
     175 
     176list: 
     177 
     178  warden snap list <jail> 
     179 
     180make: 
     181 
     182  warden snap make <jail> <Optional Comment> 
     183 
     184remove: 
     185 
     186  warden snap remove <jail> <snapshot> 
     187 
     188revert: 
     189 
     190  warden snap revert <jail> <snapshot> 
     191 
     192" 
     193}; 
     194 
     195help_clone() 
     196{ 
     197 title 
     198 echo "Help clone 
     199 
     200Clone an existing jail into a new jail with (optional) new IP address 
     201 
     202Usage: 
     203 
     204  warden clone <Jail> <NewJail> 
     205 
     206Example: 
     207 
     208  warden clone myjail newjail --ipv4=127.0.0.4/24 
     209" 
     210}; 
     211 
     212help_cronsnap() 
     213{ 
     214 title 
     215 echo "Help cronsnap 
     216 
     217Schedule a jail snapshot 
     218 
     219Usage: 
     220 
     221  warden cronsnap <Jail> <action> <frequency> <daysToKeep> 
    233222   
    234223  action = start / stop 
     
    238227Example: 
    239228 
    240   warden zfscronsnap myjail start daily 10 
     229  warden cronsnap myjail start daily 10 
    241230 
    242231  or 
    243232 
    244   warden zfscronsnap myjail stop 
    245 " 
    246 }; 
    247  
    248 help_zfsrevertsnap() 
    249 { 
    250  title 
    251  echo "Help zfsrevertsnap 
    252  
    253 Revert ZFS snapshot of a jail 
    254  
    255 Usage: 
    256  
    257   warden zfsrevertsnap <Jail> <SNAP> 
    258  
    259 Example: 
    260  
    261   warden zfsrevertsnap myjail 20120505-140510 
    262 " 
    263 }; 
    264  
    265 help_zfsrmclone() 
    266 { 
    267  title 
    268  echo "Help zfsrmclone 
    269  
    270 Remove ZFS clone of a jail 
    271  
    272 Usage: 
    273  
    274   warden zfsrmclone <Jail> <CLONE> 
    275  
    276 Example: 
    277  
    278   warden zfsrmclone myjail 20120505-140510 
    279 " 
    280 }; 
    281  
    282 help_zfsrmsnap() 
    283 { 
    284  title 
    285  echo "Help zfsrmsnap 
    286  
    287 Remove ZFS snapshot of a jail 
    288  
    289 Usage: 
    290  
    291   warden zfsrmsnap <Jail> <SNAP> 
    292  
    293 Example: 
    294  
    295   warden zfsrmsnap myjail 20120505-140510 
    296 " 
    297 }; 
    298  
    299  
    300 help_zfsmksnap() 
    301 { 
    302  title 
    303  echo "Help zfsmksnap 
    304  
    305 Create a new ZFS snapshot of a jail, with an optional comment 
    306  
    307 Usage: 
    308  
    309   warden zfsmksnap <Jail> <comment> 
    310  
    311 Example: 
    312  
    313   warden zfsmksnap myjail 
     233  warden cronsnap myjail stop 
    314234" 
    315235}; 
     
    679599           get) help_get ;; 
    680600           set) help_set ;; 
    681            zfsmksnap) help_zfsmksnap ;; 
    682            zfslistsnap) help_zfslistsnap ;; 
    683            zfslistclone) help_zfslistclone ;; 
    684            zfsrevertsnap) help_zfsrevertsnap ;; 
    685            zfsclonesnap) help_zfsclonesnap ;; 
    686            zfscronsnap) help_zfscronsnap ;; 
    687            zfsrmsnap) help_zfsrmsnap ;; 
    688            zfsrmclone) help_zfsrmclone ;; 
     601           snap) help_snap ;; 
     602           cronsnap) help_cronsnap ;; 
     603           clone) help_clone ;; 
    689604           *) help_main ;; 
    690605         esac  ;; 
     
    975890         HOST=`basename "${IFILE}" | sed 's|\.wdn$||'` 
    976891 
    977          IP4="OFF" 
    978          IP6="OFF" 
    979          HOST="OFF" 
    980          for i in "$@" 
    981          do 
    982            # Check if we have a new IPv4 address for this import 
    983            echo "${i}" | grep '\-\-ipv4=' >/dev/null 2>/dev/null 
    984            if [ "$?" = "0" ] 
    985            then 
    986               tmp="`echo ${i} | cut -d '=' -f 2`" 
    987               IP4="`echo ${tmp} | cut -d '/' -f 1 -s`" 
    988               MASK4="`echo ${tmp} | cut -d '/' -f 2 -s`" 
    989  
    990               #Sanity check on the IP 
    991               if ! is_ipv4 "${IP4}" ; then 
    992                  exit_err "Invalid IPv4 address: $IP4" 
    993               fi 
    994  
    995               for i in `ls -d ${JDIR}/.*.meta 2>/dev/null` 
    996               do 
    997                 if [ "`cat ${i}/ipv4 2>/dev/null`" = "${IP4}/${MASK4}" ] ; then 
    998                   exit_err "A jail with this IPv4 address already exists!" 
    999                 fi  
    1000               done  
    1001            fi 
    1002  
    1003            # Check if we have a new IPv6 address for this import 
    1004            echo "${i}" | grep '\-\-ipv6=' >/dev/null 2>/dev/null 
    1005            if [ "$?" = "0" ] 
    1006            then 
    1007               tmp="`echo ${i} | cut -d '=' -f 2`" 
    1008               IP6="`echo ${tmp} | cut -d '/' -f 1 -s`" 
    1009               MASK6="`echo ${tmp} | cut -d '/' -f 2 -s`" 
    1010  
    1011               #Sanity check on the IP 
    1012               if ! is_ipv6 "${IP6}" ; then 
    1013                  exit_err "Invalid IPv6 address!" 
    1014               fi 
    1015  
    1016               for i in `ls -d ${JDIR}/.*.meta 2>/dev/null` 
    1017               do 
    1018                 _ipv6=`cat ${i}/ipv6 2>/dev/null | tr a-z A-Z` 
    1019                 _nipv6="`echo ${IP6}|tr a-z A-Z`/${MASK6}" 
    1020                  
    1021                 if [ "${_ipv6}" = "${_nipv6}" ] ; then 
    1022                   exit_err "A jail with this IPv6 address already exists!" 
    1023                 fi  
    1024               done  
    1025            fi 
    1026    
    1027            # Check if we have a new hostname for this jail 
    1028            echo ${i} | grep '\-\-host=' >/dev/null 2>/dev/null 
    1029            if [ "$?" = "0" ] 
    1030            then 
    1031               HOST="`echo ${i} | cut -d '=' -f 2`" 
    1032            fi 
    1033  
    1034          done 
     892         get_ip_host_flags "$@" 
    1035893 
    1036894         if [ "${IP4}" != "OFF" ] ; then 
     
    1071929         ;; 
    1072930 
    1073  zfsmksnap) require_root 
     931 snap) require_root 
     932         JAILNAME="$3" 
     933         if [ -z "${JAILNAME}" ]; then exit_err "No jail specified!"; fi 
     934         if [ ! -e "${JDIR}/${JAILNAME}" ]; then exit_err "No such jail!"; fi 
     935         set_warden_metadir 
     936 
     937         # Get the sub-command here 
     938         case $2 in 
     939            list) ${PROGDIR}/scripts/backend/zfslistsnap.sh "${JAILNAME}" ;; 
     940            make) ${PROGDIR}/scripts/backend/zfsmksnap.sh "${JAILNAME}" "$4" ;; 
     941          remove) ${PROGDIR}/scripts/backend/zfsrmsnap.sh "${JAILNAME}" "$4" ;; 
     942          revert) ${PROGDIR}/scripts/backend/zfsrevertsnap.sh "${JAILNAME}" "$4" ;; 
     943                *) help_snap ; exit 1 ;; 
     944         esac 
     945         ;; 
     946 
     947 clone) require_root 
    1074948         JAILNAME="$2" 
    1075949         if [ -z "${JAILNAME}" ]; then exit_err "No jail specified!"; fi 
    1076950         if [ ! -e "${JDIR}/${JAILNAME}" ]; then exit_err "No such jail!"; fi 
    1077951         set_warden_metadir 
    1078          ${PROGDIR}/scripts/backend/zfsmksnap.sh "${JAILNAME}" "$3" 
    1079          ;; 
    1080  
    1081  zfslistclone) require_root 
    1082          JAILNAME="$2" 
    1083          if [ -z "${JAILNAME}" ]; then exit_err "No jail specified!"; fi 
    1084          if [ ! -e "${JDIR}/${JAILNAME}" ]; then exit_err "No such jail!"; fi 
    1085          set_warden_metadir 
    1086          ${PROGDIR}/scripts/backend/zfslistclone.sh "${JAILNAME}" 
    1087          ;; 
    1088  
    1089  zfslistsnap) require_root 
    1090          JAILNAME="$2" 
    1091          if [ -z "${JAILNAME}" ]; then exit_err "No jail specified!"; fi 
    1092          if [ ! -e "${JDIR}/${JAILNAME}" ]; then exit_err "No such jail!"; fi 
    1093          set_warden_metadir 
    1094          ${PROGDIR}/scripts/backend/zfslistsnap.sh "${JAILNAME}" 
    1095          ;; 
    1096  
    1097  zfsclonesnap) require_root 
    1098          JAILNAME="$2" 
    1099          SNAP="$3" 
    1100          if [ -z "${JAILNAME}" ]; then exit_err "No jail specified!"; fi 
    1101          if [ ! -e "${JDIR}/${JAILNAME}" ]; then exit_err "No such jail!"; fi 
    1102          set_warden_metadir 
    1103          ${PROGDIR}/scripts/backend/zfsclonesnap.sh "${JAILNAME}" "${SNAP}" 
    1104          ;; 
    1105  
    1106  zfscronsnap) require_root 
     952 
     953         get_ip_host_flags "$@" 
     954 
     955         if [ "${IP4}" != "OFF" ] ; then 
     956            IP4="${IP4}/${MASK4}" 
     957         fi 
     958         if [ "${IP6}" != "OFF" ] ; then 
     959            IP6="${IP6}/${MASK6}" 
     960         fi 
     961 
     962         ${PROGDIR}/scripts/backend/zfsclone.sh "${JAILNAME}" "$3" "$IP4" "$IP6" 
     963         ;; 
     964 
     965 cronsnap) require_root 
    1107966         JAILNAME="$2" 
    1108967         if [ -z "${JAILNAME}" ]; then exit_err "No jail specified!"; fi 
     
    1112971         ;; 
    1113972 
    1114  
    1115  zfsrevertsnap) require_root 
    1116          JAILNAME="$2" 
    1117          SNAP="$3" 
    1118          if [ -z "${JAILNAME}" ]; then exit_err "No jail specified!"; fi 
    1119          if [ ! -e "${JDIR}/${JAILNAME}" ]; then exit_err "No such jail!"; fi 
    1120          set_warden_metadir 
    1121          ${PROGDIR}/scripts/backend/zfsrevertsnap.sh "${JAILNAME}" "$SNAP" 
    1122          ;; 
    1123  
    1124  zfsrmclone) require_root 
    1125          JAILNAME="$2" 
    1126          CLONE="$3" 
    1127          if [ -z "${JAILNAME}" ]; then exit_err "No jail specified!"; fi 
    1128          if [ ! -e "${JDIR}/${JAILNAME}" ]; then exit_err "No such jail!"; fi 
    1129          set_warden_metadir 
    1130          ${PROGDIR}/scripts/backend/zfsrmclone.sh "${JAILNAME}" "${CLONE}" 
    1131          ;; 
    1132  
    1133  zfsrmsnap) require_root 
    1134          JAILNAME="$2" 
    1135          SNAP="$3" 
    1136          if [ -z "${JAILNAME}" ]; then exit_err "No jail specified!"; fi 
    1137          if [ ! -e "${JDIR}/${JAILNAME}" ]; then exit_err "No such jail!"; fi 
    1138          set_warden_metadir 
    1139          ${PROGDIR}/scripts/backend/zfsrmsnap.sh "${JAILNAME}" "${SNAP}" 
    1140          ;; 
    1141973 
    1142974 create) require_root 
  • src-sh/warden/scripts/backend/functions.sh

    rde73897 rd2b5358  
    4545 
    4646# Warden Version 
    47 WARDENVER="1.3" 
     47WARDENVER="1.4" 
    4848export WARDENVER 
    4949 
     
    439439} 
    440440 
    441 cloneZFSSnap() { 
     441cloneZFSDir() { 
    442442  isDirZFS "${1}" "1" 
    443443  if [ $? -ne 0 ] ; then printerror "Not a ZFS volume: ${1}" ; fi 
     444 
    444445  tank=`getZFSTank "$1"` 
    445446  rp=`getZFSRelativePath "$1"` 
    446   cdir=`getZFSRelativePath "${CDIR}"` 
    447  
    448   # Make sure this is a valid snapshot 
    449   zfs list -t snapshot | grep -w "^${tank}${rp}" | cut -d '@' -f 2 | awk '{print $1}' | grep -q ${2} 
    450   if [ $? -ne 0 ] ; then printerror "Invalid ZFS snapshot!" ; fi 
    451  
    452   if [ -d "${CDIR}/${3}-${2}" ] ; then 
    453      printerror "This snapshot is already cloned and mounted at: ${CDIR}/${3}-${2}" 
    454   fi 
     447  newrp=`getZFSRelativePath "$2"` 
     448 
     449  zdate=`date +%Y-%m-%d-%H-%M-%S` 
     450  snapName="preClone-$zdate" 
     451 
     452  # Create a temp snapshot we can clone 
     453  zfs snapshot $tank${rp}@${snapName} 
     454  if [ $? -ne 0 ] ; then printerror "Failed creating snapshot!" ; fi 
    455455 
    456456  # Clone the snapshot 
    457   zfs clone -p ${tank}${rp}@$2 ${tank}${cdir}/${3}-${2} 
    458  
    459   echo "Snapshot cloned and mounted to: ${CDIR}/${3}-${2}" 
     457  zfs clone -p ${tank}${rp}@${snapName} ${tank}${newrp} 
     458  if [ $? -ne 0 ] ; then printerror "Failed cloning snapshot!" ; fi 
     459 
     460  return 0 
    460461} 
    461462 
     
    11651166   exit 0 
    11661167} 
     1168 
     1169get_ip_host_flags() 
     1170{ 
     1171         IP4="OFF" 
     1172         IP6="OFF" 
     1173         HOST="OFF" 
     1174         for i in "$@" 
     1175         do 
     1176           # Check if we have a new IPv4 address for this import 
     1177           echo "${i}" | grep '\-\-ipv4=' >/dev/null 2>/dev/null 
     1178           if [ "$?" = "0" ]; then 
     1179              tmp="`echo ${i} | cut -d '=' -f 2`" 
     1180              IP4="`echo ${tmp} | cut -d '/' -f 1 -s`" 
     1181              MASK4="`echo ${tmp} | cut -d '/' -f 2 -s`" 
     1182 
     1183              #Sanity check on the IP 
     1184              if ! is_ipv4 "${IP4}" ; then 
     1185                 exit_err "Invalid IPv4 address: $IP4" 
     1186              fi 
     1187 
     1188              for i in `ls -d ${JDIR}/.*.meta 2>/dev/null` 
     1189              do 
     1190                if [ "`cat ${i}/ipv4 2>/dev/null`" = "${IP4}/${MASK4}" ] ; then 
     1191                  exit_err "A jail with this IPv4 address already exists!" 
     1192                fi 
     1193              done 
     1194           fi 
     1195 
     1196           # Check if we have a new IPv6 address for this import 
     1197           echo "${i}" | grep '\-\-ipv6=' >/dev/null 2>/dev/null 
     1198           if [ "$?" = "0" ]; then 
     1199              tmp="`echo ${i} | cut -d '=' -f 2`" 
     1200              IP6="`echo ${tmp} | cut -d '/' -f 1 -s`" 
     1201              MASK6="`echo ${tmp} | cut -d '/' -f 2 -s`" 
     1202 
     1203              #Sanity check on the IP 
     1204              if ! is_ipv6 "${IP6}" ; then 
     1205                 exit_err "Invalid IPv6 address!" 
     1206              fi 
     1207 
     1208              for i in `ls -d ${JDIR}/.*.meta 2>/dev/null` 
     1209              do 
     1210                _ipv6=`cat ${i}/ipv6 2>/dev/null | tr a-z A-Z` 
     1211                _nipv6="`echo ${IP6}|tr a-z A-Z`/${MASK6}" 
     1212 
     1213                if [ "${_ipv6}" = "${_nipv6}" ] ; then 
     1214                  exit_err "A jail with this IPv6 address already exists!" 
     1215                fi 
     1216              done 
     1217           fi 
     1218 
     1219           # Check if we have a new hostname for this jail 
     1220           echo ${i} | grep '\-\-host=' >/dev/null 2>/dev/null 
     1221           if [ "$?" = "0" ]; then 
     1222              HOST="`echo ${i} | cut -d '=' -f 2`" 
     1223           fi 
     1224 
     1225         done 
     1226 
     1227} 
Note: See TracChangeset for help on using the changeset viewer.