2013-02-05 15:43:57 +00:00
/ * *
* 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 ++ ) {
2013-05-03 15:02:06 +00:00
// Split into columns
var cols = data . rsp [ i ] . split ( ',' ) ;
2013-02-05 15:43:57 +00:00
// Go through each column
for ( var j = 0 ; j < cols . length ; j ++ ) {
2013-05-03 15:02:06 +00:00
// 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 ) ;
}
}
2013-02-05 15:43:57 +00:00
// Replace quote
2013-05-03 15:02:06 +00:00
cols [ j ] = cols [ j ] . replace ( new RegExp ( '"' , 'g' ) , '' ) ;
2013-02-05 15:43:57 +00:00
}
// Set the highest priority
priority = cols [ 0 ] ;
if ( priority > topPriority )
topPriority = priority ;
2013-05-03 15:02:06 +00:00
2013-02-05 15:43:57 +00:00
// Add check box where name = user name
cols . unshift ( '<input type="checkbox" name="' + cols [ 0 ] + '"/>' ) ;
2013-05-03 15:02:06 +00:00
2013-02-05 15:43:57 +00:00
// 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
2013-04-29 15:37:23 +00:00
var actionsMenu = createMenu ( [ refreshLnk , createLnk , editLnk , deleteLnk ] ) ;
2013-02-05 15:43:57 +00:00
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 ) ;
2013-02-11 00:27:58 +00:00
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>' ) ) ;
2013-04-29 15:37:23 +00:00
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 ) ;
2013-02-11 00:27:58 +00:00
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>' ) ) ;
2013-04-29 15:37:23 +00:00
2013-02-11 00:27:58 +00:00
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.">' +
2013-02-05 15:43:57 +00:00
'<option value="allow">Allow</option>' +
'<option value="accept">Accept</option>' +
'<option value="trusted">Trusted</option>' +
'<option value="deny">Deny</option>' +
'</select></div>' ) ) ;
2013-02-11 00:27:58 +00:00
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">' +
2013-02-05 15:43:57 +00:00
'<option value="">No</option>' +
'<option value="yes">Yes</option>' +
'</select></div>' ) ) ;
2013-02-11 00:27:58 +00:00
// 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 ( ) ) ;
}
} ) ;
2013-02-05 15:43:57 +00:00
// 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 ;
2013-06-27 15:25:13 +00:00
}
// Handle cases where there are value or no value
if ( host ) {
args += " policy.host='" + host + "'" ;
} else {
args += " policy.host=''" ;
}
2013-04-29 15:37:23 +00:00
2013-06-27 15:25:13 +00:00
if ( parameters ) {
args += " policy.parameters='" + parameters + "'" ;
} else {
args += " policy.parameters=''" ;
}
if ( nodeRange ) {
args += " policy.noderange='" + nodeRange + "'" ;
} else {
args += " policy.noderange=''" ;
}
2013-04-29 15:37:23 +00:00
if ( comments ) {
2013-02-05 15:43:57 +00:00
args += " policy.comments='" + comments + "'" ;
2013-04-29 15:37:23 +00:00
} else {
args += " policy.comments=''" ;
2013-02-05 15:43:57 +00:00
}
2013-06-19 16:14:21 +00:00
if ( commands ) {
args += " policy.commands='" + commands + "'" ;
} else {
args += " policy.commands=''" ;
}
2013-02-05 15:43:57 +00:00
// 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 : '' ,
2013-02-09 05:24:21 +00:00
args : 'policy||' + priority + '||' + args ,
2013-02-05 15:43:57 +00:00
msg : dialogId
} ,
success : updatePanel
} ) ;
if ( password ) {
$ . ajax ( {
url : 'lib/cmd.php' ,
dataType : 'json' ,
data : {
cmd : 'webrun' ,
tgt : '' ,
2013-02-09 05:24:21 +00:00
args : 'passwd||' + usrName + '||' + password ,
2013-02-05 15:43:57 +00:00
msg : dialogId
} ,
success : updatePanel
} ) ;
}
// Update highest priority
topPriority = priority ;
} ,
"Cancel" : function ( ) {
$ ( this ) . dialog ( "close" ) ;
}
}
} ) ;
// Change comments if access checkbox is checked
2013-04-29 15:37:23 +00:00
typeSelect . change ( function ( ) {
2013-02-05 15:43:57 +00:00
var comments = createUserForm . find ( 'input[name=comments]' ) . val ( ) ;
2013-06-19 16:14:21 +00:00
var cmds = createUserForm . find ( 'input[name=commands]' ) . val ( ) ;
comments = jQuery . trim ( comments ) ;
cmds = jQuery . trim ( cmds ) ;
2013-02-05 15:43:57 +00:00
var tag = "privilege:root" ;
2013-06-19 16:14:21 +00:00
// 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
2013-04-29 15:37:23 +00:00
if ( typeSelect . val ( ) . indexOf ( "admin" ) > - 1 ) {
2013-02-05 15:43:57 +00:00
if ( comments && comments . charAt ( comments . length - 1 ) != ";" ) {
comments += ";" ;
}
comments += tag ;
2013-06-19 16:14:21 +00:00
createUserForm . find ( 'input[name=comments]' ) . val ( comments ) ;
createUserForm . find ( 'input[name=commands]' ) . val ( "" ) ;
2013-02-05 15:43:57 +00:00
} else {
comments = comments . replace ( tag , "" ) ;
comments = comments . replace ( ";;" , ";" ) ;
2013-06-19 16:14:21 +00:00
createUserForm . find ( 'input[name=comments]' ) . val ( comments ) ;
createUserForm . find ( 'input[name=commands]' ) . val ( authorizedCmds ) ;
2013-02-05 15:43:57 +00:00
}
// 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 ) {
2013-04-29 15:37:23 +00:00
typeSelect . val ( "admin" ) ;
2013-02-05 15:43:57 +00:00
}
2013-06-19 16:14:21 +00:00
} else {
// Default user type to guest
typeSelect . val ( "guest" ) . change ( ) ;
2013-02-05 15:43:57 +00:00
}
}
/ * *
* 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 : '' ,
2013-02-09 05:24:21 +00:00
args : 'deleteuser||' + users ,
2013-02-05 15:43:57 +00:00
msg : dialogId
} ,
success : updatePanel
} ) ;
} ,
"Cancel" : function ( ) {
$ ( this ) . dialog ( "close" ) ;
}
}
} ) ;
}