2014-09-26 01:01:01 +00:00
#!powershell
# This file is part of Ansible.
#
2015-06-08 11:45:20 +00:00
# (c)) 2015, Paul Durivage <paul.durivage@rackspace.com>, Tal Auslander <tal@cloudshare.com>
2014-09-26 01:01:01 +00:00
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
# WANT_JSON
# POWERSHELL_COMMON
2017-02-24 06:26:01 +00:00
$params = Parse-Args $args -supports_check_mode $true
$check_mode = Get-AnsibleParam -obj $params -name " _ansible_check_mode " -type " bool " -default $false
$url = Get-AnsibleParam -obj $params -name " url " -type " str " -failifempty $true
$dest = Get-AnsibleParam -obj $params -name " dest " -type " path " -failifempty $true
2017-07-05 23:56:43 +00:00
$skip_certificate_validation = Get-AnsibleParam -obj $params -name " skip_certificate_validation " -type " bool "
$validate_certs = Get-AnsibleParam -obj $params -name " validate_certs " -type " bool " -default $true
2017-02-24 06:26:01 +00:00
$username = Get-AnsibleParam -obj $params -name " username " -type " str "
$password = Get-AnsibleParam -obj $params -name " password " -type " str "
$proxy_url = Get-AnsibleParam -obj $params -name " proxy_url " -type " str "
$proxy_username = Get-AnsibleParam -obj $params -name " proxy_username " -type " str "
$proxy_password = Get-AnsibleParam -obj $params -name " proxy_password " -type " str "
$force = Get-AnsibleParam -obj $params -name " force " -type " bool " -default $true
$result = @ {
2014-09-26 01:01:01 +00:00
changed = $false
2017-02-24 06:26:01 +00:00
win_get_url = @ {
dest = $dest
url = $url
}
2014-09-26 01:01:01 +00:00
}
2017-07-05 23:56:43 +00:00
# If skip_certificate_validation was specified, use validate_certs
if ( $skip_certificate_validation -ne $null ) {
Add-DeprecationWarning -obj $result -msg " The parameter 'skip_vertificate_validation' is being replaced with 'validate_certs' " -version 2.8
$validate_certs = -not $skip_certificate_validation
}
if ( -not $validate_certs ) {
2017-02-24 06:26:01 +00:00
[ System.Net.ServicePointManager ] :: ServerCertificateValidationCallback = { $true }
2015-06-25 20:52:23 +00:00
}
2017-07-10 04:30:55 +00:00
2016-03-18 08:41:54 +00:00
Function Download-File($result , $url , $dest , $username , $password , $proxy_url , $proxy_username , $proxy_password ) {
2017-07-10 04:30:55 +00:00
# use last part of url for dest file name if a directory is supplied for $dest
If ( Test-Path -PathType Container $dest ) {
$url_basename = Split-Path -leaf $url
If ( $url_basename . Length -gt 0 ) {
$dest = Join-Path -Path $dest -ChildPath $url_basename
$result . win_get_url . actual_dest = $dest
}
}
# check $dest parent folder exists before attempting download, which avoids unhelpful generic error message.
$dest_parent = Split-Path -Path $dest
$result . win_get_url . dest_parent = $dest_parent
If ( -not ( Test-Path -Path $dest_parent -PathType Container ) ) {
$result . changed = $false
Fail-Json $result " The path ' $dest_parent ' does not exist for destination ' $dest ', or is not visible to the current user. Ensure download destination folder exists (perhaps using win_file state=directory) before win_get_url runs. "
}
2016-01-15 16:56:14 +00:00
$webClient = New-Object System . Net . WebClient
2015-12-19 09:11:35 +00:00
if ( $proxy_url ) {
$proxy_server = New-Object System . Net . WebProxy ( $proxy_url , $true )
2015-08-28 05:46:08 +00:00
if ( $proxy_username -and $proxy_password ) {
$proxy_credential = New-Object System . Net . NetworkCredential ( $proxy_username , $proxy_password )
$proxy_server . Credentials = $proxy_credential
}
2016-01-15 16:56:14 +00:00
$webClient . Proxy = $proxy_server
2015-08-28 05:46:08 +00:00
}
2014-09-26 01:01:01 +00:00
2015-06-25 20:52:23 +00:00
if ( $username -and $password ) {
2016-01-15 16:56:14 +00:00
$webClient . Credentials = New-Object System . Net . NetworkCredential ( $username , $password )
2015-06-25 20:52:23 +00:00
}
2015-06-08 11:45:20 +00:00
Try {
2017-02-24 06:26:01 +00:00
if ( -not $check_mode ) {
$webClient . DownloadFile ( $url , $dest )
}
2015-06-08 11:45:20 +00:00
$result . changed = $true
}
Catch {
2015-07-16 19:01:09 +00:00
Fail-Json $result " Error downloading $url to $dest $( $_ . Exception . Message ) "
2015-06-08 11:45:20 +00:00
}
2016-03-18 08:41:54 +00:00
}
2017-08-11 01:00:34 +00:00
# Enable TLS1.1/TLS1.2 if they're available but disabled (eg. .NET 4.5)
$security_protcols = [ Net.ServicePointManager ] :: SecurityProtocol -bor [ Net.SecurityProtocolType ] :: SystemDefault
if ( [ Net.SecurityProtocolType ] . GetMember ( " Tls11 " ) . Count -gt 0 ) {
$security_protcols = $security_protcols -bor [ Net.SecurityProtocolType ] :: Tls11
}
if ( [ Net.SecurityProtocolType ] . GetMember ( " Tls12 " ) . Count -gt 0 ) {
$security_protcols = $security_protcols -bor [ Net.SecurityProtocolType ] :: Tls12
}
[ Net.ServicePointManager ] :: SecurityProtocol = $security_protcols
2016-03-18 08:41:54 +00:00
2017-02-24 06:26:01 +00:00
If ( $force -or -not ( Test-Path -Path $dest ) ) {
2017-07-10 04:30:55 +00:00
2017-02-24 06:26:01 +00:00
Download-File -result $result -url $url -dest $dest -username $username -password $password -proxy_url $proxy_url -proxy_username $proxy_username -proxy_password $proxy_password
2014-09-26 01:01:01 +00:00
}
2015-06-08 11:45:20 +00:00
Else {
2016-03-18 08:41:54 +00:00
$fileLastMod = ( [ System.IO.FileInfo ] $dest ) . LastWriteTimeUtc
$webLastMod = $null
2015-06-08 11:45:20 +00:00
Try {
$webRequest = [ System.Net.HttpWebRequest ] :: Create ( $url )
2017-03-29 18:29:27 +00:00
if ( $proxy_url ) {
$proxy_server = New-Object System . Net . WebProxy ( $proxy_url , $true )
if ( $proxy_username -and $proxy_password ) {
$proxy_credential = New-Object System . Net . NetworkCredential ( $proxy_username , $proxy_password )
$proxy_server . Credentials = $proxy_credential
}
$webRequest . Proxy = $proxy_server
}
2015-06-25 20:52:23 +00:00
if ( $username -and $password ) {
$webRequest . Credentials = New-Object System . Net . NetworkCredential ( $username , $password )
}
2016-03-18 08:41:54 +00:00
$webRequest . Method = " HEAD "
2015-06-08 11:45:20 +00:00
[ System.Net.HttpWebResponse ] $webResponse = $webRequest . GetResponse ( )
2016-03-18 08:41:54 +00:00
$webLastMod = $webResponse . GetResponseHeader ( " Last-Modified " )
$webResponse . Close ( )
2015-06-08 11:45:20 +00:00
}
Catch {
2016-03-18 08:41:54 +00:00
Fail-Json $result " Error when requesting Last-Modified date from $url $( $_ . Exception . Message ) "
}
2016-04-20 19:26:44 +00:00
If ( ( $webLastMod ) -and ( ( Get-Date -Date $webLastMod ) -lt $fileLastMod ) ) {
2016-03-18 08:41:54 +00:00
$result . changed = $false
} Else {
Download-File -result $result -url $url -dest $dest -username $username -password $password -proxy_url $proxy_url -proxy_username $proxy_username -proxy_password $proxy_password
2015-06-08 11:45:20 +00:00
}
2016-03-18 08:41:54 +00:00
2014-09-26 01:01:01 +00:00
}
2017-07-10 04:30:55 +00:00
Exit-Json $result