// 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 ); } });