Merge pull request #277 from kanoi/master API: Luke's poolpriority
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
diff --git a/API-README b/API-README
index df905ef..a62b630 100644
--- a/API-README
+++ b/API-README
@@ -39,7 +39,7 @@ To give an IP address/subnet access to a group you use the group letter
in front of the IP address instead of W: e.g. P:192.168.0/32
An IP address/subnet can only be a member of one group
A sample API group would be:
- --api-groups P:switchpool:enablepool:addpool:disablepool:removepool:*
+ --api-groups P:switchpool:enablepool:addpool:disablepool:removepool.poolpriority:*
This would create a group 'P' that can do all current pool commands and all
non-priviliged commands - the '*' means all non-priviledged commands
Without the '*' the group would only have access to the pool commands
@@ -174,6 +174,11 @@ The list of requests - a (*) means it requires privileged access - and replies a
Use '\\' to get a '\' and '\,' to include a comma
inside URL, USR or PASS
+ poolpriority|N,... (*)
+ none There is no reply section just the STATUS section
+ stating the results of changing pool priorities
+ See usage below
+
disablepool|N (*)
none There is no reply section just the STATUS section
stating the results of disabling pool N
@@ -270,8 +275,18 @@ The list of requests - a (*) means it requires privileged access - and replies a
When you enable, disable or restart a GPU or PGA, you will also get Thread messages
in the cgminer status window
-When you switch to a different pool to the current one, you will get a
-'Switching to URL' message in the cgminer status windows
+The 'poolpriority' command can be used to reset the priority order of multiple
+pools with a single command - 'switchpool' only sets a single pool to first priority
+Each pool should be listed by id number in order of preference (first = most
+preferred)
+Any pools not listed will be prioritised after the ones that are listed, in the
+priority order they were originally
+If the priority change affects the miner's preference for mining, it may switch
+immediately
+
+When you switch to a different pool to the current one (including by priority
+change), you will get a 'Switching to URL' message in the cgminer status
+windows
Obviously, the JSON format is simply just the names as given before the '='
with the values after the '='
@@ -309,7 +324,14 @@ miner.php - an example web page to access the API
Feature Changelog for external applications using the API:
-API V1.14
+API V1.15
+
+Added API commands:
+ 'poolpriority'
+
+----------
+
+API V1.14 (cgminer v2.5.0)
Modified API commands:
'stats' - more icarus timing stats added
diff --git a/api.c b/api.c
index 342c371..8e66e81 100644
--- a/api.c
+++ b/api.c
@@ -166,7 +166,7 @@ static const char SEPARATOR = '|';
#define SEPSTR "|"
static const char GPUSEP = ',';
-static const char *APIVERSION = "1.14";
+static const char *APIVERSION = "1.15";
static const char *DEAD = "Dead";
static const char *SICK = "Sick";
static const char *NOSTART = "NoStart";
@@ -372,6 +372,8 @@ static const char *JSON_PARAMETER = "parameter";
#define MSG_MINESTATS 70
#define MSG_MISCHK 71
#define MSG_CHECK 72
+#define MSG_POOLPRIO 73
+#define MSG_DUPPID 74
enum code_severity {
SEVERITY_ERR,
@@ -385,6 +387,7 @@ enum code_parameters {
PARAM_GPU,
PARAM_PGA,
PARAM_CPU,
+ PARAM_PID,
PARAM_GPUMAX,
PARAM_PGAMAX,
PARAM_CPUMAX,
@@ -501,6 +504,8 @@ struct CODES {
{ SEVERITY_ERR, MSG_ACCDENY, PARAM_STR, "Access denied to '%s' command" },
{ SEVERITY_SUCC, MSG_ACCOK, PARAM_NONE, "Privileged access OK" },
{ SEVERITY_SUCC, MSG_ENAPOOL, PARAM_POOL, "Enabling pool %d:'%s'" },
+ { SEVERITY_SUCC, MSG_POOLPRIO,PARAM_NONE, "Changed pool priorities" },
+ { SEVERITY_ERR, MSG_DUPPID, PARAM_PID, "Duplicate pool specified %d" },
{ SEVERITY_SUCC, MSG_DISPOOL, PARAM_POOL, "Disabling pool %d:'%s'" },
{ SEVERITY_INFO, MSG_ALRENAP, PARAM_POOL, "Pool %d:'%s' already enabled" },
{ SEVERITY_INFO, MSG_ALRDISP, PARAM_POOL, "Pool %d:'%s' already disabled" },
@@ -1062,6 +1067,7 @@ static char *message(int messageid, int paramid, char *param2, bool isjson)
case PARAM_GPU:
case PARAM_PGA:
case PARAM_CPU:
+ case PARAM_PID:
sprintf(buf, codes[i].description, paramid);
break;
case PARAM_POOL:
@@ -2128,6 +2134,74 @@ static void enablepool(__maybe_unused SOCKETTYPE c, char *param, bool isjson, __
strcpy(io_buffer, message(MSG_ENAPOOL, id, NULL, isjson));
}
+static void poolpriority(__maybe_unused SOCKETTYPE c, char *param, bool isjson, __maybe_unused char group)
+{
+ char *ptr, *next;
+ int i, pr, prio = 0;
+
+ // TODO: all cgminer code needs a mutex added everywhere for change
+ // access to total_pools and also parts of the pools[] array,
+ // just copying total_pools here wont solve that
+
+ if (total_pools == 0) {
+ strcpy(io_buffer, message(MSG_NOPOOL, 0, NULL, isjson));
+ return;
+ }
+
+ if (param == NULL || *param == '\0') {
+ strcpy(io_buffer, message(MSG_MISPID, 0, NULL, isjson));
+ return;
+ }
+
+ bool pools_changed[total_pools];
+ int new_prio[total_pools];
+ for (i = 0; i < total_pools; ++i)
+ pools_changed[i] = false;
+
+ next = param;
+ while (next && *next) {
+ ptr = next;
+ next = strchr(ptr, ',');
+ if (next)
+ *(next++) = '\0';
+
+ i = atoi(ptr);
+ if (i < 0 || i >= total_pools) {
+ strcpy(io_buffer, message(MSG_INVPID, i, NULL, isjson));
+ return;
+ }
+
+ if (pools_changed[i]) {
+ strcpy(io_buffer, message(MSG_DUPPID, i, NULL, isjson));
+ return;
+ }
+
+ pools_changed[i] = true;
+ new_prio[i] = prio++;
+ }
+
+ // Only change them if no errors
+ for (i = 0; i < total_pools; i++) {
+ if (pools_changed[i])
+ pools[i]->prio = new_prio[i];
+ }
+
+ // In priority order, cycle through the unchanged pools and append them
+ for (pr = 0; pr < total_pools; pr++)
+ for (i = 0; i < total_pools; i++) {
+ if (!pools_changed[i] && pools[i]->prio == pr) {
+ pools[i]->prio = prio++;
+ pools_changed[i] = true;
+ break;
+ }
+ }
+
+ if (current_pool()->prio)
+ switch_pools(NULL);
+
+ strcpy(io_buffer, message(MSG_POOLPRIO, 0, NULL, isjson));
+}
+
static void disablepool(__maybe_unused SOCKETTYPE c, char *param, bool isjson, __maybe_unused char group)
{
struct pool *pool;
@@ -2659,6 +2733,7 @@ struct CMDS {
{ "cpucount", cpucount, false },
{ "switchpool", switchpool, true },
{ "addpool", addpool, true },
+ { "poolpriority", poolpriority, true },
{ "enablepool", enablepool, true },
{ "disablepool", disablepool, true },
{ "removepool", removepool, true },