public function syncsitesAction() { $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer->setNoRender(); $islocal = localRequest(); $update = $this->_getParam("update") != null ? $this->_getParam("update") : "true"; $update = strtolower(trim($update)) === "false" ? false : true; $force = $this->_getParam("force") != null ? $this->_getParam("force") : "true"; $force = strtolower(trim($force)) === "true" ? true : false; if (!$islocal) { header('HTTP/1.0 404 Not Found'); header("Status: 404 Not Found"); return; } header('Content-type: text/xml'); echo '<' . '?xml version="1.0" encoding="UTF-8"?' . '>' . "\n"; $result = Gocdb::syncSites($update, $force); db()->query("REFRESH MATERIALIZED VIEW CONCURRENTLY sites;"); db()->query("SELECT request_permissions_refresh();"); db()->query("REFRESH MATERIALIZED VIEW site_services_xml;"); db()->query("REFRESH MATERIALIZED VIEW site_service_images_xml;"); if (is_array($result)) { echo "<result success='true'"; if (isset($result["inserted"])) { echo " inserted='" . $result["inserted"] . "'"; } if (isset($result["updated"])) { echo " updated='" . $result["updated"] . "'"; } if (isset($result["deleted"])) { echo " deleted='" . $result["deleted"] . "'"; } echo " />"; return; } $error_message = trim($result); if (is_string($result) === false) { $error_message = 'Unknown error'; } ExternalDataNotification::sendNotification('Sites::syncSites', $error_message, ExternalDataNotification::MESSAGE_TYPE_ERROR); echo "<result success='false' error='" . htmlspecialchars($error_message, ENT_QUOTES) . "' />"; }
public function syncEGIVOMembers() { if ($this->gridops_is_down()) { error_log("EGI Operations portal is in downtime. EGI VO members sync aborted"); return; } db()->setFetchMode(Zend_Db::FETCH_OBJ); $rs = db()->query("SELECT id, name, enabled, members_url FROM vo_sources WHERE name = 'EGI Operations Portal'")->fetchAll(); $enabled = false; $uri = null; if (count($rs) > 0) { $rs = $rs[0]; if (filter_var($rs->enabled, FILTER_VALIDATE_BOOLEAN) === true) { $enabled = true; } } if (!$enabled) { error_log("EGI Operations Portal VO source is disabled; will not sync VO members"); ExternalDataNotification::sendNotification('VO::syncEGIVOMembers', "EGI Operations Portal VO source is disabled; will not sync VO members", ExternalDataNotification::MESSAGE_TYPE_ERROR); return false; } $inTransaction = false; $mode = Zend_Registry::get("vouser_sync"); if (is_array($mode) && isset($mode["mode"])) { $mode = $mode["mode"]; } else { $mode = "api"; } switch ($mode) { case "api": case "zip": break; default: $mode = "api"; break; } error_log("EGI VO user sync mode: {$mode}"); try { $ch = curl_init(); if ($mode == "api") { $uri = "https://operations-portal.egi.eu/vo/downloadVoUsers"; } elseif ($mode == "zip") { $uri = "http://cclavoisier01.in2p3.fr:8080/lavoisier/OPSCORE_vo_users_raw?accept=zip"; } else { return; } curl_setopt($ch, CURLOPT_URL, $uri); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); if ($mode == "api") { curl_setopt($ch, 181, 1 | 2); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSLCERT, APPLICATION_PATH . '/../bin/sec/usercert.pem'); curl_setopt($ch, CURLOPT_SSLKEY, APPLICATION_PATH . '/../bin/sec/userkey.pem'); } elseif ($mode == "zip") { curl_setopt($ch, 181, 1); } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $headers = apache_request_headers(); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $xml = curl_exec($ch); if ($xml === false) { $err = var_export(curl_error($ch), true); error_log("error in syncEGIVOMembers: " . $err); ExternalDataNotification::sendNotification('VO::syncEGIVOMembers', "Could not sync VO members from EGI operations portal. Error was:\n\n" . $err); return; } @curl_close($ch); if ($mode == "api") { @exec("rm " . APPLICATION_PATH . "/../cache/vo_users.xml.gz.old"); @exec("rm " . APPLICATION_PATH . "/../cache/vo_users.xml"); @exec("cp " . APPLICATION_PATH . "/../cache/vo_users.xml.gz " . APPLICATION_PATH . "/../cache/vo_users.xml.gz.old"); $f = fopen(APPLICATION_PATH . "/../cache/vo_users.xml.gz", "w"); } elseif ($mode == "zip") { @exec("rm " . APPLICATION_PATH . "/../cache/vo_users.xml.old"); @exec("mv " . APPLICATION_PATH . "/../cache/vo_users.xml " . APPLICATION_PATH . "/../cache/vo_users.xml.old"); $f = fopen(APPLICATION_PATH . "/../cache/vo_users.zip", "w"); } fwrite($f, $xml); fclose($f); if ($mode == "zip") { @exec("unzip -p " . APPLICATION_PATH . "/../cache/vo_users.zip data.xml > " . APPLICATION_PATH . "/../cache/vo_users.xml"); @exec("rm " . APPLICATION_PATH . "/../cache/vo_users.zip"); } if ($mode == "api" && @md5_file(APPLICATION_PATH . "/../cache/vo_users.xml.gz") !== @md5_file(APPLICATION_PATH . "/../cache/vo_users.xml.gz.old") || $mode == "zip" && @md5_file(APPLICATION_PATH . "/../cache/vo_users.xml") !== @md5_file(APPLICATION_PATH . "/../cache/vo_users.xml.old")) { if ($mode == "api") { exec("gunzip " . APPLICATION_PATH . "/../cache/vo_users.xml.gz"); } $xml = new SimpleXMLElement(file_get_contents(APPLICATION_PATH . "/../cache/vo_users.xml")); $rows = $xml->xpath("//result/row"); if (count($rows) > 0) { error_log("Sync'ing VO members..."); db()->beginTransaction(); $inTransaction = true; db()->query("ALTER TABLE egiops.vo_members DISABLE TRIGGER tr_egiops_vo_members_99_refresh_permissions;"); db()->query("DELETE FROM egiops.vo_members;"); foreach ($rows as $row) { $lastup = trim($row->LAST_UPDATE); $firstup = trim($row->FIRST_UPDATE); if ($lastup == "") { $lastup = null; } if ($firstup == "") { $firstup = null; } db()->query("INSERT INTO egiops.vo_members (uservo, certdn, ca, vo, last_update, first_update) VALUES (?,?,?,?,?,?);", array(str_replace("'", '’', trim($row->USERVO)), str_replace("'", '’', trim($row->CERTDN)), trim($row->CA), trim($row->VO), $lastup, $firstup)); } db()->commit(); db()->query("ALTER TABLE egiops.vo_members ENABLE TRIGGER tr_egiops_vo_members_99_refresh_permissions;"); db()->query("SELECT request_permissions_refresh();"); db()->query("UPDATE config SET data = NOW()::text WHERE var = 'egi_vo_members_synced'"); error_log("VO members sync'ed"); } else { ExternalDataNotification::sendNotification('VO::syncEGIVOMembers', 'Could not sync VO members from EGI operations portal. Probably got currupt or empty data'); } } else { error_log("Sync EGI VO members: nothing to do (MD5 unchanged)"); db()->query("UPDATE config SET data = NOW()::text WHERE var = 'egi_vo_members_synced'"); } } catch (Exception $e) { if ($inTransaction) { $db = db(); @$db->rollBack(); } db()->query("ALTER TABLE egiops.vo_members ENABLE TRIGGER tr_egiops_vo_members_99_refresh_permissions;"); db()->query("SELECT request_permissions_refresh();"); error_log("error in syncVOMembers: {$e}"); ExternalDataNotification::sendNotification('VO::syncEGIVOMembers', 'Could not sync VO members from EGI operations portal. Error was:\\n\\n' . $e->getMessage()); } }