Kiln » KilnSupportScripts Powershell Scripts to help monitor a Kiln environment. Contact Fog Creek support before using. Read More
Clone URL:  
reenqueue_2.9_tasks.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# TODO: # - Add switch "reenqueueFailures" to do that (mutually exclusive with "destoryFailures") # - Add switch "reenqueueRunning" to do that # - Display usage informaiton when run with no parameters # This script will reenqueue all failed and all currently running tasks in a Kiln Queue # # Name: Reenqueue all Tasks # Author: Quentin Schroeder # Version: 1.0.0 # Description: This script is similar to our old "churn the queue" script that we had for versions of Kiln prior to # 2.9.x. It simply hits the URLs that are provided via the Queue Stats page to reenqueue all failed tasks # as well as all currently running tasks (since they can get stuck running sometimes). It should be used # when the page at http://localhost:56785/ indicates that the queue is choking. # Requirements: This script must be run on the same server that is hosting the Kiln Queue. # Parameters: destroyFailures - A switch to destroy all failures instead of reenqueuing them. param( [switch]$destroyFailures ); function main() { # This will almost always have to be run directly from the server $qs_host = "localhost"; write-host ("Grabbing queue stats from http://{0}:56785/stats.json" -f $qs_host); $response = (New-Object System.Net.WebClient).DownloadString("http://{0}:56785/stats.json" -f $qs_host); if ($?) {write-host " Stats retrieved successfully.`n"} # $stats = $response | ConvertFrom-JSON; # This needs Powershell 3.0, so we parse it to XML instead $stats = Convert-JsonToXml($response) $failures = $stats.root.failures; $runningTasks = $stats.root.runningTasks; $runningCount = $runningTasks.childnodes.count; $failCount = $failures.childnodes.count; write-host "Reenqueueing $failCount failures..."; $i = 0 if ($failCount -gt 0) { foreach ($failure in $failures.item) { # Try both formats of the JSON (changed for 2.9.58) if ($failure."#text") { $failure = $failure."#text"; } elseif ($failure.id."#text") { $failure = $failure.id."#text"; } else { $i += 1; write-host "`n$i/$failCount (NOT FOUND)..."; continue } $i += 1; write-host "`n$i/$failCount ($failure)..."; Reenqueue-Task $qs_host $failure $destroyFailures; } } write-host "`nReenqueueing $runningCount running tasks..."; $i = 0 if ($runningCount -gt 0) { foreach ($runningTask in $runningTasks.item) { if ($newer) {$runningTask = $runningTask.hash."#text"; } else { $runningTask = $runningTask.id."#text"; } $i += 1; write-host "`n$i/$runningCount ($runningTask)..."; Reenqueue-Task $qs_host $runningTask; } } } function Reenqueue-Task ($qs_host, $task, $destroy = $false) { $URI = "http://{0}:56785/reenqueue?id={1}" -f ($qs_host, $task); if ($destroy) { write-host "DESTROYING TASK $task!"; $URI = "http://{0}:56785/destroy?id={1}" -f ($qs_host, $task); } Execute-HTTPPostCommand $URI "a=1"; if (!($?)) { write-host "$task failed!"; } } # This is provided as an alternative to ConvertFrom-JSON, which requires Powershell V3 # which is not on most servers by default and requires a reboot to install. # Source: (https://www.cogmotive.com/blog/powershell/parsing-json-in-powershell-xml-the-member-item-is-already-present) Add-Type -Assembly System.ServiceModel.Web,System.Runtime.Serialization function Convert-JsonToXml([string]$json) { $bytes = [byte[]][char[]]$json $quotas = [System.Xml.XmlDictionaryReaderQuotas]::Max $jsonReader = [System.Runtime.Serialization.Json.JsonReaderWriterFactory]::CreateJsonReader($bytes,$quotas) try { $xml = new-object System.Xml.XmlDocument $xml.Load($jsonReader) $xml } finally { $jsonReader.Close() } } # Source: (http://stackoverflow.com/questions/5246836/user-powershell-script-to-post-to-url) function Execute-HTTPPostCommand() { param( [string] $target = $null, [string] $post = $null ) $webRequest = [System.Net.WebRequest]::Create($target) $webRequest.ContentType = "text/html" $PostStr = [System.Text.Encoding]::UTF8.GetBytes($post) $webrequest.ContentLength = $PostStr.Length $webRequest.ServicePoint.Expect100Continue = $false $webRequest.Method = "POST" $requestStream = $webRequest.GetRequestStream() $requestStream.Write($PostStr, 0,$PostStr.length) $requestStream.Close() try { [System.Net.WebResponse] $resp = $webRequest.GetResponse(); } catch [Net.WebException] { write-host $_.Exception.ToString() } $rs = $resp.GetResponseStream(); [System.IO.StreamReader] $sr = New-Object System.IO.StreamReader -argumentList $rs; [string] $results = $sr.ReadToEnd(); return $results; } # Do the work of reenqueuing everything main;