nofxx-god_web 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. data/.gitignore +1 -0
  2. data/Rakefile +50 -0
  3. data/Readme.textile +82 -0
  4. data/VERSION +1 -0
  5. data/bin/god_web +11 -0
  6. data/bugs/issue-28789de6ef59a981f26031fdf68030a1474251e8.yaml +18 -0
  7. data/bugs/issue-949b87d1535bd55950daf2ec197a25ce2a0de13f.yaml +18 -0
  8. data/bugs/issue-9579e138eec0aee906895eefa1cc546bd7d54b0d.yaml +18 -0
  9. data/bugs/issue-b13b98759d3cf194cfee1bc00f0245f4b19f6cd2.yaml +18 -0
  10. data/bugs/issue-cf27fa73c85d2b7a389cbdcfe669b9703380667c.yaml +18 -0
  11. data/bugs/project.yaml +16 -0
  12. data/god_web.gemspec +109 -0
  13. data/lib/app.rb +56 -0
  14. data/lib/environment.rb +28 -0
  15. data/lib/god_web.rb +197 -0
  16. data/lib/sinatra_http_auth.rb +53 -0
  17. data/public/.DS_Store +0 -0
  18. data/public/app.css +30 -0
  19. data/public/icons/databases.png +0 -0
  20. data/public/icons/gear.png +0 -0
  21. data/public/icons/groups.png +0 -0
  22. data/public/icons/key.png +0 -0
  23. data/public/icons/monitor.png +0 -0
  24. data/public/icons/restart.png +0 -0
  25. data/public/icons/ruby.png +0 -0
  26. data/public/icons/server.png +0 -0
  27. data/public/icons/start.png +0 -0
  28. data/public/icons/stop.png +0 -0
  29. data/public/icons/terminal.png +0 -0
  30. data/public/icons/unmonitor.png +0 -0
  31. data/public/icons/unmonitored.png +0 -0
  32. data/public/icons/unmonitored_old.png +0 -0
  33. data/public/icons/up.png +0 -0
  34. data/public/icons/warn.png +0 -0
  35. data/public/icons/wrench.png +0 -0
  36. data/public/iui/backButton.png +0 -0
  37. data/public/iui/blueButton.png +0 -0
  38. data/public/iui/cancel.png +0 -0
  39. data/public/iui/grayButton.png +0 -0
  40. data/public/iui/iui-logo-touch-icon.png +0 -0
  41. data/public/iui/iui.css +396 -0
  42. data/public/iui/iui.js +510 -0
  43. data/public/iui/iuix.css +1 -0
  44. data/public/iui/iuix.js +1 -0
  45. data/public/iui/listArrow.png +0 -0
  46. data/public/iui/listArrowSel.png +0 -0
  47. data/public/iui/listGroup.png +0 -0
  48. data/public/iui/loading.gif +0 -0
  49. data/public/iui/pinstripes.png +0 -0
  50. data/public/iui/redButton.png +0 -0
  51. data/public/iui/selection.png +0 -0
  52. data/public/iui/thumb.png +0 -0
  53. data/public/iui/toggle.png +0 -0
  54. data/public/iui/toggleOn.png +0 -0
  55. data/public/iui/toolButton.png +0 -0
  56. data/public/iui/toolbar.png +0 -0
  57. data/public/iui/whiteButton.png +0 -0
  58. data/spec/god_web_spec.rb +46 -0
  59. data/spec/spec_helper.rb +11 -0
  60. data/views/command.erb +4 -0
  61. data/views/status.erb +30 -0
  62. data/views/watch.erb +10 -0
  63. metadata +146 -0
data/public/iui/iui.js ADDED
@@ -0,0 +1,510 @@
1
+ /*
2
+ Copyright (c) 2007-9, iUI Project Members
3
+ See LICENSE.txt for licensing terms
4
+ */
5
+
6
+
7
+ (function() {
8
+
9
+ var slideSpeed = 20;
10
+ var slideInterval = 0;
11
+
12
+ var currentPage = null;
13
+ var currentDialog = null;
14
+ var currentWidth = 0;
15
+ var currentHash = location.hash;
16
+ var hashPrefix = "#_";
17
+ var pageHistory = [];
18
+ var newPageCount = 0;
19
+ var checkTimer;
20
+ var hasOrientationEvent = false;
21
+ var portraitVal = "portrait";
22
+ var landscapeVal = "landscape";
23
+
24
+ // *************************************************************************************************
25
+
26
+ window.iui =
27
+ {
28
+ animOn: false, // Experimental slide animation with CSS transition disabled by default
29
+
30
+ showPage: function(page, backwards)
31
+ {
32
+ if (page)
33
+ {
34
+ if (currentDialog)
35
+ {
36
+ currentDialog.removeAttribute("selected");
37
+ currentDialog = null;
38
+ }
39
+
40
+ if (hasClass(page, "dialog"))
41
+ showDialog(page);
42
+ else
43
+ {
44
+ var fromPage = currentPage;
45
+ currentPage = page;
46
+
47
+ if (fromPage)
48
+ setTimeout(slidePages, 0, fromPage, page, backwards);
49
+ else
50
+ updatePage(page, fromPage);
51
+ }
52
+ }
53
+ },
54
+
55
+ showPageById: function(pageId)
56
+ {
57
+ var page = $(pageId);
58
+ if (page)
59
+ {
60
+ var index = pageHistory.indexOf(pageId);
61
+ var backwards = index != -1;
62
+ if (backwards)
63
+ pageHistory.splice(index, pageHistory.length);
64
+
65
+ iui.showPage(page, backwards);
66
+ }
67
+ },
68
+
69
+ showPageByHref: function(href, args, method, replace, cb)
70
+ {
71
+ var req = new XMLHttpRequest();
72
+ req.onerror = function()
73
+ {
74
+ if (cb)
75
+ cb(false);
76
+ };
77
+
78
+ req.onreadystatechange = function()
79
+ {
80
+ if (req.readyState == 4)
81
+ {
82
+ if (replace)
83
+ replaceElementWithSource(replace, req.responseText);
84
+ else
85
+ {
86
+ var frag = document.createElement("div");
87
+ frag.innerHTML = req.responseText;
88
+ iui.insertPages(frag.childNodes);
89
+ }
90
+ if (cb)
91
+ setTimeout(cb, 1000, true);
92
+ }
93
+ };
94
+
95
+ if (args)
96
+ {
97
+ req.open(method || "GET", href, true);
98
+ req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
99
+ req.setRequestHeader("Content-Length", args.length);
100
+ req.send(args.join("&"));
101
+ }
102
+ else
103
+ {
104
+ req.open(method || "GET", href, true);
105
+ req.send(null);
106
+ }
107
+ },
108
+
109
+ insertPages: function(nodes)
110
+ {
111
+ var targetPage;
112
+ for (var i = 0; i < nodes.length; ++i)
113
+ {
114
+ var child = nodes[i];
115
+ if (child.nodeType == 1)
116
+ {
117
+ if (!child.id)
118
+ child.id = "__" + (++newPageCount) + "__";
119
+
120
+ var clone = $(child.id);
121
+ if (clone)
122
+ clone.parentNode.replaceChild(child, clone);
123
+ else
124
+ document.body.appendChild(child);
125
+
126
+ if (child.getAttribute("selected") == "true" || !targetPage)
127
+ targetPage = child;
128
+
129
+ --i;
130
+ }
131
+ }
132
+
133
+ if (targetPage)
134
+ iui.showPage(targetPage);
135
+ },
136
+
137
+ getSelectedPage: function()
138
+ {
139
+ for (var child = document.body.firstChild; child; child = child.nextSibling)
140
+ {
141
+ if (child.nodeType == 1 && child.getAttribute("selected") == "true")
142
+ return child;
143
+ }
144
+ },
145
+ isNativeUrl: function(href)
146
+ {
147
+ for(var i = 0; i < iui.nativeUrlPatterns.length; i++)
148
+ {
149
+ if(href.match(iui.nativeUrlPatterns[i])) return true;
150
+ }
151
+ return false;
152
+ },
153
+ nativeUrlPatterns: [
154
+ new RegExp("^http:\/\/maps.google.com\/maps\?"),
155
+ new RegExp("^mailto:"),
156
+ new RegExp("^tel:"),
157
+ new RegExp("^http:\/\/www.youtube.com\/watch\\?v="),
158
+ new RegExp("^http:\/\/www.youtube.com\/v\/"),
159
+ new RegExp("^javascript:"),
160
+
161
+ ]
162
+ };
163
+
164
+ // *************************************************************************************************
165
+
166
+ addEventListener("load", function(event)
167
+ {
168
+ var page = iui.getSelectedPage();
169
+ var locPage = getPageFromLoc();
170
+
171
+ if (page)
172
+ iui.showPage(page);
173
+
174
+ if (locPage && (locPage != page))
175
+ iui.showPage(locPage);
176
+
177
+ setTimeout(preloadImages, 0);
178
+ if (typeof window.onorientationchange == "object")
179
+ {
180
+ window.onorientationchange=orientChangeHandler;
181
+ hasOrientationEvent = true;
182
+ setTimeout(orientChangeHandler, 0);
183
+ }
184
+ setTimeout(checkOrientAndLocation, 0);
185
+ checkTimer = setInterval(checkOrientAndLocation, 300);
186
+ }, false);
187
+
188
+ addEventListener("unload", function(event)
189
+ {
190
+ return;
191
+ }, false);
192
+
193
+ addEventListener("click", function(event)
194
+ {
195
+ var link = findParent(event.target, "a");
196
+ if (link)
197
+ {
198
+ function unselect() { link.removeAttribute("selected"); }
199
+
200
+ if (link.href && link.hash && link.hash != "#" && !link.target)
201
+ {
202
+ link.setAttribute("selected", "true");
203
+ iui.showPage($(link.hash.substr(1)));
204
+ setTimeout(unselect, 500);
205
+ }
206
+ else if (link == $("backButton"))
207
+ history.back();
208
+ else if (link.getAttribute("type") == "submit")
209
+ submitForm(findParent(link, "form"));
210
+ else if (link.getAttribute("type") == "cancel")
211
+ cancelDialog(findParent(link, "form"));
212
+ else if (link.target == "_replace")
213
+ {
214
+ link.setAttribute("selected", "progress");
215
+ iui.showPageByHref(link.href, null, null, link, unselect);
216
+ }
217
+ else if (iui.isNativeUrl(link.href))
218
+ {
219
+ return;
220
+ }
221
+ else if (link.target == "_webapp")
222
+ {
223
+ location.href = link.href;
224
+ }
225
+ else if (!link.target)
226
+ {
227
+ link.setAttribute("selected", "progress");
228
+ iui.showPageByHref(link.href, null, null, null, unselect);
229
+ }
230
+ else
231
+ return;
232
+
233
+ event.preventDefault();
234
+ }
235
+ }, true);
236
+
237
+ addEventListener("click", function(event)
238
+ {
239
+ var div = findParent(event.target, "div");
240
+ if (div && hasClass(div, "toggle"))
241
+ {
242
+ div.setAttribute("toggled", div.getAttribute("toggled") != "true");
243
+ event.preventDefault();
244
+ }
245
+ }, true);
246
+
247
+ function getPageFromLoc()
248
+ {
249
+ var page;
250
+ var result = location.hash.match(/#_([^\?_]+)/);
251
+ if (result)
252
+ page = result[1];
253
+ if (page)
254
+ page = $(page);
255
+ return page;
256
+ }
257
+
258
+ function orientChangeHandler()
259
+ {
260
+ var orientation=window.orientation;
261
+ switch(orientation)
262
+ {
263
+ case 0:
264
+ setOrientation(portraitVal);
265
+ break;
266
+
267
+ case 90:
268
+ case -90:
269
+ setOrientation(landscapeVal);
270
+ break;
271
+ }
272
+ }
273
+
274
+
275
+ function checkOrientAndLocation()
276
+ {
277
+ if (!hasOrientationEvent)
278
+ {
279
+ if (window.innerWidth != currentWidth)
280
+ {
281
+ currentWidth = window.innerWidth;
282
+ var orient = currentWidth == 320 ? portraitVal : landscapeVal;
283
+ setOrientation(orient);
284
+ }
285
+ }
286
+
287
+ if (location.hash != currentHash)
288
+ {
289
+ var pageId = location.hash.substr(hashPrefix.length);
290
+ iui.showPageById(pageId);
291
+ }
292
+ }
293
+
294
+ function setOrientation(orient)
295
+ {
296
+ document.body.setAttribute("orient", orient);
297
+ setTimeout(scrollTo, 100, 0, 1);
298
+ }
299
+
300
+ function showDialog(page)
301
+ {
302
+ currentDialog = page;
303
+ page.setAttribute("selected", "true");
304
+
305
+ if (hasClass(page, "dialog") && !page.target)
306
+ showForm(page);
307
+ }
308
+
309
+ function showForm(form)
310
+ {
311
+ form.onsubmit = function(event)
312
+ {
313
+ event.preventDefault();
314
+ submitForm(form);
315
+ };
316
+
317
+ form.onclick = function(event)
318
+ {
319
+ if (event.target == form && hasClass(form, "dialog"))
320
+ cancelDialog(form);
321
+ };
322
+ }
323
+
324
+ function cancelDialog(form)
325
+ {
326
+ form.removeAttribute("selected");
327
+ }
328
+
329
+ function updatePage(page, fromPage)
330
+ {
331
+ if (!page.id)
332
+ page.id = "__" + (++newPageCount) + "__";
333
+
334
+ location.hash = currentHash = hashPrefix + page.id;
335
+ pageHistory.push(page.id);
336
+
337
+ var pageTitle = $("pageTitle");
338
+ if (page.title)
339
+ pageTitle.innerHTML = page.title;
340
+
341
+ if (page.localName.toLowerCase() == "form" && !page.target)
342
+ showForm(page);
343
+
344
+ var backButton = $("backButton");
345
+ if (backButton)
346
+ {
347
+ var prevPage = $(pageHistory[pageHistory.length-2]);
348
+ if (prevPage && !page.getAttribute("hideBackButton"))
349
+ {
350
+ backButton.style.display = "inline";
351
+ backButton.innerHTML = prevPage.title ? prevPage.title : "Back";
352
+ }
353
+ else
354
+ backButton.style.display = "none";
355
+ }
356
+ }
357
+
358
+ function slidePages(fromPage, toPage, backwards)
359
+ {
360
+ var axis = (backwards ? fromPage : toPage).getAttribute("axis");
361
+
362
+ clearInterval(checkTimer);
363
+
364
+ if (canDoSlideAnim() && axis != 'y')
365
+ {
366
+ slide2(fromPage, toPage, backwards, slideDone);
367
+ }
368
+ else
369
+ {
370
+ slide1(fromPage, toPage, backwards, axis, slideDone);
371
+ }
372
+
373
+ function slideDone()
374
+ {
375
+ if (!hasClass(toPage, "dialog"))
376
+ fromPage.removeAttribute("selected");
377
+ checkTimer = setInterval(checkOrientAndLocation, 300);
378
+ setTimeout(updatePage, 0, toPage, fromPage);
379
+ fromPage.removeEventListener('webkitTransitionEnd', slideDone, false);
380
+ }
381
+ }
382
+
383
+ function canDoSlideAnim()
384
+ {
385
+ return (iui.animOn) && (typeof WebKitCSSMatrix == "object");
386
+ }
387
+
388
+ function slide1(fromPage, toPage, backwards, axis, cb)
389
+ {
390
+ if (axis == "y")
391
+ (backwards ? fromPage : toPage).style.top = "100%";
392
+ else
393
+ toPage.style.left = "100%";
394
+
395
+ scrollTo(0, 1);
396
+ toPage.setAttribute("selected", "true");
397
+ var percent = 100;
398
+ slide();
399
+ var timer = setInterval(slide, slideInterval);
400
+
401
+ function slide()
402
+ {
403
+ percent -= slideSpeed;
404
+ if (percent <= 0)
405
+ {
406
+ percent = 0;
407
+ clearInterval(timer);
408
+ cb();
409
+ }
410
+
411
+ if (axis == "y")
412
+ {
413
+ backwards
414
+ ? fromPage.style.top = (100-percent) + "%"
415
+ : toPage.style.top = percent + "%";
416
+ }
417
+ else
418
+ {
419
+ fromPage.style.left = (backwards ? (100-percent) : (percent-100)) + "%";
420
+ toPage.style.left = (backwards ? -percent : percent) + "%";
421
+ }
422
+ }
423
+ }
424
+
425
+
426
+ function slide2(fromPage, toPage, backwards, cb)
427
+ {
428
+ toPage.style.webkitTransitionDuration = '0ms'; // Turn off transitions to set toPage start offset
429
+ // fromStart is always 0% and toEnd is always 0%
430
+ // iPhone won't take % width on toPage
431
+ var toStart = 'translateX(' + (backwards ? '-' : '') + window.innerWidth + 'px)';
432
+ var fromEnd = 'translateX(' + (backwards ? '100%' : '-100%') + ')';
433
+ toPage.style.webkitTransform = toStart;
434
+ toPage.setAttribute("selected", "true");
435
+ toPage.style.webkitTransitionDuration = ''; // Turn transitions back on
436
+ function startTrans()
437
+ {
438
+ fromPage.style.webkitTransform = fromEnd;
439
+ toPage.style.webkitTransform = 'translateX(0%)'; //toEnd
440
+ }
441
+ fromPage.addEventListener('webkitTransitionEnd', cb, false);
442
+ setTimeout(startTrans, 0);
443
+ }
444
+
445
+ function preloadImages()
446
+ {
447
+ var preloader = document.createElement("div");
448
+ preloader.id = "preloader";
449
+ document.body.appendChild(preloader);
450
+ }
451
+
452
+ function submitForm(form)
453
+ {
454
+ iui.showPageByHref(form.action || "POST", encodeForm(form), form.method);
455
+ }
456
+
457
+ function encodeForm(form)
458
+ {
459
+ function encode(inputs)
460
+ {
461
+ for (var i = 0; i < inputs.length; ++i)
462
+ {
463
+ if (inputs[i].name)
464
+ args.push(inputs[i].name + "=" + escape(inputs[i].value));
465
+ }
466
+ }
467
+
468
+ var args = [];
469
+ encode(form.getElementsByTagName("input"));
470
+ encode(form.getElementsByTagName("textarea"));
471
+ encode(form.getElementsByTagName("select"));
472
+ return args;
473
+ }
474
+
475
+ function findParent(node, localName)
476
+ {
477
+ while (node && (node.nodeType != 1 || node.localName.toLowerCase() != localName))
478
+ node = node.parentNode;
479
+ return node;
480
+ }
481
+
482
+ function hasClass(self, name)
483
+ {
484
+ var re = new RegExp("(^|\\s)"+name+"($|\\s)");
485
+ return re.exec(self.getAttribute("class")) != null;
486
+ }
487
+
488
+ function replaceElementWithSource(replace, source)
489
+ {
490
+ var page = replace.parentNode;
491
+ var parent = replace;
492
+ while (page.parentNode != document.body)
493
+ {
494
+ page = page.parentNode;
495
+ parent = parent.parentNode;
496
+ }
497
+
498
+ var frag = document.createElement(parent.localName);
499
+ frag.innerHTML = source;
500
+
501
+ page.removeChild(parent);
502
+
503
+ while (frag.firstChild)
504
+ page.appendChild(frag.firstChild);
505
+ }
506
+
507
+ function $(id) { return document.getElementById(id); }
508
+ function ddd() { console.log.apply(console, arguments); }
509
+
510
+ })();