// Cronicle Admin Page -- Servers
Class.add( Page.Admin, {
gosub_servers: function(args) {
// show server list, server groups
this.div.removeClass('loading');
app.setWindowTitle( "Servers" );
var size = get_inner_window_size();
var col_width = Math.floor( ((size.width * 0.9) + 400) / 9 );
var html = '';
html += this.getSidebarTabs( 'servers',
[
['activity', "Activity Log"],
['api_keys', "API Keys"],
['categories', "Categories"],
['plugins', "Plugins"],
['servers', "Servers"],
['users', "Users"]
]
);
html += '
';
// Active Server Cluster
var cols = ['Hostname', 'IP Address', 'Groups', 'Status', 'Active Jobs', 'Uptime', 'CPU', 'Mem', 'Actions'];
html += '
';
html += 'Server Cluster';
// html += '
';
html += '
';
this.servers = [];
var hostnames = hash_keys_to_array( app.servers ).sort();
for (var idx = 0, len = hostnames.length; idx < len; idx++) {
this.servers.push( app.servers[ hostnames[idx] ] );
}
// include nearby servers under main server list
if (app.nearby) {
var hostnames = hash_keys_to_array( app.nearby ).sort();
for (var idx = 0, len = hostnames.length; idx < len; idx++) {
var server = app.nearby[ hostnames[idx] ];
if (!app.servers[server.hostname]) {
server.nearby = 1;
this.servers.push( server );
}
}
}
// render table
var self = this;
html += this.getBasicTable( this.servers, cols, 'server', function(server, idx) {
// render nearby servers differently
if (server.nearby) {
var tds = [
'
' + server.hostname.replace(/\.[\w\-]+\.\w+$/, '') + '
',
(server.ip || 'n/a').replace(/^\:\:ffff\:(\d+\.\d+\.\d+\.\d+)$/, '$1'),
'-', '(Nearby)', '-', '-', '-', '-',
'
Add Server'
];
tds.className = 'blue';
return tds;
} // nearby
var actions = [
'
Restart',
'
Shutdown'
];
if (server.disabled) actions = [];
if (!server.master) {
actions.push( '
Remove' );
}
var group_names = [];
var eligible = false;
for (var idx = 0, len = app.server_groups.length; idx < len; idx++) {
var group = app.server_groups[idx];
var regexp = new RegExp( group.regexp, "i" );
if (server.hostname.match(regexp)) {
group_names.push( group.title );
if (group.master) eligible = true;
}
}
var jobs = find_objects( app.activeJobs, { hostname: server.hostname } );
var num_jobs = jobs.length;
var cpu = 0;
var mem = 0;
if (server.data && server.data.cpu) cpu += server.data.cpu;
if (server.data && server.data.mem) mem += server.data.mem;
for (idx = 0, len = jobs.length; idx < len; idx++) {
var job = jobs[idx];
if (job.cpu && job.cpu.current) cpu += job.cpu.current;
if (job.mem && job.mem.current) mem += job.mem.current;
}
var tds = [
'
' + self.getNiceGroup(null, server.hostname, col_width) + '
',
(server.ip || 'n/a').replace(/^\:\:ffff\:(\d+\.\d+\.\d+\.\d+)$/, '$1'),
group_names.length ? group_names.join(', ') : '(None)',
server.master ? '
Primary' : (eligible ? '
Backup' : '
Worker'),
num_jobs ? commify( num_jobs ) : '(None)',
get_text_from_seconds( server.uptime, true, true ).replace(/\bday\b/, 'days'),
short_float(cpu) + '%',
get_text_from_bytes(mem),
actions.join(' | ')
];
if (server.disabled) tds.className = 'disabled';
return tds;
} );
html += '
';
html += '
';
html += ' Add Server... | ';
html += '
';
html += '
';
// Server Groups
var col_width = Math.floor( ((size.width * 0.9) + 300) / 6 );
var cols = ['Title', 'Hostname Match', '# of Servers', '# of Events', 'Class', 'Actions'];
html += '
';
html += 'Server Groups';
// html += '
';
html += '
';
// sort by title ascending
this.server_groups = app.server_groups.sort( function(a, b) {
// return (b.title < a.title) ? 1 : -1;
return a.title.toLowerCase().localeCompare( b.title.toLowerCase() );
} );
// render table
var self = this;
html += this.getBasicTable( this.server_groups, cols, 'group', function(group, idx) {
var actions = [
'
Edit',
'
Delete'
];
var regexp = new RegExp( group.regexp, "i" );
var num_servers = 0;
for (var hostname in app.servers) {
if (hostname.match(regexp)) num_servers++;
}
var group_events = find_objects( app.schedule, { target: group.id } );
var num_events = group_events.length;
return [
'
' + self.getNiceGroup(group, null, col_width) + '
',
'
/' + encode_entities(group.regexp) + '/
',
// group.description || '(No description)',
num_servers ? commify( num_servers) : '(None)',
num_events ? commify( num_events ) : '(None)',
group.master ? '
Primary Eligible' : 'Worker Only',
actions.join(' | ')
];
} );
html += '
';
html += '
';
html += ' Add Group... | ';
html += '
';
html += '
'; // padding
html += ''; // sidebar tabs
this.div.html( html );
},
add_server_from_list: function(idx) {
// add a server right away, from the nearby list
var server = this.servers[idx];
app.showProgress( 1.0, "Adding server..." );
app.api.post( 'app/add_server', { hostname: server.ip || server.hostname }, function(resp) {
app.hideProgress();
app.showMessage('success', "Server was added successfully.");
// self['gosub_servers'](self.args);
} ); // api.post
},
add_server: function() {
// show dialog allowing user to enter an arbitrary hostname to add
var html = '';
// html += 'Typically, servers should automatically add themselves to the cluster, if they are within UDP broadcast range (i.e. on the same LAN). You should only need to manually add a server in special circumstances, e.g. if it is remotely hosted in another datacenter or network.
';
// html += 'Note that the new server cannot already be a master server, nor part of another '+app.name+' server cluster, and the current master server must be able to reach it.
';
html += '