diff --git a/src/ckpool.c b/src/ckpool.c index 84639d9e..a9f234c1 100644 --- a/src/ckpool.c +++ b/src/ckpool.c @@ -130,6 +130,17 @@ void ckmsgq_add(ckmsgq_t *ckmsgq, void *data) mutex_unlock(&ckmsgq->lock); } +static void broadcast_proc(ckpool_t *ckp, const char *buf) +{ + int i; + + for (i = 0; i < ckp->proc_instances; i++) { + proc_instance_t *pi = ckp->children[i]; + + send_proc(pi, buf); + } +} + /* Listen for incoming global requests. Always returns a response if possible */ static void *listener(void *arg) { @@ -159,6 +170,20 @@ retry: } else if (!strncasecmp(buf, "ping", 4)) { LOGDEBUG("Listener received ping request"); send_unix_msg(sockd, "pong"); + } else if (!strncasecmp(buf, "loglevel", 8)) { + int loglevel; + + if (sscanf(buf, "loglevel=%d", &loglevel) != 1) { + LOGWARNING("Failed to parse loglevel message %s", buf); + send_unix_msg(sockd, "Failed"); + } else if (loglevel < LOG_EMERG || loglevel > LOG_DEBUG) { + LOGWARNING("Invalid loglevel %d sent", loglevel); + send_unix_msg(sockd, "Invalid"); + } else { + ckp->loglevel = loglevel; + broadcast_proc(ckp, buf); + send_unix_msg(sockd, "success"); + } } else if (!strncasecmp(buf, "getfd", 5)) { char *msg; @@ -504,7 +529,7 @@ static bool write_pid(ckpool_t *ckp, const char *path, pid_t pid) if (!stat(path, &statbuf)) { int oldpid; - LOGWARNING("File %s exists", path); + LOGNOTICE("File %s exists", path); fp = fopen(path, "r"); if (!fp) { LOGEMERG("Failed to open file %s", path); diff --git a/src/connector.c b/src/connector.c index 9c5c5a68..ae0893ce 100644 --- a/src/connector.c +++ b/src/connector.c @@ -506,6 +506,10 @@ retry: ci->accept = false; goto retry; } + if (!strncasecmp(buf, "loglevel", 8)) { + sscanf(buf, "loglevel=%d", &ckp->loglevel); + goto retry; + } LOGDEBUG("Connector received message: %s", buf); if (!strncasecmp(buf, "shutdown", 8)) diff --git a/src/generator.c b/src/generator.c index af2fa6aa..e6853ae0 100644 --- a/src/generator.c +++ b/src/generator.c @@ -279,6 +279,8 @@ retry: LOGNOTICE("Submitting block data!"); if (submit_block(cs, buf + 12)) send_proc(ckp->stratifier, "block"); + } else if (!strncasecmp(buf, "loglevel", 8)) { + sscanf(buf, "loglevel=%d", &ckp->loglevel); } else if (!strncasecmp(buf, "ping", 4)) { LOGDEBUG("Generator received ping request"); send_unix_msg(sockd, "pong"); @@ -1253,6 +1255,8 @@ retry: pthread_cancel(proxi->pth_precv); pthread_cancel(proxi->pth_psend); goto reconnect; + } else if (!strncasecmp(buf, "loglevel", 8)) { + sscanf(buf, "loglevel=%d", &ckp->loglevel); } else if (!strncasecmp(buf, "ping", 4)) { LOGDEBUG("Proxy received ping request"); send_unix_msg(sockd, "pong"); diff --git a/src/stratifier.c b/src/stratifier.c index 49bbe00e..783aa9a3 100644 --- a/src/stratifier.c +++ b/src/stratifier.c @@ -195,6 +195,7 @@ struct user_instance { tv_t last_share; time_t last_stats; + time_t start_time; double dsps1; double dsps5; @@ -962,6 +963,8 @@ retry: } else if (!strncasecmp(buf, "block", 5)) { block_solve(ckp); update_base(ckp); + } else if (!strncasecmp(buf, "loglevel", 8)) { + sscanf(buf, "loglevel=%d", &ckp->loglevel); } else { json_t *val = json_loads(buf, 0, NULL); @@ -1110,9 +1113,13 @@ static user_instance_t *authorise_user(const char *workername) ck_ilock(&instance_lock); HASH_FIND_STR(user_instances, username, instance); if (!instance) { + ts_t now; + /* New user instance */ instance = ckzalloc(sizeof(user_instance_t)); strcpy(instance->username, username); + ts_realtime(&now); + instance->start_time = now.tv_sec; ck_ulock(&instance_lock); instance->id = user_instance_id++; @@ -2020,16 +2027,19 @@ static void update_userstats(ckpool_t *ckp) ck_rlock(&instance_lock); HASH_ITER(hh, user_instances, instance, tmp) { double ghs1, ghs5, ghs60, ghs1440; + int elapsed; if (instance->last_stats > now_t - 600) continue; + elapsed = now_t - instance->start_time; instance->last_stats = now_t; ghs1 = instance->dsps1 * nonces; ghs5 = instance->dsps5 * nonces; ghs60 = instance->dsps60 * nonces; ghs1440 = instance->dsps1440 * nonces; - val = json_pack("{ss,ss,sf,sf,sf,sf,ss,ss,ss,ss}", + val = json_pack("{ss,si,ss,sf,sf,sf,sf,ss,ss,ss,ss}", "poolinstance", ckp->name, + "elapsed", elapsed, "username", instance->username, "hashrate", ghs1, "hashrate5m", ghs5, @@ -2196,8 +2206,9 @@ static void *statsupdate(void *arg) ts_realtime(&ts_now); sprintf(cdfield, "%lu,%lu", ts_now.tv_sec, ts_now.tv_nsec); - val = json_pack("{ss,si,si,sf,sf,sf,sf,ss,ss,ss,ss}", + val = json_pack("{ss,si,si,si,sf,sf,sf,sf,ss,ss,ss,ss}", "poolinstance", ckp->name, + "elapsed", diff.tv_sec, "users", stats.users, "workers", stats.workers, "hashrate", ghs1,