def cmd_plugin_update(self, *argv, **kwargs): """ Updates a plugin file from server cmd_plugin_update[file,content] """ import os from base64 import b64decode import __helper as ecm plugin = kwargs.get('plugin', None) content = kwargs.get('content', None) if not _ALLOW_PLUGIN_UPDATES: raise ecm.NotAllowed("Plugin update is disabled") if not plugin or not content: raise ecm.InvalidParameters(self.cmd_plugin_update.__doc__) # Get plugin path using my path plugin_file = os.path.join( os.path.dirname(__file__), os.path.basename(plugin) ) try: # Only update exiting plugins if os.path.isfile(plugin_file): ecm.file_write(plugin_file, b64decode(content)) return True except: pass return False
def cmd_saltstack_apply(self, *argv, **kwargs): """ Apply a saltstack manifest Syntax: saltstack.apply[recipe_code,pillar_code,envars,facts] """ recipe_base64 = kwargs.get('recipe_code', None) pillar_base64 = kwargs.get('pillar_code', None) recipe_envars = kwargs.get('envars', None) recipe_facts = kwargs.get('facts', None) if not recipe_base64: raise ecm.InvalidParameters(self.cmd_saltstack_apply.__doc__) saltstack_cmd = self._is_available() if not saltstack_cmd: raise Exception('Saltstack no available') # Get default paths default_path = DEFAULT_SALT_PATH if ecm.is_windows(): default_path = DEFAULT_SALT_PATH_WINDOWS module_path = kwargs.get('module_path', default_path) default_pillar_path = DEFAULT_PILLAR_PATH if ecm.is_windows(): default_pillar_path = DEFAULT_PILLAR_PATH_WINDOWS pillar_path = kwargs.get('pillar_path', default_pillar_path) # Set environment variables before execution envars = ecm.envars_decode(recipe_envars) facts = ecm.envars_decode(recipe_facts) # Update envars and facts file ecm.write_envars_facts(envars, facts) try: # Create top file self._create_top_file(module_path) recipe_file = module_path + '/ecmanaged.sls' ecm.file_write(recipe_file, b64decode(recipe_base64)) if pillar_base64: self._create_top_file(pillar_path) pillar_file = pillar_path + '/ecmanaged.sls' ecm.file_write(pillar_file, b64decode(pillar_base64)) except: raise Exception("Unable to write recipe") try: # salt-call state.highstate command = [saltstack_cmd, 'state.highstate', '--local', '--no-color', '-l debug'] out, stdout, stderr = ecm.run_command(command, envars=envars, workdir=module_path) return ecm.format_output(out, stdout, stderr) except Exception as e: raise Exception("Error running saltstack state.highstate: %s" % e)
def cmd_update_system(self, *argv, **kwargs): # Run on detached child if ecm.fork('/'): return log_file self._update() os.environ["LANG"] = "C" status, output = getstatusoutput('nice yum update -y < /dev/null') ecm.file_write(log_file, output) sys.exit(status)
def cmd_configfile_run(self, *argv, **kwargs): """ Deploy a file Syntax: configfile.run[configfile,file,chown_user,chown_group,chmod,rotate,command,runas] """ code_base64 = kwargs.get('configfile', None) filename = kwargs.get('path', None) chown_user = kwargs.get('chown_user', None) chown_group = kwargs.get('chown_group', None) chmod = kwargs.get('chmod', None) rotate = kwargs.get('rotate', False) command = kwargs.get('command', None) runas = kwargs.get('command_runas', None) if not code_base64 or not filename: raise ecm.InvalidParameters(self.cmd_configfile_run.__doc__) ret = {'out': 0,'stdout': '','stderr': ''} try: if rotate and os.path.isfile(filename): new_file = filename + '_rotated_' + ecm.utime() move(filename, new_file) ret['stdout'] = ecm.output("Old configfile moved to '%s'" % new_file) # Write down file ecm.file_write(filename, b64decode(code_base64)) ret['stdout'] += ecm.output("Configfile created successfully at '%s'" % filename) except Exception as e: raise Exception("Unable to write configfile: %s" % e) try: # Chown to specified user/group if chown_user and chown_group and os.path.isfile(filename): ecm.chown(filename, chown_user, chown_group) ret['stdout'] += ecm.output("Owner changed to '%s':'%s'" % (chown_user, chown_group)) # Chown to specified user/group if chmod and os.path.isfile(filename): ecm.chmod(filename, chmod) ret['stdout'] += ecm.output("Owner changed to '%s':'%s'" % (chown_user, chown_group)) except Exception as e: raise Exception("Unable to change permissions for configfile: %s" % e) if command: working_dir = os.path.dirname(filename) out, stdout, stderr = ecm.run_command(command, runas=runas, workdir=working_dir) ret = ecm.format_output(out, stdout, stderr) return ret
def cmd_update_system(self, *argv, **kwargs): # Run on detached child if ecm.fork('/'): return log_file self._update() os.environ["LANG"] = "C" os.environ["DEBIAN_FRONTEND"] = "noninteractive" status, output = getstatusoutput('nice apt-get -f -y -o DPkg::Options::=--force-confold -qq \ --allow-unauthenticated -o Debug::NoLocking=true upgrade < /dev/null') ecm.file_write(log_file, output) sys.exit(status)
def cmd_update_system(self, *argv, **kwargs): # Run on detached child if ecm.fork('/'): return log_file client = pk.Client() client.refresh_cache(False, None, lambda p, t, d: True, None) res = client.get_updates(pk.FilterEnum.NONE, None, lambda p, t, d: True, None) pkg_list = [] for pkg in res.get_package_array(): pkg_list.append(pkg.get_id()) # updating the system if pkg_list: res = client.install_packages(False, pkg_list, None, lambda p, t, d: True, None) ecm.file_write(log_file, pkg_list) sys.exit(res.get_exit_code() == pk.ExitEnum.SUCCESS)
def cmd_script_run(self, *argv, **kwargs): """ run script(b64) extension envars runas executable Syntax: script.run[script,extenion,envars,facts,runas,executable] """ script_b64 = kwargs.get('script', None) script_extension = kwargs.get('extension', None) script_runas = kwargs.get('runas', None) script_executable = kwargs.get('executable', None) metadata = kwargs.get('metadata', None) if not script_extension: script_extension = '.cmd' if not script_b64: raise ecm.InvalidParameters(self.cmd_script_run.__doc__) try: # Write down tmp_dir = mkdtemp() tmp_file = tmp_dir + '/script' + script_extension ecm.file_write(tmp_file, b64decode(script_b64)) except: raise ecm.InvalidParameters("Unable to decode b64") # Set environment variables before execution envars = ecm.metadata_to_env(metadata_b64=metadata) # Update metadata ecm.write_metadata(metadata_b64=metadata) # Chown if script_runas: ecm.chown(tmp_dir,script_runas,recursive=True) if script_executable: cmd = script_executable + ' ' + tmp_file out, stdout, stderr = ecm.run_command(cmd, runas=script_runas, workdir=tmp_dir, envars=envars) else: out, stdout, stderr = ecm.run_file(tmp_file, runas=script_runas, workdir=tmp_dir, envars=envars) rmtree(tmp_dir, ignore_errors=True) return ecm.format_output(out, stdout, stderr)
def _create_top_file(self, path): top_file = path + '/top.sls' ecm.file_write(top_file, TOP_CONTENT)