Merge pull request #2273 from dorfsmay/pullreq-use_proxy

Added a use_proxy option to get_url.
This commit is contained in:
Michael DeHaan 2013-03-10 16:10:45 -07:00
commit e5297678c5

37
get_url
View file

@ -31,6 +31,12 @@ short_description: Downloads files from HTTP, HTTPS, or FTP to node
description: description:
- Downloads files from HTTP, HTTPS, or FTP to the remote server. The remote - Downloads files from HTTP, HTTPS, or FTP to the remote server. The remote
server I(must) have direct access to the remote resource. server I(must) have direct access to the remote resource.
- By default, if an environment variable C(<protocol>_proxy) is set on
the target host, requests will be sent through that proxy. This
behaviour can be overriden by setting a variable for this task
(see `setting the environment
<http://ansible.cc/docs/playbooks2.html#setting-the-environment-and-working-with-proxies>`_),
or by using the use_proxy option.
version_added: "0.6" version_added: "0.6"
options: options:
url: url:
@ -56,6 +62,13 @@ options:
choices: [ "yes", "no" ] choices: [ "yes", "no" ]
default: "no" default: "no"
aliases: [ "thirsty" ] aliases: [ "thirsty" ]
use_proxy:
description:
- if C(no), it will not use a proxy, even if one is defined by
in an environment variable on the target hosts.
required: false
default: yes
choices: [yes, no]
others: others:
description: description:
- all arguments accepted by the M(file) module also work here - all arguments accepted by the M(file) module also work here
@ -94,7 +107,7 @@ def url_filename(url):
return 'index.html' return 'index.html'
return fn return fn
def url_do_get(module, url, dest): def url_do_get(module, url, dest, use_proxy):
""" """
Get url and return request and info Get url and return request and info
Credits: http://stackoverflow.com/questions/7006574/how-to-download-file-from-ftp Credits: http://stackoverflow.com/questions/7006574/how-to-download-file-from-ftp
@ -103,7 +116,10 @@ def url_do_get(module, url, dest):
USERAGENT = 'ansible-httpget' USERAGENT = 'ansible-httpget'
info = dict(url=url, dest=dest) info = dict(url=url, dest=dest)
r = None r = None
handlers = []
parsed = urlparse.urlparse(url) parsed = urlparse.urlparse(url)
if '@' in parsed[1]: if '@' in parsed[1]:
credentials, netloc = parsed[1].split('@', 1) credentials, netloc = parsed[1].split('@', 1)
if ':' in credentials: if ':' in credentials:
@ -123,12 +139,17 @@ def url_do_get(module, url, dest):
authhandler = urllib2.HTTPBasicAuthHandler(passman) authhandler = urllib2.HTTPBasicAuthHandler(passman)
# create the AuthHandler # create the AuthHandler
handlers.append(authhandler)
opener = urllib2.build_opener(authhandler)
urllib2.install_opener(opener)
#reconstruct url without credentials #reconstruct url without credentials
url = urlparse.urlunparse(parsed) url = urlparse.urlunparse(parsed)
if not use_proxy:
proxyhandler = urllib2.ProxyHandler({})
handlers.append(proxyhandler)
opener = urllib2.build_opener(*handlers)
urllib2.install_opener(opener)
request = urllib2.Request(url) request = urllib2.Request(url)
request.add_header('User-agent', USERAGENT) request.add_header('User-agent', USERAGENT)
@ -151,14 +172,14 @@ def url_do_get(module, url, dest):
return r, info return r, info
def url_get(module, url, dest): def url_get(module, url, dest, use_proxy):
""" """
Download url and store at dest. Download url and store at dest.
If dest is a directory, determine filename from url. If dest is a directory, determine filename from url.
Return (tempfile, info about the request) Return (tempfile, info about the request)
""" """
req, info = url_do_get(module, url, dest) req, info = url_do_get(module, url, dest, use_proxy)
# TODO: should really handle 304, but how? src file could exist (and be newer) but empty # TODO: should really handle 304, but how? src file could exist (and be newer) but empty
if info['status'] == 304: if info['status'] == 304:
@ -195,7 +216,8 @@ def main():
argument_spec = dict( argument_spec = dict(
url = dict(required=True), url = dict(required=True),
dest = dict(required=True), dest = dict(required=True),
force = dict(default='no', aliases=['thirsty'], type='bool') force = dict(default='no', aliases=['thirsty'], type='bool'),
use_proxy = dict(default='yes', type='bool')
), ),
add_file_common_args=True add_file_common_args=True
) )
@ -203,6 +225,7 @@ def main():
url = module.params['url'] url = module.params['url']
dest = os.path.expanduser(module.params['dest']) dest = os.path.expanduser(module.params['dest'])
force = module.params['force'] force = module.params['force']
use_proxy = module.params['use_proxy']
if os.path.isdir(dest): if os.path.isdir(dest):
dest = os.path.join(dest, url_filename(url)) dest = os.path.join(dest, url_filename(url))
@ -212,7 +235,7 @@ def main():
module.exit_json(msg="file already exists", dest=dest, url=url, changed=False) module.exit_json(msg="file already exists", dest=dest, url=url, changed=False)
# download to tmpsrc # download to tmpsrc
tmpsrc, info = url_get(module, url, dest) tmpsrc, info = url_get(module, url, dest, use_proxy)
md5sum_src = None md5sum_src = None
md5sum_dest = None md5sum_dest = None