mirror of
https://github.com/ACINQ/eclair.git
synced 2025-02-23 22:46:44 +01:00
We introduced a task to regularly compute network statistics (mostly about channel parameters such as expiry and fees). The goal was to use this information in the MPP split algorithm to decide whether to split a payment or not. But we haven't used it, and I'm not sure anymore that it's useful at all. If node operators are interested in network statistics, an ad-hoc on-the-fly computation would make more sense.
157 lines
4.5 KiB
Bash
Executable file
157 lines
4.5 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
# default script values, can be overridden for convenience.
|
|
api_url='http://localhost:8080'
|
|
# uncomment the line below if you don't want to provide a password each time you call eclair-cli
|
|
# api_password='your_api_password'
|
|
# for some commands the json output can be shortened for better readability
|
|
short=false
|
|
|
|
# prints help message
|
|
usage() {
|
|
echo -e "==============================
|
|
Command line client for eclair
|
|
==============================
|
|
|
|
This tool requires the eclair node's API to be enabled and listening
|
|
on <$api_url>.
|
|
|
|
Usage
|
|
-----
|
|
\x1b[93meclair-cli\x1b[39m [\x1b[93mOPTIONS\x1b[39m]... <\x1b[93mCOMMAND\x1b[39m> [--command-param=command-value]...
|
|
|
|
where OPTIONS can be:
|
|
-p <password> API's password
|
|
-a <address> Override the API URL with <address>
|
|
-h Show this help
|
|
-s Some commands can print a trimmed JSON
|
|
|
|
and COMMAND is one of the available commands:
|
|
|
|
=== Node ===
|
|
- getinfo
|
|
- connect
|
|
- disconnect
|
|
- peers
|
|
- audit
|
|
|
|
=== Channel ===
|
|
- open
|
|
- close
|
|
- forceclose
|
|
- channel
|
|
- channels
|
|
- allchannels
|
|
- allupdates
|
|
- channelstats
|
|
|
|
=== Fees ===
|
|
- networkfees
|
|
- updaterelayfee
|
|
|
|
=== Path-finding ===
|
|
- findroute
|
|
- findroutetonode
|
|
- findroutebetweennodes
|
|
- nodes
|
|
|
|
=== Invoice ===
|
|
- createinvoice
|
|
- getinvoice
|
|
- listinvoices
|
|
- listpendinginvoices
|
|
- parseinvoice
|
|
|
|
=== Payment ===
|
|
- usablebalances
|
|
- payinvoice
|
|
- sendtonode
|
|
- sendtoroute
|
|
- getsentinfo
|
|
- getreceivedinfo
|
|
|
|
=== Message ===
|
|
- signmessage
|
|
- verifymessage
|
|
|
|
=== OnChain ===
|
|
- getnewaddress
|
|
- sendonchain
|
|
- onchainbalance
|
|
- onchaintransactions
|
|
|
|
Examples
|
|
--------
|
|
eclair-cli -a localhost:1234 peers list the peers of a node hosted on localhost:1234
|
|
eclair-cli connect --nodeId=03864e... connect to node with id 03864e...
|
|
eclair-cli open --nodeId=... --fundingSatoshis=... open a channel to a given node
|
|
eclair-cli close --channelId=006fb... closes the channel with id 006fb...
|
|
|
|
Full documentation here: <https://acinq.github.io/eclair>" 1>&2;
|
|
exit 1;
|
|
}
|
|
|
|
# -- script's logic begins here
|
|
|
|
# Check if jq is installed. If not, display instructions and abort program
|
|
command -v jq >/dev/null 2>&1 || { echo -e "This tool requires jq.\nFor installation instructions, visit https://stedolan.github.io/jq/download/.\n\nAborting..."; exit 1; }
|
|
|
|
# curl installed? If not, give a hint
|
|
command -v curl >/dev/null 2>&1 || { echo -e "This tool requires curl.\n\nAborting..."; exit 1; }
|
|
|
|
# extract script options
|
|
while getopts ':cu:su:p:a:hu:' flag; do
|
|
case "${flag}" in
|
|
p) api_password="${OPTARG}" ;;
|
|
a) api_url="${OPTARG}" ;;
|
|
h) usage ;;
|
|
s) short=true ;;
|
|
*) ;;
|
|
esac
|
|
done
|
|
shift $(($OPTIND - 1))
|
|
|
|
# extract api's endpoint (e.g. sendpayment, connect, ...) from params
|
|
api_endpoint=${1}
|
|
shift 1
|
|
|
|
# display a usage method if no method given or help requested
|
|
if [ -z $api_endpoint ] || [ "$api_endpoint" == "help" ]; then
|
|
usage;
|
|
fi
|
|
|
|
# long options are expected to be of format: --param=param_value
|
|
api_payload=""
|
|
for arg in "${@}"; do
|
|
case ${arg} in
|
|
"--"*) api_payload="$api_payload --data-urlencode \"${arg:2}\"";
|
|
;;
|
|
*) echo "incorrect argument, please use --arg=value"; usage;
|
|
;;
|
|
esac
|
|
done;
|
|
|
|
# jq filter parses response body for error message
|
|
jq_filter='if type=="object" and .error != null then .error else .';
|
|
|
|
# apply special jq filter if we are in "short" ouput mode -- only for specific commands such as 'channels'
|
|
if [ "$short" = true ]; then
|
|
jq_channel_filter="{ nodeId, shortChannelId: .data.shortChannelId, channelId, state, balanceSat: (try (.data.commitments.localCommit.spec.toLocal / 1000 | floor) catch null), capacitySat: .data.commitments.commitInput.amountSatoshis, channelPoint: .data.commitments.commitInput.outPoint }";
|
|
case $api_endpoint in
|
|
"channels") jq_filter="$jq_filter | map( $jq_channel_filter )" ;;
|
|
"channel") jq_filter="$jq_filter | $jq_channel_filter" ;;
|
|
*) ;;
|
|
esac
|
|
fi
|
|
|
|
jq_filter="$jq_filter end";
|
|
|
|
# if no password is provided, auth should only contain user login so that curl prompts for the api password
|
|
if [ -z $api_password ]; then
|
|
auth="eclair-cli";
|
|
else
|
|
auth="eclair-cli:$api_password";
|
|
fi
|
|
|
|
# we're now ready to execute the API call
|
|
eval curl "--user $auth --silent --show-error -X POST -H \"Content-Type: application/x-www-form-urlencoded\" $api_payload $api_url/$api_endpoint" | jq -r "$jq_filter"
|