def _configure_module(self, module_name, module_args, task_vars=None): if task_vars is None: task_vars = dict() if self._task.delegate_to: real_vars = task_vars.get('ansible_delegated_vars', dict()).get(self._task.delegate_to, dict()) else: real_vars = task_vars if real_vars.get('ansible_connection', '') not in ('local',) and \ 'openwrt' in real_vars.get('group_names', list()): leaf_module_name = resource_from_fqcr(module_name) openwrt_module = self._shared_loader_obj.module_loader.find_plugin( 'openwrt_' + leaf_module_name, '.sh') if openwrt_module: module_name = os.path.basename(openwrt_module)[:-3] else: openwrt_module = None (module_style, module_shebang, module_data, module_path) = \ self.__configure_module(module_name, module_args, task_vars) if openwrt_module: with open(_wrapper_file, 'r') as f: wrapper_data = f.read() if type(module_data) is bytes: module_data = module_data.decode() module_data = wrapper_data.replace('\n. "$_script"\n', '\n' + module_data + '\n') _fix_module_args(module_args) return (module_style, module_shebang, module_data, module_path)
def __init__(self, *args, **kwargs): # Third party code is not using cache_loader to load plugin - fall back to previous behavior if not hasattr(self, '_load_name'): display.deprecated('Rather than importing custom CacheModules directly, use ansible.plugins.loader.cache_loader', version='2.14', collection_name='ansible.builtin') self._load_name = self.__module__.split('.')[-1] self._load_name = resource_from_fqcr(self.__module__) super(BaseCacheModule, self).__init__() self.set_options(var_options=args, direct=kwargs)
def __init__(self, *args, **kwargs): try: super(BaseFileCacheModule, self).__init__(*args, **kwargs) self._cache_dir = self._get_cache_connection(self.get_option('_uri')) self._timeout = float(self.get_option('_timeout')) except KeyError: self._cache_dir = self._get_cache_connection(C.CACHE_PLUGIN_CONNECTION) self._timeout = float(C.CACHE_PLUGIN_TIMEOUT) self.plugin_name = resource_from_fqcr(self.__module__) self._cache = {} self.validate_cache_connection()
def _create_powershell_wrapper(b_module_data, module_path, module_args, environment, async_timeout, become, become_method, become_user, become_password, become_flags, substyle, task_vars, module_fqn): # creates the manifest/wrapper used in PowerShell/C# modules to enable # things like become and async - this is also called in action/script.py # FUTURE: add process_wrapper.ps1 to run module_wrapper in a new process # if running under a persistent connection and substyle is C# so we # don't have type conflicts finder = PSModuleDepFinder() if substyle != 'script': # don't scan the module for util dependencies and other Ansible related # flags if the substyle is 'script' which is set by action/script finder.scan_module(b_module_data, fqn=module_fqn, powershell=(substyle == "powershell")) module_wrapper = "module_%s_wrapper" % substyle exec_manifest = dict( module_entry=to_text(base64.b64encode(b_module_data)), powershell_modules={}, csharp_utils={}, csharp_utils_module=[], # csharp_utils only required by a module module_args=module_args, actions=[module_wrapper], environment=environment, encoded_output=False, ) finder.scan_exec_script(module_wrapper) if async_timeout > 0: finder.scan_exec_script('exec_wrapper') finder.scan_exec_script('async_watchdog') finder.scan_exec_script('async_wrapper') exec_manifest["actions"].insert(0, 'async_watchdog') exec_manifest["actions"].insert(0, 'async_wrapper') exec_manifest["async_jid"] = str(random.randint(0, 999999999999)) exec_manifest["async_timeout_sec"] = async_timeout exec_manifest["async_startup_timeout"] = C.config.get_config_value( "WIN_ASYNC_STARTUP_TIMEOUT", variables=task_vars) if become and resource_from_fqcr( become_method) == 'runas': # runas and namespace.collection.runas finder.scan_exec_script('exec_wrapper') finder.scan_exec_script('become_wrapper') exec_manifest["actions"].insert(0, 'become_wrapper') exec_manifest["become_user"] = become_user exec_manifest["become_password"] = become_password exec_manifest['become_flags'] = become_flags exec_manifest['min_ps_version'] = finder.ps_version exec_manifest['min_os_version'] = finder.os_version if finder.become and 'become_wrapper' not in exec_manifest['actions']: finder.scan_exec_script('exec_wrapper') finder.scan_exec_script('become_wrapper') exec_manifest['actions'].insert(0, 'become_wrapper') exec_manifest['become_user'] = '******' exec_manifest['become_password'] = None exec_manifest['become_flags'] = None coverage_manifest = dict( module_path=module_path, module_util_paths={}, output=None, ) coverage_output = C.config.get_config_value('COVERAGE_REMOTE_OUTPUT', variables=task_vars) if coverage_output and substyle == 'powershell': finder.scan_exec_script('coverage_wrapper') coverage_manifest['output'] = coverage_output coverage_enabled = C.config.get_config_value('COVERAGE_REMOTE_PATHS', variables=task_vars) coverage_manifest['path_filter'] = coverage_enabled # make sure Ansible.ModuleUtils.AddType is added if any C# utils are used if len(finder.cs_utils_wrapper) > 0 or len(finder.cs_utils_module) > 0: finder._add_module((b"Ansible.ModuleUtils.AddType", ".psm1", None), wrapper=False) # exec_wrapper is only required to be part of the payload if using # become or async, to save on payload space we check if exec_wrapper has # already been added, and remove it manually if it hasn't later exec_required = "exec_wrapper" in finder.exec_scripts.keys() finder.scan_exec_script("exec_wrapper") # must contain an empty newline so it runs the begin/process/end block finder.exec_scripts["exec_wrapper"] += b"\n\n" exec_wrapper = finder.exec_scripts["exec_wrapper"] if not exec_required: finder.exec_scripts.pop("exec_wrapper") for name, data in finder.exec_scripts.items(): b64_data = to_text(base64.b64encode(data)) exec_manifest[name] = b64_data for name, data in finder.ps_modules.items(): b64_data = to_text(base64.b64encode(data['data'])) exec_manifest['powershell_modules'][name] = b64_data coverage_manifest['module_util_paths'][name] = data['path'] cs_utils = {} for cs_util in [finder.cs_utils_wrapper, finder.cs_utils_module]: for name, data in cs_util.items(): cs_utils[name] = data['data'] for name, data in cs_utils.items(): b64_data = to_text(base64.b64encode(data)) exec_manifest['csharp_utils'][name] = b64_data exec_manifest['csharp_utils_module'] = list(finder.cs_utils_module.keys()) # To save on the data we are sending across we only add the coverage info if coverage is being run if 'coverage_wrapper' in exec_manifest: exec_manifest['coverage'] = coverage_manifest b_json = to_bytes(json.dumps(exec_manifest)) # delimit the payload JSON from the wrapper to keep sensitive contents out of scriptblocks (which can be logged) b_data = exec_wrapper + b'\0\0\0\0' + b_json return b_data