From 28164d2ae41b396ed85d736e9c9ab55a4f088e79 Mon Sep 17 00:00:00 2001 From: Michael Perzel Date: Tue, 30 Jun 2015 12:06:16 -0500 Subject: [PATCH] Ability to add/remove scheduled task --- .../extras/windows/win_scheduled_task.ps1 | 139 +++++++++++++++--- .../extras/windows/win_scheduled_task.py | 38 ++++- 2 files changed, 146 insertions(+), 31 deletions(-) diff --git a/lib/ansible/modules/extras/windows/win_scheduled_task.ps1 b/lib/ansible/modules/extras/windows/win_scheduled_task.ps1 index 2f802f59cd0..07b1c3adf60 100644 --- a/lib/ansible/modules/extras/windows/win_scheduled_task.ps1 +++ b/lib/ansible/modules/extras/windows/win_scheduled_task.ps1 @@ -33,42 +33,135 @@ else { Fail-Json $result "missing required argument: name" } +if ($params.state) +{ + $state = $params.state +} +else +{ + Fail-Json $result "missing required argument: state" +} if ($params.enabled) { $enabled = $params.enabled | ConvertTo-Bool } else { - $enabled = $true + $enabled = $true #default } -$target_state = @{$true = "Enabled"; $false="Disabled"}[$enabled] +if ($params.description) +{ + $description = $params.description +} +else +{ + $description = " " #default +} +if ($params.execute) +{ + $execute = $params.execute +} +elseif ($state -eq "present") +{ + Fail-Json $result "missing required argument: execute" +} +if ($params.path) +{ + $path = "\{0}\" -f $params.path +} +else +{ + $path = "\" #default +} +if ($params.frequency) +{ + $frequency = $params.frequency +} +elseif($state -eq "present") +{ + Fail-Json $result "missing required argument: frequency" +} +if ($params.time) +{ + $time = $params.time +} +elseif($state -eq "present") +{ + Fail-Json $result "missing required argument: time" +} + +$exists = $true +#hack to determine if task exists +try { + $task = Get-ScheduledTask -TaskName $name -TaskPath $path +} +catch { + $exists = $false | ConvertTo-Bool +} +Set-Attr $result "exists" "$exists" + try { - $tasks = Get-ScheduledTask -TaskPath $name - $tasks_needing_changing = $tasks |? { $_.State -ne $target_state } - if (-not($tasks_needing_changing -eq $null)) - { - if ($enabled) - { - $tasks_needing_changing | Enable-ScheduledTask + if ($frequency){ + if ($frequency -eq "daily") { + $trigger = New-ScheduledTaskTrigger -Daily -At $time + } + elseif (frequency -eq "weekly"){ + $trigger = New-ScheduledTaskTrigger -Weekly -At $time + } + else { + Fail-Json $result "frequency must be daily or weekly" + } } - else - { - $tasks_needing_changing | Disable-ScheduledTask - } - Set-Attr $result "tasks_changed" ($tasks_needing_changing | foreach { $_.TaskPath + $_.TaskName }) - $result.changed = $true - } - else - { - Set-Attr $result "tasks_changed" @() - $result.changed = $false - } - Exit-Json $result; + if ($state -eq "absent" -and $exists -eq $true) { + Unregister-ScheduledTask -TaskName $name -Confirm:$false + $result.changed = $true + Set-Attr $result "msg" "Deleted task $name" + Exit-Json $result + } + elseif ($state -eq "absent" -and $exists -eq $false) { + Set-Attr $result "msg" "Task $name does not exist" + Exit-Json $result + } + + if ($state -eq "present" -and $exists -eq $false){ + $action = New-ScheduledTaskAction -Execute $execute + Register-ScheduledTask -Action $action -Trigger $trigger -TaskName $name -Description $description -TaskPath $path + $task = Get-ScheduledTask -TaskName $name + Set-Attr $result "msg" "Added new task $name" + $result.changed = $true + } + elseif($state -eq "present" -and $exists -eq $true) { + if ($task.Description -eq $description -and $task.TaskName -eq $name -and $task.TaskPath -eq $path -and $task.Actions.Execute -eq $execute) { + #No change in the task yet + Set-Attr $result "msg" "No change in task $name" + } + else { + Unregister-ScheduledTask -TaskName $name -Confirm:$false + $action = New-ScheduledTaskAction -Execute $execute + Register-ScheduledTask -Action $action -Trigger $trigger -TaskName $name -Description $description -TaskPath $path + $task = Get-ScheduledTask -TaskName $name + Set-Attr $result "msg" "Updated task $name" + $result.changed = $true + } + } + + if ($state -eq "present" -and $enabled -eq $true -and $task.State -ne "Ready" ){ + $task | Enable-ScheduledTask + Set-Attr $result "msg" "Enabled task $name" + $result.changed = $true + } + elseif ($state -eq "present" -and $enabled -eq $false -and $task.State -ne "Disabled"){ + $task | Disable-ScheduledTask + Set-Attr $result "msg" "Disabled task $name" + $result.changed = $true + } + + Exit-Json $result; } catch { Fail-Json $result $_.Exception.Message -} +} \ No newline at end of file diff --git a/lib/ansible/modules/extras/windows/win_scheduled_task.py b/lib/ansible/modules/extras/windows/win_scheduled_task.py index 2c5867402c5..4ab830d05e1 100644 --- a/lib/ansible/modules/extras/windows/win_scheduled_task.py +++ b/lib/ansible/modules/extras/windows/win_scheduled_task.py @@ -1,8 +1,5 @@ #!/usr/bin/python # -*- coding: utf-8 -*- - -# (c) 2015, Peter Mounce -# # This file is part of Ansible # # Ansible is free software: you can redistribute it and/or modify @@ -32,20 +29,45 @@ options: name: description: - Name of the scheduled task - - Supports * as wildcard required: true enabled: description: - - State that the task should become + - Enable/disable the task required: false choices: - yes - no default: yes -author: Peter Mounce + state: + description: + - State that the task should become + required: false + choices: + - present + - absent + execute: + description: + - Command the scheduled task should execute + required: false + frequency: + description: + - The frequency of the command + choices: + - daily + - weekly + required: false + time: + description: + - Time to execute scheduled task + required: false + path: + description: + - Folder path of scheduled task + default: '\' + required: false ''' EXAMPLES = ''' - # Disable the scheduled tasks with "WindowsUpdate" in their name - win_scheduled_task: name="*WindowsUpdate*" enabled=no + # Create a scheduled task to open a command prompt + win_scheduled_task: name="TaskName" execute="cmd" frequency="daily" time="9am" description="open command prompt" path="example" enable=yes state=present '''