Пример #1
0
def main():
    module = AnsibleModule(argument_spec=dict(
        state=dict(default='present', choices=['present', 'absent']),
        name=dict(required=True, type='str'),
        password=dict(required=False, type='str', default=''),
        home_directory=dict(required=False, type='path', default=''),
        chroot=dict(required=False, type='bool', default=True),
        uid=dict(required=False, type='str', default=''),
        gid=dict(required=False, type='str', default=''),
        passwdfile=dict(required=False,
                        default='/etc/pure-ftpd/pureftpd.passwd',
                        type='str'),
        dbfile=dict(required=False,
                    default='/etc/pure-ftpd/pureftpd.pdb',
                    type='str')),
                           supports_check_mode=True)

    account = OrderedDict(
        (('account', module.params['name']), ('password', None),
         ('uid', module.params['uid']), ('gid', module.params['gid']),
         ('gecos', ''), ('home_directory',
                         mk_home_directory(module)), ('upload_bandwidth', ''),
         ('download_bandwidth',
          ''), ('upload_ratio', ''), ('download_ratio',
                                      ''), ('max_number_of_connections', ''),
         ('files_quota', ''), ('size_quota', ''), ('authorized_local_ips', ''),
         ('refused_local_ips', ''), ('authorized_client_ips',
                                     ''), ('refused_client_ips',
                                           ''), ('time_restrictions', '')))

    #if not has_bcrypt:
    #        module.fail_json(msg='Missing required bcrypt module (check docs)')

    #Check if database already exist
    if os.path.isfile(module.params['passwdfile']):

        #read current file
        f = open(module.params['passwdfile'], "r+")

        lines = f.readlines()

        for line in lines:
            #check if account is already present
            if line.startswith(module.params['name'] + ':'):

                account_config_line = build_config_line(
                    account,
                    line.split(':')[1], module.params['password'])

                #if same line than current, exit
                if line == account_config_line + "\n":  #nothing to do
                    f.close
                    module.exit_json(changed=False)

                #if not, update
                if module.check_mode:
                    module.exit_json(changed=True)

                f.seek(0)
                for l in lines:
                    if l.startswith(module.params['name'] + ':'):
                        f.write(account_config_line + "\n")
                    else:
                        f.write(l)
                f.truncate()
                f.close

                mkdb(module)

                module.exit_json(changed=True, status='updated')

        f.close

    ## account not already present or file is new

    if module.check_mode:
        module.exit_json(changed=True)

    account_config_line = build_config_line(account, None,
                                            module.params['password'])

    module.append_to_file(module.params['passwdfile'],
                          account_config_line + "\n")

    mkdb(module)

    module.exit_json(changed=True, status='new')
def main():
    module = AnsibleModule(
        argument_spec=dict(
            tox_envlist=dict(required=True, type='str'),
            project_dir=dict(required=True, type='str'),
            projects=dict(required=True, type='list'),
        )
    )
    envlist = module.params['tox_envlist']
    project_dir = module.params['project_dir']
    projects = module.params['projects']

    if not os.path.exists(os.path.join(project_dir, 'setup.cfg')):
        module.exit_json(changed=False, msg="No setup.cfg, no action needed")

    # Who are we?
    try:
        c = configparser.ConfigParser()
        c.read(os.path.join(project_dir, 'setup.cfg'))
        package_name = c.get('metadata', 'name')
    except Exception:
        module.exit_json(
            changed=False, msg="No name in setup.cfg, skipping siblings")

    tox_python = '{project_dir}/.tox/{envlist}/bin/python'.format(
        project_dir=project_dir, envlist=envlist)
    # Write a log file into the .tox dir so that it'll get picked up
    log_file = '{project_dir}/.tox/{envlist}/log/siblings.txt'.format(
        project_dir=project_dir, envlist=envlist)

    log = list()
    log.append(
        "Processing siblings for {name} from {project_dir}".format(
            name=package_name,
            project_dir=project_dir))

    changed = False

    sibling_python_packages = get_sibling_python_packages(projects)
    for name, root in sibling_python_packages.items():
        log.append("Sibling {name} at {root}".format(name=name, root=root))
    for package in get_installed_packages(tox_python):
        log.append(
            "Found {name} python package installed".format(name=package.name))
        if package.name == package_name:
            # We don't need to re-process ourself. We've filtered ourselves
            # from the source dir list, but let's be sure nothing is weird.
            log.append(
                "Skipping {name} because it's us".format(name=package.name))
            continue
        if package.name in sibling_python_packages:
            log.append(
                "Package {name} on system in {root}".format(
                    name=package.name,
                    root=sibling_python_packages[package.name]))
            changed = True

            log.append("Uninstalling {name}".format(name=package.name))
            uninstall_output = subprocess.check_output(
                [tox_python, '-m', 'pip', 'uninstall', '-y', package.name],
                stderr=subprocess.STDOUT)
            log.extend(uninstall_output.decode('utf-8').split('\n'))

            # TODO(mordred) Account for upper-constraints during this install
            log.append(
                "Installing {name} from {root}".format(
                    name=package.name,
                    root=sibling_python_packages[package.name]))
            install_output = subprocess.check_output(
                [tox_python, '-m', 'pip', 'install',
                 '-e', sibling_python_packages[package.name]])
            log.extend(install_output.decode('utf-8').split('\n'))

    log_text = "\n".join(log)
    module.append_to_file(log_file, log_text)
    module.exit_json(changed=changed, msg=log_text)
def main():
    module = AnsibleModule(argument_spec=dict(
        tox_envlist=dict(required=True, type='str'),
        tox_constraints_file=dict(type='str'),
        project_dir=dict(required=True, type='str'),
        projects=dict(required=True, type='list'),
    ))
    envlist = module.params['tox_envlist']
    constraints = module.params.get('tox_constraints_file')
    project_dir = module.params['project_dir']
    projects = module.params['projects']

    if not os.path.exists(os.path.join(project_dir, 'setup.cfg')):
        module.exit_json(changed=False, msg="No setup.cfg, no action needed")
    if constraints and not os.path.exists(constraints):
        module.fail_json(msg="Constraints file {constraints} was not found")

    # Who are we?
    try:
        c = configparser.ConfigParser()
        c.read(os.path.join(project_dir, 'setup.cfg'))
        package_name = c.get('metadata', 'name')
    except Exception:
        module.exit_json(changed=False,
                         msg="No name in setup.cfg, skipping siblings")

    envdir = '{project_dir}/.tox/{envlist}'.format(project_dir=project_dir,
                                                   envlist=envlist)
    if not os.path.exists(envdir):
        module.exit_json(changed=False,
                         msg="envdir does not exist, skipping siblings")

    tox_python = '{envdir}/bin/python'.format(envdir=envdir)
    # Write a log file into the .tox dir so that it'll get picked up
    # Name it with envlist as a prefix so that fetch-tox-output will properly
    # get it in a multi-env scenario
    log_dir = '{envdir}/log'.format(envdir=envdir)
    log_file = '{log_dir}/{envlist}-siblings.txt'.format(log_dir=log_dir,
                                                         envlist=envlist)

    log.append("Processing siblings for {name} from {project_dir}".format(
        name=package_name, project_dir=project_dir))

    changed = False

    try:
        sibling_python_packages = get_sibling_python_packages(
            projects, tox_python)
        for name, root in sibling_python_packages.items():
            log.append("Sibling {name} at {root}".format(name=name, root=root))
        found_sibling_packages = []
        for package in get_installed_packages(tox_python):
            log.append("Found {name} python package installed".format(
                name=package.name))
            if package.name == package_name:
                # We don't need to re-process ourself. We've filtered ourselves
                # from the source dir list, but let's be sure nothing is weird.
                log.append("Skipping {name} because it's us".format(
                    name=package.name))
                continue
            if package.name in sibling_python_packages:
                log.append("Package {name} on system in {root}".format(
                    name=package.name,
                    root=sibling_python_packages[package.name]))
                changed = True

                found_sibling_packages.append(package.name)

        if constraints:
            constraints_file = write_new_constraints_file(
                constraints, found_sibling_packages)

        for sibling_package in found_sibling_packages:
            log.append("Uninstalling {name}".format(name=sibling_package))
            uninstall_output = subprocess.check_output(
                [tox_python, '-m', 'pip', 'uninstall', '-y', sibling_package],
                stderr=subprocess.STDOUT)
            log.extend(uninstall_output.decode('utf-8').split('\n'))

            args = [tox_python, '-m', 'pip', 'install']
            if constraints:
                args.extend(['-c', constraints_file])
            log.append("Installing {name} from {root} for deps".format(
                name=sibling_package,
                root=sibling_python_packages[sibling_package]))
            args.append(sibling_python_packages[sibling_package])

            install_output = subprocess.check_output(args)
            log.extend(install_output.decode('utf-8').split('\n'))

        for sibling_package in found_sibling_packages:
            log.append("Installing {name} from {root}".format(
                name=sibling_package,
                root=sibling_python_packages[sibling_package]))

            install_output = subprocess.check_output([
                tox_python, '-m', 'pip', 'install', '--no-deps',
                sibling_python_packages[sibling_package]
            ])
            log.extend(install_output.decode('utf-8').split('\n'))
    except Exception as e:
        tb = traceback.format_exc()
        log.append(str(e))
        log.append(tb)
        module.fail_json(msg=str(e), log="\n".join(log))
    finally:
        log_text = "\n".join(log)
        module.append_to_file(log_file, log_text)
    module.exit_json(changed=changed, msg=log_text)
Пример #4
0
def main():
    module = AnsibleModule(
        argument_spec=dict(
            tox_show_config=dict(required=True, type='path'),
            tox_constraints_file=dict(type='str'),
            tox_package_name=dict(type='str'),
            project_dir=dict(required=True, type='str'),
            projects=dict(required=True, type='list'),
        )
    )
    constraints = module.params.get('tox_constraints_file')
    tox_package_name = module.params.get('tox_package_name')
    project_dir = module.params['project_dir']
    projects = module.params['projects']
    tox_show_config = module.params.get('tox_show_config')

    tox_config = configparser.RawConfigParser()
    tox_config.read(tox_show_config)

    envlist = get_envlist(tox_config)

    if not envlist:
        module.exit_json(
            changed=False,
            msg='No envlist to run, no action needed.')

    log.append('Using envlist: {}'.format(envlist))

    if (not tox_package_name
        and not os.path.exists(os.path.join(project_dir, 'setup.cfg'))
    ):
        module.exit_json(changed=False, msg="No setup.cfg, no action needed")
    if constraints and not os.path.exists(constraints):
        module.fail_json(msg="Constraints file {constraints} was not found")

    # Who are we?
    package_name = tox_package_name
    if not package_name:
        try:
            c = configparser.ConfigParser()
            c.read(os.path.join(project_dir, 'setup.cfg'))
            package_name = c.get('metadata', 'name')
        except Exception:
            module.exit_json(
                changed=False, msg="No name in setup.cfg, skipping siblings")

    log.append(
        "Processing siblings for {name} from {project_dir}".format(
            name=package_name,
            project_dir=project_dir))

    changed = False
    for testenv in envlist:
        envdir = tox_config.get("testenv:{}".format(testenv), 'envdir')
        envlogdir = tox_config.get("testenv:{}".format(testenv), 'envlogdir')
        try:
            # Write a log file into the .tox dir so that it'll get picked up
            # Name it with testenv as a prefix so that fetch-tox-output
            # will properly get it in a multi-env scenario
            log_file = '{envlogdir}/{testenv}-siblings.txt'.format(
                envlogdir=envlogdir, testenv=testenv)
            changed = changed or install_siblings(envdir,
                                                  projects,
                                                  package_name,
                                                  constraints)
        except subprocess.CalledProcessError as e:
            tb = traceback.format_exc()
            log.append(str(e))
            log.append(tb)
            log.append("Output:")
            log.extend(e.output.decode('utf-8').split('\n'))
            module.fail_json(msg=str(e), log="\n".join(log))
        except Exception as e:
            tb = traceback.format_exc()
            log.append(str(e))
            log.append(tb)
            module.fail_json(msg=str(e), log="\n".join(log))
        finally:
            log_text = "\n".join(log)
            module.append_to_file(log_file, log_text)
    module.exit_json(changed=changed, msg=log_text)