local/library/win_winget.ps1

100 lines
2.9 KiB
PowerShell

#!powershell
#AnsibleRequires -CSharpUtil Ansible.Basic
#AnsibleRequires -PowerShell Ansible.ModuleUtils.CommandUtil
$module = [Ansible.Basic.AnsibleModule]::Create($args, @{
options = @{
name = @{
type = "list"
elements = "str"
required = $true
}
state = @{
type = "str"
default = "present"
choices = ("absent", "latest", "present")
}
}
supports_check_mode = $false
})
$names = $module.Params.name
$state = $module.Params.state
$winget = Get-ExecutablePath "winget"
$noPackageString = "No installed package found matching input criteria."
if ($name -and $id) {
$module.FailJson("name `"$name`" and id `"$id`" must not both be provided")
}
function Test-Installed {
$command = "`"$winget`" list `"$name`""
$result = Run-Command -command $command
if ($result.rc -eq 0) {
return $true
}
return $false
}
function Test-UpgradeAvailable {
if (!(Test-Installed)) {
return $true
}
$command = "`"$winget`" list --upgrade-available `"$name`""
$result = Run-Command -command $command
if ($result.stdout.Contains($noPackageString)) {
return $false
}
return $true
}
foreach ($name in $names) {
switch ($state) {
"absent" {
if (Test-Installed) {
$command = "`"$winget`" uninstall `"$name`""
$result = Run-Command -command $command
if ($result.rc -ne 0) {
$module.Result.rc = $result.rc
$module.Result.stdout = $result.stdout
$module.FailJson("Failed to uninstall package `"$name`"")
}
$module.Result.stdout = $result.stdout
$module.Result.changed = $true
}
}
"latest" {
if (Test-UpgradeAvailable) {
$command = "`"$winget`" install `"$name`""
$result = Run-Command -command $command
if ($result.rc -ne 0) {
$module.Result.rc = $result.rc
$module.Result.stdout = $result.stdout
$module.FailJson("Failed to install package `"$name`"")
}
$module.Result.stdout = $result.stdout
$module.Result.changed = $true
}
}
"present" {
if (!(Test-Installed)) {
$command = "`"$winget`" install `"$name`""
$result = Run-Command -command $command
if ($result.rc -ne 0) {
$module.Result.rc = $result.rc
$module.Result.stdout = $result.stdout
$module.FailJson("Failed to install package `"$name`"")
}
$module.Result.stdout = $result.stdout
$module.Result.changed = $true
}
}
}
}
$module.Result.rc = 0
$module.ExitJson()