blob: ecaed6a7dfdfdd1642c6cc640de8c9f906bda71c [file] [log] [blame]
Patrick Williamsb2398202021-04-13 20:53:26 -05001#!/bin/bash -e
Anthony Wilson79f697e2018-09-13 13:48:52 -05002
3set -euo pipefail
4
Anthony Wilson189cf242018-10-23 01:18:21 -05005OPTS="bmcstate,bootprogress,chassiskill,chassisoff,chassison,chassisstate,hoststate,\
Vishwanatha Subbannaa65d30d2019-11-13 01:26:12 -06006osstate,power,poweroff,poweron,state,status,hostrebootoff,hostrebooton,recoveryoff,recoveryon,\
Andrew Geisslerad1afe52022-02-23 16:07:06 -06007bmcrebootoff, bmcrebooton, listbootblock listlogs showlog deletelogs, stopofftargets"
Anthony Wilson0f359832018-09-13 14:28:07 -05008
Potin Lai0e044c42022-05-13 23:42:31 +08009USAGE="Usage: obmcutil [-h] [--wait] [--verbose] [--id=<INSTANCE_ID>]
Patrick Williamsd182bff2022-12-08 06:39:12 -060010{$OPTS}"
Anthony Wilson79f697e2018-09-13 13:48:52 -050011
12INTERFACE_ROOT=xyz.openbmc_project
13STATE_INTERFACE=$INTERFACE_ROOT.State
Vishwanatha Subbanna6d3a2c52019-10-24 07:21:30 -050014CONTROL_INTERFACE=$INTERFACE_ROOT.Control
Anthony Wilson79f697e2018-09-13 13:48:52 -050015
16OBJECT_ROOT=/xyz/openbmc_project
17STATE_OBJECT=$OBJECT_ROOT/state
Vishwanatha Subbanna6d3a2c52019-10-24 07:21:30 -050018CONTROL_OBJECT=$OBJECT_ROOT/control
Anthony Wilson79f697e2018-09-13 13:48:52 -050019
Vishwanatha Subbanna7a787dd2019-10-31 06:02:31 -050020HOST_TIMEOUT_TARGET=obmc-host-timeout@0.target
Vishwanatha Subbanna84b3b292019-11-04 05:43:19 -060021HOST_CRASH_TARGET=obmc-host-crash@0.target
Vishwanatha Subbanna7a787dd2019-10-31 06:02:31 -050022
Andrew Geisslerff6af282025-04-17 14:38:07 -050023## NOTE: By declaring these globally instead of passing them through the
Anthony Wilsonacf54d02018-09-20 15:19:28 -050024## intermediary functions, which may not be "best practice", the readability
25## and cleanliness of the code should at least be increased.
26
27# The command passed in to be executed (e.g. poweron/off, status, etc.)
28# This will be be used in some instances of error reporting
29G_ORIG_CMD=
30# The state an interface should be in after executing the requested command.
31G_REQUESTED_STATE=
32# The query to run during a poweron/off or chassison/off to check that
33# the requested state (G_REQUESTED_STATE) of the interface has been reached.
34G_QUERY=
35# Wait the set period of time for state transitions to be successful before
36# continuing on with the program or reporting an error if timeout reached.
37G_WAIT=
Andrew Jeffery60c3ac82019-10-02 09:29:29 +093038# Print the journal to the console
39G_VERBOSE=
Potin Lai0e044c42022-05-13 23:42:31 +080040# Instance id, default 0
41G_INSTANCE_ID="0"
Andrew Geisslerff6af282025-04-17 14:38:07 -050042# Force a command even if system state is not correct
43G_FORCE=
Anthony Wilsonacf54d02018-09-20 15:19:28 -050044
Patrick Williamsd182bff2022-12-08 06:39:12 -060045function print_help()
Anthony Wilsonf3f16fa2018-09-13 14:10:52 -050046{
47 echo "$USAGE"
48 echo ""
49 echo "positional arguments:"
Anthony Wilson0f359832018-09-13 14:28:07 -050050 echo " {$OPTS}"
Anthony Wilsonf3f16fa2018-09-13 14:10:52 -050051 echo ""
Vishwanatha Subbanna6d3a2c52019-10-24 07:21:30 -050052 echo "Examples:"
53 echo ""
Vishwanatha Subbannaa65d30d2019-11-13 01:26:12 -060054 echo "obmcutil hostrebootoff Disable auto reboot of Host from Quiesce state"
Andrew Geissler3191be82020-10-23 10:45:55 -050055 echo "obmcutil hostrebootoffonetime Disable auto reboot of Host from"
56 echo " Quiesce state for a single boot"
Andrew Geisslerad1afe52022-02-23 16:07:06 -060057 echo "obmcutil hostrebooton Enable auto reboot of Host from Quiesce state"
Vishwanatha Subbanna6d3a2c52019-10-24 07:21:30 -050058 echo ""
Andrew Geisslerad1afe52022-02-23 16:07:06 -060059 echo "obmcutil bmcrebootoff Disable reboot of BMC"
60 echo "obmcutil bmcrebooton Enable reboot of BMC"
Vishwanatha Subbannaa65d30d2019-11-13 01:26:12 -060061 echo ""
Andrew Geisslerad1afe52022-02-23 16:07:06 -060062 echo "obmcutil recoveryoff Disable handling boot watchdog timeout and host crash"
63 echo " Also, disable BMC and Host auto reboots"
Vishwanatha Subbannaa65d30d2019-11-13 01:26:12 -060064 echo ""
Andrew Geisslerad1afe52022-02-23 16:07:06 -060065 echo "obmcutil recoveryon Enable handling boot watchdog timeout and host crash"
66 echo " Also, enable BMC and Host auto reboots"
Vishwanatha Subbanna7a787dd2019-10-31 06:02:31 -050067 echo ""
Anusha Dathatri24b25a42024-05-31 05:57:45 -050068 echo "obmcutil recoverystatus Display the status of handling boot watchdog timeout and host crash"
69 echo " and also the status of BMC and Host auto reboots setting"
70 echo ""
Andrew Geisslerad1afe52022-02-23 16:07:06 -060071 echo "obmcutil listbootblock Check for and list any errors blocking the boot"
72 echo " of the system"
Andrew Geissler3b7b5612020-05-14 10:45:29 -050073 echo ""
Andrew Geisslerad1afe52022-02-23 16:07:06 -060074 echo "obmcutil listlogs List all phosphor-logging entries on the"
75 echo " system"
Andrew Geissler295ee4f2020-05-14 14:14:05 -050076 echo ""
Andrew Geisslerad1afe52022-02-23 16:07:06 -060077 echo "obmcutil showlog <log> Display details of input log. Format of <log>"
78 echo " should match listlogs output"
Andrew Geisslerd8c63202020-05-14 15:06:31 -050079 echo ""
Andrew Geisslerad1afe52022-02-23 16:07:06 -060080 echo "obmcutil deletelogs Delete all phosphor-logging entries from"
81 echo " system"
82 echo "obmcutil stopofftargets Manually stop all obmc targets in power off"
83 echo " path"
Andrew Geissler42f28982020-05-14 15:12:42 -050084 echo ""
Andrew Geisslerd8779cd2020-06-11 10:48:40 -050085 echo "optional arguments (must precede the positional options above):"
Anthony Wilsonf3f16fa2018-09-13 14:10:52 -050086 echo " -h, --help show this help message and exit"
Anthony Wilsonacf54d02018-09-20 15:19:28 -050087 echo " -w, --wait block until state transition succeeds or fails"
Andrew Jeffery60c3ac82019-10-02 09:29:29 +093088 echo " -v, --verbose print the journal to stdout if --wait is supplied"
Potin Lai0e044c42022-05-13 23:42:31 +080089 echo " -i, -id instance id, default 0"
Andrew Geisslerff6af282025-04-17 14:38:07 -050090 echo " -f, --force force issuing the command ignoring preconditions (use with caution)"
Anthony Wilsonf3f16fa2018-09-13 14:10:52 -050091 exit 0
92}
93
Patrick Williamsd182bff2022-12-08 06:39:12 -060094function run_timeout()
Anthony Wilsonacf54d02018-09-20 15:19:28 -050095{
96 local timeout="$1"; shift
Patrick Williamsb2398202021-04-13 20:53:26 -050097 local cmd="$*"
Andrew Jeffery60c3ac82019-10-02 09:29:29 +093098 local verbose_child=
99
Andrew Jeffery2869a922019-10-18 14:42:34 +1030100 if [ -n "$G_VERBOSE" ]; then
Andrew Jeffery60c3ac82019-10-02 09:29:29 +0930101 journalctl -f &
102 verbose_child=$!
103 fi
Anthony Wilsonacf54d02018-09-20 15:19:28 -0500104
105 $cmd
106
107 # Run a background query for the transition to the expected state
108 # This will be killed if the transition doesn't succeed within
109 # a timeout period.
110 (
Patrick Williamsb2398202021-04-13 20:53:26 -0500111 while ! grep -q "$G_REQUESTED_STATE" <<< "$(handle_cmd "$G_QUERY")" ; do
Anthony Wilsonacf54d02018-09-20 15:19:28 -0500112 sleep 1
113 done
114 ) &
Andrew Jeffery60c3ac82019-10-02 09:29:29 +0930115 wait_child=$!
Anthony Wilsonacf54d02018-09-20 15:19:28 -0500116
117 # Could be bad if process is killed before 'timeout' occurs if
118 # transition doesn't succeed.
119 trap -- "" SIGTERM
120
121 # Workaround for lack of 'timeout' command.
122 (
Patrick Williamsb2398202021-04-13 20:53:26 -0500123 sleep "$timeout"
Andrew Jeffery60c3ac82019-10-02 09:29:29 +0930124 kill $wait_child
Anthony Wilsonacf54d02018-09-20 15:19:28 -0500125 ) > /dev/null 2>&1 &
126
Andrew Jeffery60c3ac82019-10-02 09:29:29 +0930127 if ! wait $wait_child; then
Anthony Wilsonacf54d02018-09-20 15:19:28 -0500128 echo "Unable to confirm '$G_ORIG_CMD' success" \
Patrick Williamsd182bff2022-12-08 06:39:12 -0600129 "within timeout period (${timeout}s)"
Anthony Wilsonacf54d02018-09-20 15:19:28 -0500130 fi
Andrew Jeffery60c3ac82019-10-02 09:29:29 +0930131
Andrew Jeffery8be70292019-11-01 08:56:49 +1030132 if [ -n "$verbose_child" ]; then
Andrew Jeffery60c3ac82019-10-02 09:29:29 +0930133 kill $verbose_child
134 fi
Anthony Wilsonacf54d02018-09-20 15:19:28 -0500135}
136
Patrick Williamsd182bff2022-12-08 06:39:12 -0600137function run_cmd()
Anthony Wilsonacf54d02018-09-20 15:19:28 -0500138{
Patrick Williamsb2398202021-04-13 20:53:26 -0500139 local cmd="$*";
Anthony Wilsonacf54d02018-09-20 15:19:28 -0500140
141 if [ -n "$G_WAIT" ]; then
Patrick Williamsb2398202021-04-13 20:53:26 -0500142 run_timeout "$G_WAIT" "$cmd"
Anthony Wilsonacf54d02018-09-20 15:19:28 -0500143 else
144 $cmd
145 fi
146}
147
Patrick Williamsd182bff2022-12-08 06:39:12 -0600148function set_property()
Anthony Wilson3ae0a352018-09-13 14:47:56 -0500149{
Anthony Wilsonacf54d02018-09-20 15:19:28 -0500150 run_cmd busctl set-property "$@"
Anthony Wilson3ae0a352018-09-13 14:47:56 -0500151}
152
Patrick Williamsd182bff2022-12-08 06:39:12 -0600153function get_property()
Anthony Wilson79f697e2018-09-13 13:48:52 -0500154{
Anthony Wilsonacf54d02018-09-20 15:19:28 -0500155 G_WAIT=""
156 run_cmd busctl get-property "$@"
Anthony Wilson79f697e2018-09-13 13:48:52 -0500157}
158
Patrick Williamsd182bff2022-12-08 06:39:12 -0600159function state_query()
Anthony Wilson79f697e2018-09-13 13:48:52 -0500160{
Patrick Williamsb2398202021-04-13 20:53:26 -0500161 local state
162 state=$(get_property "$@" | cut -d '"' -f2)
163 printf "%-20s: %s\n" "$4" "$state"
Anthony Wilson79f697e2018-09-13 13:48:52 -0500164}
165
Patrick Williamsd182bff2022-12-08 06:39:12 -0600166function print_usage_err()
Anthony Wilsonea87db42018-09-26 16:06:38 -0500167{
168 echo "ERROR: $1" >&2
169 echo "$USAGE"
170 exit 1
171}
172
Patrick Williamsd182bff2022-12-08 06:39:12 -0600173function mask_systemd_target()
Vishwanatha Subbanna7a787dd2019-10-31 06:02:31 -0500174{
Patrick Williamsb2398202021-04-13 20:53:26 -0500175 target="$*"
176 systemctl mask "$target"
Vishwanatha Subbanna7a787dd2019-10-31 06:02:31 -0500177}
178
Patrick Williamsd182bff2022-12-08 06:39:12 -0600179function unmask_systemd_target()
Vishwanatha Subbanna7a787dd2019-10-31 06:02:31 -0500180{
Patrick Williamsb2398202021-04-13 20:53:26 -0500181 target="$*"
182 systemctl unmask "$target"
Vishwanatha Subbanna7a787dd2019-10-31 06:02:31 -0500183}
184
Anusha Dathatri24b25a42024-05-31 05:57:45 -0500185function get_systemd_target_state()
186{
187 target="$*"
188 enabled_state=$(systemctl is-enabled "$target")
189 echo "$enabled_state"
190}
191
Patrick Williamsd182bff2022-12-08 06:39:12 -0600192function disable_bmc_reboot()
Vishwanatha Subbannaa65d30d2019-11-13 01:26:12 -0600193{
194 dir="/run/systemd/system/"
195 file="reboot-guard.conf"
196 units=("reboot" "poweroff" "halt")
197
198 for unit in "${units[@]}"; do
Patrick Williamsb2398202021-04-13 20:53:26 -0500199 mkdir -p "${dir}${unit}.target.d"
200 echo -e "[Unit]\nRefuseManualStart=yes" >> "${dir}${unit}.target.d/${file}"
Vishwanatha Subbannaa65d30d2019-11-13 01:26:12 -0600201 done
202}
203
Patrick Williamsd182bff2022-12-08 06:39:12 -0600204function enable_bmc_reboot()
Vishwanatha Subbannaa65d30d2019-11-13 01:26:12 -0600205{
206 dir="/run/systemd/system/"
207 file="reboot-guard.conf"
208 units=("reboot" "poweroff" "halt")
209
210 for unit in "${units[@]}"; do
Patrick Williamsb2398202021-04-13 20:53:26 -0500211 rm -rf "${dir}${unit}.target.d/${file}"
212 rm -rf "${dir}${unit}.target.d"
Vishwanatha Subbannaa65d30d2019-11-13 01:26:12 -0600213 done
214}
215
Anusha Dathatri24b25a42024-05-31 05:57:45 -0500216function get_bmc_reboot_status()
217{
218 dir="/run/systemd/system/"
219 file="reboot-guard.conf"
220 units=("reboot" "poweroff" "halt")
221
222 # if file do
223 for unit in "${units[@]}"; do
224 if [ -e "${dir}${unit}.target.d/${file}" ]; then
225 echo "off"
226 return 0
227 fi
228 done
229 echo "on"
230 return 0
231}
232
233function get_host_reboot_status()
234{
235 OBJECT=$CONTROL_OBJECT/host$G_INSTANCE_ID/auto_reboot
236 SERVICE=$(mapper get-service "$OBJECT")
237 INTERFACE=$CONTROL_INTERFACE.Boot.RebootPolicy
238 PROPERTY=AutoReboot
239 output="$(get_property "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY)"
240 echo "${output//b /}"
241}
242
Andrew Geissler3b7b5612020-05-14 10:45:29 -0500243# will write blocking errors to stdout
Patrick Williamsd182bff2022-12-08 06:39:12 -0600244function check_boot_block_errors()
Andrew Geissler3b7b5612020-05-14 10:45:29 -0500245{
246 # array of boot block objects
247 blockArray=()
248
249 # Look for any objects under logging that implement the
250 # xyz.openbmc_project.Logging.ErrorBlocksTransition
251 subtree="$(busctl call xyz.openbmc_project.ObjectMapper \
252 /xyz/openbmc_project/object_mapper \
253 xyz.openbmc_project.ObjectMapper \
254 GetSubTree sias "/xyz/openbmc_project/logging/" 0 1 \
255 xyz.openbmc_project.Logging.ErrorBlocksTransition)"
256
257 # remove quotation marks
Patrick Williamsb2398202021-04-13 20:53:26 -0500258 # shellcheck disable=SC2001
259 subtree="$(echo "$subtree" | sed 's/\"//g')"
Andrew Geissler3b7b5612020-05-14 10:45:29 -0500260
261 for entry in $subtree; do
262 if [[ ${entry} =~ "xyz/openbmc_project/logging/block"* ]]; then
Patrick Williamsb2398202021-04-13 20:53:26 -0500263 blockArray+=( "$entry" )
Andrew Geissler3b7b5612020-05-14 10:45:29 -0500264 fi
265 done
266
267 # now find associated error log for each boot block error
268 for berror in "${blockArray[@]}"; do
Patrick Williamsb2398202021-04-13 20:53:26 -0500269 assocs="$(busctl call xyz.openbmc_project.Logging "$berror" \
Andrew Geissler3b7b5612020-05-14 10:45:29 -0500270 org.freedesktop.DBus.Properties Get \
271 ss xyz.openbmc_project.Association.Definitions Associations)"
272
273 # remove quotation marks
Patrick Williamsb2398202021-04-13 20:53:26 -0500274 # shellcheck disable=SC2001
275 assocs="$(echo "$assocs" | sed 's/\"//g')"
Andrew Geissler3b7b5612020-05-14 10:45:29 -0500276
277 for entry in $assocs; do
278 if [[ ${entry} =~ "xyz/openbmc_project/logging/entry"* ]]; then
279 echo "Blocking Error: $entry"
280 fi
281 done
282 done
283}
284
Andrew Geisslerff6af282025-04-17 14:38:07 -0500285# check if system is in transitioning state for chassis or host and
286# reject request if it is (if force option not set)
287function check_chassis_host_states()
288{
289 # If user has --force enabled, no check
290 if [ -n "$G_FORCE" ]; then
291 return 0
292 fi
293
294 OBJECT=$STATE_OBJECT/chassis$G_INSTANCE_ID
295 SERVICE=$(mapper get-service "$OBJECT")
296 INTERFACE=$STATE_INTERFACE.Chassis
297 PROPERTY=CurrentPowerState
298 state=$(get_property "$SERVICE" "$OBJECT" "$INTERFACE $PROPERTY" | cut -d '"' -f2)
299 if [[ ${state} =~ "xyz.openbmc_project.State.Chassis.PowerState.Transitioning"* ]]; then
300 echo "Chassis is $state, request rejected, use --force to override"
301 exit 1
302 fi
303
304 OBJECT=$STATE_OBJECT/host$G_INSTANCE_ID
305 SERVICE=$(mapper get-service "$OBJECT")
306 INTERFACE=$STATE_INTERFACE.Host
307 PROPERTY=CurrentHostState
308 state=$(get_property "$SERVICE" "$OBJECT" "$INTERFACE $PROPERTY" | cut -d '"' -f2)
309 if [[ ${state} =~ "xyz.openbmc_project.State.Host.HostState.Transitioning"* ]]; then
310 echo "Host is $state, request rejected, use --force to override"
311 exit 1
312 fi
313}
314
Andrew Geisslerdeb6bb42020-05-14 13:44:57 -0500315# helper function to check for boot block errors and notify user
Patrick Williamsd182bff2022-12-08 06:39:12 -0600316function check_and_warn_boot_block()
Andrew Geisslerdeb6bb42020-05-14 13:44:57 -0500317{
318 blockingErrors=$(check_boot_block_errors)
Patrick Williamsb2398202021-04-13 20:53:26 -0500319 if [ -n "$blockingErrors" ]; then
Andrew Geisslerdeb6bb42020-05-14 13:44:57 -0500320 echo !!!!!!!!!!
321 echo "WARNING! System has blocking errors that will prevent boot"
322 echo "$blockingErrors"
323 echo !!!!!!!!!!
324 fi
325}
326
Andrew Geissler295ee4f2020-05-14 14:14:05 -0500327# list all phosphor-logging entries
Patrick Williamsd182bff2022-12-08 06:39:12 -0600328function list_logs()
Andrew Geissler295ee4f2020-05-14 14:14:05 -0500329{
330 # Look for any objects under logging that implement the
331 # xyz.openbmc_project.Logging.Entry
332 busctl -j call xyz.openbmc_project.ObjectMapper \
Patrick Williamsd182bff2022-12-08 06:39:12 -0600333 /xyz/openbmc_project/object_mapper \
334 xyz.openbmc_project.ObjectMapper \
335 GetSubTreePaths sias "/xyz/openbmc_project/logging/" 0 1 \
336 xyz.openbmc_project.Logging.Entry
Andrew Geissler295ee4f2020-05-14 14:14:05 -0500337}
338
Andrew Geisslerd8c63202020-05-14 15:06:31 -0500339# display input log details
Patrick Williamsd182bff2022-12-08 06:39:12 -0600340function show_log()
Andrew Geisslerd8c63202020-05-14 15:06:31 -0500341{
342 busctl -j call xyz.openbmc_project.Logging \
Patrick Williamsd182bff2022-12-08 06:39:12 -0600343 "$1" \
344 org.freedesktop.DBus.Properties \
345 GetAll s xyz.openbmc_project.Logging.Entry
Andrew Geisslerd8c63202020-05-14 15:06:31 -0500346}
347
Andrew Geissler42f28982020-05-14 15:12:42 -0500348# delete all phosphor-logging entries
Patrick Williamsd182bff2022-12-08 06:39:12 -0600349function delete_logs()
Andrew Geissler42f28982020-05-14 15:12:42 -0500350{
351 busctl call xyz.openbmc_project.Logging \
Patrick Williamsd182bff2022-12-08 06:39:12 -0600352 /xyz/openbmc_project/logging \
353 xyz.openbmc_project.Collection.DeleteAll DeleteAll
Andrew Geissler42f28982020-05-14 15:12:42 -0500354}
355
Andrew Geisslerad1afe52022-02-23 16:07:06 -0600356# stop all targets associated with powering off a system
Patrick Williamsd182bff2022-12-08 06:39:12 -0600357function stop_off_targets()
Andrew Geisslerad1afe52022-02-23 16:07:06 -0600358{
359 systemctl stop \
360 obmc-chassis-powered-off@0.target \
361 obmc-host-stop-pre@0.target \
362 obmc-host-stopped@0.target \
363 obmc-host-stopping@0.target \
364 obmc-power-off@0.target \
365 obmc-power-stop-pre@0.target \
366 obmc-power-stop@0.target
367}
368
Patrick Williamsd182bff2022-12-08 06:39:12 -0600369function handle_cmd()
Anthony Wilson79f697e2018-09-13 13:48:52 -0500370{
371 case "$1" in
Anthony Wilson3ae0a352018-09-13 14:47:56 -0500372 chassisoff)
Andrew Geisslerff6af282025-04-17 14:38:07 -0500373 check_chassis_host_states
Potin Lai0e044c42022-05-13 23:42:31 +0800374 OBJECT=$STATE_OBJECT/chassis$G_INSTANCE_ID
Andrew Geissler8aca0502023-05-01 15:51:39 -0600375 SERVICE=$(mapper get-service "$OBJECT")
Anthony Wilson3ae0a352018-09-13 14:47:56 -0500376 INTERFACE=$STATE_INTERFACE.Chassis
377 PROPERTY=RequestedPowerTransition
378 VALUE=$INTERFACE.Transition.Off
Anthony Wilsonacf54d02018-09-20 15:19:28 -0500379 G_REQUESTED_STATE=$INTERFACE.PowerState.Off
380 G_QUERY="chassisstate"
Andrew Geissler8aca0502023-05-01 15:51:39 -0600381 set_property "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY "s" $VALUE
Anthony Wilson3ae0a352018-09-13 14:47:56 -0500382 ;;
383 chassison)
Andrew Geisslerff6af282025-04-17 14:38:07 -0500384 check_chassis_host_states
Andrew Geisslerdeb6bb42020-05-14 13:44:57 -0500385 check_and_warn_boot_block
Potin Lai0e044c42022-05-13 23:42:31 +0800386 OBJECT=$STATE_OBJECT/chassis$G_INSTANCE_ID
Andrew Geissler8aca0502023-05-01 15:51:39 -0600387 SERVICE=$(mapper get-service "$OBJECT")
Anthony Wilson3ae0a352018-09-13 14:47:56 -0500388 INTERFACE=$STATE_INTERFACE.Chassis
389 PROPERTY=RequestedPowerTransition
390 VALUE=$INTERFACE.Transition.On
Anthony Wilsonacf54d02018-09-20 15:19:28 -0500391 G_REQUESTED_STATE=$INTERFACE.PowerState.On
392 G_QUERY="chassisstate"
Andrew Geissler8aca0502023-05-01 15:51:39 -0600393 set_property "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY "s" $VALUE
Anthony Wilson3ae0a352018-09-13 14:47:56 -0500394 ;;
395 poweroff)
Andrew Geisslerff6af282025-04-17 14:38:07 -0500396 check_chassis_host_states
Potin Lai0e044c42022-05-13 23:42:31 +0800397 OBJECT=$STATE_OBJECT/host$G_INSTANCE_ID
Andrew Geissler8aca0502023-05-01 15:51:39 -0600398 SERVICE=$(mapper get-service "$OBJECT")
Anthony Wilson3ae0a352018-09-13 14:47:56 -0500399 INTERFACE=$STATE_INTERFACE.Host
400 PROPERTY=RequestedHostTransition
401 VALUE=$INTERFACE.Transition.Off
Anthony Wilsonacf54d02018-09-20 15:19:28 -0500402 G_REQUESTED_STATE=$INTERFACE.HostState.Off
403 G_QUERY="hoststate"
Andrew Geissler8aca0502023-05-01 15:51:39 -0600404 set_property "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY "s" $VALUE
Anthony Wilson3ae0a352018-09-13 14:47:56 -0500405 ;;
406 poweron)
Andrew Geisslerff6af282025-04-17 14:38:07 -0500407 check_chassis_host_states
Andrew Geisslerdeb6bb42020-05-14 13:44:57 -0500408 check_and_warn_boot_block
Potin Lai0e044c42022-05-13 23:42:31 +0800409 OBJECT=$STATE_OBJECT/host$G_INSTANCE_ID
Andrew Geissler8aca0502023-05-01 15:51:39 -0600410 SERVICE=$(mapper get-service "$OBJECT")
Anthony Wilson3ae0a352018-09-13 14:47:56 -0500411 INTERFACE=$STATE_INTERFACE.Host
412 PROPERTY=RequestedHostTransition
413 VALUE=$INTERFACE.Transition.On
Anthony Wilsonacf54d02018-09-20 15:19:28 -0500414 G_REQUESTED_STATE=$INTERFACE.HostState.Running
415 G_QUERY="hoststate"
Andrew Geissler8aca0502023-05-01 15:51:39 -0600416 set_property "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY "s" $VALUE
Anthony Wilson3ae0a352018-09-13 14:47:56 -0500417 ;;
Anthony Wilson79f697e2018-09-13 13:48:52 -0500418 bmcstate)
419 OBJECT=$STATE_OBJECT/bmc0
420 SERVICE=$(mapper get-service $OBJECT)
421 INTERFACE=$STATE_INTERFACE.BMC
422 PROPERTY=CurrentBMCState
Patrick Williamsb2398202021-04-13 20:53:26 -0500423 state_query "$SERVICE" $OBJECT $INTERFACE $PROPERTY
Anthony Wilson79f697e2018-09-13 13:48:52 -0500424 ;;
425 chassisstate)
Potin Lai0e044c42022-05-13 23:42:31 +0800426 OBJECT=$STATE_OBJECT/chassis$G_INSTANCE_ID
Andrew Geissler8aca0502023-05-01 15:51:39 -0600427 SERVICE=$(mapper get-service "$OBJECT")
Anthony Wilson79f697e2018-09-13 13:48:52 -0500428 INTERFACE=$STATE_INTERFACE.Chassis
429 PROPERTY=CurrentPowerState
Andrew Geissler8aca0502023-05-01 15:51:39 -0600430 state_query "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY
Anthony Wilson79f697e2018-09-13 13:48:52 -0500431 ;;
432 hoststate)
Potin Lai0e044c42022-05-13 23:42:31 +0800433 OBJECT=$STATE_OBJECT/host$G_INSTANCE_ID
Andrew Geissler8aca0502023-05-01 15:51:39 -0600434 SERVICE=$(mapper get-service "$OBJECT")
Anthony Wilson79f697e2018-09-13 13:48:52 -0500435 INTERFACE=$STATE_INTERFACE.Host
436 PROPERTY=CurrentHostState
Andrew Geissler8aca0502023-05-01 15:51:39 -0600437 state_query "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY
Anthony Wilson79f697e2018-09-13 13:48:52 -0500438 ;;
Alexander Filippov86cffd92019-04-03 16:29:57 +0300439 osstate)
Potin Lai0e044c42022-05-13 23:42:31 +0800440 OBJECT=$STATE_OBJECT/host$G_INSTANCE_ID
Andrew Geissler8aca0502023-05-01 15:51:39 -0600441 SERVICE=$(mapper get-service "$OBJECT")
Alexander Filippov86cffd92019-04-03 16:29:57 +0300442 INTERFACE=$STATE_INTERFACE.OperatingSystem.Status
443 PROPERTY=OperatingSystemState
Andrew Geissler8aca0502023-05-01 15:51:39 -0600444 state_query "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY
Alexander Filippov86cffd92019-04-03 16:29:57 +0300445 ;;
Anthony Wilson79f697e2018-09-13 13:48:52 -0500446 state|status)
Alexander Filippov86cffd92019-04-03 16:29:57 +0300447 for query in bmcstate chassisstate hoststate bootprogress osstate
Anthony Wilson79f697e2018-09-13 13:48:52 -0500448 do
449 handle_cmd $query
450 done
Andrew Geisslerdeb6bb42020-05-14 13:44:57 -0500451 check_and_warn_boot_block
Anthony Wilson79f697e2018-09-13 13:48:52 -0500452 ;;
Anthony Wilson50c5f882018-09-13 14:19:37 -0500453 bootprogress)
Potin Lai0e044c42022-05-13 23:42:31 +0800454 OBJECT=$STATE_OBJECT/host$G_INSTANCE_ID
Andrew Geissler8aca0502023-05-01 15:51:39 -0600455 SERVICE=$(mapper get-service "$OBJECT")
Anthony Wilson50c5f882018-09-13 14:19:37 -0500456 INTERFACE=$STATE_INTERFACE.Boot.Progress
457 PROPERTY=BootProgress
Andrew Geissler8aca0502023-05-01 15:51:39 -0600458 state_query "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY
Anthony Wilson50c5f882018-09-13 14:19:37 -0500459 ;;
Anthony Wilson0f359832018-09-13 14:28:07 -0500460 power)
461 OBJECT=/org/openbmc/control/power0
462 SERVICE=$(mapper get-service $OBJECT)
463 INTERFACE=org.openbmc.control.Power
Patrick Williamsd182bff2022-12-08 06:39:12 -0600464 for property in pgood state pgood_timeout; do
Anthony Wilson0f359832018-09-13 14:28:07 -0500465 # get_property can potentially return several
466 # different formats of values, so we do the parsing outside
467 # of get_property depending on the query. These queries
468 # return 'i VALUE' formatted strings.
Patrick Williamsd182bff2022-12-08 06:39:12 -0600469 STATE=$(get_property "$SERVICE" "$OBJECT" "$INTERFACE" "$property" | sed 's/i[ ^I]*//')
Patrick Williamsb2398202021-04-13 20:53:26 -0500470 printf "%s = %s\n" $property "$STATE"
Anthony Wilson0f359832018-09-13 14:28:07 -0500471 done
472 ;;
Anthony Wilson189cf242018-10-23 01:18:21 -0500473 chassiskill)
474 /usr/libexec/chassiskill
475 ;;
Vishwanatha Subbannaa65d30d2019-11-13 01:26:12 -0600476 hostrebootoff)
Potin Lai0e044c42022-05-13 23:42:31 +0800477 OBJECT=$CONTROL_OBJECT/host$G_INSTANCE_ID/auto_reboot
Andrew Geissler8aca0502023-05-01 15:51:39 -0600478 SERVICE=$(mapper get-service "$OBJECT")
Vishwanatha Subbanna6d3a2c52019-10-24 07:21:30 -0500479 INTERFACE=$CONTROL_INTERFACE.Boot.RebootPolicy
480 PROPERTY=AutoReboot
481 VALUE=false
Andrew Geissler8aca0502023-05-01 15:51:39 -0600482 set_property "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY "b" $VALUE
Vishwanatha Subbanna6d3a2c52019-10-24 07:21:30 -0500483 ;;
Andrew Geissler3191be82020-10-23 10:45:55 -0500484 hostrebootoffonetime)
Potin Lai0e044c42022-05-13 23:42:31 +0800485 OBJECT=$CONTROL_OBJECT/host$G_INSTANCE_ID/auto_reboot/one_time
Andrew Geissler8aca0502023-05-01 15:51:39 -0600486 SERVICE=$(mapper get-service "$OBJECT")
Andrew Geissler3191be82020-10-23 10:45:55 -0500487 INTERFACE=$CONTROL_INTERFACE.Boot.RebootPolicy
488 PROPERTY=AutoReboot
489 VALUE=false
Andrew Geissler8aca0502023-05-01 15:51:39 -0600490 set_property "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY "b" $VALUE
Patrick Williamsd182bff2022-12-08 06:39:12 -0600491 ;;
Vishwanatha Subbannaa65d30d2019-11-13 01:26:12 -0600492 hostrebooton)
Potin Lai0e044c42022-05-13 23:42:31 +0800493 OBJECT=$CONTROL_OBJECT/host$G_INSTANCE_ID/auto_reboot
Andrew Geissler8aca0502023-05-01 15:51:39 -0600494 SERVICE=$(mapper get-service "$OBJECT")
Vishwanatha Subbanna6d3a2c52019-10-24 07:21:30 -0500495 INTERFACE=$CONTROL_INTERFACE.Boot.RebootPolicy
496 PROPERTY=AutoReboot
497 VALUE=true
Andrew Geissler8aca0502023-05-01 15:51:39 -0600498 set_property "$SERVICE" "$OBJECT" $INTERFACE $PROPERTY "b" $VALUE
Vishwanatha Subbanna6d3a2c52019-10-24 07:21:30 -0500499 ;;
Vishwanatha Subbannaa65d30d2019-11-13 01:26:12 -0600500 bmcrebootoff)
501 disable_bmc_reboot
502 ;;
503 bmcrebooton)
504 enable_bmc_reboot
505 ;;
Vishwanatha Subbanna7a787dd2019-10-31 06:02:31 -0500506 recoveryoff)
Vishwanatha Subbannaa65d30d2019-11-13 01:26:12 -0600507 handle_cmd hostrebootoff
508 handle_cmd bmcrebootoff
Vishwanatha Subbanna7a787dd2019-10-31 06:02:31 -0500509 mask_systemd_target $HOST_TIMEOUT_TARGET
Vishwanatha Subbanna84b3b292019-11-04 05:43:19 -0600510 mask_systemd_target $HOST_CRASH_TARGET
Vishwanatha Subbanna7a787dd2019-10-31 06:02:31 -0500511 ;;
512 recoveryon)
Vishwanatha Subbannaa65d30d2019-11-13 01:26:12 -0600513 handle_cmd hostrebooton
514 handle_cmd bmcrebooton
Vishwanatha Subbanna7a787dd2019-10-31 06:02:31 -0500515 unmask_systemd_target $HOST_TIMEOUT_TARGET
Vishwanatha Subbanna84b3b292019-11-04 05:43:19 -0600516 unmask_systemd_target $HOST_CRASH_TARGET
Vishwanatha Subbanna7a787dd2019-10-31 06:02:31 -0500517 ;;
Anusha Dathatri24b25a42024-05-31 05:57:45 -0500518 recoverystatus)
519 host_reboot_state=$(get_host_reboot_status)
520 if [[ $host_reboot_state == "true" ]]; then
521 host_reboot_status=1
522 else
523 host_reboot_status=0
524 fi
525
526 bmc_reboot_state=$(get_bmc_reboot_status)
527 if [[ $bmc_reboot_state == "on" ]]; then
528 bmc_reboot_status=1
529 else
530 bmc_reboot_status=0
531 fi
532
533 host_timeout_target_state=$(get_systemd_target_state $HOST_TIMEOUT_TARGET)
534 if [[ $host_timeout_target_state == "masked" ]]; then
535 host_timeout_status=0
536 else
537 host_timeout_status=1
538 fi
539
540 host_crash_target_state=$(get_systemd_target_state $HOST_CRASH_TARGET)
541 if [[ $host_crash_target_state == "masked" ]]; then
542 host_crash_status=0
543 else
544 host_crash_status=1
545 fi
546
547 if (( host_reboot_status && bmc_reboot_status && host_timeout_status && host_crash_status )); then
548 echo "recovery: On"
549 elif (( !host_reboot_status && !bmc_reboot_status && !host_timeout_status && !host_crash_status )); then
550 echo "recovery: Off"
551 else
552 echo "recovery: Undefined"
553 fi
554
555 declare -A status
556 status[0]="Off"
557 status[1]="On"
558
559 printf " %-11s: %s\n" "hostReboot" "${status[$host_reboot_status]}"
560 printf " %-11s: %s\n" "bmcReboot" "${status[$bmc_reboot_status]}"
561 printf " %-11s: %s\n" "hostTimeout" "${status[$host_timeout_status]}"
562 printf " %-11s: %s\n" "hostCrash" "${status[$host_crash_status]}"
563 ;;
Andrew Geissler3b7b5612020-05-14 10:45:29 -0500564 listbootblock)
565 blockingErrors=$(check_boot_block_errors)
566 if [ -z "$blockingErrors" ]; then
567 echo "No blocking errors present"
568 else
569 echo "$blockingErrors"
570 fi
571 ;;
Andrew Geissler295ee4f2020-05-14 14:14:05 -0500572 listlogs)
573 list_logs
574 ;;
Andrew Geisslerd8c63202020-05-14 15:06:31 -0500575 showlog)
Patrick Williamsb2398202021-04-13 20:53:26 -0500576 show_log "$2"
Andrew Geisslerd8c63202020-05-14 15:06:31 -0500577 ;;
Andrew Geissler42f28982020-05-14 15:12:42 -0500578 deletelogs)
579 delete_logs
580 ;;
Andrew Geisslerad1afe52022-02-23 16:07:06 -0600581 stopofftargets)
582 stop_off_targets
583 ;;
Anthony Wilson79f697e2018-09-13 13:48:52 -0500584 *)
Anthony Wilsonea87db42018-09-26 16:06:38 -0500585 print_usage_err "Invalid command '$1'"
Anthony Wilson79f697e2018-09-13 13:48:52 -0500586 ;;
587 esac
588}
589
Andrew Geisslerd8779cd2020-06-11 10:48:40 -0500590shiftcnt=0
Anthony Wilsonea87db42018-09-26 16:06:38 -0500591for arg in "$@"; do
592 case $arg in
Anthony Wilsonacf54d02018-09-20 15:19:28 -0500593 -w|--wait)
594 G_WAIT=30
Andrew Geisslerd8779cd2020-06-11 10:48:40 -0500595 shiftcnt=$((shiftcnt+1))
Anthony Wilsonacf54d02018-09-20 15:19:28 -0500596 continue
597 ;;
Anthony Wilsonea87db42018-09-26 16:06:38 -0500598 -h|--help)
599 print_help
600 ;;
Andrew Jeffery60c3ac82019-10-02 09:29:29 +0930601 -v|--verbose)
602 G_VERBOSE=y
Andrew Geisslerd8779cd2020-06-11 10:48:40 -0500603 shiftcnt=$((shiftcnt+1))
Andrew Jeffery60c3ac82019-10-02 09:29:29 +0930604 ;;
Potin Lai0e044c42022-05-13 23:42:31 +0800605 -i=*|--id=*)
606 G_INSTANCE_ID="${arg#*=}"
607 shiftcnt=$((shiftcnt+1))
608 ;;
Andrew Geisslerff6af282025-04-17 14:38:07 -0500609 -f|--force)
610 G_FORCE=y
611 shiftcnt=$((shiftcnt+1))
612 ;;
Anthony Wilsonea87db42018-09-26 16:06:38 -0500613 -*)
614 print_usage_err "Unknown option: $arg"
615 ;;
616 *)
Anthony Wilsonacf54d02018-09-20 15:19:28 -0500617 G_ORIG_CMD=$arg
Andrew Geisslerd8779cd2020-06-11 10:48:40 -0500618 # shift out the optional parameters
619 shift $shiftcnt
Andrew Geisslerd8c63202020-05-14 15:06:31 -0500620 # pass all arguments to handle_cmd in case command takes additional
621 # parameters
622 handle_cmd "$@"
Anthony Wilsonea87db42018-09-26 16:06:38 -0500623 break
624 ;;
625 esac
626done