$NetBSD: patch-core_platforms_netbsd_chio-changer,v 1.3 2021/08/11 10:24:05 kardel Exp $

	NetBSD changer script using NetBSD chio command

--- core/platforms/netbsd/chio-changer.orig	2021-01-21 10:16:11.945124363 +0000
+++ core/platforms/netbsd/chio-changer
@@ -0,0 +1,134 @@
+#!@TOOLS_PLATFORM.sh@
+#
+# Bareos interface to chio autoloader
+#
+#  If you set in your Device resource
+#
+#  Changer Command = "path-to-this-script/chio-changer %c %o %S %a %d"
+#    you will have the following input to this script:
+#
+#  So Bareos will always call with all the following arguments, even though
+#    in come cases, not all are used.
+#
+#  chio-changer "changer-device" "command" "slot" "archive-device" "drive-index"
+#		   $1		   $2	    $3	      $4	       $5
+#
+#  N.B. If you change the script, take care to return either 
+#   the chio exit code or a 0. If the script exits with a non-zero
+#   exit code, Bareos will assume the request failed.
+
+CHIO=chio
+AWK=@TOOLS_PLATFORM.awk@
+
+# check parameter count on commandline
+check_parm_count() {
+    pCount=$1
+    pCountNeed=$2
+    if test $pCount -lt $pCountNeed; then
+	echo "usage: chio-changer ctl-device command [slot archive-device drive-index]"
+	echo "	Insufficient number of arguments given."
+	if test $pCount -lt 2; then
+	    echo "  Mimimum usage is first two arguments ..."
+	else
+	    echo "  Command expected $pCountNeed arguments"
+	fi
+	exit 1
+    fi
+}
+
+params() {
+ eval $(${CHIO} -f $1 params | ${AWK} '/slots, / { print "slots=" $2 "; drives=" $4 "; picker=" $6 "; portals=" $8 "; totalslots=" ($2+$8) "; portalbase=" $2;}')
+ if [ "x$slots" = "x" ]; then
+   echo "unable to get changer parameters"
+   exit 1
+ fi
+}
+
+# Check for special cases where only 2 arguments are needed, 
+# all others are a minimum of 5
+case $2 in
+    list|listall)
+	check_parm_count $# 2
+	;;
+    slots)
+	check_parm_count $# 2
+	;;
+    transfer)
+	check_parm_count $# 3
+	;;
+    *)
+	check_parm_count $# 5
+	;;
+esac
+
+
+# Setup arguments
+ctl=$1
+cmd="$2"
+slot=${3+`expr $3 - 1`}
+device=$4
+drive=$5
+
+params $ctl
+
+case $cmd in 
+   unload)
+      ${CHIO} -f $ctl move drive $drive slot $slot
+      exit $?
+      ;;
+
+   load)
+      ${CHIO} -f $ctl move slot $slot drive $drive
+      exit $?
+      ;;
+
+   list) 
+      ${CHIO} -f $ctl status voltags | ${AWK} -v portalbase=$portalbase ' \
+		/^(slot|drive) .*ACCESS.*FULL/ { if (slot != "") { print slot tag; } slot=($2+1) ":"; next; } \
+		/^(slot|drive)/       { if (slot != "") { print slot tag; } slot=""; next; } \
+		/^portal .*ACCESS.*FULL/ { if (slot != "") { print slot tag; } slot=($2+1+portalbase) ":"; next; } \
+		/^portal/       { if (slot != "") { print slot tag; } slot=""; next; } \
+		/Primary volume tag:/ { tag=$4; next;} \
+		/From: slot/ { slot=($3+1) ":"; next;} \
+		END { if (slot != "") { print slot tag; } } \
+      '
+      ;;
+
+   listall) 
+      ${CHIO} -f $ctl status voltags | ${AWK} -v portalbase=$portalbase ' \
+		BEGIN { t["slot"] = "S"; t["drive"] = "D"; t["portal"] = "I"; state = "E"; type = "?";} \
+		/^(slot|drive) [0-9]+: <.*ACCESS.*FULL/ { if (slot != "") { print type ":" slot ":" state tag; } slot=($2+1); type = t[$1]; state = "F"; next; } \
+		/^(slot|drive) [0-9]+: <.*ACCESS/       { if (slot != "") { print type ":" slot ":" state tag; } slot=($2+1); type = t[$1]; state = "E"; next; } \
+		/^portal [0-9]+: <.*(INEAB|EXENAB).*ACCESS.*FULL/       { if (slot != "") { print type ":" slot ":" state tag; } slot=($2+1+portalbase); type = t[$1]; state = "F"; next; } \
+		/^portal [0-9]+: <.*(INEAB|EXENAB).*ACCESS/       { if (slot != "") { print type ":" slot ":" state tag; } slot=($2+1+portalbase); type = t[$1]; state = "E"; next; } \
+		/Primary volume tag:/                 { if (NF > 5) { tag=":" $4; } else { tag=""; } next;} \
+		/From: slot/                          { if (type == "D") { state = state ":" ($3+1); } next;} \
+		END { if (slot != "") { print type ":" slot ":" state tag; } } \
+      '
+      ;;
+
+   loaded)
+      ${CHIO} -f $ctl status drive $drive | ${AWK} 'BEGIN { from=0 }\
+		/From:/{ from=$3+1; }\
+		END { print from }'
+      ;;
+
+   slots)
+      echo $totalslots
+      ;;
+
+   transfer)
+      if [ $slot -ge $portalbase ]; then
+        src="portal $(($slot - $portalbase))"
+      else
+        src="slot $slot"
+      fi
+      if [ $device -gt $portalbase ]; then
+        tgt="portal $(($device - $portalbase - 1))"
+      else
+        tgt="slot $(($device - 1))"
+      fi
+      ${CHIO} -f $ctl move $src $tgt
+      exit $?
+      ;;
+esac
