File qeth_configure of Package s390-tools.10760

#! /bin/sh
#
# qeth_configure
#
# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
#
# Configures a qeth device by calling the IBM-provided chzdev command.
# Whereas this script used to validate the parameters provided to it,
# we now rely on chzdev to do that instead. The script is intended only
# as a "translation layer" to provide backward compatability for older
# scripts and tools that invoke it.
#
# Usage:
#   qeth_configure [-i] [-l] [-f -t <CARDTYPE> ] [-o "Values"] -n <portno> -p <portname> <read chan> <write chan> <data chan> <online>
#
#	-i Configure IP takeover
#	-l Configure Layer2 support
#	-f Override safety checks
#	-t Valid cardtypes are: qeth, hsi - Deprecated
#	-o General QETH options, separated by spaces
#	-n QETH port number to use, 0 or 1. Only needed for real, not virtual
#          devices.
#	-p QETH Portname to use - Deprecated. OSAs no longer need a port name.
#	read/write/data chan = x.y.ssss where
#				  x is always 0 until IBM creates something that
#                                   uses that number
#				  y is the logical channel subsystem (lcss)
#				    number. Most often this is 0, but it could
#                                   be non-zero
#				  ssss is the four digit subchannel address of
#                                      the device, in hexidecimal, with leading
#                                      zeros.
#	online = 0 to take the device offline
#		 1 to bring the device online
#
# Return values:
#   Return codes are determined by the chzdev command.
#

mesg () {
    echo "$@"
}

debug_mesg () {
    case "${DEBUG}" in
	yes) mesg "$@" ;;
	*) ;;
    esac
}

add_cio_channel() {
	echo "$* # ${DATE}" >> /boot/zipl/active_devices.txt
}

remove_cio_channel() {
	[ -w /boot/zipl/active_devices.txt ] && sed -i -e "/^${1}/d" /boot/zipl/active_devices.txt
}

usage(){
  echo "Usage: ${0} [options] <read chan> <write chan> <data chan> <online>"
  echo "      -i Configure IP takeover"
  echo "      -l Configure Layer2 support"
  echo "      -f Override safety checks"
  echo "      -t Valid cardtypes are: qeth, hsi - Deprecated."
  echo "      -o General QETH options, separated by spaces"
  echo "      -n QETH port number to use, 0 or 1. Only needed for real, not virtual"
  echo "         devices."
  echo "      -p QETH Portname to use - Deprecated. OSAs no longer need a port name."
  echo "      read/write/data chan = x.y.ssss where"
  echo "                                x is always 0 until IBM creates something that"
  echo "                                  uses that number"
  echo "                                y is the logical channel subsystem (lcss)"
  echo "                                  number. Most often this is 0, but it could"
  echo "                                  be non-zero"
  echo "                                ssss is the four digit subchannel address of"
  echo "                                     the device, in hexidecimal, with leading"
  echo "                                     zeros."
  echo "      online = 0 to take the device offline"
  echo "               1 to bring the device online"
}

if [ "${DEBUG}" != "yes" ]; then
  DEBUG="no"
fi

DATE=$(date)

############################################################
# Parse the parameters from the command line
#
ARGS=$(getopt --options ifln:o:p:t: -n "qeth_configure" -- "$@")
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

eval set -- "${ARGS}"
debug_mesg "All the parms passed were ${ARGS}"

# Set some defaults
LAYER_MODE="layer2=0"

while true; do
	case "${1}" in
		-i) debug_mesg "Configure IP takeover"
		    PARM_LIST="${PARM_LIST} ipa_takeover/enable=1"
		    shift 1
		    ;;
		-f) debug_mesg "This used to mean udev rules will always be generated."
		    debug_mesg "For chzdev, it means safety checks will be overridden."
		    debug_mesg "Kinda sorta the same thing, really."
		    PARM_LIST="${PARM_LIST} -f"
		    shift 1
		    ;;
		-l) debug_mesg "Configure Layer 2 support"
		    LAYER_MODE="layer2=1"
		    shift 1
		    ;;
		-n) debug_mesg "Set QETH port number to ${2}"
		    PARM_LIST="${PARM_LIST} portno=${2}"
		    shift 2
		    ;;
		-o) debug_mesg "Add the following arbitrary parms: ${2}" 
		    PARM_LIST="${PARM_LIST} ${2}"
		    shift 2
		    ;;
		-p) debug_mesg "QETH Port name is no longer used, don't specify it: ${2}"
		    shift 2
		    ;;
		-t) debug_mesg "This used to set the card type to ${2}"
		    debug_mesg "Now it gets ignored."
		    shift 2
		    ;;
		--) debug_mesg "Found the end of parms indicator: --"
		    shift 1
		    break
		    ;;
		*)  debug_mesg "At the catch-all select entry"
		    debug_mesg "What was selected was ${1}"
		    shift 1
		    ;;
        esac
done

QETH_READ_CHAN=${1}
QETH_WRITE_CHAN=${2}
QETH_DATA_CHAN=${3}
ON_OFF=${4}

if [ -z "${QETH_READ_CHAN}" ] || [ -z "${QETH_WRITE_CHAN}" ] || [ -z "${QETH_DATA_CHAN}" ] || [ -z "${ON_OFF}" ]; then
  mesg "You didn't specify all the needed parameters."
  usage
  exit 1
fi

if [ "${ON_OFF}" == 0 ]; then
  debug_mesg "chzdev -d qeth --no-root-update ${QETH_READ_CHAN}"
  chzdev -d qeth --no-root-update ${QETH_READ_CHAN}
elif [ "${ON_OFF}" == 1 ]; then
  debug_mesg "chzdev -e qeth --no-root-update ${LAYER_MODE} ${PARM_LIST} ${QETH_READ_CHAN}"
  chzdev -e qeth ${LAYER_MODE} --no-root-update ${PARM_LIST} ${QETH_READ_CHAN}
else mesg "You must specify a 0 or a 1 for the online/offline attribute."
     usage
     exit 1
fi

RC=${?}
if [ ${RC} -ne 0 ]; then
  exit ${RC}
fi

if [ ${ON_OFF} == 1 ]; then
  add_cio_channel "${QETH_READ_CHAN},${QETH_WRITE_CHAN},${QETH_DATA_CHAN}"
else remove_cio_channel "${QETH_READ_CHAN}"
     remove_cio_channel "${QETH_WRITE_CHAN}"
     remove_cio_channel "${QETH_DATA_CHAN}"
fi