コード例 #1
0
    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
コード例 #2
0
    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)
コード例 #3
0
ファイル: plugin_update.py プロジェクト: ecmanaged/ecm-agent
    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)
コード例 #4
0
    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
コード例 #5
0
ファイル: plugin_update.py プロジェクト: ecmanaged/ecm-agent
    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)
コード例 #6
0
ファイル: plugin_update.py プロジェクト: ecmanaged/ecm-agent
    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)
コード例 #7
0
ファイル: plugin_script.py プロジェクト: ecmanaged/ecm-agent
    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)
コード例 #8
0
 def _create_top_file(self, path):
     top_file = path + '/top.sls'
     ecm.file_write(top_file, TOP_CONTENT)