1 #!powershell
2 
3 # Copyright: (c) 2017, Dag Wieers (@dagwieers) <dag@wieers.com>
4 # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
5 
6 #AnsibleRequires -CSharpUtil Ansible.Basic
7 #Requires -Module Ansible.ModuleUtils.ArgvParser
8 #Requires -Module Ansible.ModuleUtils.CommandUtil
9 
10 $spec = @{
11     options = @{
12         include_volumes = @{ type='list'; elements='str' }
13         exclude_volumes = @{ type='list'; elements='str' }
14         freespace_consolidation = @{ type='bool'; default=$false }
15         priority = @{ type='str'; default='low'; choices=@( 'low', 'normal') }
16         parallel = @{ type='bool'; default=$false }
17     }
18     supports_check_mode = $true
19 }
20 
21 $module = [Ansible.Basic.AnsibleModule]::Create($args, $spec)
22 
23 $include_volumes = $module.Params.include_volumes
24 $exclude_volumes = $module.Params.exclude_volumes
25 $freespace_consolidation = $module.Params.freespace_consolidation
26 $priority = $module.Params.priority
27 $parallel = $module.Params.parallel
28 
29 $module.Result.changed = $false
30 
31 $executable = "defrag.exe"
32 
33 if (-not (Get-Command -Name $executable -ErrorAction SilentlyContinue)) {
34     $module.FailJson("Command '$executable' not found in $env:PATH.")
35 }
36 
37 $arguments = @()
38 
39 if ($include_volumes) {
40     foreach ($volume in $include_volumes) {
41         if ($volume.Length -eq 1) {
42             $arguments += "$($volume):"
43         } else {
44             $arguments += $volume
45         }
46     }
47 } else {
48     $arguments += "/C"
49 }
50 
51 if ($exclude_volumes) {
52     $arguments += "/E"
53     foreach ($volume in $exclude_volumes) {
54         if ($volume.Length -eq 1) {
55             $arguments += "$($volume):"
56         } else {
57             $arguments += $volume
58         }
59     }
60 }
61 
62 if ($module.CheckMode) {
63     $arguments += "/A"
64 } elseif ($freespace_consolidation) {
65     $arguments += "/X"
66 }
67 
68 if ($priority -eq "normal") {
69     $arguments += "/H"
70 }
71 
72 if ($parallel) {
73     $arguments += "/M"
74 }
75 
76 $arguments += "/V"
77 
78 $argument_string = Argv-ToString -arguments $arguments
79 
80 $start_datetime = [DateTime]::UtcNow
81 $module.Result.cmd = "$executable $argument_string"
82 
83 $command_result = Run-Command -command "$executable $argument_string"
84 
85 $end_datetime = [DateTime]::UtcNow
86 
87 $module.Result.stdout = $command_result.stdout
88 $module.Result.stderr = $command_result.stderr
89 $module.Result.rc = $command_result.rc
90 
91 $module.Result.start = $start_datetime.ToString("yyyy-MM-dd hh:mm:ss.ffffff")
92 $module.Result.end = $end_datetime.ToString("yyyy-MM-dd hh:mm:ss.ffffff")
93 $module.Result.delta = $($end_datetime - $start_datetime).ToString("h\:mm\:ss\.ffffff")
94 
95 $module.Result.changed = $true
96 
97 $module.ExitJson()
98