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)
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)