// Cronicle Admin Page -- Activity Log
Class.add( Page.Admin, {
activity_types: {
'^cat': ' Category',
'^group': ' Group',
'^plugin': ' Plugin',
// '^apikey': ' API Key',
'^apikey': ' API Key',
'^event': ' Event',
'^user': ' User',
'server': ' Server',
'^job': ' Job',
'^state': ' Scheduler', // mdi-lg
'^error': ' Error',
'^warning': ' Warning'
},
gosub_activity: function(args) {
// show activity log
app.setWindowTitle( "Activity Log" );
if (!args.offset) args.offset = 0;
if (!args.limit) args.limit = 25;
app.api.post( 'app/get_activity', copy_object(args), this.receive_activity.bind(this) );
},
receive_activity: function(resp) {
// receive page of activity from server, render it
this.lastActivityResp = resp;
var html = '';
this.div.removeClass('loading');
html += this.getSidebarTabs( 'activity',
[
['activity', "Activity Log"],
['api_keys', "API Keys"],
['categories', "Categories"],
['plugins', "Plugins"],
['servers', "Servers"],
['users', "Users"]
]
);
this.events = [];
if (resp.rows) this.events = resp.rows;
var cols = ['Date/Time', 'Type', 'Description', 'Username', 'IP Address', 'Actions'];
html += '
';
html += '
';
html += 'Activity Log';
// html += '
';
html += '
';
var self = this;
html += this.getPaginatedTable( resp, cols, 'item', function(item, idx) {
// figure out icon first
if (!item.action) item.action = 'unknown';
var item_type = '';
for (var key in self.activity_types) {
var regexp = new RegExp(key);
if (item.action.match(regexp)) {
item_type = self.activity_types[key];
break;
}
}
// compose nice description
var desc = '';
var actions = [];
var color = '';
switch (item.action) {
// categories
case 'cat_create':
desc = 'New category created:
' + item.cat.title + '';
break;
case 'cat_update':
desc = 'Category updated:
' + item.cat.title + '';
break;
case 'cat_delete':
desc = 'Category deleted:
' + item.cat.title + '';
break;
// groups
case 'group_create':
desc = 'New server group created:
' + item.group.title + '';
break;
case 'group_update':
desc = 'Server group updated:
' + item.group.title + '';
break;
case 'group_delete':
desc = 'Server group deleted:
' + item.group.title + '';
break;
// plugins
case 'plugin_create':
desc = 'New Plugin created:
' + item.plugin.title + '';
break;
case 'plugin_update':
desc = 'Plugin updated:
' + item.plugin.title + '';
break;
case 'plugin_delete':
desc = 'Plugin deleted:
' + item.plugin.title + '';
break;
// api keys
case 'apikey_create':
desc = 'New API Key created:
' + item.api_key.title + ' (Key: ' + item.api_key.key + ')';
actions.push( '
Edit Key' );
break;
case 'apikey_update':
desc = 'API Key updated:
' + item.api_key.title + ' (Key: ' + item.api_key.key + ')';
actions.push( '
Edit Key' );
break;
case 'apikey_delete':
desc = 'API Key deleted:
' + item.api_key.title + ' (Key: ' + item.api_key.key + ')';
break;
// events
case 'event_create':
desc = 'New event added:
' + item.event.title + '';
desc += " (" + summarize_event_timing(item.event.timing, item.event.timezone) + ")";
actions.push( '
Edit Event' );
break;
case 'event_update':
desc = 'Event updated:
' + item.event.title + '';
actions.push( '
Edit Event' );
break;
case 'event_delete':
desc = 'Event deleted:
' + item.event.title + '';
break;
// users
case 'user_create':
desc = 'New user account created:
' + item.user.username + " (" + item.user.full_name + ")";
actions.push( '
Edit User' );
break;
case 'user_update':
desc = 'User account updated:
' + item.user.username + " (" + item.user.full_name + ")";
actions.push( '
Edit User' );
break;
case 'user_delete':
desc = 'User account deleted:
' + item.user.username + " (" + item.user.full_name + ")";
break;
case 'user_login':
desc = "User logged in:
" + item.user.username + " (" + item.user.full_name + ")";
break;
// servers
case 'add_server': // legacy
case 'server_add': // current
desc = 'Server '+(item.manual ? 'manually ' : '')+'added to cluster:
' + item.hostname + '';
break;
case 'remove_server': // legacy
case 'server_remove': // current
desc = 'Server '+(item.manual ? 'manually ' : '')+'removed from cluster:
' + item.hostname + '';
break;
case 'master_server': // legacy
case 'server_master': // current
desc = 'Server has become primary:
' + item.hostname + '';
break;
case 'server_restart':
desc = 'Server restarted:
' + item.hostname + '';
break;
case 'server_shutdown':
desc = 'Server shut down:
' + item.hostname + '';
break;
case 'server_disable':
desc = 'Lost connectivity to server:
' + item.hostname + '';
color = 'yellow';
break;
case 'server_enable':
desc = 'Reconnected to server:
' + item.hostname + '';
break;
// jobs
case 'job_run':
var event = find_object( app.schedule, { id: item.event } ) || { title: 'Unknown Event' };
desc = 'Job
#'+item.id+' ('+event.title+') manually started';
actions.push( '
Job Details' );
break;
case 'job_complete':
var event = find_object( app.schedule, { id: item.event } ) || { title: 'Unknown Event' };
if (!item.code) {
desc = 'Job
#'+item.id+' ('+event.title+') on server
'+item.hostname.replace(/\.[\w\-]+\.\w+$/, '')+' completed successfully';
}
else {
desc = 'Job
#'+item.id+' ('+event.title+') on server
'+item.hostname.replace(/\.[\w\-]+\.\w+$/, '')+' failed with error: ' + encode_entities(item.description || 'Unknown Error');
if (desc.match(/\n/)) desc = desc.split(/\n/).shift() + "...";
color = 'red';
}
actions.push( '
Job Details' );
break;
case 'job_delete':
var event = find_object( app.schedule, { id: item.event } ) || { title: 'Unknown Event' };
desc = 'Job
#'+item.id+' ('+event.title+') manually deleted';
break;
// scheduler
case 'state_update':
desc = 'Scheduler was
' + (item.enabled ? 'enabled' : 'disabled') + '';
break;
// errors
case 'error':
desc = encode_entities( item.description );
color = 'red';
break;
// warnings
case 'warning':
desc = encode_entities( item.description );
color = 'yellow';
break;
} // action
var tds = [
'
' + get_nice_date_time( item.epoch || 0, false, true ) + '
',
'
' + item_type + '
',
'
' + desc + '
',
'
' + self.getNiceUsername(item, true) + '
',
(item.ip || 'n/a').replace(/^\:\:ffff\:(\d+\.\d+\.\d+\.\d+)$/, '$1'),
'
' + actions.join(' | ') + '
'
];
if (color) tds.className = color;
return tds;
} );
html += '
'; // padding
html += ''; // sidebar tabs
this.div.html( html );
}
});