2019-04-29 20:39:25 +00:00
|
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
|
|
|
|
with lib;
|
|
|
|
let
|
|
|
|
options.services.hardware-wallets = {
|
|
|
|
ledger = mkOption {
|
|
|
|
type = types.bool;
|
|
|
|
default = false;
|
|
|
|
description = ''
|
|
|
|
If enabled, the ledger udev rules will be installed.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
trezor = mkOption {
|
|
|
|
type = types.bool;
|
|
|
|
default = false;
|
|
|
|
description = ''
|
|
|
|
If enabled, the trezor udev rules will be installed.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
group = mkOption {
|
2019-10-15 07:37:32 +00:00
|
|
|
type = types.str;
|
2019-04-29 20:39:25 +00:00
|
|
|
default = "hardware-wallets";
|
|
|
|
description = ''
|
|
|
|
Group the hardware wallet udev rules apply to.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2021-09-13 11:40:47 +00:00
|
|
|
cfg = config.services.hardware-wallets;
|
|
|
|
in {
|
|
|
|
inherit options;
|
|
|
|
|
2019-04-29 20:39:25 +00:00
|
|
|
config = mkMerge [
|
2020-04-07 20:47:45 +00:00
|
|
|
(mkIf (cfg.ledger || cfg.trezor) {
|
2020-06-15 10:34:11 +00:00
|
|
|
assertions = [
|
|
|
|
{ assertion = (config.services.bitcoind.disablewallet == null || !config.services.bitcoind.disablewallet);
|
|
|
|
message = ''
|
|
|
|
Hardware-Wallets are not compatible with bitcoind.disablewallet.
|
|
|
|
'';
|
|
|
|
}
|
|
|
|
];
|
|
|
|
|
2020-11-09 21:09:09 +00:00
|
|
|
environment.systemPackages = [
|
|
|
|
config.nix-bitcoin.pkgs.hwi
|
2020-04-07 20:47:45 +00:00
|
|
|
# Provides lsusb for debugging
|
2020-11-09 21:09:09 +00:00
|
|
|
pkgs.usbutils
|
2020-04-07 20:47:45 +00:00
|
|
|
];
|
2021-02-01 21:53:22 +00:00
|
|
|
|
2021-02-01 21:53:12 +00:00
|
|
|
users.groups.${cfg.group} = {};
|
2020-09-28 11:09:03 +00:00
|
|
|
nix-bitcoin.operator.groups = [ cfg.group ];
|
2020-04-07 20:47:45 +00:00
|
|
|
})
|
2021-02-01 21:53:22 +00:00
|
|
|
|
2019-04-29 20:39:25 +00:00
|
|
|
(mkIf cfg.ledger {
|
|
|
|
# Ledger Nano S according to https://github.com/LedgerHQ/udev-rules/blob/master/add_udev_rules.sh
|
|
|
|
# Don't use rules from nixpkgs because we want to use our own group.
|
|
|
|
services.udev.packages = lib.singleton (pkgs.writeTextFile {
|
|
|
|
name = "ledger-udev-rules";
|
|
|
|
destination = "/etc/udev/rules.d/20-ledger.rules";
|
|
|
|
text = ''
|
|
|
|
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2c97", ATTRS{idProduct}=="0001", MODE="0660", GROUP="${cfg.group}"
|
|
|
|
'';
|
|
|
|
});
|
|
|
|
})
|
|
|
|
(mkIf cfg.trezor {
|
2020-04-07 20:47:45 +00:00
|
|
|
environment.systemPackages = [ pkgs.python3.pkgs.trezor ];
|
2019-04-29 20:39:25 +00:00
|
|
|
# Don't use rules from nixpkgs because we want to use our own group.
|
|
|
|
services.udev.packages = lib.singleton (pkgs.writeTextFile {
|
|
|
|
name = "trezord-udev-rules";
|
|
|
|
destination = "/etc/udev/rules.d/52-trezor.rules";
|
|
|
|
text = ''
|
|
|
|
# TREZOR v1 (One)
|
|
|
|
SUBSYSTEM=="usb", ATTR{idVendor}=="534c", ATTR{idProduct}=="0001", MODE="0660", GROUP="${cfg.group}", TAG+="uaccess", SYMLINK+="trezor%n"
|
|
|
|
KERNEL=="hidraw*", ATTRS{idVendor}=="534c", ATTRS{idProduct}=="0001", MODE="0660", GROUP="${cfg.group}", TAG+="uaccess"
|
|
|
|
|
|
|
|
# TREZOR v2 (T)
|
|
|
|
SUBSYSTEM=="usb", ATTR{idVendor}=="1209", ATTR{idProduct}=="53c0", MODE="0660", GROUP="${cfg.group}", TAG+="uaccess", SYMLINK+="trezor%n"
|
|
|
|
SUBSYSTEM=="usb", ATTR{idVendor}=="1209", ATTR{idProduct}=="53c1", MODE="0660", GROUP="${cfg.group}", TAG+="uaccess", SYMLINK+="trezor%n"
|
|
|
|
KERNEL=="hidraw*", ATTRS{idVendor}=="1209", ATTRS{idProduct}=="53c1", MODE="0660", GROUP="${cfg.group}", TAG+="uaccess"
|
|
|
|
'';
|
|
|
|
});
|
|
|
|
services.trezord.enable = true;
|
|
|
|
})
|
|
|
|
];
|
|
|
|
}
|