def umount(mountpoint, persist=False): """Unmount a filesystem""" cmd_args = ['umount', mountpoint] try: subprocess.check_output(cmd_args) except subprocess.CalledProcessError, e: log('Error unmounting {}\n{}'.format(mountpoint, e.output)) return False
def copy_file(src, dst, owner='root', group='root', perms=0444): """Create or overwrite a file with the contents of another file""" log("Writing file {} {}:{} {:o} from {}".format(dst, owner, group, perms, src)) uid = pwd.getpwnam(owner).pw_uid gid = grp.getgrnam(group).gr_gid shutil.copyfile(src, dst) os.chown(dst, uid, gid) os.chmod(dst, perms)
def write_file(path, content, owner='root', group='root', perms=0444): """Create or overwrite a file with the contents of a string""" log("Writing file {} {}:{} {:o}".format(path, owner, group, perms)) uid = pwd.getpwnam(owner).pw_uid gid = grp.getgrnam(group).gr_gid with open(path, 'w') as target: os.fchown(target.fileno(), uid, gid) os.fchmod(target.fileno(), perms) target.write(content)
def rsync(from_path, to_path, flags='-r', options=None): """Replicate the contents of a path""" options = options or ['--delete', '--executability'] cmd = ['/usr/bin/rsync', flags] cmd.extend(options) cmd.append(from_path) cmd.append(to_path) log(" ".join(cmd)) return subprocess.check_output(cmd).strip()
def add_user_to_group(username, group): """Add a user to a group""" cmd = [ 'gpasswd', '-a', username, group ] log("Adding user {} to group {}".format(username, group)) subprocess.check_call(cmd)
def symlink(source, destination): """Create a symbolic link""" log("Symlinking {} as {}".format(source, destination)) cmd = [ 'ln', '-sf', source, destination, ] subprocess.check_call(cmd)
def symlink(source, destination): """Create a symbolic link""" context = execution_environment() log("Symlinking {} as {}".format(source, destination)) cmd = [ 'ln', '-sf', source.format(**context), destination.format(**context) ] subprocess.check_call(cmd)
def mount(device, mountpoint, options=None, persist=False): """Mount a filesystem""" cmd_args = ["mount"] if options is not None: cmd_args.extend(["-o", options]) cmd_args.extend([device, mountpoint]) try: subprocess.check_output(cmd_args) except subprocess.CalledProcessError, e: log("Error mounting {} at {}\n{}".format(device, mountpoint, e.output)) return False
def mount(device, mountpoint, options=None, persist=False): """Mount a filesystem at a particular mountpoint""" cmd_args = ['mount'] if options is not None: cmd_args.extend(['-o', options]) cmd_args.extend([device, mountpoint]) try: subprocess.check_output(cmd_args) except subprocess.CalledProcessError, e: log('Error mounting {} at {}\n{}'.format(device, mountpoint, e.output)) return False
def mount(device, mountpoint, options=None, persist=False, filesystem="ext3"): """Mount a filesystem at a particular mountpoint""" cmd_args = ['mount'] if options is not None: cmd_args.extend(['-o', options]) cmd_args.extend([device, mountpoint]) try: subprocess.check_output(cmd_args) except subprocess.CalledProcessError, e: log('Error mounting {} at {}\n{}'.format(device, mountpoint, e.output)) return False
def filter_installed_packages(packages): """Returns a list of packages that require installation""" apt_pkg.init() cache = apt_pkg.Cache() _pkgs = [] for package in packages: try: p = cache[package] p.current_ver or _pkgs.append(package) except KeyError: log('Package {} has no installation candidate.'.format(package), level='WARNING') _pkgs.append(package) return _pkgs
def apt_install(packages, options=None, fatal=False): """Install one or more packages""" options = options or [] cmd = ['apt-get', '-y'] cmd.extend(options) cmd.append('install') if isinstance(packages, basestring): cmd.append(packages) else: cmd.extend(packages) log("Installing {} with options: {}".format(packages, options)) if fatal: subprocess.check_call(cmd) else: subprocess.call(cmd)
def adduser(username, password=None, shell="/bin/bash", system_user=False): """Add a user to the system""" try: user_info = pwd.getpwnam(username) log("user {0} already exists!".format(username)) except KeyError: log("creating user {0}".format(username)) cmd = ["useradd"] if system_user or password is None: cmd.append("--system") else: cmd.extend(["--create-home", "--shell", shell, "--password", password]) cmd.append(username) subprocess.check_call(cmd) user_info = pwd.getpwnam(username) return user_info
def adduser(username, password=None, shell='/bin/bash', system_user=False): """Add a user to the system""" try: user_info = pwd.getpwnam(username) log('user {0} already exists!'.format(username)) except KeyError: log('creating user {0}'.format(username)) cmd = ['useradd'] if system_user or password is None: cmd.append('--system') else: cmd.extend([ '--create-home', '--shell', shell, '--password', password, ]) cmd.append(username) subprocess.check_call(cmd) user_info = pwd.getpwnam(username) return user_info
def symlink(source, destination): """Create a symbolic link""" log("Symlinking {} as {}".format(source, destination)) cmd = [ 'ln', '-sf', source, destination, ] subprocess.check_call(cmd) def mkdir(path, owner='root', group='root', perms=0555, force=False): """Create a directory""" log("Making dir {} {}:{} {:o}".format(path, owner, group, perms)) uid = pwd.getpwnam(owner).pw_uid gid = grp.getgrnam(group).gr_gid realpath = os.path.abspath(path) if os.path.exists(realpath): if force and not os.path.isdir(realpath): log("Removing non-directory file {} prior to mkdir()".format(path)) os.unlink(realpath) else: os.makedirs(realpath, perms) os.chown(realpath, uid, gid) def write_file(path, content, owner='root', group='root', perms=0444): """Create or overwrite a file with the contents of a string""" log("Writing file {} {}:{} {:o}".format(path, owner, group, perms))
def render_template_file(source, destination, **kwargs): """Create or overwrite a file using a template""" log("Rendering template {} for {}".format(source, destination)) context = execution_environment() with open(source.format(**context), 'r') as template: write_file(destination.format(**context), template.read(), **kwargs)