\n";
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn submitEditMgmtnode()
///
/// \brief submits changes to management node and notifies user
///
////////////////////////////////////////////////////////////////////////////////
function submitEditMgmtnode() {
$data = processMgmtnodeInput(0);
updateMgmtnode($data);
viewMgmtnodes();
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn submitAddMgmtnode()
///
/// \brief processes form to add the management node
///
////////////////////////////////////////////////////////////////////////////////
function submitAddMgmtnode() {
$data = processMgmtnodeInput(0);
addMgmtnode($data);
clearPrivCache();
viewMgmtnodes();
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn confirmDeleteMgmtnode()
///
/// \brief prints a page confirming deletion of a management node
///
////////////////////////////////////////////////////////////////////////////////
function confirmDeleteMgmtnode() {
$mgmtnodeid = getContinuationVar("mgmtnodeid");
$nodes = getManagementNodes();
print "
\n";
print "
Delete Management Node
\n";
print "Delete the following management node?
\n";
print "
\n";
print " \n";
print " Hostname: | \n";
print " {$nodes[$mgmtnodeid]['hostname']} | \n";
print "
\n";
print " \n";
print " IP address: | \n";
print " {$nodes[$mgmtnodeid]['IPaddress']} | \n";
print "
\n";
print " \n";
print " Owner: | \n";
print " {$nodes[$mgmtnodeid]['owner']} | \n";
print "
\n";
print "
\n";
print "
\n";
print " \n";
print " \n";
print " \n";
print " | \n";
print " \n";
print " \n";
print " | \n";
print "
\n";
print "
\n";
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn submitDeleteMgmtnode()
///
/// \brief deletes a management node and calls viewMgmtnodes
///
////////////////////////////////////////////////////////////////////////////////
function submitDeleteMgmtnode() {
$mgmtnodeid = getContinuationVar("mgmtnodeid");
doQuery("DELETE FROM managementnode WHERE id = $mgmtnodeid", 385);
doQuery("DELETE FROM resource WHERE resourcetypeid = 16 AND subid = $mgmtnodeid", 385);
$_SESSION['userresources'] = array();
$_SESSION['usersessiondata'] = array();
viewMgmtnodes();
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn viewMgmtnodeGrouping()
///
/// \brief prints a page to view and modify management node grouping
///
////////////////////////////////////////////////////////////////////////////////
function viewMgmtnodeGrouping() {
global $mode;
$mgmtnodemembership = getResourceGroupMemberships("managementnode");
$resources = getUserResources(array("mgmtNodeAdmin"),
array("manageGroup"));
$tmp = getUserResources(array("mgmtNodeAdmin"),
array("manageGroup"), 1);
$mgmtnodegroups = $tmp["managementnode"];
uasort($mgmtnodegroups, "sortKeepIndex");
uasort($resources["managementnode"], "sortKeepIndex");
if(count($resources["managementnode"])) {
print "
Management Node Grouping
\n";
if($mode == "submitMgmtnodeGroups") {
print "
Management Node groups successfully updated";
print "\n";
}
print "
\n";
}
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn submitMgmtnodeGroups
///
/// \brief updates image groupings
///
////////////////////////////////////////////////////////////////////////////////
function submitMgmtnodeGroups() {
$groupinput = processInputVar("mgmtnodegroup", ARG_MULTINUMERIC);
$mgmtnodes = getManagementNodes();
# build an array of memberships currently in the db
$tmp = getUserResources(array("groupAdmin"), array("manageGroup"), 1);
$mgmtnodegroupsIDs = array_keys($tmp["managementnode"]); // ids of groups that user can manage
$resources = getUserResources(array("mgmtNodeAdmin"),
array("manageGroup"));
$userMgmtnodeIDs = array_keys($resources["managementnode"]); // ids of images that user can manage
$mgmtnodemembership = getResourceGroupMemberships("managementnode");
$basemgmtnodegroups = $mgmtnodemembership["managementnode"]; // all image group memberships
$mgmtnodegroups = array();
foreach(array_keys($basemgmtnodegroups) as $mgmtnodeid) {
if(in_array($mgmtnodeid, $userMgmtnodeIDs)) {
foreach($basemgmtnodegroups[$mgmtnodeid] as $grpid) {
if(in_array($grpid, $mgmtnodegroupsIDs)) {
if(array_key_exists($mgmtnodeid, $mgmtnodegroups))
array_push($mgmtnodegroups[$mgmtnodeid], $grpid);
else
$mgmtnodegroups[$mgmtnodeid] = array($grpid);
}
}
}
}
# build an array of posted in memberships
$newmembers = array();
foreach(array_keys($groupinput) as $key) {
list($mgmtnodeid, $grpid) = explode(':', $key);
if(array_key_exists($mgmtnodeid, $newmembers)) {
array_push($newmembers[$mgmtnodeid], $grpid);
}
else {
$newmembers[$mgmtnodeid] = array($grpid);
}
}
$adds = array();
$removes = array();
foreach(array_keys($mgmtnodes) as $mgmtnodeid) {
$id = $mgmtnodes[$mgmtnodeid]["resourceid"];
// if $mgmtnodeid not in $userMgmtnodeIds, don't bother with it
if(! in_array($mgmtnodeid, $userMgmtnodeIDs))
continue;
// if $mgmtnodeid is not in $newmembers and not in $mgmtnodegroups, do nothing
if(! array_key_exists($mgmtnodeid, $newmembers) &&
! array_key_exists($mgmtnodeid, $mgmtnodegroups)) {
continue;
}
// check that $mgmtnodeid is in $newmembers, if not, remove it from all groups
// user has access to
if(! array_key_exists($mgmtnodeid, $newmembers)) {
$removes[$id] = $mgmtnodegroups[$mgmtnodeid];
continue;
}
// check that $mgmtnodeid is in $mgmtnodegroups, if not, add all groups in
// $newmembers
if(! array_key_exists($mgmtnodeid, $mgmtnodegroups)) {
$adds[$id] = $newmembers[$mgmtnodeid];
continue;
}
// adds are groupids that are in $newmembers, but not in $mgmtnodegroups
$adds[$id] = array_diff($newmembers[$mgmtnodeid], $mgmtnodegroups[$mgmtnodeid]);
if(count($adds[$id]) == 0) {
unset($adds[$id]);
}
// removes are groupids that are in $mgmtnodegroups, but not in $newmembers
$removes[$id] = array_diff($mgmtnodegroups[$mgmtnodeid], $newmembers[$mgmtnodeid]);
if(count($removes[$id]) == 0) {
unset($removes[$id]);
}
}
foreach(array_keys($adds) as $mgmtnodeid) {
foreach($adds[$mgmtnodeid] as $grpid) {
$query = "INSERT INTO resourcegroupmembers "
. "(resourceid, resourcegroupid) "
. "VALUES ($mgmtnodeid, $grpid)";
doQuery($query, 287);
}
}
foreach(array_keys($removes) as $mgmtnodeid) {
foreach($removes[$mgmtnodeid] as $grpid) {
$query = "DELETE FROM resourcegroupmembers "
. "WHERE resourceid = $mgmtnodeid AND "
. "resourcegroupid = $grpid";
doQuery($query, 288);
}
}
viewMgmtnodeGrouping();
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn viewMgmtnodeMapping($mngroups)
///
/// \param $mngroups - (optional) array of mngroups as returned by
/// getUserResources
///
/// \brief prints a page to view and edit management node to computer group
/// mappings
///
////////////////////////////////////////////////////////////////////////////////
function viewMgmtnodeMapping($mngroups=0) {
global $mode;
if(! is_array($mngroups)) {
$tmp = getUserResources(array("mgmtNodeAdmin"),
array("manageGroup"), 1);
$mngroups = $tmp["managementnode"];
}
$mapping = getResourceMapping("managementnode", "computer");
$resources2 = getUserResources(array("computerAdmin"),
array("manageGroup"), 1);
$compgroups = $resources2["computer"];
uasort($compgroups, "sortKeepIndex");
if(count($mngroups) && count($compgroups)) {
print "
Management Node Group to Computer Group Mapping
\n";
if($mode == "submitMgmtnodeMapping") {
print "
Management node group to computer ";
print "group mapping successfully updated";
print "\n";
}
print "
\n";
}
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn submitMgmtnodeMapping
///
/// \brief updates management node group to computer group mapping
///
////////////////////////////////////////////////////////////////////////////////
function submitMgmtnodeMapping() {
$mapinput = processInputVar("mapping", ARG_MULTINUMERIC);
$mntypeid = getResourceTypeID("managementnode");
$comptypeid = getResourceTypeID("computer");
# build an array of memberships currently in the db
$tmp = getUserResources(array("mgmtNodeAdmin"),
array("manageGroup"), 1);
$mngroups = $tmp["managementnode"];
$tmp = getUserResources(array("computerAdmin"),
array("manageGroup"), 1);
$compgroups = $tmp["computer"];
$mninlist = implode(',', array_keys($mngroups));
$compinlist = implode(',', array_keys($compgroups));
$mapping = getResourceMapping("managementnode", "computer", $mninlist,
$compinlist);
# build an array of posted in memberships
$newmembers = array();
foreach(array_keys($mapinput) as $key) {
list($mnid, $compid) = explode(':', $key);
if(array_key_exists($mnid, $newmembers))
array_push($newmembers[$mnid], $compid);
else
$newmembers[$mnid] = array($compid);
}
$adds = array();
$removes = array();
foreach(array_keys($mngroups) as $mnid) {
// if $mnid is not in $newmembers and not in $mapping, do nothing
if(! array_key_exists($mnid, $newmembers) &&
! array_key_exists($mnid, $mapping)) {
continue;
}
// check that $mnid is in $newmembers, if not, remove it from all groups
// user has access to
if(! array_key_exists($mnid, $newmembers)) {
$removes[$mnid] = $mapping[$mnid];
continue;
}
// check that $mnid is in $mapping, if not, add all groups in
// $newmembers
if(! array_key_exists($mnid, $mapping)) {
$adds[$mnid] = $newmembers[$mnid];
continue;
}
// adds are groupids that are in $newmembers, but not in $mapping
$adds[$mnid] = array_diff($newmembers[$mnid], $mapping[$mnid]);
if(count($adds[$mnid]) == 0) {
unset($adds[$mnid]);
}
// removes are groupids that are in $mapping, but not in $newmembers
$removes[$mnid] = array_diff($mapping[$mnid], $newmembers[$mnid]);
if(count($removes[$mnid]) == 0) {
unset($removes[$mnid]);
}
}
foreach(array_keys($adds) as $mnid) {
foreach($adds[$mnid] as $compid) {
$query = "INSERT INTO resourcemap "
. "(resourcegroupid1, "
. "resourcetypeid1, "
. "resourcegroupid2, "
. "resourcetypeid2) "
. "VALUES ($mnid, "
. "$mntypeid, "
. "$compid, "
. "$comptypeid)";
doQuery($query, 101);
}
}
foreach(array_keys($removes) as $mnid) {
foreach($removes[$mnid] as $compid) {
$query = "DELETE FROM resourcemap "
. "WHERE resourcegroupid1 = $mnid AND "
. "resourcetypeid1 = $mntypeid AND "
. "resourcegroupid2 = $compid AND "
. "resourcetypeid2 = $comptypeid";
doQuery($query, 101);
}
}
viewMgmtnodeMapping();
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn updateMgmtnode($data)
///
/// \param $data - an array returned from processMgmtnodeInput
///
/// \return number of rows affected by the update\n
/// \b NOTE: mysql reports that no rows were affected if none of the fields
/// were actually changed even if the update matched a row
///
/// \brief performs a query to update the management node with data from $data
///
////////////////////////////////////////////////////////////////////////////////
function updateMgmtnode($data) {
$ownerid = getUserlistID($data["owner"]);
$query = "UPDATE managementnode "
. "SET hostname = '{$data["hostname"]}', "
. "IPaddress = '{$data["IPaddress"]}', "
. "ownerid = $ownerid, "
. "stateid = {$data["stateid"]}, "
. "predictivemoduleid = {$data["premoduleid"]} "
. "WHERE id = " . $data["mgmtnodeid"];
$qh = doQuery($query, 101);
return mysql_affected_rows($GLOBALS["mysql_link_vcl"]);
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn addMgmtnode($data)
///
/// \param $data - an array returned from processMgmtnodeInput
///
/// \return number of rows affected by the insert\n
///
/// \brief performs a query to insert the management node with data from $data
///
////////////////////////////////////////////////////////////////////////////////
function addMgmtnode($data) {
$ownerid = getUserlistID($data["owner"]);
$query = "INSERT INTO managementnode "
. "(hostname, "
. "IPaddress, "
. "ownerid, "
. "stateid, "
. "predictivemoduleid) "
. "VALUES ('{$data["hostname"]}', "
. "'{$data["IPaddress"]}', "
. "$ownerid, "
. "{$data["stateid"]}, "
. "{$data["premoduleid"]})";
doQuery($query, 205);
// get last insert id
$qh = doQuery("SELECT LAST_INSERT_ID() FROM managementnode", 101);
if(! $row = mysql_fetch_row($qh)) {
abort(101);
}
$id = $row[0];
// add entry in resource table
$query = "INSERT INTO resource "
. "(resourcetypeid, "
. "subid) "
. "VALUES (16, "
. "$id)";
doQuery($query, 209);
return $id;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn processMgmtnodeInput($checks)
///
/// \param $checks - (optional) 1 to perform validation, 0 not to
///
/// \return an array with the following indexes:\n
/// mgmtnodeid, hostname, IPaddress, owner, stateid
///
/// \brief validates input from the previous form; if anything was improperly
/// submitted, sets submitErr and submitErrMsg
///
////////////////////////////////////////////////////////////////////////////////
function processMgmtnodeInput($checks=1) {
global $submitErr, $submitErrMsg, $user, $mode;
$return = array();
$mgmtnodes = getManagementNodes();
$return["mgmtnodeid"] = getContinuationVar("mgmtnodeid");
$return["hostname"] = getContinuationVar("hostname", processInputVar("hostname" , ARG_STRING));
$return["IPaddress"] = getContinuationVar("IPaddress", processInputVar("IPaddress", ARG_STRING));
$return["owner"] = getContinuationVar("owner", processInputVar("owner", ARG_STRING, $user["unityid"]));
$return["stateid"] = getContinuationVar("stateid", processInputVar("stateid", ARG_STRING));
$return["premoduleid"] = getContinuationVar("premoduleid", processInputVar("premoduleid", ARG_NUMERIC));
if(! $checks) {
return $return;
}
if(! ereg('^[a-zA-Z0-9_][-a-zA-Z0-9_.]{1,49}$', $return["hostname"])) {
$submitErr |= MNHOSTNAMEERR;
$submitErrMsg[MNHOSTNAMEERR] = "Hostname must be <= 50 characters";
}
if(! ($submitErr & MNHOSTNAMEERR) &&
$mode != "confirmEditMgmtnode" &&
checkForMgmtnodeHostname($return["hostname"])) {
$submitErr |= MNHOSTNAMEERR;
$submitErrMsg[MNHOSTNAMEERR] = "A node already exists with this hostname.";
}
$ipaddrArr = explode('.', $return["IPaddress"]);
if(! ereg('^(([0-9]){1,3}\.){3}([0-9]){1,3}$', $return["IPaddress"]) ||
$ipaddrArr[0] < 1 || $ipaddrArr[0] > 255 ||
$ipaddrArr[1] < 0 || $ipaddrArr[1] > 255 ||
$ipaddrArr[2] < 0 || $ipaddrArr[2] > 255 ||
$ipaddrArr[3] < 1 || $ipaddrArr[3] > 255) {
$submitErr |= IPADDRESSERR;
$submitErrMsg[IPADDRESSERR] = "Invalid IP address. Must be w.x.y.z with each of "
. "w, x, y, and z being between 1 and 255 (inclusive)";
}
if($mode != "confirmEditMgmtnode" &&
! ($submitErr & IPADDRESSERR) &&
checkForMgmtnodeIPaddress($return["IPaddress"])) {
$submitErr |= IPADDRESSERR;
$submitErrMsg[IPADDRESSERR] = "A node already exists with this IP address.";
}
if(! validateUserid($return["owner"])) {
$submitErr |= MNOWNERERR;
$submitErrMsg[MNOWNERERR] = "Submitted ID is not valid";
}
return $return;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn checkForMgmtnodeHostname($hostname)
///
/// \param $hostname - a computer hostname
///
/// \return 0 if $hostname is not in managementnode table, 1 if it is
///
/// \brief checks for the existance of $hostname in the managementnode table
///
////////////////////////////////////////////////////////////////////////////////
function checkForMgmtnodeHostname($hostname) {
$query = "SELECT id FROM managementnode WHERE hostname = '$hostname'";
$qh = doQuery($query, 101);
return mysql_num_rows($qh);
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn checkForMgmtnodeIPaddress($addr)
///
/// \param $addr - a computer ip address
///
/// \return 0 if $addr is not in managementnode table, 1 if it is
///
/// \brief checks for the existance of $addr in the managementnode table
///
////////////////////////////////////////////////////////////////////////////////
function checkForMgmtnodeIPaddress($addr) {
$query = "SELECT id FROM managementnode WHERE IPaddress = '$addr'";
$qh = doQuery($query, 101);
return mysql_num_rows($qh);
}
?>