def install_nginx(): """ Install NGINX and make it use certs. """ if system.distrib_id() == 'Debian': require_file(url='http://nginx.org/packages/keys/nginx_signing.key') deb.add_apt_key('nginx_signing.key') su_delete('nginx_signing.key') url = 'http://nginx.org/packages/debian/' distrib = 'squeeze' if system.distrib_release().startswith('7'): distrib = 'wheezy' require.deb.source('nginx', url, distrib, 'nginx') require.deb.package('nginx') contents = PROXIED_SITE_TEMPLATE % { 'server_name': 'cozy', 'port': 443, 'proxy_url': 'http://127.0.0.1:9104' } require.files.file('/etc/nginx/conf.d/cozy.conf', contents=contents, use_sudo=True) service.restart('nginx') else: require.deb.ppa("ppa:nginx/stable") require.nginx.site("cozy", template_contents=PROXIED_SITE_TEMPLATE, enabled=True, port=443, proxy_url='http://127.0.0.1:9104' ) print(green("Nginx successfully installed."))
def uninstall_couchdb(): """ Install CouchDB 1.3.0 """ require_file(url='http://apache.crihan.fr/dist/couchdb/source/' + '1.3.0/apache-couchdb-1.3.0.tar.gz') run('tar -xzvf apache-couchdb-1.3.0.tar.gz') with cd('apache-couchdb-1.3.0'): sudo('./configure') sudo('make uninstall') sudo('make distclean') su_delete('/usr/local/share/couchdb') su_delete('/usr/local/lib/couchdb') su_delete('/usr/local/var/lib/couchdb') su_delete('/usr/local/var/log/couchdb') su_delete('/usr/local/var/run/couchdb') su_delete('/usr/local/share/doc/couchdb') su_delete('/usr/local/bin/couchjs') su_delete('/usr/local/bin/couchdb') su_delete('apache-couchdb-1.3.0') su_delete('apache-couchdb-1.3.0.tar.gz') su_delete('/etc/supervisor/conf.d/couchdb.conf') su_delete('/etc/cozy/couchdb.login') supervisor.update_config() print(green("CouchDB 1.3.0 successfully uninstalled"))
def require_keymap(keymap): """ Check a keymap """ conf = 'KEYMAP=%s' % keymap config_file = '/etc/vconsole.conf' require_file(config_file, conf)
def install_node08(): ''' Install Node 0.8.18 (0.18.21 for ARM hardwares) ''' if not is_arm(): require.nodejs.installed_from_source('0.8.18') print(green('Node 0.8.18 successfully installed')) else: version = '0.8.21' folder = 'node-v%s-linux-arm-pi' % version filename = folder + '.tar.gz' require.files.directory('/opt/node', use_sudo=True) archive_path = 'http://nodejs.org/dist/v%s/%s' % (version, filename) require_file(url=archive_path) run('tar -xzf %s' % filename) sudo('cp -r %s/* /opt/node' % folder) sudo('ln -s /opt/node/bin/node /usr/local/bin/node') sudo('ln -s /opt/node/bin/npm /usr/local/bin/npm') su_delete(folder) su_delete(filename) result = run('node -v') if '0.8.21' in result: print(green('Node 0.8.21 successfully installed')) else: print(red('Something went wrong while installing Node 0.8.21'))
def uninstall_couchdb(): ''' Uninstall CouchDB 1.3.0 or 1.5.0 ''' version = get_couchdb_version() require_file( url='http://apache.crihan.fr/dist/couchdb/source/' + '%s/apache-couchdb-%s.tar.gz' % (version, version)) run('tar -xzvf apache-couchdb-%s.tar.gz' % version) with cd('apache-couchdb-%s' % version): sudo('./configure') sudo('make uninstall') sudo('make distclean') su_delete('/usr/local/share/couchdb') su_delete('/usr/local/lib/couchdb') su_delete('/usr/local/var/lib/couchdb') su_delete('/usr/local/var/log/couchdb') su_delete('/usr/local/var/run/couchdb') su_delete('/usr/local/share/doc/couchdb') su_delete('/usr/local/bin/couchjs') su_delete('/usr/local/bin/couchdb') su_delete('apache-couchdb-%s' % version) su_delete('apache-couchdb-%s.tar.gz' % version) su_delete('/etc/supervisor/conf.d/couchdb.conf') su_delete('/etc/cozy/couchdb.login') supervisor.update_config() print(green('CouchDB %s successfully uninstalled' % version))
def uninstall_couchdb(): ''' Install CouchDB 1.3.0 ''' require_file( url='http://apache.crihan.fr/dist/couchdb/source/' + '1.3.0/apache-couchdb-1.3.0.tar.gz') run('tar -xzvf apache-couchdb-1.3.0.tar.gz') with cd('apache-couchdb-1.3.0'): sudo('./configure') sudo('make uninstall') sudo('make distclean') su_delete('/usr/local/share/couchdb') su_delete('/usr/local/lib/couchdb') su_delete('/usr/local/var/lib/couchdb') su_delete('/usr/local/var/log/couchdb') su_delete('/usr/local/var/run/couchdb') su_delete('/usr/local/share/doc/couchdb') su_delete('/usr/local/bin/couchjs') su_delete('/usr/local/bin/couchdb') su_delete('apache-couchdb-1.3.0') su_delete('apache-couchdb-1.3.0.tar.gz') su_delete('/etc/supervisor/conf.d/couchdb.conf') su_delete('/etc/cozy/couchdb.login') supervisor.update_config() print(green('CouchDB 1.3.0 successfully uninstalled'))
def uptodate_index(quiet=True, max_age=86400): """ Require an up-to-date package index. This will update the package index (using ``apt-get update``) if the last update occured more than *max_age* ago. *max_age* can be specified either as an integer (a value in seconds), or as a dictionary whose keys are units (``seconds``, ``minutes``, ``hours``, ``days``, ``weeks``, ``months``) and values are integers. The default value is 1 hour. Examples: :: from fabtools import require # Update index if last time was more than 1 day ago require.deb.uptodate_index(max_age={'day': 1}) # Update index if last time was more than 1 hour and 30 minutes ago require.deb.uptodate_index(max_age={'hour': 1, 'minutes': 30}) """ from fabtools.require import file as require_file require_file('/etc/apt/apt.conf.d/15fabtools-update-stamp', contents='''\ APT::Update::Post-Invoke-Success {"touch /var/lib/apt/periodic/fabtools-update-success-stamp 2>/dev/null || true";}; ''', use_sudo=True) if system.time() - last_update_time() > _to_seconds(max_age): update_index(quiet=quiet)
def test_flag_is_set_when_watched_file_is_modified(watched_file): from fabtools.files import watch from fabtools.require import file as require_file with watch('watched') as f: require_file('watched', contents='bbb') assert f.changed
def test_run_query_without_supplying_the_password(mysql_server, mysql_user): from fabtools.mysql import query try: require_file('.my.cnf', contents="[mysql]\npassword=foo") with settings(mysql_user='******'): query('select 2;') finally: run('rm -f .my.cnf')
def default_locale(name): """ Require the locale to be the default. """ from fabtools.require import file as require_file # Ensure the locale is available locale(name) # Make it the default contents = 'LANG="%s"\n' % name require_file('/etc/default/locale', contents, use_sudo=True)
def test_run_query_without_supplying_the_password(mysql_server, mysql_user): from fabtools.mysql import query username, password = mysql_user try: require_file('.my.cnf', contents="[mysql]\npassword={0}".format(password)) with settings(mysql_user=username): query('select 2;', use_sudo=False) finally: run('rm -f .my.cnf')
def test_callback_is_called_when_watched_file_is_modified(watched_file): from fabtools.files import watch from fabtools.require import file as require_file try: with watch('watched', callback=partial(require_file, 'modified1')): require_file('watched', contents='bbb') assert is_file('modified1') finally: run('rm -f modified1')
def test_require_file_from_url(): """ Require that a file exists, whose contents should come from a URL """ from fabtools.require import file as require_file try: require_file(url='http://www.google.com/robots.txt') assert is_file('robots.txt') finally: run('rm -f robots.txt')
def uninstall_node08(): """ Uninstall node 0.8.9 """ sudo("npm uninstall npm") require_file(url='http://nodejs.org/dist/v0.8.9/node-v0.8.9.tar.gz') sudo("tar -xzf node-v0.8.9.tar.gz") with cd('node-v0.8.9'): sudo('./configure') sudo("make uninstall") sudo("make distclean") su_delete("node-v0.8.9*") print(green("Node 0.8.9 successfully uninstalled"))
def installed_from_source(version=VERSION): """ Require Redis to be installed from source. The compiled binaries will be installed in ``/opt/redis-{version}/``. """ from fabtools.require import directory as require_directory from fabtools.require import file as require_file from fabtools.require import user as require_user from fabtools.require.deb import packages as require_deb_packages from fabtools.require.rpm import packages as require_rpm_packages family = distrib_family() if family == 'debian': require_deb_packages([ 'build-essential', ]) elif family == 'redhat': require_rpm_packages([ 'gcc', 'make', ]) require_user('redis', home='/var/lib/redis', system=True) require_directory('/var/lib/redis', owner='redis', use_sudo=True) dest_dir = '/opt/redis-%(version)s' % locals() require_directory(dest_dir, use_sudo=True, owner='redis') if not is_file('%(dest_dir)s/redis-server' % locals()): with cd('/tmp'): # Download and unpack the tarball tarball = 'redis-%(version)s.tar.gz' % locals() url = _download_url(version) + tarball require_file(tarball, url=url) run('tar xzf %(tarball)s' % locals()) # Compile and install binaries with cd('redis-%(version)s' % locals()): run('make') for filename in BINARIES: run_as_root( 'cp -pf src/%(filename)s %(dest_dir)s/' % locals()) run_as_root( 'chown redis: %(dest_dir)s/%(filename)s' % locals())
def install_from_source(version=DEFAULT_VERSION): """ Install Node JS from source. :: import fabtools # Install Node.js fabtools.nodejs.install_nodejs() .. note:: This function may not work for old versions of Node.js. """ from fabtools.require.deb import packages as require_deb_packages from fabtools.require.rpm import packages as require_rpm_packages from fabtools.require import file as require_file family = distrib_family() if family == 'debian': require_deb_packages([ 'build-essential', 'libssl-dev', 'python', ]) elif family == 'redhat': require_rpm_packages([ 'gcc', 'gcc-c++', 'make', 'openssl-devel', 'python', ]) filename = 'node-v%s.tar.gz' % version foldername = filename[0:-7] require_file(url='http://nodejs.org/dist/v%(version)s/%(filename)s' % { 'version': version, 'filename': filename, }) run('tar -xzf %s' % filename) with cd(foldername): run('./configure') run('make -j%d' % (cpus() + 1)) run_as_root('make install') run('rm -rf %(filename)s %(foldername)s' % locals())
def test_file_changes_ownership(): from fabtools.files import owner from fabtools.require.files import file as require_file try: run('touch foo') assert owner('foo') == env.user require_file('foo', use_sudo=True) assert owner('foo') == 'root' finally: run_as_root('rm -f foo')
def test_require_file(): """ Require that a file exists, whose contents should come from a URL """ from fabtools.require import file as require_file try: require_file('foo') assert is_file('foo') assert run('cat foo') == '' finally: run('rm -f foo')
def uninstall_node08(): ''' Uninstall node 0.8.18 ''' sudo('npm uninstall npm') require_file(url='http://nodejs.org/dist/v0.8.9/node-v0.8.18.tar.gz') sudo('tar -xzf node-v0.8.18.tar.gz') with cd('node-v0.8.18'): sudo('./configure') sudo('make uninstall') sudo('make distclean') su_delete('node-v0.8.18*') print(green('Node 0.8.18 successfully uninstalled'))
def install_couchdb(): ''' Install CouchDB 1.3.0 or 1.5.0 ''' packages = [ 'erlang', 'libicu-dev', 'libcurl4-openssl-dev', 'curl' ] if system.distrib_id() == 'Debian' \ and system.distrib_release().startswith('6'): packages.append('libmozjs-dev') else: packages.append('libmozjs185-dev') require.deb.packages(packages) version = get_couchdb_version() require_file( url='http://apache.crihan.fr/dist/couchdb/source/' + '%s/apache-couchdb-%s.tar.gz' % (version, version)) run('tar -xzvf apache-couchdb-%s.tar.gz' % version) with cd('apache-couchdb-%s' % version): run('./configure; make') result = sudo('make install') installed = result.find('You have installed Apache CouchDB,' + ' time to relax.') if installed == -1: print_failed('couchdb') su_delete('apache-couchdb-%s' % version) su_delete('rm -rf apache-couchdb-%s.tar.gz' % version) require.users.user('couchdb', home='/usr/local/var/lib/couchdb') sudo('chown -R couchdb:couchdb /usr/local/etc/couchdb') sudo('chown -R couchdb:couchdb /usr/local/var/lib/couchdb') sudo('chown -R couchdb:couchdb /usr/local/var/log/couchdb') sudo('chown -R couchdb:couchdb /usr/local/var/run/couchdb') sudo('chmod 0770 /usr/local/etc/couchdb') sudo('chmod 0770 /usr/local/var/lib/couchdb') sudo('chmod 0770 /usr/local/var/log/couchdb') sudo('chmod 0770 /usr/local/var/run/couchdb') require.supervisor.process( 'couchdb', user='******', command='couchdb', autostart='true', environment='HOME=/usr/local/var/lib/couchdb') print(green('CouchDB %s successfully installed' % version))
def test_empty_file_has_correct_permissions(): from fabtools.files import owner, group, mode from fabtools.require.files import file as require_file try: run_as_root('touch foo') require_file('bar', use_sudo=True) assert owner('foo') == owner('bar') assert group('foo') == group('bar') assert mode('foo') == mode('bar') finally: run_as_root('rm -f foo bar')
def allow_sudo_user(setup_package): """ Fix sudo config if needed Some Vagrant boxes come with a too restrictive sudoers config and only allow the vagrant user to run commands as root. """ from fabtools.require import file as require_file require_file( '/etc/sudoers.d/fabtools', contents="vagrant ALL=(ALL) NOPASSWD:ALL\n", owner='root', mode='440', use_sudo=True, )
def test_file_with_contents_has_correct_permissions(): from fabtools.files import owner, group, mode from fabtools.require.files import file as require_file try: run_as_root('echo "something" > foo') require_file('bar', contents='something', use_sudo=True) assert owner('foo') == owner('bar') assert group('foo') == group('bar') assert mode('foo') == mode('bar') finally: run_as_root('rm -f foo bar')
def default_locale(name): """ Require the locale to be the default. """ from fabtools.require import file as require_file # Ensure the locale is available locale(name) # Make it the default contents = 'LANG="%s"\n' % name if distrib_id() == "Archlinux": config_file = '/etc/locale.conf' else: config_file = '/etc/default/locale' require_file(config_file, contents, use_sudo=True)
def test_require_file_from_string(): """ Require that a file exists, whose contents should be this string """ from fabtools.require import file as require_file try: bar_contents = "This is the contents of the bar file" require_file('bar', contents=bar_contents) assert is_file('bar') assert run('cat bar') == bar_contents finally: run('rm -f bar')
def test_install_dependencies_from_package_json_file(nodejs, testdir): from fabtools.nodejs import install_dependencies, package_version, uninstall_package with cd(testdir): require_file( "package.json", contents=json.dumps({"name": "nodetest", "version": "1.0.0", "dependencies": {"underscore": "1.4.2"}}), ) install_dependencies() assert is_file("node_modules/underscore/underscore.js") assert package_version("underscore", local=True) == "1.4.2" uninstall_package("underscore", local=True)
def install_couchdb(): """ Install CouchDB 1.3.0 """ packages = [ 'erlang', 'libicu-dev', 'libmozjs185-dev', 'libcurl4-openssl-dev', 'curl' ] # Uncomment thess lines when fabtools 0.14.0 will be out. #if system.distrib_id() == "Debian" \ #and system.distrib_release().startswith('6.0'): # packages.append('libmozjs-dev') #packages.append('libmozjs-dev') #else: #packages.append('libmozjs185-dev') require.deb.packages(packages) require_file(url='http://apache.crihan.fr/dist/couchdb/source/' + '1.3.0/apache-couchdb-1.3.0.tar.gz') run('tar -xzvf apache-couchdb-1.3.0.tar.gz') with cd('apache-couchdb-1.3.0'): run('./configure; make') result = sudo('make install') installed = result.find( "You have installed Apache CouchDB, time to relax.") if installed == -1: print_failed("couchdb") run('rm -rf apache-couchdb-1.3.0') run('rm -rf apache-couchdb-1.3.0.tar.gz') require.users.user("couchdb", home='/usr/local/var/lib/couchdb') sudo('chown -R couchdb:couchdb /usr/local/etc/couchdb') sudo('chown -R couchdb:couchdb /usr/local/var/lib/couchdb') sudo('chown -R couchdb:couchdb /usr/local/var/log/couchdb') sudo('chown -R couchdb:couchdb /usr/local/var/run/couchdb') sudo('chmod 0770 /usr/local/etc/couchdb') sudo('chmod 0770 /usr/local/var/lib/couchdb') sudo('chmod 0770 /usr/local/var/log/couchdb') sudo('chmod 0770 /usr/local/var/run/couchdb') require.supervisor.process('couchdb', user='******', command='couchdb', autostart='true', environment='HOME=/usr/local/var/lib/couchdb') print(green("CouchDB 1.3.0 successfully installed"))
def install_couchdb(): """ Install CouchDB 1.3.0 """ packages = [ 'erlang', 'libicu-dev', 'libmozjs185-dev', 'libcurl4-openssl-dev', 'curl' ] # Uncomment thess lines when fabtools 0.14.0 will be out. #if system.distrib_id() == "Debian" \ #and system.distrib_release().startswith('6.0'): # packages.append('libmozjs-dev') #packages.append('libmozjs-dev') #else: #packages.append('libmozjs185-dev') require.deb.packages(packages) require_file(url='http://apache.crihan.fr/dist/couchdb/source/' + '1.3.0/apache-couchdb-1.3.0.tar.gz') run('tar -xzvf apache-couchdb-1.3.0.tar.gz') with cd('apache-couchdb-1.3.0'): run('./configure; make') result = sudo('make install') installed = result.find("You have installed Apache CouchDB, time to relax.") if installed == -1: print_failed("couchdb") run('rm -rf apache-couchdb-1.3.0') run('rm -rf apache-couchdb-1.3.0.tar.gz') require.users.user("couchdb", home='/usr/local/var/lib/couchdb') sudo('chown -R couchdb:couchdb /usr/local/etc/couchdb') sudo('chown -R couchdb:couchdb /usr/local/var/lib/couchdb') sudo('chown -R couchdb:couchdb /usr/local/var/log/couchdb') sudo('chown -R couchdb:couchdb /usr/local/var/run/couchdb') sudo('chmod 0770 /usr/local/etc/couchdb') sudo('chmod 0770 /usr/local/var/lib/couchdb') sudo('chmod 0770 /usr/local/var/log/couchdb') sudo('chmod 0770 /usr/local/var/run/couchdb') require.supervisor.process('couchdb', user='******', command='couchdb', autostart='true', environment='HOME=/usr/local/var/lib/couchdb') print(green("CouchDB 1.3.0 successfully installed"))
def uninstall_node08(): ''' Uninstall node 0.8.18 ''' sudo('npm uninstall npm') version = '0.8.18' folder = 'node-v%s' % version filename = folder + '.tar.gz' require_file(url='http://nodejs.org/dist/v%s/%s' % (version, filename)) sudo('tar -xzf %s' % filename) with cd('%s' % folder): sudo('./configure') sudo('make uninstall') sudo('make distclean') su_delete('%s*' % folder) print(green('Node 0.8.18 successfully uninstalled'))
def installed_from_source(version=VERSION): """ Require Redis to be installed from source. The compiled binaries will be installed in ``/opt/redis-{version}/``. """ from fabtools.require import directory as require_directory from fabtools.require import file as require_file from fabtools.require import user as require_user from fabtools.require.deb import packages as require_deb_packages from fabtools.require.rpm import packages as require_rpm_packages family = distrib_family() if family == "debian": require_deb_packages(["build-essential"]) elif family == "redhat": require_rpm_packages(["gcc", "make"]) require_user("redis", home="/var/lib/redis", system=True) require_directory("/var/lib/redis", owner="redis", use_sudo=True) dest_dir = "/opt/redis-%(version)s" % locals() require_directory(dest_dir, use_sudo=True, owner="redis") if not is_file("%(dest_dir)s/redis-server" % locals()): with cd("/tmp"): # Download and unpack the tarball tarball = "redis-%(version)s.tar.gz" % locals() url = _download_url(version) + tarball require_file(tarball, url=url) run("tar xzf %(tarball)s" % locals()) # Compile and install binaries with cd("redis-%(version)s" % locals()): run("make") for filename in BINARIES: run_as_root("cp -pf src/%(filename)s %(dest_dir)s/" % locals()) run_as_root("chown redis: %(dest_dir)s/%(filename)s" % locals())
def sysctl(key, value, persist=True): """ Require a kernel parameter to have a specific value. """ if get_sysctl(key) != value: set_sysctl(key, value) if persist: from fabtools.require import file as require_file filename = '/etc/sysctl.d/60-%s.conf' % key with watch(filename, use_sudo=True) as config: require_file(filename, contents='%(key)s = %(value)s\n' % locals(), use_sudo=True) if config.changed: if distrib_family() == 'debian': run_as_root('service procps start')
def test_install_dependencies_from_package_json_file(nodejs, testdir): from fabtools.nodejs import install_dependencies, package_version, uninstall_package with cd(testdir): require_file('package.json', contents=json.dumps({ 'name': 'nodetest', 'version': '1.0.0', 'dependencies': { 'underscore': '1.4.2' } })) install_dependencies() assert is_file('node_modules/underscore/underscore.js') assert package_version('underscore', local=True) == '1.4.2' uninstall_package('underscore', local=True)
def install_nginx(): ''' Install NGINX and make it use certs. ''' if system.distrib_id() == 'Debian': require_file(url='http://nginx.org/packages/keys/nginx_signing.key') deb.add_apt_key('nginx_signing.key') su_delete('nginx_signing.key') url = 'http://nginx.org/packages/debian/' distrib = 'squeeze' if system.distrib_release().startswith('7'): distrib = 'wheezy' require.deb.source('nginx', url, distrib, 'nginx') require.deb.package('nginx') contents = PROXIED_SITE_TEMPLATE % { 'server_name': 'cozy', 'port': 443, 'proxy_url': 'http://127.0.0.1:9104' } require.files.file( '/etc/nginx/conf.d/cozy.conf', contents=contents, use_sudo=True) else: require.deb.ppa('ppa:nginx/stable') require.nginx.site( 'cozy', template_contents=PROXIED_SITE_TEMPLATE, enabled=True, port=443, proxy_url='http://127.0.0.1:9104' ) if files.exists('/etc/nginx/conf.d/default.conf'): su_delete('/etc/nginx/conf.d/default.conf') if files.exists('/etc/nginx/conf.d/example_ssl.conf'): su_delete('/etc/nginx/conf.d/example_ssl.conf') service.restart('nginx') print(green('Nginx successfully installed.'))
def test_require_file_from_local_file(): """ Require that a file exists, whose contents should be this local file """ from fabtools.require import file as require_file try: baz_contents = "This is the contents of the bar file" fd, filename = mkstemp() tmp_file = os.fdopen(fd, 'w') tmp_file.write(baz_contents) tmp_file.close() require_file('baz', source=filename) assert is_file('baz') assert run('cat baz') == baz_contents finally: os.remove(filename) run('rm -f baz')
def install_node10(): ''' install node 0.10.26 ''' if is_pi(): version = '0.10.26' require_file( 'http://nodejs.org/dist/v0.10.21/node-v%s-linux-arm-pi.tar.gz' % version) run('tar -xzvf node-v%s-linux-arm-pi.tar.gz' % version) delete_if_exists('/opt/node') sudo('mkdir /opt/node') sudo('mv node-v%s-linux-arm-pi/* /opt/node' % version) sudo('ln -s /usr/local/bin/node /opt/node/bin/node') sudo('ln -s /usr/bin/node /opt/node/bin/node') sudo('ln -s /usr/local/bin/npm /opt/npm/bin/npm') sudo('ln -s /usr/bin/npm /opt/npm/bin/npm') else: require.nodejs.installed_from_source('0.10.26') print(green('node 0.10.26 successfully installed'))
def source(name, uri, distribution, *components): """ Require a package source. :: from fabtools import require # Official MongoDB packages require.deb.source('mongodb', 'http://downloads-distro.mongodb.org/repo/ubuntu-upstart', 'dist', '10gen') """ from fabtools.require import file as require_file path = '/etc/apt/sources.list.d/%(name)s.list' % locals() components = ' '.join(components) source_line = 'deb %(uri)s %(distribution)s %(components)s\n' % locals() with watch(path) as config: require_file(path=path, contents=source_line, use_sudo=True) if config.changed: puts('Added APT repository: %s' % source_line) update_index()