From 4ba701cfada88e4b99e41a0525b1ff31aba10f86 Mon Sep 17 00:00:00 2001 From: Tiago Ilieve Date: Fri, 23 May 2014 09:51:17 -0300 Subject: [PATCH] Add CheckAptProxy task Check if the specified APT proxy server can be reached, informing the user if this can't be done. That will help them to debug the errors that will be raised by `apt-get` because of the misleading proxy configuration. This closes #95. --- bootstrapvz/plugins/apt_proxy/__init__.py | 1 + bootstrapvz/plugins/apt_proxy/tasks.py | 24 ++++++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/bootstrapvz/plugins/apt_proxy/__init__.py b/bootstrapvz/plugins/apt_proxy/__init__.py index a5b086c..6ca8f71 100644 --- a/bootstrapvz/plugins/apt_proxy/__init__.py +++ b/bootstrapvz/plugins/apt_proxy/__init__.py @@ -6,6 +6,7 @@ def validate_manifest(data, validator, error): def resolve_tasks(taskset, manifest): import tasks + taskset.add(tasks.CheckAptProxy) taskset.add(tasks.SetAptProxy) if not manifest.plugins['apt_proxy'].get('persistent', False): taskset.add(tasks.RemoveAptProxy) diff --git a/bootstrapvz/plugins/apt_proxy/tasks.py b/bootstrapvz/plugins/apt_proxy/tasks.py index 9d8dbc3..22ac4d9 100644 --- a/bootstrapvz/plugins/apt_proxy/tasks.py +++ b/bootstrapvz/plugins/apt_proxy/tasks.py @@ -2,12 +2,34 @@ from bootstrapvz.base import Task from bootstrapvz.common import phases from bootstrapvz.common.tasks import apt import os +import urllib2 + + +class CheckAptProxy(Task): + description = 'Checking APT proxy server' + phase = phases.package_installation + + @classmethod + def run(cls, info): + proxy_address = info.manifest.plugins['apt_proxy']['address'] + proxy_port = info.manifest.plugins['apt_proxy']['port'] + proxy_url = 'http://{address}:{port}'.format(address=proxy_address, port=proxy_port) + try: + urllib2.urlopen(proxy_url, timeout=5) + except Exception as e: + # Default response from `apt-cacher-ng` + if isinstance(e, urllib2.HTTPError) and e.code == 404 and e.msg == 'Usage Information': + pass + else: + import logging + log = logging.getLogger(__name__) + log.error('The APT proxy server couldn\'t be reached. `apt-get` commands may fail from now on.') class SetAptProxy(Task): description = 'Setting proxy for APT' phase = phases.package_installation - successors = [apt.AptUpdate] + successors = [apt.AptUpdate, CheckAptProxy] @classmethod def run(cls, info):