556725c5ff
It is often pretty usefuk to use the builtin logging module to debug things, including libraries that a plugin may use. This adds a simple `PluginLogHandler` that maps the python logging levels to the `lightningd` logging levels, and formats the record in a way that it doesn't clutter up the `lightningd` logs (no duplicate timestamps and levels). This allow us to tweak the log level that is reported to `lightningd` simply using the following ```python3 import logging logging.basicConfig(level=logging.DEBUG) ``` Notice that in order for the logs to be displayed on the terminal or the logfile, both the logging level in the plugin _and_ the `--log-level` `lightningd` is running need to be adjusted (the python logging level only controls which messages get forwarded to `lightningd`, it does not have the power to overrule `lightningd` about what to actually display). I chose `logging.INFO` as the default, since libraries have a tendency to spew out everything in `logging.DEBUG` mode Changelog-Added: pyln: Plugins have been integrated with the `logging` module for easier debugging and error reporting. |
||
---|---|---|
.. | ||
docs | ||
pyln/client | ||
tests | ||
Makefile | ||
README.md | ||
requirements.txt | ||
setup.py |
pyln-client: A python client library for lightningd
This package implements the Unix socket based JSON-RPC protocol that
lightningd
exposes to the rest of the world. It can be used to call
arbitrary functions on the RPC interface, and serves as a basis for plugins
written in python.
Installation
pyln-client
is available on pip
:
pip install pyln-client
Alternatively you can also install the development version to get access to currently unreleased features by checking out the c-lightning source code and installing into your python3 environment:
git clone https://github.com/ElementsProject/lightning.git
cd lightning/contrib/pyln-client
python3 setup.py develop
This will add links to the library into your environment so changing the checked out source code will also result in the environment picking up these changes. Notice however that unreleased versions may change API without warning, so test thoroughly with the released version.
Examples
Using the JSON-RPC client
"""
Generate invoice on one daemon and pay it on the other
"""
from pyln.client import LightningRpc
import random
# Create two instances of the LightningRpc object using two different c-lightning daemons on your computer
l1 = LightningRpc("/tmp/lightning1/lightning-rpc")
l5 = LightningRpc("/tmp/lightning5/lightning-rpc")
info5 = l5.getinfo()
print(info5)
# Create invoice for test payment
invoice = l5.invoice(100, "lbl{}".format(random.random()), "testpayment")
print(invoice)
# Get route to l1
route = l1.getroute(info5['id'], 100, 1)
print(route)
# Pay invoice
print(l1.sendpay(route['route'], invoice['payment_hash']))
Writing a plugin
Plugins are programs that lightningd
can be configured to execute alongside
the main daemon. They allow advanced interactions with and customizations to
the daemon.
#!/usr/bin/env python3
from pyln.client import Plugin
plugin = Plugin()
@plugin.method("hello")
def hello(plugin, name="world"):
"""This is the documentation string for the hello-function.
It gets reported as the description when registering the function
as a method with `lightningd`.
"""
greeting = plugin.get_option('greeting')
s = '{} {}'.format(greeting, name)
plugin.log(s)
return s
@plugin.init()
def init(options, configuration, plugin):
plugin.log("Plugin helloworld.py initialized")
@plugin.subscribe("connect")
def on_connect(plugin, id, address):
plugin.log("Received connect event for peer {}".format(id))
plugin.add_option('greeting', 'Hello', 'The greeting I should use.')
plugin.run()