aboutsummaryrefslogtreecommitdiff
path: root/home-manager/modules/programs/keychain.nix
blob: 6e26bd232cee1d8a0557734be07b3bd31f1da6cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
{ config, lib, pkgs, ... }:

with lib;

let

  cfg = config.programs.keychain;

  flags = cfg.extraFlags ++ optional (cfg.agents != [ ])
    "--agents ${concatStringsSep "," cfg.agents}"
    ++ optional (cfg.inheritType != null) "--inherit ${cfg.inheritType}";

  shellCommand =
    "${cfg.package}/bin/keychain --eval ${concatStringsSep " " flags} ${
      concatStringsSep " " cfg.keys
    }";

in {
  meta.maintainers = [ maintainers.marsam ];

  options.programs.keychain = {
    enable = mkEnableOption "keychain";

    package = mkOption {
      type = types.package;
      default = pkgs.keychain;
      defaultText = literalExample "pkgs.keychain";
      description = ''
        Keychain package to install.
      '';
    };

    keys = mkOption {
      type = types.listOf types.str;
      default = [ "id_rsa" ];
      description = ''
        Keys to add to keychain.
      '';
    };

    agents = mkOption {
      type = types.listOf types.str;
      default = [ ];
      description = ''
        Agents to add.
      '';
    };

    inheritType = mkOption {
      type =
        types.nullOr (types.enum [ "local" "any" "local-once" "any-once" ]);
      default = null;
      description = ''
        Inherit type to attempt from agent variables from the environment.
      '';
    };

    extraFlags = mkOption {
      type = types.listOf types.str;
      default = [ "--quiet" ];
      description = ''
        Extra flags to pass to keychain.
      '';
    };

    enableBashIntegration = mkOption {
      default = true;
      type = types.bool;
      description = ''
        Whether to enable Bash integration.
      '';
    };

    enableFishIntegration = mkOption {
      default = true;
      type = types.bool;
      description = ''
        Whether to enable Fish integration.
      '';
    };

    enableZshIntegration = mkOption {
      default = true;
      type = types.bool;
      description = ''
        Whether to enable Zsh integration.
      '';
    };

    enableXsessionIntegration = mkOption {
      default = true;
      type = types.bool;
      visible = pkgs.stdenv.hostPlatform.isLinux;
      description = ''
        Whether to run keychain from your <filename>~/.xsession</filename>.
      '';
    };
  };

  config = mkIf cfg.enable {
    home.packages = [ cfg.package ];
    programs.bash.initExtra = mkIf cfg.enableBashIntegration ''
      eval "$(${shellCommand})"
    '';
    programs.fish.interactiveShellInit = mkIf cfg.enableFishIntegration ''
      eval (${shellCommand})
    '';
    programs.zsh.initExtra = mkIf cfg.enableZshIntegration ''
      eval "$(${shellCommand})"
    '';
    xsession.initExtra = mkIf cfg.enableXsessionIntegration ''
      eval "$(${shellCommand})"
    '';
  };
}