Skip to content

Commit aba569c

Browse files
nixos/shadowsocks: add package option (#407592)
2 parents fac05ed + ea14385 commit aba569c

3 files changed

Lines changed: 54 additions & 12 deletions

File tree

nixos/modules/services/networking/shadowsocks.nix

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,15 @@ let
2929

3030
configFile = pkgs.writeText "shadowsocks.json" (builtins.toJSON opts);
3131

32+
executablesMap = {
33+
"${getName pkgs.shadowsocks-libev}" = {
34+
server = "ss-server";
35+
};
36+
"${getName pkgs.shadowsocks-rust}" = {
37+
server = "ssserver";
38+
};
39+
};
3240
in
33-
3441
{
3542

3643
###### interface
@@ -47,14 +54,25 @@ in
4754
'';
4855
};
4956

57+
package = mkPackageOption pkgs "Shadowsocks" {
58+
default = "shadowsocks-libev";
59+
};
60+
5061
localAddress = mkOption {
51-
type = types.coercedTo types.str singleton (types.listOf types.str);
62+
type =
63+
with types;
64+
oneOf [
65+
str
66+
(listOf str)
67+
];
68+
# Keeped for compatibility
5269
default = [
5370
"[::0]"
5471
"0.0.0.0"
5572
];
5673
description = ''
5774
Local addresses to which the server binds.
75+
Note: shadowsocks-rust accepts only string parameter.
5876
'';
5977
};
6078

@@ -163,14 +181,19 @@ in
163181
(noPasswd && !noPasswdFile) || (!noPasswd && noPasswdFile);
164182
message = "Option `password` or `passwordFile` must be set and cannot be set simultaneously";
165183
}
184+
{
185+
# Ensure localAddress is a string if package is shadowsocks-rust
186+
assertion = !(getName cfg.package == "shadowsocks-rust" && !lib.strings.isString cfg.localAddress);
187+
message = "Option `localAddress` must be a string when using shadowsocks-rust.";
188+
}
166189
];
167190

168-
systemd.services.shadowsocks-libev = {
169-
description = "shadowsocks-libev Daemon";
191+
systemd.services.${getName cfg.package} = {
192+
description = "${getName cfg.package} Daemon";
170193
after = [ "network.target" ];
171194
wantedBy = [ "multi-user.target" ];
172195
path = [
173-
pkgs.shadowsocks-libev
196+
cfg.package
174197
]
175198
++ optional (cfg.plugin != null) cfg.plugin
176199
++ optional (cfg.passwordFile != null) pkgs.jq;
@@ -179,7 +202,9 @@ in
179202
${optionalString (cfg.passwordFile != null) ''
180203
cat ${configFile} | jq --arg password "$(cat "${cfg.passwordFile}")" '. + { password: $password }' > /tmp/shadowsocks.json
181204
''}
182-
exec ss-server -c ${if cfg.passwordFile != null then "/tmp/shadowsocks.json" else configFile}
205+
exec ${(executablesMap.${getName cfg.package}).server} -c ${
206+
if cfg.passwordFile != null then "/tmp/shadowsocks.json" else configFile
207+
}
183208
'';
184209
};
185210
};

nixos/tests/shadowsocks/common.nix

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
{
22
name,
3+
package,
34
plugin ? null,
45
pluginOpts ? "",
56
}:
67

78
import ../make-test-python.nix (
89
{ pkgs, lib, ... }:
10+
911
{
1012
inherit name;
1113
meta = {
@@ -27,9 +29,10 @@ import ../make-test-python.nix (
2729
networking.firewall.allowedUDPPorts = [ 8488 ];
2830
services.shadowsocks = {
2931
enable = true;
32+
package = package;
3033
encryptionMethod = "chacha20-ietf-poly1305";
3134
password = "pa$$w0rd";
32-
localAddress = [ "0.0.0.0" ];
35+
localAddress = "0.0.0.0";
3336
port = 8488;
3437
fastOpen = false;
3538
mode = "tcp_and_udp";
@@ -78,7 +81,7 @@ import ../make-test-python.nix (
7881
testScript = ''
7982
start_all()
8083
81-
server.wait_for_unit("shadowsocks-libev.service")
84+
server.wait_for_unit("${lib.getName package}.service")
8285
server.wait_for_unit("nginx.service")
8386
client.wait_for_unit("shadowsocks-client.service")
8487

nixos/tests/shadowsocks/default.nix

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,26 @@
55
}:
66

77
{
8-
"basic" = import ./common.nix {
9-
name = "basic";
8+
"basic-libev" = import ./common.nix {
9+
name = "basic-libev";
10+
package = pkgs.shadowsocks-libev;
1011
};
1112

12-
"v2ray-plugin" = import ./common.nix {
13-
name = "v2ray-plugin";
13+
"basic-rust" = import ./common.nix {
14+
name = "basic-rust";
15+
package = pkgs.shadowsocks-rust;
16+
};
17+
18+
"v2ray-plugin-libev" = import ./common.nix {
19+
name = "v2ray-plugin-libev";
20+
package = pkgs.shadowsocks-libev;
21+
plugin = "${pkgs.shadowsocks-v2ray-plugin}/bin/v2ray-plugin";
22+
pluginOpts = "host=nixos.org";
23+
};
24+
25+
"v2ray-plugin-rust" = import ./common.nix {
26+
name = "v2ray-plugin-rust";
27+
package = pkgs.shadowsocks-rust;
1428
plugin = "${pkgs.shadowsocks-v2ray-plugin}/bin/v2ray-plugin";
1529
pluginOpts = "host=nixos.org";
1630
};

0 commit comments

Comments
 (0)