nixpkgs/nixos/modules/services/networking/dae.nix

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

170 lines
4.9 KiB
Nix
Raw Normal View History

2023-09-02 16:29:02 +00:00
{ config, lib, pkgs, ... }:
2023-08-07 06:32:32 +00:00
let
cfg = config.services.dae;
2023-09-02 16:29:02 +00:00
assets = cfg.assets;
genAssetsDrv = paths: pkgs.symlinkJoin {
name = "dae-assets";
inherit paths;
};
2023-08-07 06:32:32 +00:00
in
{
2023-09-02 16:29:02 +00:00
meta.maintainers = with lib.maintainers; [ pokon548 oluceps ];
2023-08-07 06:32:32 +00:00
options = {
2023-09-02 16:29:02 +00:00
services.dae = with lib;{
enable = mkEnableOption "dae, a Linux high-performance transparent proxy solution based on eBPF";
2023-09-02 16:29:02 +00:00
package = mkPackageOption pkgs "dae" { };
2023-09-02 16:29:02 +00:00
2023-09-02 16:29:02 +00:00
assets = mkOption {
type = with types;(listOf path);
default = with pkgs; [ v2ray-geoip v2ray-domain-list-community ];
defaultText = literalExpression "with pkgs; [ v2ray-geoip v2ray-domain-list-community ]";
description = ''
2023-09-02 16:29:02 +00:00
Assets required to run dae.
'';
};
assetsPath = mkOption {
type = types.str;
default = "${genAssetsDrv assets}/share/v2ray";
defaultText = literalExpression ''
(symlinkJoin {
name = "dae-assets";
paths = assets;
})/share/v2ray
'';
description = ''
2023-09-02 16:29:02 +00:00
The path which contains geolocation database.
This option will override `assets`.
'';
};
openFirewall = mkOption {
type = with types; submodule {
options = {
enable = mkEnableOption "opening {option}`port` in the firewall";
2023-09-02 16:29:02 +00:00
port = mkOption {
2023-09-12 03:38:33 +00:00
type = types.port;
2023-09-02 16:29:02 +00:00
description = ''
Port to be opened. Consist with field `tproxy_port` in config file.
'';
};
};
};
default = {
enable = true;
port = 12345;
};
defaultText = literalExpression ''
{
enable = true;
port = 12345;
}
'';
description = ''
2023-09-02 16:29:02 +00:00
Open the firewall port.
'';
};
configFile = mkOption {
type = with types; (nullOr path);
default = null;
example = "/path/to/your/config.dae";
description = ''
The path of dae config file, end with `.dae`.
'';
};
2023-09-02 16:29:02 +00:00
config = mkOption {
type = with types; (nullOr str);
default = null;
description = ''
WARNING: This option will expose store your config unencrypted world-readable in the nix store.
2023-09-02 16:29:02 +00:00
Config text for dae.
See <https://github.com/daeuniverse/dae/blob/main/example.dae>.
2023-09-02 16:29:02 +00:00
'';
};
disableTxChecksumIpGeneric =
mkEnableOption "" // { description = "See <https://github.com/daeuniverse/dae/issues/43>"; };
2023-09-02 16:29:02 +00:00
2023-08-07 06:32:32 +00:00
};
};
2023-09-02 16:29:02 +00:00
config = lib.mkIf cfg.enable
2023-08-07 06:32:32 +00:00
2023-09-02 16:29:02 +00:00
{
environment.systemPackages = [ cfg.package ];
systemd.packages = [ cfg.package ];
networking = lib.mkIf cfg.openFirewall.enable {
firewall =
let portToOpen = cfg.openFirewall.port;
in
{
allowedTCPPorts = [ portToOpen ];
allowedUDPPorts = [ portToOpen ];
};
2023-08-07 06:32:32 +00:00
};
2023-09-02 16:29:02 +00:00
systemd.services.dae =
let
daeBin = lib.getExe cfg.package;
configPath =
if cfg.configFile != null
then cfg.configFile else pkgs.writeText "config.dae" cfg.config;
TxChecksumIpGenericWorkaround = with lib;
(getExe pkgs.writeShellApplication {
name = "disable-tx-checksum-ip-generic";
text = with pkgs; ''
iface=$(${iproute2}/bin/ip route | ${lib.getExe gawk} '/default/ {print $5}')
${lib.getExe ethtool} -K "$iface" tx-checksum-ip-generic off
'';
});
2023-09-02 16:29:02 +00:00
in
{
wantedBy = [ "multi-user.target" ];
serviceConfig = {
LoadCredential = [ "config.dae:${configPath}" ];
ExecStartPre = [ "" "${daeBin} validate -c \${CREDENTIALS_DIRECTORY}/config.dae" ]
2023-09-02 16:29:02 +00:00
++ (with lib; optional cfg.disableTxChecksumIpGeneric TxChecksumIpGenericWorkaround);
ExecStart = [ "" "${daeBin} run --disable-timestamp -c \${CREDENTIALS_DIRECTORY}/config.dae" ];
2023-09-02 16:29:02 +00:00
Environment = "DAE_LOCATION_ASSET=${cfg.assetsPath}";
};
};
assertions = [
{
assertion = lib.pathExists (toString (genAssetsDrv cfg.assets) + "/share/v2ray");
message = ''
Packages in `assets` has no preset paths included.
Please set `assetsPath` instead.
'';
}
{
assertion = !((config.services.dae.config != null)
&& (config.services.dae.configFile != null));
2023-09-02 16:29:02 +00:00
message = ''
Option `config` and `configFile` could not be set
at the same time.
'';
}
{
assertion = !((config.services.dae.config == null)
&& (config.services.dae.configFile == null));
message = ''
Either `config` or `configFile` should be set.
'';
}
2023-09-02 16:29:02 +00:00
];
2023-08-07 06:32:32 +00:00
};
}