Bladeren bron

Fix localhost execution, fix some PEP 8 and typo in tests.

Aurelien 5 jaren geleden
bovenliggende
commit
226b795822
3 gewijzigde bestanden met toevoegingen van 29 en 10 verwijderingen
  1. 7 7
      byrd/cli.py
  2. 21 2
      byrd/main.py
  3. 1 1
      tests/base_test.py

+ 7 - 7
byrd/cli.py

@@ -1,7 +1,7 @@
 import argparse
 import os
 
-from .config import yaml_load,ConfigRoot
+from .config import yaml_load, ConfigRoot
 from .main import get_hosts_and_tasks, run_batch, info
 from .utils import (enable_logging_color, log_handler, logger, ByrdException,
                     ObjectDict, Env, abort)
@@ -10,7 +10,6 @@ basedir, _ = os.path.split(__file__)
 PKG_DIR = os.path.join(basedir, 'pkg')
 
 
-
 def load_cfg(path, prefix=None):
     load_sections = ('networks', 'tasks', 'auth', 'env')
 
@@ -32,7 +31,6 @@ def load_cfg(path, prefix=None):
         for k, v in cfg['tasks'].items():
             v._cfg = cfg_cp
 
-
     # Recursive load
     if cfg.load:
         cfg_path = os.path.dirname(path)
@@ -52,7 +50,7 @@ def load_cfg(path, prefix=None):
             child_cfg = load_cfg(child_path, child_prefix)
             key_fn = lambda x: '/'.join([child_prefix, x])
             for section in load_sections:
-                if not section in child_cfg:
+                if section not in child_cfg:
                     continue
                 items = {key_fn(k): v for k, v in child_cfg[section].items()}
                 cfg[section].update(items)
@@ -61,7 +59,7 @@ def load_cfg(path, prefix=None):
 
 def load_cli(args=None):
     parser = argparse.ArgumentParser()
-    parser.add_argument('names',  nargs='*',
+    parser.add_argument('names', nargs='*',
                         help='Hosts and commands to run them on')
     parser.add_argument('-c', '--config', default='bd.yaml',
                         help='Config file')
@@ -98,6 +96,7 @@ def load_cli(args=None):
     cli.env = dict(e.split('=') for e in cli.env)
     return cli
 
+
 def run():
     cli = None
     try:
@@ -114,9 +113,9 @@ def run():
             return
 
         base_env = Env(
-            cli.env, # Highest-priority
+            cli.env,  # Highest-priority
             cli.cfg.get('env'),
-            os.environ, # Lowest
+            os.environ,  # Lowest
         )
         for task in cli.tasks:
             run_batch(task, cli.hosts, cli, base_env)
@@ -125,5 +124,6 @@ def run():
             raise
         abort(str(e))
 
+
 if __name__ == '__main__':
     run()

+ 21 - 2
byrd/main.py

@@ -2,6 +2,7 @@ from getpass import getpass
 from hashlib import md5
 from itertools import chain
 from itertools import islice
+from shutil import copy
 from string import Formatter
 import io
 import os
@@ -83,10 +84,26 @@ def connect(host, auth):
     return client
 
 
-def run_local(cmd, env, cli):
+def run_local(cmd_or_task, env, cli):
     # Run local task
-    cmd = env.fmt(cmd)
+    if isinstance(cmd_or_task, str):
+        cmd = env.fmt(cmd_or_task)
+    elif cmd_or_task.run:
+        cmd = env.fmt(cmd_or_task.run)
+    elif cmd_or_task.send:
+        local_path = env.fmt(cmd_or_task.send)
+        to_path = env.fmt(cmd_or_task.to)
+        if not os.path.exists(local_path):
+            raise ByrdException('Path "%s" not found' % local_path)
+        copy(local_path, to_path)
+        return None
     logger.info(env.fmt('{task_desc}', kind='new'))
+    if cmd_or_task.sudo:
+        if isinstance(cmd_or_task.sudo, str):
+            sudo_prefix = 'sudo -u %s sh -c "' % cmd_or_task.sudo
+        else:
+            sudo_prefix = 'sudo sh -c "'
+        cmd = sudo_prefix + cmd.replace('\n', '') + '"\n'
     if cli.dry_run:
         logger.info('[dry-run] ' + cmd)
         return None
@@ -305,6 +322,8 @@ def run_task(task, host, cli, env=None):
         res = run_local(task.local, env, cli)
     elif task.python:
         res = run_python(task, env, cli)
+    elif host == 'localhost':
+        res = run_local(task, env, cli)
     else:
         res = run_remote(task, host, env, cli)
 

+ 1 - 1
tests/base_test.py

@@ -4,7 +4,7 @@ from shlex import shlex
 import pytest
 
 from byrd.main import run_batch, Env
-from byrc.cli import load_cli
+from byrd.cli import load_cli
 
 
 def test_all_conf(test_cfg, log_buff):