mirror of
https://github.com/GOSTSec/sgminer
synced 2025-02-03 10:35:03 +00:00
Merge branch 'master' of git://github.com/ckolivas/cgminer.git
This commit is contained in:
commit
3347f8069a
@ -285,7 +285,14 @@ miner.php - an example web page to access the API
|
|||||||
Feature Changelog for external applications using the API:
|
Feature Changelog for external applications using the API:
|
||||||
|
|
||||||
|
|
||||||
API V1.11
|
API V1.12
|
||||||
|
|
||||||
|
Modified API commands:
|
||||||
|
'stats' - more pool stats added
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
API V1.11 (cgminer v2.4.2)
|
||||||
|
|
||||||
Modified API commands:
|
Modified API commands:
|
||||||
'save' no longer requires a filename (use default if not specified)
|
'save' no longer requires a filename (use default if not specified)
|
||||||
|
32
api.c
32
api.c
@ -161,7 +161,7 @@ static const char SEPARATOR = '|';
|
|||||||
#define SEPSTR "|"
|
#define SEPSTR "|"
|
||||||
static const char GPUSEP = ',';
|
static const char GPUSEP = ',';
|
||||||
|
|
||||||
static const char *APIVERSION = "1.11";
|
static const char *APIVERSION = "1.12";
|
||||||
static const char *DEAD = "Dead";
|
static const char *DEAD = "Dead";
|
||||||
static const char *SICK = "Sick";
|
static const char *SICK = "Sick";
|
||||||
static const char *NOSTART = "NoStart";
|
static const char *NOSTART = "NoStart";
|
||||||
@ -2007,7 +2007,7 @@ void dosave(__maybe_unused SOCKETTYPE c, char *param, bool isjson)
|
|||||||
ptr = NULL;
|
ptr = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int itemstats(int i, char *id, struct cgminer_stats *stats, char *extra, bool isjson)
|
static int itemstats(int i, char *id, struct cgminer_stats *stats, struct cgminer_pool_stats *pool_stats, char *extra, bool isjson)
|
||||||
{
|
{
|
||||||
char buf[TMPBUFSIZ];
|
char buf[TMPBUFSIZ];
|
||||||
|
|
||||||
@ -2017,13 +2017,31 @@ static int itemstats(int i, char *id, struct cgminer_stats *stats, char *extra,
|
|||||||
extra = (char *)BLANK;
|
extra = (char *)BLANK;
|
||||||
|
|
||||||
sprintf(buf, isjson
|
sprintf(buf, isjson
|
||||||
? "%s{\"STATS\":%d,\"ID\":\"%s\",\"Elapsed\":%.0f,\"Calls\":%d,\"Wait\":%ld.%06ld,\"Max\":%ld.%06ld,\"Min\":%ld.%06ld%s%s}"
|
? "%s{\"STATS\":%d,\"ID\":\"%s\",\"Elapsed\":%.0f,\"Calls\":%d,\"Wait\":%ld.%06ld,\"Max\":%ld.%06ld,\"Min\":%ld.%06ld"
|
||||||
: "%sSTATS=%d,ID=%s,Elapsed=%.0f,Calls=%d,Wait=%ld.%06ld,Max=%ld.%06ld,Min=%ld.%06ld%s%s" SEPSTR,
|
: "%sSTATS=%d,ID=%s,Elapsed=%.0f,Calls=%d,Wait=%ld.%06ld,Max=%ld.%06ld,Min=%ld.%06ld",
|
||||||
(isjson && (i > 0)) ? COMMA : BLANK,
|
(isjson && (i > 0)) ? COMMA : BLANK,
|
||||||
i, id, total_secs, stats->getwork_calls,
|
i, id, total_secs, stats->getwork_calls,
|
||||||
stats->getwork_wait.tv_sec, stats->getwork_wait.tv_usec,
|
stats->getwork_wait.tv_sec, stats->getwork_wait.tv_usec,
|
||||||
stats->getwork_wait_max.tv_sec, stats->getwork_wait_max.tv_usec,
|
stats->getwork_wait_max.tv_sec, stats->getwork_wait_max.tv_usec,
|
||||||
stats->getwork_wait_min.tv_sec, stats->getwork_wait_min.tv_usec,
|
stats->getwork_wait_min.tv_sec, stats->getwork_wait_min.tv_usec);
|
||||||
|
|
||||||
|
strcat(io_buffer, buf);
|
||||||
|
|
||||||
|
if (pool_stats) {
|
||||||
|
sprintf(buf, isjson
|
||||||
|
? ",\"Pool Calls\":%d,\"Pool Attempts\":%d,\"Pool Wait\":%ld.%06ld,\"Pool Max\":%ld.%06ld,\"Pool Min\":%ld.%06ld"
|
||||||
|
: ",Pool Calls=%d,Pool Attempts=%d,Pool Wait=%ld.%06ld,Pool Max=%ld.%06ld,Pool Min=%ld.%06ld",
|
||||||
|
pool_stats->getwork_calls, pool_stats->getwork_attempts,
|
||||||
|
pool_stats->getwork_wait.tv_sec, pool_stats->getwork_wait.tv_usec,
|
||||||
|
pool_stats->getwork_wait_max.tv_sec, pool_stats->getwork_wait_max.tv_usec,
|
||||||
|
pool_stats->getwork_wait_min.tv_sec, pool_stats->getwork_wait_min.tv_usec);
|
||||||
|
|
||||||
|
strcat(io_buffer, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(buf, isjson
|
||||||
|
? "%s%s}"
|
||||||
|
: "%s%s" SEPSTR,
|
||||||
*extra ? COMMA : BLANK, extra);
|
*extra ? COMMA : BLANK, extra);
|
||||||
|
|
||||||
strcat(io_buffer, buf);
|
strcat(io_buffer, buf);
|
||||||
@ -2057,7 +2075,7 @@ static void minerstats(__maybe_unused SOCKETTYPE c, __maybe_unused char *param,
|
|||||||
extra[0] = '\0';
|
extra[0] = '\0';
|
||||||
|
|
||||||
sprintf(id, "%s%d", cgpu->api->name, cgpu->device_id);
|
sprintf(id, "%s%d", cgpu->api->name, cgpu->device_id);
|
||||||
i = itemstats(i, id, &(cgpu->cgminer_stats), extra, isjson);
|
i = itemstats(i, id, &(cgpu->cgminer_stats), NULL, extra, isjson);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2065,7 +2083,7 @@ static void minerstats(__maybe_unused SOCKETTYPE c, __maybe_unused char *param,
|
|||||||
struct pool *pool = pools[j];
|
struct pool *pool = pools[j];
|
||||||
|
|
||||||
sprintf(id, "POOL%d", j);
|
sprintf(id, "POOL%d", j);
|
||||||
i = itemstats(i, id, &(pool->cgminer_stats), NULL, isjson);
|
i = itemstats(i, id, &(pool->cgminer_stats), &(pool->cgminer_pool_stats), NULL, isjson);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isjson)
|
if (isjson)
|
||||||
|
18
cgminer.c
18
cgminer.c
@ -1816,6 +1816,8 @@ static void get_benchmark_work(struct work *work)
|
|||||||
static bool get_upstream_work(struct work *work, CURL *curl)
|
static bool get_upstream_work(struct work *work, CURL *curl)
|
||||||
{
|
{
|
||||||
struct pool *pool = work->pool;
|
struct pool *pool = work->pool;
|
||||||
|
struct cgminer_pool_stats *pool_stats = &(pool->cgminer_pool_stats);
|
||||||
|
struct timeval tv_start, tv_end, tv_elapsed;
|
||||||
json_t *val = NULL;
|
json_t *val = NULL;
|
||||||
bool rc = false;
|
bool rc = false;
|
||||||
int retries = 0;
|
int retries = 0;
|
||||||
@ -1830,8 +1832,11 @@ retry:
|
|||||||
* there may be temporary denied messages etc. falsely reporting
|
* there may be temporary denied messages etc. falsely reporting
|
||||||
* failure so retry a few times before giving up */
|
* failure so retry a few times before giving up */
|
||||||
while (!val && retries++ < 3) {
|
while (!val && retries++ < 3) {
|
||||||
|
pool_stats->getwork_attempts++;
|
||||||
|
gettimeofday(&tv_start, NULL);
|
||||||
val = json_rpc_call(curl, url, pool->rpc_userpass, rpc_req,
|
val = json_rpc_call(curl, url, pool->rpc_userpass, rpc_req,
|
||||||
false, false, &work->rolltime, pool, false);
|
false, false, &work->rolltime, pool, false);
|
||||||
|
gettimeofday(&tv_end, NULL);
|
||||||
}
|
}
|
||||||
if (unlikely(!val)) {
|
if (unlikely(!val)) {
|
||||||
applog(LOG_DEBUG, "Failed json_rpc_call in get_upstream_work");
|
applog(LOG_DEBUG, "Failed json_rpc_call in get_upstream_work");
|
||||||
@ -1846,6 +1851,18 @@ retry:
|
|||||||
total_getworks++;
|
total_getworks++;
|
||||||
pool->getwork_requested++;
|
pool->getwork_requested++;
|
||||||
|
|
||||||
|
timersub(&tv_end, &tv_start, &tv_elapsed);
|
||||||
|
timeradd(&tv_elapsed, &(pool_stats->getwork_wait), &(pool_stats->getwork_wait));
|
||||||
|
if (timercmp(&tv_elapsed, &(pool_stats->getwork_wait_max), >)) {
|
||||||
|
pool_stats->getwork_wait_max.tv_sec = tv_elapsed.tv_sec;
|
||||||
|
pool_stats->getwork_wait_max.tv_usec = tv_elapsed.tv_usec;
|
||||||
|
}
|
||||||
|
if (timercmp(&tv_elapsed, &(pool_stats->getwork_wait_min), <)) {
|
||||||
|
pool_stats->getwork_wait_min.tv_sec = tv_elapsed.tv_sec;
|
||||||
|
pool_stats->getwork_wait_min.tv_usec = tv_elapsed.tv_usec;
|
||||||
|
}
|
||||||
|
pool_stats->getwork_calls++;
|
||||||
|
|
||||||
json_decref(val);
|
json_decref(val);
|
||||||
out:
|
out:
|
||||||
|
|
||||||
@ -5015,6 +5032,7 @@ int main(int argc, char *argv[])
|
|||||||
struct pool *pool = pools[i];
|
struct pool *pool = pools[i];
|
||||||
|
|
||||||
pool->cgminer_stats.getwork_wait_min.tv_sec = MIN_SEC_UNSET;
|
pool->cgminer_stats.getwork_wait_min.tv_sec = MIN_SEC_UNSET;
|
||||||
|
pool->cgminer_pool_stats.getwork_wait_min.tv_sec = MIN_SEC_UNSET;
|
||||||
|
|
||||||
if (!pool->rpc_userpass) {
|
if (!pool->rpc_userpass) {
|
||||||
if (!pool->rpc_user || !pool->rpc_pass)
|
if (!pool->rpc_user || !pool->rpc_pass)
|
||||||
|
10
miner.h
10
miner.h
@ -292,6 +292,15 @@ struct cgminer_stats {
|
|||||||
struct timeval getwork_wait_min;
|
struct timeval getwork_wait_min;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Just the actual network getworks to the pool
|
||||||
|
struct cgminer_pool_stats {
|
||||||
|
uint32_t getwork_calls;
|
||||||
|
uint32_t getwork_attempts;
|
||||||
|
struct timeval getwork_wait;
|
||||||
|
struct timeval getwork_wait_max;
|
||||||
|
struct timeval getwork_wait_min;
|
||||||
|
};
|
||||||
|
|
||||||
struct cgpu_info {
|
struct cgpu_info {
|
||||||
int cgminer_id;
|
int cgminer_id;
|
||||||
struct device_api *api;
|
struct device_api *api;
|
||||||
@ -701,6 +710,7 @@ struct pool {
|
|||||||
time_t last_share_time;
|
time_t last_share_time;
|
||||||
|
|
||||||
struct cgminer_stats cgminer_stats;
|
struct cgminer_stats cgminer_stats;
|
||||||
|
struct cgminer_pool_stats cgminer_pool_stats;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct work {
|
struct work {
|
||||||
|
38
miner.php
38
miner.php
@ -2,7 +2,7 @@
|
|||||||
session_start();
|
session_start();
|
||||||
#
|
#
|
||||||
global $miner, $port, $readonly, $notify, $rigs, $socktimeoutsec;
|
global $miner, $port, $readonly, $notify, $rigs, $socktimeoutsec;
|
||||||
global $checklastshare;
|
global $checklastshare, $hidefields;
|
||||||
#
|
#
|
||||||
# Don't touch these 2 - see $rigs below
|
# Don't touch these 2 - see $rigs below
|
||||||
$miner = null;
|
$miner = null;
|
||||||
@ -40,6 +40,16 @@ $rigs = array('127.0.0.1:4028');
|
|||||||
# Also, on some windows PHP, apparently the $usec is ignored
|
# Also, on some windows PHP, apparently the $usec is ignored
|
||||||
$socktimeoutsec = 10;
|
$socktimeoutsec = 10;
|
||||||
#
|
#
|
||||||
|
# List of fields NOT to be displayed
|
||||||
|
# You can use this to hide data you don't want to see or don't want
|
||||||
|
# shown on a public web page
|
||||||
|
# The list of sections are: SUMMARY, POOL, PGA, GPU, NOTIFY, CONFIG
|
||||||
|
# See the web page for the list of field names (the table headers)
|
||||||
|
# It is an array of 'SECTION.Field Name' => 1
|
||||||
|
# This example would hide the slightly more sensitive pool information
|
||||||
|
#$hidefields = array('POOL.URL' => 1, 'POOL.User' => 1);
|
||||||
|
$hidefields = array();
|
||||||
|
#
|
||||||
$here = $_SERVER['PHP_SELF'];
|
$here = $_SERVER['PHP_SELF'];
|
||||||
#
|
#
|
||||||
global $tablebegin, $tableend, $warnfont, $warnoff, $dfmt;
|
global $tablebegin, $tableend, $warnfont, $warnoff, $dfmt;
|
||||||
@ -151,7 +161,7 @@ function readsockline($socket)
|
|||||||
#
|
#
|
||||||
function api($cmd)
|
function api($cmd)
|
||||||
{
|
{
|
||||||
global $miner, $port;
|
global $miner, $port, $hidefields;
|
||||||
|
|
||||||
$socket = getsock($miner, $port);
|
$socket = getsock($miner, $port);
|
||||||
if ($socket != null)
|
if ($socket != null)
|
||||||
@ -186,6 +196,8 @@ function api($cmd)
|
|||||||
if (strlen($name) == 0)
|
if (strlen($name) == 0)
|
||||||
$name = 'null';
|
$name = 'null';
|
||||||
|
|
||||||
|
$sectionname = preg_replace('/\d/', '', $name);
|
||||||
|
|
||||||
if (isset($data[$name]))
|
if (isset($data[$name]))
|
||||||
{
|
{
|
||||||
$num = 1;
|
$num = 1;
|
||||||
@ -198,6 +210,10 @@ function api($cmd)
|
|||||||
foreach ($items as $item)
|
foreach ($items as $item)
|
||||||
{
|
{
|
||||||
$id = explode('=', $item, 2);
|
$id = explode('=', $item, 2);
|
||||||
|
|
||||||
|
if (isset($hidefields[$sectionname.'.'.$id[0]]))
|
||||||
|
continue;
|
||||||
|
|
||||||
if (count($id) == 2)
|
if (count($id) == 2)
|
||||||
$data[$name][$id[0]] = $id[1];
|
$data[$name][$id[0]] = $id[1];
|
||||||
else
|
else
|
||||||
@ -739,7 +755,7 @@ function doforeach($cmd, $des, $sum, $head, $datetime)
|
|||||||
|
|
||||||
echo $tableend.$tablebegin;
|
echo $tableend.$tablebegin;
|
||||||
|
|
||||||
$dthead = array('' => 1, 'STATUS' => 1, 'Description' => 1, 'When' => 1);
|
$dthead = array('' => 1, 'STATUS' => 1, 'Description' => 1, 'When' => 1, 'API' => 1, 'CGMiner' => 1);
|
||||||
showhead('', null, $dthead);
|
showhead('', null, $dthead);
|
||||||
|
|
||||||
foreach ($anss as $rig => $ans)
|
foreach ($anss as $rig => $ans)
|
||||||
@ -748,23 +764,20 @@ function doforeach($cmd, $des, $sum, $head, $datetime)
|
|||||||
|
|
||||||
foreach ($ans as $item => $row)
|
foreach ($ans as $item => $row)
|
||||||
{
|
{
|
||||||
if ($item != 'STATUS')
|
if ($item != 'STATUS' && $item != 'VERSION')
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
foreach ($dthead as $name => $x)
|
foreach ($dthead as $name => $x)
|
||||||
{
|
{
|
||||||
if ($name == '')
|
if ($item == 'STATUS' && $name == '')
|
||||||
echo "<td align=right><input type=button value='Rig $rig' onclick='pr(\"?rig=$rig\",null)'></td>";
|
echo "<td align=right><input type=button value='Rig $rig' onclick='pr(\"?rig=$rig\",null)'></td>";
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (isset($row[$name]))
|
if (isset($row[$name]))
|
||||||
list($showvalue, $class) = fmt('STATUS', $name, $row[$name], $when, null);
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
$class = '';
|
list($showvalue, $class) = fmt('STATUS', $name, $row[$name], $when, null);
|
||||||
$showvalue = ' ';
|
echo "<td$class align=right>$showvalue</td>";
|
||||||
}
|
}
|
||||||
echo "<td$class align=right>$showvalue</td>";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -774,6 +787,8 @@ function doforeach($cmd, $des, $sum, $head, $datetime)
|
|||||||
echo $tableend;
|
echo $tableend;
|
||||||
echo '<tr><td><br><br></td></tr>';
|
echo '<tr><td><br><br></td></tr>';
|
||||||
echo $tablebegin;
|
echo $tablebegin;
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$total = array();
|
$total = array();
|
||||||
@ -985,8 +1000,9 @@ function display()
|
|||||||
process(array($preprocess => $preprocess), $rig);
|
process(array($preprocess => $preprocess), $rig);
|
||||||
|
|
||||||
echo $tablebegin;
|
echo $tablebegin;
|
||||||
|
doforeach('version', 'rig summary', array(), array(), true);
|
||||||
$sum = array('MHS av', 'Getworks', 'Found Blocks', 'Accepted', 'Rejected', 'Discarded', 'Stale', 'Utility', 'Local Work', 'Total MH');
|
$sum = array('MHS av', 'Getworks', 'Found Blocks', 'Accepted', 'Rejected', 'Discarded', 'Stale', 'Utility', 'Local Work', 'Total MH');
|
||||||
doforeach('summary', 'summary information', $sum, array(), true);
|
doforeach('summary', 'summary information', $sum, array(), false);
|
||||||
echo $tableend;
|
echo $tableend;
|
||||||
echo '<tr><td><br><br></td></tr>';
|
echo '<tr><td><br><br></td></tr>';
|
||||||
echo $tablebegin;
|
echo $tablebegin;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user