summaryrefslogtreecommitdiffhomepage
path: root/modules/luci-mod-dsl/htdocs/luci-static
diff options
context:
space:
mode:
authorJan Hoffmann <jan@3e8.eu>2023-02-09 22:27:00 +0100
committerJan Hoffmann <jan@3e8.eu>2023-02-09 22:33:55 +0100
commit3f9d47f97648974b5fd138a3996d7c8841015840 (patch)
tree2bf821fe22f247f1b3e550bccb17d7ff79711360 /modules/luci-mod-dsl/htdocs/luci-static
parenta53164c880e33150d83fef6c905f445f1e00fbd8 (diff)
luci-mod-dsl: add page with DSL status information
This shows the same information which is currently available on the general overview page of luci-mod-status. Signed-off-by: Jan Hoffmann <jan@3e8.eu>
Diffstat (limited to 'modules/luci-mod-dsl/htdocs/luci-static')
-rw-r--r--modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js188
1 files changed, 188 insertions, 0 deletions
diff --git a/modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js b/modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js
new file mode 100644
index 0000000000..5dcdebfd5d
--- /dev/null
+++ b/modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js
@@ -0,0 +1,188 @@
+'use strict';
+'require view';
+'require dom';
+'require poll';
+'require rpc';
+
+var callDSLMetrics = rpc.declare({
+ object: 'dsl',
+ method: 'metrics',
+ expect: { '': {} }
+});
+
+function format_on_off(val) {
+ return val ? _('on') : _('off');
+}
+
+function format_latency(val) {
+ return '%.2f ms'.format(val / 1000);
+}
+
+return view.extend({
+ load: function() {
+ return L.resolveDefault(callDSLMetrics(), {});
+ },
+
+ pollData: function(container) {
+ poll.add(L.bind(function() {
+ return L.resolveDefault(callDSLMetrics(), {}).then(L.bind(function(data) {
+ dom.content(container, this.renderContent(data));
+ }, this));
+ }, this));
+ },
+
+ formatHelper: function(format, val) {
+ if (val != null) {
+ if (format instanceof Function) {
+ return format(val);
+ } else if (typeof format === 'string') {
+ return format.format(val);
+ } else {
+ return val;
+ }
+ }
+ return '-';
+ },
+
+ renderSimpleTable: function(data) {
+ var table = E('table', { 'class': 'table' });
+
+ for (var [i, item] of data.entries()) {
+ var label = item[0];
+ var val = item[1];
+
+ var rowstyle = (i % 2 == 0) ? 'cbi-rowstyle-1' : 'cbi-rowstyle-2';
+
+ table.appendChild(E('tr', { 'class': 'tr ' + rowstyle }, [
+ E('td', { 'class': 'td left', 'width': '33%' }, [ label ]),
+ E('td', { 'class': 'td left' }, [ this.formatHelper(null, val) ])
+ ]));
+ }
+
+ return table;
+ },
+
+ renderTable: function(data) {
+ var table = E('table', { 'class': 'table' });
+
+ for (var [i, item] of data.entries()) {
+ var label = item[0];
+ var format = item[1];
+ var val1 = item[2];
+ var val2 = item[3];
+
+ var rowstyle = (i % 2 == 0) ? 'cbi-rowstyle-1' : 'cbi-rowstyle-2';
+
+ table.appendChild(E('tr', { 'class': 'tr ' + rowstyle }, [
+ E('td', { 'class': 'td left', 'width': '33%' }, [ label ]),
+ E('td', { 'class': 'td right', 'width': '33%' }, [ this.formatHelper(format, val1) ]),
+ E('td', { 'class': 'td right', 'width': '33%' }, [ this.formatHelper(format, val2) ])
+ ]));
+ }
+
+ return table;
+ },
+
+ renderContent: function(data) {
+ return E([], [
+
+ E('h3', {}, [ _('Connection State') ]),
+
+ this.renderSimpleTable([
+ [ _('Line State'), data.state ],
+ [ _('Line Mode'), data.mode ],
+ [ _('Line Uptime'), '%t'.format(data.uptime) ],
+ [ _('Annex'), data.annex ],
+ [ _('Power Management Mode'), data.power_state ]
+ ]),
+
+ E('h3', {}, [ _('Inventory') ]),
+
+ this.renderSimpleTable([
+ [ _('Modem Chipset'), data.chipset ],
+ [ _('Modem Firmware'), data.firmware_version ],
+ [ _('xTU-C Vendor ID'), data.atu_c.vendor || data.atu_c.vendor_id ]
+ ]),
+
+ E('h3', {}, [ _('Line Details') ]),
+
+ E('h4', {}, [ _('Data Rates') ]),
+ this.renderTable([
+ [ _('Actual Data Rate'), '%1000.3mb/s', data.downstream.data_rate, data.upstream.data_rate ],
+ [ _('Attainable Data Rate (ATTNDR)'), '%1000.3mb/s', data.downstream.attndr, data.upstream.attndr ],
+ [ _('Minimum Error-Free Throughput (MINEFTR)'), '%1000.3mb/s', data.downstream.mineftr, data.upstream.mineftr ]
+ ]),
+
+ E('h4', {}, [ _('On-line Reconfiguration') ]),
+ this.renderTable([
+ [ _('Bitswap'), format_on_off, data.downstream.bitswap, data.upstream.bitswap ],
+ [ _('Rate Adaptation Mode'), '%s', data.downstream.ra_mode, data.upstream.ra_mode ]
+ ]),
+
+ E('h4', {}, [ _('Noise Protection') ]),
+ this.renderTable([
+ [ _('Latency'), format_latency, data.downstream.interleave_delay, data.upstream.interleave_delay ],
+ [ _('Impulse Noise Protection (INP)'), '%.1f symbols', data.downstream.inp, data.upstream.inp ],
+ [ _('Retransmission (G.INP)'), format_on_off, data.downstream.retx, data.upstream.retx ]
+ ]),
+
+ E('h4', {}, [ _('Line Parameters') ]),
+ this.renderTable([
+ [ _('Line Attenuation (LATN)'), '%.1f dB', data.downstream.latn, data.upstream.latn ],
+ [ _('Signal Attenuation (SATN)'), '%.1f dB', data.downstream.satn, data.upstream.satn ],
+ [ _('Noise Margin (SNRM)'), '%.1f dB', data.downstream.snr, data.upstream.snr ],
+ [ _('Aggregate Transmit Power (ACTATP)'), '%.1f dB', data.downstream.actatp, data.upstream.actatp ]
+ ]),
+
+ E('h3', {}, [ _('Error Counters') ]),
+
+ E('h4', {}, [ _('Error Seconds') ]),
+ this.renderTable([
+ [ _('Forward Error Correction Seconds (FECS)'), '%d', data.errors.near.fecs, data.errors.far.fecs ],
+ [ _('Errored Seconds (ES)'), '%d', data.errors.near.es, data.errors.far.es ],
+ [ _('Severely Errored Seconds (SES)'), '%d', data.errors.near.ses, data.errors.far.ses ],
+ [ _('Loss of Signal Seconds (LOSS)'), '%d', data.errors.near.loss, data.errors.far.loss ],
+ [ _('Unavailable Seconds (UAS)'), '%d', data.errors.near.uas, data.errors.far.uas ],
+ [ _('Seconds with Low Error-Free Throughput (LEFTRS)'), '%d', data.errors.near.leftrs, data.errors.far.leftrs ]
+ ]),
+
+ E('h4', {}, [ _('Channel Counters') ]),
+ this.renderTable([
+ [ _('CRC Errors (CV-C)'), '%d', data.errors.near.cv_c, data.errors.far.cv_c ],
+ [ _('Corrected by FEC (FEC-C)'), '%d', data.errors.near.fec_c, data.errors.far.fec_c ]
+ ]),
+
+ E('h4', {}, [ _('Data Path Counters') ]),
+ this.renderTable([
+ [ _('ATM Header Error Code Errors (HEC-P)'), '%d', data.errors.near.hec, data.errors.far.hec ],
+ [ _('PTM Non Pre-emptive CRC Errors (CRC-P)'), '%d', data.errors.near.crc_p, data.errors.far.crc_p ],
+ [ _('PTM Pre-emptive CRC Errors (CRCP-P)'), '%d', data.errors.near.crcp_p, data.errors.far.crcp_p ]
+ ]),
+
+ E('h4', {}, [ _('Retransmission Counters') ]),
+ this.renderTable([
+ [ _('Retransmitted DTUs (rtx-tx)'), '%d', data.errors.far.tx_retransmitted, data.errors.near.tx_retransmitted ],
+ [ _('Corrected DTUs (rtx-c)'), '%d', data.errors.near.rx_corrected, data.errors.far.rx_corrected ],
+ [ _('Uncorrected DTUs (rtx-uc)'), '%d', data.errors.near.rx_uncorrected_protected, data.errors.far.rx_uncorrected_protected ]
+ ])
+
+ ]);
+ },
+
+ render: function(data) {
+ var v = E([], [
+ E('h2', {}, [ _('DSL stats') ]),
+ E('div')
+ ]);
+
+ var container = v.lastElementChild;
+ dom.content(container, this.renderContent(data));
+ this.pollData(container);
+
+ return v;
+ },
+
+ handleSaveApply: null,
+ handleSave: null,
+ handleReset: null
+});