--- /dev/null
+# #### Overview:
+#
+# Define resource to retrieve files to staging directories. It is
+# intententionally not replacing files, as these intend to be large binaries
+# that are versioned.
+#
+# #### Notes:
+#
+# If you specify a different staging location, please manage the file
+# resource as necessary.
+#
+define staging::file (
+ $source, #: the source file location, supports local files, puppet://, http://, https://, ftp://, s3://
+ $target = undef, #: the target file location, if unspecified ${staging::path}/${subdir}/${name}
+ $username = undef, #: https or ftp username
+ $certificate = undef, #: https certificate file
+ $password = undef, #: https or ftp user password or https certificate password
+ $environment = undef, #: environment variable for settings such as http_proxy, https_proxy, of ftp_proxy
+ $timeout = undef, #: the the time to wait for the file transfer to complete
+ $curl_option = undef, #: options to pass to curl
+ $wget_option = undef, #: options to pass to wget
+ $tries = undef, #: amount of retries for the file transfer when non transient connection errors exist
+ $try_sleep = undef, #: time to wait between retries for the file transfer
+ $subdir = $caller_module_name
+) {
+
+ include staging
+
+ $quoted_source = shellquote($source)
+
+ if $target {
+ $target_file = $target
+ $staging_dir = staging_parse($target, 'parent')
+ } else {
+ $staging_dir = "${staging::path}/${subdir}"
+ $target_file = "${staging_dir}/${name}"
+
+ if ! defined(File[$staging_dir]) {
+ file { $staging_dir:
+ ensure=>directory,
+ }
+ }
+ }
+
+ Exec {
+ path => $staging::exec_path,
+ environment => $environment,
+ cwd => $staging_dir,
+ creates => $target_file,
+ timeout => $timeout,
+ try_sleep => $try_sleep,
+ tries => $tries,
+ logoutput => on_failure,
+ }
+
+ case $::staging_http_get {
+ 'curl', default: {
+ $http_get = "curl ${curl_option} -f -L -o ${target_file} ${quoted_source}"
+ $http_get_passwd = "curl ${curl_option} -f -L -o ${target_file} -u ${username}:${password} ${quoted_source}"
+ $http_get_cert = "curl ${curl_option} -f -L -o ${target_file} -E ${certificate}:${password} ${quoted_source}"
+ $ftp_get = "curl ${curl_option} -o ${target_file} ${quoted_source}"
+ $ftp_get_passwd = "curl ${curl_option} -o ${target_file} -u ${username}:${password} ${quoted_source}"
+ }
+ 'wget': {
+ $http_get = "wget ${wget_option} -O ${target_file} ${quoted_source}"
+ $http_get_passwd = "wget ${wget_option} -O ${target_file} --user=${username} --password=${password} ${quoted_source}"
+ $http_get_cert = "wget ${wget_option} -O ${target_file} --user=${username} --certificate=${certificate} ${quoted_source}"
+ $ftp_get = $http_get
+ $ftp_get_passwd = $http_get_passwd
+ }
+ 'powershell':{
+ $http_get = "powershell.exe -Command \"\$wc = New-Object System.Net.WebClient;\$wc.DownloadFile('${source}','${target_file}')\""
+ $ftp_get = $http_get
+ $http_get_password = "powershell.exe -Command \"\$wc = (New-Object System.Net.WebClient);\$wc.Credentials = New-Object System.Net.NetworkCredential('${username}','${password}');\$wc.DownloadFile(${source},${target_file})\""
+ $ftp_get_password = $http_get_password
+ }
+ }
+
+ case $source {
+ /^\//: {
+ file { $target_file:
+ source => $source,
+ replace => false,
+ }
+ }
+ /^puppet:\/\//: {
+ file { $target_file:
+ source => $source,
+ replace => false,
+ }
+ }
+ /^http:\/\//: {
+ if $username { $command = $http_get_passwd }
+ else { $command = $http_get }
+ exec { $target_file:
+ command => $command,
+ }
+ }
+ /^https:\/\//: {
+ if $username { $command = $http_get_passwd }
+ elsif $certificate { $command = $http_get_cert }
+ else { $command = $http_get }
+ exec { $target_file:
+ command => $command,
+ }
+ }
+ /^ftp:\/\//: {
+ if $username { $command = $ftp_get_passwd }
+ else { $command = $ftp_get }
+ exec { $target_file:
+ command => $command,
+ }
+ }
+ /^s3:\/\//: {
+ $command = "aws s3 cp ${source} ${target_file}"
+ exec { $target_file:
+ command => $command,
+ }
+ }
+ default: {
+ fail("staging::file: do not recognize source ${source}.")
+ }
+ }
+
+}