restype = 'config';
$this->restypename = 'Config';
$this->namefield = 'name';
$this->defaultGetDataArgs = array('rscid' => 0,
'includedeleted' => 0);
$this->basecdata['obj'] = $this;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn
///
/// \brief Config
///
////////////////////////////////////////////////////////////////////////////////
function getData($args) {
return $this->_getData($args['rscid'], $args['includedeleted']);
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn
///
/// \brief Config
///
////////////////////////////////////////////////////////////////////////////////
function _getData($id=0, $includedeleted=0) {
# config variables
$query = "SELECT cv.id, "
. "cv.name, "
. "cv.configid, "
. "cv.defaultvalue, "
. "cv.required, "
. "cv.ask, "
. "cv.identifier, "
. "cv.datatypeid, "
. "0 AS deleted, "
. "d.name AS datatype "
. "FROM configvariable cv, "
. "datatype d "
. "WHERE cv.datatypeid = d.id ";
if($id != 0)
$query .= "AND cv.configid = $id ";
$query .= "ORDER BY cv.configid, cv.name";
$variables = array();
$qh = doQuery($query);
while($row = mysql_fetch_assoc($qh))
$variables[$row['configid']][$row['id']] = $row;
# config subimages
$query = "SELECT s.id, "
. "s.configid, "
. "s.imageid, "
. "i.prettyname AS name, "
. "s.mininstance AS min, "
. "s.maxinstance AS max, "
. "s.description, "
. "0 AS deleted "
. "FROM configsubimage s, "
. "image i "
. "WHERE s.imageid = i.id AND "
. "i.deleted = 0 ";
if($id != 0)
$query .= "AND configid = $id ";
$query .= "ORDER BY s.configid, i.prettyname";
$qh = doQuery($query);
while($row = mysql_fetch_assoc($qh))
$variables[$row['configid']][$row['id']] = $row;
# configs
$query = "SELECT c.id, "
. "c.name, "
. "c.description AS description, "
. "c.configtypeid, "
. "ct.prettyname AS configtype, "
. "ct.configstageid AS configstageid, "
. "cs.name AS stage, "
. "c.data, "
. "c.ownerid, "
. "CONCAT(u.unityid, '@', a.name) AS owner, "
. "c.optional, "
. "c.deleted, "
. "r.id AS resourceid "
. "FROM config c, "
. "resource r, "
. "resourcetype t, "
. "user u, "
. "affiliation a, "
. "configtype ct "
. "LEFT JOIN configstage cs ON (ct.configstageid = cs.id) "
. "WHERE c.configtypeid = ct.id AND "
. "c.ownerid = u.id AND "
. "u.affiliationid = a.id AND "
. "c.id = r.subid AND "
. "r.resourcetypeid = t.id AND "
. "t.name = 'config'";
if($id != 0)
$query .= " AND c.id = $id";
if(! $includedeleted)
$query .= " AND c.deleted = 0";
$qh = doQuery($query);
$configs = array();
while($row = mysql_fetch_assoc($qh)) {
if(array_key_exists($row['id'], $variables))
$row['variables'] = $variables[$row['id']];
else
$row['variables'] = array();
$configs[$row['id']] = $row;
}
return $configs;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn
///
/// \brief Config
///
////////////////////////////////////////////////////////////////////////////////
function getConfigMapData($configmapid) {
$query = "SELECT cm.configid, "
. "c.name AS configname, "
. "ct.prettyname AS configtype, "
. "cm.subid, "
. "cm.configmaptypeid, "
. "cmt.name AS configmaptype, "
. "cmt.prettyname AS prettyconfigmaptype, "
. "cm.affiliationid, "
. "a.name AS affiliation, "
. "cm.disabled, "
. "cm.configstageid AS stageid, "
. "cs.name AS stage "
. "FROM configmaptype cmt, "
. "config c, "
. "affiliation a, "
. "configstage cs, "
. "configtype ct, "
. "configmap cm "
. "WHERE cm.configmaptypeid = cmt.id AND "
. "cm.affiliationid = a.id AND "
. "cm.configstageid = cs.id AND "
. "cm.id = $configmapid AND "
. "cm.configid = c.id AND "
. "c.configtypeid = ct.id AND "
. "c.deleted = 0";
$qh = doQuery($query);
if($row = mysql_fetch_assoc($qh))
return $row;
else
return NULL;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn
///
/// \brief Config
///
////////////////////////////////////////////////////////////////////////////////
function extraSelectAdminOptions() {
$h = '';
$cont = addContinuationsEntry("editConfigMap", $this->basecdata);
$h .= "
\n";
return $h;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn
///
/// \brief Config
///
////////////////////////////////////////////////////////////////////////////////
function AJeditResource() {
# TODO see if base AJeditResource will work
$configid = processInputVar('rscid', ARG_NUMERIC);
$configs = getUserResources(array("configAdmin"), array('administer'), 0, 1);
if(! array_key_exists($configid, $configs['config'])) {
$ret = array('status' => 'noaccess');
sendJSON($ret);
return;
}
$tmp = $this->_getData($configid);
$data = $tmp[$configid];
$data['variables'] = array_splice($data['variables'], 0);
$cdata = $this->basecdata;
$cdata['configid'] = $configid;
$cdata['configdata'] = $data;
$cont = addContinuationsEntry('AJsaveResource', $cdata);
# TODO SECURITY - is there a chance of an XSS attack from value of data
#$data['data'] = htmlspecialchars($data['data']);
$ret = array('title' => "Edit {$this->restypename}",
'cont' => $cont,
'resid' => $configid,
'data' => $data,
'status' => 'success');
sendJSON($ret);
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn
///
/// \brief Config
///
////////////////////////////////////////////////////////////////////////////////
function AJsaveResource() {
$curdata = getContinuationVar('configdata');
$add = getContinuationVar('add', 0);
if($add)
$configid = 0;
else
$configid = $curdata['id'];
if(! $vars = $this->processInput($configid)) {
sendJSON(array('status' => 'error', 'msg' => $this->errmsg));
return;
}
if($add) {
$this->addResource($vars);
return;
}
$sets = array();
if($curdata['name'] != $vars['name']) {
$name = mysql_real_escape_string($vars['name']);
$sets[] = "name = '$name'";
}
if($curdata['data'] != $vars['data']) {
$data = mysql_real_escape_string($vars['data']);
$sets[] = "data = '$data'";
}
if($curdata['ownerid'] != $vars['ownerid'])
$sets[] = "ownerid = {$vars['ownerid']}";
if($curdata['optional'] != $vars['optional'])
$sets[] = "optional = {$vars['optional']}";
if(count($sets)) {
$allsets = implode(',', $sets);
$query = "UPDATE config SET $allsets WHERE id = $configid";
doQuery($query);
}
if($curdata['configtype'] == 'Cluster') {
$cursubs = $curdata['variables'];
$newsubs = $vars['subimages'];
$dels = array();
foreach($cursubs as $sub) {
$id = $sub['id'];
if($newsubs[$id]['deleted'])
$dels[] = $id;
$sets = array();
if($newsubs[$id]['min'] != $sub['min'])
$sets[] = "mininstance = {$newsubs[$id]['min']}";
if($newsubs[$id]['max'] != $sub['max'])
$sets[] = "maxinstance = {$newsubs[$id]['max']}";
if(! empty($sets)) {
$allsets = implode(',', $sets);
$query = "UPDATE configsubimage "
. "SET $allsets "
. "WHERE id = $id";
doQuery($query);
}
unset($newsubs[$id]);
}
if(! empty($dels)) {
$alldels = implode(',', $dels);
$query = "DELETE FROM configsubimage "
. "WHERE id IN ($alldels)";
doQuery($query);
}
$vals = array();
foreach($newsubs as $sub) {
$item = "($configid, {$sub['imageid']}, {$sub['min']}, {$sub['max']})";
$vals[] = $item;
}
if(! empty($vals)) {
$allvals = implode(',', $vals);
$query = "INSERT INTO configsubimage "
. "(configid, "
. "imageid, "
. "mininstance, "
. "maxinstance) "
. "VALUES $allvals";
doQuery($query);
}
}
else {
$newvars = $vars['configvariables'];
$cfgvars = $curdata['variables'];
$deletes = array();
$datatypes = getConfigDataTypes();
foreach($cfgvars as $vardata) {
$id = $vardata['id'];
if($newvars[$id]['deleted'] == 1) {
$deletes[] = $id;
unset($newvars[$id]);
continue;
}
$sets = array();
if($vardata['name'] != $newvars[$id]['name']) {
$name = mysql_real_escape_string($newvars[$id]['name']);
$sets[] = "name = '$name'";
}
if($vardata['identifier'] != $newvars[$id]['identifier']) {
$identifier = mysql_real_escape_string($newvars[$id]['identifier']);
$sets[] = "identifier = '$identifier'";
}
if($vardata['datatypeid'] != $newvars[$id]['datatypeid']) {
if(! array_key_exists($newvars[$id]['datatypeid'], $datatypes))
$newvars[$id]['datatypeid'] = $this->findDataTypeID($newvars[$id]['defaultvalue'], $datatypes);
$sets[] = "datatypeid = '{$newvars[$id]['datatypeid']}'";
}
if($vardata['defaultvalue'] != $newvars[$id]['defaultvalue']) {
$defaultvalue = mysql_real_escape_string($newvars[$id]['defaultvalue']);
$sets[] = "defaultvalue = '$defaultvalue'";
}
if($vardata['required'] != $newvars[$id]['required']) {
if($newvars[$id]['required'] == 0 ||
$newvars[$id]['required'] == 1)
$sets[] = "required = '{$newvars[$id]['required']}'";
}
if($vardata['ask'] != $newvars[$id]['ask']) {
if($newvars[$id]['ask'] == 0 ||
$newvars[$id]['ask'] == 1)
$sets[] = "ask = '{$newvars[$id]['ask']}'";
}
if(count($sets)) {
$allsets = implode(',', $sets);
$query = "UPDATE configvariable SET $allsets WHERE id = $id";
doQuery($query);
}
unset($newvars[$id]);
}
if(count($deletes)) {
$alldels = implode(',', $deletes);
$query = "DELETE FROM configvariable WHERE id IN ($alldels)";
doQuery($query);
}
if(count($newvars))
$this->addNewConfigVars($newvars, $configid);
}
$vars['id'] = $configid;
$ret = array('status' => 'success', 'data' => $vars, 'action' => 'update');
sendJSON($ret);
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn
///
/// \brief Config
///
////////////////////////////////////////////////////////////////////////////////
function addNewConfigVars($newvars, $configid) {
$inserts = array();
$datatypes = getConfigDataTypes();
foreach($newvars as $var) {
$name = mysql_real_escape_string($var['name']);
$identifier = mysql_real_escape_string($var['identifier']);
$defaultvalue = mysql_real_escape_string($var['defaultvalue']);
if(! array_key_exists($var['datatypeid'], $datatypes))
$var['datatypeid'] = $this->findDataTypeID($var['defaultvalue'], $datatypes);
$inserts[] = "('$name', "
. "$configid, "
. "'user', "
. "'$defaultvalue', "
. "{$var['required']}, "
. "{$var['ask']}, "
. "'$identifier', "
. "'{$var['datatypeid']}')";
}
$allvars = implode(',', $inserts);
$query = "INSERT INTO configvariable "
. "(name, configid, `type`, defaultvalue, required, ask, identifier, datatypeid) "
. "VALUES $allvars";
doQuery($query);
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn
///
/// \brief Config
///
////////////////////////////////////////////////////////////////////////////////
function addResource($vars) {
$name = mysql_real_escape_string($vars['name']);
if($vars['type'] == 'Cluster') {
$query = "INSERT INTO config "
. "(name, "
. "ownerid, "
. "configtypeid, "
. "optional) "
. "VALUES "
. "('$name', "
. "{$vars['ownerid']}, "
. "(SELECT id FROM configtype WHERE prettyname = '{$vars['type']}'), "
. "{$vars['optional']})";
doQuery($query);
$id = dbLastInsertID();
$vals = array();
foreach($vars['subimages'] as $sub) {
$item = "($id, {$sub['imageid']}, {$sub['min']}, {$sub['max']})";
$vals[] = $item;
}
$allvals = implode(',', $vals);
$query = "INSERT INTO configsubimage "
. "(configid, "
. "imageid, "
. "mininstance, "
. "maxinstance) "
. "VALUES $allvals";
doQuery($query);
}
else {
$data = mysql_real_escape_string($vars['data']);
$query = "INSERT INTO config "
. "(name, "
. "configtypeid, "
. "ownerid, "
. "optional, "
. "data) "
. "VALUES "
. "('$name', "
. "{$vars['typeid']}, "
. "{$vars['ownerid']}, "
. "{$vars['optional']}, "
. "'$data')";
doQuery($query);
$id = dbLastInsertID();
if(count($vars['configvariables']))
$this->addNewConfigVars($vars['configvariables'], $id);
}
$query = "INSERT INTO resource "
. "(resourcetypeid, "
. "subid) "
. "VALUES "
. "((SELECT id FROM resourcetype WHERE name = 'config'), "
. "$id)";
doQuery($query);
$key = getKey(array(array("{$this->restype}Admin"), array("administer"), 0, 1, 0, 0));
unset($_SESSION['userresources'][$key]);
$key = getKey(array(array("{$this->restype}Admin"), array("administer"), 0, 0, 0, 0));
unset($_SESSION['userresources'][$key]);
$ret = array('status' => 'success', 'action' => 'add');
$ret['item'] = array('id' => $id,
'name' => $vars['name'],
'configtypeid' => $vars['typeid'],
'configtype' => $vars['type'],
'data' => $vars['data'],
'ownerid' => $vars['ownerid'],
'owner' => $vars['owner'],
'optional' => $vars['optional'],
'deleted' => 0);
sendJSON($ret);
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn
///
/// \brief Config
///
////////////////////////////////////////////////////////////////////////////////
function processInput($configid) {
$return = array();
$configtypes = getConfigTypes();
$return['typeid'] = processInputVar('typeid', ARG_NUMERIC);
if(! array_key_exists($return['typeid'], $configtypes)) {
$this->errmsg = "Invalid type submitted";
return 0;
}
$return['name'] = processInputVar('name', ARG_STRING);
if(! preg_match('/^([-a-zA-Z0-9\. ]){3,80}$/', $return['name'])) {
$this->errmsg = "The name can only contain letters, numbers, spaces, dashes(-),"
. "\\nand periods(.) and can be from 3 to 80 characters long";
return 0;
}
# check for existance of name
$name = mysql_real_escape_string($return['name']);
$query = "SELECT id FROM config WHERE name = '$name' AND id != $configid";
$qh = doQuery($query);
if(mysql_num_rows($qh)) {
$this->errmsg = "Another config with this name already exists.";
return 0;
}
# owner
$return['owner'] = processInputVar('owner', ARG_STRING);
if(! validateUserid($return['owner'])) {
$this->errmsg = "Invalid user submitted for owner";
return 0;
}
$return['ownerid'] = getUserlistID($return['owner']);
if(is_null($return['owner'])) {
$this->errmsg = "Invalid user submitted for owner";
return 0;
}
# optional
$return['optional'] = processInputVar('optional', ARG_NUMERIC);
if($return['optional'] !== '0' && $return['optional'] !== '1') {
$this->errmsg = "Invalid data submitted";
return 0;
}
# type
$return['type'] = $configtypes[$return['typeid']];
# cluster
if($return['type'] == 'Cluster') {
if(get_magic_quotes_gpc())
$tmp = stripslashes($_POST['subimages']);
else
$tmp = $_POST['subimages'];
$tmp = json_decode($tmp, 1);
if(is_null($tmp)) {
$this->errmsg = "Invalid data submitted";
return 0;
}
$resources = getUserResources(array("imageAdmin"));
$return['subimages'] = $tmp['items'];
foreach($return['subimages'] as $key => $sub) {
if(! array_key_exists($sub['imageid'], $resources['image'])) {
$this->errmsg = "Invalid subimage submitted";
return 0;
}
elseif(! is_numeric($sub['min']) || $sub['min'] < 1 || $sub['min'] > MAXSUBIMAGES ||
! is_numeric($sub['max']) || $sub['max'] < 1 || $sub['max'] > MAXSUBIMAGES ||
$sub['min'] > $sub['max']) {
$this->errmsg = "Invalid min/max value submitted for {$resources['image'][$sub['imageid']]}";
return 0;
}
elseif($sub['deleted'] != 0 && $sub['deleted'] != 1) {
if($sub['id'] > 15000000)
unset($return['subimages'][$key]);
else
$return['subimages'][$key]['deleted'] = 0;
}
}
$return['data'] = '';
}
# vlan
elseif($return['type'] == 'VLAN') {
$tmp = getContinuationVar('configdata');
$vdata = $tmp['variables'][0];
$return['data'] = processInputVar('vlanid', ARG_NUMERIC);
if($return['data'] < 1 || $return['data'] > 4095) {
$this->errmsg = "VLAN ID must be between 1 and 4095";
return 0;
}
$var = array($vdata['id'] =>
array('id' => $vdata['id'],
'name' => 'VLAN',
'identifier' => $vdata['identifier'],
'datatypeid' => $vdata['datatypeid'],
'defaultvalue' => $return['data'],
'required' => '1',
'ask' => '0',
'deleted' => '0'));
$return['configvariables'] = $var;
}
# other
else {
# TODO may need more validation on data
$return['data'] = trim($_POST['data']);
if(get_magic_quotes_gpc())
$return['data'] = stripslashes($return['data']);
if(! is_string($return['data']) || $return['data'] == '') {
$this->errmsg = "cannot be empty";
return 0;
}
# TODO validate configvariable input
if(get_magic_quotes_gpc())
$tmp = stripslashes($_POST['configvariables']);
else
$tmp = $_POST['configvariables'];
$tmp = json_decode($tmp, 1);
$return['configvariables'] = $tmp['items'];
}
return $return;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn
///
/// \brief Config
///
////////////////////////////////////////////////////////////////////////////////
function addEditDialogHTML() {
# TODO add places for description fields
global $user;
# dialog for on page editing
$configtypes = getConfigTypes();
$h = '';
$h .= "
\n"; $h .= " | \n"; $h .= " | \n"; $h .= " |
---|
\n";
# list of variables
$h .= " \n";
$h .= "Select a variable: \n";
$h .= "\n";
$h .= "\n"; $h .= "
| \n";
# edit variable
$h .= " \n";
# id
$h .= "\n";
# name
$h .= "\n";
$h .= " \n"; # editcfgvardiv
# undelete button
$h .= "\n"; # key $h .= "\n"; $h .= " \n"; # type $h .= ""; $datatypes = getConfigDataTypes(); $h .= selectInputHTML('', $datatypes, 'cfgvartype', 'dojoType="dijit.form.Select" maxHeight="250" onChange="setCfgVarType();"'); $h .= " \n"; # value - bool $h .= "\n"; $h .= "\n"; $h .= ""; $h .= selectInputAutoDijitHTML('', array('true', 'false'), 'vartypebool', 'onChange="delayedUpdateConfigVariable();"'); $h .= " \n"; $h .= "\n"; # vartypeboolspan # value - int $h .= "\n"; $h .= "\n"; $h .= ""; $h .= " \n"; $h .= "\n"; # vartypeintspan # value - float $h .= "\n"; $h .= "\n"; $h .= ""; $h .= " \n"; $h .= "\n"; # vartypefloatspan # value - string $h .= "\n"; $h .= "\n"; $h .= " \n"; $h .= "\n"; # vartypestringspan # value - text $h .= "\n"; $h .= "\n"; $h .= " \n"; $h .= "\n"; # vartypetextspan # required $h .= "\n"; $h .= " \n"; # ask $h .= "\n"; # TODO need better label name $h .= " \n"; # delete button $h .= "\n"; $h .= "\n"; $h .= " \n";
$h .= "\n";
$h .= " \n"; # undeletecfgvardiv
$h .= " |
\n"; $h .= " | \n"; $h .= " | Map Type | \n"; $h .= "Config Name | \n"; $h .= "Config Type | \n"; $h .= "Map To | \n"; $h .= "Affiliation | \n"; $h .= "Disabled | \n"; $h .= "Stage | \n"; $h .= "
---|