|
|
@ -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
|
|
|
|
|
|
|
|
|
|
|
|