at 16.09-beta 1.7 kB view raw
1{ config, lib, pkgs, ... }: 2 3with lib; 4 5let 6 cfg = config.services.ferm; 7 8 configFile = pkgs.stdenv.mkDerivation { 9 name = "ferm.conf"; 10 text = cfg.config; 11 preferLocalBuild = true; 12 buildCommand = '' 13 echo -n "$text" > $out 14 ${cfg.package}/bin/ferm --noexec $out 15 ''; 16 }; 17in { 18 options = { 19 services.ferm = { 20 enable = mkOption { 21 default = false; 22 example = true; 23 type = types.bool; 24 description = '' 25 Whether to enable Ferm Firewall. 26 *Warning*: Enabling this service WILL disable the existing NixOS 27 firewall! Default firewall rules provided by packages are not 28 considered at the moment. 29 ''; 30 }; 31 config = mkOption { 32 description = "Verbatim ferm.conf configuration."; 33 default = ""; 34 defaultText = "empty firewall, allows any traffic"; 35 type = types.lines; 36 }; 37 package = mkOption { 38 description = "The ferm package."; 39 type = types.package; 40 default = pkgs.ferm; 41 defaultText = "pkgs.ferm"; 42 }; 43 }; 44 }; 45 46 config = mkIf cfg.enable { 47 systemd.services.firewall.enable = false; 48 systemd.services.ferm = { 49 description = "Ferm Firewall"; 50 after = [ "ipset.target" ]; 51 before = [ "network-pre.target" ]; 52 wants = [ "network-pre.target" ]; 53 wantedBy = [ "multi-user.target" ]; 54 serviceConfig = { 55 Type="oneshot"; 56 RemainAfterExit = "yes"; 57 ExecStart = "${cfg.package}/bin/ferm ${configFile}"; 58 ExecReload = "${cfg.package}/bin/ferm ${configFile}"; 59 ExecStop = "${cfg.package}/bin/ferm -F ${configFile}"; 60 }; 61 }; 62 }; 63}