nodeinfo: make extensible

Module authors can now add extra services via option `nix-bitcoin.nodeinfo.services`.
Mark as internal because we're not yet providing a user-friendly, stable API.
This commit is contained in:
Erik Arvstedt 2022-07-04 12:04:42 +02:00
parent 285a38803c
commit f17fcebe11
No known key found for this signature in database
GPG Key ID: 33312B944DD97846
1 changed files with 56 additions and 35 deletions

View File

@ -5,41 +5,38 @@ let
options = { options = {
nix-bitcoin.nodeinfo = { nix-bitcoin.nodeinfo = {
enable = mkEnableOption "nodeinfo"; enable = mkEnableOption "nodeinfo";
program = mkOption { program = mkOption {
readOnly = true; readOnly = true;
default = script; default = script;
defaultText = "(See source)"; defaultText = "(See source)";
}; };
services = mkOption {
internal = true;
type = types.attrs;
default = {};
defaultText = "(See source)";
description = ''
Nodeinfo service definitions.
'';
};
nodeinfoLib = mkOption {
internal = true;
readOnly = true;
default = nodeinfoLib;
defaultText = "(See source)";
description = ''
Helper functions for defining nodeinfo services.
'';
};
}; };
}; };
cfg = config.nix-bitcoin.nodeinfo; cfg = config.nix-bitcoin.nodeinfo;
nbLib = config.nix-bitcoin.lib; nbLib = config.nix-bitcoin.lib;
# Services included in the output
services = {
bitcoind = mkInfo "";
clightning = mkInfo ''
info["nodeid"] = shell("lightning-cli getinfo | jq -r '.id'")
if 'onion_address' in info:
info["id"] = f"{info['nodeid']}@{info['onion_address']}"
'';
lnd = mkInfo ''
info["nodeid"] = shell("lncli getinfo | jq -r '.identity_pubkey'")
'';
clightning-rest = mkInfo "";
electrs = mkInfo "";
spark-wallet = mkInfo "";
btcpayserver = mkInfo "";
liquidd = mkInfo "";
joinmarket-ob-watcher = mkInfo "";
rtl = mkInfo "";
# Only add sshd when it has an onion service
sshd = name: cfg: mkIfOnionPort "sshd" (onionPort: ''
add_service("sshd", """set_onion_address(info, "sshd", ${onionPort})""")
'');
};
script = pkgs.writeScriptBin "nodeinfo" '' script = pkgs.writeScriptBin "nodeinfo" ''
#!${pkgs.python3}/bin/python #!${pkgs.python3}/bin/python
@ -93,13 +90,13 @@ let
print(json.dumps(infos, indent=2)) print(json.dumps(infos, indent=2))
''; '';
infos = map (service: infos = map (serviceName:
let cfg = config.services.${service}; let serviceCfg = config.services.${serviceName};
in optionalString cfg.enable (services.${service} service cfg) in optionalString serviceCfg.enable (cfg.services.${serviceName} serviceName serviceCfg)
) (builtins.attrNames services); ) (builtins.attrNames cfg.services);
mkInfo = extraCode: name: cfg: nodeinfoLib = rec {
'' mkInfo = extraCode: name: cfg: ''
add_service("${name}", """ add_service("${name}", """
info["local_address"] = "${nbLib.addressWithPort cfg.address cfg.port}" info["local_address"] = "${nbLib.addressWithPort cfg.address cfg.port}"
'' + mkIfOnionPort name (onionPort: '' '' + mkIfOnionPort name (onionPort: ''
@ -109,11 +106,12 @@ let
""") """)
''; '';
mkIfOnionPort = name: fn: mkIfOnionPort = name: fn:
if onionServices ? ${name} then if onionServices ? ${name} then
fn (toString (builtins.elemAt onionServices.${name}.map 0).port) fn (toString (builtins.elemAt onionServices.${name}.map 0).port)
else else
""; "";
};
inherit (config.services.tor.relay) onionServices; inherit (config.services.tor.relay) onionServices;
in { in {
@ -121,5 +119,28 @@ in {
config = { config = {
environment.systemPackages = optional cfg.enable script; environment.systemPackages = optional cfg.enable script;
nix-bitcoin.nodeinfo.services = with nodeinfoLib; {
bitcoind = mkInfo "";
clightning = mkInfo ''
info["nodeid"] = shell("lightning-cli getinfo | jq -r '.id'")
if 'onion_address' in info:
info["id"] = f"{info['nodeid']}@{info['onion_address']}"
'';
lnd = mkInfo ''
info["nodeid"] = shell("lncli getinfo | jq -r '.identity_pubkey'")
'';
clightning-rest = mkInfo "";
electrs = mkInfo "";
spark-wallet = mkInfo "";
btcpayserver = mkInfo "";
liquidd = mkInfo "";
joinmarket-ob-watcher = mkInfo "";
rtl = mkInfo "";
# Only add sshd when it has an onion service
sshd = name: cfg: mkIfOnionPort "sshd" (onionPort: ''
add_service("sshd", """set_onion_address(info, "sshd", ${onionPort})""")
'');
};
}; };
} }