-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtattle-app.js
More file actions
103 lines (87 loc) · 3.08 KB
/
tattle-app.js
File metadata and controls
103 lines (87 loc) · 3.08 KB
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
var _ = require( 'underscore' ),
util = require( 'util' ),
ping = require( 'ping' ),
async = require( 'async' ),
config = require( './lib/config' ),
logger = require( './lib/logger' ).named( 'tattle-tweet' ),
Twitter = require( 'twitter' ),
service = require( './lib/service' );
var twitterClient = null;
if ( _.has( process.env, 'TWITTER_CONSUMER_KEY' ) ) {
// read from environment variables
twitterClient = new Twitter({
consumer_key : process.env.TWITTER_CONSUMER_KEY,
consumer_secret : process.env.TWITTER_CONSUMER_SECRET,
access_token_key : process.env.TWITTER_ACCESS_TOKEN_KEY,
access_token_secret: process.env.TWITTER_ACCESS_TOKEN_SECRET
});
} else {
// read from config file
twitterClient = new Twitter( config.twitter );
}
var PING_HOSTS = config.ping.hosts;
var PING_INTERVAL = config.ping.interval;
var TWEET_BODY = config.twitter.update_body;
var lastGoodCheck = new Date();
var networkIsGood = true;
var checking = 0;
var WORK_FUNCTION = function() {
if ( checking > 0 ) {
// still working from previous call, don't bother until its free
return;
}
checking = PING_HOSTS.length;
var networkOK = false;
async.reduce( PING_HOSTS, [], function( results, host, cb ) {
ping.sys.probe( host, function( isAlive ) {
results[ results.length ] = { 'host' : host, 'state' : isAlive };
checking--;
if ( isAlive ) {
networkOK = true;
}
cb( null, results );
});
}, function( err, results ) {
checking = 0;
if ( err ) {
networkIsGood = false;
return logger.error( 'error while pinging', err );
}
if ( networkOK ) {
var now = new Date();
if (!networkIsGood) {
var diffSeconds = ( ( now.getTime() - lastGoodCheck.getTime() ) - PING_INTERVAL ) / 1000.0;
var status = 'network was down for at least ' + diffSeconds + ' seconds';
logger.info( status );
twitterClient.post( 'statuses/update', { status: util.format( TWEET_BODY, diffSeconds ) }, function( error, tweet, response ){
if ( tweet && tweet.truncated ) {
logger.error('tweet was too long and was truncated by twitter, adjust config.twitter.update_body' );
}
if( error ) {
return logger.error( 'error while tweeting', error );
}
});
}
networkIsGood = true;
lastGoodCheck = new Date();
var downHosts = [];
for ( var i = 0; i < results.length; i++ ) {
var r = results[ i ];
if ( !r.state ) {
downHosts.push( r.host );
}
}
logger.debug( 'up ' + downHosts.join( ', ' ) );
} else {
logger.info( 'down' );
networkIsGood = false;
}
});
};
// build a worker agent service,
// that will invoke the work function passed to it repeatedly
service.workerAgent( 'tattle-tweet', { 'interval' : PING_INTERVAL }, function( err , doWork ) {
if ( err ) return logger.named( 'tattle-tweet' ).error( 'fatal startup error' );
// whenever its time to do work, all the worker jobs get processed
doWork( WORK_FUNCTION );
});