336 lines
7.8 KiB
Bash
336 lines
7.8 KiB
Bash
#!/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
|
|
|