mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
9d932b64f0
* Add new windows module win_psmodule * Add checkmode, allow_clobber parameter, integration tests * Add aliases, replace win_raw with win_shell * restore original test_win_group1.yml, add powershel version test * fix var type * add conditional on assert * integration tests conditional tasks review * documentation fix, test fix, adds result.change * fix yml * fix railing whitespace * add nuget_changed and repository_changed in result
186 lines
5.7 KiB
PowerShell
186 lines
5.7 KiB
PowerShell
#!powershell
|
|
# This file is part of Ansible
|
|
#
|
|
# Copyright 2017, Daniele Lazzari <lazzari@mailup.com>
|
|
#
|
|
# 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
|
|
|
|
# win_psmodule (Powershell modules Additions/Removal)
|
|
|
|
$params = Parse-Args $args -supports_check_mode $true
|
|
|
|
$name = Get-AnsibleParam -obj $params "name" -type "str" -failifempty $true
|
|
$repo = Get-AnsibleParam -obj $params "repository" -type "str"
|
|
$url = Get-AnsibleParam -obj $params "url" -type "str"
|
|
$state = Get-AnsibleParam -obj $params "state" -type "str" -default "present" -validateset "present", "absent"
|
|
$allow_clobber = Get-AnsibleParam -obj $params "allow_clobber" -type "bool" -default $false
|
|
$check_mode = Get-AnsibleParam -obj $params -name "_ansible_check_mode" -default $false
|
|
|
|
$result = @{"changed" = $false
|
|
"output" = ""
|
|
"nuget_changed" = $false
|
|
"repository_changed" = $false}
|
|
|
|
Function Install-NugetProvider {
|
|
param(
|
|
[bool]$CheckMode
|
|
)
|
|
$PackageProvider = Get-PackageProvider -ListAvailable|?{($_.name -eq 'Nuget') -and ($_.version -ge "2.8.5.201")}
|
|
if (!($PackageProvider)){
|
|
try{
|
|
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force -ErrorAction Stop -WhatIf:$CheckMode | out-null
|
|
$result.changed = $true
|
|
$result.nuget_changed = $true
|
|
}
|
|
catch{
|
|
$ErrorMessage = "Problems adding package provider: $($_.Exception.Message)"
|
|
Fail-Json $result $ErrorMessage
|
|
}
|
|
}
|
|
}
|
|
|
|
Function Install-Repository {
|
|
Param(
|
|
[Parameter(Mandatory=$true)]
|
|
[string]$Name,
|
|
[Parameter(Mandatory=$true)]
|
|
[string]$Url,
|
|
[bool]$CheckMode
|
|
)
|
|
$Repo = (Get-PSRepository).SourceLocation
|
|
|
|
# If repository isn't already present, try to register it as trusted.
|
|
if ($Repo -notcontains $Url){
|
|
try {
|
|
if (!($CheckMode)) {
|
|
Register-PSRepository -Name $Name -SourceLocation $Url -InstallationPolicy Trusted -ErrorAction Stop
|
|
}
|
|
$result.changed = $true
|
|
$result.repository_changed = $true
|
|
}
|
|
catch {
|
|
$ErrorMessage = "Problems adding $($Name) repository: $($_.Exception.Message)"
|
|
Fail-Json $result $ErrorMessage
|
|
}
|
|
}
|
|
}
|
|
|
|
Function Remove-Repository{
|
|
Param(
|
|
[Parameter(Mandatory=$true)]
|
|
[string]$Name,
|
|
[bool]$CheckMode
|
|
)
|
|
|
|
$Repo = (Get-PSRepository).SourceLocation
|
|
|
|
# Try to remove the repository
|
|
if ($Repo -contains $Name){
|
|
try {
|
|
if (!($CheckMode)) {
|
|
Unregister-PSRepository -Name $Name -ErrorAction Stop
|
|
}
|
|
$result.changed = $true
|
|
$result.repository_changed = $true
|
|
}
|
|
catch {
|
|
$ErrorMessage = "Problems removing $($Name)repository: $($_.Exception.Message)"
|
|
Fail-Json $result $ErrorMessage
|
|
}
|
|
}
|
|
}
|
|
|
|
Function Install-PsModule {
|
|
param(
|
|
[Parameter(Mandatory=$true)]
|
|
[string]$Name,
|
|
[bool]$AllowClobber,
|
|
[bool]$CheckMode
|
|
)
|
|
if (Get-Module -Listavailable|?{$_.name -eq $Name}){
|
|
$result.output = "Module $($Name) already present"
|
|
}
|
|
else {
|
|
try{
|
|
# Install NuGet Provider if needed
|
|
Install-NugetProvider -CheckMode $CheckMode
|
|
|
|
# Check Powershell Version (-AllowClobber was introduced in early version only)
|
|
if ($PsVersion.Minor -ge 1){
|
|
Install-Module -Name $Name -Force -ErrorAction Stop -Whatif:$CheckMode -AllowClobber:$AllowClobber | out-null
|
|
}
|
|
else {
|
|
Install-Module -Name $Name -Force -ErrorAction Stop -Whatif:$CheckMode | out-null
|
|
}
|
|
$result.output = "Module $($Name) installed"
|
|
$result.changed = $true
|
|
}
|
|
catch{
|
|
$ErrorMessage = "Problems installing $($Name) module: $($_.Exception.Message)"
|
|
Fail-Json $result $ErrorMessage
|
|
}
|
|
}
|
|
}
|
|
|
|
Function Remove-PsModule {
|
|
param(
|
|
[Parameter(Mandatory=$true)]
|
|
[string]$Name,
|
|
[bool]$CheckMode
|
|
)
|
|
# If module is present, unistalls it.
|
|
if (Get-Module -Listavailable|?{$_.name -eq $Name}){
|
|
try{
|
|
Uninstall-Module -Name $Name -Confirm:$false -Force -ErrorAction Stop -WhatIf:$CheckMode | out-null
|
|
$result.output = "Module $($Name) removed"
|
|
$result.changed = $true
|
|
}
|
|
catch{
|
|
$ErrorMessage = "Problems removing $($Name) module: $($_.Exception.Message)"
|
|
Fail-Json $result $ErrorMessage
|
|
}
|
|
|
|
}
|
|
else{
|
|
$result.output = "Module $($Name) not present"
|
|
}
|
|
}
|
|
|
|
# Check powershell version, fail if < 5.0
|
|
$PsVersion = $PSVersionTable.PSVersion
|
|
if ($PsVersion.Major -lt 5){
|
|
$ErrorMessage = "Powershell 5.0 or higher is needed"
|
|
Fail-Json $result $ErrorMessage
|
|
}
|
|
|
|
if ($state -eq "present") {
|
|
if (($repo) -and ($url)) {
|
|
Install-Repository -Name $repo -Url $url -CheckMode $check_mode
|
|
}
|
|
else {
|
|
$ErrorMessage = "Repository Name and Url are mandatory if you want to add a new repository"
|
|
}
|
|
Install-PsModule -Name $Name -CheckMode $check_mode -AllowClobber $allow_clobber
|
|
}
|
|
else {
|
|
if ($repo) {
|
|
Remove-Repository -Name $repo -CheckMode $check_mode
|
|
}
|
|
Remove-PsModule -Name $Name -CheckMode $check_mode
|
|
}
|
|
|
|
Exit-Json $result
|