From 31a6d467efba81cf486072dd0da6e1050eacd324 Mon Sep 17 00:00:00 2001 From: Ralf Zerres Date: Wed, 3 Oct 2018 17:00:39 +0200 Subject: [PATCH] tape-admin: new functionality, version bump * get_mediapool_name(): extract mediapool for given volume_name * ltfs_reformat(): wipe given volume_name and remaster for LTFS * media_change(): update lastwrite date for new volume_name * mtx_unload(): write only once to ERRFILE * parse_params(): update for given new functionality, reorder * prepare options for remote calls (ssh) * typo updates Signed-off-by: Ralf Zerres --- bin/tape-admin | 778 +++++++++++++++++++++++++++++-------------------- 1 file changed, 456 insertions(+), 322 deletions(-) diff --git a/bin/tape-admin b/bin/tape-admin index 4ed26d2..493083a 100755 --- a/bin/tape-admin +++ b/bin/tape-admin @@ -22,7 +22,7 @@ # Helper routines for tape handling progname="${0##*/}" -version="0.0.8" +version="0.0.9" # global variables color=0 @@ -216,7 +216,7 @@ get_lastwrite () { if [ ${#volume_lastwrite} -gt 1 ]; then volume_lastwrite=$(echo $volume_lastwrite | sed -e 's/"//g') if [ $verbose -ge 3 ]; then - printf "${MAGENTA}volume_lastwrite for for volume ${GREEN}'%s'${MAGENTA} in media-pool ${GREEN}'%s'${MAGENTA} is: ${NO_COLOR}%s${NO_COLOR}\n" \ + printf "${MAGENTA}volume_lastwrite for volume ${GREEN}'%s'${MAGENTA} in media-pool ${GREEN}'%s'${MAGENTA} is: ${NO_COLOR}%s${NO_COLOR}\n" \ "$volume_name" "$mediapool_name" "$volume_lastwrite" fi else @@ -256,6 +256,38 @@ get_mediapolicy () { fi } +get_mediapool_name () { + local mediapools_json=${mediapools:-$mediapools_json} + local volume_name=${1} + + if [ $verbose -ge 1 ]; then + printf "${BLUE}get_mediapool_name...${NO_COLOR}\n" + fi + + if test ! -r ${mediapools_json}; then + if [ $verbose -ge 1 ]; then + printf "${RED}Error:${MAGENTA} media-pool file ${GREEN}'%s'${MAGENTA} can't be opend!${NO_COLOR}\n" \ + "$mediapools_json" + fi + exit 1 + fi + + cmd="jq --monochrome-output --ascii-output ' .MediaPool[] \ + | .Name as \$MediaPoolName \ + | .Member[].VolumeName \ + | select(. == \"${volume_name}\") \ + | \$MediaPoolName' + ${mediapools_json}" + + mediapool_name=$(eval $cmd) + mediapool_name=$(echo $mediapool_name | sed -e 's/"//g') + + if [ $verbose -ge 3 ]; then + printf "${MAGENTA}Media-pool name for VolumeName %s: ${GREEN}'%s'${NO_COLOR}\n" \ + "$volume_name" "$mediapool_name" + fi +} + get_mediapool_names () { local mediapools_json=${mediapools:-$mediapools_json} #local mediapool_name=${1} @@ -341,7 +373,6 @@ get_poolmember () { exit 1 fi - #cmd="jq --monochrome-output --join-output --ascii-output '.MediaPool[] \ cmd="jq --monochrome-output --ascii-output '.MediaPool[] \ | select(.Name == \"${mediapool_name}\") \ | .Member[].VolumeName' \ @@ -545,7 +576,7 @@ ltfs_is_mounted () { ltfs_devname=$(findmnt -n -T $ltfs_mountpoint -o source | awk -F ':' '{print $2}') if [ ${#ltfs_devname} -gt 1 ]; then if [ $verbose -ge 2 ]; then - printf "${MAGENTA}LTFS tape mounted via ${GREEN}'%s'${MAGENTA} at ${GREEN}'%s'${NO_COLOR}\n" \ + printf "${MAGENTA}LTFS tape is mounted via ${GREEN}'%s'${MAGENTA} at ${GREEN}'%s'${NO_COLOR}\n" \ "$ltfs_devname" "$ltfs_mountpoint" fi return 0 @@ -600,6 +631,71 @@ ltfs_mount () { fi } +ltfs_reformat () { + local volume_name=${1} + + if [ $verbose -ge 1 ]; then + printf "${BLUE}ltfs_reformat...${NO_COLOR}\n" + fi + + ltfs_is_mounted + if [ $? -eq 0 ]; then + if [ $verbose -ge 2 ]; then + printf "${MAGENTA}LTFS tape ${GREEN}'%s'${MAGENTA} is mounted to ${GREEN}'%s'${NO_COLOR}\n" \ + "$ltfs_devname" "$ltfs_mountpoint" + fi + slot_source="0" + mtx_getlabel $slot_source + if [ ${#volume_name} -gt 0 ] && [ $volume_name_active != $volume_name ]; then + get_mediapool_name $volume_name + if [ $? -eq 0 ]; then + ltfs_umount + if [ $? -eq 0 ]; then + mtx_unload + if [ $? -eq 0 ]; then + mount_tape "${mediapool_name}" "${volume_name}" + fi + fi + fi + fi + else + if [ ! -d $ltfs_mountpoint ]; then + mkdir -p $ltfs_mountpoint + fi + make_err_file + if [ $verbose -ge 2 ]; then + printf "${MAGENTA}LTFS mounting tape ${GREEN}'%s'${MAGENTA} to ${GREEN}'%s'${NO_COLOR}\n" \ + "$ltfs_devname" "$ltfs_mountpoint" + ${LTFS} -o devname=$ltfs_devname -o verbose=$verbose $ltfs_mountpoint 1>/dev/null 2>${ERRFILE} + else + ${LTFS} -o devname=$ltfs_devname -o verbose=0 $ltfs_mountpoint 1>/dev/null 2>${ERRFILE} + fi + if [ $? -ge 0 ]; then + if [ -z $volume_name_active ]; then + slot_source="0" + mtx_getlabel $slot_source + fi + need_format=$(grep "medium is not partitioned" ${ERRFILE}) + rm -f ${ERRFILE} + fi + fi + + if [ ${#volume_name} -eq 0 ] || [ $volume_name_active = $volume_name ]; then + tape_id=$(echo $volume_name_active | sed -e 's/\([[:alpha:]]*-\)//g') + # tape_id needs to be exactly 6 character long + volume_serial=$(printf "%0.s0" $(seq 1 $((6 - ${#tape_id})))) + volume_serial="${volume_serial}${tape_id}" + if [ ${#need_format} -ge 1 ]; then + ltfs_format ${volume_name_active} ${volume_serial} + else + ltfs_wipe + ltfs_format ${volume_name_active} ${volume_serial} + fi + ltfs_mount + fi + return $? +} + ltfs_umount () { if [ $verbose -ge 1 ]; then printf "${BLUE}ltfs_umount...${NO_COLOR}\n" @@ -608,11 +704,16 @@ ltfs_umount () { ltfs_is_mounted if [ $? -eq 0 ]; then + + if [ $verbose -ge 3 ]; then + printf "${MAGENTA}unmounting LTFS tape ${GREEN}'%s'${NO_COLOR}.\n" \ + "$ltfs_mountpoint" + fi ret=$(umount $ltfs_mountpoint 2>/dev/null) if [ $? -eq 0 ]; then if [ $verbose -ge 2 ]; then printf "${MAGENTA}LTFS tape ${GREEN}'%s'${MAGENTA} unmounted.${NO_COLOR}\n" \ - "$ltfs_devname" + "$ltfs_mountpoint" fi return 0 else @@ -693,6 +794,242 @@ media_change () { printf "${MAGENTA}MediaPool: ${GREEN}%s${NO_COLOR} (next tape: ${GREEN}%s${NO_COLOR})\n" \ "${mediapool_name}" "${volume_name_next}" fi + update_lastwrite "${mediapool_name}" "${volume_name_next}" "${date_string}" + fi + fi +} + +mount_tape () { + local mediapool_name=${1} + local volume_name=${2} + + if [ $verbose -ge 1 ]; then + printf "${BLUE}mount_tape...${NO_COLOR}\n" + fi + + if [ $verbose -ge 2 ]; then + if [ ${#volume_name } -ge 1 ]; then + printf "${MAGENTA}MediaPool: ${GREEN}%s${NO_COLOR} (mounting tape: ${GREEN}%s${NO_COLOR})\n" \ + "${mediapool_name}" "${volume_name}" + else + printf "${MAGENTA}MediaPool: ${GREEN}%s${NO_COLOR} (mounting next tape)\n" \ + "${mediapool_name}" + fi + fi + + ltfs_is_mounted + if test $? -eq 0; then + if [ $verbose -ge 1 ]; then + printf "${MAGENTA}LTFS Tape is mounted.${NO_COLOR}\n" + fi + # get date from last written tape in given mediapool + if [ "${#volume_name}" -eq 0 ]; then + get_lastwrite ${mediapool_name} + if [ $? != 0 ]; then + exit 1 + fi + fi + # get label from tape in given drive slot + slot_source="0" + mtx_getlabel $slot_source + if [ $? -eq 0 ]; then + if [ $verbose -ge 2 ]; then + printf "${MAGENTA}Tape in drive: ${GREEN}%s${NO_COLOR}\n" \ + "${volume_name_active}" + fi + if [ "${#volume_name_active}" -ge 1 ] && [ "${volume_name_active}" != "${volume_name}" ]; then + if [ $verbose -ge 1 ]; then + printf "${MAGENTA}Re-Mounting Tape: ${GREEN}%s${NO_COLOR}\n" \ + "${volume_name}" + fi + ltfs_umount + if [ $? -eq 0 ]; then + mtx_unload + if [ $? -eq 0 ]; then + mount_tape "${mediapool_name}" "${volume_name}" + return 0 + else + return $? + fi + else + return $? + fi + fi + fi + # check if given tape is poolmember of selected pool + get_poolmember ${mediapool_name} ${volume_name} + if [ $? -eq 0 ]; then + # volume_name is member of given mediapool + get_mediapolicy ${mediapool_name} ${volume_name_active} + if [ ${#volume_mediapolicy} -gt 0 ]; then + if [ ${volume_mediapolicy} = "append" ] ; then + if [ $verbose -ge 1 ]; then + printf "${MAGENTA}Valid tape mediapolicy: ${GREEN}%s${NO_COLOR}\n" \ + "${volume_mediapolicy}" + fi + volume_retensiondate="20180101000000" + get_retensiondate ${mediapool_name} ${volume_name} + if [ $? -eq 0 ]; then + date_now=$($date_cmd) + compare_date $date_now $volume_retensiondate + if [ $? -eq 2 ]; then + # retensiondate has exposed: use it + return 0 + fi + if [ $? -eq 1 ]; then + # respect active retensiondate: unload given tape + ltfs_umount + mtx_unload + # use next volume_name from pool + get_poolmember_next ${mediapool_name} ${volume_name} + get_slot ${mediapool_name} ${volume_name_next} + mtx_load ${volume_slot} + ltfs_mount + if [ $? -eq 0 ]; then + return 0 + fi + fi + return 0 + fi + if [ ${volume_mediapolicy} = "overwrite" ] ; then + volume_retensiondate="20180101000000" + get_retensiondate ${mediapool_name} ${volume_name} + date_now=$($date_cmd) + compare_date $date_now $volume_retensiondate + if [ $? -eq 2 ]; then + # retensiondate has exposed: wipe given tape + ltfs_wipe + if [ $? -eq 0 ]; then + return 0 + fi + fi + if [ $? -eq 1 ]; then + # respect active retensiondate: unload given tape + ltfs_umount + mtx_unload + # use next volume_name from pool + get_poolmember_next ${mediapool_name} ${volume_name} + get_slot ${mediapool_name} ${volume_name_next} + mtx_load ${volume_slot} + ltfs_mount + if [ $? -eq 0 ]; then + return 0 + fi + fi + fi + fi + fi + else + # volume_name is not member of given pool + ltfs_umount + if [ $? -eq 0 ]; then + mtx_unload + if [ $? -eq 0 ]; then + if [ "${#volume_name}" -eq 0 ]; then + get_lastwrite ${mediapool_name} + fi + get_poolmember_next ${mediapool_name} ${volume_name} + if [ $? -eq 0 ]; then + mtx load ${volume_name_next} + ltfs_mount + fi + else + return $? + fi + else + return $? + fi + fi + else + if [ $verbose -ge 1 ]; then + printf "${MAGENTA}No LTFS Tape mounted...${NO_COLOR}\n" + fi + if [ "${#volume_name}" -eq 0 ]; then + # set volume_name and last write date + #get_lastwrite ${mediapool_name} + get_poolmember_next ${mediapool_name} + if [ "${#volume_name_next}" -ge 1 ]; then + volume_name=${volume_name_next} + fi + fi + # check label of tape in given drive slot (slot=0) + slot_source="0" + mtx_getlabel $slot_source + if [ $? -eq 0 ] && [ "${#volume_name_active}" -gt 1 ]; then + if [ $verbose -ge 1 ]; then + printf "${MAGENTA}Tape in drive: ${GREEN}%s${NO_COLOR}\n" \ + "${volume_name_active}" + fi + if [ "${#volume_name_active}" -gt 1 ] && [ "${volume_name_active}" != "${volume_name}" ]; then + mtx_unload + if [ $? -eq 0 ]; then + mount_tape "${mediapool_name}" "${volume_name}" + return 0 + else + return $? + fi + fi + else + # mount new tape + get_slot ${mediapool_name} ${volume_name} + mtx_load ${volume_slot} + fi + + # volume_name is member of given mediapool + get_mediapolicy ${mediapool_name} ${volume_name} + if [ ${#volume_mediapolicy} -gt 0 ]; then + if [ ${volume_mediapolicy} = "append" ] ; then + if [ $verbose -ge 1 ]; then + printf "${MAGENTA}Valid tape mediapolicy: ${GREEN}%s${NO_COLOR}\n" \ + "${volume_mediapolicy}" + fi + volume_retensiondate="20180101000000" + get_retensiondate ${mediapool_name} ${volume_name} + date_now=$($date_cmd) + compare_date $date_now $volume_retensiondate + RET=$? + if [ $RET -eq 2 ]; then + if [ $verbose -ge 1 ]; then + printf "${MAGENTA}RetensionDate has exposed, mount the tape\n" + fi + ltfs_mount + return 0 + elif [ $RET -eq 1 ]; then + if [ $verbose -ge 1 ]; then + printf "${MAGENTA}Tape is bocked via RetensionDate.\n" + fi + ltfs_mount + return 0 + fi + fi + if [ ${volume_mediapolicy} = "overwrite" ] ; then + volume_retensiondate="20180101000000" + get_retensiondate ${mediapool_name} ${volume_name} + date_now=$($date_cmd) + compare_date $date_now $volume_retensiondate + if [ $? -eq 2 ]; then + # retensiondate has exposed: wipe given tape + ltfs_mount + if [ $? -eq 0 ]; then + ltfs_wipe + if [ $? -eq 0 ]; then + return 0 + fi + fi + fi + if [ $? -eq 1 ]; then + # respect active retensiondate: unload given tape + mtx_unload + if [ $? -eq 0 ]; then + # use next volume_name from pool + get_poolmember_next ${mediapool_name} ${volume_name} + mount_tape "${mediapool_name}" "${volume_name}" + return 0 + else + return $? + fi + fi + fi fi fi } @@ -719,7 +1056,7 @@ mtx_getlabel () { export slot_source if [ $verbose -ge 1 ]; then - printf "${BLUE}Tape get-label...${NO_COLOR}\n" + printf "${BLUE}mtx_get_label...${NO_COLOR}\n" fi make_temp_file @@ -830,8 +1167,8 @@ mtx_unload () { fi make_err_file + ${MTX} -f $changer_device unload $slot_source $drive 2>${ERRFILE} for i in 1 2 3 4 5 ; do - ${MTX} -f $changer_device unload $slot_source $drive 2>${ERRFILE} RET=$? if test $RET -eq 0; then break @@ -896,6 +1233,11 @@ parse_params () { shift $count cmd=get-lastwrite ;; + --get-mediapool-name) + volume_name=$2 + shift 2 + cmd=get-mediapool-name + ;; --get-mediapools) shift 1 cmd=get-mediapools @@ -977,6 +1319,40 @@ parse_params () { shift $count cmd=get-slot ;; + --ltfs-format) + shift 1 + ltfs_params=${*} + ltfs_params="${ltfs_params%% -*}" + params=$* + set -- $ltfs_params + count=$# + test $count -ge 1 && volume_name="$1" + test $count -ge 2 && tape_id="$2" + set -- $params + shift $count + cmd=ltfs-format + ;; + --ltfs-is-mounted) + shift 1 + cmd=ltfs-is-mounted + ;; + --ltfs-mount) + shift 1 + cmd=ltfs-mount + ;; + --ltfs-mountpoint) + ltfs_mountpoint="$2" + shift 2 + ;; + --ltfs-reformat) + volume_name="$2" + shift 2 + cmd=ltfs-reformat + ;; + --ltfs-umount) + shift 1 + cmd=ltfs-umount + ;; --media-change) shift 1 tape_params=${*} @@ -1005,62 +1381,6 @@ parse_params () { shift $count cmd=mount ;; - -p|--port) - port=$2 - shift 2 - ;; - --remote) - remote=$2 - shift 2 - ;; - --use-mtx) - use_mtx=1 - shift 1 - ;; - --ltfs-devname) - ltfs_devname="$2" - shift 2 - ;; - --ltfs-getattribute) - shift 1 - ltfs_params=${*} - ltfs_params="${ltfs_params%% -*}" - params=$* - set -- $ltfs_params - count=$# - test $count -eq 0 && ltfs_attribute_name="volumeName" - shift $count - cmd=ltfs-getattribute - ;; - --ltfs-format) - shift 1 - ltfs_params=${*} - ltfs_params="${ltfs_params%% -*}" - params=$* - set -- $ltfs_params - count=$# - test $count -ge 1 && volume_name="$1" - test $count -ge 2 && tape_id="$2" - set -- $params - shift $count - cmd=ltfs-format - ;; - --ltfs-is-mounted) - shift 1 - cmd=ltfs-is-mounted - ;; - --ltfs-mount) - shift 1 - cmd=ltfs-mount - ;; - --ltfs-mountpoint) - ltfs_mountpoint="$2" - shift 2 - ;; - --ltfs-umount) - shift 1 - cmd=ltfs-umount - ;; --mtx-exchange) shift slots=${*} @@ -1134,6 +1454,33 @@ parse_params () { shift $count cmd=mtx-unload ;; + -p|--port) + port=$2 + shift 2 + ;; + --remote) + remote=$2 + shift 2 + ;; + --use-mtx) + use_mtx=1 + shift 1 + ;; + --ltfs-devname) + ltfs_devname="$2" + shift 2 + ;; + --ltfs-getattribute) + shift 1 + ltfs_params=${*} + ltfs_params="${ltfs_params%% -*}" + params=$* + set -- $ltfs_params + count=$# + test $count -eq 0 && ltfs_attribute_name="volumeName" + shift $count + cmd=ltfs-getattribute + ;; --update-lastwrite) shift 1 pool_params=${*} @@ -1230,7 +1577,7 @@ parse_params () { if [ -z "$remote" ]; then ssh="" else - ssh="ssh -T $remote" + ssh="ssh $remote" if [ ! -z "$port" ]; then ssh="$ssh -p $port" fi @@ -1253,6 +1600,11 @@ parse_params () { printf " ltfs mount-point: '%s'\n" "$ltfs_mountpoint" printf "MTX Settings\n" printf " def changer-name: '%s'\n" "$default_changer_device" + if [ ${#remote} -ge 1 ]; then + printf "Remote Settings\n" + printf " remote host: '%s'\n" "$remote" + printf " ssh options: '%s'\n" "$ssh" + fi if [ $verbose -ge 1 ]; then tape_options="verbose_level=$verbose"; fi if [ $dryrun -eq 1 ]; then tape_options="${tape_options} dry-run=true"; fi @@ -1262,252 +1614,6 @@ parse_params () { fi } -mount_tape () { - local mediapool_name=${1} - local volume_name=${2} - - if [ $verbose -ge 1 ]; then - printf "${BLUE}mount_tape...${NO_COLOR}\n" - fi - - if [ $verbose -ge 2 ]; then - if [ ${#volume_name } -ge 1 ]; then - printf "${MAGENTA}MediaPool: ${GREEN}%s${NO_COLOR} (mounting tape: ${GREEN}%s${NO_COLOR})\n" \ - "${mediapool_name}" "${volume_name_active}" - else - printf "${MAGENTA}MediaPool: ${GREEN}%s${NO_COLOR} (mounting next tape)\n" \ - "${mediapool_name}" - fi - fi - - ltfs_is_mounted - if test $? -eq 0; then - if [ $verbose -ge 1 ]; then - printf "${MAGENTA}LTFS Tape is mounted.${NO_COLOR}\n" - fi - - # check that mounted tape is member of selected mediapool - slot_source="0" - mtx_getlabel ${slot_source} - if [ $? -eq 0 ]; then - get_poolmember ${mediapool_name} ${volume_name_active} - if [ $? -eq 1 ]; then - # unmount and recurse execution - if [ $verbose -ge 2 ]; then - printf "${MAGENTA}Tape: ${GREEN}%s${NO_COLOR} is no valid member of selected MediaPool: ${GREEN}%s${NO_COLOR}\n" \ - "${volume_name_active}" "${mediapool_name}" - fi - ltfs_umount - if [ $? -eq 0 ]; then - mtx_unload - if [ $? -eq 0 ]; then - if [ $verbose -ge 2 ]; then - printf "${MAGENTA}Tape: ${GREEN}%s${NO_COLOR} is no valid member of selected MediaPool: ${GREEN}%s${NO_COLOR}\n" \ - "${volume_name_active}" "${mediapool_name}" - fi - mount_tape "${mediapool_name}" "${volume_name}" - return 0 - else - return $? - fi - else - return $? - fi - fi - fi - # get date from last written tape in given mediapool - if [ "${#volume_name}" -eq 0 ]; then - get_lastwrite ${mediapool_name} - if [ $? != 0 ]; then - exit 1 - fi - fi - # get label from tape in given drive slot - slot_source="0" - mtx_getlabel $slot_source - if [ $verbose -ge 1 ]; then - printf "${MAGENTA}Tape Label: ${GREEN}%s${NO_COLOR}\n" \ - "${volume_name_active}" - fi - if [ "${#volume_name_active}" -ge 1 ] && [ "${volume_name_active}" != "${volume_name}" ]; then - ltfs_umount - if [ $? -eq 0 ]; then - mtx_unload - if [ $? -eq 0 ]; then - mount_tape "${mediapool_name}" "${volume_name}" - return 0 - else - return $? - fi - else - return $? - fi - fi - # check if given tape is poolmember of selected pool - get_poolmember ${mediapool_name} ${volume_name} - if [ $? -eq 0 ]; then - # volume_name is member of given mediapool - get_mediapolicy ${mediapool_name} ${volume_name} - if [ ${#volume_mediapolicy} -gt 0 ]; then - if [ ${volume_mediapolicy} = "append" ] ; then - if [ $verbose -ge 1 ]; then - printf "${MAGENTA}Valid tape mediapolicy: ${GREEN}%s${NO_COLOR}\n" \ - "${volume_mediapolicy}" - fi - volume_retensiondate="20180101000000" - get_retensiondate ${mediapool_name} ${volume_name} - if [ $? -eq 0 ]; then - date_now=$($date_cmd) - compare_date $date_now $volume_retensiondate - if [ $? -eq 2 ]; then - # retensiondate has exposed: use it - return 0 - fi - if [ $? -eq 1 ]; then - # respect active retensiondate: unload given tape - ltfs_umount - mtx_unload - # use next volume_name from pool - get_poolmember_next ${mediapool_name} ${volume_name} - get_slot ${mediapool_name} ${volume_name_next} - mtx_load ${volume_slot} - ltfs_mount - if [ $? -eq 0 ]; then - return 0 - fi - fi - return 0 - fi - if [ ${volume_mediapolicy} = "overwrite" ] ; then - volume_retensiondate="20180101000000" - get_retensiondate ${mediapool_name} ${volume_name} - date_now=$($date_cmd) - compare_date $date_now $volume_retensiondate - if [ $? -eq 2 ]; then - # retensiondate has exposed: wipe given tape - ltfs_wipe - if [ $? -eq 0 ]; then - return 0 - fi - fi - if [ $? -eq 1 ]; then - # respect active retensiondate: unload given tape - ltfs_umount - mtx_unload - # use next volume_name from pool - get_poolmember_next ${mediapool_name} ${volume_name} - get_slot ${mediapool_name} ${volume_name_next} - mtx_load ${volume_slot} - ltfs_mount - if [ $? -eq 0 ]; then - return 0 - fi - fi - fi - fi - fi - else - # volume_name is not member of given pool - ltfs_umount - if [ $? -eq 0 ]; then - mtx_unload - if [ $? -eq 0 ]; then - if [ "${#volume_name}" -eq 0 ]; then - get_lastwrite ${mediapool_name} - fi - get_poolmember_next ${mediapool_name} ${volume_name} - if [ $? -eq 0 ]; then - mtx load ${volume_name_next} - ltfs_mount - fi - else - return $? - fi - else - return $? - fi - fi - else - if [ $verbose -ge 1 ]; then - printf "${MAGENTA}No LTFS Tape mounted...${NO_COLOR}\n" - fi - if [ "${#volume_name}" -eq 0 ]; then - # set volume_name and last write date - get_lastwrite ${mediapool_name} - fi - # check label from tape in given drive slot - slot_source="0" - mtx_getlabel $slot_source - if [ $? -eq 0 ] && [ "${#volume_name_active}" -gt 1 ]; then - if [ $verbose -ge 1 ]; then - printf "${MAGENTA}Tape Label: ${GREEN}%s${NO_COLOR}\n" \ - "${volume_name_active}" - fi - if [ "${#volume_name_active}" -gt 1 ] && [ "${volume_name_active}" != "${volume_name}" ]; then - mtx_unload - if [ $? -eq 0 ]; then - mount_tape "${mediapool_name}" "${volume_name}" - return 0 - else - return $? - fi - fi - else - # mount new tape - get_slot ${mediapool_name} ${volume_name} - mtx_load ${volume_slot} - fi - - # volume_name is member of given mediapool - get_mediapolicy ${mediapool_name} ${volume_name} - if [ ${#volume_mediapolicy} -gt 0 ]; then - if [ ${volume_mediapolicy} = "append" ] ; then - if [ $verbose -ge 1 ]; then - printf "${MAGENTA}Valid tape mediapolicy: ${GREEN}%s${NO_COLOR}\n" \ - "${volume_mediapolicy}" - fi - volume_retensiondate="20180101000000" - get_retensiondate ${mediapool_name} ${volume_name} - date_now=$($date_cmd) - compare_date $date_now $volume_retensiondate - if [ $? -eq 2 ]; then - # retensiondate has exposed: use it - ltfs_mount - return 0 - fi - fi - if [ ${volume_mediapolicy} = "overwrite" ] ; then - volume_retensiondate="20180101000000" - get_retensiondate ${mediapool_name} ${volume_name} - date_now=$($date_cmd) - compare_date $date_now $volume_retensiondate - if [ $? -eq 2 ]; then - # retensiondate has exposed: wipe given tape - ltfs_mount - if [ $? -eq 0 ]; then - ltfs_wipe - if [ $? -eq 0 ]; then - return 0 - fi - fi - fi - if [ $? -eq 1 ]; then - # respect active retensiondate: unload given tape - mtx_unload - if [ $? -eq 0 ]; then - # use next volume_name from pool - get_poolmember_next ${mediapool_name} ${volume_name} - mount_tape "${mediapool_name}" "${volume_name}" - return 0 - else - return $? - fi - fi - fi - fi - fi -} - traperror () { printf "Exited due to error on line %s.\n" $1 printf "exit status: %s\n" "$2" @@ -1786,7 +1892,9 @@ Options: --get-lastwrite extract LastWrite attribute from given Pool member (JSON-File) (input attribute: []) without given volume_name, extract Pool member that was last witten to - --get-mediapools extract MediaPool names Pool configuration (JSON-File) + --get-mediapool-name extract MediaPool name for given VolumeName from configuration (JSON-File) + (input attribute: ) + --get-mediapools extract MediaPool names from configuration (JSON-File) --get-mediapolicy extract MediaPolicy attribute from Pool configuration (JSON-File) (input attribute: []) --get-poolmember extract VolumeName attribute from Pool configuration (JSON-File) @@ -1805,6 +1913,8 @@ Options: (input attribute: ) --ltfs-is-mounted returns true, if ltfs tape is already mounted --ltfs-mount mount a ltfs tape (returns true on success) + --ltfs-reformat reformat mounted tape + (input attribute: []) --ltfs-umount unmount a ltfs tape (returns true on success) --media-change Update RetensionDate for last written Pool-Tape and und exchange tapes in slots (input attribute: []) @@ -1822,6 +1932,10 @@ Options: (input attribute: slot_source drive) --mount make tape accessible for OS (input attribute: []) + -r, --remote Send the snapshot backup to a remote machine. The snapshot will be sent via ssh. + You should specify the remote machine's hostname or ip address. The 'root' user + must be permitted to login on the remote machine. + -p, --port The remote port. --update-lastwrite update LastWrite attribute for given TapeName in Pool (JSON-File) (input attribute: [ ) --update-retensiondate update RetensionDate attribute for given TapeName in Pool (JSON-File) @@ -1833,11 +1947,7 @@ Options: -v, --verbose Be verbose on what's going on (min: --verbose=1, max: --verbose=3) --version show program version EOF - #-r, --remote
Send the snapshot backup to a remote machine. The snapshot will be sent via ssh. - # You should specify the remote machine's hostname or ip address. The 'root' user - # must be permitted to login on the remote machine. - #-p, --port The remote port. - # --dry-run perform a trial run where no changes are made. + --dry-run perform a trial run where no changes are made. exit 0 } @@ -1878,17 +1988,27 @@ case $cmd in get_mediapolicy "${mediapool_name}" "${volume_name}" if test $? -eq 0; then if [ $verbose -ge 1 ]; then - printf "${MAGENTA}MediaPolicy for ${GREEN}'%s'${MAGENTA} is:${NO_COLOR} %s.\n" \ + printf "${MAGENTA}MediaPolicy for ${GREEN}'%s'${MAGENTA} is:${NO_COLOR}'%s'.\n" \ "${volume_name}" "${volume_mediapolicy}" fi fi return $? ;; + get-mediapool-name) + get_mediapool_name "${volume_name}" + if test $? -eq 0; then + if [ $verbose -ge 1 ]; then + printf "${MAGENTA}MediaPool name: ${GREEN}'%s'${NO_COLOR}\n" \ + "${mediapool_name}" + fi + fi + return $? + ;; get-mediapools) get_mediapool_names if test $? -eq 0; then if [ $verbose -ge 1 ]; then - printf "${MAGENTA}MediaPool names:${NO_COLOR} %s.\n" \ + printf "${MAGENTA}MediaPool names: ${GREEN}'%s'${NO_COLOR}\n" \ "${mediapool_names}" fi fi @@ -2001,6 +2121,16 @@ case $cmd in fi return $? ;; + ltfs-reformat) + ltfs_reformat "${volume_name}" + if test $? -eq 0; then + if [ $verbose -ge 1 ]; then + printf "${MAGENTA}LTFS Tape reformat: ${GREEN}%s${NO_COLOR}\n" \ + "${volume_name}" + fi + fi + return $? + ;; ltfs-umount) ltfs_umount if test $? -eq 0; then @@ -2014,15 +2144,19 @@ case $cmd in media_change $mediapool_name $volume_name if [ $verbose -ge 1 ]; then if [ ${#volume_name} -ge 1 ]; then - printf "${MAGENTA}Media change in pool: ${GREEN}%s${NO_COLOR} (Volume-Name: ${GREEN}%s${NO_COLOR})\n" \ + printf "${MAGENTA}Media changed in pool: ${GREEN}%s${NO_COLOR} (Volume-Name: ${GREEN}%s${NO_COLOR})\n" \ "${mediapool_name}" "${volume_name}" else - printf "${MAGENTA}Media change in pool: ${GREEN}%s${NO_COLOR}\n" \ + printf "${MAGENTA}Media changed in pool: ${GREEN}%s${NO_COLOR}\n" \ "${mediapool_name}" fi fi return $? ;; + mount) + mount_tape $mediapool_name $volume_name + return $? + ;; mtx-exchange) mtx_exchange "${slot_source}" "${slot_target}" return $? @@ -2055,8 +2189,8 @@ case $cmd in mount_tape "${mediapool_name}" "${volume_name}" if test $? -eq 0; then if [ $verbose -ge 1 ]; then - printf "${MAGENTA}Mount tape ${GREEN}'%s'${MAGENTA} for ${GREEN}'%s'${MAGENTA}: ${NO_COLOR}true.\n" \ - "${volume_name_active}" "${mediapool_name}" + printf "${MAGENTA}Tape ${GREEN}'%s'${MAGENTA} for ${GREEN}'%s'${MAGENTA} mounted${NO_COLOR}\n" \ + "${volume_name}" "${mediapool_name}" fi fi return $?