Commit 6cdccbd2 authored by Leigh Stoller's avatar Leigh Stoller

Add prelim support for using linktest. Because of problems, this is

currently available to only people with stud=1 status in the DB.

* www/tbauth.php3: Add a STUDLY() function to check that bit.

* www/linktest.php3: New page to run linktest on the fly. The level
  defaults to the current level in the experiments table, but you can
  override that via the form on the page.

* www/showexp.php3: Add link to aforementioned page. STUDLY() only.

* www/beginexp_form.php3: Add an option (selection) to set the linktest
  level for create/swapin. Defaults to 0 (no linktest). STUDLY() only.

* www/editexp.php3: Add an option to edit the default linktest level
  for an experiment. STUDLY() only.

* tbsetup/batchexp.in and tbsetup/swapexp.in: Add code to optionally run
  the linktest, sending email if it fails (exists with non-zero status).
  Failure does not affect the swapin.
parent b43f1ae4
...@@ -50,11 +50,12 @@ sub usage() ...@@ -50,11 +50,12 @@ sub usage()
exit(-1); exit(-1);
} }
my $optlist = "iE:g:e:p:S:L:a:l:fwq"; my $optlist = "iE:g:e:p:S:L:a:l:fwqt:";
my $batchmode= 1; my $batchmode= 1;
my $frontend = 0; my $frontend = 0;
my $waitmode = 0; my $waitmode = 0;
my $quiet = 0; my $quiet = 0;
my $linktest = 0; # non-zero means level to run at.
# #
# Configure variables # Configure variables
...@@ -249,13 +250,14 @@ if (! DBQueryWarn("INSERT INTO experiments ". ...@@ -249,13 +250,14 @@ if (! DBQueryWarn("INSERT INTO experiments ".
" expt_head_uid,expt_swap_uid, state, priority, swappable,". " expt_head_uid,expt_swap_uid, state, priority, swappable,".
" idleswap, idleswap_timeout, autoswap, autoswap_timeout,". " idleswap, idleswap_timeout, autoswap, autoswap_timeout,".
" idle_ignore, keyhash, expt_locked, eventkey,". " idle_ignore, keyhash, expt_locked, eventkey,".
" noswap_reason, noidleswap_reason, batchmode) ". " noswap_reason, noidleswap_reason, batchmode, ".
" linktest_level) ".
"VALUES ('$eid', '$pid', '$gid', now(), ". "VALUES ('$eid', '$pid', '$gid', now(), ".
"$description,'$dbuid', '$dbuid', '$exptstate', $priority, ". "$description,'$dbuid', '$dbuid', '$exptstate', $priority, ".
"$swappable, $idleswap, '$swaptime', $autoswap, ". "$swappable, $idleswap, '$swaptime', $autoswap, ".
"'$autoswaptime', $idleignore, '$webkey', ". "'$autoswaptime', $idleignore, '$webkey', ".
"now(), '$eventkey', $noswap_reason, ". "now(), '$eventkey', $noswap_reason, ".
"$noidleswap_reason, $batchmode)")) { "$noidleswap_reason, $batchmode, $linktest)")) {
DBQueryWarn("unlock tables"); DBQueryWarn("unlock tables");
die("*** $0:\n". die("*** $0:\n".
" Database error inserting record for $pid/$eid!\n"); " Database error inserting record for $pid/$eid!\n");
...@@ -483,16 +485,6 @@ if (system("$tbbindir/tbreport -b $pid $eid 2>&1 > $repfile") != 0) { ...@@ -483,16 +485,6 @@ if (system("$tbbindir/tbreport -b $pid $eid 2>&1 > $repfile") != 0) {
fatal("tbreport failed!\n"); fatal("tbreport failed!\n");
} }
#
# Gather statistics.
#
if ($frontend || $batchmode) {
GatherSwapStats($pid, $eid, $dbuid, TBDB_STATS_PRELOAD, 0);
}
else {
GatherSwapStats($pid, $eid, $dbuid, TBDB_STATS_START, 0);
}
# #
# Try to copy off the files for testbed information gathering. # Try to copy off the files for testbed information gathering.
# #
...@@ -504,6 +496,55 @@ TBSaveExpLogFiles($pid, $eid); ...@@ -504,6 +496,55 @@ TBSaveExpLogFiles($pid, $eid);
# #
system("cp -Rfp $workdir/ $userdir/tbdata"); system("cp -Rfp $workdir/ $userdir/tbdata");
#
# Deal with linktest. If requested, swapping in or modifying, and experiment
# is indeed active, then run it!
#
# XXX - linktest uses files from $userdir/tbdata/, so the above cp must
# happen first!
#
if ($linktest && ExpState($pid, $eid) eq EXPTSTATE_ACTIVE) {
#
# Run it. No worries about failures.
#
my $output = "linktest.$$";
my $optarg = "-o $output";
if ($linktest =~ /^(\d)$/) {
$optarg .= " -l $1";
}
else {
$optarg .= " -l 1";
}
print "Running 'run_linktest.pl $optarg -e $pid/$eid'\n";
if (system("$tbbindir/run_linktest.pl $optarg -e $pid/$eid") != 0) {
system("cat $output")
if (-r $output);
print STDERR "*** WARNING: ".
"Linktest run returned non-zero status!\n";
SENDMAIL("$user_name <$user_email>",
"Linktest Failure: $pid/$eid",
"Failure in linktest (level $linktest); ".
"returned non-zero status",
"$user_name <$user_email>",
"Cc: $TBOPS",
($output));
}
}
#
# Gather statistics.
#
if ($frontend || $batchmode) {
GatherSwapStats($pid, $eid, $dbuid, TBDB_STATS_PRELOAD, 0);
}
else {
GatherSwapStats($pid, $eid, $dbuid, TBDB_STATS_START, 0);
}
# #
# Close up the log file so the webpage stops. # Close up the log file so the webpage stops.
# #
...@@ -824,6 +865,13 @@ sub ParseArgs() ...@@ -824,6 +865,13 @@ sub ParseArgs()
$autoswap = 1; $autoswap = 1;
$autoswaptime = $options{"a"}; $autoswaptime = $options{"a"};
} }
if (defined($options{"t"})) {
if (! TBcheck_dbslot($options{"t"}, "experiments", "linktest_level",
TBDB_CHECKDBSLOT_WARN|TBDB_CHECKDBSLOT_ERROR)) {
die("Improper linktest level!\n");
}
$linktest = $options{"t"};
}
if (defined($options{"w"})) { if (defined($options{"w"})) {
$waitmode = 1; $waitmode = 1;
} }
......
...@@ -308,6 +308,7 @@ my $expt_path = $hashrow{'path'}; ...@@ -308,6 +308,7 @@ my $expt_path = $hashrow{'path'};
my $expt_locked = $hashrow{'expt_locked'}; my $expt_locked = $hashrow{'expt_locked'};
my $isbatchexpt = $hashrow{'batchmode'}; my $isbatchexpt = $hashrow{'batchmode'};
my $canceled = $hashrow{'canceled'}; my $canceled = $hashrow{'canceled'};
my $linktest_level = $hashrow{'linktest_level'};
my $swappablebit= $hashrow{'swappable'}; my $swappablebit= $hashrow{'swappable'};
my $idleswapbit = $hashrow{'idleswap'}; my $idleswapbit = $hashrow{'idleswap'};
my $autoswapbit = $hashrow{'autoswap'}; my $autoswapbit = $hashrow{'autoswap'};
...@@ -816,6 +817,39 @@ TBSaveExpLogFiles($pid, $eid); ...@@ -816,6 +817,39 @@ TBSaveExpLogFiles($pid, $eid);
# #
system("cp -Rfp $workdir/ $userdir/tbdata/"); system("cp -Rfp $workdir/ $userdir/tbdata/");
#
# Deal with linktest. If requested, swapping in or modifying, and experiment
# is indeed active, then run it!
#
# XXX - linktest uses files from $userdir/tbdata/, so the above cp must
# happen first!
#
if ($linktest_level && ExpState($pid, $eid) eq EXPTSTATE_ACTIVE) {
#
# Run it. No worries about failures.
#
my $output = "linktest.$$";
my $optarg = "-l $linktest_level -o $output";
print STDOUT "Running 'run_linktest.pl $optarg -e $pid/$eid'\n";
if (system("$tbdir/run_linktest.pl $optarg -e $pid/$eid") != 0) {
system("cat $output")
if (-r $output);
print STDERR "*** WARNING: ".
"Linktest run returned non-zero status!\n";
SENDMAIL("$user_name <$user_email>",
"Linktest Failure: $pid/$eid",
"Failure in linktest (level $linktest_level); ".
"returned non-zero status",
"$user_name <$user_email>",
"Cc: $expt_head_name <$expt_head_email>\n".
"Cc: $TBOPS",
($output));
}
}
# #
# Gather stats. # Gather stats.
# #
......
...@@ -62,6 +62,7 @@ function INITFORM($formfields, $projlist) ...@@ -62,6 +62,7 @@ function INITFORM($formfields, $projlist)
$defaults[exp_nsfile] = ""; # Multipart data. $defaults[exp_nsfile] = ""; # Multipart data.
$defaults[exp_preload] = "no"; $defaults[exp_preload] = "no";
$defaults[exp_batched] = "no"; $defaults[exp_batched] = "no";
$defaults[exp_linktest] = 0;
# #
# Allow formfields that are already set to override defaults # Allow formfields that are already set to override defaults
...@@ -140,7 +141,7 @@ function CHECKFORM(&$formfields, $projlist) ...@@ -140,7 +141,7 @@ function CHECKFORM(&$formfields, $projlist)
function SPITFORM($formfields, $errors) function SPITFORM($formfields, $errors)
{ {
global $TBDB_PIDLEN, $TBDB_GIDLEN, $TBDB_EIDLEN, $TBDOCBASE; global $TBDB_PIDLEN, $TBDB_GIDLEN, $TBDB_EIDLEN, $TBDOCBASE;
global $view, $view_style, $projlist; global $view, $view_style, $projlist, $linktest_levels;
PAGEHEADER("Begin a Testbed Experiment"); PAGEHEADER("Begin a Testbed Experiment");
...@@ -468,6 +469,31 @@ function SPITFORM($formfields, $errors) ...@@ -468,6 +469,31 @@ function SPITFORM($formfields, $errors)
</tr>"; </tr>";
} }
#
# Run linktest, and level.
#
if (STUDLY()) {
echo "<tr>
<td><a href='$TBDOCBASE/doc/docwrapper.php3?".
"docname=linktest.html'>Linktest</a> Option:</td>
<td><select name=\"formfields[exp_linktest]\">
<option value=0>Skip Linktest </option>\n";
for ($i = 1; $i <= TBDB_LINKTEST_MAX; $i++) {
$selected = "";
if (strcmp($formfields[exp_linktest], "$i") == 0)
$selected = "selected";
echo " <option $selected value=$i>Level $i - " .
$linktest_levels[$i] . "</option>\n";
}
echo " </select>";
echo " (Experimental; will not affect swapin)";
echo " </td>
</tr>\n";
}
# #
# Batch Experiment? # Batch Experiment?
# #
......
...@@ -257,12 +257,22 @@ else { ...@@ -257,12 +257,22 @@ else {
$formfields[exp_autoswap] = 1; $formfields[exp_autoswap] = 1;
if (!isset($formfields[exp_autoswap_timeout]) || if (!isset($formfields[exp_autoswap_timeout]) ||
!preg_match("/[\d]+/", $formfields[exp_idleswap_timeout]) || !preg_match("/^[\d]+$/", $formfields[exp_idleswap_timeout]) ||
($formfields[exp_autoswap_timeout] + 0) <= 0) { ($formfields[exp_autoswap_timeout] + 0) <= 0) {
$errors["Max. Duration"] = "No or invalid time provided"; $errors["Max. Duration"] = "No or invalid time provided";
} }
} }
#
# Linktest option
#
if (isset($formfields[exp_linktest]) && $formfields[exp_linktest] != "") {
if (!preg_match("/^[\d]+$/", $formfields[exp_linktest]) ||
$formfields[exp_linktest] < 0 || $formfields[exp_linktest] > 4) {
$errors["Linktest Option"] = "Invalid level selection";
}
}
# #
# If any errors, stop now. pid/eid/gid must be okay before continuing. # If any errors, stop now. pid/eid/gid must be okay before continuing.
# #
...@@ -307,6 +317,10 @@ elseif ($nsfilelocale == "nsref") { ...@@ -307,6 +317,10 @@ elseif ($nsfilelocale == "nsref") {
else { else {
$thensfile = "/tmp/$uid-$nsref.nsfile"; $thensfile = "/tmp/$uid-$nsref.nsfile";
} }
if (! file_exists($thensfile)) {
$errors["NS File"] = "Temp file no longer exists on server";
XMLERROR();
}
$deletensfile = 1; $deletensfile = 1;
} }
elseif ($nsfilelocale == "inline") { elseif ($nsfilelocale == "inline") {
...@@ -360,6 +374,7 @@ else { ...@@ -360,6 +374,7 @@ else {
$exp_batched = 0; $exp_batched = 0;
$exp_preload = 0; $exp_preload = 0;
$batcharg = "-i"; $batcharg = "-i";
$linktestarg = "";
if (isset($formfields[exp_batched]) && if (isset($formfields[exp_batched]) &&
strcmp($formfields[exp_batched], "Yep") == 0) { strcmp($formfields[exp_batched], "Yep") == 0) {
...@@ -371,6 +386,9 @@ if (isset($formfields[exp_preload]) && ...@@ -371,6 +386,9 @@ if (isset($formfields[exp_preload]) &&
$exp_preload = 1; $exp_preload = 1;
$batcharg .= " -f"; $batcharg .= " -f";
} }
if (isset($formfields[exp_linktest]) && $formfields[exp_linktest] != "") {
$linktestarg = "-t " . $formfields[exp_linktest];
}
# #
# We need the email address for messages below. # We need the email address for messages below.
...@@ -391,7 +409,7 @@ set_time_limit(0); ...@@ -391,7 +409,7 @@ set_time_limit(0);
$retval = SUEXEC($uid, $unix_gid, $retval = SUEXEC($uid, $unix_gid,
"webbatchexp $batcharg -E $exp_desc $exp_swappable ". "webbatchexp $batcharg -E $exp_desc $exp_swappable ".
"-p $exp_pid -g $exp_gid -e $exp_id ". "$linktestarg -p $exp_pid -g $exp_gid -e $exp_id ".
($nonsfile ? "" : "$thensfile"), ($nonsfile ? "" : "$thensfile"),
SUEXEC_ACTION_IGNORE); SUEXEC_ACTION_IGNORE);
......
...@@ -149,6 +149,15 @@ define("TBDB_USER_INTERFACE_PLAB", "plab"); ...@@ -149,6 +149,15 @@ define("TBDB_USER_INTERFACE_PLAB", "plab");
$TBDB_USER_INTERFACE_LIST = array(TBDB_USER_INTERFACE_EMULAB, $TBDB_USER_INTERFACE_LIST = array(TBDB_USER_INTERFACE_EMULAB,
TBDB_USER_INTERFACE_PLAB); TBDB_USER_INTERFACE_PLAB);
# Lintest levels.
$linktest_levels = array();
$linktest_levels[0] = "Skip Linktest";
$linktest_levels[1] = "Connectivity and Latency";
$linktest_levels[2] = "Static Routing";
$linktest_levels[3] = "Loss";
$linktest_levels[4] = "Bandwidth";
define("TBDB_LINKTEST_MAX", 4);
# #
# Convert a trust string to the above numeric values. # Convert a trust string to the above numeric values.
# #
......
<?php <?php
# #
# EMULAB-COPYRIGHT # EMULAB-COPYRIGHT
# Copyright (c) 2000-2003 University of Utah and the Flux Group. # Copyright (c) 2000-2004 University of Utah and the Flux Group.
# All rights reserved. # All rights reserved.
# #
include("defs.php3"); include("defs.php3");
...@@ -50,7 +50,7 @@ if (! TBExptAccessCheck($uid, $pid, $eid, $TB_EXPT_MODIFY)) { ...@@ -50,7 +50,7 @@ if (! TBExptAccessCheck($uid, $pid, $eid, $TB_EXPT_MODIFY)) {
# #
function SPITFORM($formfields, $errors) function SPITFORM($formfields, $errors)
{ {
global $eid, $pid, $TBDOCBASE; global $eid, $pid, $TBDOCBASE, $linktest_levels;
# #
# Standard Testbed Header # Standard Testbed Header
...@@ -260,6 +260,31 @@ function SPITFORM($formfields, $errors) ...@@ -260,6 +260,31 @@ function SPITFORM($formfields, $errors)
</td> </td>
</tr>\n"; </tr>\n";
#
# Run linktest, and level.
#
if (STUDLY()) {
echo "<tr>
<td><a href='$TBDOCBASE/doc/docwrapper.php3?".
"docname=linktest.html'>Linktest</a> Option:</td>
<td><select name=\"formfields[linktest_level]\">
<option value=0>Skip Linktest </option>\n";
for ($i = 1; $i <= TBDB_LINKTEST_MAX; $i++) {
$selected = "";
if (strcmp($formfields[linktest_level], "$i") == 0)
$selected = "selected";
echo " <option $selected value=$i>Level $i - " .
$linktest_levels[$i] . "</option>\n";
}
echo " </select>";
echo " (Experimental; will not affect swapin)";
echo " </td>
</tr>\n";
}
echo "<tr> echo "<tr>
<td colspan=2 align=center> <td colspan=2 align=center>
<b><input type=submit name=submit value=Submit></b> <b><input type=submit name=submit value=Submit></b>
...@@ -304,6 +329,7 @@ $defaults[autoswap_timeout] = $row[autoswap_timeout] / 60.0; ...@@ -304,6 +329,7 @@ $defaults[autoswap_timeout] = $row[autoswap_timeout] / 60.0;
$defaults[idle_ignore] = $row[idle_ignore]; $defaults[idle_ignore] = $row[idle_ignore];
$defaults[mem_usage] = $row["mem_usage"]; $defaults[mem_usage] = $row["mem_usage"];
$defaults[cpu_usage] = $row["cpu_usage"]; $defaults[cpu_usage] = $row["cpu_usage"];
$defaults[linktest_level] = $row["linktest_level"];
# #
# A couple of defaults for turning things on. # A couple of defaults for turning things on.
...@@ -478,6 +504,24 @@ else { ...@@ -478,6 +504,24 @@ else {
$inserts[] = "mem_usage=0"; $inserts[] = "mem_usage=0";
} }
#
# Linktest level
#
if (isset($formfields[linktest_level]) &&
strcmp($formfields[linktest_level], "")) {
if (($formfields[linktest_level] + 0) < 0 ||
($formfields[linktest_level] + 0) > 4) {
$errors["Linktest Level"] = "Invalid linktest level";
}
else {
$inserts[] = "linktest_level=$formfields[linktest_level]";
}
}
else {
$inserts[] = "linktest_level=0";
}
# #
# Spit any errors before dealing with batchmode, which changes the DB. # Spit any errors before dealing with batchmode, which changes the DB.
# #
......
<?php
#
# EMULAB-COPYRIGHT
# Copyright (c) 2000-2004 University of Utah and the Flux Group.
# All rights reserved.
#
include("defs.php3");
include("showstuff.php3");
#
# No PAGEHEADER since we spit out a Location header later. See below.
#
#
# Only known and logged in users can do this.
#
$uid = GETLOGIN();
LOGGEDINORDIE($uid);
#
# Check to make sure a valid experiment.
#
if (isset($pid) && strcmp($pid, "") &&
isset($eid) && strcmp($eid, "")) {
if (! TBvalid_eid($eid)) {
PAGEARGERROR("$eid is contains invalid characters!");
}
if (! TBvalid_pid($pid)) {
PAGEARGERROR("$pid is contains invalid characters!");
}
if (! TBValidExperiment($pid, $eid)) {
USERERROR("$pid/$eid is not a valid experiment!", 1);
}
if (! TBExptAccessCheck($uid, $pid, $eid, $TB_EXPT_MODIFY)) {
USERERROR("You do not have permission to run linktest on $pid/$eid!",
1);
}
}
else {
PAGEARGERROR("Must specify pid and eid!");
}
$query_result = DBQueryFatal("select gid,linktest_level from experiments ".
"where pid='$pid' and eid='$eid'");
$row = mysql_fetch_array($query_result);
$gid = $row[0];
#
# See if a level came in. If not, then get the default from the DB.
#
if (!isset($level) || $level == "") {
$level = $row[1];
}
elseif (! TBvalid_tinyint($level) ||
$level < 0 || $level > TBDB_LINKTEST_MAX) {
PAGEARGERROR("Linktest level must be an integer 0 <= level <= ".
TBDB_LINKTEST_MAX);
}
#
# We run this twice. The first time we are checking for a confirmation
# by putting up a form. The next time through the confirmation will be
# set. Or, the user can hit the cancel button, in which case we should
# probably redirect the browser back up a level.
#
if ($canceled) {
PAGEHEADER("Run Linktest");
echo "<center><h3><br>
Operation canceled!
</h3></center>\n";
PAGEFOOTER();
return;
}
if (!$confirmed) {
PAGEHEADER("Run Linktest at level $level");
echo "<font size=+2>Experiment <b>".
"<a href='showproject.php3?pid=$pid'>$pid</a>/".
"<a href='showexp.php3?pid=$pid&eid=$eid'>$eid</a></b></font>\n";
echo "<center><font size=+2><br>
Are you <b>REALLY</b>
sure you want to run linktest at level $level?
</font>\n";
SHOWEXP($pid, $eid, 1);
echo "<form action=linktest.php3 method=post>";
echo "<input type=hidden name=pid value=$pid>\n";
echo "<input type=hidden name=eid value=$eid>\n";
echo "<table align=center border=1>\n";
echo "<tr>
<td><a href='$TBDOCBASE/doc/docwrapper.php3?".
"docname=linktest.html'>Linktest</a> Option:</td>
<td><select name=level>
<option value=0>Skip Linktest </option>\n";
for ($i = 1; $i <= TBDB_LINKTEST_MAX; $i++) {
$selected = "";
if (strcmp("$level", "$i") == 0)
$selected = "selected";
echo " <option $selected value=$i>Level $i - " .
$linktest_levels[$i] . "</option>\n";
}
echo " </select>";
echo " </td>
</tr>
</table><br>\n";
echo "<b><input type=submit name=confirmed value=Confirm></b>\n";
echo "<b><input type=submit name=canceled value=Cancel></b>\n";
echo "</form>\n";
echo "</center>\n";
PAGEFOOTER();
return;
}
#
# A cleanup function to keep the child from becoming a zombie, since
# the script is terminated, but the children are left to roam.
#
$fp = 0;
function SPEWCLEANUP()
{
global $fp;
if (connection_aborted() && $fp) {
pclose($fp);
}
exit();
}
register_shutdown_function("SPEWCLEANUP");
ignore_user_abort(1);
# For backend.
TBGroupUnixInfo($pid, $gid, $unix_gid, $unix_name);
$fp = popen("$TBSUEXEC_PATH $uid $unix_gid weblinktest -l $level -e $pid/$eid",
"r");
if (! $fp) {
USERERROR("Linktest failed!", 1);
}
header("Content-Type: text/plain");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
flush();
echo date("D M d G:i:s T");
echo "\n";
echo "Starting linktest run at level $level\n";
flush();
while (!feof($fp)) {
$string = fgets($fp, 1024);
echo "$string";
flush();
}
$retval = pclose($fp);
$fp = 0;
if ($retval == 0)
echo "Linktest run was successful!\n";
echo date("D M d G:i:s T");
echo "\n";
?>
...@@ -172,6 +172,11 @@ if ($wireless) { ...@@ -172,6 +172,11 @@ if ($wireless) {
WRITESUBMENUBUTTON("Show History", WRITESUBMENUBUTTON("Show History",
"showstats.php3?showby=expt&which=$expindex"); "showstats.php3?showby=expt&which=$expindex");
if (STUDLY()) {
WRITESUBMENUBUTTON("Run Linktest",
"linktest.php3?pid=$exp_pid&eid=$exp_eid");
}
if (ISADMIN($uid)) { if (ISADMIN($uid)) {
if ($expstate == $TB_EXPTSTATE_ACTIVE) { if ($expstate == $TB_EXPTSTATE_ACTIVE) {
SUBMENUSECTION("Beta-Test Options"); SUBMENUSECTION("Beta-Test Options");
......
...@@ -416,6 +416,19 @@ function ISADMIN($uid = 1) { ...@@ -416,6 +416,19 @@ function ISADMIN($uid = 1) {
(CHECKLOGIN_LOGGEDIN|CHECKLOGIN_ISADMIN)); (CHECKLOGIN_LOGGEDIN|CHECKLOGIN_ISADMIN));
} }
function STUDLY() {
global $CHECKLOGIN_STATUS;
if ($CHECKLOGIN_STATUS == CHECKLOGIN_NOSTATUS) {
$uid=GETUID();
TBERROR("STUDLY: $uid is not logged in!", 1);
}
return (($CHECKLOGIN_STATUS &
(CHECKLOGIN_LOGGEDIN|CHECKLOGIN_STUDLY)) ==
(CHECKLOGIN_LOGGEDIN|CHECKLOGIN_STUDLY));
}
# Is this user a real administrator (ignore onoff bit). # Is this user a real administrator (ignore onoff bit).
function ISADMINISTRATOR() { function ISADMINISTRATOR() {
global $CHECKLOGIN_STATUS; global $CHECKLOGIN_STATUS;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment