Browse Source

Add info cli argument

Bertrand Chenal 7 years ago
parent
commit
55a2040e71
1 changed files with 41 additions and 0 deletions
  1. 41 0
      baker.py

+ 41 - 0
baker.py

@@ -2,6 +2,7 @@ from getpass import getpass
 from hashlib import md5
 from hashlib import md5
 from itertools import chain
 from itertools import chain
 from collections import ChainMap, OrderedDict, defaultdict
 from collections import ChainMap, OrderedDict, defaultdict
+from string import Formatter
 import argparse
 import argparse
 import io
 import io
 import logging
 import logging
@@ -763,6 +764,8 @@ def load_cli(args=None):
                         default=0, help='Decrease verbosity')
                         default=0, help='Decrease verbosity')
     parser.add_argument('-n', '--no-color', action='store_true',
     parser.add_argument('-n', '--no-color', action='store_true',
                         help='Disable colored logs')
                         help='Disable colored logs')
+    parser.add_argument('-i', '--info', action='store_true',
+                        help='Print info')
     cli = parser.parse_args(args=args)
     cli = parser.parse_args(args=args)
     cli = ObjectDict(vars(cli))
     cli = ObjectDict(vars(cli))
 
 
@@ -813,6 +816,40 @@ def get_hosts_and_tasks(cli, cfg):
     return dict(hosts=hosts, tasks=tasks)
     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():
 def main():
     cli = None
     cli = None
     try:
     try:
@@ -824,6 +861,10 @@ def main():
         log_handler.setLevel(level)
         log_handler.setLevel(level)
         logger.setLevel(level)
         logger.setLevel(level)
 
 
+        if cli.info:
+            info(cli)
+            return
+
         base_env = Env(
         base_env = Env(
             cli.env, # Highest-priority
             cli.env, # Highest-priority
             cli.cfg.get('env'),
             cli.cfg.get('env'),