|
|
@@ -8,7 +8,7 @@ global $checklastshare, $poolinputs, $hidefields;
|
|
|
global $ignorerefresh, $changerefresh, $autorefresh;
|
|
|
global $allowcustompages, $customsummarypages;
|
|
|
global $miner_font_family, $miner_font_size;
|
|
|
-global $colouroverride, $placebuttons;
|
|
|
+global $colouroverride, $placebuttons, $userlist;
|
|
|
#
|
|
|
# See API-README for more details of these variables and how
|
|
|
# to configure miner.php
|
|
|
@@ -20,6 +20,9 @@ $title = 'Mine';
|
|
|
# Set $readonly to false then it will check BFGMiner 'privileged'
|
|
|
$readonly = false;
|
|
|
#
|
|
|
+# Set $userlist to null to allow anyone access or read API-README
|
|
|
+$userlist = null;
|
|
|
+#
|
|
|
# Set $notify to false to NOT attempt to display the notify command
|
|
|
# Set $notify to true to attempt to display the notify command
|
|
|
$notify = true;
|
|
|
@@ -110,23 +113,23 @@ $poolspage = array(
|
|
|
'Utility', 'Hardware Errors=HW Errs', 'Network Blocks=Net Blks'),
|
|
|
'POOL+STATS' => array('STATS.ID=ID', 'POOL.URL=URL',
|
|
|
'POOL.Has Stratum=Stratum', 'POOL.Stratum Active=StrAct',
|
|
|
- 'STATS.Bytes Sent=BSent',
|
|
|
- 'STATS.Bytes Recv=BRecv'));
|
|
|
+ 'STATS.Net Bytes Sent=NSent',
|
|
|
+ 'STATS.Net Bytes Recv=NRecv'));
|
|
|
#
|
|
|
$poolssum = array(
|
|
|
'SUMMARY' => array('MHS av', 'Found Blocks', 'Accepted',
|
|
|
'Rejected', 'Utility', 'Hardware Errors'),
|
|
|
'POOL+STATS' => array(
|
|
|
- 'STATS.Bytes Sent',
|
|
|
- 'STATS.Bytes Recv'));
|
|
|
+ 'STATS.Net Bytes Sent',
|
|
|
+ 'STATS.Net Bytes Recv'));
|
|
|
#
|
|
|
$poolsext = array(
|
|
|
'POOL+STATS' => array(
|
|
|
'where' => null,
|
|
|
'group' => array('POOL.URL', 'POOL.Has Stratum', 'POOL.Stratum Active'),
|
|
|
'calc' => array(
|
|
|
- 'STATS.Bytes Sent' => 'sum',
|
|
|
- 'STATS.Bytes Recv' => 'sum'),
|
|
|
+ 'STATS.Net Bytes Sent' => 'sum',
|
|
|
+ 'STATS.Net Bytes Recv' => 'sum'),
|
|
|
'having' => array(array('STATS.Bytes Recv', '>', 0)))
|
|
|
);
|
|
|
|
|
|
@@ -208,6 +211,10 @@ $rigerror = array();
|
|
|
global $rownum;
|
|
|
$rownum = 0;
|
|
|
#
|
|
|
+// Login
|
|
|
+global $ses;
|
|
|
+$ses = 'rutroh';
|
|
|
+#
|
|
|
function getcss($cssname, $dom = false)
|
|
|
{
|
|
|
global $colourtable, $colouroverride;
|
|
|
@@ -235,7 +242,7 @@ function getdom($domname)
|
|
|
return getcss($domname, true);
|
|
|
}
|
|
|
#
|
|
|
-function htmlhead($checkapi, $rig, $pg = null)
|
|
|
+function htmlhead($checkapi, $rig, $pg = null, $noscript = false)
|
|
|
{
|
|
|
global $title, $miner_font_family, $miner_font_size;
|
|
|
global $error, $readonly, $poolinputs, $here;
|
|
|
@@ -281,8 +288,10 @@ td.lst { $miner_font ".getcss('td.lst')."}
|
|
|
td.hi { $miner_font ".getcss('td.hi')."}
|
|
|
td.lo { $miner_font ".getcss('td.lo')."}
|
|
|
</style>
|
|
|
-</head><body".getdom('body').">
|
|
|
-<script type='text/javascript'>
|
|
|
+</head><body".getdom('body').">\n";
|
|
|
+if ($noscript === false)
|
|
|
+{
|
|
|
+echo "<script type='text/javascript'>
|
|
|
function pr(a,m){if(m!=null){if(!confirm(m+'?'))return}window.location='$here?ref=$autorefresh'+a}\n";
|
|
|
|
|
|
if ($ignorerefresh == false)
|
|
|
@@ -296,8 +305,9 @@ function prs2(a,n,r){var v=document.getElementById('gi'+n).value;var c=a.substr(
|
|
|
if ($poolinputs === true)
|
|
|
echo "function cbs(s){var t=s.replace(/\\\\/g,'\\\\\\\\'); return t.replace(/,/g, '\\\\,')}\nfunction pla(r){var u=document.getElementById('purl').value;var w=document.getElementById('pwork').value;var p=document.getElementById('ppass').value;pr('&rig='+r+'&arg=addpool|'+cbs(u)+','+cbs(w)+','+cbs(p),'Add Pool '+u)}\nfunction psp(r){var p=document.getElementById('prio').value;pr('&rig='+r+'&arg=poolpriority|'+p,'Set Pool Priorities to '+p)}\n";
|
|
|
}
|
|
|
+echo "</script>\n";
|
|
|
+}
|
|
|
?>
|
|
|
-</script>
|
|
|
<table width=100% height=100% border=0 cellpadding=0 cellspacing=0 summary='Mine'>
|
|
|
<tr><td align=center valign=top>
|
|
|
<table border=0 cellpadding=4 cellspacing=0 summary='Mine'>
|
|
|
@@ -574,6 +584,14 @@ function classlastshare($when, $alldata, $warnclass, $errorclass)
|
|
|
return '';
|
|
|
}
|
|
|
#
|
|
|
+function endzero($num)
|
|
|
+{
|
|
|
+ $rep = preg_replace('/0*$/', '', $num);
|
|
|
+ if ($rep === '')
|
|
|
+ $rep = '0';
|
|
|
+ return $rep;
|
|
|
+}
|
|
|
+#
|
|
|
function fmt($section, $name, $value, $when, $alldata)
|
|
|
{
|
|
|
global $dfmt, $rownum;
|
|
|
@@ -832,12 +850,16 @@ function fmt($section, $name, $value, $when, $alldata)
|
|
|
case 'total.Diff1 Work':
|
|
|
case 'STATS.Times Sent':
|
|
|
case 'STATS.Bytes Sent':
|
|
|
+ case 'STATS.Net Bytes Sent':
|
|
|
case 'STATS.Times Recv':
|
|
|
case 'STATS.Bytes Recv':
|
|
|
+ case 'STATS.Net Bytes Recv':
|
|
|
case 'total.Times Sent':
|
|
|
case 'total.Bytes Sent':
|
|
|
+ case 'total.Net Bytes Sent':
|
|
|
case 'total.Times Recv':
|
|
|
case 'total.Bytes Recv':
|
|
|
+ case 'total.Net Bytes Recv':
|
|
|
$parts = explode('.', $value, 2);
|
|
|
if (count($parts) == 1)
|
|
|
$dec = '';
|
|
|
@@ -845,6 +867,23 @@ function fmt($section, $name, $value, $when, $alldata)
|
|
|
$dec = '.'.$parts[1];
|
|
|
$ret = number_format((float)$parts[0]).$dec;
|
|
|
break;
|
|
|
+ case 'STATS.Hs':
|
|
|
+ case 'STATS.W':
|
|
|
+ case 'STATS.history_time':
|
|
|
+ case 'STATS.Pool Wait':
|
|
|
+ case 'STATS.Pool Max':
|
|
|
+ case 'STATS.Pool Min':
|
|
|
+ case 'STATS.Pool Av':
|
|
|
+ case 'STATS.Min Diff':
|
|
|
+ case 'STATS.Max Diff':
|
|
|
+ case 'STATS.Work Diff':
|
|
|
+ $parts = explode('.', $value, 2);
|
|
|
+ if (count($parts) == 1)
|
|
|
+ $dec = '';
|
|
|
+ else
|
|
|
+ $dec = '.'.endzero($parts[1]);
|
|
|
+ $ret = number_format((float)$parts[0]).$dec;
|
|
|
+ break;
|
|
|
case 'GPU.Status':
|
|
|
case 'PGA.Status':
|
|
|
case 'DEVS.Status':
|
|
|
@@ -1495,7 +1534,6 @@ function doforeach($cmd, $des, $sum, $head, $datetime)
|
|
|
#
|
|
|
function refreshbuttons()
|
|
|
{
|
|
|
- global $readonly;
|
|
|
global $ignorerefresh, $changerefresh, $autorefresh;
|
|
|
|
|
|
if ($ignorerefresh == false && $changerefresh == true)
|
|
|
@@ -1509,7 +1547,7 @@ function refreshbuttons()
|
|
|
#
|
|
|
function pagebuttons($rig, $pg)
|
|
|
{
|
|
|
- global $readonly, $rigs;
|
|
|
+ global $readonly, $rigs, $userlist, $ses;
|
|
|
global $allowcustompages, $customsummarypages;
|
|
|
|
|
|
if ($rig === null)
|
|
|
@@ -1545,18 +1583,33 @@ function pagebuttons($rig, $pg)
|
|
|
}
|
|
|
|
|
|
echo '<tr><td><table cellpadding=0 cellspacing=0 border=0><tr><td nowrap>';
|
|
|
- if ($prev !== null)
|
|
|
- echo riginput($prev, 'Prev').' ';
|
|
|
- echo "<input type=button value='Refresh' onclick='pr(\"$refresh\",null)'> ";
|
|
|
- if ($next !== null)
|
|
|
- echo riginput($next, 'Next').' ';
|
|
|
- echo ' ';
|
|
|
- if (count($rigs) > 1)
|
|
|
- echo "<input type=button value='Summary' onclick='pr(\"\",null)'> ";
|
|
|
+ if ($userlist === null || isset($_SESSION[$ses]))
|
|
|
+ {
|
|
|
+ if ($prev !== null)
|
|
|
+ echo riginput($prev, 'Prev').' ';
|
|
|
+ echo "<input type=button value='Refresh' onclick='pr(\"$refresh\",null)'> ";
|
|
|
+ if ($next !== null)
|
|
|
+ echo riginput($next, 'Next').' ';
|
|
|
+ echo ' ';
|
|
|
+ if (count($rigs) > 1)
|
|
|
+ echo "<input type=button value='Summary' onclick='pr(\"\",null)'> ";
|
|
|
+ }
|
|
|
|
|
|
if ($allowcustompages === true)
|
|
|
- foreach ($customsummarypages as $pagename => $data)
|
|
|
+ {
|
|
|
+ if ($userlist === null || isset($_SESSION[$ses]))
|
|
|
+ $list = $customsummarypages;
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if ($userlist !== null && isset($userlist['def']))
|
|
|
+ $list = array_flip($userlist['def']);
|
|
|
+ else
|
|
|
+ $list = array();
|
|
|
+ }
|
|
|
+
|
|
|
+ foreach ($list as $pagename => $data)
|
|
|
echo "<input type=button value='$pagename' onclick='pr(\"&pg=$pagename\",null)'> ";
|
|
|
+ }
|
|
|
|
|
|
echo '</td><td width=100%> </td><td nowrap>';
|
|
|
if ($rig !== null && $readonly === false)
|
|
|
@@ -1568,6 +1621,12 @@ function pagebuttons($rig, $pg)
|
|
|
echo " <input type=button value='Quit' onclick='prc(\"quit&rig=$rig\",\"Quit BFGMiner$rg\")'>";
|
|
|
}
|
|
|
refreshbuttons();
|
|
|
+ if (isset($_SESSION[$ses]))
|
|
|
+ echo " <input type=button value='Logout' onclick='pr(\"&logout=1\",null)'>";
|
|
|
+ else
|
|
|
+ if ($userlist !== null)
|
|
|
+ echo " <input type=button value='Login' onclick='pr(\"&login=1\",null)'>";
|
|
|
+
|
|
|
echo "</td></tr></table></td></tr>";
|
|
|
}
|
|
|
#
|
|
|
@@ -2397,13 +2456,126 @@ function showcustompage($pagename)
|
|
|
pagebuttons(null, $pagename);
|
|
|
}
|
|
|
#
|
|
|
+function onlylogin()
|
|
|
+{
|
|
|
+ global $here;
|
|
|
+
|
|
|
+ htmlhead(false, null, null, true);
|
|
|
+
|
|
|
+?>
|
|
|
+<tr height=15%><td> </td></tr>
|
|
|
+<tr><td>
|
|
|
+ <center>
|
|
|
+ <table width=384 height=368 cellpadding=0 cellspacing=0 border=0>
|
|
|
+ <tr><td>
|
|
|
+ <table width=100% height=100% border=0 align=center cellpadding=5 cellspacing=0>
|
|
|
+ <tr><td><form action='<?php echo $here; ?>' method=post>
|
|
|
+ <table width=200 border=0 align=center cellpadding=5 cellspacing=0>
|
|
|
+ <tr><td height=120 colspan=2> </td></tr>
|
|
|
+ <tr><td colspan=2 align=center valign=middle>
|
|
|
+ <h2>LOGIN</h2></td></tr>
|
|
|
+ <tr><td align=center valign=middle><div align=right>Username:</div></td>
|
|
|
+ <td height=33 align=center valign=middle>
|
|
|
+ <input type=text name=rut size=18></td></tr>
|
|
|
+ <tr><td align=center valign=middle><div align=right>Password:</div></td>
|
|
|
+ <td height=33 align=center valign=middle>
|
|
|
+ <input type=password name=roh size=18></td></tr>
|
|
|
+ <tr valign=top><td></td><td><input type=submit value=Login>
|
|
|
+ </td></tr>
|
|
|
+ </table></form></td></tr>
|
|
|
+ </table></td></tr>
|
|
|
+ </table></center>
|
|
|
+</td></tr>
|
|
|
+<?php
|
|
|
+}
|
|
|
+#
|
|
|
+function checklogin()
|
|
|
+{
|
|
|
+ global $allowcustompages, $customsummarypages;
|
|
|
+ global $readonly, $userlist, $ses;
|
|
|
+
|
|
|
+ $out = trim(getparam('logout', true));
|
|
|
+ if ($out !== null && $out !== '' && isset($_SESSION[$ses]))
|
|
|
+ unset($_SESSION[$ses]);
|
|
|
+
|
|
|
+ $login = trim(getparam('login', true));
|
|
|
+ if ($login !== null && $login !== '')
|
|
|
+ {
|
|
|
+ if (isset($_SESSION[$ses]))
|
|
|
+ unset($_SESSION[$ses]);
|
|
|
+
|
|
|
+ onlylogin();
|
|
|
+ return 'login';
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($userlist === null)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ $rut = trim(getparam('rut', true));
|
|
|
+ $roh = trim(getparam('roh', true));
|
|
|
+
|
|
|
+ if (($rut !== null && $rut !== '') || ($roh !== null && $roh !== ''))
|
|
|
+ {
|
|
|
+ if (isset($_SESSION[$ses]))
|
|
|
+ unset($_SESSION[$ses]);
|
|
|
+
|
|
|
+ if ($rut !== null && $rut !== '' && $roh !== null && $roh !== '')
|
|
|
+ {
|
|
|
+ if (isset($userlist['sys']) && isset($userlist['sys'][$rut])
|
|
|
+ && ($userlist['sys'][$rut] === $roh))
|
|
|
+ {
|
|
|
+ $_SESSION[$ses] = true;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isset($userlist['usr']) && isset($userlist['usr'][$rut])
|
|
|
+ && ($userlist['usr'][$rut] === $roh))
|
|
|
+ {
|
|
|
+ $_SESSION[$ses] = false;
|
|
|
+ $readonly = true;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isset($_SESSION[$ses]))
|
|
|
+ {
|
|
|
+ if ($_SESSION[$ses] == false)
|
|
|
+ $readonly = true;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isset($userlist['def']) && $allowcustompages === true)
|
|
|
+ {
|
|
|
+ // Ensure at least one exists
|
|
|
+ foreach ($userlist['def'] as $pg)
|
|
|
+ if (isset($customsummarypages[$pg]))
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ onlylogin();
|
|
|
+ return 'login';
|
|
|
+}
|
|
|
+#
|
|
|
function display()
|
|
|
{
|
|
|
global $miner, $port;
|
|
|
global $readonly, $notify, $rigs;
|
|
|
global $ignorerefresh, $autorefresh;
|
|
|
- global $allowcustompages;
|
|
|
+ global $allowcustompages, $customsummarypages;
|
|
|
global $placebuttons;
|
|
|
+ global $userlist, $ses;
|
|
|
+
|
|
|
+ $pagesonly = checklogin();
|
|
|
+
|
|
|
+ if ($pagesonly === 'login')
|
|
|
+ return;
|
|
|
+
|
|
|
+ if ($rigs == null or count($rigs) == 0)
|
|
|
+ {
|
|
|
+ otherrow("<td>No rigs defined</td>");
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
if ($ignorerefresh == false)
|
|
|
{
|
|
|
@@ -2412,52 +2584,65 @@ function display()
|
|
|
$autorefresh = intval($ref);
|
|
|
}
|
|
|
|
|
|
- $rig = trim(getparam('rig', true));
|
|
|
-
|
|
|
- $arg = trim(getparam('arg', true));
|
|
|
- $preprocess = null;
|
|
|
- if ($arg != null and $arg != '')
|
|
|
+ if ($pagesonly !== true)
|
|
|
{
|
|
|
- $num = null;
|
|
|
- if ($rig != null and $rig != '')
|
|
|
- {
|
|
|
- if ($rig >= 0 and $rig < count($rigs))
|
|
|
- $num = $rig;
|
|
|
- }
|
|
|
- else
|
|
|
- if (count($rigs) == 0)
|
|
|
- $num = 0;
|
|
|
+ $rig = trim(getparam('rig', true));
|
|
|
|
|
|
- if ($num != null)
|
|
|
+ $arg = trim(getparam('arg', true));
|
|
|
+ $preprocess = null;
|
|
|
+ if ($arg != null and $arg != '')
|
|
|
{
|
|
|
- $parts = explode(':', $rigs[$num], 3);
|
|
|
- if (count($parts) >= 2)
|
|
|
+ if ($rig != null and $rig != '' and $rig >= 0 and $rig < count($rigs))
|
|
|
{
|
|
|
- $miner = $parts[0];
|
|
|
- $port = $parts[1];
|
|
|
+ $parts = explode(':', $rigs[$rig], 3);
|
|
|
+ if (count($parts) >= 2)
|
|
|
+ {
|
|
|
+ $miner = $parts[0];
|
|
|
+ $port = $parts[1];
|
|
|
|
|
|
- if ($readonly !== true)
|
|
|
- $preprocess = $arg;
|
|
|
+ if ($readonly !== true)
|
|
|
+ $preprocess = $arg;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if ($rigs == null or count($rigs) == 0)
|
|
|
- {
|
|
|
- otherrow("<td>No rigs defined</td>");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
if ($allowcustompages === true)
|
|
|
{
|
|
|
$pg = trim(getparam('pg', true));
|
|
|
- if ($pg != null && $pg != '')
|
|
|
+ if ($pagesonly === true)
|
|
|
+ {
|
|
|
+ if ($pg !== null && $pg !== '')
|
|
|
+ {
|
|
|
+ if ($userlist !== null && isset($userlist['def'])
|
|
|
+ && !in_array($pg, $userlist['def']))
|
|
|
+ $pg = null;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if ($userlist !== null && isset($userlist['def']))
|
|
|
+ foreach ($userlist['def'] as $pglook)
|
|
|
+ if (isset($customsummarypages[$pglook]))
|
|
|
+ {
|
|
|
+ $pg = $pglook;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($pg !== null && $pg !== '')
|
|
|
{
|
|
|
showcustompage($pg);
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if ($pagesonly === true)
|
|
|
+ {
|
|
|
+ onlylogin();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
if (count($rigs) == 1)
|
|
|
{
|
|
|
$parts = explode(':', $rigs[0], 3);
|