function ubus_call(command, argument, params) { var request_data = {}; request_data.jsonrpc = "2.0"; request_data.method = "call"; request_data.params = [data.ubus_rpc_session, command, argument, params] var request_json = JSON.stringify(request_data); var request = new XMLHttpRequest(); request.open("POST", ubus_url, false); request.setRequestHeader("Content-type", "application/json"); request.send(request_json); if (request.status === 200) { var response = JSON.parse(request.responseText) if (!("error" in response) && "result" in response) { if (response.result.length === 2) { return response.result[1]; } } else { console.err("Failed query ubus!"); } } } function renderTableXRoutes(data, target_id) { for (var protocol in data) { var target = document.getElementById(target_id); var title = document.createElement('h3'); title.appendChild(document.createTextNode('X-Routes ' + protocol)); target.appendChild(title); var table = document.createElement('div'); table.setAttribute('class', 'table'); table.setAttribute('id', 'babel_overview_xroutes_' + protocol); var headerRow = document.createElement('div'); headerRow.setAttribute('class', 'tr table-titles'); var headerContent = '
' + protocol + ' Prefix
\
Metric
\
Source-Prefix
'; headerRow.innerHTML = headerContent; table.appendChild(headerRow); for (var prefix in data[protocol]) { var prefixRow = document.createElement('div'); prefixRow.setAttribute('class', 'tr'); var prefixContent = '
' + prefix + '
\
' + data[protocol][prefix]["metric"] + '
\
' + data[protocol][prefix]["src-prefix"] + '
'; prefixRow.innerHTML = prefixContent; table.appendChild(prefixRow); } target.appendChild(table); } } function renderTableRoutes(data, target_id) { for (var protocol in data) { var target = document.getElementById(target_id); var title = document.createElement('h3'); title.appendChild(document.createTextNode('Routes ' + protocol)); target.appendChild(title); var table = document.createElement('div'); table.setAttribute('class', 'table'); table.setAttribute('id', 'babel_overview_routes_' + protocol); var headerRow = document.createElement('div'); headerRow.setAttribute('class', 'tr table-titles'); var headerContent = '
' + protocol + ' Prefix
\
Source-Prefix
\
Route-Metric
\
Route Smoothed Metric
\
Refmetric
\
ID
\
Seq. No.
\
Channes
\
Age
\
Via
\
Nexthop
\
Installed
\
Feasible
'; headerRow.innerHTML = headerContent; table.appendChild(headerRow); for (var prefix in data[protocol]) { var prefixRow = document.createElement('div'); prefixRow.setAttribute('class', 'tr'); var prefixContent = '
' + prefix + '
\
' + data[protocol][prefix]["src-prefix"] + '
\
' + data[protocol][prefix]["route_metric"] + '
\
' + data[protocol][prefix]["route_smoothed_metric"] + '
\
' + data[protocol][prefix]["refmetric"] + '
\
' + data[protocol][prefix]["id"] + '
\
' + data[protocol][prefix]["seqno"] + '
\
' + data[protocol][prefix]["channels"] + '
\
' + data[protocol][prefix]["age"] + '
\
' + data[protocol][prefix]["via"] + '
\
' + data[protocol][prefix]["nexthop"] + '
\
' + data[protocol][prefix]["installed"] + '
\
' + data[protocol][prefix]["feasible"] + '
'; prefixRow.innerHTML = prefixContent; table.appendChild(prefixRow); } target.appendChild(table); } } function renderTableNeighbours(data, target_id) { for (var protocol in data) { var target = document.getElementById(target_id); var title = document.createElement('h3'); title.appendChild(document.createTextNode('Neighbours ' + protocol)); target.appendChild(title); var table = document.createElement('div'); table.setAttribute('class', 'table'); table.setAttribute('id', 'babel_overview_neighbours_' + protocol); var headerRow = document.createElement('div'); headerRow.setAttribute('class', 'tr table-titles'); var headerContent = '
' + protocol + ' Neighbour
\
Device
\
Hello-Reach
\
RX cost
\
TX cost
\
RTT
\
Channel
\
Interface up
'; headerRow.innerHTML = headerContent; table.appendChild(headerRow); for (var neighbour in data[protocol]) { var neighbourRow = document.createElement('div'); neighbourRow.setAttribute('class', 'tr'); var neighbourContent = '
' + neighbour + '
\
' + data[protocol][neighbour]["dev"] + '
\
' + data[protocol][neighbour]["hello-reach"] + '
\
' + data[protocol][neighbour]["rxcost"] + '
\
' + data[protocol][neighbour]["txcost"] + '
\
' + data[protocol][neighbour]["rtt"] + '
\
' + data[protocol][neighbour]["channel"] + '
\
' + data[protocol][neighbour]["if_up"] + '
'; neighbourRow.innerHTML = neighbourContent; table.appendChild(neighbourRow); } target.appendChild(table); } } function renderTableInfo(data, target_id) { var target = document.getElementById(target_id); var title = document.createElement('h3'); title.appendChild(document.createTextNode('Info')); target.appendChild(title); var table = document.createElement('div'); table.setAttribute('class', 'table'); table.setAttribute('id', 'babel_overview_info'); var headerRow = document.createElement('div'); headerRow.setAttribute('class', 'tr table-titles'); var headerContent = '
Babeld Version
\
My-ID
\
Host
'; headerRow.innerHTML = headerContent; table.appendChild(headerRow); var neighbourRow = document.createElement('div'); neighbourRow.setAttribute('class', 'tr'); var neighbourContent = '
' + data["babeld-version"] + '
\
' + data["my-id"] + '
\
' + data["host"] + '
'; neighbourRow.innerHTML = neighbourContent; table.appendChild(neighbourRow); target.appendChild(table); }