Skip to content

Commit

Permalink
Merge pull request #6 from krux/target-apt-updates
Browse files Browse the repository at this point in the history
Allow targeting apt updates to a specified sources file.
  • Loading branch information
andrewsomething committed Jun 30, 2017
2 parents 75bed35 + 0372837 commit f818d60
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 19 deletions.
1 change: 1 addition & 0 deletions dev-requirements.pip
@@ -0,0 +1 @@
nose==1.3.7
43 changes: 27 additions & 16 deletions fabric_package_management/apt.py
Expand Up @@ -15,7 +15,7 @@ def _run_cmd(func, cmd, verbose):


def install(packages, assume_yes=True, no_install_recommends=False,
install_suggests=False, use_sudo=True, verbose=True):
install_suggests=False, use_sudo=True, verbose=True, force_yes=False):
"""
Install packages on the remote host via Apt.
Expand All @@ -30,46 +30,48 @@ def install(packages, assume_yes=True, no_install_recommends=False,
use_sudo (bool): If `True`, will use `sudo` instead of `run`.
(Default: `True`)
verbose (bool): If `False`, hide all output. (Default: `True`)
force_yes (bool): add the --force-yes apt-get option. (Default: `False`)
"""
if not isinstance(packages, str):
packages = ' '.join(packages)

options = list()

if assume_yes:
yes = '--yes'
else:
yes = ''
options.append('--yes')

if no_install_recommends:
recommends = '--no-install-recommends'
else:
recommends = ''
options.append('--no-install-recommends')

if install_suggests:
suggests = '--install-suggests'
else:
suggests = ''
options.append('--install-suggests')

if force_yes:
options.append('--force-yes')

func = use_sudo and sudo or run
cmd = 'apt-get install {0} {1} {2} {3}'.format(yes,
recommends,
suggests,
packages)
cmd = 'apt-get install {0} {1}'.format(
' '.join(options), packages
)

return _run_cmd(func, cmd, verbose)


def update(use_sudo=True, verbose=True):
def update(use_sudo=True, verbose=True, source_name=None):
"""
Update Apt's package index files on the remote host.
Args:
use_sudo (bool): If `True`, will use `sudo` instead of `run`.
(Default: `True`)
verbose (bool): If `False`, hide all output. (Default: `True`)
source_name (str): If set, update only the sources defined in that sources.list.d file.
"""
func = use_sudo and sudo or run
cmd = 'apt-get update'

if source_name is not None:
cmd += " -o Dir::Etc::sourceparts='-' "
cmd += "-o Dir::Etc::sourcelist='sources.list.d/{}.list'".format(source_name)
return _run_cmd(func, cmd, verbose)


Expand Down Expand Up @@ -287,3 +289,12 @@ def installed(package, use_sudo=True):
if installed.find("install ok installed") > -1:
return True
return False


def check_version_available(package, version):
output = run("apt-cache madison {}".format(package), quiet=True).split("\n")
versions = []
for line in output:
parts = line.split("|", 2)
versions.append(parts[1].strip())
return version in versions
1 change: 1 addition & 0 deletions requirements.pip
@@ -0,0 +1 @@
Fabric==1.13.2
2 changes: 1 addition & 1 deletion setup.py
Expand Up @@ -5,7 +5,7 @@

setup(
name='fabric-package-management',
version='0.1.1',
version='0.1.2',
description='A collection of fabric tasks for package management',
long_description=long_description,
url='https://github.com/andrewsomething/fabric-package-management',
Expand Down
2 changes: 2 additions & 0 deletions tests/Dockerfile.apt
Expand Up @@ -6,5 +6,7 @@ RUN mkdir /var/run/sshd
RUN echo 'root:functionaltests' |chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config

RUN echo 'deb http://archive.ubuntu.com/ubuntu trusty-backports main restricted universe multiverse' > /etc/apt/sources.list.d/trusty-backports.list

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
20 changes: 18 additions & 2 deletions tests/test_apt.py
Expand Up @@ -40,6 +40,11 @@ def tearDown(self):
return docker('rm -f %s' % self.container)

def test_update(self):

test_source = 'trusty-backports'
test_update_command = "apt-get update -o Dir::Etc::sourceparts='-' "
test_update_command += "-o Dir::Etc::sourcelist='sources.list.d/{}.list'".format(test_source)

with settings(host_string=self.container_host,
user='root',
password='functionaltests'):
Expand All @@ -52,6 +57,10 @@ def test_update(self):
self.assertTrue(update.succeeded)
self.assertEqual(update.command, 'apt-get update')

update = apt.update(source_name=test_source)
self.assertTrue(update.succeeded)
self.assertEqual(update.command, test_update_command)

def test_upgrade(self):
with settings(host_string=self.container_host,
user='root',
Expand Down Expand Up @@ -87,15 +96,15 @@ def test_install(self):
install = apt.install(['bpython', 'git'],
no_install_recommends=True)
self.assertTrue(install.succeeded)
expt = 'apt-get install --yes --no-install-recommends bpython git'
expt = 'apt-get install --yes --no-install-recommends bpython git'
self.assertEqual(install.command, expt)
self.assertTrue(exists('/usr/bin/git'))
self.assertTrue(exists('/usr/bin/bpython'))

install = apt.install('htop', install_suggests=True,
use_sudo=False, verbose=False)
self.assertTrue(install.succeeded)
expt = 'apt-get install --yes --install-suggests htop'
expt = 'apt-get install --yes --install-suggests htop'
self.assertEqual(install.command, expt)
self.assertTrue(exists('/usr/bin/htop'))

Expand Down Expand Up @@ -195,3 +204,10 @@ def test_installed(self):
self.assertFalse(apt.installed('rolldice'))
apt.install('rolldice')
self.assertTrue(apt.installed('rolldice'))

def test_check_version_available(self):
with settings(host_string=self.container_host,
user='root',
password='functionaltests'):
self.assertTrue(apt.check_version_available(package='apache2', version='2.4.7-1ubuntu4'))
self.assertFalse(apt.check_version_available(package='apache2', version='1.0'))

0 comments on commit f818d60

Please sign in to comment.