Commit 3347f8069a57ac5392eaf0cee3d2eaecd72d4ca5

Paul Sheppard 2012-06-10T23:14:51

Merge branch 'master' of git://github.com/ckolivas/cgminer.git

diff --git a/API-README b/API-README
index 0782457..c73bb2a 100644
--- a/API-README
+++ b/API-README
@@ -285,7 +285,14 @@ miner.php - an example web page to access 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:
  'save' no longer requires a filename (use default if not specified)
diff --git a/api.c b/api.c
index 268d90a..ea6dc04 100644
--- a/api.c
+++ b/api.c
@@ -161,7 +161,7 @@ static const char SEPARATOR = '|';
 #define SEPSTR "|"
 static const char GPUSEP = ',';
 
-static const char *APIVERSION = "1.11";
+static const char *APIVERSION = "1.12";
 static const char *DEAD = "Dead";
 static const char *SICK = "Sick";
 static const char *NOSTART = "NoStart";
@@ -2007,7 +2007,7 @@ void dosave(__maybe_unused SOCKETTYPE c, char *param, bool isjson)
 	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];
 
@@ -2017,13 +2017,31 @@ static int itemstats(int i, char *id, struct cgminer_stats *stats, char *extra, 
 			extra = (char *)BLANK;
 
 		sprintf(buf, isjson
-			? "%s{\"STATS\":%d,\"ID\":\"%s\",\"Elapsed\":%.0f,\"Calls\":%d,\"Wait\":%ld.%06ld,\"Max\":%ld.%06ld,\"Min\":%ld.%06ld%s%s}"
-			: "%sSTATS=%d,ID=%s,Elapsed=%.0f,Calls=%d,Wait=%ld.%06ld,Max=%ld.%06ld,Min=%ld.%06ld%s%s" SEPSTR,
+			? "%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",
 			(isjson && (i > 0)) ? COMMA : BLANK,
 			i, id, total_secs, stats->getwork_calls,
 			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_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);
 
 		strcat(io_buffer, buf);
@@ -2057,7 +2075,7 @@ static void minerstats(__maybe_unused SOCKETTYPE c, __maybe_unused char *param, 
 				extra[0] = '\0';
 
 			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];
 
 		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)
diff --git a/cgminer.c b/cgminer.c
index 77284cd..e89cc3d 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -1816,6 +1816,8 @@ static void get_benchmark_work(struct work *work)
 static bool get_upstream_work(struct work *work, CURL *curl)
 {
 	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;
 	bool rc = false;
 	int retries = 0;
@@ -1830,8 +1832,11 @@ retry:
 	 * there may be temporary denied messages etc. falsely reporting
 	 * failure so retry a few times before giving up */
 	while (!val && retries++ < 3) {
+		pool_stats->getwork_attempts++;
+		gettimeofday(&tv_start, NULL);
 		val = json_rpc_call(curl, url, pool->rpc_userpass, rpc_req,
 			    false, false, &work->rolltime, pool, false);
+		gettimeofday(&tv_end, NULL);
 	}
 	if (unlikely(!val)) {
 		applog(LOG_DEBUG, "Failed json_rpc_call in get_upstream_work");
@@ -1846,6 +1851,18 @@ retry:
 	total_getworks++;
 	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);
 out:
 
@@ -5015,6 +5032,7 @@ int main(int argc, char *argv[])
 		struct pool *pool = pools[i];
 
 		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_user || !pool->rpc_pass)
diff --git a/miner.h b/miner.h
index 2251031..605ad1d 100644
--- a/miner.h
+++ b/miner.h
@@ -292,6 +292,15 @@ struct cgminer_stats {
 	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 {
 	int cgminer_id;
 	struct device_api *api;
@@ -701,6 +710,7 @@ struct pool {
 	time_t last_share_time;
 
 	struct cgminer_stats cgminer_stats;
+	struct cgminer_pool_stats cgminer_pool_stats;
 };
 
 struct work {
diff --git a/miner.php b/miner.php
index 3372d39..8b38976 100644
--- a/miner.php
+++ b/miner.php
@@ -2,7 +2,7 @@
 session_start();
 #
 global $miner, $port, $readonly, $notify, $rigs, $socktimeoutsec;
-global $checklastshare;
+global $checklastshare, $hidefields;
 #
 # Don't touch these 2 - see $rigs below
 $miner = null;
@@ -40,6 +40,16 @@ $rigs = array('127.0.0.1:4028');
 # Also, on some windows PHP, apparently the $usec is ignored
 $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'];
 #
 global $tablebegin, $tableend, $warnfont, $warnoff, $dfmt;
@@ -151,7 +161,7 @@ function readsockline($socket)
 #
 function api($cmd)
 {
- global $miner, $port;
+ global $miner, $port, $hidefields;
 
  $socket = getsock($miner, $port);
  if ($socket != null)
@@ -186,6 +196,8 @@ function api($cmd)
 			if (strlen($name) == 0)
 				$name = 'null';
 
+			$sectionname = preg_replace('/\d/', '', $name);
+
 			if (isset($data[$name]))
 			{
 				$num = 1;
@@ -198,6 +210,10 @@ function api($cmd)
 			foreach ($items as $item)
 			{
 				$id = explode('=', $item, 2);
+
+				if (isset($hidefields[$sectionname.'.'.$id[0]]))
+					continue;
+
 				if (count($id) == 2)
 					$data[$name][$id[0]] = $id[1];
 				else
@@ -739,7 +755,7 @@ function doforeach($cmd, $des, $sum, $head, $datetime)
 
 	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);
 
 	foreach ($anss as $rig => $ans)
@@ -748,23 +764,20 @@ function doforeach($cmd, $des, $sum, $head, $datetime)
 
 		foreach ($ans as $item => $row)
 		{
-			if ($item != 'STATUS')
+			if ($item != 'STATUS' && $item != 'VERSION')
 				continue;
 
 			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>";
 				else
 				{
 					if (isset($row[$name]))
-						list($showvalue, $class) = fmt('STATUS', $name, $row[$name], $when, null);
-					else
 					{
-						$class = '';
-						$showvalue = '&nbsp;';
+						list($showvalue, $class) = fmt('STATUS', $name, $row[$name], $when, null);
+						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 '<tr><td><br><br></td></tr>';
 	echo $tablebegin;
+
+	return;
  }
 
  $total = array();
@@ -985,8 +1000,9 @@ function display()
 	process(array($preprocess => $preprocess), $rig);
 
  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');
- doforeach('summary', 'summary information', $sum, array(), true);
+ doforeach('summary', 'summary information', $sum, array(), false);
  echo $tableend;
  echo '<tr><td><br><br></td></tr>';
  echo $tablebegin;