@ -1,40 +1,26 @@
#!powershell
#!powershell
# This file is part of Ansible
#
#
# Copyright 2015, Corwin Brown <corwin.brown@maxpoint.com>
# Copyright 2015, Corwin Brown <corwin.brown@maxpoint.com>
#
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
# 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
# WANT_JSON
# POWERSHELL_COMMON
# POWERSHELL_COMMON
$params = Parse-Args $args -supports_check_mode $true
$params = Parse-Args $args -supports_check_mode $true
$check_mode = Get-AnsibleParam -obj $params -name " _ansible_check_mode " -type " bool " -default $false
$check_mode = Get-AnsibleParam -obj $params -name " _ansible_check_mode " -type " bool " -default $false
$src = Get-AnsibleParam -obj $params -name " src " -type " path " -failifempty $true
$src = Get-AnsibleParam -obj $params -name " src " -type " path " -failifempty $true
$dest = Get-AnsibleParam -obj $params -name " dest " -type " path " -failifempty $true
$dest = Get-AnsibleParam -obj $params -name " dest " -type " path " -failifempty $true
$purge = Get-AnsibleParam -obj $params -name " purge " -type " bool " -default $false
$purge = Get-AnsibleParam -obj $params -name " purge " -type " bool " -default $false
$recurse = Get-AnsibleParam -obj $params -name " recurse " -type " bool " -default $false
$recurse = Get-AnsibleParam -obj $params -name " recurse " -type " bool " -default $false
$flags = Get-AnsibleParam -obj $params -name " flags " -type " string " -default $null
$flags = Get-AnsibleParam -obj $params -name " flags " -type " string "
$result = @ {
$result = @ {
src = $src
changed = $false
dest = $dest
dest = $dest
recurse = $recurse
purge = $purge
purge = $purge
changed = $false
recurse = $recurse
src = $src
}
}
# Search for an Error Message
# Search for an Error Message
@ -43,7 +29,7 @@ Function SearchForError($cmd_output, $default_msg) {
$separator_count = 0
$separator_count = 0
$error_msg = $default_msg
$error_msg = $default_msg
ForEach ( $line in $cmd_output ) {
ForEach ( $line in $cmd_output ) {
if ( - N ot $line ) {
if ( - n ot $line ) {
continue
continue
}
}
@ -51,9 +37,8 @@ Function SearchForError($cmd_output, $default_msg) {
if ( Select-String -InputObject $line -pattern " ^(\s+)?(\-+)(\s+)? $ " ) {
if ( Select-String -InputObject $line -pattern " ^(\s+)?(\-+)(\s+)? $ " ) {
$separator_count + = 1
$separator_count + = 1
}
}
}
} else {
Else {
if ( Select-String -InputObject $line -pattern " error " ) {
If ( Select-String -InputObject $line -pattern " error " ) {
$error_msg = $line
$error_msg = $line
break
break
}
}
@ -63,15 +48,16 @@ Function SearchForError($cmd_output, $default_msg) {
return $error_msg
return $error_msg
}
}
# Build Arguments
if ( -not ( Test-Path -Path $src ) ) {
$robocopy_opts = @ ( )
if ( -Not ( Test-Path $src ) ) {
Fail-Json $result " $src does not exist! "
Fail-Json $result " $src does not exist! "
}
}
$robocopy_opts + = $src
# Build Arguments
$robocopy_opts + = $dest
$robocopy_opts = @ ( $src , $dest )
if ( $check_mode ) {
$robocopy_opts + = " /l "
}
if ( $flags -eq $null ) {
if ( $flags -eq $null ) {
if ( $purge ) {
if ( $purge ) {
@ -81,85 +67,80 @@ if ($flags -eq $null) {
if ( $recurse ) {
if ( $recurse ) {
$robocopy_opts + = " /e "
$robocopy_opts + = " /e "
}
}
}
} else {
Else {
ForEach ( $f in $flags . split ( " " ) ) {
ForEach ( $f in $flags . split ( " " ) ) {
$robocopy_opts + = $f
$robocopy_opts + = $f
}
}
}
}
$result . flags = $flags
$result . flags = $flags
$result . cmd = " $robocopy $robocopy_opts "
$robocopy_output = " "
Try {
$rc = 0
$robocopy_output = & robocopy $robocopy_opts
If ( $check_mode -eq $true ) {
$rc = $LASTEXITCODE
$robocopy_output = " Would have copied the contents of $src to $dest "
} Catch {
$rc = 0
Fail-Json $result " Error synchronizing $src to $dest ! Msg: $( $_ . Exception . Message ) "
}
Else {
Try {
& robocopy $robocopy_opts | Tee-Object -Variable robocopy_output | Out-Null
$rc = $LASTEXITCODE
}
Catch {
$ErrorMessage = $_ . Exception . Message
Fail-Json $result " Error synchronizing $src to $dest ! Msg: $ErrorMessage "
}
}
}
$result . return_code = $rc
$result . msg = " Success "
$result . output = $robocopy_output
$result . output = $robocopy_output
$result . return_code = $rc # Backward compatibility
$result . rc = $rc
switch ( $rc ) {
$cmd_msg = " Success "
$changed = $false
switch ( $rc )
{
0 {
0 {
$ cmd_ msg = " No files copied. "
$result . msg = " No files copied. "
}
}
1 {
1 {
$cmd_msg = " Files copied successfully! "
$result . msg = " Files copied successfully! "
$changed = $true
$result . changed = $true
$result . failed = $false
}
}
2 {
2 {
$cmd_msg = " Some Extra files or directories were detected. No files were copied. "
$result . msg = " Some Extra files or directories were detected. No files were copied. "
$changed = $true
Add-Warning $result $result . msg
$result . failed = $false
}
}
3 {
3 {
$cmd_msg = " (2+1) Some files were copied. Additional files were present. "
$result . msg = " (2+1) Some files were copied. Additional files were present. "
$changed = $true
Add-Warning $result $result . msg
$result . changed = $true
$result . failed = $false
}
}
4 {
4 {
$cmd_msg = " Some mismatched files or directories were detected. Housekeeping might be required! "
$result . msg = " Some mismatched files or directories were detected. Housekeeping might be required! "
$changed = $true
Add-Warning $result $result . msg
$result . changed = $true
$result . failed = $false
}
}
5 {
5 {
$cmd_msg = " (4+1) Some files were copied. Some files were mismatched. "
$result . msg = " (4+1) Some files were copied. Some files were mismatched. "
$changed = $true
Add-Warning $result $result . msg
$result . changed = $true
$result . failed = $false
}
}
6 {
6 {
$ cmd_ msg = " (4+2) Additional files and mismatched files exist. No files were copied. "
$ result. msg = " (4+2) Additional files and mismatched files exist. No files were copied. "
$ changed = $tru e
$ result. failed = $fals e
}
}
7 {
7 {
$cmd_msg = " (4+1+2) Files were copied, a file mismatch was present, and additional files were present. "
$result . msg = " (4+1+2) Files were copied, a file mismatch was present, and additional files were present. "
$changed = $true
Add-Warning $result $result . msg
$result . changed = $true
$result . failed = $false
}
}
8 {
8 {
$error_msg = SearchForError $robocopy_output " Some files or directories could not be copied! "
Fail-Json $result ( SearchForError $robocopy_output " Some files or directories could not be copied! " )
Fail-Json $result $error_msg
}
}
{ @ ( 9 , 10 , 11 , 12 , 13 , 14 , 15 ) -contains $_ } {
{ @ ( 9 , 10 , 11 , 12 , 13 , 14 , 15 ) -contains $_ } {
$error_msg = SearchForError $robocopy_output " Fatal error. Check log message! "
Fail-Json $result ( SearchForError $robocopy_output " Fatal error. Check log message! " )
Fail-Json $result $error_msg
}
}
16 {
16 {
$error_msg = SearchForError $robocopy_output " Serious Error! No files were copied! Do you have permissions to access $src and $dest ? "
Fail-Json $result ( SearchForError $robocopy_output " Serious Error! No files were copied! Do you have permissions to access $src and $dest ? " )
Fail-Json $result $error_msg
}
}
}
$result . msg = $cmd_msg
}
$result . changed = $changed
Exit-Json $result
Exit-Json $result