2012-04-11 19:59:16 +00:00
/ * *
* Global variables
* /
var topPriority = 0 ;
/ * *
* Load the service portal ' s provision page
*
2012-05-04 00:54:58 +00:00
* @ param tabId Tab ID where page will reside
2012-04-11 19:59:16 +00:00
* /
function loadServicePage ( tabId ) {
2012-05-04 00:54:58 +00:00
// Create info bar
var infoBar = createInfoBar ( 'Select a platform to configure, then click Ok.' ) ;
// Create self-service portal page
var tabId = 'serviceTab' ;
var servicePg = $ ( '<div class="form"></div>' ) ;
$ ( '#' + tabId ) . append ( infoBar , servicePg ) ;
2012-04-11 19:59:16 +00:00
2012-05-04 00:54:58 +00:00
// Create radio buttons for platforms
var hwList = $ ( '<ol>Platforms available:</ol>' ) ;
2013-06-19 19:24:53 +00:00
var esx = $ ( '<li><input type="radio" name="hw" value="esx" checked/>ESX</li>' ) ;
var kvm = $ ( '<li><input type="radio" name="hw" value="kvm"/>KVM</li>' ) ;
var zvm = $ ( '<li><input type="radio" name="hw" value="zvm"/>z\/VM</li>' ) ;
2012-05-04 00:54:58 +00:00
hwList . append ( esx ) ;
hwList . append ( kvm ) ;
hwList . append ( zvm ) ;
servicePg . append ( hwList ) ;
2012-04-11 19:59:16 +00:00
2012-05-04 00:54:58 +00:00
/ * *
* Ok
* /
var okBtn = createButton ( 'Ok' ) ;
okBtn . bind ( 'click' , function ( event ) {
var configTabs = getConfigTab ( ) ;
// Get hardware that was selected
var hw = $ ( this ) . parent ( ) . find ( 'input[name="hw"]:checked' ) . val ( ) ;
var newTabId = hw + 'ProvisionTab' ;
2012-04-11 19:59:16 +00:00
2012-05-04 00:54:58 +00:00
if ( $ ( '#' + newTabId ) . size ( ) > 0 ) {
configTabs . select ( newTabId ) ;
} else {
var title = '' ;
// Create an instance of the plugin
var plugin = null ;
switch ( hw ) {
case "kvm" :
plugin = new kvmPlugin ( ) ;
title = 'KVM' ;
break ;
case "esx" :
plugin = new esxPlugin ( ) ;
title = 'ESX' ;
break ;
case "zvm" :
plugin = new zvmPlugin ( ) ;
title = 'z/VM' ;
// Get zVM host names
2013-02-11 00:22:33 +00:00
if ( ! $ . cookie ( 'zvms' ) ) {
2012-05-04 00:54:58 +00:00
$ . ajax ( {
2013-02-13 17:24:39 +00:00
url : 'lib/cmd.php' ,
2012-05-04 00:54:58 +00:00
dataType : 'json' ,
data : {
cmd : 'webportal' ,
tgt : '' ,
args : 'lszvm' ,
msg : ''
} ,
2012-04-11 19:59:16 +00:00
2012-05-04 00:54:58 +00:00
success : function ( data ) {
setzVMCookies ( data ) ;
}
} ) ;
}
break ;
}
2012-04-11 19:59:16 +00:00
2012-05-04 00:54:58 +00:00
// Select tab
configTabs . add ( newTabId , title , '' , true ) ;
configTabs . select ( newTabId ) ;
plugin . loadConfigPage ( newTabId ) ;
}
} ) ;
servicePg . append ( okBtn ) ;
2012-04-11 19:59:16 +00:00
}
/ * *
* Round a floating point to a given precision
*
2012-05-04 00:54:58 +00:00
* @ param value Floating point
* @ param precision Decimal precision
* @ returns Floating point number
2012-04-11 19:59:16 +00:00
* /
function toFixed ( value , precision ) {
var power = Math . pow ( 10 , precision || 0 ) ;
return String ( Math . round ( value * power ) / power ) ;
2012-05-11 13:57:46 +00:00
}
/ * *
* Query the images that exists
*
* @ param panelId Panel ID
* /
function queryImages ( panelId ) {
$ . ajax ( {
url : 'lib/cmd.php' ,
dataType : 'json' ,
data : {
cmd : 'tabdump' ,
tgt : '' ,
args : 'osimage' ,
msg : panelId
} ,
success : configImagePanel
} ) ;
}
/ * *
* Panel to configure OS images
*
* @ param data Data from HTTP request
* /
function configImagePanel ( data ) {
var panelId = data . msg ;
var rsp = data . rsp ;
// Wipe panel clean
$ ( '#' + panelId ) . empty ( ) ;
// Add info bar
$ ( '#' + panelId ) . append ( createInfoBar ( 'Create, edit, and delete operating system images for the self-service portal.' ) ) ;
// Create table
var tableId = panelId + 'Datatable' ;
var table = new DataTable ( tableId ) ;
table . init ( [ '<input type="checkbox" onclick="selectAllCheckbox(event, $(this))">' , 'Name' , 'Selectable' , 'OS Version' , 'OS Arch' , 'OS Name' , 'Type' , 'Profile' , 'Method' , 'Description' ] ) ;
// Insert images into table
var imagePos = 0 ;
var profilePos = 0 ;
var osversPos = 0 ;
var osarchPos = 0 ;
var osnamePos = 0 ;
var imagetypePos = 0 ;
var provMethodPos = 0 ;
var comments = 0 ;
var desc , selectable , tmp ;
// Get column index for each attribute
var colNameArray = rsp [ 0 ] . substr ( 1 ) . split ( ',' ) ;
for ( var i in colNameArray ) {
switch ( colNameArray [ i ] ) {
case 'imagename' : {
imagePos = i ;
}
break ;
case 'profile' : {
profilePos = i ;
}
break ;
case 'osvers' : {
osversPos = i ;
}
break ;
case 'osarch' : {
osarchPos = i ;
}
break ;
case 'osname' : {
osnamePos = i ;
}
break ;
case 'imagetype' : {
imagetypePos = i ;
}
break ;
case 'comments' : {
comments = i ;
}
break ;
case 'provmethod' : {
provMethodPos = i ;
}
break ;
default :
break ;
}
}
// Go through each index
for ( var i = 1 ; i < rsp . length ; i ++ ) {
// Get image name
var cols = rsp [ i ] . split ( ',' ) ;
var name = cols [ imagePos ] . replace ( new RegExp ( '"' , 'g' ) , '' ) ;
var profile = cols [ profilePos ] . replace ( new RegExp ( '"' , 'g' ) , '' ) ;
var provMethod = cols [ provMethodPos ] . replace ( new RegExp ( '"' , 'g' ) , '' ) ;
var osVer = cols [ osversPos ] . replace ( new RegExp ( '"' , 'g' ) , '' ) ;
var osArch = cols [ osarchPos ] . replace ( new RegExp ( '"' , 'g' ) , '' ) ;
var osName = cols [ osnamePos ] . replace ( new RegExp ( '"' , 'g' ) , '' ) ;
var imageType = cols [ imagetypePos ] . replace ( new RegExp ( '"' , 'g' ) , '' ) ;
var osComments = cols [ comments ] . replace ( new RegExp ( '"' , 'g' ) , '' ) ;
// Only save install boot and s390x architectures
if ( osArch == "s390x" ) {
// Set default description and selectable
selectable = "no" ;
desc = "No description" ;
if ( osComments ) {
tmp = osComments . split ( '|' ) ;
for ( var j = 0 ; j < tmp . length ; j ++ ) {
// Save description
if ( tmp [ j ] . indexOf ( 'description:' ) > - 1 ) {
desc = tmp [ j ] . replace ( 'description:' , '' ) ;
desc = jQuery . trim ( desc ) ;
}
// Is the image selectable?
if ( tmp [ j ] . indexOf ( 'selectable:' ) > - 1 ) {
selectable = tmp [ j ] . replace ( 'selectable:' , '' ) ;
selectable = jQuery . trim ( selectable ) ;
}
}
}
// Columns are: name, selectable, OS version, OS arch, OS name, type, profile, method, and description
var cols = new Array ( name , selectable , osVer , osArch , osName , imageType , profile , provMethod , desc ) ;
// Add remove button where id = user name
cols . unshift ( '<input type="checkbox" name="' + name + '"/>' ) ;
// Add row
table . add ( cols ) ;
}
}
// Append datatable to tab
$ ( '#' + panelId ) . append ( table . object ( ) ) ;
// Turn into datatable
$ ( '#' + tableId ) . dataTable ( {
2013-02-05 15:43:57 +00:00
'iDisplayLength' : 50 ,
2012-05-11 13:57:46 +00:00
'bLengthChange' : false ,
2013-02-05 15:43:57 +00:00
"bScrollCollapse" : true ,
"sScrollY" : "400px" ,
"sScrollX" : "110%" ,
"bAutoWidth" : true ,
"oLanguage" : {
"oPaginate" : {
"sNext" : "" ,
"sPrevious" : ""
}
}
2012-05-11 13:57:46 +00:00
} ) ;
// Create action bar
2012-11-06 20:52:55 +00:00
var actionBar = $ ( '<div class="actionBar"></div>' ) . css ( "width" , "400px" ) ;
2012-05-11 13:57:46 +00:00
// Create a profile
var createLnk = $ ( '<a>Create</a>' ) ;
createLnk . click ( function ( ) {
imageDialog ( ) ;
} ) ;
// Edit a profile
var editLnk = $ ( '<a>Edit</a>' ) ;
editLnk . click ( function ( ) {
var images = $ ( '#' + tableId + ' input[type=checkbox]:checked' ) ;
for ( var i in images ) {
var image = images . eq ( i ) . attr ( 'name' ) ;
if ( image ) {
// Columns are: name, selectable, OS version, OS arch, OS name, type, profile, method, and description
var cols = images . eq ( i ) . parents ( 'tr' ) . find ( 'td' ) ;
var selectable = cols . eq ( 2 ) . text ( ) ;
var osVersion = cols . eq ( 3 ) . text ( ) ;
var osArch = cols . eq ( 4 ) . text ( ) ;
var osName = cols . eq ( 5 ) . text ( ) ;
var type = cols . eq ( 6 ) . text ( ) ;
var profile = cols . eq ( 7 ) . text ( ) ;
var method = cols . eq ( 8 ) . text ( ) ;
var description = cols . eq ( 9 ) . text ( ) ;
editImageDialog ( image , selectable , osVersion , osArch , osName , type , profile , method , description ) ;
}
}
} ) ;
// Delete a profile
var deleteLnk = $ ( '<a>Delete</a>' ) ;
deleteLnk . click ( function ( ) {
var images = getNodesChecked ( tableId ) ;
if ( images ) {
deleteImageDialog ( images ) ;
}
} ) ;
// Refresh profiles table
var refreshLnk = $ ( '<a>Refresh</a>' ) ;
refreshLnk . click ( function ( ) {
queryImages ( panelId ) ;
} ) ;
// Create an action menu
2013-05-02 21:24:26 +00:00
var actionsMenu = createMenu ( [ refreshLnk , createLnk , editLnk , deleteLnk ] ) ;
2012-05-11 13:57:46 +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 ) ;
// Resize accordion
$ ( '#' + tableId ) . parents ( '.ui-accordion' ) . accordion ( 'resize' ) ;
}
/ * *
* Open image dialog
* /
function imageDialog ( ) {
// Create form to add profile
var dialogId = 'createImage' ;
var imageForm = $ ( '<div id="' + dialogId + '" class="form"></div>' ) ;
// Create info bar
var info = createInfoBar ( 'Provide the following attributes for the image. The image name will be generated based on the attributes you will give.' ) ;
imageForm . append ( info ) ;
2013-02-11 00:22:33 +00:00
var imageName = $ ( '<div><label>Image name:</label><input type="text" name="imagename" disabled="disabled" title="The name of the image"/></div>' ) ;
var selectable = $ ( '<div><label>Selectable:</label><input type="checkbox" name="selectable" title="Select if you want this image to appear on the self service portal"/></div>' ) ;
var imageType = $ ( '<div><label>Image type:</label><input type="text" name="imagetype" value="linux" title="The type of operating system image this definition represents"/></div>' ) ;
var architecture = $ ( '<div><label>OS architecture:</label><input type="text" name="osarch" title="The hardware architecture of this node. Valid values: x86_64, ppc64, x86, ia64, and s390x."/></div>' ) ;
var osName = $ ( '<div><label>OS name:</label><input type="text" name="osname" value="Linux" title="Operating system name"/></div>' ) ;
var osVersion = $ ( '<div><label>OS version:</label><input type="text" name="osvers" title="The Linux operating system deployed on this node. Valid values: rhel*, centos*, fedora*, and sles* (where * is the version #)."/></div>' ) ;
var profile = $ ( '<div><label>Profile:</label><input type="text" name="profile" title="The node usage category"/></div>' ) ;
2012-05-11 13:57:46 +00:00
var provisionMethod = $ ( '<div><label>Provision method:</label></div>' ) ;
2013-02-11 00:22:33 +00:00
var provisionSelect = $ ( '<select name="provmethod" title="The provisioning method for node deployment">'
2012-05-11 13:57:46 +00:00
+ '<option value=""></option>'
+ '<option value="install">install</option>'
+ '<option value="netboot">netboot</option>'
+ '<option value="statelite">statelite</option>'
+ '</select>' ) ;
provisionMethod . append ( provisionSelect ) ;
2013-02-11 00:22:33 +00:00
var comments = $ ( '<div><label>Description:</label><input type="text" name="comments" title="Any user-written notes"/></div>' ) ;
2012-05-11 13:57:46 +00:00
imageForm . append ( imageName , selectable , imageType , architecture , osName , osVersion , profile , provisionMethod , comments ) ;
2013-02-11 00:22:33 +00:00
// Generate tooltips
imageForm . find ( 'div input[title],textarea[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 ( ) ) ;
}
} ) ;
2012-05-11 13:57:46 +00:00
// Open dialog to add image
imageForm . dialog ( {
title : 'Create image' ,
modal : true ,
close : function ( ) {
$ ( this ) . remove ( ) ;
} ,
width : 400 ,
buttons : {
"Ok" : function ( ) {
// Remove any warning messages
$ ( this ) . find ( '.ui-state-error' ) . remove ( ) ;
// Get image attributes
var imageType = $ ( this ) . find ( 'input[name="imagetype"]' ) ;
var selectable = $ ( this ) . find ( 'input[name="selectable"]' ) ;
var architecture = $ ( this ) . find ( 'input[name="osarch"]' ) ;
var osName = $ ( this ) . find ( 'input[name="osname"]' ) ;
var osVersion = $ ( this ) . find ( 'input[name="osvers"]' ) ;
var profile = $ ( this ) . find ( 'input[name="profile"]' ) ;
var provisionMethod = $ ( this ) . find ( 'select[name="provmethod"]' ) ;
var comments = $ ( this ) . find ( 'input[name="comments"]' ) ;
// Check that image attributes are provided before continuing
var ready = 1 ;
var inputs = new Array ( imageType , architecture , osName , osVersion , profile , provisionMethod ) ;
for ( var i in inputs ) {
if ( ! inputs [ i ] . val ( ) ) {
inputs [ i ] . css ( 'border-color' , 'red' ) ;
ready = 0 ;
} else
inputs [ i ] . css ( 'border-color' , '' ) ;
}
// If inputs are not complete, show warning message
if ( ! ready ) {
var warn = createWarnBar ( 'Please provide a value for each missing field.' ) ;
warn . prependTo ( $ ( this ) ) ;
} else {
// Override image name
$ ( this ) . find ( 'input[name="imagename"]' ) . val ( osVersion . val ( ) + '-' + architecture . val ( ) + '-' + provisionMethod . val ( ) + '-' + profile . val ( ) ) ;
var imageName = $ ( this ) . find ( 'input[name="imagename"]' ) ;
// Change dialog buttons
$ ( this ) . dialog ( 'option' , 'buttons' , {
'Close' : function ( ) { $ ( this ) . dialog ( "close" ) ; }
} ) ;
// Set default description
if ( ! comments . val ( ) )
comments . val ( 'No description' ) ;
// Create arguments to send via AJAX
var args = 'updateosimage;' + imageName . val ( ) + ';' +
imageType . val ( ) + ';' +
architecture . val ( ) + ';' +
osName . val ( ) + ';' +
osVersion . val ( ) + ';' +
profile . val ( ) + ';' +
provisionMethod . val ( ) + ';' ;
if ( selectable . attr ( 'checked' ) )
args += '"description:' + comments . val ( ) + '|selectable:yes"' ;
else
args += '"description:' + comments . val ( ) + '|selectable:no"' ;
// Add image to xCAT
$ . ajax ( {
url : 'lib/cmd.php' ,
dataType : 'json' ,
data : {
cmd : 'webrun' ,
tgt : '' ,
args : args ,
msg : dialogId
} ,
success : updatePanel
} ) ;
}
} ,
"Cancel" : function ( ) {
$ ( this ) . dialog ( "close" ) ;
}
}
} ) ;
}
/ * *
* Edit image dialog
*
* @ param iName Image name
* @ param iSelectable Is image selectable from service page
* @ param iOsVersion OS version
* @ param iProfile Profile name
* @ param iMethod Provisioning method
* @ param iComments Image description
* /
function editImageDialog ( iName , iSelectable , iOsVersion , iOsArch , iOsName , iType , iProfile , iMethod , iComments ) {
2013-02-13 17:24:39 +00:00
var inst = 0 ;
var dialogId = 'editImage' + inst ;
while ( $ ( '#' + dialogId ) . length ) {
// If one already exists, generate another one
inst = inst + 1 ;
dialogId = 'editImage' + inst ;
}
// Create form to add profile
2012-05-11 13:57:46 +00:00
var imageForm = $ ( '<div id="' + dialogId + '" class="form"></div>' ) ;
// Create info bar
var info = createInfoBar ( 'Provide the following attributes for the image. The image name will be generated based on the attributes you will give.' ) ;
imageForm . append ( info ) ;
2013-02-11 00:22:33 +00:00
var imageName = $ ( '<div><label>Image name:</label><input type="text" name="imagename" disabled="disabled" title="The name of the image"/></div>' ) ;
var selectable = $ ( '<div><label>Selectable:</label><input type="checkbox" name="selectable" title="Select if you want this image to appear on the self service portal"/></div>' ) ;
var imageType = $ ( '<div><label>Image type:</label><input type="text" name="imagetype" value="linux" title="The type of operating system image this definition represents"/></div>' ) ;
var architecture = $ ( '<div><label>OS architecture:</label><input type="text" name="osarch" title="The hardware architecture of this node. Valid values: x86_64, ppc64, x86, ia64, and s390x."/></div>' ) ;
var osName = $ ( '<div><label>OS name:</label><input type="text" name="osname" value="Linux" title="Operating system name"/></div>' ) ;
var osVersion = $ ( '<div><label>OS version:</label><input type="text" name="osvers" title="The Linux operating system deployed on this node. Valid values: rhel*, centos*, fedora*, and sles* (where * is the version #)."/></div>' ) ;
var profile = $ ( '<div><label>Profile:</label><input type="text" name="profile" title="The node usage category"/></div>' ) ;
2012-05-11 13:57:46 +00:00
var provisionMethod = $ ( '<div><label>Provision method:</label></div>' ) ;
2013-02-11 00:22:33 +00:00
var provisionSelect = $ ( '<select name="provmethod" title="The provisioning method for node deployment">'
2012-05-11 13:57:46 +00:00
+ '<option value=""></option>'
+ '<option value="install">install</option>'
+ '<option value="netboot">netboot</option>'
+ '<option value="statelite">statelite</option>'
+ '</select>' ) ;
provisionMethod . append ( provisionSelect ) ;
2013-02-11 00:22:33 +00:00
var comments = $ ( '<div><label>Description:</label><input type="text" name="comments" title="Any user-written notes"/></div>' ) ;
2012-05-11 13:57:46 +00:00
imageForm . append ( imageName , selectable , imageType , architecture , osName , osVersion , profile , provisionMethod , comments ) ;
// Fill in image attributes
imageForm . find ( 'input[name="imagename"]' ) . val ( iName ) ;
imageForm . find ( 'input[name="osvers"]' ) . val ( iOsVersion ) ;
imageForm . find ( 'input[name="osarch"]' ) . val ( iOsArch ) ;
imageForm . find ( 'input[name="osname"]' ) . val ( iOsName ) ;
imageForm . find ( 'input[name="imagetype"]' ) . val ( iType ) ;
imageForm . find ( 'input[name="profile"]' ) . val ( iProfile ) ;
imageForm . find ( 'select[name="provmethod"]' ) . val ( iMethod ) ;
imageForm . find ( 'input[name="comments"]' ) . val ( iComments ) ;
if ( iSelectable == "yes" )
imageForm . find ( 'input[name="selectable"]' ) . attr ( 'checked' , 'checked' ) ;
2013-02-11 00:22:33 +00:00
// Generate tooltips
imageForm . find ( 'div input[title],textarea[title],select[title]' ) . tooltip ( {
position : "center right" ,
offset : [ - 2 , 10 ] ,
2013-02-13 17:24:39 +00:00
effect : "toggle" ,
2013-02-11 00:22:33 +00:00
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 ( ) ) ;
}
} ) ;
2012-05-11 13:57:46 +00:00
// Open dialog to add image
imageForm . dialog ( {
title : 'Edit image' ,
modal : true ,
close : function ( ) {
$ ( this ) . remove ( ) ;
} ,
width : 400 ,
buttons : {
"Ok" : function ( ) {
// Remove any warning messages
$ ( this ) . find ( '.ui-state-error' ) . remove ( ) ;
// Get image attributes
var imageType = $ ( this ) . find ( 'input[name="imagetype"]' ) ;
var selectable = $ ( this ) . find ( 'input[name="selectable"]' ) ;
var architecture = $ ( this ) . find ( 'input[name="osarch"]' ) ;
var osName = $ ( this ) . find ( 'input[name="osname"]' ) ;
var osVersion = $ ( this ) . find ( 'input[name="osvers"]' ) ;
var profile = $ ( this ) . find ( 'input[name="profile"]' ) ;
var provisionMethod = $ ( this ) . find ( 'select[name="provmethod"]' ) ;
var comments = $ ( this ) . find ( 'input[name="comments"]' ) ;
// Check that image attributes are provided before continuing
var ready = 1 ;
var inputs = new Array ( imageType , architecture , osName , osVersion , profile , provisionMethod ) ;
for ( var i in inputs ) {
if ( ! inputs [ i ] . val ( ) ) {
inputs [ i ] . css ( 'border-color' , 'red' ) ;
ready = 0 ;
} else
inputs [ i ] . css ( 'border-color' , '' ) ;
}
// If inputs are not complete, show warning message
if ( ! ready ) {
var warn = createWarnBar ( 'Please provide a value for each missing field.' ) ;
warn . prependTo ( $ ( this ) ) ;
} else {
// Override image name
$ ( this ) . find ( 'input[name="imagename"]' ) . val ( osVersion . val ( ) + '-' + architecture . val ( ) + '-' + provisionMethod . val ( ) + '-' + profile . val ( ) ) ;
var imageName = $ ( this ) . find ( 'input[name="imagename"]' ) ;
// Change dialog buttons
$ ( this ) . dialog ( 'option' , 'buttons' , {
'Close' : function ( ) { $ ( this ) . dialog ( "close" ) ; }
} ) ;
// Set default description
if ( ! comments . val ( ) )
comments . val ( 'No description' ) ;
// Create arguments to send via AJAX
var args = 'updateosimage;' + imageName . val ( ) + ';' +
imageType . val ( ) + ';' +
architecture . val ( ) + ';' +
osName . val ( ) + ';' +
osVersion . val ( ) + ';' +
profile . val ( ) + ';' +
provisionMethod . val ( ) + ';' ;
if ( selectable . attr ( 'checked' ) )
args += '"description:' + comments . val ( ) + '|selectable:yes"' ;
else
args += '"description:' + comments . val ( ) + '|selectable:no"' ;
// Add image to xCAT
$ . ajax ( {
url : 'lib/cmd.php' ,
dataType : 'json' ,
data : {
cmd : 'webrun' ,
tgt : '' ,
args : args ,
msg : dialogId
} ,
success : updatePanel
} ) ;
}
} ,
"Cancel" : function ( ) {
$ ( this ) . dialog ( "close" ) ;
}
}
} ) ;
}
/ * *
* Open dialog to confirm image delete
*
* @ param images Images to delete
* /
function deleteImageDialog ( images ) {
// Create form to delete disk to pool
var dialogId = 'deleteImage' ;
var deleteForm = $ ( '<div id="' + dialogId + '" class="form"></div>' ) ;
// Create info bar
var info = createInfoBar ( 'Are you sure you want to delete ' + images . replace ( new RegExp ( ',' , 'g' ) , ', ' ) + '?' ) ;
deleteForm . append ( info ) ;
// Open dialog to delete user
deleteForm . dialog ( {
title : 'Delete image' ,
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 : 'rmosimage;' + images ,
msg : dialogId
} ,
success : updatePanel
} ) ;
} ,
"Cancel" : function ( ) {
$ ( this ) . dialog ( "close" ) ;
}
}
} ) ;
}
/ * *
* Query the groups that exists
*
* @ param panelId Panel ID
* /
function queryGroups ( panelId ) {
$ . ajax ( {
url : 'lib/cmd.php' ,
dataType : 'json' ,
data : {
cmd : 'tabdump' ,
tgt : '' ,
args : 'hosts' ,
msg : panelId
} ,
success : configGroupPanel
} ) ;
}
/ * *
* Panel to configure groups
*
* @ param data Data from HTTP request
* /
function configGroupPanel ( data ) {
var panelId = data . msg ;
var rsp = data . rsp ;
// Wipe panel clean
$ ( '#' + panelId ) . empty ( ) ;
// Add info bar
$ ( '#' + panelId ) . append ( createInfoBar ( 'Create, edit, and delete groups for the self-service portal.' ) ) ;
// Create table
var tableId = panelId + 'Datatable' ;
var table = new DataTable ( tableId ) ;
2013-03-08 17:41:44 +00:00
table . init ( [ '<input type="checkbox" onclick="selectAllCheckbox(event, $(this))">' , 'Name' , 'Selectable' , 'IP' , 'Hostname' , 'Description' ] ) ;
2012-05-11 13:57:46 +00:00
// Insert groups into table
var nodePos = 0 ;
var ipPos = 0 ;
var hostnamePos = 0 ;
var commentsPos = 0 ;
var desc , selectable , tmp ;
// Get column index for each attribute
var colNameArray = rsp [ 0 ] . substr ( 1 ) . split ( ',' ) ;
for ( var i in colNameArray ) {
switch ( colNameArray [ i ] ) {
case 'node' :
nodePos = i ;
break ;
case 'ip' :
ipPos = i ;
break ;
case 'hostnames' :
hostnamePos = i ;
break ;
case 'comments' :
commentsPos = i ;
break ;
default :
break ;
}
}
// Go through each index
for ( var i = 1 ; i < rsp . length ; i ++ ) {
// Get image name
var cols = rsp [ i ] . split ( ',' ) ;
var name = cols [ nodePos ] . replace ( new RegExp ( '"' , 'g' ) , '' ) ;
var ip = cols [ ipPos ] . replace ( new RegExp ( '"' , 'g' ) , '' ) ;
var hostname = cols [ hostnamePos ] . replace ( new RegExp ( '"' , 'g' ) , '' ) ;
var comments = cols [ commentsPos ] . replace ( new RegExp ( '"' , 'g' ) , '' ) ;
// Set default description and selectable
selectable = "no" ;
network = "" ;
desc = "No description" ;
if ( comments ) {
tmp = comments . split ( '|' ) ;
for ( var j = 0 ; j < tmp . length ; j ++ ) {
// Save description
if ( tmp [ j ] . indexOf ( 'description:' ) > - 1 ) {
desc = tmp [ j ] . replace ( 'description:' , '' ) ;
desc = jQuery . trim ( desc ) ;
}
// Is the group selectable?
if ( tmp [ j ] . indexOf ( 'selectable:' ) > - 1 ) {
selectable = tmp [ j ] . replace ( 'selectable:' , '' ) ;
selectable = jQuery . trim ( selectable ) ;
}
}
}
// Columns are: name, selectable, network, and description
2013-03-08 17:41:44 +00:00
var cols = new Array ( name , selectable , ip , hostname , desc ) ;
2012-05-11 13:57:46 +00:00
// Add remove button where id = user name
cols . unshift ( '<input type="checkbox" name="' + name + '"/>' ) ;
// Add row
table . add ( cols ) ;
}
// Append datatable to tab
$ ( '#' + panelId ) . append ( table . object ( ) ) ;
// Turn into datatable
$ ( '#' + tableId ) . dataTable ( {
2013-02-05 15:43:57 +00:00
'iDisplayLength' : 50 ,
2012-05-11 13:57:46 +00:00
'bLengthChange' : false ,
2013-02-05 15:43:57 +00:00
"bScrollCollapse" : true ,
"sScrollY" : "400px" ,
"sScrollX" : "110%" ,
"bAutoWidth" : true ,
"oLanguage" : {
"oPaginate" : {
"sNext" : "" ,
"sPrevious" : ""
}
}
2012-05-11 13:57:46 +00:00
} ) ;
// Create action bar
2012-11-06 20:52:55 +00:00
var actionBar = $ ( '<div class="actionBar"></div>' ) . css ( "width" , "400px" ) ;
2012-05-11 13:57:46 +00:00
// Create a group
var createLnk = $ ( '<a>Create</a>' ) ;
createLnk . click ( function ( ) {
groupDialog ( ) ;
} ) ;
// Edit a group
var editLnk = $ ( '<a>Edit</a>' ) ;
editLnk . click ( function ( ) {
var groups = $ ( '#' + tableId + ' input[type=checkbox]:checked' ) ;
for ( var i in groups ) {
var group = groups . eq ( i ) . attr ( 'name' ) ;
if ( group ) {
// Column order is: name, selectable, network, and description
var cols = groups . eq ( i ) . parents ( 'tr' ) . find ( 'td' ) ;
var selectable = cols . eq ( 2 ) . text ( ) ;
var ip = cols . eq ( 3 ) . text ( ) ;
var hostnames = cols . eq ( 4 ) . text ( ) ;
2013-03-08 17:41:44 +00:00
var description = cols . eq ( 5 ) . text ( ) ;
2012-05-11 13:57:46 +00:00
2013-03-08 17:41:44 +00:00
editGroupDialog ( group , selectable , ip , hostnames , description ) ;
2012-05-11 13:57:46 +00:00
}
}
} ) ;
// Delete a profile
var deleteLnk = $ ( '<a>Delete</a>' ) ;
deleteLnk . click ( function ( ) {
var groups = getNodesChecked ( tableId ) ;
if ( groups ) {
deleteGroupDialog ( groups ) ;
}
} ) ;
// Refresh profiles table
var refreshLnk = $ ( '<a>Refresh</a>' ) ;
refreshLnk . click ( function ( ) {
queryGroups ( panelId ) ;
} ) ;
// Create an action menu
2013-05-02 21:24:26 +00:00
var actionsMenu = createMenu ( [ refreshLnk , createLnk , editLnk , deleteLnk ] ) ;
2012-05-11 13:57:46 +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 ) ;
// Resize accordion
$ ( '#' + tableId ) . parents ( '.ui-accordion' ) . accordion ( 'resize' ) ;
}
/ * *
* Open group dialog
* /
function groupDialog ( ) {
// Create form to add profile
var dialogId = 'createGroup' ;
var groupForm = $ ( '<div id="' + dialogId + '" class="form"></div>' ) ;
// Create info bar
var info = createInfoBar ( 'Provide the following attributes for the group.' ) ;
groupForm . append ( info ) ;
2013-02-11 00:22:33 +00:00
var group = $ ( '<div><label>Group:</label><input type="text" name="group" title="The group name"/></div>' ) ;
var selectable = $ ( '<div><label>Selectable:</label><input type="checkbox" name="selectable" title="Select if you want this group to appear on the self service portal"/></div>' ) ;
var ip = $ ( '<div><label>IP:</label><input type="text" name="ip" title="The IP address of the nodes, usually given as a regular expression, e.g. |ihost(\d+)|10.1.1.($1+0)|"/></div>' ) ;
var hostnames = $ ( '<div><label>Hostnames:</label><input type="text" name="hostnames" title="The hostname of the nodes, usually given as a regular expression, e.g. |(.*)|($1).sourceforge.net|"/></div>' ) ;
var comments = $ ( '<div><label>Description:</label><input type="text" name="comments" title="A description of the group"/></div>' ) ;
2013-03-08 17:41:44 +00:00
var ipPool = $ ( '<div><label style="vertical-align: top;">IP pool:</label><textarea name="ip_pool" title="A pool of node names, IP addresses, and hostnames that can be chosen from for a newly provisioned virtual machine. An entry in the pool could be: ihost12,10.1.2.12,ihost12.endicott.ibm.com. A newline separates each entry."/></div>' ) ;
groupForm . append ( group , selectable , ip , hostnames , comments , ipPool ) ;
2012-05-11 13:57:46 +00:00
2013-02-11 00:22:33 +00:00
// Generate tooltips
groupForm . find ( 'div input[title],textarea[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 ( ) ) ;
}
} ) ;
2012-05-11 13:57:46 +00:00
// Open dialog to add image
groupForm . dialog ( {
title : 'Create group' ,
modal : true ,
close : function ( ) {
$ ( this ) . remove ( ) ;
} ,
2013-03-08 17:41:44 +00:00
width : 600 ,
2012-05-11 13:57:46 +00:00
buttons : {
"Ok" : function ( ) {
// Remove any warning messages
$ ( this ) . find ( '.ui-state-error' ) . remove ( ) ;
// Get group attributes
var group = $ ( this ) . find ( 'input[name="group"]' ) ;
var selectable = $ ( this ) . find ( 'input[name="selectable"]' ) ;
var ip = $ ( this ) . find ( 'input[name="ip"]' ) ;
var hostnames = $ ( this ) . find ( 'input[name="hostnames"]' ) ;
var comments = $ ( this ) . find ( 'input[name="comments"]' ) ;
2013-03-08 17:41:44 +00:00
var ipPool = $ ( this ) . find ( 'textarea[name=ip_pool]' ) . val ( ) ;
2012-05-11 13:57:46 +00:00
// Check that group attributes are provided before continuing
var ready = 1 ;
2013-06-25 14:00:37 +00:00
var inputs = new Array ( group ) ;
2012-05-11 13:57:46 +00:00
for ( var i in inputs ) {
if ( ! inputs [ i ] . val ( ) ) {
inputs [ i ] . css ( 'border-color' , 'red' ) ;
ready = 0 ;
} else
inputs [ i ] . css ( 'border-color' , '' ) ;
}
// If inputs are not complete, show warning message
if ( ! ready ) {
var warn = createWarnBar ( 'Please provide a value for each missing field.' ) ;
warn . prependTo ( $ ( this ) ) ;
} else {
// Change dialog buttons
$ ( this ) . dialog ( 'option' , 'buttons' , {
'Close' : function ( ) { $ ( this ) . dialog ( "close" ) ; }
} ) ;
2013-03-08 17:41:44 +00:00
// A newline at the end of IP pool is needed
ipPool = ipPool . replace ( /^\s+|\s+$/g , '' ) ;
ipPool += '\n' ;
2012-05-11 13:57:46 +00:00
// Set default description
if ( ! comments . val ( ) )
comments . val ( 'No description' ) ;
// Create arguments to send via AJAX
var args = "updategroup;" + group . val ( ) + ";'" + ip . val ( ) + "';'" + hostnames . val ( ) + "';" ;
if ( selectable . attr ( "checked" ) )
2013-03-08 17:41:44 +00:00
args += "'description:" + comments . val ( ) + "|selectable:yes" ;
2012-05-11 13:57:46 +00:00
else
2013-03-08 17:41:44 +00:00
args += "'description:" + comments . val ( ) + "|selectable:no" ;
2012-05-11 13:57:46 +00:00
// Add image to xCAT
2013-03-08 17:41:44 +00:00
$ . ajax ( {
2012-05-11 13:57:46 +00:00
url : 'lib/cmd.php' ,
dataType : 'json' ,
data : {
cmd : 'webrun' ,
tgt : '' ,
args : args ,
msg : dialogId
} ,
success : updatePanel
} ) ;
2013-03-08 17:41:44 +00:00
// Write IP pool file to /var/tmp
$ . ajax ( {
url : 'lib/cmd.php' ,
dataType : 'json' ,
data : {
cmd : 'write' ,
tgt : '/var/tmp/' + group . val ( ) + '.pool' ,
args : '' ,
cont : ipPool ,
msg : dialogId + ';' + group . val ( )
} ,
success : function ( data ) {
var args = data . msg . split ( ';' ) ;
// Create profile in xCAT
$ . ajax ( {
url : 'lib/cmd.php' ,
dataType : 'json' ,
data : {
cmd : 'webrun' ,
tgt : '' ,
args : 'mkippool;' + args [ 1 ] ,
msg : args [ 0 ]
} ,
success : updatePanel
} ) ;
}
} ) ;
2012-05-11 13:57:46 +00:00
}
} ,
"Cancel" : function ( ) {
$ ( this ) . dialog ( "close" ) ;
}
}
} ) ;
}
/ * *
* Edit group dialog
*
* @ param iGroup Group name
* @ param iSelectable Is group selectable from the service page
* @ param iIp Group IP regex
* @ param iHostnames Group hostnames regex
* @ param iComments Group description
* /
2013-03-08 17:41:44 +00:00
function editGroupDialog ( iGroup , iSelectable , iIp , iHostnames , iComments ) {
2012-05-11 13:57:46 +00:00
// Create form to add profile
2013-02-13 17:24:39 +00:00
var dialogId = 'createGroup-' + iGroup ;
2012-05-11 13:57:46 +00:00
var groupForm = $ ( '<div id="' + dialogId + '" class="form"></div>' ) ;
// Create info bar
var info = createInfoBar ( 'Provide the following attributes for the group.' ) ;
groupForm . append ( info ) ;
2013-02-11 00:22:33 +00:00
var group = $ ( '<div><label>Group:</label><input type="text" name="group" title="The group name"/></div>' ) ;
var selectable = $ ( '<div><label>Selectable:</label><input type="checkbox" name="selectable" title="Select if you want this group to appear on the self service portal"/></div>' ) ;
var ip = $ ( '<div><label>IP:</label><input type="text" name="ip" title="The IP address for the group, usually given as a regular expression, e.g. |ihost(\d+)|10.1.1.($1+0)|"/></div>' ) ;
var hostnames = $ ( '<div><label>Hostnames:</label><input type="text" name="hostnames" title="The hostname for the group, usually given as a regular expression, e.g. |(.*)|($1).sourceforge.net|"/></div>' ) ;
var comments = $ ( '<div><label>Description:</label><input type="text" name="comments" title="A description of the group"/></div>' ) ;
2013-03-08 17:41:44 +00:00
var ipPool = $ ( '<div><label style="vertical-align: top;">IP pool:</label><textarea name="ip_pool" title="A pool of node names, IP addresses, and hostnames that can be chosen from for a newly provisioned virtual machine."/></div>' ) ;
groupForm . append ( group , selectable , ip , hostnames , comments , ipPool ) ;
// Query IP pool based on group name
$ . ajax ( {
url : 'lib/cmd.php' ,
dataType : 'json' ,
data : {
cmd : 'webrun' ,
tgt : '' ,
args : 'lsippool;' + iGroup ,
msg : dialogId
} ,
success : function ( data ) {
// Populate textarea with IP pool entries
$ ( '#' + data . msg ) . find ( 'textarea[name="ip_pool"]' ) . val ( data . rsp [ 0 ] ) ;
}
} ) ;
2012-05-11 13:57:46 +00:00
// Fill in group attributes
groupForm . find ( 'input[name="group"]' ) . val ( iGroup ) ;
groupForm . find ( 'input[name="ip"]' ) . val ( iIp ) ;
groupForm . find ( 'input[name="hostnames"]' ) . val ( iHostnames ) ;
groupForm . find ( 'input[name="comments"]' ) . val ( iComments ) ;
if ( iSelectable == "yes" )
groupForm . find ( 'input[name="selectable"]' ) . attr ( 'checked' , 'checked' ) ;
2013-02-11 00:22:33 +00:00
// Generate tooltips
groupForm . find ( 'div input[title],textarea[title],select[title]' ) . tooltip ( {
position : "center right" ,
offset : [ - 2 , 10 ] ,
2013-02-13 17:24:39 +00:00
effect : "toggle" ,
2013-02-11 00:22:33 +00:00
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 ( ) ) ;
}
} ) ;
2012-05-11 13:57:46 +00:00
// Open dialog to add image
groupForm . dialog ( {
title : 'Edit group' ,
modal : true ,
close : function ( ) {
$ ( this ) . remove ( ) ;
} ,
2013-03-08 17:41:44 +00:00
width : 600 ,
2012-05-11 13:57:46 +00:00
buttons : {
"Ok" : function ( ) {
// Remove any warning messages
$ ( this ) . find ( '.ui-state-error' ) . remove ( ) ;
// Get group attributes
var group = $ ( this ) . find ( 'input[name="group"]' ) ;
var selectable = $ ( this ) . find ( 'input[name="selectable"]' ) ;
var ip = $ ( this ) . find ( 'input[name="ip"]' ) ;
var hostnames = $ ( this ) . find ( 'input[name="hostnames"]' ) ;
var comments = $ ( this ) . find ( 'input[name="comments"]' ) ;
2013-03-08 17:41:44 +00:00
var ipPool = $ ( this ) . find ( 'textarea[name=ip_pool]' ) . val ( ) ;
2012-05-11 13:57:46 +00:00
// Check that group attributes are provided before continuing
var ready = 1 ;
2013-05-15 14:20:55 +00:00
var inputs = new Array ( group ) ;
2012-05-11 13:57:46 +00:00
for ( var i in inputs ) {
if ( ! inputs [ i ] . val ( ) ) {
inputs [ i ] . css ( 'border-color' , 'red' ) ;
ready = 0 ;
} else
inputs [ i ] . css ( 'border-color' , '' ) ;
}
// If inputs are not complete, show warning message
if ( ! ready ) {
var warn = createWarnBar ( 'Please provide a value for each missing field.' ) ;
warn . prependTo ( $ ( this ) ) ;
} else {
// Change dialog buttons
$ ( this ) . dialog ( 'option' , 'buttons' , {
'Close' : function ( ) { $ ( this ) . dialog ( "close" ) ; }
} ) ;
2013-03-08 17:41:44 +00:00
// A newline at the end of IP pool is needed
ipPool = ipPool . replace ( /^\s+|\s+$/g , '' ) ;
ipPool += '\n' ;
2012-05-11 13:57:46 +00:00
// Set default description
if ( ! comments . val ( ) )
comments . val ( 'No description' ) ;
// Create arguments to send via AJAX
var args = "updategroup;" + group . val ( ) + ";'" + ip . val ( ) + "';'" + hostnames . val ( ) + "';" ;
if ( selectable . attr ( "checked" ) )
2013-03-08 17:41:44 +00:00
args += "'description:" + comments . val ( ) + "|selectable:yes" ;
2012-05-11 13:57:46 +00:00
else
2013-03-08 17:41:44 +00:00
args += "'description:" + comments . val ( ) + "|selectable:no" ;
2012-05-11 13:57:46 +00:00
// Add image to xCAT
$ . ajax ( {
url : 'lib/cmd.php' ,
dataType : 'json' ,
data : {
cmd : 'webrun' ,
tgt : '' ,
args : args ,
msg : dialogId
} ,
success : updatePanel
} ) ;
2013-03-08 17:41:44 +00:00
// Write IP pool file to /var/tmp
$ . ajax ( {
url : 'lib/cmd.php' ,
dataType : 'json' ,
data : {
cmd : 'write' ,
tgt : '/var/tmp/' + group . val ( ) + '.pool' ,
args : '' ,
cont : ipPool ,
msg : dialogId + ';' + group . val ( )
} ,
success : function ( data ) {
var args = data . msg . split ( ';' ) ;
// Create profile in xCAT
$ . ajax ( {
url : 'lib/cmd.php' ,
dataType : 'json' ,
data : {
cmd : 'webrun' ,
tgt : '' ,
args : 'mkippool;' + args [ 1 ] ,
msg : args [ 0 ]
} ,
success : updatePanel
} ) ;
}
} ) ;
2012-05-11 13:57:46 +00:00
}
} ,
"Cancel" : function ( ) {
$ ( this ) . dialog ( "close" ) ;
}
}
} ) ;
}
/ * *
* Open dialog to confirm group delete
*
* @ param groups Groups to delete
* /
function deleteGroupDialog ( groups ) {
// Create form to delete disk to pool
var dialogId = 'deleteImage' ;
var deleteForm = $ ( '<div id="' + dialogId + '" class="form"></div>' ) ;
// Create info bar
var info = createInfoBar ( 'Are you sure you want to delete ' + groups . replace ( new RegExp ( ',' , 'g' ) , ', ' ) + '?' ) ;
deleteForm . append ( info ) ;
// Open dialog to delete user
deleteForm . dialog ( {
title : 'Delete group' ,
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 : 'rmgroup;' + groups ,
msg : dialogId
} ,
success : updatePanel
} ) ;
} ,
"Cancel" : function ( ) {
$ ( this ) . dialog ( "close" ) ;
}
}
} ) ;
2012-04-11 19:59:16 +00:00
}