Revert "Merge pull request #384 from jhawkesworth/win_copy_file_template_ansible_modules_core_1"
I missed some discussion in devel, these need more work before inclusion This reverts commit58bfebb047
, reversing changes made to27dee77ca0
.
This commit is contained in:
parent
443951ce82
commit
a942e5f853
6 changed files with 4 additions and 376 deletions
|
@ -1,84 +0,0 @@
|
||||||
#!powershell
|
|
||||||
# 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 <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# WANT_JSON
|
|
||||||
# POWERSHELL_COMMON
|
|
||||||
|
|
||||||
$params = Parse-Args $args;
|
|
||||||
|
|
||||||
$src= Get-Attr $params "src" $FALSE;
|
|
||||||
If ($src -eq $FALSE)
|
|
||||||
{
|
|
||||||
Fail-Json (New-Object psobject) "missing required argument: src";
|
|
||||||
}
|
|
||||||
|
|
||||||
$dest= Get-Attr $params "dest" $FALSE;
|
|
||||||
If ($dest -eq $FALSE)
|
|
||||||
{
|
|
||||||
Fail-Json (New-Object psobject) "missing required argument: dest";
|
|
||||||
}
|
|
||||||
|
|
||||||
# seems to be supplied by the calling environment, but
|
|
||||||
# probably shouldn't be a test for it existing in the params.
|
|
||||||
# TODO investigate.
|
|
||||||
$original_basename = Get-Attr $params "original_basename" $FALSE;
|
|
||||||
If ($original_basename -eq $FALSE)
|
|
||||||
{
|
|
||||||
Fail-Json (New-Object psobject) "missing required argument: original_basename ";
|
|
||||||
}
|
|
||||||
|
|
||||||
$result = New-Object psobject @{
|
|
||||||
changed = $FALSE
|
|
||||||
};
|
|
||||||
|
|
||||||
# if $dest is a dir, append $original_basename so the file gets copied with its intended name.
|
|
||||||
if (Test-Path $dest -PathType Container)
|
|
||||||
{
|
|
||||||
$dest = Join-Path $dest $original_basename;
|
|
||||||
}
|
|
||||||
|
|
||||||
If (Test-Path $dest)
|
|
||||||
{
|
|
||||||
$dest_checksum = Get-FileChecksum ($dest);
|
|
||||||
$src_checksum = Get-FileChecksum ($src);
|
|
||||||
|
|
||||||
If (! $src_checksum.CompareTo($dest_checksum))
|
|
||||||
{
|
|
||||||
# New-Item -Force creates subdirs for recursive copies
|
|
||||||
New-Item -Force $dest -Type file;
|
|
||||||
Copy-Item -Path $src -Destination $dest -Force;
|
|
||||||
}
|
|
||||||
$dest_checksum = Get-FileChecksum ($dest);
|
|
||||||
If ( $src_checksum.CompareTo($dest_checksum))
|
|
||||||
{
|
|
||||||
$result.changed = $TRUE;
|
|
||||||
}
|
|
||||||
Else
|
|
||||||
{
|
|
||||||
Fail-Json (New-Object psobject) "Failed to place file";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Else
|
|
||||||
{
|
|
||||||
New-Item -Force $dest -Type file;
|
|
||||||
Copy-Item -Path $src -Destination $dest;
|
|
||||||
$result.changed = $TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
$dest_checksum = Get-FileChecksum($dest);
|
|
||||||
$result.checksum = $dest_checksum;
|
|
||||||
|
|
||||||
Exit-Json $result;
|
|
|
@ -1,60 +0,0 @@
|
||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# (c) 2012, Michael DeHaan <michael.dehaan@gmail.com>
|
|
||||||
#
|
|
||||||
# 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 <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
import os
|
|
||||||
import time
|
|
||||||
|
|
||||||
DOCUMENTATION = '''
|
|
||||||
---
|
|
||||||
module: win_copy
|
|
||||||
version_added: "1.8"
|
|
||||||
short_description: Copies files to remote locations on windows hosts.
|
|
||||||
description:
|
|
||||||
- The M(win_copy) module copies a file on the local box to remote windows locations.
|
|
||||||
options:
|
|
||||||
src:
|
|
||||||
description:
|
|
||||||
- Local path to a file to copy to the remote server; can be absolute or relative.
|
|
||||||
If path is a directory, it is copied recursively. In this case, if path ends
|
|
||||||
with "/", only inside contents of that directory are copied to destination.
|
|
||||||
Otherwise, if it does not end with "/", the directory itself with all contents
|
|
||||||
is copied. This behavior is similar to Rsync.
|
|
||||||
required: false
|
|
||||||
default: null
|
|
||||||
aliases: []
|
|
||||||
dest:
|
|
||||||
description:
|
|
||||||
- Remote absolute path where the file should be copied to. If src is a directory,
|
|
||||||
this must be a directory too. Use \\ for path separators.
|
|
||||||
required: true
|
|
||||||
default: null
|
|
||||||
author: Michael DeHaan
|
|
||||||
notes:
|
|
||||||
- The "win_copy" module recursively copy facility does not scale to lots (>hundreds) of files.
|
|
||||||
Instead, you may find it better to create files locally, perhaps using win_template, and
|
|
||||||
then use win_get_url to put them in the correct location.
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = '''
|
|
||||||
# Example from Ansible Playbooks
|
|
||||||
- win_copy: src=/srv/myfiles/foo.conf dest=c:\\TEMP\\foo.conf
|
|
||||||
|
|
||||||
'''
|
|
||||||
|
|
|
@ -1,105 +0,0 @@
|
||||||
#!powershell
|
|
||||||
# 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 <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# WANT_JSON
|
|
||||||
# POWERSHELL_COMMON
|
|
||||||
|
|
||||||
$params = Parse-Args $args;
|
|
||||||
|
|
||||||
# path
|
|
||||||
$path = Get-Attr $params "path" $FALSE;
|
|
||||||
If ($path -eq $FALSE)
|
|
||||||
{
|
|
||||||
$path = Get-Attr $params "dest" $FALSE;
|
|
||||||
If ($path -eq $FALSE)
|
|
||||||
{
|
|
||||||
$path = Get-Attr $params "name" $FALSE;
|
|
||||||
If ($path -eq $FALSE)
|
|
||||||
{
|
|
||||||
Fail-Json (New-Object psobject) "missing required argument: path";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# JH Following advice from Chris Church, only allow the following states
|
|
||||||
# in the windows version for now:
|
|
||||||
# state - file, directory, touch, absent
|
|
||||||
# (originally was: state - file, link, directory, hard, touch, absent)
|
|
||||||
|
|
||||||
$state = Get-Attr $params "state" "file";
|
|
||||||
|
|
||||||
#$recurse = Get-Attr $params "recurse" "no";
|
|
||||||
|
|
||||||
# force - yes, no
|
|
||||||
# $force = Get-Attr $params "force" "no";
|
|
||||||
|
|
||||||
# result
|
|
||||||
$result = New-Object psobject @{
|
|
||||||
changed = $FALSE
|
|
||||||
};
|
|
||||||
|
|
||||||
If ( $state -eq "touch" )
|
|
||||||
{
|
|
||||||
If(Test-Path $path)
|
|
||||||
{
|
|
||||||
(Get-ChildItem $path).LastWriteTime = Get-Date
|
|
||||||
}
|
|
||||||
Else
|
|
||||||
{
|
|
||||||
echo $null > $file
|
|
||||||
}
|
|
||||||
$result.changed = $TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
If (Test-Path $path)
|
|
||||||
{
|
|
||||||
$fileinfo = Get-Item $path;
|
|
||||||
If ( $state -eq "absent" )
|
|
||||||
{
|
|
||||||
Remove-Item -Recurse -Force $fileinfo;
|
|
||||||
$result.changed = $TRUE;
|
|
||||||
}
|
|
||||||
Else
|
|
||||||
{
|
|
||||||
# Only files have the .Directory attribute.
|
|
||||||
If ( $state -eq "directory" -and $fileinfo.Directory )
|
|
||||||
{
|
|
||||||
Fail-Json (New-Object psobject) "path is not a directory";
|
|
||||||
}
|
|
||||||
|
|
||||||
# Only files have the .Directory attribute.
|
|
||||||
If ( $state -eq "file" -and -not $fileinfo.Directory )
|
|
||||||
{
|
|
||||||
Fail-Json (New-Object psobject) "path is not a file";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Else
|
|
||||||
{
|
|
||||||
If ( $state -eq "directory" )
|
|
||||||
{
|
|
||||||
New-Item -ItemType directory -Path $path
|
|
||||||
$result.changed = $TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
If ( $state -eq "file" )
|
|
||||||
{
|
|
||||||
Fail-Json (New-Object psobject) "path will not be created";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Exit-Json $result;
|
|
|
@ -1,73 +0,0 @@
|
||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# (c) 2012, Michael DeHaan <michael.dehaan@gmail.com>
|
|
||||||
#
|
|
||||||
# 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 <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
|
|
||||||
DOCUMENTATION = '''
|
|
||||||
---
|
|
||||||
module: win_file
|
|
||||||
version_added: "1.8"
|
|
||||||
short_description: Creates, touches or removes files or directories.
|
|
||||||
extends_documentation_fragment: files
|
|
||||||
description:
|
|
||||||
- Creates (empty) files, updates file modification stamps of existing files,
|
|
||||||
and can create or remove directories.
|
|
||||||
Unlike M(file), does not modify ownership, permissions or manipulate links.
|
|
||||||
notes:
|
|
||||||
- See also M(win_copy), M(win_template), M(copy), M(template), M(assemble)
|
|
||||||
requirements: [ ]
|
|
||||||
author: Michael DeHaan
|
|
||||||
options:
|
|
||||||
path:
|
|
||||||
description:
|
|
||||||
- 'path to the file being managed. Aliases: I(dest), I(name)'
|
|
||||||
required: true
|
|
||||||
default: []
|
|
||||||
aliases: ['dest', 'name']
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(directory), all immediate subdirectories will be created if they
|
|
||||||
do not exist.
|
|
||||||
If C(file), the file will NOT be created if it does not exist, see the M(copy)
|
|
||||||
or M(template) module if you want that behavior. If C(absent),
|
|
||||||
directories will be recursively deleted, and files will be removed.
|
|
||||||
If C(touch), an empty file will be created if the c(path) does not
|
|
||||||
exist, while an existing file or directory will receive updated file access and
|
|
||||||
modification times (similar to the way `touch` works from the command line).
|
|
||||||
required: false
|
|
||||||
default: file
|
|
||||||
choices: [ file, directory, touch, absent ]
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = '''
|
|
||||||
# create a file
|
|
||||||
- win_file: path=C:\\temp\\foo.conf
|
|
||||||
|
|
||||||
# touch a file (creates if not present, updates modification time if present)
|
|
||||||
- win_file: path=C:\\temp\\foo.conf state=touch
|
|
||||||
|
|
||||||
# remove a file, if present
|
|
||||||
- win_file: path=C:\\temp\\foo.conf state=absent
|
|
||||||
|
|
||||||
# create directory structure
|
|
||||||
- win_file: path=C:\\temp\\folder\\subfolder state=directory
|
|
||||||
|
|
||||||
# remove directory structure
|
|
||||||
- win_file: path=C:\\temp state=absent
|
|
||||||
'''
|
|
|
@ -53,9 +53,11 @@ Else
|
||||||
|
|
||||||
If ($get_md5 -and $result.stat.exists -and -not $result.stat.isdir)
|
If ($get_md5 -and $result.stat.exists -and -not $result.stat.isdir)
|
||||||
{
|
{
|
||||||
$hash = Get-FileChecksum($path);
|
$sp = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider;
|
||||||
|
$fp = [System.IO.File]::Open($path, [System.IO.Filemode]::Open, [System.IO.FileAccess]::Read);
|
||||||
|
$hash = [System.BitConverter]::ToString($sp.ComputeHash($fp)).Replace("-", "").ToLower();
|
||||||
|
$fp.Dispose();
|
||||||
Set-Attr $result.stat "md5" $hash;
|
Set-Attr $result.stat "md5" $hash;
|
||||||
Set-Attr $result.stat "checksum" $hash;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Exit-Json $result;
|
Exit-Json $result;
|
||||||
|
|
|
@ -1,52 +0,0 @@
|
||||||
# this is a virtual module that is entirely implemented server side
|
|
||||||
|
|
||||||
DOCUMENTATION = '''
|
|
||||||
---
|
|
||||||
module: win_template
|
|
||||||
version_added: 1.8
|
|
||||||
short_description: Templates a file out to a remote server.
|
|
||||||
description:
|
|
||||||
- Templates are processed by the Jinja2 templating language
|
|
||||||
(U(http://jinja.pocoo.org/docs/)) - documentation on the template
|
|
||||||
formatting can be found in the Template Designer Documentation
|
|
||||||
(U(http://jinja.pocoo.org/docs/templates/)).
|
|
||||||
- "Six additional variables can be used in templates: C(ansible_managed)
|
|
||||||
(configurable via the C(defaults) section of C(ansible.cfg)) contains a string
|
|
||||||
which can be used to describe the template name, host, modification time of the
|
|
||||||
template file and the owner uid, C(template_host) contains the node name of
|
|
||||||
the template's machine, C(template_uid) the owner, C(template_path) the
|
|
||||||
absolute path of the template, C(template_fullpath) is the absolute path of the
|
|
||||||
template, and C(template_run_date) is the date that the template was rendered. Note that including
|
|
||||||
a string that uses a date in the template will result in the template being marked 'changed'
|
|
||||||
each time."
|
|
||||||
options:
|
|
||||||
src:
|
|
||||||
description:
|
|
||||||
- Path of a Jinja2 formatted template on the local server. This can be a relative or absolute path.
|
|
||||||
required: true
|
|
||||||
default: null
|
|
||||||
aliases: []
|
|
||||||
dest:
|
|
||||||
description:
|
|
||||||
- Location to render the template to on the remote machine.
|
|
||||||
required: true
|
|
||||||
default: null
|
|
||||||
backup:
|
|
||||||
description:
|
|
||||||
- Create a backup file including the timestamp information so you can get
|
|
||||||
the original file back if you somehow clobbered it incorrectly.
|
|
||||||
required: false
|
|
||||||
choices: [ "yes", "no" ]
|
|
||||||
default: "no"
|
|
||||||
notes:
|
|
||||||
- "templates are loaded with C(trim_blocks=True)."
|
|
||||||
requirements: []
|
|
||||||
author: Michael DeHaan
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = '''
|
|
||||||
# Example
|
|
||||||
- win_template: src=/mytemplates/foo.j2 dest=C:\\temp\\file.conf
|
|
||||||
|
|
||||||
|
|
||||||
'''
|
|
Loading…
Reference in a new issue