fix modules and 2.6 compatibility
diff --git a/wally/run_test.py b/wally/run_test.py
index 5e6b4f9..9a3d04c 100755
--- a/wally/run_test.py
+++ b/wally/run_test.py
@@ -15,7 +15,12 @@
 
 import yaml
 import texttable
-import faulthandler
+
+try:
+    import faulthandler
+except ImportError:
+    faulthandler = None
+
 from concurrent.futures import ThreadPoolExecutor
 
 from wally import pretty_yaml
@@ -722,6 +727,17 @@
         return func.__name__ + " stage"
 
 
+def get_test_names(block):
+    assert len(block.items()) == 1
+    name, data = block.items()[0]
+    if name == 'start_test_nodes':
+        for in_blk in data['tests']:
+            for i in get_test_names(in_blk):
+                yield i
+    else:
+        yield name
+
+
 def list_results(path):
     results = []
 
@@ -738,15 +754,8 @@
         test_names = []
 
         for block in cfg['tests']:
-            assert len(block.items()) == 1
-            name, data = block.items()[0]
-            if name == 'start_test_nodes':
-                for in_blk in data['tests']:
-                    assert len(in_blk.items()) == 1
-                    in_name, _ = in_blk.items()[0]
-                    test_names.append(in_name)
-            else:
-                test_names.append(name)
+            test_names.extend(get_test_names(block))
+
         results.append((dname, test_names, res_mtime))
 
     tab = texttable.Texttable(max_width=120)
@@ -768,7 +777,9 @@
         list_results(argv[-1])
         exit(0)
 
-    faulthandler.register(signal.SIGUSR1, all_threads=True)
+    if faulthandler is not None:
+        faulthandler.register(signal.SIGUSR1, all_threads=True)
+
     opts = parse_args(argv)
     load_config(opts.config_file, opts.post_process_only)