File lgr_check of Package s390-tools

#!/bin/sh

function check_sysoper(){
local SYSOPER=$(vmcp q sysoper | cut -f4 -d" ")
local USERID=$(vmcp q userid | cut -f1 -d" ")"."
if [ "${SYSOPER}" == "${USERID}" ]; then
return 0
else return 1
fi
}

function check_disc(){
local USERID=$(vmcp q userid | cut -f1 -d" ")
local DISCONNECTED=$(vmcp q ${USERID} | cut -f2 -d-)
if [ "${DISCONNECTED}" == " DSC" ]; then
  return 1
else return 0
fi
}

function check_3270(){
local CONMODE=$(vmcp q term | sed -n -e '/CONMODE/ {s/CONMODE \([0-9]*\), .*$/\1/;p}')
if [ "${CONMODE}" == "3270" ]; then
  return 0
else return 1
fi
}

function check_graf(){
local GRAF
GRAF=$(vmcp -b 1048576 q v graf 2>/dev/null | grep -v "^CONS" | grep "ON LDEV" )
if [ ${?} -eq 0 ] && [ -n "${GRAF}" ]; then
  return 0
else return 1
fi
}

function check_ascii_console(){
local SYSASCII=$(vmcp q v sysascii 2>/dev/null | grep "not attached to you")
if [ -z "${SYSASCII}" ]; then
  return 0
else return 1
fi
}

function check_tdisk(){
local TDISK=$(vmcp -b 1048576 q v dasd 2>/dev/null | grep TEMP)
if [ -n "${TDISK}" ]; then
  return 0
else return 1
fi
}

function check_ctc(){
local CTC
CTC=$(vmcp -b 1048576 q v ctc 2>/dev/null)
if [ ${?} -eq 0 ]; then
  return 0
else return 1
fi
}

function check_dynamic_switch(){
local SWCH
SWCH=$(vmcp -b 1048576 q v switches 2>/dev/null)
if [ ${?} -eq 0 ]; then
  return 0
else return 1
fi
}

function check_maint_mdisks(){
local MDISKS
MDISKS=$(vmcp -b 1048576 q v dasd | grep -E "0190|0191|0193|019D|019E")
if [ -n "${MDISKS}" ]; then
  return 0
else return 1
fi
}

function check_wrkalleg(){
local WRKALLEG
WRKALLEG=$(vmcp -b 1048576 q wrkalleg | grep "is not simulated")
if [ -z "${WRKALLEG}" ]; then
  return 0
else return 1
fi
}

function check_isolated_vswitch(){
local ISOLATED=0
local VSWITCH

# Find out if we have any NICs coupled to any VSWITCH or not. If not, we're OK.
VSWITCH=$(vmcp -b 1048576 q nic | sed -e '1~2 {N;s/\n//;}' | grep VSWITCH)
if [ -z "${VSWITCH}" ]; then
  return 1
fi

ISOLATED=$(vmcp -b 1048576 q nic | sed -e '1~2 {N;s/\n//;}' | \
     grep VSWITCH | \
     sed -e 's/^.* VSWITCH: //' | \
     while read owner name
	do VSWITCH=$(vmcp -b 1048576 q vswitch $name | grep RDEV)
	   if [ -z "${VSWITCH}" ]; then
		echo 1
           fi
       done)

if [ "${ISOLATED}" == "1" ]; then
  return 0
else return 1
fi
}

function check_chpidvirt(){
local CHPIDV
CHPIDV=$(vmcp q chpidv 2>/dev/null | grep "CHPID Virtualization is on")
if [ -z "${CHPIDV}" ]; then
  return 0
else return 1
fi
}

function check_pci_functions(){
local PCIF
local RETCODE
PCIF=$(vmcp -b 1048576 q v pcif 2>/dev/null | grep "A PCI function was not found.")
RETCODE=${?}
if [ ${RETCODE} -eq 0 ] && [ -z "${PCIF}" ]; then
  return 0
else return 1
fi
}

function check_tape_assign(){
local TAPES
local RETCODE=1
TAPES=$(vmcp -b 1048576 q v tapes 2>/dev/null | grep "Device TAPE does not exist")
if [ -n "${TAPES}" ]; then
  return 1
fi

TAPES=$(vmcp -b 1048576 q v tapes 2>/dev/null | grep "NOASSIGN")
if [ -n "${TAPES}" ]; then
  return 0
else return 1
fi
}

function check_open_spool(){
local QSPOOL
local OPENSPOOL=0
QSPOOL=$(vmcp -b 1048576 q pun \* all 2>/dev/null | grep "OPEN")
if [ -n "${QSPOOL}" ]; then
  let OPENSPOOL=1
fi

QSPOOL=$(vmcp -b 1048576 q prt \* all 2>/dev/null | grep "OPEN" | grep -v " CON ")
if [ -n "${QSPOOL}" ]; then
  let OPENSPOOL=1
fi

if [ ${OPENSPOOL} -eq 1 ]; then
  return 0
else return 1
fi
}

function check_xstore(){
local XSTOR
XSTOR=$(vmcp -b 1048576 q v xstor 2>/dev/null | grep "XSTORE = none")
if [ -z "${XSTOR}" ]; then
  return 0
else return 1
fi
}

function check_iucv(){
local QIUCV
QIUCV=$(vmcp -b 1048576 q iucv 2>/dev/null | grep -vE "^No IUCV paths exist|^Source| *MSG| *MSGALL")
if [ -n "${QIUCV}" ]; then
  return 0
else return 1
fi
}

function usage(){
  echo "Usage: ${0} [ -f ] [ -h ] devno|busid"
  echo "        -q      Don't generate any output, just set a return code."
  echo "        -m      Suppress the check for local minidisks."
  echo "                Only use this if you know for certain all minidisks for this"
  echo "                guest are NOT local to this instance of z/VM."
  echo "        -h      Display this help message."
}

ARCH="$(/bin/uname -m)"
if [ "${ARCH}" != "s390x" ] && [ "${ARCH}" != "s390" ]; then
  echo "This script is only useful on IBM mainframes."
  exit 1
fi

HYPERVISOR=$(systemd-detect-virt)
if [ "${HYPERVISOR}" != "zvm" ]; then
  echo "This script is only useful for guests of the z/VM hypervisor."
  exit 1
fi

MDISK_SUPPRESS=0
msg="echo"

############################################################
# Parse the parameters from the command line
#
ARGS=$(getopt -a --options qhm -n "lgr_check" -- "$@")
if [ $? -ne 0 ]; then
  usage
  exit 3
fi

eval set -- "${ARGS}"
for ARG; do
        case "${ARG}" in
                -h) usage;
		    exit 0
		    ;;
                -m) let MDISK_SUPPRESS=1;
                    shift 1
                    ;;
                -q) msg="/bin/true"
                    shift 1
                    ;;
                --) shift 1
                    ;;
                *) ${msg} "Extraneous input detected: ${1}"
                   shift 1
                   ;;
        esac
done


let FAIL=0
##let COLS=$(stty -a | sed -n -e '/columns/{s/^.*columns \([0-9]*\);.*$/\1/;p}')

if [ ! -c /dev/vmcp ]; then
  ${msg} "Cannot find /dev/vmcp to issue z/VM CP commands."
  exit 1
fi

${msg} "Checking for conditions that might prevent Live Guest Relocation"

if check_chpidvirt; then
  ${msg} "This guest does not have CHPID Virtualization set for it in the CP directory."
  ${msg} "Live Guest Relocation is absolutely not possible for this guest."
  # exit 99
  let FAIL=1
fi
if check_sysoper ; then
  ${msg} "This guest is currently the z/VM system operator."
  let FAIL=1
fi
let GUEST_CONN=0
if check_disc; then
  ${msg} "The guest is not running disconnected."
  let GUEST_CONN=1
  let FAIL=1
fi
if check_3270; then
  ${msg} -n "The guest has a 3270 console, "
  if [ ${GUEST_CONN} -eq 0 ]; then
    ${msg} "but it is not currently in use."
  else ${msg} "and it is currently in use."
       let FAIL=1
  fi
fi
if check_graf; then
  ${msg} "The guest has a DIALED 3270 device in current use."
  let FAIL=1
fi
if check_ascii_console; then
  ${msg} "The guest has the ASCII console attached to it."
  let FAIL=1
fi
if check_tdisk; then
  ${msg} "The guest has a temporary disk (T-disk) attached to it."
  let FAIL=1
fi
if check_ctc; then
  ${msg} "The guest has a Channel-to-Channel device (CTC) attached to it."
  let FAIL=1
fi
if check_dynamic_switch; then
  ${msg} "The guest has a dynamic switching device attached to it."
  let FAIL=1
fi
if check_wrkalleg; then
  ${msg} "The guest is currently using virtual working allegiance."
  let FAIL=1
fi
if [ ${MDISK_SUPPRESS} -eq 0 ] && check_maint_mdisks; then
  ${msg} "The guest currently has one or more Minidisks that might be local to this instance of z/VM."
  let FAIL=1
fi
if check_isolated_vswitch; then
  ${msg} "The guest is currently coupled to an isolated VSWITCH."
  let FAIL=1
fi
if check_pci_functions; then
  ${msg} "The guest has PCI functions available to it."
  let FAIL=1
fi
if check_tape_assign; then
  ${msg} "The guest has potential problems with a tape."
  let FAIL=1
fi
if check_open_spool; then
  ${msg} "The guest has an open SPOOL file that is not from the virtual console."
  let FAIL=1
fi
if check_xstore; then
  ${msg} "The guest has Expanded Storage attached to it."
  let FAIL=1
fi
if check_iucv; then
  ${msg} "The guest has an IUCV connection to a z/VM system service or another z/VM user."
  let FAIL=1
fi

if [ ${FAIL} == 1 ]; then
  ${msg} "The guest is currently not eligible for Live Guest Relocation."
  exit 1
else ${msg} "As far as can be determined from within the guest, it is currently eligible for Live Guest Relocation."
     ${msg} "This is not a guarantee.  Other factors that cannot be checked from within the guest may prevent it from being eligible for LGR."
fi

openSUSE Build Service is sponsored by