Remove safestructs which wasn't being used anywhere
[invirt/packages/invirt-base.git] / scripts / invirt-getconf
index 4ae35f3..07e475b 100755 (executable)
@@ -16,69 +16,65 @@ Examples:
   invirt-getconf hosts.0.ip
 """
 
-from invirt import config
-from sys import argv, exit, stderr, stdout
-from optparse import OptionParser
-
-class invirt_exception(Exception): pass
-
-def main(argv):
-    try:
-        parser = OptionParser(usage = '%prog [options] key',
-                description = __doc__.strip().split('\n\n')[0])
-        parser.add_option('-r', '--refresh',
-                action = 'store_true',
-                help = 'force the cache to be regenerated')
-        parser.add_option('-l', '--ls',
-                action = 'store_true',
-                help = 'list node\'s children')
-        opts, args = parser.parse_args()
-
-        if len(args) > 1:
-            raise invirt_exception(__doc__.strip())
-        elif args and args[0]:
-            components = args[0].split('.')
+import argparse
+import sys
+import yaml
+
+import invirt
+
+
+class PathResolutionException(Exception):
+    pass
+
+
+def main():
+    parser = argparse.ArgumentParser(description='Get values from invirt configuration file')
+    parser.add_argument('-r', '--refresh', action='store_true', help='Force regenerate the cache')
+    parser.add_argument('-l', '--ls', action='store_true', help='List children of node')
+    parser.add_argument('path', nargs='?', default='', help='Path of value to get')
+
+    args = parser.parse_args()
+
+    components = args.path.split('.')
+
+    conf = invirt.config.load(args.refresh)
+    for i, component in enumerate(components):
+        progress = '.'.join(components[:i])
+
+        if isinstance(conf, list):
+            try:
+                component = int(component)
+            except ValueError:
+                raise PathResolutionException(f'{progress}: node is a list; integer path component required, '
+                                      'but got "{component}"')
+
+            try:
+                conf = conf[component]
+            except IndexError:
+                raise PathResolutionException(f'{progress}: index {component} out of range')
+        elif isinstance(conf, dict):
+            try:
+                conf = conf[component]
+            except KeyError:
+                raise PathResolutionException(f'{progress}: key "{component}" not found')
         else:
-            components = []
-
-        conf = config.load(opts.refresh)
-        for i, component in enumerate(components):
-            progress = '.'.join(components[:i])
-            if type(conf) not in (dict, list):
-                raise invirt_exception(
-                        '%s: node has no children (atomic datum)' % progress)
-            if type(conf) == list:
-                try: component = int(component)
-                except: raise invirt_exception(
-                        '%s: node a list; integer path component required, '
-                        'but got "%s"' % (progress, component))
-            try: conf = conf[component]
-            except KeyError: raise invirt_exception(
-                    '%s: key "%s" not found' % (progress, component))
-            except IndexError: raise invirt_exception(
-                    '%s: index %s out of range' % (progress, component))
-
-        if opts.ls:
-            if type(conf) not in (dict, list):
-                raise invirt_exception(
-                        '%s: node has no children (atomic datum)'
-                        % '.'.join(components))
-            if type(conf) == list:
-                for i in xrange(len(conf)):
-                    print i
-            else:
-                for k in conf.iterkeys():
-                    print k
+            raise PathResolutionException(f'{progress}: node has no children (atomic datum)')
+
+    if args.ls:
+        if isinstance(conf, list):
+            for i in range(len(conf)):
+                print(i)
+        elif isinstance(conf, dict):
+            for k in conf:
+                print(k)
+        else:
+            raise PathResolutionException(f'{".".join(components)}: node has no children (atomic datum)')
+    else:
+        if isinstance(conf, (dict, list)):
+            print(conf)
         else:
-            if type(conf) not in (dict, list):
-                print conf
-            else:
-                import yaml
-                yaml.dump(conf, stdout,
-                          Dumper=yaml.CSafeDumper, default_flow_style=False)
-    except invirt_exception, ex:
-        print >> stderr, ex
-        return 1
+            yaml.dump(conf, sys.stdout, Dumper=yaml.CSafeDumper, default_flow_style=False)
+
 
 if __name__ == '__main__':
-    exit(main(argv))
+    main()