def clone(self, url, branch, envars, username, password, private_key):
        """ runs git clone URL
        """
        command = self._get_command(url,branch)

        # Create git command with user and password
        if username and password:
            parsed = urlparse(url)
            if parsed.scheme in ('http', 'https'):
                command = command.replace('://', '://' + username + ':' + password + '@')

            elif parsed.scheme == 'ssh':
                command = command.replace('://', '://' + username + '@')

        elif private_key:
            helper, indetity = self._certificate_helper(private_key)
            envars['GIT_SSH'] = helper

        out, stdout, stderr = ecm.run_command(command=command, workdir=self.working_dir, envars=envars)
        result_exec = ecm.format_output(out, stdout, stderr)

        if not result_exec['out']:
            extra_msg = ecm.output("Source deployed successfully to '%s'" % self.working_dir)
            if self.old_dir:
                extra_msg += ecm.output("Old source files moved to '%s'" % self.old_dir)
            result_exec['stdout'] += extra_msg

        if private_key:
            try:
                os.unlink(helper)
                os.unlink(indetity)
            except:
                pass

        return result_exec
    def clone(self, branch, envars, url, username, password, private_key):
        """ Downloads a file from a remote url and decompress it
        """
        file_name = 'downloaded.file'
        tmp_dir = mkdtemp()

        file_downloaded = ecm.download_file(
            url=url,
            filename=tmp_dir + '/' + file_name,
            user=username,
            passwd=password
        )

        if file_downloaded:
            extract = self._extract(file_downloaded)
            if extract:
                extract['head'] = ''
                if extract.get('stdout', None):
                    extract['head'] = ecm.output("Source deployed successfully to '%s'" % self.working_dir)

                if extract.get('stdout', None) and self.old_dir:
                    extract['head'] += ecm.output("Old source files moved to '%s'" % self.old_dir)

        else:
            rmtree(tmp_dir, ignore_errors=True)
            raise Exception("Unable to download file")

        # Clean and output
        rmtree(tmp_dir, ignore_errors=True)
        ret = {
            'stdout': extract.get('head', '') + extract.get('stdout', ''),
            'stderr': extract.get('stderr', 'Unable to download file'),
            'out': extract.get('out', 1)
        }
        return ret
    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_source_run(self, *argv, **kwargs):
        """
        Syntax: source.run[path,source,branch,envars,facts,username,password,private_key,chown_user,chown_group,rotate,type]
        """
        path = kwargs.get('path', None)
        url = kwargs.get('source', None)
        branch = kwargs.get('branch', None)
        user = kwargs.get('username', None)
        passwd = kwargs.get('password', None)
        private_key = kwargs.get('private_key', None)
        chown_user = kwargs.get('chown_user', None)
        chown_group = kwargs.get('chown_group', None)
        rotate = kwargs.get('rotate', True)
        extract = kwargs.get('extract', True)

        stype = kwargs.get('type', None)
        metadata = kwargs.get('metadata', None)

        if not path or not url or not stype:
            raise ecm.InvalidParameters(self.cmd_source_run.__doc__)
            
        if private_key:
            try:
                private_key = b64decode(private_key)
            except:
                raise ecm.InvalidParameters("Invalid private key format")

        if stype.upper() in ('URL', 'FILE'):
            source = FILE(path, rotate, extract)

        elif stype.upper() == 'GIT':
            source = GIT(path, rotate)

        elif stype.upper() == 'SVN':
            source = SVN(path, rotate)

        else:
            raise ecm.InvalidParameters("Unknown source")

        # Set environment variables before execution
        envars = ecm.metadata_to_env(metadata_b64=metadata)

        # Update metadata
        ecm.write_metadata(metadata_b64=metadata)

        retval = source.clone(url=url,
                              branch=branch,
                              envars=envars,
                              username=user,
                              password=passwd,
                              private_key=private_key)

        # Chown to specified user/group
        if chown_user and chown_group and os.path.isdir(path):
            ecm.chown(path, chown_user, chown_group, recursive=True)
            retval['stdout'] += ecm.output("Owner changed to '%s':'%s'" % (chown_user, chown_group))

        return self._return(retval)
    def clone(self, url, branch, envars, username, password, private_key):
        """ svn co URL
        """
        # Add username and password to url
        if username and password:
            url = url.replace('://', '://' + username + ':' + password + '@')

        command = self.svn_cmd + " co '" + url + "' ."

        out, stdout, stderr = ecm.run_command(command=command, workdir=self.working_dir, envars=envars)
        result_exec = ecm.format_output(out, stdout, stderr)

        if not result_exec['out']:
            extra_msg = ecm.output("Source deployed successfully to '%s'" % self.working_dir)
            if self.old_dir:
                extra_msg += ecm.output("Old source files moved to '%s'" % self.old_dir)

            if result_exec['stdout']:
                result_exec['stdout'] = extra_msg + result_exec['stdout']

            else:
                result_exec['stdout'] = extra_msg

        return result_exec