123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- // This is free software, licensed under the Apache License, Version 2.0
- 'use strict';
- 'require poll';
- 'require view';
- 'require fs';
- 'require ui';
- 'require uci';
- 'require rpc';
- var RefreshIfaces = "";
- var RefreshTabs = ['s', 't', '5', 'h', 'd', 'm', 'y'];
- var callServiceList = rpc.declare({
- object: 'service',
- method: 'list',
- params: [ 'name' ],
- expect: { '': {} }
- });
- var isReadonlyView = !L.hasViewPermission() || null;
- function RefreshGraphs() {
- RefreshTabs.forEach(function (id) {
- RefreshIfaces.forEach(function (iface) {
- fs.exec_direct('/usr/bin/vnstati', [ '-' + id, '-i', iface, '-o', '-' ], 'blob').then(function(res) {
- document.getElementById('graph_' + id + '_' + iface).src = URL.createObjectURL(res);
- });
- });
- });
- }
- function IfacesResetData(ev) {
- ui.showModal(_('Delete data for ALL interfaces'), [
- E('p', _('The data will be removed from the database permanently. This cannot be undone.')),
- E('div', { 'class': 'right' }, [
- E('div', {
- 'class': 'btn',
- 'click': L.hideModal
- }, _('Cancel')),
- ' ',
- E('div', {
- 'class': 'btn cbi-button-negative',
- 'click': function(ev) {
- var if_count = 0;
- RefreshIfaces.forEach(function (iface) {
- fs.exec_direct('/usr/bin/vnstat', [ '--remove', '-i', iface, '--force' ], 'blob').then(function() {
- fs.exec_direct('/usr/bin/vnstat', [ '--add', '-i', iface ], 'blob').then(function() {
- if_count++;
- if (if_count == RefreshIfaces.length) {
- RefreshGraphs();
- }
- });
- });
- });
- ui.hideModal();
- }
- }, _('Delete'))
- ])
- ]);
- }
- return view.extend({
- renderTab: function(ifaces, style, title) {
- var tab = E('div', {
- 'class': 'cbi-section',
- 'data-tab': style,
- 'data-tab-title': title
- }, [
- E('p', {}, E('em', { 'class': 'spinning' }, [ _('Loading graphs…') ]))
- ]);
- ifaces.forEach(function(iface) {
- fs.exec_direct('/usr/bin/vnstati', [ '-'+style, '-i', iface, '-o', '-' ], 'blob').then(function(res) {
- var img = tab.querySelector('img[data-iface="%s"]'.format(iface));
- img.src = URL.createObjectURL(res);
- img.alt = _('Could not load graph, no data available: ') + iface;
- img.align = 'middle';
- img.style.visibility = 'visible';
- img.id = 'graph_' + style + '_' + iface;
- tab.firstElementChild.style.display = 'none';
- });
- tab.appendChild(E('span', {}, E('img', { 'data-iface': iface, 'style': 'visibility:hidden; margin:5px 10px' })));
- });
- return tab;
- },
- load: function() {
- return Promise.all([
- L.resolveDefault(callServiceList('vnstat'), {}),
- uci.load('vnstat'),
- ]);
- },
- render: function(data) {
- var ifaces = uci.get_first('vnstat', 'vnstat', 'interface') || [];
- var isRunning = false;
- try {
- isRunning = data[0]['vnstat']['instances']['instance1']['running'];
- } catch (e) { }
- var view = E([], [
- E('h2', [_('vnStat Graphs')]),
- (isRunning == false) ? E('p', { 'class': 'alert-message warning' }, _('Warning: The service is not running, graphs will not be updated!')):E('p'),
- E('div', ifaces.length ? [
- this.renderTab(ifaces, 's', _('Summary')),
- this.renderTab(ifaces, 't', _('Top')),
- this.renderTab(ifaces, '5', _('5 Minute')),
- this.renderTab(ifaces, 'h', _('Hourly')),
- this.renderTab(ifaces, 'd', _('Daily')),
- this.renderTab(ifaces, 'm', _('Monthly')),
- this.renderTab(ifaces, 'y', _('Yearly')),
- ] : [ E('em', [_('No monitored interfaces have been found. Go to the configuration to enable monitoring for one or more interfaces.')]) ]),
- ]);
- if (ifaces.length) {
- ui.tabs.initTabGroup(view.lastElementChild.childNodes);
- view.appendChild(E('div', { 'class': 'right' }, [
- E('br'),
- E('button', {
- 'class': 'cbi-button cbi-button-neutral',
- 'click': IfacesResetData,
- 'disabled': isReadonlyView
- }, [ _('Clear data for all interfaces') ])
- ]));
- }
- // Preserve the interfaces for the poll/refresh function
- RefreshIfaces = ifaces;
- poll.add(RefreshGraphs, 60);
- return view;
- },
- handleSave: null,
- handleSaveApply: null,
- handleReset: null
- });
|