function getImages($includedeleted = 0, $imageid = 0) { # key in $imagelist is for $includedeleted static $imagelist = array(0 => array(), 1 => array()); if (!empty($imagelist[$includedeleted])) { if ($imageid == 0) { return $imagelist[$includedeleted]; } else { return array($imageid => $imagelist[$includedeleted][$imageid]); } } # get all image meta data $allmetadata = array(); $query = "SELECT checkuser, " . "rootaccess, " . "subimages, " . "sysprep, " . "sethostname, " . "id " . "FROM imagemeta"; $qh = doQuery($query); while ($row = mysql_fetch_assoc($qh)) { $allmetadata[$row['id']] = $row; } # get all image revision data $allrevisiondata = array(); $query = "SELECT i.id, " . "i.imageid, " . "i.revision, " . "i.userid, " . "CONCAT(u.unityid, '@', a.name) AS user, " . "i.datecreated, " . "DATE_FORMAT(i.datecreated, '%c/%d/%y %l:%i %p') AS prettydate, " . "i.deleted, " . "i.datedeleted, " . "i.production, " . "i.imagename " . "FROM imagerevision i, " . "affiliation a, " . "user u " . "WHERE i.userid = u.id AND "; if (!$includedeleted) { $query .= "i.deleted = 0 AND "; } $query .= "u.affiliationid = a.id"; $qh = doQuery($query, 101); while ($row = mysql_fetch_assoc($qh)) { $id = $row['imageid']; unset($row['imageid']); if (!array_key_exists($id, $allrevisiondata)) { $allrevisiondata[$id] = array(); } $allrevisiondata[$id][$row['id']] = $row; } $query = "SELECT i.id AS id," . "i.name AS name, " . "i.prettyname AS prettyname, " . "i.ownerid AS ownerid, " . "CONCAT(u.unityid, '@', a.name) AS owner, " . "i.platformid AS platformid, " . "p.name AS platform, " . "i.OSid AS osid, " . "o.name AS os, " . "o.installtype, " . "ot.id AS ostypeid, " . "ot.name AS ostype, " . "i.minram AS minram, " . "i.minprocnumber AS minprocnumber, " . "i.minprocspeed AS minprocspeed, " . "i.minnetwork AS minnetwork, " . "i.maxconcurrent AS maxconcurrent, " . "i.reloadtime AS reloadtime, " . "i.deleted AS deleted, " . "i.test AS test, " . "r.id AS resourceid, " . "i.lastupdate, " . "i.forcheckout, " . "i.maxinitialtime, " . "i.imagemetaid " . "FROM image i, " . "platform p, " . "OS o, " . "OStype ot, " . "resource r, " . "resourcetype t, " . "user u, " . "affiliation a " . "WHERE i.platformid = p.id AND " . "r.resourcetypeid = t.id AND " . "t.name = 'image' AND " . "r.subid = i.id AND " . "i.OSid = o.id AND " . "o.type = ot.name AND " . "i.ownerid = u.id AND " . "u.affiliationid = a.id "; if (!$includedeleted) { $query .= "AND i.deleted = 0 "; } $query .= "ORDER BY i.prettyname"; $qh = doQuery($query, 120); while ($row = mysql_fetch_assoc($qh)) { if (is_null($row['maxconcurrent'])) { $row['maxconcurrent'] = 0; } $imagelist[$includedeleted][$row["id"]] = $row; $imagelist[$includedeleted][$row["id"]]['checkuser'] = 1; $imagelist[$includedeleted][$row["id"]]['rootaccess'] = 1; if ($row['ostype'] == 'windows' || $row['ostype'] == 'osx') { $imagelist[$includedeleted][$row['id']]['sethostname'] = 0; } else { $imagelist[$includedeleted][$row['id']]['sethostname'] = 1; } if ($row["imagemetaid"] != NULL) { if (array_key_exists($row['imagemetaid'], $allmetadata)) { $metaid = $row['imagemetaid']; $imagelist[$includedeleted][$row['id']]['checkuser'] = $allmetadata[$metaid]['checkuser']; $imagelist[$includedeleted][$row['id']]['rootaccess'] = $allmetadata[$metaid]['rootaccess']; $imagelist[$includedeleted][$row['id']]['sysprep'] = $allmetadata[$metaid]['sysprep']; if ($allmetadata[$metaid]['sethostname'] != NULL) { $imagelist[$includedeleted][$row['id']]['sethostname'] = $allmetadata[$metaid]['sethostname']; } $imagelist[$includedeleted][$row["id"]]["subimages"] = array(); if ($allmetadata[$metaid]["subimages"]) { $query2 = "SELECT imageid " . "FROM subimages " . "WHERE imagemetaid = {$metaid}"; $qh2 = doQuery($query2, 101); while ($row2 = mysql_fetch_assoc($qh2)) { $imagelist[$includedeleted][$row["id"]]["subimages"][] = $row2["imageid"]; } } } else { $imagelist[$includedeleted][$row["id"]]["imagemetaid"] = NULL; } } if (array_key_exists($row['id'], $allrevisiondata)) { $imagelist[$includedeleted][$row['id']]['imagerevision'] = $allrevisiondata[$row['id']]; } $imagelist[$includedeleted][$row['id']]['connectmethods'] = getImageConnectMethods($row['id']); } if ($imageid != 0) { return array($imageid => $imagelist[$includedeleted][$imageid]); } return $imagelist[$includedeleted]; }
function AJremImageConnectMethod() { $imageid = getContinuationVar('imageid'); $methods = getContinuationVar('methods'); $revids = getContinuationVar('revids'); $curmethods = getImageConnectMethods($imageid); $remidlist = mysql_real_escape_string(processInputVar('ids', ARG_STRING)); $remids = explode(',', $remidlist); $revid = processInputVar('revid', ARG_NUMERIC); $newimage = getContinuationVar('newimage'); foreach ($remids as $id) { if (!is_numeric($id)) { $arr = array('error' => 'invalidinput', 'msg' => i("Non-numeric data was submitted for a connection method id.")); sendJSON($arr); return; } } if ($revid != 0 && !in_array($revid, $revids)) { $arr = array('error' => 'invalidrevision', 'msg' => i("Invalid revision id submitted.")); sendJSON($arr); return; } if (!$newimage) { if ($revid == 0) { $revid = getProductionRevisionid($imageid); } # delete any current entries for method and image $query = "DELETE FROM connectmethodmap " . "WHERE imagerevisionid = {$revid} AND " . "connectmethodid IN ({$remidlist}) AND " . "autoprovisioned IS NULL"; doQuery($query, 101); # query to see if enabled for OStype or OS $insvals = array(); foreach ($remids as $id) { $query = "SELECT cm.connectmethodid " . "FROM connectmethodmap cm, " . "image i " . "LEFT JOIN OS o ON (o.id = i.OSid) " . "LEFT JOIN OStype ot ON (ot.name = o.type) " . "WHERE i.id = {$imageid} AND " . "cm.autoprovisioned IS NULL AND " . "cm.connectmethodid = {$id} AND " . "cm.disabled = 0 AND " . "(cm.OStypeid = ot.id OR " . "cm.OSid = o.id)"; $qh = doQuery($query, 101); if (mysql_num_rows($qh)) { # if so, add disabled entry for image revision and method $insvals[] = "({$id}, {$revid}, 1)"; } } if (count($insvals)) { $allinsvals = implode(',', $insvals); $query = "INSERT INTO connectmethodmap " . "(connectmethodid, " . "imagerevisionid, " . "disabled) " . "VALUES {$allinsvals}"; doQuery($query, 101); } } $cdata = $this->basecdata; $cdata['imageid'] = $imageid; $cdata['methods'] = $methods; $cdata['revids'] = $revids; $cdata['newimage'] = $newimage; $addcont = addContinuationsEntry('AJaddImageConnectMethod', $cdata, 3600, 1, 0); $remcont = addContinuationsEntry('AJremImageConnectMethod', $cdata, 3600, 1, 0); $arr = array('addcont' => $addcont, 'remcont' => $remcont); sendJSON($arr); $key = getKey(array('getImageConnectMethods', (int) $imageid, (int) $revid)); if (array_key_exists($key, $_SESSION['usersessiondata'])) { unset($_SESSION['usersessiondata'][$key]); } $key = getKey(array('getImageConnectMethods', (int) $imageid, 0)); if (array_key_exists($key, $_SESSION['usersessiondata'])) { unset($_SESSION['usersessiondata'][$key]); } }
function XMLRPCautoCapture($requestid) { global $user, $xmlrpcBlockAPIUsers; if (!in_array($user['id'], $xmlrpcBlockAPIUsers)) { return array('status' => 'error', 'errorcode' => 47, 'errormsg' => 'access denied to XMLRPCautoCapture'); } $query = "SELECT id FROM request WHERE id = {$requestid}"; $qh = doQuery($query, 101); if (!mysql_num_rows($qh)) { return array('status' => 'error', 'errorcode' => 52, 'errormsg' => 'specified request does not exist'); } $reqData = getRequestInfo($requestid); # check state of reservation if ($reqData['stateid'] != 14 || $reqData['laststateid'] != 8) { return array('status' => 'error', 'errorcode' => 51, 'errormsg' => 'reservation not in valid state'); } # check that not a cluster reservation if (count($reqData['reservations']) > 1) { return array('status' => 'error', 'errorcode' => 48, 'errormsg' => 'cannot image a cluster reservation'); } require_once ".ht-inc/image.php"; $imageid = $reqData['reservations'][0]['imageid']; $imageData = getImages(0, $imageid); $captime = unixToDatetime(time()); $comments = "start: {$reqData['start']}<br>" . "end: {$reqData['end']}<br>" . "computer: {$reqData['reservations'][0]['reservedIP']}<br>" . "capture time: {$captime}"; # create new revision if requestor is owner and not a kickstart image if ($imageData[$imageid]['installtype'] != 'kickstart' && $reqData['userid'] == $imageData[$imageid]['ownerid']) { $rc = Image::AJupdateImage($requestid, $reqData['userid'], $comments, 1); if ($rc == 0) { return array('status' => 'error', 'errorcode' => 49, 'errormsg' => 'error encountered while attempting to create new revision'); } } else { $ownerdata = getUserInfo($reqData['userid'], 1, 1); $desc = "This is an autocaptured image.<br>" . "captured from image: {$reqData['reservations'][0]['prettyimage']}<br>" . "captured on: {$captime}<br>" . "owner: {$ownerdata['unityid']}@{$ownerdata['affiliation']}<br>"; $connectmethods = getImageConnectMethods($imageid, $reqData['reservations'][0]['imagerevisionid']); $data = array('requestid' => $requestid, 'desc' => $desc, 'usage' => '', 'owner' => "{$ownerdata['unityid']}@{$ownerdata['affiliation']}", 'name' => "Autocaptured ({$ownerdata['unityid']} - {$requestid})", 'ram' => 64, 'cores' => 1, 'cpuspeed' => 500, 'networkspeed' => 10, 'concurrent' => '', 'checkuser' => 1, 'rootaccess' => 1, 'checkout' => 1, 'sysprep' => 1, 'basedoffrevisionid' => $reqData['reservations'][0]['imagerevisionid'], 'platformid' => $imageData[$imageid]['platformid'], 'osid' => $imageData[$imageid]["osid"], 'ostype' => $imageData[$imageid]["ostype"], 'sethostname' => $imageData[$imageid]["sethostname"], 'reload' => 20, 'comments' => $comments, 'connectmethodids' => implode(',', array_keys($connectmethods)), 'autocaptured' => 1); $obj = new Image(); $imageid = $obj->addResource($data); if ($imageid == 0) { return array('status' => 'error', 'errorcode' => 50, 'errormsg' => 'error encountered while attempting to create image'); } $query = "UPDATE request rq, " . "reservation rs " . "SET rs.imageid = {$imageid}, " . "rs.imagerevisionid = {$obj->imagerevisionid}, " . "rq.stateid = 16 " . "WHERE rq.id = {$requestid} AND " . "rq.id = rs.requestid"; doQuery($query); } return array('status' => 'success'); }