forked from ungleich-public/cdist
Regain Python 3.2 support
This commit is contained in:
parent
74e5d7182a
commit
151aa80ebd
11 changed files with 89 additions and 24 deletions
|
@ -129,7 +129,8 @@ class Config(object):
|
|||
@staticmethod
|
||||
def hosts(source):
|
||||
try:
|
||||
yield from cdist.hostsource.HostSource(source)()
|
||||
for x in cdist.hostsource.HostSource(source)():
|
||||
yield x
|
||||
except (IOError, OSError, UnicodeError) as e:
|
||||
raise cdist.Error(
|
||||
"Error reading hosts from \'{}\': {}".format(
|
||||
|
|
|
@ -28,6 +28,11 @@ import cdist.core
|
|||
from cdist.util import fsproperty
|
||||
|
||||
|
||||
# FileNotFoundError is added in 3.3.
|
||||
if not hasattr(__builtins__, 'FileNotFoundError'):
|
||||
FileNotFoundError = (OSError, IOError, )
|
||||
|
||||
|
||||
class IllegalObjectIdError(cdist.Error):
|
||||
def __init__(self, object_id, message=None):
|
||||
self.object_id = object_id
|
||||
|
|
|
@ -26,6 +26,11 @@ import cdist.core
|
|||
import logging
|
||||
|
||||
|
||||
# FileNotFoundError is added in 3.3.
|
||||
if not hasattr(__builtins__, 'FileNotFoundError'):
|
||||
FileNotFoundError = (OSError, IOError, )
|
||||
|
||||
|
||||
class InvalidTypeError(cdist.Error):
|
||||
def __init__(self, name, type_path, type_absolute_path):
|
||||
self.name = name
|
||||
|
|
|
@ -26,6 +26,12 @@ import os
|
|||
import cdist
|
||||
from . import util
|
||||
|
||||
|
||||
# FileNotFoundError is added in 3.3.
|
||||
if not hasattr(__builtins__, 'FileNotFoundError'):
|
||||
FileNotFoundError = (OSError, IOError, )
|
||||
|
||||
|
||||
'''
|
||||
common:
|
||||
runs only locally, does not need remote
|
||||
|
|
|
@ -32,6 +32,11 @@ from cdist import flock
|
|||
from cdist.core.manifest import Manifest
|
||||
|
||||
|
||||
# FileNotFoundError is added in 3.3.
|
||||
if not hasattr(__builtins__, 'FileNotFoundError'):
|
||||
FileNotFoundError = (OSError, IOError, )
|
||||
|
||||
|
||||
class MissingRequiredEnvironmentVariableError(cdist.Error):
|
||||
def __init__(self, name):
|
||||
self.name = name
|
||||
|
|
|
@ -191,9 +191,14 @@ class Local(object):
|
|||
|
||||
close_stdout = False
|
||||
close_stderr = False
|
||||
stderr_special_devnull = False
|
||||
stdout_special_devnull = False
|
||||
if quiet:
|
||||
stderr = subprocess.DEVNULL
|
||||
stdout = subprocess.DEVNULL
|
||||
stderr, close_stderr = util._get_devnull()
|
||||
stderr_special_devnull = not close_stderr
|
||||
|
||||
stdout, close_stdout = util._get_devnull()
|
||||
stdout_special_devnull = not close_stdout
|
||||
elif do_save_output:
|
||||
if not return_output and stdout is None:
|
||||
stdout = util.get_std_fd(self.stdout_base_path, 'local')
|
||||
|
@ -228,7 +233,9 @@ class Local(object):
|
|||
output = None
|
||||
|
||||
if do_save_output:
|
||||
if not stderr_special_devnull:
|
||||
util.log_std_fd(self.log, command, stderr, 'Local stderr')
|
||||
if not stdout_special_devnull:
|
||||
util.log_std_fd(self.log, command, stdout, 'Local stdout')
|
||||
return output
|
||||
except (OSError, subprocess.CalledProcessError) as error:
|
||||
|
@ -237,8 +244,14 @@ class Local(object):
|
|||
if message_prefix:
|
||||
message.merge_messages()
|
||||
if close_stdout:
|
||||
if isinstance(stdout, int):
|
||||
os.close(stdout)
|
||||
else:
|
||||
stdout.close()
|
||||
if close_stderr:
|
||||
if isinstance(stderr, int):
|
||||
os.close(stderr)
|
||||
else:
|
||||
stderr.close()
|
||||
|
||||
def run_script(self, script, env=None, return_output=False,
|
||||
|
|
|
@ -24,12 +24,10 @@ import os
|
|||
import glob
|
||||
import subprocess
|
||||
import logging
|
||||
import multiprocessing
|
||||
|
||||
import cdist
|
||||
import cdist.exec.util as util
|
||||
import cdist.util.ipaddr as ipaddr
|
||||
from cdist.mputil import mp_pool_run
|
||||
|
||||
|
||||
def _wrap_addr(addr):
|
||||
|
@ -298,10 +296,11 @@ class Remote(object):
|
|||
os_environ['__target_fqdn'] = self.target_host[2]
|
||||
|
||||
self.log.trace("Remote run: %s", command)
|
||||
special_devnull = False
|
||||
try:
|
||||
if self.quiet_mode:
|
||||
stderr = subprocess.DEVNULL
|
||||
close_stderr = False
|
||||
stderr, close_stderr = util._get_devnull()
|
||||
special_devnull = not close_stderr
|
||||
if return_output:
|
||||
output = subprocess.check_output(command, env=os_environ,
|
||||
stderr=stderr).decode()
|
||||
|
@ -311,6 +310,7 @@ class Remote(object):
|
|||
output = None
|
||||
|
||||
if self.save_output_streams:
|
||||
if not special_devnull:
|
||||
util.log_std_fd(self.log, command, stderr, 'Remote stderr')
|
||||
util.log_std_fd(self.log, command, stdout, 'Remote stdout')
|
||||
|
||||
|
@ -323,4 +323,7 @@ class Remote(object):
|
|||
if close_stdout:
|
||||
stdout.close()
|
||||
if close_stderr:
|
||||
if isinstance(stderr, int):
|
||||
os.close(stderr)
|
||||
else:
|
||||
stderr.close()
|
||||
|
|
|
@ -172,11 +172,19 @@ def get_std_fd(base_path, name):
|
|||
return stdfd
|
||||
|
||||
|
||||
# subprocess.DEVNULL is added in 3.3.
|
||||
if hasattr(subprocess, 'DEVNULL'):
|
||||
def log_std_fd(log, command, stdfd, prefix):
|
||||
if stdfd is not None and stdfd != subprocess.DEVNULL:
|
||||
stdfd.seek(0, 0)
|
||||
log.trace("Command: {}; {}: {}".format(
|
||||
command, prefix, stdfd.read().decode()))
|
||||
log.trace("Command: {}; {}: {}".format(command, prefix,
|
||||
stdfd.read().decode()))
|
||||
else:
|
||||
def log_std_fd(log, command, stdfd, prefix):
|
||||
if stdfd is not None and not isinstance(stdfd, int):
|
||||
stdfd.seek(0, 0)
|
||||
log.trace("Command: {}; {}: {}".format(command, prefix,
|
||||
stdfd.read().decode()))
|
||||
|
||||
|
||||
def dist_conf_dir():
|
||||
|
@ -210,3 +218,11 @@ def resolve_conf_dirs_from_config_and_args(args):
|
|||
cfg = cdist.configuration.Configuration(args)
|
||||
configuration = cfg.get_config(section='GLOBAL')
|
||||
return resolve_conf_dirs(configuration, args.conf_dir)
|
||||
|
||||
|
||||
# subprocess.DEVNULL is added in 3.3.
|
||||
def _get_devnull():
|
||||
if hasattr(subprocess, 'DEVNULL'):
|
||||
return (subprocess.DEVNULL, False)
|
||||
else:
|
||||
return (os.open(os.devnull, os.O_RDWR), True)
|
||||
|
|
|
@ -24,6 +24,11 @@ import logging
|
|||
import os
|
||||
|
||||
|
||||
# FileNotFoundError is added in 3.3.
|
||||
if not hasattr(__builtins__, 'FileNotFoundError'):
|
||||
FileNotFoundError = (OSError, IOError, )
|
||||
|
||||
|
||||
log = logging.getLogger('cdist-flock')
|
||||
|
||||
|
||||
|
|
|
@ -68,9 +68,12 @@ class HostSource(object):
|
|||
return
|
||||
|
||||
if isinstance(self.source, str):
|
||||
yield from self._hosts_from_file()
|
||||
for x in self._hosts_from_file():
|
||||
yield x
|
||||
else:
|
||||
yield from self._hosts_from_sequence()
|
||||
for x in self._hosts_from_sequence():
|
||||
yield x
|
||||
|
||||
def __call__(self):
|
||||
yield from self.hosts()
|
||||
for x in self.hosts():
|
||||
yield x
|
||||
|
|
|
@ -43,18 +43,21 @@ def scan_preos_dir_plugins(dir):
|
|||
module_name = fname
|
||||
try:
|
||||
module = __import__(module_name)
|
||||
yield from preos_plugin(module)
|
||||
for x in preos_plugin(module):
|
||||
yield x
|
||||
clsmembers = inspect.getmembers(module, inspect.isclass)
|
||||
for cm in clsmembers:
|
||||
c = cm[1]
|
||||
yield from preos_plugin(c)
|
||||
for x in preos_plugin(c):
|
||||
yield x
|
||||
except ImportError as e:
|
||||
log.warning("Cannot import '{}': {}".format(module_name, e))
|
||||
|
||||
|
||||
def find_preos_plugins():
|
||||
for dir in _PLUGINS_PATH:
|
||||
yield from scan_preos_dir_plugins(dir)
|
||||
for x in scan_preos_dir_plugins(dir):
|
||||
yield x
|
||||
|
||||
|
||||
def find_preoses():
|
||||
|
|
Loading…
Reference in a new issue