Browse Source

ckdb - allow changing the btc server via the socket

master
kanoi 9 years ago
parent
commit
bab658e03e
  1. 4
      src/ckdb.c
  2. 5
      src/ckdb.h
  3. 2
      src/ckdb_btc.c
  4. 55
      src/ckdb_cmd.c

4
src/ckdb.c

@ -278,6 +278,7 @@ static sem_t socketer_sem;
char *btc_server = "http://127.0.0.1:8330"; char *btc_server = "http://127.0.0.1:8330";
char *btc_auth; char *btc_auth;
int btc_timeout = 5; int btc_timeout = 5;
cklock_t btc_lock;
char *by_default = "code"; char *by_default = "code";
char *inet_default = "127.0.0.1"; char *inet_default = "127.0.0.1";
@ -3935,6 +3936,7 @@ static void *socketer(__maybe_unused void *arg)
case CMD_USERSTATUS: case CMD_USERSTATUS:
case CMD_SHSTA: case CMD_SHSTA:
case CMD_USERINFO: case CMD_USERINFO:
case CMD_BTCSET:
ans = ckdb_cmds[msgline->which_cmds].func(NULL, ans = ckdb_cmds[msgline->which_cmds].func(NULL,
msgline->cmd, msgline->cmd,
msgline->id, msgline->id,
@ -4274,6 +4276,7 @@ static void reload_line(PGconn *conn, char *filename, uint64_t count, char *buf)
case CMD_PSHIFT: case CMD_PSHIFT:
case CMD_SHSTA: case CMD_SHSTA:
case CMD_USERINFO: case CMD_USERINFO:
case CMD_BTCSET:
LOGERR("%s() INVALID message line %"PRIu64 LOGERR("%s() INVALID message line %"PRIu64
" ignored '%.42s...", " ignored '%.42s...",
__func__, count, __func__, count,
@ -5587,6 +5590,7 @@ int main(int argc, char **argv)
ckp.main.processname = strdup("main"); ckp.main.processname = strdup("main");
cklock_init(&last_lock); cklock_init(&last_lock);
cklock_init(&btc_lock);
cklock_init(&seq_lock); cklock_init(&seq_lock);
cklock_init(&process_pplns_lock); cklock_init(&process_pplns_lock);

5
src/ckdb.h

@ -55,7 +55,7 @@
#define DB_VLOCK "1" #define DB_VLOCK "1"
#define DB_VERSION "1.0.2" #define DB_VERSION "1.0.2"
#define CKDB_VERSION DB_VERSION"-1.222" #define CKDB_VERSION DB_VERSION"-1.223"
#define WHERE_FFL " - from %s %s() line %d" #define WHERE_FFL " - from %s %s() line %d"
#define WHERE_FFL_HERE __FILE__, __func__, __LINE__ #define WHERE_FFL_HERE __FILE__, __func__, __LINE__
@ -335,6 +335,8 @@ extern cklock_t last_lock;
extern char *btc_server; extern char *btc_server;
extern char *btc_auth; extern char *btc_auth;
extern int btc_timeout; extern int btc_timeout;
// Lock access to the above variables so they can be changed
extern cklock_t btc_lock;
#define EDDB "expirydate" #define EDDB "expirydate"
#define CDDB "createdate" #define CDDB "createdate"
@ -401,6 +403,7 @@ enum cmd_values {
CMD_PSHIFT, CMD_PSHIFT,
CMD_SHSTA, CMD_SHSTA,
CMD_USERINFO, CMD_USERINFO,
CMD_BTCSET,
CMD_END CMD_END
}; };

2
src/ckdb_btc.c

@ -32,9 +32,11 @@ static char *btc_data(char *json, size_t *len)
APPEND_REALLOC_INIT(buf, off, *len); APPEND_REALLOC_INIT(buf, off, *len);
APPEND_REALLOC(buf, off, *len, "POST / HTTP/1.1\n"); APPEND_REALLOC(buf, off, *len, "POST / HTTP/1.1\n");
ck_wlock(&btc_lock);
snprintf(tmp, sizeof(tmp), "Authorization: Basic %s\n", btc_auth); snprintf(tmp, sizeof(tmp), "Authorization: Basic %s\n", btc_auth);
APPEND_REALLOC(buf, off, *len, tmp); APPEND_REALLOC(buf, off, *len, tmp);
snprintf(tmp, sizeof(tmp), "Host: %s/\n", btc_server); snprintf(tmp, sizeof(tmp), "Host: %s/\n", btc_server);
ck_wunlock(&btc_lock);
APPEND_REALLOC(buf, off, *len, tmp); APPEND_REALLOC(buf, off, *len, tmp);
APPEND_REALLOC(buf, off, *len, "Content-Type: application/json\n"); APPEND_REALLOC(buf, off, *len, "Content-Type: application/json\n");
snprintf(tmp, sizeof(tmp), "Content-Length: %d\n\n", (int)strlen(json)); snprintf(tmp, sizeof(tmp), "Content-Length: %d\n\n", (int)strlen(json));

55
src/ckdb_cmd.c

@ -6300,6 +6300,60 @@ static char *cmd_userinfo(__maybe_unused PGconn *conn, char *cmd, char *id,
return buf; return buf;
} }
/* Set/show the BTC server settings
* You must supply the btcserver to change anything
* The format for userpass is username:password
* If you don't supply the btcserver it will simply report the current server
* If supply btcserver but not the userpass it will use the current userpass
* The reply will ONLY contain the URL, not the user/pass */
static char *cmd_btcset(__maybe_unused PGconn *conn, char *cmd, char *id,
__maybe_unused tv_t *now, __maybe_unused char *by,
__maybe_unused char *code, __maybe_unused char *inet,
__maybe_unused tv_t *notcd, K_TREE *trf_root)
{
K_ITEM *i_btcserver, *i_userpass;
char *btcserver = NULL, *userpass = NULL, *tmp;
char reply[1024] = "";
size_t siz = sizeof(reply);
char buf[256];
i_btcserver = optional_name(trf_root, "btcserver", 1, NULL, reply, siz);
if (i_btcserver) {
btcserver = strdup(transfer_data(i_btcserver));
i_userpass = optional_name(trf_root, "userpass", 0, NULL, reply, siz);
if (i_userpass)
userpass = transfer_data(i_userpass);
ck_wlock(&btc_lock);
btc_server = btcserver;
btcserver = NULL;
if (userpass) {
if (btc_auth) {
tmp = btc_auth;
while (*tmp)
*(tmp++) = '\0';
}
FREENULL(btc_auth);
btc_auth = http_base64(userpass);
}
ck_wunlock(&btc_lock);
if (userpass) {
tmp = userpass;
while (*tmp)
*(tmp++) = '\0';
}
}
FREENULL(btcserver);
ck_wlock(&btc_lock);
snprintf(buf, sizeof(buf), "ok.btcserver=%s", btc_server);
ck_wunlock(&btc_lock);
LOGDEBUG("%s.%s.%s", id, cmd, buf);
return strdup(buf);
}
// TODO: limit access by having seperate sockets for each // TODO: limit access by having seperate sockets for each
#define ACCESS_POOL "p" #define ACCESS_POOL "p"
#define ACCESS_SYSTEM "s" #define ACCESS_SYSTEM "s"
@ -6414,5 +6468,6 @@ struct CMDS ckdb_cmds[] = {
{ CMD_PSHIFT, "pshift", false, false, cmd_pshift, SEQ_NONE, ACCESS_SYSTEM ACCESS_WEB }, { CMD_PSHIFT, "pshift", false, false, cmd_pshift, SEQ_NONE, ACCESS_SYSTEM ACCESS_WEB },
{ CMD_SHSTA, "shsta", true, false, cmd_shsta, SEQ_NONE, ACCESS_SYSTEM }, { CMD_SHSTA, "shsta", true, false, cmd_shsta, SEQ_NONE, ACCESS_SYSTEM },
{ CMD_USERINFO, "userinfo", false, false, cmd_userinfo, SEQ_NONE, ACCESS_WEB }, { CMD_USERINFO, "userinfo", false, false, cmd_userinfo, SEQ_NONE, ACCESS_WEB },
{ CMD_BTCSET, "btcset", false, false, cmd_btcset, SEQ_NONE, ACCESS_SYSTEM },
{ CMD_END, NULL, false, false, NULL, SEQ_NONE, NULL } { CMD_END, NULL, false, false, NULL, SEQ_NONE, NULL }
}; };

Loading…
Cancel
Save