Skip to content

Commit e8bf6e6

Browse files
authored
flake.nix: Split nixos module to a separate file (#18)
- Split out nix/nixos-module.nix. This way it can theoretically be imported without using flakes, since some people prefer to do things that way. - Use a nixpkgs overlay to add tailscale-manager to pkgs, so it shows up when vm-text.nix imports the module - Move nixosModules to the system-independent outputs section where it belongs - Remove last references to `packageName` since we were not using it consistently Resources: https://vtimofeenko.com/posts/practical-nix-flake-anatomy-a-guided-tour-of-flake.nix/
1 parent 4aa945b commit e8bf6e6

File tree

3 files changed

+100
-94
lines changed

3 files changed

+100
-94
lines changed

flake.nix

Lines changed: 12 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,25 @@
1313
githubActions = nix-github-actions.lib.mkGithubMatrix {
1414
checks = nixpkgs.lib.getAttrs [ "x86_64-linux" ] self.checks;
1515
};
16+
17+
nixosModules.default = self.nixosModules.tailscale-manager;
18+
nixosModules.tailscale-manager = import ./nix/nixos-module.nix;
19+
20+
overlays.default = final: prev: {
21+
tailscale-manager = self.packages.${prev.system}.tailscale-manager;
22+
};
23+
1624
} // flake-utils.lib.eachDefaultSystem (system:
1725
let
18-
pkgs = nixpkgs.legacyPackages.${system};
26+
pkgs = nixpkgs.legacyPackages.${system}.extend self.overlays.default;
1927

2028
haskellPackages = pkgs.haskellPackages;
2129

2230
jailbreakUnbreak = pkg:
2331
pkgs.haskell.lib.doJailbreak (pkg.overrideAttrs (_: { meta = { }; }));
24-
25-
packageName = "tailscale-manager";
2632
in {
27-
packages.${packageName} = (
28-
haskellPackages.callCabal2nix packageName self rec {
33+
packages.tailscale-manager = (
34+
haskellPackages.callCabal2nix "tailscale-manager" self rec {
2935
# Dependency overrides go here
3036
}).overrideAttrs (x: {
3137
outputs = x.outputs ++ ["testreport"];
@@ -34,7 +40,7 @@
3440
'';
3541
});
3642

37-
packages.default = self.packages.${system}.${packageName};
43+
packages.default = self.packages.${system}.tailscale-manager;
3844

3945
checks.tailscale-manager = self.packages.${system}.tailscale-manager;
4046

@@ -49,91 +55,5 @@
4955
inputsFrom = map (__getAttr "env") (__attrValues self.packages.${system});
5056
};
5157

52-
nixosModules.default = self.nixosModules.${system}.tailscale-manager;
53-
nixosModules.tailscale-manager = { config, lib, pkgs, ... }:
54-
with lib;
55-
let
56-
cfg = config.services.tailscale-manager;
57-
configFile = pkgs.writeTextFile {
58-
name = "tailscale-manager.json";
59-
text = generators.toJSON {} {
60-
routes = cfg.routes;
61-
hostRoutes = cfg.hostRoutes;
62-
extraArgs = cfg.extraArgs;
63-
awsManagedPrefixLists = cfg.awsManagedPrefixLists;
64-
};
65-
};
66-
in {
67-
options.services.tailscale-manager = {
68-
enable = mkEnableOption "tailscale-manager";
69-
package = mkPackageOption self.packages.${system} "tailscale-manager" {};
70-
interval = mkOption {
71-
type = types.int;
72-
default = 300;
73-
description = "Interval between runs, in seconds";
74-
};
75-
routes = mkOption {
76-
type = types.listOf types.str;
77-
default = [];
78-
description = "List of CIDR prefix routes to advertise";
79-
};
80-
hostRoutes = mkOption {
81-
type = types.listOf types.str;
82-
default = [];
83-
description = "List of hostnames and IP addresses to add as /32 routes";
84-
};
85-
awsManagedPrefixLists = mkOption {
86-
type = types.listOf types.str;
87-
default = [];
88-
description = "AWS prefix list IDs for route discovery";
89-
};
90-
extraArgs = mkOption {
91-
type = types.listOf types.str;
92-
default = [];
93-
description = "Extra arguments for `tailscale set`";
94-
};
95-
dryRun = mkOption {
96-
type = types.bool;
97-
default = false;
98-
description = "Enable dry-run mode, don't actually apply changes.";
99-
};
100-
maxShrinkRatio = mkOption {
101-
type = types.float;
102-
default = 0.5;
103-
description = "How much route shrinkage is allowed between subsequent runs (between 0 and 1)";
104-
};
105-
socketPath = mkOption {
106-
type = types.path;
107-
default = "/var/run/tailscale/tailscaled.sock";
108-
description = "Path to the tailscaled socket";
109-
};
110-
};
111-
config = mkIf cfg.enable {
112-
systemd.services.tailscale-manager = {
113-
after = ["tailscaled.service"];
114-
wants = ["tailscaled.service"];
115-
wantedBy = ["multi-user.target"];
116-
# Never give up on trying to restart
117-
startLimitIntervalSec = 0;
118-
serviceConfig = {
119-
Type = "exec";
120-
Restart = "always";
121-
# Restart at increasing intervals to avoid things like EC2
122-
# metadata service rate limits
123-
RestartSec = 1;
124-
RestartSteps = 30;
125-
RestartMaxDelaySec = 60;
126-
ExecStart = lib.escapeShellArgs (
127-
[ "${cfg.package}/bin/tailscale-manager" configFile
128-
"--tailscale=${config.services.tailscale.package}/bin/tailscale"
129-
"--socket=${cfg.socketPath}"
130-
"--interval=${toString cfg.interval}"
131-
"--max-shrink-ratio=${toString cfg.maxShrinkRatio}"
132-
] ++ lib.optional cfg.dryRun "--dryrun"
133-
);
134-
};
135-
};
136-
};
137-
};
13858
});
13959
}

nix/nixos-module.nix

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
{ config, lib, pkgs, ... }:
2+
3+
with lib;
4+
let
5+
cfg = config.services.tailscale-manager;
6+
configFile = pkgs.writeTextFile {
7+
name = "tailscale-manager.json";
8+
text = generators.toJSON {} {
9+
routes = cfg.routes;
10+
hostRoutes = cfg.hostRoutes;
11+
extraArgs = cfg.extraArgs;
12+
awsManagedPrefixLists = cfg.awsManagedPrefixLists;
13+
};
14+
};
15+
in {
16+
options.services.tailscale-manager = {
17+
enable = mkEnableOption "tailscale-manager";
18+
package = mkPackageOption pkgs "tailscale-manager" {};
19+
interval = mkOption {
20+
type = types.int;
21+
default = 300;
22+
description = "Interval between runs, in seconds";
23+
};
24+
routes = mkOption {
25+
type = types.listOf types.str;
26+
default = [];
27+
description = "List of CIDR prefix routes to advertise";
28+
};
29+
hostRoutes = mkOption {
30+
type = types.listOf types.str;
31+
default = [];
32+
description = "List of hostnames and IP addresses to add as /32 routes";
33+
};
34+
awsManagedPrefixLists = mkOption {
35+
type = types.listOf types.str;
36+
default = [];
37+
description = "AWS prefix list IDs for route discovery";
38+
};
39+
extraArgs = mkOption {
40+
type = types.listOf types.str;
41+
default = [];
42+
description = "Extra arguments for `tailscale set`";
43+
};
44+
dryRun = mkOption {
45+
type = types.bool;
46+
default = false;
47+
description = "Enable dry-run mode, don't actually apply changes.";
48+
};
49+
maxShrinkRatio = mkOption {
50+
type = types.float;
51+
default = 0.5;
52+
description = "How much route shrinkage is allowed between subsequent runs (between 0 and 1)";
53+
};
54+
socketPath = mkOption {
55+
type = types.path;
56+
default = "/var/run/tailscale/tailscaled.sock";
57+
description = "Path to the tailscaled socket";
58+
};
59+
};
60+
config = mkIf cfg.enable {
61+
systemd.services.tailscale-manager = {
62+
after = ["tailscaled.service"];
63+
wants = ["tailscaled.service"];
64+
wantedBy = ["multi-user.target"];
65+
# Never give up on trying to restart
66+
startLimitIntervalSec = 0;
67+
serviceConfig = {
68+
Type = "exec";
69+
Restart = "always";
70+
# Restart at increasing intervals to avoid things like EC2
71+
# metadata service rate limits
72+
RestartSec = 1;
73+
RestartSteps = 30;
74+
RestartMaxDelaySec = 60;
75+
ExecStart = lib.escapeShellArgs (
76+
[ "${cfg.package}/bin/tailscale-manager" configFile
77+
"--tailscale=${config.services.tailscale.package}/bin/tailscale"
78+
"--socket=${cfg.socketPath}"
79+
"--interval=${toString cfg.interval}"
80+
"--max-shrink-ratio=${toString cfg.maxShrinkRatio}"
81+
] ++ lib.optional cfg.dryRun "--dryrun"
82+
);
83+
};
84+
};
85+
};
86+
}

nix/vm-test.nix

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{ self, lib, pkgs, system, ... }:
1+
{ self, lib, pkgs, ... }:
22

33
let fakeTailscale = pkgs.writeScriptBin "tailscale" ''
44
#!/bin/sh
@@ -8,7 +8,7 @@ in
88
pkgs.nixosTest {
99
name = "tailscale-manager";
1010
nodes.machine1 = { config, pkgs, ... }: {
11-
imports = [ self.nixosModules.${system}.tailscale-manager ];
11+
imports = [ self.nixosModules.tailscale-manager ];
1212
services.tailscale.package = fakeTailscale;
1313
services.tailscale-manager = {
1414
enable = true;

0 commit comments

Comments
 (0)