From a738350d00b3171a1cbf0a749381b1ac36b4b7f8 Mon Sep 17 00:00:00 2001 From: Anthony Wilson Date: Sun, 27 Jan 2019 20:44:53 -0600 Subject: skeleton: Remove obmcutil In the effort to remove python from the bmc, obmcutil has been rewritten in 'sh' and moved to phosphor-state-manager. Change-Id: I39dd0e09fada7c7036b14316376e451ae3e2d330 Signed-off-by: Anthony Wilson --- pytools/obmcutil | 323 ----------------------------------------- pytools/obmcutil-completion.sh | 11 -- pytools/setup.py | 2 +- 3 files changed, 1 insertion(+), 335 deletions(-) delete mode 100644 pytools/obmcutil delete mode 100644 pytools/obmcutil-completion.sh diff --git a/pytools/obmcutil b/pytools/obmcutil deleted file mode 100644 index 0aa40a9..0000000 --- a/pytools/obmcutil +++ /dev/null @@ -1,323 +0,0 @@ -#!/usr/bin/python - -import sys -import dbus -import argparse - -from dbus.mainloop.glib import DBusGMainLoop -import gobject -import json -import os -import signal -import time -from glob import glob -from os.path import join -from subprocess import Popen - -import obmc_system_config - -descriptors = { - 'power': { - 'bus_name': 'org.openbmc.control.Power', - 'object_name': '/org/openbmc/control/power0', - 'interface_name': 'org.openbmc.control.Power' - }, - 'chassison': { - 'bus_name': 'xyz.openbmc_project.State.Chassis', - 'object_name': '/xyz/openbmc_project/state/chassis0', - 'interface_name': 'xyz.openbmc_project.State.Chassis', - 'property': 'RequestedPowerTransition', - 'value': 'xyz.openbmc_project.State.Chassis.Transition.On', - 'monitor': 'obmc-chassis-poweron@0.target', - }, - 'chassisoff': { - 'bus_name': 'xyz.openbmc_project.State.Chassis', - 'object_name': '/xyz/openbmc_project/state/chassis0', - 'interface_name': 'xyz.openbmc_project.State.Chassis', - 'property': 'RequestedPowerTransition', - 'value': 'xyz.openbmc_project.State.Chassis.Transition.Off', - 'monitor': 'obmc-chassis-hard-poweroff@0.target', - }, - 'poweron': { - 'bus_name': 'xyz.openbmc_project.State.Host', - 'object_name': '/xyz/openbmc_project/state/host0', - 'interface_name': 'xyz.openbmc_project.State.Host', - 'property': 'RequestedHostTransition', - 'value': 'xyz.openbmc_project.State.Host.Transition.On', - 'monitor': 'obmc-host-start@0.target', - }, - 'poweroff': { - 'bus_name': 'xyz.openbmc_project.State.Host', - 'object_name': '/xyz/openbmc_project/state/host0', - 'interface_name': 'xyz.openbmc_project.State.Host', - 'property': 'RequestedHostTransition', - 'value': 'xyz.openbmc_project.State.Host.Transition.Off', - 'monitor': 'obmc-host-stop@0.target', - }, - 'bmcstate': { - 'bus_name': 'xyz.openbmc_project.State.BMC', - 'object_name': '/xyz/openbmc_project/state/bmc0', - 'interface_name': 'xyz.openbmc_project.State.BMC', - 'property': 'CurrentBMCState', - }, - 'chassisstate': { - 'bus_name': 'xyz.openbmc_project.State.Chassis', - 'object_name': '/xyz/openbmc_project/state/chassis0', - 'interface_name': 'xyz.openbmc_project.State.Chassis', - 'property': 'CurrentPowerState', - }, - 'hoststate': { - 'bus_name': 'xyz.openbmc_project.State.Host', - 'object_name': '/xyz/openbmc_project/state/host0', - 'interface_name': 'xyz.openbmc_project.State.Host', - 'property': 'CurrentHostState', - }, - 'bootprogress': { - 'bus_name': 'xyz.openbmc_project.State.Host', - 'object_name': '/xyz/openbmc_project/state/host0', - 'interface_name': 'xyz.openbmc_project.State.Boot.Progress', - 'property': 'BootProgress', - }, - 'state' : ['bmcstate', 'chassisstate', 'hoststate'], - 'status' : ['bmcstate', 'chassisstate', 'hoststate'], -} - -GPIO_DEFS_FILE = '/etc/default/obmc/gpio/gpio_defs.json' - - -def find_gpio_base(path="/sys/class/gpio/"): - pattern = "gpiochip*" - for gc in glob(join(path, pattern)): - with open(join(gc, "label")) as f: - label = f.readline().strip() - if label == "1e780000.gpio": - with open(join(gc, "base")) as f: - return int(f.readline().strip()) - # trigger a file not found exception - open(join(path, "gpiochip")) - - -GPIO_BASE = find_gpio_base() - - -def convertGpio(name): - offset = int(''.join(list(filter(str.isdigit, name)))) - port = list(filter(str.isalpha, name.upper())) - a = ord(port[-1]) - ord('A') - if len(port) > 1: - a += 26 - base = a * 8 + GPIO_BASE - return base + offset - - -def run_set_property(dbus_bus, dbus_iface, descriptor, args): - mainloop = gobject.MainLoop() - - iface = descriptor['interface_name'] - prop = descriptor['property'] - - if 'monitor' not in descriptor: - dbus_iface.Set(iface, prop, descriptor['value']) - return True - - def property_listener(job, path, unit, state): - if descriptor['monitor'] != unit: - return - - property_listener.success = (state == 'done') - mainloop.quit() - - property_listener.success = True - - if args.wait and args.verbose: - pid = Popen(["/bin/journalctl", "-f", "--no-pager"]).pid - - if args.wait: - sig_match = dbus_bus.add_signal_receiver(property_listener, "JobRemoved") - - dbus_iface.Set(iface, prop, descriptor['value']) - - if args.wait: - mainloop.run() - sig_match.remove() - - if args.wait and args.verbose: - # wait some time for the journal output - time.sleep(args.wait_tune) - os.kill(pid, signal.SIGTERM) - - return property_listener.success - -def get_dbus_obj(dbus_bus, bus, obj, args): - if not args.wait: - return dbus_bus.get_object(bus, obj) - - mainloop = gobject.MainLoop() - - def property_listener(job, path, unit, state): - if 'obmc-standby.target' == unit: - mainloop.quit() - - sig_match = dbus_bus.add_signal_receiver(property_listener, "JobRemoved") - try: - return dbus_bus.get_object(bus, obj) - except dbus.exceptions.DBusException as e: - if args.verbose: - pid = Popen(["/bin/journalctl", "-f", "--no-pager"]).pid - - mainloop.run() - - if args.verbose: - os.kill(pid, signal.SIGTERM) - finally: - sig_match.remove() - - return dbus_bus.get_object(bus, obj) - -def run_one_command(dbus_bus, descriptor, args): - bus = descriptor['bus_name'] - obj = descriptor['object_name'] - iface = descriptor['interface_name'] - dbus_obj = get_dbus_obj(dbus_bus, bus, obj, args) - result = None - - if 'property' in descriptor: - dbus_iface = dbus.Interface(dbus_obj, "org.freedesktop.DBus.Properties") - if 'value' in descriptor: - result = run_set_property(dbus_bus, dbus_iface, descriptor, args) - else: - prop = descriptor['property'] - dbus_prop = dbus_iface.Get(iface, prop) - print '{:<20}: {}'.format(prop, str(dbus_prop)) - result = True - else: - dbus_iface = dbus.Interface(dbus_obj, "org.freedesktop.DBus.Properties") - props = dbus_iface.GetAll(iface) - for p in props: - print "{} = {}".format(p, str(props[p])) - result = True - - return result - -def run_all_commands(dbus_bus, recipe, args): - if isinstance(recipe, dict): - return run_one_command(dbus_bus, recipe, args) - - assert isinstance(recipe, list) - for command in recipe: - descriptor = descriptors[command] - if not run_one_command(dbus_bus, descriptor, args): - print "Failed to execute command: {}".format(descriptor) - return False - - return True - -def gpio_set_value(gpio_name, active_low, asserted): - gpio_id = convertGpio(gpio_name) - gpio_value_path = "/sys/class/gpio/gpio{}/value".format(gpio_id) - - with open(gpio_value_path, 'w') as gpio: - # Inversion behaviour needs to change with the resolution of - # https://github.com/openbmc/openbmc/issues/2489, where properly - # configuring the kernel will allow it to handle the inversion for us. - gpio.write(str(int(asserted ^ active_low))) - - return True - -def gpio_deassert(gpio_name, active_low, args): - # Deal with silly python2 exception handling as outlined in main - if args.verbose: - return gpio_set_value(gpio_name, active_low, False) - - try: - return gpio_set_value(gpio_name, active_low, False) - except IOError as e: - print >> sys.stderr, "Failed to access GPIO {}: {}".format(gpio_name, e.message) - return False - -def run_chassiskill(args): - # We shouldn't be able to invoke run_chassiskill() unless it's been - # explicitly added as a valid command to argparse in main() - assert can_chassiskill() - - data = {} - with open(GPIO_DEFS_FILE, 'r') as json_input: - data = json.load(json_input) - - gpios = data['gpio_configs']['power_config']['power_up_outs'] - defs = data['gpio_definitions'] - - for gpio in gpios: - - definition = filter(lambda g: g['name'] == gpio['name'], defs) - if len(definition) == 0: - print >> sys.stderr, "Missing definition for GPIO {}".format(gpio['name']) - continue - - pin = str(definition[0]['pin']) - active_low = not gpio['polarity'] - - if not gpio_deassert(pin, active_low, args): - return False - - return True - -def can_chassiskill(): - - try: - with open(GPIO_DEFS_FILE, 'r') as json_input: - data = json.load(json_input) - gpios = data['gpio_configs']['power_config']['power_up_outs'] - return len(gpios) > 0 - except: - pass - - return False - -def main(): - dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) - - # Conditionally add the `chassiskill` command based on whether the - # required GPIO configuration is present in the system description. - if can_chassiskill(): - descriptors['chassiskill'] = None - - parser = argparse.ArgumentParser() - parser.add_argument('--verbose', '-v', action='store_true', - help="Verbose output") - parser.add_argument('--wait', '-w', action='store_true', - help='Block until the state transition succeeds or fails') - parser.add_argument('--wait-tune', '-t', nargs='?', default=8, type=float, - # help='Seconds to wait for journal output to complete after receiving DBus signal', - help=argparse.SUPPRESS) - parser.add_argument('recipe', choices=sorted(descriptors.keys())) - args = parser.parse_args() - - # This is a special case: directly pull the power, don't do any D-Bus - # related stuff - if args.recipe == "chassiskill": - return run_chassiskill(args) - - dbus_bus = dbus.SystemBus() - - # The only way to get a sensible backtrace with python 2 without stupid - # hoops is to let the uncaught exception handler do the work for you. - # Catching and binding an exception appears to overwrite the stack trace at - # the point of bind. - # - # So, if we're in verbose mode, don't try to catch the DBus exception. That - # way we can understand where it originated. - if args.verbose: - return run_all_commands(dbus_bus, descriptors[args.recipe], args) - - # Otherwise, we don't care about the traceback. Just catch it and print the - # error message. - try: - return run_all_commands(dbus_bus, descriptors[args.recipe], args) - except dbus.exceptions.DBusException as e: - print >> sys.stderr, "DBus error occurred: {}".format(e.get_dbus_message()) - finally: - dbus_bus.close() - -if __name__ == "__main__": - sys.exit(0 if main() else 1) diff --git a/pytools/obmcutil-completion.sh b/pytools/obmcutil-completion.sh deleted file mode 100644 index 9790025..0000000 --- a/pytools/obmcutil-completion.sh +++ /dev/null @@ -1,11 +0,0 @@ -_obmcutil() { - COMPREPLY=() - cur=${COMP_WORDS[COMP_CWORD]} - - opts="bmcstate bootprogress chassiskill chassisoff chassison chassisstate hoststate power poweroff poweron state -h --help -v --verbose -w --wait" - - # complete -* with long options. - COMPREPLY=($(compgen -W "$opts" -- $cur)) -} - -complete -F _obmcutil obmcutil diff --git a/pytools/setup.py b/pytools/setup.py index 2736366..673bd3b 100644 --- a/pytools/setup.py +++ b/pytools/setup.py @@ -2,5 +2,5 @@ from distutils.core import setup setup(name='pytools', version='1.0', - scripts=['obmcutil', 'gpioutil'], + scripts=['gpioutil'], ) -- cgit v1.2.1