mirror of
https://github.com/ACINQ/eclair.git
synced 2025-02-24 06:47:46 +01:00
* Add a "stop" API method This API call was added for certain uses cases where killing the process was impractical but internally it just calls `sys.exit()`. Eclair is designed to shutdown cleanly when its process is killed and this is still the recommended way of stopping it.
159 lines
4.5 KiB
Bash
Executable file
159 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
|
|
- stop
|
|
|
|
=== Channel ===
|
|
- open
|
|
- close
|
|
- forceclose
|
|
- channel
|
|
- channels
|
|
- allchannels
|
|
- allupdates
|
|
- channelstats
|
|
- channelbalances
|
|
|
|
=== 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"
|