diff --git a/CHANGELOG.md b/CHANGELOG.md index 27a7563ec17..fcc56d1ca78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -249,6 +249,7 @@ Ansible Changes By Release * win_reg_stat * win_say * win_shortcut + * win_tempfile - xbps - zfs: * zfs_facts diff --git a/lib/ansible/modules/windows/win_tempfile.ps1 b/lib/ansible/modules/windows/win_tempfile.ps1 new file mode 100644 index 00000000000..28aa70c70a1 --- /dev/null +++ b/lib/ansible/modules/windows/win_tempfile.ps1 @@ -0,0 +1,69 @@ +#!powershell +# (c) 2017, Dag Wieers +# +# This file is part of Ansible +# +# 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 . + +# WANT_JSON +# POWERSHELL_COMMON + +Function New-TempFile { + Param ([string]$path, [string]$prefix, [string]$suffix, [string]$type, [bool]$checkmode) + $temppath = $null + $attempt = 0 + + # Since we don't know if the file already exists, we try 5 times with a random name + do { + $attempt += 1 + $randomname = [System.IO.Path]::GetRandomFileName() + $temppath = (Join-Path -Path $path -ChildPath "$prefix$randomname$suffix") + Try { + New-Item -Path $temppath -ItemType $type -WhatIf:$checkmode | Out-Null + } Catch { + $temppath = $null + $error = $_.Exception.Message + } + } until ($temppath -ne $null -or $attempt -ge 5) + + # If it fails 5 times, something is wrong and we have to report the details + if ($temppath -eq $null) { + Fail-Json @{} "No random temporary file worked in $attempt attempts. Error: $error" + } + + return $temppath +} + +$ErrorActionPreference = "Stop" + +$params = Parse-Args $args -supports_check_mode $true +$check_mode = Get-AnsibleParam -obj $params -name "_ansible_check_mode" -type "bool" -default $false + +$path = Get-AnsibleParam -obj $params -name "path" -type "path" -default "%TEMP%" -aliases "dest" +$state = Get-AnsibleParam -obj $params -name "state" -type "string" -default "file" -validateset "file","directory" +$prefix = Get-AnsibleParam -obj $params -name "prefix" -type "string" -default "ansible." +$suffix = Get-AnsibleParam -obj $params -name "suffix" -type "string" + +# Expand environment variables on non-path types +$prefix = Expand-Environment($prefix) +$suffix = Expand-Environment($suffix) + +$result = @{ + changed = $true + state = $state +} + +$result.path = New-TempFile -Path $path -Prefix $prefix -Suffix $suffix -Type $state -CheckMode $check_mode + +Exit-Json $result \ No newline at end of file diff --git a/lib/ansible/modules/windows/win_tempfile.py b/lib/ansible/modules/windows/win_tempfile.py new file mode 100644 index 00000000000..0903d432425 --- /dev/null +++ b/lib/ansible/modules/windows/win_tempfile.py @@ -0,0 +1,73 @@ +#!/usr/bin/python +#coding: utf-8 -*- + +# (c) 2017 Dag Wieers +# +# This file is part of Ansible +# +# 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 . + +ANSIBLE_METADATA = {'status': ['preview'], + 'supported_by': 'community', + 'version': '1.0'} + +DOCUMENTATION = r''' +--- +module: win_tempfile +version_added: "2.3" +author: Dag Wieers (@dagwieers) +short_description: Creates temporary files and directories. +description: + - Creates temporary files and directories. +options: + state: + description: + - Whether to create file or directory. + choices: [ file, directory ] + default: file + path: + description: + - Location where temporary file or directory should be created. + - If path is not specified default system temporary directory (%TEMP%) will be used. + default: '%TEMP%' + prefix: + description: + - Prefix of file/directory name created by module. + default: ansible. + suffix: + description: + - Suffix of file/directory name created by module. + default: '' +''' + +EXAMPLES = r""" +- name: Create temporary build directory + win_tempfile: + state: directory + suffix: build + +- name: Create temporary file + win_tempfile: + state: file + suffix: temp +""" + +RETURN = r''' +path: + description: Path to created file or directory + returned: success + type: string + sample: C:\Users\Administrator\AppData\Local\Temp\ansible.bMlvdk +''' +