Răsfoiți Sursa

Add info cli argument

Bertrand Chenal 7 ani în urmă
părinte
comite
55a2040e71
1 a modificat fișierele cu 41 adăugiri și 0 ștergeri
  1. 41 0
      baker.py

+ 41 - 0
baker.py

@@ -2,6 +2,7 @@ from getpass import getpass
 from hashlib import md5
 from itertools import chain
 from collections import ChainMap, OrderedDict, defaultdict
+from string import Formatter
 import argparse
 import io
 import logging
@@ -763,6 +764,8 @@ def load_cli(args=None):
                         default=0, help='Decrease verbosity')
     parser.add_argument('-n', '--no-color', action='store_true',
                         help='Disable colored logs')
+    parser.add_argument('-i', '--info', action='store_true',
+                        help='Print info')
     cli = parser.parse_args(args=args)
     cli = ObjectDict(vars(cli))
 
@@ -813,6 +816,40 @@ def get_hosts_and_tasks(cli, cfg):
     return dict(hosts=hosts, tasks=tasks)
 
 
+def info(cli):
+    formatter = Formatter()
+    for name, attr in cli.cfg.tasks.items():
+        kind = 'remote'
+        if attr.python:
+            kind = 'python'
+        elif attr.local:
+            kind = 'local'
+        elif attr.multi:
+            kind = 'multi'
+        elif attr.send:
+            kind = 'send file'
+
+        print(f'{name} [{kind}]:\n\tDescription: {attr.desc}')
+
+        values = []
+        for v in attr.values():
+            if isinstance(v, list):
+                values.extend(v)
+            elif isinstance(v, dict):
+                values.extend(v.values())
+            else:
+                values.append(v)
+        values = filter(lambda x: isinstance(x, str), values)
+        fmt_fields = [i[1] for v in values for i in formatter.parse(v) if i[1]]
+        if fmt_fields:
+            variables = ', '.join(sorted(set(fmt_fields)))
+        else:
+            variables = None
+
+        if variables:
+            print(f'\tVariables: {variables}')
+
+
 def main():
     cli = None
     try:
@@ -824,6 +861,10 @@ def main():
         log_handler.setLevel(level)
         logger.setLevel(level)
 
+        if cli.info:
+            info(cli)
+            return
+
         base_env = Env(
             cli.env, # Highest-priority
             cli.cfg.get('env'),