\n";
}*/
////////////////////////////////////////////////////////////////////////////////
///
/// \fn resourceStore($type, $detail, $jsid, $datawrapper=0)
///
/// \param $type - type of resource
/// \param $detail - whether to use RESTresourceDetail or RESTresourceBasic
/// \param $jsid - javascript id for store
/// \param $datawrapper - (optional, default=0) set to 1 to wrap JsonRest
/// store with a data ObjectStore
///
/// \return html
///
/// \brief generates HTML for a REST based resource store
///
////////////////////////////////////////////////////////////////////////////////
function resourceStore($type, $detail, $jsid, $datawrapper=0) {
$h = "
\n";
else
$h .= "jsid=\"$jsid\">\n";
if($datawrapper == 1) {
$h .= "\n";
}
return $h;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn RESTresourceBasic()
///
/// \brief sends REST formatted basic information for requested resource type
///
////////////////////////////////////////////////////////////////////////////////
function RESTresourceBasic() {
$type = validatetype(processRESTarg(1, ARG_STRING));
$deleted = processInputVar('deleted', ARG_NUMERIC, 0);
if($deleted != 0 && $deleted != 1)
$deleted = 0;
$name = processInputVar('name', ARG_STRING, '*');
if(is_null($type)) {
RESTresponse(404, "invalid resource type");
return;
}
$subid = processRESTarg(2, ARG_NUMERIC, 0);
if($type == 'image')
$resources = getUserResources(array("imageAdmin", "imageCheckOut"),
array('available'), 0, $deleted);
elseif($type == 'computer')
$resources = getUserResources(array("computerAdmin"), array("administer"),
0, $deleted);
elseif($type == 'config')
$resources = getUserResources(array("configAdmin"), array('available'),
0, $deleted);
#elseif ...
if($name != '*') {
# TODO
print '/*';
print "name: |$name| ";
foreach($resources[$type] as $id => $resname) {
print "img: |$resname| ";
if(! preg_match("/^$name$/i", $resname))
unset($resources[$type][$id]);
}
print '*/';
}
if($subid == 0) {
sendREST(dataToJSON($resources[$type]));
return;
}
elseif(! array_key_exists($subid, $resources[$type])) {
RESTresponse(404, "specified resource does not exist");
return;
}
sendREST(array('id' => (int)$subid, 'name' => $resources[$type][$subid]));
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn RESTresourceDetail
///
/// \brief sends REST formatted detailed information for requested resource type
///
////////////////////////////////////////////////////////////////////////////////
function RESTresourceDetail() {
$type = validatetype(processRESTarg(1, ARG_STRING));
$deleted = processInputVar('deleted', ARG_NUMERIC, 0);
if($deleted != 0 && $deleted != 1)
$deleted = 0;
$name = processInputVar('name', ARG_STRING, '*');
$tmp = processInputVar('prettyname', ARG_STRING, '*');
if($name == '*' && $tmp != '*')
$name = $tmp;
if(is_null($type)) {
RESTresponse(404, "invalid resource type");
return;
}
$subid = processRESTarg(2, ARG_NUMERIC, 0);
if($type == 'image')
$resources = getUserResources(array("imageAdmin", "imageCheckOut"),
array('available'), 0, $deleted);
elseif($type == 'computer')
$resources = getUserResources(array("computerAdmin"), array("administer"),
0, $deleted);
elseif($type == 'config')
$resources = getUserResources(array("configAdmin"), array('available'),
0, $deleted);
# TODO
#elseif ...
if($subid && ! array_key_exists($subid, $resources[$type])) {
RESTresponse(404, "specified resource does not exist");
printArray($resources[$type]);
return;
}
if($_SERVER['REQUEST_METHOD'] == 'DELETE') {
if(RESTdeleteResource($type, $subid))
RESTresponse(204);
else
RESTresponse(404, "specified resource does not exist 2");
return;
}
if($type == 'image') {
$items = getImages($deleted, $subid);
$data = array();
foreach(array_keys($resources[$type]) as $id) {
if($name != '*' &&
! preg_match("/^$name$/i", $items[$id]['prettyname']))
continue;
if(array_key_exists($id, $items))
$data[$id] = $items[$id];
}
}
elseif($type == 'computer')
$data = getComputers(1, 0, $subid);
elseif($type == 'config') {
$cluster = processInputVar('cluster', ARG_NUMERIC, -1);
$cfg = new Config();
$items = $cfg->getData($cfg->defaultGetDataArgs);
$data = array();
foreach(array_keys($resources[$type]) as $id) {
if($name != '*' &&
! preg_match("/^$name$/i", $items[$id]['name']))
continue;
if(array_key_exists($id, $items)) {
if($cluster == -1 ||
($cluster == 0 && $items[$id]['configtype'] != 'Cluster') ||
($cluster == 1 && $items[$id]['configtype'] == 'Cluster'))
$data[$id] = $items[$id];
}
}
}
#elseif ...
if($subid == 0) {
sendREST(dataToJSON($data));
return;
}
sendREST(dataToJSON($data[$subid], 1));
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn RESTdeleteResource($type, $subid)
///
/// \param $type - resource type
/// \param $subid - id of resource (from that resource's table, not the general
/// resource table)
///
/// \return 1 on success, 0 on failure
///
/// \brief toggles delete flag for a resource or deletes it if that type does
/// not handle being flagged as deleted
///
////////////////////////////////////////////////////////////////////////////////
function RESTdeleteResource($type, $subid) {
switch($type) {
case 'image':
$obj = new Image();
break;
# TODO
}
$_SESSION['userresources'] = array();
return $obj->toggleDeleteResource($subid);
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn processRESTarg($index, $type, $defaultvalue=NULL)
///
/// \param $index - index in URL path
/// \param $type - tag type:\n
/// \b ARG_NUMERIC - numeric\n
/// \b ARG_STRING - string\n
/// \b ARG_MULTINUMERIC - an array of numbers
/// \param $defaultvalue - (optional, defaults to NULL) default value for the
/// variable
///
/// \return sanitized value
///
/// \brief wrapper for processInputData
///
////////////////////////////////////////////////////////////////////////////////
function processRESTarg($index, $type, $defaultvalue=NULL) {
if(! array_key_exists("PATH_INFO", $_SERVER))
return $defaultvalue;
$pathdata = explode("/", $_SERVER["PATH_INFO"]);
if(! array_key_exists($index + 1, $pathdata))
return $defaultvalue;
return processInputData($pathdata[$index + 1], $type, $defaultvalue);
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn validatetype($type)
///
/// \param $type - resource type
///
/// \return $type if valid, NULL if not
///
/// \brief validates that $type is a know resource type
///
////////////////////////////////////////////////////////////////////////////////
function validatetype($type) {
$types = getTypes('resources');
if(! in_array($type, $types['resources']))
return NULL;
return $type;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn RESTresponse($code, $reason="")
///
/// \param $code - HTTP response code
/// \param $reason - (optional, default='') reason for given response; sets
/// X-Status-Reason response header
///
/// \brief sets the HTTP response header and reason for response if $reason is
/// not empty
///
////////////////////////////////////////////////////////////////////////////////
function RESTresponse($code, $reason="") {
global $RESTresponsecodes;
$response = "HTTP/1.1 $code {$RESTresponsecodes[$code]}";
header($response);
if($reason != "")
header("X-Status-Reason: $reason");
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn sendREST($arr)
///
/// \param $arr - array of data
///
/// \brief sends $arr as JSON formatted data
///
////////////////////////////////////////////////////////////////////////////////
function sendREST($arr) {
sendJSON($arr, '', 1);
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn dataToJSON($arr, $rec=0)
///
/// \param $arr - array of data
/// \param $rec - (optional, default=0)
///
/// \return array
///
/// \brief formats an array for better encoding to JSON
///
////////////////////////////////////////////////////////////////////////////////
function dataToJSON($arr, $rec=0) {
$jarr = array();
foreach($arr as $key => $val) {
if(is_array($val)) {
if(empty($val)) {
$jarr[$key] = $val;
continue;
}
$tmp = array_keys($val);
if(is_array($val[$tmp[0]])) {
#printArray($val[$tmp[0]]);
$jarr[$key] = dataToJSON($val, 1);
}
else {
if(is_numeric($key)) {
#print "key: $key - rec: $rec \n";
#printArray($val);
$jarr[] = dataToJSON($val, 1);
}
else {
$test = array_slice($val, 0);
if($test === $val)
$jarr[$key] = $val;
else
$jarr[$key] = dataToJSON($val);
}
}
#$jarr[] = $val;
#$jarr[$key] = dataToJSON($val, 1);
}
elseif($rec)
$jarr[$key] = $val;
else
$jarr[] = array('id' => $key, 'name' => $val);
}
return $jarr;
}
?>