Bacula/scripts/isworm

85 lines
2.3 KiB
Bash

#!/bin/sh
#
# Copyright (C) 2000-2018 Kern Sibbald
# License: BSD 2-Clause; see file LICENSE-FOSS
#
# Bacula interface to get worm status of tape
#
# isworm %l (control device name)
#
# Typical output:
# sdparm --page=0x1D -f /dev/sg0
# /dev/st0: HP Ultrium 5-SCSI I5AW [tape]
# Medium configuration (SSC) mode page:
# WORMM 1 [cha: n, def: 1, sav: 1]
# WMLR 1 [cha: n, def: 1, sav: 1]
# WMFR 2 [cha: n, def: 2, sav: 2]
#
# Where WORMM is worm mode
# WMLR is worm mode label restrictions
# 0 - No blocks can be overwritten
# 1 - Some types of format labels may not be overwritten
# 2 - All format labels can be overwritten
# WMFR is worm mode filemark restrictions
# 0-1 - Reserved
# 2 - Any number of filemarks immediately preceding EOD can be
# overwritten except file mark closest to BOP (beginning of
# partition).
# 3 - Any number of filemarks immediately preceding the EOD
# can be overwritten
# 4-FF - Reserved
#
if [ x$1 = x ] ; then
echo "First argument missing. Must be device control name."
exit 1
fi
sdparm=`which sdparm`
if [ x${sdparm} = x ] ; then
echo "sdparm program not found, but is required."
exit 0
fi
#
# This should be the correct way to determine if the tape is WORM
# but it does not work for mhvtl. Comment out the next 5 lines
# and the code that follows will detect correctly on mhtvl.
#
worm=`$sdparm --page=0x1D -f $1 |grep " *WORMM"|cut -b12-16|sed "s:^ *::"`
if [ $? = 0 ] ; then
echo $worm
exit 0
fi
tapeinfo=`which tapeinfo`
if [ x${tapeinfo} = x ] ; then
echo "tapeinfo program not found, but is required."
exit 1
fi
#
# Unfortunately IBM and HP handle the Medium Type differently,
# so we detect the vendor and get the appropriate Worm flag.
#
vendor=`$tapeinfo -f $1|grep "^Vendor ID:"|cut -b13-15`
if [ x$vendor = xHP ] ; then
worm=`$tapeinfo -f $1|grep "^Medium Type: 0x"|cut -b16-16`
echo $worm
exit 0
fi
if [ x$vendor = xIBM ] ; then
worm=`$tapeinfo -f $1|grep "^Medium Type: 0x"|cut -b17-17`
if [ x$worm = xc ]; then
echo "1"
exit 0
fi
if [ x$worm = xC ]; then
echo "1"
exit 0
fi
fi
echo "0"
exit 0