-
Notifications
You must be signed in to change notification settings - Fork 0
/
projectMonitor.js
128 lines (105 loc) · 4.11 KB
/
projectMonitor.js
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
/*jslint node: true, nomen: true*/
var colors = require("colors"),
config = require("./config"),
hue = require("./notifiers/hue"),
console = require("./console"),
slack = require("./notifiers/slack"),
q = require("q"),
junk = require("junk"),
path = require("path"),
data = require("./database");
var ProjectMonitor = function () {
'use strict';
var self = this;
self.projects = [];
self.notifiers = [];
self.intervals = [];
self.stateActions = {};
self.stateActions[config.get('projectStates:success')] = function (proj) {
console.log("%s - Success".green, proj.name);
hue.setColorForProject(proj, hue.xyColors.green);
slack.notify(config.get('projectStates:success'), proj);
};
self.stateActions[config.get('projectStates:successFromFailure')] = function (proj) {
console.log("%s - Success From Previous Failure".green, proj.name);
hue.setColorForProject(proj, hue.xyColors.green, hue.alertTypes.blinkOnce);
};
self.stateActions[config.get('projectStates:failure')] = function (proj) {
console.log("%s - Failure".red, proj.name);
hue.setColorForProject(proj, hue.xyColors.red);
};
self.stateActions[config.get('projectStates:queuedForBuild')] = function (proj) {
console.log("%s - Queued For Build".yellow, proj.name);
hue.setColorForProject(proj, hue.xyColors.lightPurple);
};
self.stateActions[config.get('projectStates:building')] = function (proj) {
console.log("%s - Building".yellow, proj.name);
hue.setColorForProject(proj, hue.xyColors.purple);
};
self.stateActions[config.get('projectStates:deploying')] = function (proj) {
console.log("%s - Deploying".cyan, proj.name);
hue.setColorForProject(proj, hue.xyColors.orange);
};
self.stateActions[config.get('projectStates:unknown')] = function (proj) {
console.log("%s - Unknown State", proj.name);
hue.setColorForProject(proj, hue.xyColors.white);
};
self.updateProject = function (proj) {
q.when(proj.getState(), function (state) {
data.updateProject(proj, state);
self.notifiers.forEach(function (n) {
n.notify(state, proj);
});
});
};
self.loadProjects = function () {
// Load all the projects up
var projectsPluginFolder = path.join(__dirname, "/projects"),
pluginFiles = require("fs").readdirSync(projectsPluginFolder).filter(junk.not);
pluginFiles.forEach(function (file) {
var proj = require(projectsPluginFolder + "/" + file);
self.projects.push(proj);
console.log("adding %s", proj.name);
data.addProject(proj);
});
console.log("%s project(s) loaded", self.projects.length);
};
self.loadNotifiers = function () {
// Load all the notifiers
var notifierPluginFolder = path.join(__dirname, "/notifiers"),
notifierFiles = require("fs").readdirSync(notifierPluginFolder).filter(junk.not);
notifierFiles.forEach(function (file) {
var notifier = require(notifierPluginFolder + "/" + file);
self.notifiers.push(notifier);
});
console.log("%s notifer(s) loaded", self.notifiers.length);
};
self.start = function () {
self.loadProjects();
self.loadNotifiers();
self.projects.forEach(function (proj) {
if (proj) {
self.updateProject(proj);
self.intervals.push(setInterval(function () {
self.updateProject(proj);
}, proj.frequency));
}
});
};
self.stop = function () {
self.intervals.forEach(function (i) {
clearInterval(i);
});
self.projects.forEach(function (p) {
if (p.shutdown) {
p.shutdown();
}
});
self.notifiers.forEach(function (notifier) {
if (notifier.shutdown) {
notifier.shutdown();
}
});
};
};
module.exports = new ProjectMonitor();