xref: /openbmc/phosphor-state-manager/obmcutil (revision ff6af28d51cbc56f8e1e6e97b3d0d7c05dd23c96)
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