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:
parent
285a38803c
commit
f17fcebe11
@ -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})""")
|
||||||
|
'');
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user