forked from ungleich-public/cdist
		
	Merge branch 'master' into new-docs-format
This commit is contained in:
		
				commit
				
					
						54834e277d
					
				
			
		
					 4 changed files with 71 additions and 12 deletions
				
			
		|  | @ -26,6 +26,7 @@ import shutil | ||||||
| import sys | import sys | ||||||
| import time | import time | ||||||
| import pprint | import pprint | ||||||
|  | import itertools | ||||||
| 
 | 
 | ||||||
| import cdist | import cdist | ||||||
| 
 | 
 | ||||||
|  | @ -53,6 +54,27 @@ class Config(object): | ||||||
|         self.local.create_files_dirs() |         self.local.create_files_dirs() | ||||||
|         self.remote.create_files_dirs() |         self.remote.create_files_dirs() | ||||||
| 
 | 
 | ||||||
|  |     @staticmethod | ||||||
|  |     def hosts(source): | ||||||
|  |         """Yield hosts from source. | ||||||
|  |            Source can be a sequence or filename (stdin if \'-\'). | ||||||
|  |            In case of filename each line represents one host. | ||||||
|  |         """ | ||||||
|  |         if isinstance(source, str): | ||||||
|  |             import fileinput | ||||||
|  |             try: | ||||||
|  |                 for host in fileinput.input(files=(source)): | ||||||
|  |                     # remove leading and trailing whitespace | ||||||
|  |                     yield host.strip()   | ||||||
|  |             except (IOError, OSError) as e: | ||||||
|  |                 raise cdist.Error("Error reading hosts from \'{}\'".format( | ||||||
|  |                     source)) | ||||||
|  |         else: | ||||||
|  |             if source: | ||||||
|  |                 for host in source: | ||||||
|  |                     yield host | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|     @classmethod |     @classmethod | ||||||
|     def commandline(cls, args): |     def commandline(cls, args): | ||||||
|         """Configure remote system""" |         """Configure remote system""" | ||||||
|  | @ -60,6 +82,13 @@ class Config(object): | ||||||
| 
 | 
 | ||||||
|         # FIXME: Refactor relict - remove later |         # FIXME: Refactor relict - remove later | ||||||
|         log = logging.getLogger("cdist") |         log = logging.getLogger("cdist") | ||||||
|  | 
 | ||||||
|  |         if args.manifest == '-' and args.hostfile == '-': | ||||||
|  |             raise cdist.Error(("Cannot read both, manifest and host file, "  | ||||||
|  |                 "from stdin")) | ||||||
|  |         # if no host source is specified then read hosts from stdin | ||||||
|  |         if not (args.hostfile or args.host): | ||||||
|  |             args.hostfile = '-' | ||||||
|      |      | ||||||
|         initial_manifest_tempfile = None |         initial_manifest_tempfile = None | ||||||
|         if args.manifest == '-': |         if args.manifest == '-': | ||||||
|  | @ -79,8 +108,11 @@ class Config(object): | ||||||
|         process = {} |         process = {} | ||||||
|         failed_hosts = [] |         failed_hosts = [] | ||||||
|         time_start = time.time() |         time_start = time.time() | ||||||
|      | 
 | ||||||
|         for host in args.host: |         hostcnt = 0 | ||||||
|  |         for host in itertools.chain(cls.hosts(args.host), | ||||||
|  |                                     cls.hosts(args.hostfile)): | ||||||
|  |             hostcnt += 1 | ||||||
|             if args.parallel: |             if args.parallel: | ||||||
|                 log.debug("Creating child process for %s", host) |                 log.debug("Creating child process for %s", host) | ||||||
|                 process[host] = multiprocessing.Process(target=cls.onehost, args=(host, args, True)) |                 process[host] = multiprocessing.Process(target=cls.onehost, args=(host, args, True)) | ||||||
|  | @ -101,7 +133,7 @@ class Config(object): | ||||||
|                     failed_hosts.append(host) |                     failed_hosts.append(host) | ||||||
|      |      | ||||||
|         time_end = time.time() |         time_end = time.time() | ||||||
|         log.info("Total processing time for %s host(s): %s", len(args.host), |         log.info("Total processing time for %s host(s): %s", hostcnt, | ||||||
|                     (time_end - time_start)) |                     (time_end - time_start)) | ||||||
|      |      | ||||||
|         if len(failed_hosts) > 0: |         if len(failed_hosts) > 0: | ||||||
|  |  | ||||||
|  | @ -1,6 +1,10 @@ | ||||||
| Changelog | Changelog | ||||||
| --------- | --------- | ||||||
| 
 | 
 | ||||||
|  | next: | ||||||
|  | 	* Documentation: Migrate to reStructuredText format and sphinx (Darko Poljak) | ||||||
|  | 	* Core: Add -f option to read additional hosts from file/stdin (Darko Poljak) | ||||||
|  | 
 | ||||||
| 4.0.0: 2016-05-04 | 4.0.0: 2016-05-04 | ||||||
| 	* Core: Fix bug with parallel hosts operation when output path is specifed (Darko Poljak) | 	* Core: Fix bug with parallel hosts operation when output path is specifed (Darko Poljak) | ||||||
| 	* Type __package_pip: Add support for running as specified user (useful for pip in venv) (Darko Poljak) | 	* Type __package_pip: Add support for running as specified user (useful for pip in venv) (Darko Poljak) | ||||||
|  | @ -25,7 +29,6 @@ Changelog | ||||||
| 	* Type __consul: Add new consul versions (Nico Schottelius) | 	* Type __consul: Add new consul versions (Nico Schottelius) | ||||||
| 	* Type __apt_ppa: Do not install legacy package python-software-properties (Steven Armstrong) | 	* Type __apt_ppa: Do not install legacy package python-software-properties (Steven Armstrong) | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 3.1.13: 2015-05-16 | 3.1.13: 2015-05-16 | ||||||
| 	* Type __block: Fix support for non stdin blocks (Dominique Roux) | 	* Type __block: Fix support for non stdin blocks (Dominique Roux) | ||||||
| 	* Type __consul: Install package unzip (Nico Schottelius) | 	* Type __consul: Install package unzip (Nico Schottelius) | ||||||
|  |  | ||||||
|  | @ -14,7 +14,7 @@ SYNOPSIS | ||||||
| 
 | 
 | ||||||
|     cdist banner [-h] [-d] [-v] |     cdist banner [-h] [-d] [-v] | ||||||
| 
 | 
 | ||||||
|     cdist config [-h] [-d] [-V] [-c CONF_DIR] [-i MANIFEST] [-p] [-s] host [host ...] |     cdist config [-h] [-d] [-V] [-c CONF_DIR] [-f HOSTFILE] [-i MANIFEST] [-p] [-s] [host [host ...]] | ||||||
| 
 | 
 | ||||||
|     cdist shell [-h] [-d] [-v] [-s SHELL] |     cdist shell [-h] [-d] [-v] [-s SHELL] | ||||||
| 
 | 
 | ||||||
|  | @ -69,6 +69,13 @@ Configure one or more hosts | ||||||
|     --conf-dir argument have higher precedence over those set through the |     --conf-dir argument have higher precedence over those set through the | ||||||
|     environment variable. |     environment variable. | ||||||
| 
 | 
 | ||||||
|  | .. option:: -f HOSTFILE, --file HOSTFILE | ||||||
|  | 
 | ||||||
|  |     Read additional hosts to operate on from specified file | ||||||
|  |     or from stdin if '-' (each host on separate line). | ||||||
|  |     If no host or host file is specified then, by default, | ||||||
|  |     read hosts from stdin. | ||||||
|  | 
 | ||||||
| .. option:: -i MANIFEST, --initial-manifest MANIFEST | .. option:: -i MANIFEST, --initial-manifest MANIFEST | ||||||
| 
 | 
 | ||||||
|     Path to a cdist manifest or - to read from stdin |     Path to a cdist manifest or - to read from stdin | ||||||
|  | @ -118,6 +125,9 @@ EXAMPLES | ||||||
|         --remote-copy /path/to/my/remote/copy \ |         --remote-copy /path/to/my/remote/copy \ | ||||||
|         -p ikq02.ethz.ch ikq03.ethz.ch ikq04.ethz.ch |         -p ikq02.ethz.ch ikq03.ethz.ch ikq04.ethz.ch | ||||||
| 
 | 
 | ||||||
|  |     # Configure hosts read from file loadbalancers | ||||||
|  |     % cdist config -f loadbalancers | ||||||
|  | 
 | ||||||
|     # Display banner |     # Display banner | ||||||
|     cdist banner |     cdist banner | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -67,12 +67,14 @@ def commandline(): | ||||||
|         action='store_true', default=False) |         action='store_true', default=False) | ||||||
| 
 | 
 | ||||||
|     # Main subcommand parser |     # Main subcommand parser | ||||||
|     parser['main'] = argparse.ArgumentParser(description='cdist ' + cdist.VERSION, |     parser['main'] = argparse.ArgumentParser(description='cdist ' | ||||||
|  |             + cdist.VERSION, | ||||||
|         parents=[parser['loglevel']]) |         parents=[parser['loglevel']]) | ||||||
|     parser['main'].add_argument('-V', '--version', |     parser['main'].add_argument('-V', '--version', | ||||||
|         help='Show version', action='version', |         help='Show version', action='version', | ||||||
|         version='%(prog)s ' + cdist.VERSION) |         version='%(prog)s ' + cdist.VERSION) | ||||||
|     parser['sub'] = parser['main'].add_subparsers(title="Commands") |     parser['sub'] = parser['main'].add_subparsers(title="Commands", | ||||||
|  |             dest="command") | ||||||
| 
 | 
 | ||||||
|     # Banner |     # Banner | ||||||
|     parser['banner'] = parser['sub'].add_parser('banner',  |     parser['banner'] = parser['sub'].add_parser('banner',  | ||||||
|  | @ -82,11 +84,17 @@ def commandline(): | ||||||
|     # Config |     # Config | ||||||
|     parser['config'] = parser['sub'].add_parser('config', |     parser['config'] = parser['sub'].add_parser('config', | ||||||
|         parents=[parser['loglevel']]) |         parents=[parser['loglevel']]) | ||||||
|     parser['config'].add_argument('host', nargs='+', |     parser['config'].add_argument('host', nargs='*', | ||||||
|         help='one or more hosts to operate on') |         help='host(s) to operate on') | ||||||
|     parser['config'].add_argument('-c', '--conf-dir', |     parser['config'].add_argument('-c', '--conf-dir', | ||||||
|          help='Add configuration directory (can be repeated, last one wins)', |          help=('Add configuration directory (can be repeated, ' | ||||||
|          action='append') |              'last one wins)'), action='append') | ||||||
|  |     parser['config'].add_argument('-f', '--file', | ||||||
|  |          help=('Read additional hosts to operate on from specified file ' | ||||||
|  |              'or from stdin if \'-\' (each host on separate line). ' | ||||||
|  |              'If no host or host file is specified then, by default, ' | ||||||
|  |              'read hosts from stdin.'), | ||||||
|  |          dest='hostfile', required=False) | ||||||
|     parser['config'].add_argument('-i', '--initial-manifest',  |     parser['config'].add_argument('-i', '--initial-manifest',  | ||||||
|          help='Path to a cdist manifest or \'-\' to read from stdin.', |          help='Path to a cdist manifest or \'-\' to read from stdin.', | ||||||
|          dest='manifest', required=False) |          dest='manifest', required=False) | ||||||
|  | @ -108,7 +116,8 @@ def commandline(): | ||||||
|          action='store', dest='remote_copy', |          action='store', dest='remote_copy', | ||||||
|          default=os.environ.get('CDIST_REMOTE_COPY')) |          default=os.environ.get('CDIST_REMOTE_COPY')) | ||||||
|     parser['config'].add_argument('--remote-exec', |     parser['config'].add_argument('--remote-exec', | ||||||
|          help='Command to use for remote execution (should behave like ssh)', |          help=('Command to use for remote execution ' | ||||||
|  |                '(should behave like ssh)'), | ||||||
|          action='store', dest='remote_exec', |          action='store', dest='remote_exec', | ||||||
|          default=os.environ.get('CDIST_REMOTE_EXEC')) |          default=os.environ.get('CDIST_REMOTE_EXEC')) | ||||||
|     parser['config'].set_defaults(func=cdist.config.Config.commandline) |     parser['config'].set_defaults(func=cdist.config.Config.commandline) | ||||||
|  | @ -147,6 +156,11 @@ def commandline(): | ||||||
|             if args_dict['remote_copy'] is None: |             if args_dict['remote_copy'] is None: | ||||||
|                 args.remote_copy = cdist.REMOTE_COPY + mux_opts |                 args.remote_copy = cdist.REMOTE_COPY + mux_opts | ||||||
| 
 | 
 | ||||||
|  |     if args.command == 'config': | ||||||
|  |         if args.manifest == '-' and args.hostfile == '-': | ||||||
|  |             print('cdist config: error: cannot read both, manifest and host file, from stdin') | ||||||
|  |             sys.exit(1) | ||||||
|  | 
 | ||||||
|     log.debug(args) |     log.debug(args) | ||||||
|     log.info("version %s" % cdist.VERSION) |     log.info("version %s" % cdist.VERSION) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue