xcat-core/xCAT-UI/js/configure/users.js

536 lines
20 KiB
JavaScript

/**
* Global variables
*/
var userDatatable;
var topPriority = 0;
var tableId = 'usersTable';
/**
* Get user access table
*
* @returns User access table
*/
function getUsersTable(){
return userDatatable;
}
/**
* Set user access table
*
* @param table User access table
*/
function setUsersTable(table){
userDatatable = table;
}
/**
* Load the user page
*/
function loadUserPage() {
// Retrieve users from policy table
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'tabdump',
tgt : '',
args : 'policy',
msg : ''
},
success : loadUserTable
});
}
/**
* Load user table
*
* @param data Data returned from HTTP request
*/
function loadUserTable(data){
var tabId = 'usersTab';
$('#' + tabId).empty();
// Set padding for page
$('#' + tabId).css('padding', '20px 60px');
// Create info bar
var info = $('#' + tabId).find('.ui-state-highlight');
// If there is no info bar
if (!info.length) {
var infoBar = createInfoBar('Configure access given to users.');
// Create users page
var userPg = $('<div class="form"></div>');
$('#' + tabId).append(infoBar, userPg);
}
if (data.rsp) {
// Create a datatable if one does not exist
var table = new DataTable(tableId);
var headers = new Array('Priority', 'Name', 'Host', 'Commands', 'Noderange', 'Parameters', 'Time', 'Rule', 'Comments', 'Disable');
// Add column for the checkbox
headers.unshift('<input type="checkbox" onclick="selectAllCheckbox(event, $(this))">');
table.init(headers);
headers.shift();
// Append datatable to panel
$('#' + tabId).append(table.object());
topPriority = 0;
// Add table rows
// Start with the 2nd row (1st row is the headers)
for (var i = 1; i < data.rsp.length; i++) {
// Split into columns
var cols = data.rsp[i].split(',');
// Go through each column
for (var j = 0; j < cols.length; j++) {
// If the column is not complete
if (cols[j].count('"') == 1) {
while (cols[j].count('"') != 2) {
// Merge this column with the adjacent one
cols[j] = cols[j] + "," + cols[j + 1];
// Remove merged row
cols.splice(j + 1, 1);
}
}
// Replace quote
cols[j] = cols[j].replace(new RegExp('"', 'g'), '');
}
// Set the highest priority
priority = cols[0];
if (priority > topPriority)
topPriority = priority;
// Add check box where name = user name
cols.unshift('<input type="checkbox" name="' + cols[0] + '"/>');
// Add row
table.add(cols);
}
// Turn table into datatable
var dTable = $('#' + tableId).dataTable({
'iDisplayLength': 50,
'bLengthChange': false,
"bScrollCollapse": true,
"sScrollY": "400px",
"sScrollX": "100%",
"bAutoWidth": true,
"oLanguage": {
"oPaginate": {
"sNext": "",
"sPrevious": ""
}
}
});
setUsersTable(dTable); // Cache user access table
}
// Create action bar
var actionBar = $('<div class="actionBar"></div>').css("width", "450px");
var createLnk = $('<a>Create</a>');
createLnk.click(function() {
openCreateUserDialog("");
});
var editLnk = $('<a>Edit</a>');
editLnk.click(function() {
// Should only allow 1 user to be edited at a time
var users = getNodesChecked(tableId).split(',')
for (var i in users) {
openCreateUserDialog(users[i]);
}
});
var deleteLnk = $('<a>Delete</a>');
deleteLnk.click(function() {
// Find the user name from datatable
var usersList = "";
var users = $('#' + tableId + ' input[type=checkbox]:checked');
for (var i in users) {
var user = users.eq(i).parents('tr').find('td:eq(2)').text();
if (user && user != "undefined") {
usersList += user;
if (i < users.length - 1) {
usersList += ',';
}
}
}
if (usersList) {
openDeleteUserDialog(usersList);
}
});
var refreshLnk = $('<a>Refresh</a>');
refreshLnk.click(function() {
loadUserPage();
});
// Create an action menu
var actionsMenu = createMenu([refreshLnk, createLnk, editLnk, deleteLnk]);
actionsMenu.superfish();
actionsMenu.css('display', 'inline-block');
actionBar.append(actionsMenu);
// Set correct theme for action menu
actionsMenu.find('li').hover(function() {
setMenu2Theme($(this));
}, function() {
setMenu2Normal($(this));
});
// Create a division to hold actions menu
var menuDiv = $('<div id="' + tableId + '_menuDiv" class="menuDiv"></div>');
$('#' + tableId + '_wrapper').prepend(menuDiv);
menuDiv.append(actionBar);
$('#' + tableId + '_filter').appendTo(menuDiv);
}
/**
* Open create user dialog
*
* @param data User data (only during edit)
*/
function openCreateUserDialog(data) {
var dialogId = 'createUser';
// Generate the user priority
var priority = parseFloat(topPriority) + 0.01;
priority = priority.toPrecision(3);
// Create form to create user
var createUserForm = $('<div id="' + dialogId + '" class="form"></div>');
// Create info bar
var info = createInfoBar('Create a user and configure access to xCAT.');
var userFS = $('<fieldset></fieldset>');
var userLegend = $('<legend>User</legend>');
userFS.append(userLegend);
var userAttr = $('<div style="display: inline-table; vertical-align: middle;"></div>');
userFS.append($('<div style="display: inline-table; vertical-align: middle;"><img src="images/nodes/users.png"></img></div>'));
userFS.append(userAttr);
var optionFS = $('<fieldset></fieldset>');
var optionLegend = $('<legend>Options</legend>');
optionFS.append(optionLegend);
var optionAttr = $('<div style="display: inline-table; vertical-align: middle;"></div>');
optionFS.append($('<div style="display: inline-table; vertical-align: middle;"><img src="images/provision/setting.png" style="width: 70px;"></img></div>'));
optionFS.append(optionAttr);
createUserForm.append(info, userFS, optionFS);
userAttr.append($('<div><label>Priority:</label><input type="text" name="priority" disabled="disabled" value="' + priority + '" title="The priority value for this user"/></div>'));
userAttr.append($('<div><label>User name:</label><input type="text" name="name" title="The user name to log into xCAT with"/></div>'));
var type = $('<div><label>Type:</label></div>');
var typeSelect = $('<select name="user_type" title="Specifies the type of user.">' +
'<option value="guest">Guest</option>' +
'<option value="admin">Administrator</option>' +
'</select>');
type.append(typeSelect);
userAttr.append(type);
userAttr.append($('<div><label>Password:</label><input name="password" type="password" title="The user password that will be used to log into xCAT"></div>'));
userAttr.append($('<div><label>Confirm password:</label><input name="confirm_password" type="password" title="The user password that will be used to log into xCAT"></div>'));
optionAttr.append($('<div><label>Host:</label><input type="text" name="host" title="The host from which users may issue the commands specified by this rule. By default, it is all hosts."/></div>'));
optionAttr.append($('<div><label>Commands:</label><input type="text" name="commands" title="The list of commands that this rule applies to. By default, it is all commands."/></div>'));
optionAttr.append($('<div><label>Parameters:</label><input type="text" name="parameters" title="A regular expression that matches the command parameters (everything except the noderange) that this rule applies to. By default, it is all parameters."/></div>'));
optionAttr.append($('<div><label>Node Range:</label><input type="text" name="nodeRange" title="The node range that this rule applies to. By default, it is all nodes."/></div>'));
optionAttr.append($('<div><label>Rule:</label><select name="rule" title="Specifies how this rule should be applied. Valid values are: allow, accept, trusted, and deny.">' +
'<option value="allow">Allow</option>' +
'<option value="accept">Accept</option>' +
'<option value="trusted">Trusted</option>' +
'<option value="deny">Deny</option>' +
'</select></div>'));
optionAttr.append($('<div><label>Comments:</label><input type="text" name="comments" style="width: 250px;" title="Any user written notes"/></div>'));
optionAttr.append($('<div><label>Disable:</label><select name="disable" title="Set to yes to disable the user">' +
'<option value="">No</option>' +
'<option value="yes">Yes</option>' +
'</select></div>'));
// Generate tooltips
createUserForm.find('div input[title],select[title]').tooltip({
position: "center right",
offset: [-2, 10],
effect: "fade",
opacity: 0.8,
delay: 0,
predelay: 800,
events: {
def: "mouseover,mouseout",
input: "mouseover,mouseout",
widget: "focus mouseover,blur mouseout",
tooltip: "mouseover,mouseout"
},
// Change z index to show tooltip in front
onBeforeShow: function() {
this.getTip().css('z-index', $.topZIndex());
}
});
// Open dialog to add disk
createUserForm.dialog({
title:'Configure user',
modal: true,
close: function(){
$(this).remove();
},
width: 600,
buttons: {
"Ok": function(){
// Remove any warning messages
$(this).find('.ui-state-error').remove();
// Get inputs
var priority = $(this).find('input[name=priority]').val();
var usrName = $(this).find('input[name=name]').val();
var password = $(this).find('input[name=password]').val();
var confirmPassword = $(this).find('input[name=confirm_password]').val();
var host = $(this).find('input[name=host]').val();
var commands = $(this).find('input[name=commands]').val();
var parameters = $(this).find('input[name=parameters]').val();
var nodeRange = $(this).find('input[name=nodeRange]').val();
var rule = $(this).find('select[name=rule]').val();
var comments = $(this).find('input[name=comments]').val();
var disable = $(this).find('select[name=disable]').val();
// Verify user name and passwords are supplied
if (!usrName) {
var warn = createWarnBar('Please provide a user name');
warn.prependTo($(this));
return;
}
// Verify passwords match
if (password != confirmPassword) {
var warn = createWarnBar('Passwords do not match');
warn.prependTo($(this));
return;
}
var args = "";
if (usrName) {
args += ' policy.name=' + usrName;
} if (rule) {
args += ' policy.rule=' + rule;
} if (disable) {
args += ' policy.disable=' + disable;
}
// Handle cases where there are value or no value
if (host) {
args += " policy.host='" + host + "'";
} else {
args += " policy.host=''";
}
if (parameters) {
args += " policy.parameters='" + parameters + "'";
} else {
args += " policy.parameters=''";
}
if (nodeRange) {
args += " policy.noderange='" + nodeRange + "'";
} else {
args += " policy.noderange=''";
}
if (comments) {
args += " policy.comments='" + comments + "'";
} else {
args += " policy.comments=''";
}
if (commands) {
args += " policy.commands='" + commands + "'";
} else {
args += " policy.commands=''";
}
// Trim any extra spaces
args = jQuery.trim(args);
// Change dialog buttons
$(this).dialog('option', 'buttons', {
'Close': function() {$(this).dialog("close");}
});
// Submit request to update policy and passwd tables
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'webrun',
tgt : '',
args : 'policy||' + priority + '||' + args,
msg : dialogId
},
success : updatePanel
});
if (password) {
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'webrun',
tgt : '',
args : 'passwd||' + usrName + '||' + password,
msg : dialogId
},
success : updatePanel
});
}
// Update highest priority
topPriority = priority;
},
"Cancel": function() {
$(this).dialog( "close" );
}
}
});
// Change comments if access checkbox is checked
typeSelect.change(function() {
var comments = createUserForm.find('input[name=comments]').val();
var cmds = createUserForm.find('input[name=commands]').val();
comments = jQuery.trim(comments);
cmds = jQuery.trim(cmds);
var tag = "privilege:root";
// The list of every command used by the self-service page
// Every command must be separated by a comma
var authorizedCmds = "authcheck,lsdef,nodestat,tabdump,rinv,rpower,rmvm,webportal,webrun";
// Append tag to commands and comments
if (typeSelect.val().indexOf("admin") > -1) {
if (comments && comments.charAt(comments.length - 1) != ";") {
comments += ";";
}
comments += tag;
createUserForm.find('input[name=comments]').val(comments);
createUserForm.find('input[name=commands]').val("");
} else {
comments = comments.replace(tag, "");
comments = comments.replace(";;", ";");
createUserForm.find('input[name=comments]').val(comments);
createUserForm.find('input[name=commands]').val(authorizedCmds);
}
// Strip off leading semi-colon
if (comments.charAt(0) == ";") {
comments = comments.substr(1, comments.length);
createUserForm.find('input[name=comments]').val(comments);
}
});
// Set the user data (on edit)
if (data) {
var checkBox = $('#' + tableId + ' input[name="' + data + '"]');
var priority = data;
var name = checkBox.parents('tr').find('td:eq(2)').text();
var host = checkBox.parents('tr').find('td:eq(3)').text();
var commands = checkBox.parents('tr').find('td:eq(4)').text();
var noderange = checkBox.parents('tr').find('td:eq(5)').text();
var parameters = checkBox.parents('tr').find('td:eq(6)').text();
var time = checkBox.parents('tr').find('td:eq(7)').text();
var rule = checkBox.parents('tr').find('td:eq(8)').text();
var comments = checkBox.parents('tr').find('td:eq(9)').text();
var disable = checkBox.parents('tr').find('td:eq(10)').text();
createUserForm.find('input[name=priority]').val(priority);
createUserForm.find('input[name=name]').val(name);
// Do not show password (security)
createUserForm.find('input[name=password]').val();
createUserForm.find('input[name=confirm_password]').val();
createUserForm.find('input[name=host]').val(host);
createUserForm.find('input[name=commands]').val(commands);
createUserForm.find('input[name=parameters]').val(parameters);
createUserForm.find('input[name=nodeRange]').val(noderange);
createUserForm.find('select[name=rule]').val(rule);
createUserForm.find('input[name=comments]').val(comments);
createUserForm.find('select[name=disable]').val(disable);
if (comments.indexOf("privilege:root") > -1) {
typeSelect.val("admin");
}
} else {
// Default user type to guest
typeSelect.val("guest").change();
}
}
/**
* Open dialog to confirm user delete
*
* @param users Users to delete
*/
function openDeleteUserDialog(users) {
// Create form to delete disk to pool
var dialogId = 'deleteUser';
var deleteForm = $('<div id="' + dialogId + '" class="form"></div>');
// Create info bar
var info = createInfoBar('Are you sure you want to delete ' + users.replace(new RegExp(',', 'g'), ', ') + '?');
deleteForm.append(info);
// Open dialog to delete user
deleteForm.dialog({
title:'Delete user',
modal: true,
width: 400,
close: function(){
$(this).remove();
},
buttons: {
"Ok": function(){
// Remove any warning messages
$(this).find('.ui-state-error').remove();
// Change dialog buttons
$(this).dialog('option', 'buttons', {
'Close': function() {$(this).dialog("close");}
});
// Delete user
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'webrun',
tgt : '',
args : 'deleteuser||' + users,
msg : dialogId
},
success : updatePanel
});
},
"Cancel": function() {
$(this).dialog( "close" );
}
}
});
}