コード例 #1
0
 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) . "' />";
 }
コード例 #2
0
ファイル: VoController.php プロジェクト: IASA-GR/appdb-core
 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());
     }
 }