diff --git a/.gitignore b/.gitignore index cd1b490..b5c3768 100644 --- a/.gitignore +++ b/.gitignore @@ -47,3 +47,7 @@ nosetests.xml .mr.developer.cfg .project .pydevproject +.idea + +# supervisord +supervisord.conf diff --git a/app.js b/app.js index 3119fc9..55babdd 100644 --- a/app.js +++ b/app.js @@ -1,13 +1,13 @@ var mongoose = require('mongoose'); var db = require('./database'); -var server = mongoose.model('server'); +var model_server = mongoose.model('server'); var express = require('express') , routes = require('./routes') , user = require('./routes/user') , http = require('http') , path = require('path'); - +var io = require('socket.io'); var app = express(); @@ -42,12 +42,12 @@ app.post('/server', function(req, res){ rpc_pass: req.body.rpc_pass, obs: req.body.obs }); - newServer.save(); + newmodel_server.save(); res.send('Servidor adicionado com sucesso'); }); app.get('/server', function(req, res){ - server.find({}, function(err, server){ + model_server.find({}, function(err, server){ if(server){ res.send(server); }else{ @@ -57,7 +57,7 @@ app.get('/server', function(req, res){ }); app.get('/server/:id', function(req, res){ - server.findOne({_id:req.params.id}, function(err, server){ + model_server.findOne({_id:req.params.id}, function(err, server){ if(server){ res.send(server); }else{ @@ -67,14 +67,14 @@ app.get('/server/:id', function(req, res){ }); app.put('/server', function(req, res){ - server.findOne({_id: req.body._id}, function(err, server){ + model_server.findOne({_id: req.body._id}, function(err, server){ if (server){ - server.name = req.body.name; - server.rpc_url = req.body.rpc_url; - server.rpc_user = req.body.rpc_user; - server.rpc_pass = req.body.rpc_pass; - server.obs = req.body.obs; - server.save(); + model_server.name = req.body.name; + model_server.rpc_url = req.body.rpc_url; + model_server.rpc_user = req.body.rpc_user; + model_server.rpc_pass = req.body.rpc_pass; + model_server.obs = req.body.obs; + model_server.save(); res.send('Server editado com sucesso'); }else{ res.send('Servidor não existe'); @@ -83,9 +83,9 @@ app.put('/server', function(req, res){ }); app.delete('/server/:id', function(req, res){ - server.findOne({_id: req.params.id}, function(err, server){ + model_server.findOne({_id: req.params.id}, function(err, server){ if(server){ - server.remove(); + model_server.remove(); res.send('Servidor removido com sucesso') }else{ res.send('Servidor não existe') @@ -93,6 +93,23 @@ app.delete('/server/:id', function(req, res){ }) }); -http.createServer(app).listen(app.get('port'), function(){ +var server = http.createServer(app); +server.listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); }); + +var server_io = io.listen(server); +server_io.sockets.on('status', function (socket) { + +}); + +app.post('/event', function(req, res){ + console.log(req.body); + res.send("ACK"); + server_io.sockets.emit("status_changed", {hostname: req.body.hostname, + process: req.body.processname, + from_state: req.body.from_state, + to_state: req.body.to_state + } + ); +}); diff --git a/notify_plugin/__init__.py b/notify_plugin/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/notify_plugin/notify_plugin.py b/notify_plugin/notify_plugin.py new file mode 100755 index 0000000..4111220 --- /dev/null +++ b/notify_plugin/notify_plugin.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python +""" +Notify any PROCESS_STATE changes in realtime +to the dashboard server +""" +import os +import socket +import sys + +import requests + +from supervisor import childutils + + +def main(): + if not "SUPERVISOR_ENABLED" in os.environ: + sys.stderr.write("notify_plugin must be run as a supervisor event listener\n") + sys.stderr.flush() + sys.exit(1) + + if len(sys.argv) < 2: + sys.stderr.write("notify_plugin must receive the Dashboard URL") + sys.stderr.flush() + sys.exit(1) + + dashboard_url = sys.argv[1] + + while 1: + headers, payload = childutils.listener.wait(sys.stdin, sys.stdout) + pheaders, pdata = childutils.eventdata(payload+'\n') + pheaders["hostname"] = socket.gethostname() # Send hostname + pheaders["to_state"] = headers["eventname"].replace("PROCESS_STATE_", "") # Send current state + if not "notify_plugin" in pheaders["processname"]: + requests.post(dashboard_url, data=pheaders) + + childutils.listener.ok(sys.stdout) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/notify_plugin/requirements.txt b/notify_plugin/requirements.txt new file mode 100644 index 0000000..84f87ea --- /dev/null +++ b/notify_plugin/requirements.txt @@ -0,0 +1,2 @@ +requests==2.0.1 +supervisor==3.0 diff --git a/notify_plugin/supervisord.conf.example b/notify_plugin/supervisord.conf.example new file mode 100644 index 0000000..683bfd4 --- /dev/null +++ b/notify_plugin/supervisord.conf.example @@ -0,0 +1,45 @@ +[supervisord] +logfile = /tmp/supervisord.log +logfile_maxbytes = 50MB +logfile_backups=10 +loglevel = debug +pidfile = /tmp/supervisord.pid +nodaemon = false +minfds = 1024 +minprocs = 200 +umask = 022 +user = YOUR_USER +identifier = supervisor +directory = /tmp +nocleanup = true +childlogdir = /tmp +strip_ansi = false +environment = KEY1="value1",KEY2="value2" + +[program:memcached] +command = memcached +numprocs = 1 +autostart = true +autorestart = true +stdout_logfile = NONE +stderr_logfile = NONE + +[eventlistener:notifyme] +command =./notifyme.py +process_name = %(program_name)s_%(process_num)02d +numprocs = 1 +events = PROCESS_STATE +buffer_size = 10 +priority = -1 +autostart = true +autorestart = unexpected +exitcodes = 0 +user = YOUR_USER +redirect_stderr = false +stdout_logfile = /tmp/notifyme_stdout.log +stdout_logfile_maxbytes = 1MB +stdout_logfile_backups = 10 +stderr_logfile = /tmp/notifyme_stderr.log +stderr_logfile_maxbytes = 1MB +stderr_logfile_backups = 10 +environment=PYTHONUNBUFFERED="1" # PYTHONBUFFERED is necessary to un-buffer stdout/stderr \ No newline at end of file diff --git a/package.json b/package.json index 004ee28..16b0e1b 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "express": "3.2.4", "jade": "*", "mongoose": "*", - "xmlrpc": "*" + "xmlrpc": "*", + "socket.io": "*" } }