mirror of
https://github.com/kevingruesser/bootstrap-vz.git
synced 2025-08-24 07:26:29 +00:00

Add username and password settings to the APT Proxy plugin so that users who are behind an authenticating proxy can still use bootstrap-vz without having to jump through hoops. If either the username or password are not set, then no authentication is used.
60 lines
1.9 KiB
Python
60 lines
1.9 KiB
Python
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 reachability of APT proxy server'
|
|
phase = phases.preparation
|
|
|
|
@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.warning('The APT proxy server couldn\'t be reached. `apt-get\' commands may fail.')
|
|
|
|
|
|
class SetAptProxy(Task):
|
|
description = 'Setting proxy for APT'
|
|
phase = phases.package_installation
|
|
successors = [apt.AptUpdate]
|
|
|
|
@classmethod
|
|
def run(cls, info):
|
|
proxy_path = os.path.join(info.root, 'etc/apt/apt.conf.d/02proxy')
|
|
proxy_username = info.manifest.plugins['apt_proxy'].get('username')
|
|
proxy_password = info.manifest.plugins['apt_proxy'].get('password')
|
|
proxy_address = info.manifest.plugins['apt_proxy']['address']
|
|
proxy_port = info.manifest.plugins['apt_proxy']['port']
|
|
|
|
if None not in (proxy_username, proxy_password):
|
|
proxy_auth = '{username}:{password}@'.format(
|
|
username=proxy_username, password=proxy_password)
|
|
else:
|
|
proxy_auth = ''
|
|
|
|
with open(proxy_path, 'w') as proxy_file:
|
|
proxy_file.write(
|
|
'Acquire::http {{ Proxy "http://{auth}{address}:{port}"; }};\n'
|
|
.format(auth=proxy_auth, address=proxy_address, port=proxy_port))
|
|
|
|
|
|
class RemoveAptProxy(Task):
|
|
description = 'Removing APT proxy configuration file'
|
|
phase = phases.system_cleaning
|
|
|
|
@classmethod
|
|
def run(cls, info):
|
|
os.remove(os.path.join(info.root, 'etc/apt/apt.conf.d/02proxy'))
|