Example #1
0
*****************************************************************************/
// EVERY *top-level* page must start this way:
// 1. Define it's relationship to the root of the MolProbity installation.
// Pages in subdirectories of lib/ or public_html/ will need more "/.." 's.
if (!defined('MP_BASE_DIR')) {
    define('MP_BASE_DIR', realpath(dirname(__FILE__) . '/..'));
}
// 2. Include core functionality - defines constants, etc.
require_once MP_BASE_DIR . '/lib/core.php';
require_once MP_BASE_DIR . '/lib/model.php';
// 3. Restore session data. If you don't want to access the session
// data for some reason, you must call mpInitEnvirons() instead.
mpStartSession();
// 4. For pages that want to see the session but not change it, such as
// pages that are refreshing periodically to monitor a background job.
mpSessReadOnly();
#{{{ a_function_definition - sumary_statement_goes_here
############################################################################
/**
* Documentation for this function.
*/
//function someFunctionName() {}
#}}}########################################################################
# MAIN - the beginning of execution for this page
############################################################################
// Security check on filename
$file = realpath($_REQUEST['file']);
if (!$file || !startsWith($file, realpath($_SESSION['dataDir']))) {
    mpLog("security:Attempt to access '{$file}' as '{$_REQUEST['file']}'");
    die("Security failure: illegal file request '{$_REQUEST['file']}'");
}
Example #2
0
 /**
 * Context is not used; $_SESSION[bgjob] is used instead.
 */
 function display($context)
 {
     // Because we can't modify $_SESSION while a background job is running,
     // we have to "cheat" on our contract and use display() to take action.
     // This is not recommended for normal MolProbity pages!!
     if (isset($_REQUEST['abort']) && $_REQUEST['abort'] == $_SESSION['bgjob']['processID']) {
         // Sometimes jobs die due to seg fault or PHP syntax error.
         // Thus, the isRunning flag remains set forever, causing the UI to "hang".
         // However, posix_kill() will return failure, b/c the job no longer exists.
         // So, we try to kill the job and proceed, with the assumption that it worked.
         posix_kill($_SESSION['bgjob']['processID'], 9);
         // 9 --> KILL
         mpSessReadOnly(false);
         unset($_SESSION['bgjob']['processID']);
         $_SESSION['bgjob']['endTime'] = time();
         $_SESSION['bgjob']['isRunning'] = false;
         // It no longer makes sense to continue -- needed vars may be undefined.
         // All we can do is return to the main page!
         //pageGoto("sitemap.php"); No, b/c we're already in display()
         $_SESSION['bgjob']['whereNext'] = "welcome.php";
         mpSaveSession();
     }
     $ellapsed = time() - $_SESSION['bgjob']['startTime'];
     if ($_SESSION['bgjob']['isRunning'] && !$_SESSION['bgjob']['processID'] && $ellapsed > 5) {
         $url = makeEventURL("onGoto", "welcome.php");
         $refresh = "10; URL={$url}";
         echo $this->pageHeader("Job failed to start");
         //, "none", $refresh);
         echo "<p>It appears that your background job failed to start.\n";
         echo "<br>This is probably due to a syntax error in one of the PHP scripts.\n";
         echo "<br>See the session error log for hints.\n";
         echo "<p><a href='{$url}'>Click here</a> to continue.\n";
         echo $this->pageFooter();
     } elseif ($_SESSION['bgjob']['isRunning']) {
         // We have to be very careful to not overwrite $_SESSION while the
         // background job is running, or data could be lost!!!
         mpSessReadOnly(true);
         // A simple counter to make sure browsers think each reload
         // is a "unique" page...
         $count = $_REQUEST['count'] + 1;
         // We use basename() to get "index.php" instead of the full path,
         // which is subject to corruption with URL forwarding thru kinemage.
         $url = basename($_SERVER['PHP_SELF']) . "?{$_SESSION['sessTag']}&count={$count}";
         // Refresh once quickly to get list of tasks displayed, then at given rate
         $rate = $count == 1 ? 2 : $_SESSION['bgjob']['refreshRate'];
         // Slow down if this is a long job
         if ($ellapsed > 30 && $rate < 5) {
             $rate = 5;
         } elseif ($ellapsed > 120 && $rate < 10) {
             $rate = 10;
         } elseif ($ellapsed > 1200 && $rate < 30) {
             $rate = 30;
         }
         // after 20 min, refresh every 30 sec
         $refresh = "{$rate}; URL={$url}";
         echo $this->pageHeader("Job is running...", "none", $refresh);
         echo "<p><center>\n";
         echo "<table border='0'><tr><td>\n";
         echo "<img src='img/2sod-anim.gif'></td><td>\n";
         @readfile("{$_SESSION['dataDir']}/" . MP_DIR_SYSTEM . "/progress");
         echo "</td></tr></table></center>\n";
         echo "<p><small>Your job has been running for " . $this->fmtTime($ellapsed) . ".</small>\n";
         echo "<br><small>If this page doesn't update after {$rate} seconds, <a href='{$url}'>click here</a>.</small>\n";
         if (isset($_SESSION['bgjob']['processID'])) {
             echo "<br><small>If needed, you can <a href='{$url}&abort={$_SESSION[bgjob][processID]}'>abort this job</a>.\n";
         }
         echo $this->pageFooter();
     } elseif ($_SESSION['bgjob']['modelError']) {
         $url = makeEventURL("onGoto", "welcome.php");
         $pdburlMODEL = "http://deposit.rcsb.org/adit/docs/pdb_atom_format.html#MODEL";
         $pdburlENDMDL = "http://deposit.rcsb.org/adit/docs/pdb_atom_format.html#ENDMDL";
         $refresh = "10; URL={$url}";
         echo $this->pageHeader("CCTBX job failed");
         //, "none", $refresh);
         echo "<p>It appears that the PDB you provided has a formatting error.\n";
         echo "<br>MolProbity believes the formatting error has to do with mismatched MODEL and ENDMDL cards.\n\n";
         echo "<p>Each MODEL card must be uniquely numbered and have a matching ENDMDL card.\n";
         echo "<p>The most common error is 'MODEL 1' existing with no ENDMDL card.\n";
         echo "<br>For further info please see the <a href='{$pdburlMODEL}' target=\"_blank\">PDB's MODEL</a> and <a href='{$pdburlENDMDL}' target=\"_blank\">ENDMDL</a> documentation.\n";
         echo "<p><strong>To fix:</strong> please check your fomatting conforms to proper PDB";
         echo "<br>conventions and try again. If you continue experiencing problems please";
         echo "<br>contact us using the feedback page which you can access on the left-hand";
         echo "<br>navigation bar from the main page.\n";
         echo "<p><a href='{$url}'>Click here</a> to return to the main page. \n";
         echo $this->pageFooter();
     } elseif ($_SESSION['bgjob']['elementError']) {
         $url = makeEventURL("onGoto", "welcome.php");
         $pdburl = "http://www.wwpdb.org/documentation/file-format/format33/sect9.html#ATOM";
         $refresh = "10; URL={$url}";
         echo $this->pageHeader("CCTBX job failed");
         //, "none", $refresh);
         echo "<p>It appears that the PDB you provided has a formatting error.\n";
         echo "<br>MolProbity believes the formatting error has to do with improper chemical names (a.k.a. element symbols)\n\n";
         echo "<p>Here is an example of PDB format:";
         echo "<pre>\n";
         echo "         1         2         3         4         5         6         7         8\n";
         echo "12345678901234567890123456789012345678901234567890123456789012345678901234567890\n";
         echo "ATOM     32  N  AARG A  -3      11.281  86.699  94.383  0.50 35.88           N\n";
         echo "ATOM     33  N  BARG A  -3      11.296  86.721  94.521  0.50 35.60           N\n";
         echo "ATOM     34  CA AARG A  -3      12.353  85.696  94.456  0.50 36.67           C\n";
         echo "ATOM     35  CA BARG A  -3      12.333  85.862  95.041  0.50 36.42           C\n";
         echo "ATOM     36  C  AARG A  -3      13.559  86.257  95.222  0.50 37.37           C\n";
         echo "ATOM     37  C  BARG A  -3      12.759  86.530  96.365  0.50 36.39           C\n";
         echo "ATOM     38  O  AARG A  -3      13.753  87.471  95.270  0.50 37.74           O\n";
         echo "ATOM     39  O  BARG A  -3      12.924  87.757  96.420  0.50 37.26           O\n";
         echo "ATOM     40  CB AARG A  -3      12.774  85.306  93.039  0.50 37.25           C\n";
         echo "ATOM     41  CB BARG A  -3      13.428  85.746  93.980  0.50 36.60           C\n";
         echo "ATOM     42  CG AARG A  -3      11.754  84.432  92.321  0.50 38.44           C\n";
         echo "ATOM     43  CG BARG A  -3      12.866  85.172  92.651  0.50 37.31           C\n";
         echo "ATOM     44  CD AARG A  -3      11.698  84.678  90.815  0.50 38.51           C\n";
         echo "ATOM     45  CD BARG A  -3      13.374  85.886  91.406  0.50 37.66           C\n";
         echo "HETATM   46 MG   MG  B 101      44.444  55.555  66.666  1.00 42.42          MG\n";
         echo "</pre><p>Chemical names must be in columns 77-78 of the PDB file, right justified (e.g. \" C\"). ";
         echo "<br>For further info please see the <a href='{$pdburl}' target=\"_blank\">PDB formatting</a> guide.\n";
         echo "<p><strong>To fix:</strong> please check your fomatting conforms to proper PDB";
         echo "<br>conventions and try again. If you continue experiencing problems please";
         echo "<br>contact us using the feedback page which you can access on the left-hand";
         echo "<br>navigation bar from the main page.\n";
         echo "<p><a href='{$url}'>Click here</a> to return to the main page.\n";
         echo $this->pageFooter();
     } elseif ($_SESSION['bgjob']['cctbxError']) {
         $url = makeEventURL("onGoto", "feedback_setup.php");
         $refresh = "10; URL={$url}";
         echo $this->pageHeader("CCTBX job failed");
         //, "none", $refresh);
         echo "<p>It appears that your CCTBX-powered job failed.\n";
         echo "<br>This is probably due to a syntax error in one of the CCTBX scripts!\n";
         echo "<br>See the session error log for hints, and please report the bug using the Feedback tool.\n";
         echo "<p><a href='{$url}'>Click here</a> to continue.\n";
         echo $this->pageFooter();
     } else {
         $url = makeEventURL("onGoto", $_SESSION['bgjob']['whereNext'], $_SESSION['bgjob']);
         $refresh = "3; URL={$url}";
         echo $this->pageHeader("Job is finished", "none", $refresh);
         echo "<p><center>\n";
         echo "<p><table border='0'><tr><td>\n";
         @readfile("{$_SESSION['dataDir']}/" . MP_DIR_SYSTEM . "/progress");
         echo "</td></tr></table></center>\n";
         echo "<p><small>Your job ran for " . $this->fmtTime($_SESSION['bgjob']['endTime'] - $_SESSION['bgjob']['startTime']) . ".</small>\n";
         echo "<br><small>If nothing happens after 3 seconds, <a href='{$url}'>click here</a>.<small>\n";
         echo $this->pageFooter();
     }
 }
Example #3
0
* Documentation for this function.
*/
//function someFunctionName() {}
#}}}########################################################################
# MAIN - the beginning of execution for this page
############################################################################
// Note that changing size breaks the "Close" button, at least in Safari, b/c the page reloads.
if (isset($_REQUEST['size'])) {
    $kingSize = $_REQUEST['size'];
    setcookie('viewking_kingSize', $kingSize);
    // You could get in trouble if a background job was running (hence the check here)
    // or if you somehow hit the size-change link while another page was loading (unlikely),
    // because this update would be overwriten when the background job exited (hopefully),
    // or this update would overwrite the results of the background job just as it ended (disaster).
    if (!$_SESSION['bgjob']['isRunning']) {
        mpSessReadOnly(false);
        $_SESSION['kingSize'] = $kingSize;
    }
} elseif (isset($_COOKIE['viewking_kingSize'])) {
    $kingSize = $_COOKIE['viewking_kingSize'];
} elseif (isset($_SESSION['kingSize'])) {
    $kingSize = $_SESSION['kingSize'];
} else {
    $kingSize = 'default';
}
if ($kingSize == "tiny") {
    $size = "width='600' height='400'";
} elseif ($kingSize == "small") {
    $size = "width='700' height='500'";
} elseif ($kingSize == "large") {
    $size = "width='1300' height='950'";
Example #4
0
/**
* Be warned -- this function makes the current session READ ONLY.
* The session data file must not be overwritten until the job ends.
* This function ONLY makes sense in the context of a session.
*
* This command does NOT automatically do a pageGoto("job_progress.php").
* You should do that manually BEFORE calling this function, or use another
* background job monitor with equivalent functionality.
* You can't pageGoto() AFTER calling this function b/c the session is frozen!
*
* $script       Absolute path to a PHP script to run.
*               Command is "php -f $script ".session_id()
* $whereNext    name of the next delegate script, for after the job
* $delay        number of seconds to wait between refreshes
*/
function launchBackground($script, $whereNext, $delay = 5)
{
    if ($_SESSION['bgjob']['isRunning']) {
        return false;
    }
    // No! Caller probably put some data in there already for this new job!
    // This has to be done in the launch functions instead.
    //unset($_SESSION['bgjob']); // Clean up any old data
    // Remove old progress file
    $progress = "{$_SESSION['dataDir']}/" . MP_DIR_SYSTEM . "/progress";
    if (file_exists($progress)) {
        unlink($progress);
    }
    unset($_SESSION['bgjob']['processID']);
    $_SESSION['bgjob']['isRunning'] = true;
    $_SESSION['bgjob']['startTime'] = time();
    $_SESSION['bgjob']['refreshRate'] = $delay;
    $_SESSION['bgjob']['whereNext'] = $whereNext;
    $errlog = $_SESSION['dataDir'] . "/" . MP_DIR_SYSTEM . "/errors";
    // Make sure session variables are written to disk.
    // session_write_close() doesn't take effect until end of script
    mpSaveSession();
    // Otherwise, end-of-script write can truncate the file to nothing
    // just as the background job is starting, leading to random failure (?)
    mpSessReadOnly(true);
    // Save current dir so we can exec script in it's own dir.
    $pwd = getcwd();
    chdir(dirname($script));
    // Run the script in the background
    $cmd = "php -f {$script} '" . session_id() . "' >> {$errlog} 2>&1 &";
    exec($cmd);
    // Restore the current dir
    chdir($pwd);
}