From 41879cce5db456c0056d63e0258750e6fb680941 Mon Sep 17 00:00:00 2001 From: Garrett Kadillak Date: Sat, 4 Jul 2015 09:45:30 -0700 Subject: [PATCH 01/20] Environ issues --- buildout.cfg | 1 + conf/nginx.conf.in | 17 ++++++++++++++ conf/supervisord.conf.in | 22 +++++++++++++++++++ setup.py | 6 ++++- .../static/storageadmin/js/router.js | 2 +- .../templates/storageadmin/base.html | 1 + 6 files changed, 47 insertions(+), 2 deletions(-) diff --git a/buildout.cfg b/buildout.cfg index 2c7f69632..a2afb0d41 100644 --- a/buildout.cfg +++ b/buildout.cfg @@ -70,6 +70,7 @@ dc_cmd = ${buildout:directory}/bin/data-collector sm_cmd = ${buildout:directory}/bin/service-monitor jd_cmd = ${buildout:directory}/bin/job-dispatcher ztask_cmd = ${buildout:directory}/bin/django ztaskd --noreload -l DEBUG --replayfailed -f ${supervisord-conf:logdir}/ztask.log +dc2_cmd = ${buildout:directory}/bin/dc2 input = ${buildout:directory}/conf/supervisord.conf.in output = ${buildout:directory}/etc/supervisord.conf diff --git a/conf/nginx.conf.in b/conf/nginx.conf.in index 2459bcae6..bb6c67e0d 100644 --- a/conf/nginx.conf.in +++ b/conf/nginx.conf.in @@ -79,5 +79,22 @@ http { proxy_read_timeout 120; proxy_pass http://${init-gunicorn:bind}:${init-gunicorn:port}/; } + location /dc2/ { + proxy_pass http://127.0.0.1:8080; + proxy_redirect off; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + location /dc2/static { + root ${buildout:directory}/; + } + location /socket.io { + proxy_pass http://127.0.0.1:8080/socket.io; + proxy_redirect off; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } } } diff --git a/conf/supervisord.conf.in b/conf/supervisord.conf.in index 00a06dc80..3cc5f5d1a 100644 --- a/conf/supervisord.conf.in +++ b/conf/supervisord.conf.in @@ -181,3 +181,25 @@ stdout_logfile_backups=10 ; # of stdout logfile backups (default 10) stderr_logfile=${supervisord-conf:logdir}/supervisord_%(program_name)s_stderr.log ; stderr log path, NONE for none; default AUTO stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) stderr_logfile_backups=10 ; # of stderr logfile backups (default 10) + + +; dc2 daemon +[program:dc2] +environment=DJANGO_SETTINGS_MODULE=settings +command=${supervisord-conf:dc2_cmd} ; the program (relative uses PATH, can take args) +process_name=%(program_name)s ; process_name expr (default %(program_name)s) +numprocs=1 ; number of processes copies to start (def 1) +priority=200 +autostart=false ; start at supervisord start (default: true) +autorestart=unexpected ; whether/when to restart (default: unexpected) +startsecs=2 ; number of secs prog must stay running (def. 1) +startretries=3 ; max # of serial start failures (default 3) +exitcodes=0,2 ; 'expected' exit codes for process (default 0,2) +stopsignal=TERM ; signal used to kill process (default TERM) +stopwaitsecs=5 ; max num secs to wait b4 SIGKILL (default 10) +stdout_logfile=${supervisord-conf:logdir}/supervisord_%(program_name)s_stdout.log ; stdout log path, NONE for none; default AUTO +stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) +stdout_logfile_backups=10 ; # of stdout logfile backups (default 10) +stderr_logfile=${supervisord-conf:logdir}/supervisord_%(program_name)s_stderr.log ; stderr log path, NONE for none; default AUTO +stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) +stderr_logfile_backups=10 ; # of stderr logfile backups (default 10) \ No newline at end of file diff --git a/setup.py b/setup.py index beff0f06e..72e634afe 100644 --- a/setup.py +++ b/setup.py @@ -46,6 +46,7 @@ 'ovpn-initpki = ovpn_util:initpki', 'ovpn-client-gen = ovpn_util:client_gen', 'ovpn-client-print = ovpn_util:client_retrieve', + 'dc2 = smart_manager.dc2:main' ], }, @@ -64,7 +65,10 @@ 'six == 1.7.3', 'django-ztask == 0.1.5', 'mock == 1.0.1', - 'coverage' + 'coverage', + 'gevent-socketio', + 'psycogreen', + 'psutil', ] ) diff --git a/src/rockstor/storageadmin/static/storageadmin/js/router.js b/src/rockstor/storageadmin/static/storageadmin/js/router.js index 99a99406f..6ff3723ab 100644 --- a/src/rockstor/storageadmin/static/storageadmin/js/router.js +++ b/src/rockstor/storageadmin/static/storageadmin/js/router.js @@ -887,5 +887,5 @@ $(document).ready(function() { $('#contrib-form').submit() $('#donate-modal').modal('hide'); }); - + Rockstorsocket = io.connect('/dashboard', {secure: 'false', url: 'http://192.168.56.105:8080'}); }); diff --git a/src/rockstor/storageadmin/templates/storageadmin/base.html b/src/rockstor/storageadmin/templates/storageadmin/base.html index 96ab2cc7d..7c36b3c40 100644 --- a/src/rockstor/storageadmin/templates/storageadmin/base.html +++ b/src/rockstor/storageadmin/templates/storageadmin/base.html @@ -100,6 +100,7 @@ + From 5e198bfb4addbca2442f01fde909e40efa44403c Mon Sep 17 00:00:00 2001 From: Garrett Kadillak Date: Thu, 9 Jul 2015 16:01:41 -0700 Subject: [PATCH 02/20] Kernel info, uptime being sent to dashboard --- src/rockstor/smart_manager/dc2.py | 95 +++++++++++++++++++ .../static/storageadmin/js/rockstor.js | 37 +------- .../static/storageadmin/js/router.js | 56 +++++++++-- .../js/templates/common/navbar.jst | 2 +- .../templates/storageadmin/base.html | 5 +- 5 files changed, 150 insertions(+), 45 deletions(-) create mode 100644 src/rockstor/smart_manager/dc2.py diff --git a/src/rockstor/smart_manager/dc2.py b/src/rockstor/smart_manager/dc2.py new file mode 100644 index 000000000..02f3af4e6 --- /dev/null +++ b/src/rockstor/smart_manager/dc2.py @@ -0,0 +1,95 @@ +from gevent import monkey +monkey.patch_all() +import gevent +from socketio.server import SocketIOServer +from socketio import socketio_manage +from socketio.namespace import BaseNamespace +from socketio.mixins import BroadcastMixin + +from django.conf import settings +from system.osi import (uptime, kernel_info) + +import logging +logger = logging.getLogger(__name__) + + +class DashboardNamespace(BaseNamespace, BroadcastMixin): + def initialize(self): + pass + + +class SysinfoNamespace(BaseNamespace, BroadcastMixin): + start = False + supported_kernel = settings.SUPPORTED_KERNEL_VERSION + + def initialize(self): + self.emit("sysinfo", {"sysinfo": "connected"}) + self.start = True + gevent.spawn(self.send_uptime) + gevent.spawn(self.send_kernel_info) + + def recv_disconnect(self): + self.start = False + self.disconnect(silent=True) + + def send_uptime(self): + + while self.start: + if not self.start: + break + self.emit('uptime', {'uptime': uptime()}) + # seconds not displayed + gevent.sleep(30) + + def send_kernel_info(self): + while self.start: + if not self.start: + break + try: + self.emit('kernel_info', {'kernel_info': + kernel_info(self.supported_kernel)}) + except: + self.error('unsupported_kernel', 'the kernel is bad') + # kernel information doesn't change that much + gevent.sleep(1000) + + +class Application(object): + def __init__(self): + self.buffer = [] + + def __call__(self, environ, start_response): + path = environ['PATH_INFO'].strip('/') or 'index.html' + + if path.startswith('/static') or path == 'index.html': + try: + data = open(path).read() + except Exception: + return not_found(start_response) + + if path.endswith(".js"): + content_type = "text/javascript" + elif path.endswith(".css"): + content_type = "text/css" + elif path.endswith(".swf"): + content_type = "application/x-shockwave-flash" + else: + content_type = "text/html" + + start_response('200 OK', [('Content-Type', content_type)]) + return [data] + if path.startswith("socket.io"): + socketio_manage(environ, {'/sysinfo': SysinfoNamespace}) + socketio_manage(environ, {'/dashboard': DashboardNamespace}) + + +def not_found(start_response): + start_response('404 Not Found', []) + return ['

Not found

'] + + +def main(): + logger.debug('Listening on port http://127.0.0.1:8080 and on port 10843 (flash policy server)') + server = SocketIOServer(('127.0.0.1', 8080), Application(), + resource="socket.io", policy_server=True).serve_forever() + diff --git a/src/rockstor/storageadmin/static/storageadmin/js/rockstor.js b/src/rockstor/storageadmin/static/storageadmin/js/rockstor.js index e04c61cbe..e0ec2357e 100644 --- a/src/rockstor/storageadmin/static/storageadmin/js/rockstor.js +++ b/src/rockstor/storageadmin/static/storageadmin/js/rockstor.js @@ -441,42 +441,7 @@ function fetchKernelInfo() { } }); } - -function displayLoadAvg(data) { - var n = parseInt(data.results[0]['uptime']); - var load_1 = parseFloat(data.results[0]['load_1']); - var load_5 = parseFloat(data.results[0]['load_5']); - var load_15 = parseFloat(data.results[0]['load_15']); - var secs = n % 60; - var mins = Math.round(n/60) % 60; - var hrs = Math.round(n / (60*60)) % 24; - var days = Math.round(n / (60*60*24)) % 365; - var yrs = Math.round(n / (60*60*24*365)); - var str = 'Uptime: '; - if (RockStorGlobals.kernel) { - str = 'Linux: ' + RockStorGlobals.kernel + '         ' + str; - } - if (yrs == 1) { - str += yrs + ' year, '; - } else if (yrs > 1) { - str += yrs + ' years, '; - } - if (days == 1) { - str += days + ' day, '; - } else if (days > 1) { - str += days + ' days, '; - } - if (hrs < 10) { - str += '0'; - } - str += hrs + ':'; - if (mins < 10) { - str += '0'; - } - str += mins; - str += '         Load: ' + load_1 + ', ' + load_5 + ', ' + load_15; - $('#appliance-loadavg').html(str); -} +*/ function fetchServerTime() { RockStorGlobals.serverTimeTimer = window.setInterval(function() { diff --git a/src/rockstor/storageadmin/static/storageadmin/js/router.js b/src/rockstor/storageadmin/static/storageadmin/js/router.js index 6ff3723ab..7da6e2bb6 100644 --- a/src/rockstor/storageadmin/static/storageadmin/js/router.js +++ b/src/rockstor/storageadmin/static/storageadmin/js/router.js @@ -122,18 +122,12 @@ var AppRouter = Backbone.Router.extend({ if (RockStorGlobals.currentAppliance == null) { setApplianceName(); } - if (!RockStorGlobals.loadAvgDisplayed) { - updateLoadAvg(); - } if (!RockStorGlobals.serverTimeFetched) { fetchServerTime(); } if (!RockStorGlobals.browserChecked) { checkBrowser(); } - if (!RockStorGlobals.kernel) { - fetchKernelInfo(); - } // set a timer to get current rockstor version and checkif there is an // update available @@ -887,5 +881,53 @@ $(document).ready(function() { $('#contrib-form').submit() $('#donate-modal').modal('hide'); }); - Rockstorsocket = io.connect('/dashboard', {secure: 'false', url: 'http://192.168.56.105:8080'}); + var $loadavg = $('#appliance-loadavg'); + var socket = io.connect('/sysinfo', {'secure': true}); + + + socket.on('sysinfo', function(data) { + console.log(data); + }); + + socket.on('uptime', function(data) { + displayLoadAvg(data); + }); + + socket.on('kernel_info', function(data) { + $loadavg.text('Linux: ' + data.kernel_info); + }); + + socket.on('unsupported_kernel', function() { + console.log('unsupported kernel'); + }); }); + + +function displayLoadAvg(data) { + var n = parseInt(data.uptime); + var secs = n % 60; + var mins = Math.round(n/60) % 60; + var hrs = Math.round(n / (60*60)) % 24; + var days = Math.round(n / (60*60*24)) % 365; + var yrs = Math.round(n / (60*60*24*365)); + var str = 'Uptime: '; + if (yrs == 1) { + str += yrs + ' year, '; + } else if (yrs > 1) { + str += yrs + ' years, '; + } + if (days == 1) { + str += days + ' day, '; + } else if (days > 1) { + str += days + ' days, '; + } + if (hrs < 10) { + str += '0'; + } + str += hrs + ':'; + if (mins < 10) { + str += '0'; + } + str += mins; + $('#uptime').text(str); +}; diff --git a/src/rockstor/storageadmin/static/storageadmin/js/templates/common/navbar.jst b/src/rockstor/storageadmin/static/storageadmin/js/templates/common/navbar.jst index d4141ae35..643a23db0 100644 --- a/src/rockstor/storageadmin/static/storageadmin/js/templates/common/navbar.jst +++ b/src/rockstor/storageadmin/static/storageadmin/js/templates/common/navbar.jst @@ -21,7 +21,7 @@
  • +
  • Shop