1b2398200SPatrick Williams#!/bin/bash -e 279f697e0SAnthony Wilson 379f697e0SAnthony Wilsonset -euo pipefail 479f697e0SAnthony Wilson 5189cf248SAnthony WilsonOPTS="bmcstate,bootprogress,chassiskill,chassisoff,chassison,chassisstate,hoststate,\ 6a65d30d1SVishwanatha Subbannaosstate,power,poweroff,poweron,state,status,hostrebootoff,hostrebooton,recoveryoff,recoveryon,\ 7ad1afe58SAndrew Geisslerbmcrebootoff, bmcrebooton, listbootblock listlogs showlog deletelogs, stopofftargets" 80f35983dSAnthony Wilson 90e044c48SPotin LaiUSAGE="Usage: obmcutil [-h] [--wait] [--verbose] [--id=<INSTANCE_ID>] 100f35983dSAnthony Wilson{$OPTS}" 1179f697e0SAnthony Wilson 1279f697e0SAnthony WilsonINTERFACE_ROOT=xyz.openbmc_project 1379f697e0SAnthony WilsonSTATE_INTERFACE=$INTERFACE_ROOT.State 146d3a2c54SVishwanatha SubbannaCONTROL_INTERFACE=$INTERFACE_ROOT.Control 1579f697e0SAnthony Wilson 1679f697e0SAnthony WilsonOBJECT_ROOT=/xyz/openbmc_project 1779f697e0SAnthony WilsonSTATE_OBJECT=$OBJECT_ROOT/state 186d3a2c54SVishwanatha SubbannaCONTROL_OBJECT=$OBJECT_ROOT/control 1979f697e0SAnthony Wilson 207a787dd7SVishwanatha SubbannaHOST_TIMEOUT_TARGET=obmc-host-timeout@0.target 2184b3b29eSVishwanatha SubbannaHOST_CRASH_TARGET=obmc-host-crash@0.target 227a787dd7SVishwanatha Subbanna 23*ff6af28dSAndrew Geissler## NOTE: By declaring these globally instead of passing them through the 24acf54d08SAnthony Wilson## intermediary functions, which may not be "best practice", the readability 25acf54d08SAnthony Wilson## and cleanliness of the code should at least be increased. 26acf54d08SAnthony Wilson 27acf54d08SAnthony Wilson# The command passed in to be executed (e.g. poweron/off, status, etc.) 28acf54d08SAnthony Wilson# This will be be used in some instances of error reporting 29acf54d08SAnthony WilsonG_ORIG_CMD= 30acf54d08SAnthony Wilson# The state an interface should be in after executing the requested command. 31acf54d08SAnthony WilsonG_REQUESTED_STATE= 32acf54d08SAnthony Wilson# The query to run during a poweron/off or chassison/off to check that 33acf54d08SAnthony Wilson# the requested state (G_REQUESTED_STATE) of the interface has been reached. 34acf54d08SAnthony WilsonG_QUERY= 35acf54d08SAnthony Wilson# Wait the set period of time for state transitions to be successful before 36acf54d08SAnthony Wilson# continuing on with the program or reporting an error if timeout reached. 37acf54d08SAnthony WilsonG_WAIT= 3860c3ac8cSAndrew Jeffery# Print the journal to the console 3960c3ac8cSAndrew JefferyG_VERBOSE= 400e044c48SPotin Lai# Instance id, default 0 410e044c48SPotin LaiG_INSTANCE_ID="0" 42*ff6af28dSAndrew Geissler# Force a command even if system state is not correct 43*ff6af28dSAndrew GeisslerG_FORCE= 44acf54d08SAnthony Wilson 45d182bff5SPatrick Williamsfunction print_help() 46f3f16fa9SAnthony Wilson{ 47f3f16fa9SAnthony Wilson echo "$USAGE" 48f3f16fa9SAnthony Wilson echo "" 49f3f16fa9SAnthony Wilson echo "positional arguments:" 500f35983dSAnthony Wilson echo " {$OPTS}" 51f3f16fa9SAnthony Wilson echo "" 526d3a2c54SVishwanatha Subbanna echo "Examples:" 536d3a2c54SVishwanatha Subbanna echo "" 54a65d30d1SVishwanatha Subbanna echo "obmcutil hostrebootoff Disable auto reboot of Host from Quiesce state" 553191be88SAndrew Geissler echo "obmcutil hostrebootoffonetime Disable auto reboot of Host from" 563191be88SAndrew Geissler echo " Quiesce state for a single boot" 57a65d30d1SVishwanatha Subbanna echo "obmcutil hostrebooton Enable auto reboot of Host from Quiesce state" 58a65d30d1SVishwanatha Subbanna echo "" 59a65d30d1SVishwanatha Subbanna echo "obmcutil bmcrebootoff Disable reboot of BMC" 60a65d30d1SVishwanatha Subbanna echo "obmcutil bmcrebooton Enable reboot of BMC" 616d3a2c54SVishwanatha Subbanna echo "" 6284b3b29eSVishwanatha Subbanna echo "obmcutil recoveryoff Disable handling boot watchdog timeout and host crash" 63a65d30d1SVishwanatha Subbanna echo " Also, disable BMC and Host auto reboots" 64a65d30d1SVishwanatha Subbanna echo "" 6584b3b29eSVishwanatha Subbanna echo "obmcutil recoveryon Enable handling boot watchdog timeout and host crash" 66a65d30d1SVishwanatha Subbanna echo " Also, enable BMC and Host auto reboots" 677a787dd7SVishwanatha Subbanna echo "" 6824b25a46SAnusha Dathatri echo "obmcutil recoverystatus Display the status of handling boot watchdog timeout and host crash" 6924b25a46SAnusha Dathatri echo " and also the status of BMC and Host auto reboots setting" 7024b25a46SAnusha Dathatri echo "" 713b7b5619SAndrew Geissler echo "obmcutil listbootblock Check for and list any errors blocking the boot" 723b7b5619SAndrew Geissler echo " of the system" 733b7b5619SAndrew Geissler echo "" 74295ee4fbSAndrew Geissler echo "obmcutil listlogs List all phosphor-logging entries on the" 75295ee4fbSAndrew Geissler echo " system" 76295ee4fbSAndrew Geissler echo "" 77d8c63204SAndrew Geissler echo "obmcutil showlog <log> Display details of input log. Format of <log>" 78d8c63204SAndrew Geissler echo " should match listlogs output" 79d8c63204SAndrew Geissler echo "" 8042f2898dSAndrew Geissler echo "obmcutil deletelogs Delete all phosphor-logging entries from" 8142f2898dSAndrew Geissler echo " system" 82ad1afe58SAndrew Geissler echo "obmcutil stopofftargets Manually stop all obmc targets in power off" 83ad1afe58SAndrew Geissler echo " path" 8442f2898dSAndrew Geissler echo "" 85d8779cd8SAndrew Geissler echo "optional arguments (must precede the positional options above):" 86f3f16fa9SAnthony Wilson echo " -h, --help show this help message and exit" 87acf54d08SAnthony Wilson echo " -w, --wait block until state transition succeeds or fails" 8860c3ac8cSAndrew Jeffery echo " -v, --verbose print the journal to stdout if --wait is supplied" 890e044c48SPotin Lai echo " -i, -id instance id, default 0" 90*ff6af28dSAndrew Geissler echo " -f, --force force issuing the command ignoring preconditions (use with caution)" 91f3f16fa9SAnthony Wilson exit 0 92f3f16fa9SAnthony Wilson} 93f3f16fa9SAnthony Wilson 94d182bff5SPatrick Williamsfunction run_timeout() 95acf54d08SAnthony Wilson{ 96acf54d08SAnthony Wilson local timeout="$1"; shift 97b2398200SPatrick Williams local cmd="$*" 9860c3ac8cSAndrew Jeffery local verbose_child= 9960c3ac8cSAndrew Jeffery 1002869a926SAndrew Jeffery if [ -n "$G_VERBOSE" ]; then 10160c3ac8cSAndrew Jeffery journalctl -f & 10260c3ac8cSAndrew Jeffery verbose_child=$! 10360c3ac8cSAndrew Jeffery fi 104acf54d08SAnthony Wilson 105acf54d08SAnthony Wilson $cmd 106acf54d08SAnthony Wilson 107acf54d08SAnthony Wilson # Run a background query for the transition to the expected state 108acf54d08SAnthony Wilson # This will be killed if the transition doesn't succeed within 109acf54d08SAnthony Wilson # a timeout period. 110acf54d08SAnthony Wilson ( 111b2398200SPatrick Williams while ! grep -q "$G_REQUESTED_STATE" <<< "$(handle_cmd "$G_QUERY")" ; do 112acf54d08SAnthony Wilson sleep 1 113acf54d08SAnthony Wilson done 114acf54d08SAnthony Wilson ) & 11560c3ac8cSAndrew Jeffery wait_child=$! 116acf54d08SAnthony Wilson 117acf54d08SAnthony Wilson # Could be bad if process is killed before 'timeout' occurs if 118acf54d08SAnthony Wilson # transition doesn't succeed. 119acf54d08SAnthony Wilson trap -- "" SIGTERM 120acf54d08SAnthony Wilson 121acf54d08SAnthony Wilson # Workaround for lack of 'timeout' command. 122acf54d08SAnthony Wilson ( 123b2398200SPatrick Williams sleep "$timeout" 12460c3ac8cSAndrew Jeffery kill $wait_child 125acf54d08SAnthony Wilson ) > /dev/null 2>&1 & 126acf54d08SAnthony Wilson 12760c3ac8cSAndrew Jeffery if ! wait $wait_child; then 128acf54d08SAnthony Wilson echo "Unable to confirm '$G_ORIG_CMD' success" \ 129acf54d08SAnthony Wilson "within timeout period (${timeout}s)" 130acf54d08SAnthony Wilson fi 13160c3ac8cSAndrew Jeffery 1328be70293SAndrew Jeffery if [ -n "$verbose_child" ]; then 13360c3ac8cSAndrew Jeffery kill $verbose_child 13460c3ac8cSAndrew Jeffery fi 135acf54d08SAnthony Wilson} 136acf54d08SAnthony Wilson 137d182bff5SPatrick Williamsfunction run_cmd() 138acf54d08SAnthony Wilson{ 139b2398200SPatrick Williams local cmd="$*"; 140acf54d08SAnthony Wilson 141acf54d08SAnthony Wilson if [ -n "$G_WAIT" ]; then 142b2398200SPatrick Williams run_timeout "$G_WAIT" "$cmd" 143acf54d08SAnthony Wilson else 144acf54d08SAnthony Wilson $cmd 145acf54d08SAnthony Wilson fi 146acf54d08SAnthony Wilson} 147acf54d08SAnthony Wilson 148d182bff5SPatrick Williamsfunction set_property() 1493ae0a354SAnthony Wilson{ 150acf54d08SAnthony Wilson run_cmd busctl set-property "$@" 1513ae0a354SAnthony Wilson} 1523ae0a354SAnthony Wilson 153d182bff5SPatrick Williamsfunction get_property() 15479f697e0SAnthony Wilson{ 155acf54d08SAnthony Wilson G_WAIT="" 156acf54d08SAnthony Wilson run_cmd busctl get-property "$@" 15779f697e0SAnthony Wilson} 15879f697e0SAnthony Wilson 159d182bff5SPatrick Williamsfunction state_query() 16079f697e0SAnthony Wilson{ 161b2398200SPatrick Williams local state 162b2398200SPatrick Williams state=$(get_property "$@" | cut -d '"' -f2) 163b2398200SPatrick Williams printf "%-20s: %s\n" "$4" "$state" 16479f697e0SAnthony Wilson} 16579f697e0SAnthony Wilson 166d182bff5SPatrick Williamsfunction print_usage_err() 167ea87db40SAnthony Wilson{ 168ea87db40SAnthony Wilson echo "ERROR: $1" >&2 169ea87db40SAnthony Wilson echo "$USAGE" 170ea87db40SAnthony Wilson exit 1 171ea87db40SAnthony Wilson} 172ea87db40SAnthony Wilson 173d182bff5SPatrick Williamsfunction mask_systemd_target() 1747a787dd7SVishwanatha Subbanna{ 175b2398200SPatrick Williams target="$*" 176b2398200SPatrick Williams systemctl mask "$target" 1777a787dd7SVishwanatha Subbanna} 1787a787dd7SVishwanatha Subbanna 179d182bff5SPatrick Williamsfunction unmask_systemd_target() 1807a787dd7SVishwanatha Subbanna{ 181b2398200SPatrick Williams target="$*" 182b2398200SPatrick Williams systemctl unmask "$target" 1837a787dd7SVishwanatha Subbanna} 1847a787dd7SVishwanatha Subbanna 18524b25a46SAnusha Dathatrifunction get_systemd_target_state() 18624b25a46SAnusha Dathatri{ 18724b25a46SAnusha Dathatri target="$*" 18824b25a46SAnusha Dathatri enabled_state=$(systemctl is-enabled "$target") 18924b25a46SAnusha Dathatri echo "$enabled_state" 19024b25a46SAnusha Dathatri} 19124b25a46SAnusha Dathatri 192d182bff5SPatrick Williamsfunction disable_bmc_reboot() 193a65d30d1SVishwanatha Subbanna{ 194a65d30d1SVishwanatha Subbanna dir="/run/systemd/system/" 195a65d30d1SVishwanatha Subbanna file="reboot-guard.conf" 196a65d30d1SVishwanatha Subbanna units=("reboot" "poweroff" "halt") 197a65d30d1SVishwanatha Subbanna 198a65d30d1SVishwanatha Subbanna for unit in "${units[@]}"; do 199b2398200SPatrick Williams mkdir -p "${dir}${unit}.target.d" 200b2398200SPatrick Williams echo -e "[Unit]\nRefuseManualStart=yes" >> "${dir}${unit}.target.d/${file}" 201a65d30d1SVishwanatha Subbanna done 202a65d30d1SVishwanatha Subbanna} 203a65d30d1SVishwanatha Subbanna 204d182bff5SPatrick Williamsfunction enable_bmc_reboot() 205a65d30d1SVishwanatha Subbanna{ 206a65d30d1SVishwanatha Subbanna dir="/run/systemd/system/" 207a65d30d1SVishwanatha Subbanna file="reboot-guard.conf" 208a65d30d1SVishwanatha Subbanna units=("reboot" "poweroff" "halt") 209a65d30d1SVishwanatha Subbanna 210a65d30d1SVishwanatha Subbanna for unit in "${units[@]}"; do 211b2398200SPatrick Williams rm -rf "${dir}${unit}.target.d/${file}" 212b2398200SPatrick Williams rm -rf "${dir}${unit}.target.d" 213a65d30d1SVishwanatha Subbanna done 214a65d30d1SVishwanatha Subbanna} 215a65d30d1SVishwanatha Subbanna 21624b25a46SAnusha Dathatrifunction get_bmc_reboot_status() 21724b25a46SAnusha Dathatri{ 21824b25a46SAnusha Dathatri dir="/run/systemd/system/" 21924b25a46SAnusha Dathatri file="reboot-guard.conf" 22024b25a46SAnusha Dathatri units=("reboot" "poweroff" "halt") 22124b25a46SAnusha Dathatri 22224b25a46SAnusha Dathatri # if file do 22324b25a46SAnusha Dathatri for unit in "${units[@]}"; do 22424b25a46SAnusha Dathatri if [ -e "${dir}${unit}.target.d/${file}" ]; then 22524b25a46SAnusha Dathatri echo "off" 22624b25a46SAnusha Dathatri return 0 22724b25a46SAnusha Dathatri fi 22824b25a46SAnusha Dathatri done 22924b25a46SAnusha Dathatri echo "on" 23024b25a46SAnusha Dathatri return 0 23124b25a46SAnusha Dathatri} 23224b25a46SAnusha Dathatri 23324b25a46SAnusha Dathatrifunction get_host_reboot_status() 23424b25a46SAnusha Dathatri{ 23524b25a46SAnusha Dathatri OBJECT=$CONTROL_OBJECT/host$G_INSTANCE_ID/auto_reboot 23624b25a46SAnusha Dathatri SERVICE=$(mapper get-service "$OBJECT") 23724b25a46SAnusha Dathatri INTERFACE=$CONTROL_INTERFACE.Boot.RebootPolicy 23824b25a46SAnusha Dathatri PROPERTY=AutoReboot 23924b25a46SAnusha Dathatri output="$(get_property "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY)" 24024b25a46SAnusha Dathatri echo "${output//b /}" 24124b25a46SAnusha Dathatri} 24224b25a46SAnusha Dathatri 2433b7b5619SAndrew Geissler# will write blocking errors to stdout 244d182bff5SPatrick Williamsfunction check_boot_block_errors() 2453b7b5619SAndrew Geissler{ 2463b7b5619SAndrew Geissler # array of boot block objects 2473b7b5619SAndrew Geissler blockArray=() 2483b7b5619SAndrew Geissler 2493b7b5619SAndrew Geissler # Look for any objects under logging that implement the 2503b7b5619SAndrew Geissler # xyz.openbmc_project.Logging.ErrorBlocksTransition 2513b7b5619SAndrew Geissler subtree="$(busctl call xyz.openbmc_project.ObjectMapper \ 2523b7b5619SAndrew Geissler /xyz/openbmc_project/object_mapper \ 2533b7b5619SAndrew Geissler xyz.openbmc_project.ObjectMapper \ 2543b7b5619SAndrew Geissler GetSubTree sias "/xyz/openbmc_project/logging/" 0 1 \ 2553b7b5619SAndrew Geissler xyz.openbmc_project.Logging.ErrorBlocksTransition)" 2563b7b5619SAndrew Geissler 2573b7b5619SAndrew Geissler # remove quotation marks 258b2398200SPatrick Williams # shellcheck disable=SC2001 259b2398200SPatrick Williams subtree="$(echo "$subtree" | sed 's/\"//g')" 2603b7b5619SAndrew Geissler 2613b7b5619SAndrew Geissler for entry in $subtree; do 2623b7b5619SAndrew Geissler if [[ ${entry} =~ "xyz/openbmc_project/logging/block"* ]]; then 263b2398200SPatrick Williams blockArray+=( "$entry" ) 2643b7b5619SAndrew Geissler fi 2653b7b5619SAndrew Geissler done 2663b7b5619SAndrew Geissler 2673b7b5619SAndrew Geissler # now find associated error log for each boot block error 2683b7b5619SAndrew Geissler for berror in "${blockArray[@]}"; do 269b2398200SPatrick Williams assocs="$(busctl call xyz.openbmc_project.Logging "$berror" \ 2703b7b5619SAndrew Geissler org.freedesktop.DBus.Properties Get \ 2713b7b5619SAndrew Geissler ss xyz.openbmc_project.Association.Definitions Associations)" 2723b7b5619SAndrew Geissler 2733b7b5619SAndrew Geissler # remove quotation marks 274b2398200SPatrick Williams # shellcheck disable=SC2001 275b2398200SPatrick Williams assocs="$(echo "$assocs" | sed 's/\"//g')" 2763b7b5619SAndrew Geissler 2773b7b5619SAndrew Geissler for entry in $assocs; do 2783b7b5619SAndrew Geissler if [[ ${entry} =~ "xyz/openbmc_project/logging/entry"* ]]; then 2793b7b5619SAndrew Geissler echo "Blocking Error: $entry" 2803b7b5619SAndrew Geissler fi 2813b7b5619SAndrew Geissler done 2823b7b5619SAndrew Geissler done 2833b7b5619SAndrew Geissler} 2843b7b5619SAndrew Geissler 285*ff6af28dSAndrew Geissler# check if system is in transitioning state for chassis or host and 286*ff6af28dSAndrew Geissler# reject request if it is (if force option not set) 287*ff6af28dSAndrew Geisslerfunction check_chassis_host_states() 288*ff6af28dSAndrew Geissler{ 289*ff6af28dSAndrew Geissler # If user has --force enabled, no check 290*ff6af28dSAndrew Geissler if [ -n "$G_FORCE" ]; then 291*ff6af28dSAndrew Geissler return 0 292*ff6af28dSAndrew Geissler fi 293*ff6af28dSAndrew Geissler 294*ff6af28dSAndrew Geissler OBJECT=$STATE_OBJECT/chassis$G_INSTANCE_ID 295*ff6af28dSAndrew Geissler SERVICE=$(mapper get-service "$OBJECT") 296*ff6af28dSAndrew Geissler INTERFACE=$STATE_INTERFACE.Chassis 297*ff6af28dSAndrew Geissler PROPERTY=CurrentPowerState 298*ff6af28dSAndrew Geissler state=$(get_property "$SERVICE" "$OBJECT" "$INTERFACE $PROPERTY" | cut -d '"' -f2) 299*ff6af28dSAndrew Geissler if [[ ${state} =~ "xyz.openbmc_project.State.Chassis.PowerState.Transitioning"* ]]; then 300*ff6af28dSAndrew Geissler echo "Chassis is $state, request rejected, use --force to override" 301*ff6af28dSAndrew Geissler exit 1 302*ff6af28dSAndrew Geissler fi 303*ff6af28dSAndrew Geissler 304*ff6af28dSAndrew Geissler OBJECT=$STATE_OBJECT/host$G_INSTANCE_ID 305*ff6af28dSAndrew Geissler SERVICE=$(mapper get-service "$OBJECT") 306*ff6af28dSAndrew Geissler INTERFACE=$STATE_INTERFACE.Host 307*ff6af28dSAndrew Geissler PROPERTY=CurrentHostState 308*ff6af28dSAndrew Geissler state=$(get_property "$SERVICE" "$OBJECT" "$INTERFACE $PROPERTY" | cut -d '"' -f2) 309*ff6af28dSAndrew Geissler if [[ ${state} =~ "xyz.openbmc_project.State.Host.HostState.Transitioning"* ]]; then 310*ff6af28dSAndrew Geissler echo "Host is $state, request rejected, use --force to override" 311*ff6af28dSAndrew Geissler exit 1 312*ff6af28dSAndrew Geissler fi 313*ff6af28dSAndrew Geissler} 314*ff6af28dSAndrew Geissler 315deb6bb45SAndrew Geissler# helper function to check for boot block errors and notify user 316d182bff5SPatrick Williamsfunction check_and_warn_boot_block() 317deb6bb45SAndrew Geissler{ 318deb6bb45SAndrew Geissler blockingErrors=$(check_boot_block_errors) 319b2398200SPatrick Williams if [ -n "$blockingErrors" ]; then 320deb6bb45SAndrew Geissler echo !!!!!!!!!! 321deb6bb45SAndrew Geissler echo "WARNING! System has blocking errors that will prevent boot" 322deb6bb45SAndrew Geissler echo "$blockingErrors" 323deb6bb45SAndrew Geissler echo !!!!!!!!!! 324deb6bb45SAndrew Geissler fi 325deb6bb45SAndrew Geissler} 326deb6bb45SAndrew Geissler 327295ee4fbSAndrew Geissler# list all phosphor-logging entries 328d182bff5SPatrick Williamsfunction list_logs() 329295ee4fbSAndrew Geissler{ 330295ee4fbSAndrew Geissler # Look for any objects under logging that implement the 331295ee4fbSAndrew Geissler # xyz.openbmc_project.Logging.Entry 332295ee4fbSAndrew Geissler busctl -j call xyz.openbmc_project.ObjectMapper \ 333295ee4fbSAndrew Geissler /xyz/openbmc_project/object_mapper \ 334295ee4fbSAndrew Geissler xyz.openbmc_project.ObjectMapper \ 335295ee4fbSAndrew Geissler GetSubTreePaths sias "/xyz/openbmc_project/logging/" 0 1 \ 336295ee4fbSAndrew Geissler xyz.openbmc_project.Logging.Entry 337295ee4fbSAndrew Geissler} 338295ee4fbSAndrew Geissler 339d8c63204SAndrew Geissler# display input log details 340d182bff5SPatrick Williamsfunction show_log() 341d8c63204SAndrew Geissler{ 342d8c63204SAndrew Geissler busctl -j call xyz.openbmc_project.Logging \ 343b2398200SPatrick Williams "$1" \ 344d8c63204SAndrew Geissler org.freedesktop.DBus.Properties \ 345d8c63204SAndrew Geissler GetAll s xyz.openbmc_project.Logging.Entry 346d8c63204SAndrew Geissler} 347d8c63204SAndrew Geissler 34842f2898dSAndrew Geissler# delete all phosphor-logging entries 349d182bff5SPatrick Williamsfunction delete_logs() 35042f2898dSAndrew Geissler{ 35142f2898dSAndrew Geissler busctl call xyz.openbmc_project.Logging \ 35242f2898dSAndrew Geissler /xyz/openbmc_project/logging \ 35342f2898dSAndrew Geissler xyz.openbmc_project.Collection.DeleteAll DeleteAll 35442f2898dSAndrew Geissler} 35542f2898dSAndrew Geissler 356ad1afe58SAndrew Geissler# stop all targets associated with powering off a system 357d182bff5SPatrick Williamsfunction stop_off_targets() 358ad1afe58SAndrew Geissler{ 359ad1afe58SAndrew Geissler systemctl stop \ 360ad1afe58SAndrew Geissler obmc-chassis-powered-off@0.target \ 361ad1afe58SAndrew Geissler obmc-host-stop-pre@0.target \ 362ad1afe58SAndrew Geissler obmc-host-stopped@0.target \ 363ad1afe58SAndrew Geissler obmc-host-stopping@0.target \ 364ad1afe58SAndrew Geissler obmc-power-off@0.target \ 365ad1afe58SAndrew Geissler obmc-power-stop-pre@0.target \ 366ad1afe58SAndrew Geissler obmc-power-stop@0.target 367ad1afe58SAndrew Geissler} 368ad1afe58SAndrew Geissler 369d182bff5SPatrick Williamsfunction handle_cmd() 37079f697e0SAnthony Wilson{ 37179f697e0SAnthony Wilson case "$1" in 3723ae0a354SAnthony Wilson chassisoff) 373*ff6af28dSAndrew Geissler check_chassis_host_states 3740e044c48SPotin Lai OBJECT=$STATE_OBJECT/chassis$G_INSTANCE_ID 3758aca0507SAndrew Geissler SERVICE=$(mapper get-service "$OBJECT") 3763ae0a354SAnthony Wilson INTERFACE=$STATE_INTERFACE.Chassis 3773ae0a354SAnthony Wilson PROPERTY=RequestedPowerTransition 3783ae0a354SAnthony Wilson VALUE=$INTERFACE.Transition.Off 379acf54d08SAnthony Wilson G_REQUESTED_STATE=$INTERFACE.PowerState.Off 380acf54d08SAnthony Wilson G_QUERY="chassisstate" 3818aca0507SAndrew Geissler set_property "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY "s" $VALUE 3823ae0a354SAnthony Wilson ;; 3833ae0a354SAnthony Wilson chassison) 384*ff6af28dSAndrew Geissler check_chassis_host_states 385deb6bb45SAndrew Geissler check_and_warn_boot_block 3860e044c48SPotin Lai OBJECT=$STATE_OBJECT/chassis$G_INSTANCE_ID 3878aca0507SAndrew Geissler SERVICE=$(mapper get-service "$OBJECT") 3883ae0a354SAnthony Wilson INTERFACE=$STATE_INTERFACE.Chassis 3893ae0a354SAnthony Wilson PROPERTY=RequestedPowerTransition 3903ae0a354SAnthony Wilson VALUE=$INTERFACE.Transition.On 391acf54d08SAnthony Wilson G_REQUESTED_STATE=$INTERFACE.PowerState.On 392acf54d08SAnthony Wilson G_QUERY="chassisstate" 3938aca0507SAndrew Geissler set_property "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY "s" $VALUE 3943ae0a354SAnthony Wilson ;; 3953ae0a354SAnthony Wilson poweroff) 396*ff6af28dSAndrew Geissler check_chassis_host_states 3970e044c48SPotin Lai OBJECT=$STATE_OBJECT/host$G_INSTANCE_ID 3988aca0507SAndrew Geissler SERVICE=$(mapper get-service "$OBJECT") 3993ae0a354SAnthony Wilson INTERFACE=$STATE_INTERFACE.Host 4003ae0a354SAnthony Wilson PROPERTY=RequestedHostTransition 4013ae0a354SAnthony Wilson VALUE=$INTERFACE.Transition.Off 402acf54d08SAnthony Wilson G_REQUESTED_STATE=$INTERFACE.HostState.Off 403acf54d08SAnthony Wilson G_QUERY="hoststate" 4048aca0507SAndrew Geissler set_property "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY "s" $VALUE 4053ae0a354SAnthony Wilson ;; 4063ae0a354SAnthony Wilson poweron) 407*ff6af28dSAndrew Geissler check_chassis_host_states 408deb6bb45SAndrew Geissler check_and_warn_boot_block 4090e044c48SPotin Lai OBJECT=$STATE_OBJECT/host$G_INSTANCE_ID 4108aca0507SAndrew Geissler SERVICE=$(mapper get-service "$OBJECT") 4113ae0a354SAnthony Wilson INTERFACE=$STATE_INTERFACE.Host 4123ae0a354SAnthony Wilson PROPERTY=RequestedHostTransition 4133ae0a354SAnthony Wilson VALUE=$INTERFACE.Transition.On 414acf54d08SAnthony Wilson G_REQUESTED_STATE=$INTERFACE.HostState.Running 415acf54d08SAnthony Wilson G_QUERY="hoststate" 4168aca0507SAndrew Geissler set_property "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY "s" $VALUE 4173ae0a354SAnthony Wilson ;; 41879f697e0SAnthony Wilson bmcstate) 41979f697e0SAnthony Wilson OBJECT=$STATE_OBJECT/bmc0 42079f697e0SAnthony Wilson SERVICE=$(mapper get-service $OBJECT) 42179f697e0SAnthony Wilson INTERFACE=$STATE_INTERFACE.BMC 42279f697e0SAnthony Wilson PROPERTY=CurrentBMCState 423b2398200SPatrick Williams state_query "$SERVICE" $OBJECT $INTERFACE $PROPERTY 42479f697e0SAnthony Wilson ;; 42579f697e0SAnthony Wilson chassisstate) 4260e044c48SPotin Lai OBJECT=$STATE_OBJECT/chassis$G_INSTANCE_ID 4278aca0507SAndrew Geissler SERVICE=$(mapper get-service "$OBJECT") 42879f697e0SAnthony Wilson INTERFACE=$STATE_INTERFACE.Chassis 42979f697e0SAnthony Wilson PROPERTY=CurrentPowerState 4308aca0507SAndrew Geissler state_query "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY 43179f697e0SAnthony Wilson ;; 43279f697e0SAnthony Wilson hoststate) 4330e044c48SPotin Lai OBJECT=$STATE_OBJECT/host$G_INSTANCE_ID 4348aca0507SAndrew Geissler SERVICE=$(mapper get-service "$OBJECT") 43579f697e0SAnthony Wilson INTERFACE=$STATE_INTERFACE.Host 43679f697e0SAnthony Wilson PROPERTY=CurrentHostState 4378aca0507SAndrew Geissler state_query "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY 43879f697e0SAnthony Wilson ;; 43986cffd9cSAlexander Filippov osstate) 4400e044c48SPotin Lai OBJECT=$STATE_OBJECT/host$G_INSTANCE_ID 4418aca0507SAndrew Geissler SERVICE=$(mapper get-service "$OBJECT") 44286cffd9cSAlexander Filippov INTERFACE=$STATE_INTERFACE.OperatingSystem.Status 44386cffd9cSAlexander Filippov PROPERTY=OperatingSystemState 4448aca0507SAndrew Geissler state_query "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY 44586cffd9cSAlexander Filippov ;; 44679f697e0SAnthony Wilson state|status) 44786cffd9cSAlexander Filippov for query in bmcstate chassisstate hoststate bootprogress osstate 44879f697e0SAnthony Wilson do 44979f697e0SAnthony Wilson handle_cmd $query 45079f697e0SAnthony Wilson done 451deb6bb45SAndrew Geissler check_and_warn_boot_block 45279f697e0SAnthony Wilson ;; 45350c5f88dSAnthony Wilson bootprogress) 4540e044c48SPotin Lai OBJECT=$STATE_OBJECT/host$G_INSTANCE_ID 4558aca0507SAndrew Geissler SERVICE=$(mapper get-service "$OBJECT") 45650c5f88dSAnthony Wilson INTERFACE=$STATE_INTERFACE.Boot.Progress 45750c5f88dSAnthony Wilson PROPERTY=BootProgress 4588aca0507SAndrew Geissler state_query "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY 45950c5f88dSAnthony Wilson ;; 4600f35983dSAnthony Wilson power) 4610f35983dSAnthony Wilson OBJECT=/org/openbmc/control/power0 4620f35983dSAnthony Wilson SERVICE=$(mapper get-service $OBJECT) 4630f35983dSAnthony Wilson INTERFACE=org.openbmc.control.Power 464d182bff5SPatrick Williams for property in pgood state pgood_timeout; do 4650f35983dSAnthony Wilson # get_property can potentially return several 4660f35983dSAnthony Wilson # different formats of values, so we do the parsing outside 4670f35983dSAnthony Wilson # of get_property depending on the query. These queries 4680f35983dSAnthony Wilson # return 'i VALUE' formatted strings. 469d182bff5SPatrick Williams STATE=$(get_property "$SERVICE" "$OBJECT" "$INTERFACE" "$property" | sed 's/i[ ^I]*//') 470b2398200SPatrick Williams printf "%s = %s\n" $property "$STATE" 4710f35983dSAnthony Wilson done 4720f35983dSAnthony Wilson ;; 473189cf248SAnthony Wilson chassiskill) 474189cf248SAnthony Wilson /usr/libexec/chassiskill 475189cf248SAnthony Wilson ;; 476a65d30d1SVishwanatha Subbanna hostrebootoff) 4770e044c48SPotin Lai OBJECT=$CONTROL_OBJECT/host$G_INSTANCE_ID/auto_reboot 4788aca0507SAndrew Geissler SERVICE=$(mapper get-service "$OBJECT") 4796d3a2c54SVishwanatha Subbanna INTERFACE=$CONTROL_INTERFACE.Boot.RebootPolicy 4806d3a2c54SVishwanatha Subbanna PROPERTY=AutoReboot 4816d3a2c54SVishwanatha Subbanna VALUE=false 4828aca0507SAndrew Geissler set_property "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY "b" $VALUE 4836d3a2c54SVishwanatha Subbanna ;; 4843191be88SAndrew Geissler hostrebootoffonetime) 4850e044c48SPotin Lai OBJECT=$CONTROL_OBJECT/host$G_INSTANCE_ID/auto_reboot/one_time 4868aca0507SAndrew Geissler SERVICE=$(mapper get-service "$OBJECT") 4873191be88SAndrew Geissler INTERFACE=$CONTROL_INTERFACE.Boot.RebootPolicy 4883191be88SAndrew Geissler PROPERTY=AutoReboot 4893191be88SAndrew Geissler VALUE=false 4908aca0507SAndrew Geissler set_property "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY "b" $VALUE 4913191be88SAndrew Geissler ;; 492a65d30d1SVishwanatha Subbanna hostrebooton) 4930e044c48SPotin Lai OBJECT=$CONTROL_OBJECT/host$G_INSTANCE_ID/auto_reboot 4948aca0507SAndrew Geissler SERVICE=$(mapper get-service "$OBJECT") 4956d3a2c54SVishwanatha Subbanna INTERFACE=$CONTROL_INTERFACE.Boot.RebootPolicy 4966d3a2c54SVishwanatha Subbanna PROPERTY=AutoReboot 4976d3a2c54SVishwanatha Subbanna VALUE=true 4988aca0507SAndrew Geissler set_property "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY "b" $VALUE 4996d3a2c54SVishwanatha Subbanna ;; 500a65d30d1SVishwanatha Subbanna bmcrebootoff) 501a65d30d1SVishwanatha Subbanna disable_bmc_reboot 502a65d30d1SVishwanatha Subbanna ;; 503a65d30d1SVishwanatha Subbanna bmcrebooton) 504a65d30d1SVishwanatha Subbanna enable_bmc_reboot 505a65d30d1SVishwanatha Subbanna ;; 5067a787dd7SVishwanatha Subbanna recoveryoff) 507a65d30d1SVishwanatha Subbanna handle_cmd hostrebootoff 508a65d30d1SVishwanatha Subbanna handle_cmd bmcrebootoff 5097a787dd7SVishwanatha Subbanna mask_systemd_target $HOST_TIMEOUT_TARGET 51084b3b29eSVishwanatha Subbanna mask_systemd_target $HOST_CRASH_TARGET 5117a787dd7SVishwanatha Subbanna ;; 5127a787dd7SVishwanatha Subbanna recoveryon) 513a65d30d1SVishwanatha Subbanna handle_cmd hostrebooton 514a65d30d1SVishwanatha Subbanna handle_cmd bmcrebooton 5157a787dd7SVishwanatha Subbanna unmask_systemd_target $HOST_TIMEOUT_TARGET 51684b3b29eSVishwanatha Subbanna unmask_systemd_target $HOST_CRASH_TARGET 5177a787dd7SVishwanatha Subbanna ;; 51824b25a46SAnusha Dathatri recoverystatus) 51924b25a46SAnusha Dathatri host_reboot_state=$(get_host_reboot_status) 52024b25a46SAnusha Dathatri if [[ $host_reboot_state == "true" ]]; then 52124b25a46SAnusha Dathatri host_reboot_status=1 52224b25a46SAnusha Dathatri else 52324b25a46SAnusha Dathatri host_reboot_status=0 52424b25a46SAnusha Dathatri fi 52524b25a46SAnusha Dathatri 52624b25a46SAnusha Dathatri bmc_reboot_state=$(get_bmc_reboot_status) 52724b25a46SAnusha Dathatri if [[ $bmc_reboot_state == "on" ]]; then 52824b25a46SAnusha Dathatri bmc_reboot_status=1 52924b25a46SAnusha Dathatri else 53024b25a46SAnusha Dathatri bmc_reboot_status=0 53124b25a46SAnusha Dathatri fi 53224b25a46SAnusha Dathatri 53324b25a46SAnusha Dathatri host_timeout_target_state=$(get_systemd_target_state $HOST_TIMEOUT_TARGET) 53424b25a46SAnusha Dathatri if [[ $host_timeout_target_state == "masked" ]]; then 53524b25a46SAnusha Dathatri host_timeout_status=0 53624b25a46SAnusha Dathatri else 53724b25a46SAnusha Dathatri host_timeout_status=1 53824b25a46SAnusha Dathatri fi 53924b25a46SAnusha Dathatri 54024b25a46SAnusha Dathatri host_crash_target_state=$(get_systemd_target_state $HOST_CRASH_TARGET) 54124b25a46SAnusha Dathatri if [[ $host_crash_target_state == "masked" ]]; then 54224b25a46SAnusha Dathatri host_crash_status=0 54324b25a46SAnusha Dathatri else 54424b25a46SAnusha Dathatri host_crash_status=1 54524b25a46SAnusha Dathatri fi 54624b25a46SAnusha Dathatri 54724b25a46SAnusha Dathatri if (( host_reboot_status && bmc_reboot_status && host_timeout_status && host_crash_status )); then 54824b25a46SAnusha Dathatri echo "recovery: On" 54924b25a46SAnusha Dathatri elif (( !host_reboot_status && !bmc_reboot_status && !host_timeout_status && !host_crash_status )); then 55024b25a46SAnusha Dathatri echo "recovery: Off" 55124b25a46SAnusha Dathatri else 55224b25a46SAnusha Dathatri echo "recovery: Undefined" 55324b25a46SAnusha Dathatri fi 55424b25a46SAnusha Dathatri 55524b25a46SAnusha Dathatri declare -A status 55624b25a46SAnusha Dathatri status[0]="Off" 55724b25a46SAnusha Dathatri status[1]="On" 55824b25a46SAnusha Dathatri 55924b25a46SAnusha Dathatri printf " %-11s: %s\n" "hostReboot" "${status[$host_reboot_status]}" 56024b25a46SAnusha Dathatri printf " %-11s: %s\n" "bmcReboot" "${status[$bmc_reboot_status]}" 56124b25a46SAnusha Dathatri printf " %-11s: %s\n" "hostTimeout" "${status[$host_timeout_status]}" 56224b25a46SAnusha Dathatri printf " %-11s: %s\n" "hostCrash" "${status[$host_crash_status]}" 56324b25a46SAnusha Dathatri ;; 5643b7b5619SAndrew Geissler listbootblock) 5653b7b5619SAndrew Geissler blockingErrors=$(check_boot_block_errors) 5663b7b5619SAndrew Geissler if [ -z "$blockingErrors" ]; then 5673b7b5619SAndrew Geissler echo "No blocking errors present" 5683b7b5619SAndrew Geissler else 5693b7b5619SAndrew Geissler echo "$blockingErrors" 5703b7b5619SAndrew Geissler fi 5713b7b5619SAndrew Geissler ;; 572295ee4fbSAndrew Geissler listlogs) 573295ee4fbSAndrew Geissler list_logs 574295ee4fbSAndrew Geissler ;; 575d8c63204SAndrew Geissler showlog) 576b2398200SPatrick Williams show_log "$2" 577d8c63204SAndrew Geissler ;; 57842f2898dSAndrew Geissler deletelogs) 57942f2898dSAndrew Geissler delete_logs 58042f2898dSAndrew Geissler ;; 581ad1afe58SAndrew Geissler stopofftargets) 582ad1afe58SAndrew Geissler stop_off_targets 583ad1afe58SAndrew Geissler ;; 58479f697e0SAnthony Wilson *) 585ea87db40SAnthony Wilson print_usage_err "Invalid command '$1'" 58679f697e0SAnthony Wilson ;; 58779f697e0SAnthony Wilson esac 58879f697e0SAnthony Wilson} 58979f697e0SAnthony Wilson 590d8779cd8SAndrew Geisslershiftcnt=0 591ea87db40SAnthony Wilsonfor arg in "$@"; do 592ea87db40SAnthony Wilson case $arg in 593acf54d08SAnthony Wilson -w|--wait) 594acf54d08SAnthony Wilson G_WAIT=30 595d8779cd8SAndrew Geissler shiftcnt=$((shiftcnt+1)) 596acf54d08SAnthony Wilson continue 597acf54d08SAnthony Wilson ;; 598ea87db40SAnthony Wilson -h|--help) 599ea87db40SAnthony Wilson print_help 600ea87db40SAnthony Wilson ;; 60160c3ac8cSAndrew Jeffery -v|--verbose) 60260c3ac8cSAndrew Jeffery G_VERBOSE=y 603d8779cd8SAndrew Geissler shiftcnt=$((shiftcnt+1)) 60460c3ac8cSAndrew Jeffery ;; 6050e044c48SPotin Lai -i=*|--id=*) 6060e044c48SPotin Lai G_INSTANCE_ID="${arg#*=}" 6070e044c48SPotin Lai shiftcnt=$((shiftcnt+1)) 6080e044c48SPotin Lai ;; 609*ff6af28dSAndrew Geissler -f|--force) 610*ff6af28dSAndrew Geissler G_FORCE=y 611*ff6af28dSAndrew Geissler shiftcnt=$((shiftcnt+1)) 612*ff6af28dSAndrew Geissler ;; 613ea87db40SAnthony Wilson -*) 614ea87db40SAnthony Wilson print_usage_err "Unknown option: $arg" 615ea87db40SAnthony Wilson ;; 616ea87db40SAnthony Wilson *) 617acf54d08SAnthony Wilson G_ORIG_CMD=$arg 618d8779cd8SAndrew Geissler # shift out the optional parameters 619d8779cd8SAndrew Geissler shift $shiftcnt 620d8c63204SAndrew Geissler # pass all arguments to handle_cmd in case command takes additional 621d8c63204SAndrew Geissler # parameters 622d8c63204SAndrew Geissler handle_cmd "$@" 623ea87db40SAnthony Wilson break 624ea87db40SAnthony Wilson ;; 625ea87db40SAnthony Wilson esac 626ea87db40SAnthony Wilsondone 627