8c9646b65c
resolveAndConnect discarded the actual error from connectUpstream (ECONNREFUSED, ETIMEDOUT, an ssh2 auth failure, ...) and replaced it with the generic reason string 'upstream-unreachable', so the audit log gave no way to tell a network-layer failure from an auth failure -- which is why "Could not reach 192.168.1.206" for the emby host couldn't be root-caused without live host-shell access. Now the real error message is captured and surfaced as failDetail, shown as a tooltip on the audit table's fail badge.
33 lines
1.5 KiB
JavaScript
33 lines
1.5 KiB
JavaScript
'use strict';
|
|
|
|
// Jump-host page controllers. app.api / app.auth come from app-base.js (the
|
|
// shared client framework); this adds the jump-host data calls and the small
|
|
// render helpers each page uses.
|
|
|
|
app.jump = (function(app){
|
|
function metrics(cb){ app.api.get('metrics', cb); }
|
|
function sessions(cb){ app.api.get('sessions', cb); }
|
|
function audit(query, cb){
|
|
var qs = $.param(query || {});
|
|
app.api.get('audit' + (qs ? '?' + qs : ''), cb);
|
|
}
|
|
function hosts(cb){ app.api.get('user/hosts', cb); }
|
|
return {metrics: metrics, sessions: sessions, audit: audit, hosts: hosts};
|
|
})(app);
|
|
|
|
// Self-service API token (PAT) management.
|
|
app.apiToken = (function(app){
|
|
function list(cb){ app.api.get('api-token/', cb); }
|
|
function add(args, cb){ app.api.post('api-token/', args, cb); }
|
|
function remove(id, cb){ app.api.delete('api-token/' + id, cb); }
|
|
function rotate(id, cb){ app.api.post('api-token/' + id + '/rotate', {}, cb); }
|
|
return {list: list, add: add, remove: remove, rotate: rotate};
|
|
})(app);
|
|
|
|
// Shared render helpers.
|
|
app.jump.fmtTime = function(ts){ return ts ? moment(Number(ts)).format('YYYY-MM-DD HH:mm:ss') : '—'; };
|
|
app.jump.esc = function(s){ return $('<div>').text(s == null ? '' : String(s)).html(); };
|
|
app.jump.result = function(e){ if (e.success) return '<span class="badge bg-success">ok</span>';
|
|
var title = e.failDetail ? ' title="' + app.jump.esc(e.failDetail) + '"' : '';
|
|
return '<span class="badge bg-danger"' + title + '>' + app.jump.esc(e.failReason || 'fail') + '</span>'; };
|