You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
4.7 KiB
170 lines
4.7 KiB
8 years ago
|
#include "jsonrpc.h"
|
||
|
#include "lightningd.h"
|
||
|
#include "log.h"
|
||
|
#include "routing.h"
|
||
|
|
||
|
static void json_add_route(struct command *cmd,
|
||
|
const char *buffer, const jsmntok_t *params)
|
||
|
{
|
||
|
jsmntok_t *srctok, *dsttok, *basetok, *vartok, *delaytok, *minblockstok;
|
||
|
struct pubkey src, dst;
|
||
|
u32 base, var, delay, minblocks;
|
||
|
|
||
|
if (!json_get_params(buffer, params,
|
||
|
"src", &srctok,
|
||
|
"dst", &dsttok,
|
||
|
"base", &basetok,
|
||
|
"var", &vartok,
|
||
|
"delay", &delaytok,
|
||
|
"minblocks", &minblockstok,
|
||
|
NULL)) {
|
||
|
command_fail(cmd, "Need src, dst, base, var, delay & minblocks");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (!pubkey_from_hexstr(buffer + srctok->start,
|
||
|
srctok->end - srctok->start, &src)) {
|
||
|
command_fail(cmd, "src %.*s not valid",
|
||
|
srctok->end - srctok->start,
|
||
|
buffer + srctok->start);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (!pubkey_from_hexstr(buffer + dsttok->start,
|
||
|
dsttok->end - dsttok->start, &dst)) {
|
||
|
command_fail(cmd, "dst %.*s not valid",
|
||
|
dsttok->end - dsttok->start,
|
||
|
buffer + dsttok->start);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (!json_tok_number(buffer, basetok, &base)
|
||
|
|| !json_tok_number(buffer, vartok, &var)
|
||
|
|| !json_tok_number(buffer, delaytok, &delay)
|
||
|
|| !json_tok_number(buffer, minblockstok, &minblocks)) {
|
||
|
command_fail(cmd,
|
||
|
"base, var, delay and minblocks must be numbers");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
add_connection(cmd->dstate->rstate, &src, &dst, base, var, delay, minblocks);
|
||
|
command_success(cmd, null_response(cmd));
|
||
|
}
|
||
|
|
||
|
static const struct json_command dev_add_route_command = {
|
||
|
"dev-add-route",
|
||
|
json_add_route,
|
||
|
"Add route from {src} to {dst}, {base} rate in msatoshi, {var} rate in msatoshi, {delay} blocks delay and {minblocks} minimum timeout",
|
||
|
"Returns an empty result on success"
|
||
|
};
|
||
|
AUTODATA(json_command, &dev_add_route_command);
|
||
|
|
||
|
static void json_getchannels(struct command *cmd,
|
||
|
const char *buffer, const jsmntok_t *params)
|
||
|
{
|
||
|
struct json_result *response = new_json_result(cmd);
|
||
|
struct node_map_iter it;
|
||
|
struct node *n;
|
||
|
struct node_map *nodes = cmd->dstate->rstate->nodes;
|
||
|
struct node_connection *c;
|
||
|
int num_conn, i;
|
||
|
|
||
|
json_object_start(response, NULL);
|
||
|
json_array_start(response, "channels");
|
||
|
for (n = node_map_first(nodes, &it); n; n = node_map_next(nodes, &it)) {
|
||
|
num_conn = tal_count(n->out);
|
||
|
for (i = 0; i < num_conn; i++){
|
||
|
c = n->out[i];
|
||
|
json_object_start(response, NULL);
|
||
|
json_add_pubkey(response, "from", &n->id);
|
||
|
json_add_pubkey(response, "to", &c->dst->id);
|
||
|
json_add_num(response, "base_fee", c->base_fee);
|
||
|
json_add_num(response, "proportional_fee", c->proportional_fee);
|
||
|
json_add_num(response, "expiry", c->delay);
|
||
|
json_add_bool(response, "active", c->active);
|
||
|
json_object_end(response);
|
||
|
}
|
||
|
}
|
||
|
json_array_end(response);
|
||
|
json_object_end(response);
|
||
|
command_success(cmd, response);
|
||
|
}
|
||
|
|
||
|
static const struct json_command getchannels_command = {
|
||
|
"getchannels",
|
||
|
json_getchannels,
|
||
|
"List all known channels.",
|
||
|
"Returns a 'channels' array with all known channels including their fees."
|
||
|
};
|
||
|
AUTODATA(json_command, &getchannels_command);
|
||
|
|
||
|
static void json_routefail(struct command *cmd,
|
||
|
const char *buffer, const jsmntok_t *params)
|
||
|
{
|
||
|
jsmntok_t *enabletok;
|
||
|
bool enable;
|
||
|
|
||
|
if (!json_get_params(buffer, params,
|
||
|
"enable", &enabletok,
|
||
|
NULL)) {
|
||
|
command_fail(cmd, "Need enable");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (!json_tok_bool(buffer, enabletok, &enable)) {
|
||
|
command_fail(cmd, "enable must be true or false");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
log_debug(cmd->dstate->base_log, "dev-routefail: routefail %s",
|
||
|
enable ? "enabled" : "disabled");
|
||
|
cmd->dstate->dev_never_routefail = !enable;
|
||
|
|
||
|
command_success(cmd, null_response(cmd));
|
||
|
}
|
||
|
static const struct json_command dev_routefail_command = {
|
||
|
"dev-routefail",
|
||
|
json_routefail,
|
||
|
"FAIL htlcs that we can't route if {enable}",
|
||
|
"Returns an empty result on success"
|
||
|
};
|
||
|
AUTODATA(json_command, &dev_routefail_command);
|
||
|
|
||
|
static void json_getnodes(struct command *cmd,
|
||
|
const char *buffer, const jsmntok_t *params)
|
||
|
{
|
||
|
struct json_result *response = new_json_result(cmd);
|
||
|
struct node *n;
|
||
|
struct node_map_iter i;
|
||
|
|
||
|
n = node_map_first(cmd->dstate->rstate->nodes, &i);
|
||
|
|
||
|
json_object_start(response, NULL);
|
||
|
json_array_start(response, "nodes");
|
||
|
|
||
|
while (n != NULL) {
|
||
|
json_object_start(response, NULL);
|
||
|
json_add_pubkey(response, "nodeid", &n->id);
|
||
|
json_add_num(response, "port", n->port);
|
||
|
if (!n->port)
|
||
|
json_add_null(response, "hostname");
|
||
|
else
|
||
|
json_add_string(response, "hostname", n->hostname);
|
||
|
|
||
|
json_object_end(response);
|
||
|
n = node_map_next(cmd->dstate->rstate->nodes, &i);
|
||
|
}
|
||
|
|
||
|
json_array_end(response);
|
||
|
json_object_end(response);
|
||
|
command_success(cmd, response);
|
||
|
}
|
||
|
|
||
|
static const struct json_command getnodes_command = {
|
||
|
"getnodes",
|
||
|
json_getnodes,
|
||
|
"List all known nodes in the network.",
|
||
|
"Returns a 'nodes' array"
|
||
|
};
|
||
|
AUTODATA(json_command, &getnodes_command);
|