Revert "Revert "skeleton: Remove obmcutil""
This reverts commit c0da84767c00657c0b3b1afff7d9c5c2f1ed5fdb.
We have switched to the bash implementation of obmcutil, so this is no
longer required.
Change-Id: I10e8008e639bbc6d5d1078d7bcb7c0fa575cc62b
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
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 @@
setup(name='pytools',
version='1.0',
- scripts=['obmcutil', 'gpioutil'],
+ scripts=['gpioutil'],
)