Point obmcutil chassiskill code at the GPIO JSON

Change-Id: Ic4de4f9de2c1755be3430b30ed72dfdbca56f787
Signed-off-by: Matt Spinler <spinler@us.ibm.com>
diff --git a/pytools/obmcutil b/pytools/obmcutil
index 8c3f6c9..0a0d8d1 100644
--- a/pytools/obmcutil
+++ b/pytools/obmcutil
@@ -6,6 +6,7 @@
 
 from dbus.mainloop.glib import DBusGMainLoop
 import gobject
+import json
 import os
 import signal
 import time
@@ -80,6 +81,8 @@
     'status' : ['bmcstate', 'chassisstate', 'hoststate'],
 }
 
+GPIO_DEFS_FILE = '/etc/default/obmc/gpio/gpio_defs.json'
+
 def run_set_property(dbus_bus, dbus_iface, descriptor, args):
     mainloop = gobject.MainLoop()
 
@@ -210,40 +213,37 @@
     # explicitly added as a valid command to argparse in main()
     assert can_chassiskill()
 
-    # Multi-dimensional fetch is now exception-safe
-    gpios = obmc_system_config.GPIO_CONFIGS['power_config']['power_up_outs']
+    data = {}
+    with open(GPIO_DEFS_FILE, 'r') as json_input:
+        data = json.load(json_input)
 
-    gc = obmc_system_config.GPIO_CONFIG
+    gpios = data['gpio_configs']['power_config']['power_up_outs']
+    defs = data['gpio_definitions']
 
     for gpio in gpios:
-        function = gpio[0]
 
-        if function not in gc or 'gpio_pin' not in gc[function]:
-            print >> sys.stderr, "Missing or invalid definition for '{}' in system GPIO_CONFIG".format(function)
+        definition = filter(lambda g: g['name'] == gpio['name'], defs)
+        if len(definition) == 0:
+            print >> sys.stderr, "Missing definition for GPIO {}".format(gpio['name'])
             continue
 
-        name = gc[function]['gpio_pin']
+        pin = str(definition[0]['pin'])
+        active_low = not gpio['polarity']
 
-        # The second element of the tuples stashed in 'power_up_outs'
-        # represents the boolean condition of the statement 'active high'. To
-        # mirror the code at [1] we instead need the condition of the statement
-        # 'active low', thus we negate gpio[1].
-        #
-        # [1] https://github.com/openbmc/skeleton/blob/93b84e42834893313616f96c70743369f26a7190/op-pwrctl/power_control_obj.c#L283
-        active_low = not gpio[1]
-
-        if not gpio_deassert(name, active_low, args):
+        if not gpio_deassert(pin, active_low, args):
             return False
 
     return True
 
 def can_chassiskill():
-    gcs = obmc_system_config.GPIO_CONFIGS
 
-    if 'power_config' in gcs:
-        if 'power_up_outs' in gcs['power_config']:
-            # Just to be sure
-            return len(gcs['power_config']) > 0
+    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