Commit 56ae1fb4 authored by Anthony Roussel's avatar Anthony Roussel Committed by Pascal Bach
Browse files

nixos/samba: split and sync SystemD services with upstream

parent ac29b192
Loading
Loading
Loading
Loading
+147 −70
Original line number Diff line number Diff line
@@ -8,38 +8,6 @@ let
  settingsFormat = pkgs.formats.ini { };
  configFile = settingsFormat.generate "smb.conf" cfg.settings;

  samba = cfg.package;

  # This may include nss_ldap, needed for samba if it has to use ldap.
  nssModulesPath = config.system.nssModules.path;

  daemonService = appName: args:
    { description = "Samba Service Daemon ${appName}";
      documentation = [ "man:${appName}(8)" "man:samba(7)" "man:smb.conf(5)" ];

      after = [ (mkIf (cfg.nmbd.enable && "${appName}" == "smbd") "samba-nmbd.service") "network.target" ];
      requiredBy = [ "samba.target" ];
      partOf = [ "samba.target" ];

      environment = {
        LD_LIBRARY_PATH = nssModulesPath;
        LOCALE_ARCHIVE = "/run/current-system/sw/lib/locale/locale-archive";
      };

      serviceConfig = {
        ExecStart = "${samba}/sbin/${appName} --foreground --no-process-group ${args}";
        ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
        LimitNOFILE = 16384;
        PIDFile = "/run/${appName}.pid";
        Type = "notify";
        NotifyAccess = "all"; #may not do anything...
        Slice = "system-samba.slice";
      };
      unitConfig.RequiresMountsFor = "/var/lib/samba";

      restartTriggers = [ configFile ];
    };

in

{
@@ -71,9 +39,6 @@ in
  ###### interface

  options = {

    # !!! clean up the descriptions.

    services.samba = {
      enable = lib.mkEnableOption "Samba, the SMB/CIFS protocol";

@@ -83,13 +48,22 @@ in

      openFirewall = lib.mkEnableOption "opening the default ports in the firewall for Samba";

      smbd.enable = lib.mkOption {
      smbd = {
        enable = lib.mkOption {
          type = lib.types.bool;
          default = true;
        description = lib.mdDoc "Whether to enable Samba's smbd daemon.";
          description = "Whether to enable Samba's smbd daemon.";
        };

        extraArgs = lib.mkOption {
          type = lib.types.listOf lib.types.str;
          default = [ ];
          description = "Extra arguments to pass to the smbd service.";
        };
      };

      nmbd.enable = lib.mkOption {
      nmbd = {
        enable = lib.mkOption {
          type = lib.types.bool;
          default = true;
          description = ''
@@ -99,7 +73,15 @@ in
          '';
        };

      winbindd.enable = lib.mkOption {
        extraArgs = lib.mkOption {
          type = lib.types.listOf lib.types.str;
          default = [ ];
          description = "Extra arguments to pass to the nmbd service.";
        };
      };

      winbindd = {
        enable = lib.mkOption {
          type = lib.types.bool;
          default = true;
          description = ''
@@ -109,6 +91,13 @@ in
          '';
        };

        extraArgs = lib.mkOption {
          type = lib.types.listOf lib.types.str;
          default = [ ];
          description = "Extra arguments to pass to the winbindd service.";
        };
      };

      nsswins = lib.mkEnableOption ''
        WINS NSS (Name Service Switch) plug-in.

@@ -154,31 +143,22 @@ in
          ];
      }

      (mkIf cfg.enable {
      (lib.mkIf cfg.enable {
        environment.etc."samba/smb.conf".source = configFile;

        system.nssModules = optional cfg.nsswins samba;
        system.nssModules = optional cfg.nsswins cfg.package;
        system.nssDatabases.hosts = optional cfg.nsswins "wins";

        systemd = {
          slices.system-samba = {
            description = "Samba slice";
          };
          targets.samba = {
            description = "Samba Server";
            after = [ "network.target" ];
            wants = [ "network-online.target" ];
            wantedBy = [ "multi-user.target" ];
          };

          slices.system-samba = {
            description = "Samba slice";
          };

          # Refer to https://github.com/samba-team/samba/tree/master/packaging/systemd
          # for correct use with systemd
          services = {
            samba-smbd = mkIf cfg.smbd.enable (daemonService "smbd" "");
            samba-nmbd = mkIf cfg.nmbd.enable (daemonService "nmbd" "");
            samba-winbindd = mkIf cfg.winbindd.enable (daemonService "winbindd" "");
          };
          tmpfiles.rules = [
            "d /var/lock/samba - - - - -"
            "d /var/log/samba - - - - -"
@@ -202,6 +182,103 @@ in
        networking.firewall.allowedTCPPorts = mkIf cfg.openFirewall [ 139 445 ];
        networking.firewall.allowedUDPPorts = mkIf cfg.openFirewall [ 137 138 ];
      })

      (lib.mkIf cfg.nmbd.enable {
        systemd.services.samba-nmbd = {
          description = "Samba NMB Daemon";
          documentation = [ "man:nmbd(8)" "man:samba(7)" "man:smb.conf(5)" ];

          after = [
            "network.target"
            "network-online.target"
          ];

          partOf = [ "samba.target" ];
          wantedBy = [ "samba.target" ];
          wants = [ "network-online.target" ];

          environment.LD_LIBRARY_PATH = config.system.nssModules.path;

          serviceConfig = {
            ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
            ExecStart = "${cfg.package}/sbin/nmbd --foreground --no-process-group ${lib.escapeShellArgs cfg.nmbd.extraArgs}";
            LimitCORE = "infinity";
            PIDFile = "/run/samba/nmbd.pid";
            Slice = "system-samba.slice";
            Type = "notify";
          };

          unitConfig.RequiresMountsFor = "/var/lib/samba";

          restartTriggers = [ configFile ];
        };
      })

      (lib.mkIf cfg.smbd.enable {
        systemd.services.samba-smbd = {
          description = "Samba SMB Daemon";
          documentation = [ "man:smbd(8)" "man:samba(7)" "man:smb.conf(5)" ];

          after = [
            "network.target"
            "network-online.target"
          ] ++ lib.optionals (cfg.nmbd.enable) [
            "samba-nmbd.service"
          ] ++ lib.optionals (cfg.winbindd.enable) [
            "samba-winbindd.service"
          ];

          partOf = [ "samba.target" ];
          wantedBy = [ "samba.target" ];
          wants = [ "network-online.target" ];

          environment.LD_LIBRARY_PATH = config.system.nssModules.path;

          serviceConfig = {
            ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
            ExecStart = "${cfg.package}/sbin/smbd --foreground --no-process-group ${lib.escapeShellArgs cfg.smbd.extraArgs}";
            LimitCORE = "infinity";
            LimitNOFILE = 16384;
            PIDFile = "/run/samba/smbd.pid";
            Slice = "system-samba.slice";
            Type = "notify";
          };

          unitConfig.RequiresMountsFor = "/var/lib/samba";

          restartTriggers = [ configFile ];
        };
      })

      (lib.mkIf cfg.winbindd.enable {
        systemd.services.samba-winbindd = {
          description = "Samba Winbind Daemon";
          documentation = [ "man:winbindd(8)" "man:samba(7)" "man:smb.conf(5)" ];

          after = [
            "network.target"
          ] ++ lib.optionals (cfg.nmbd.enable) [
            "samba-nmbd.service"
          ];

          partOf = [ "samba.target" ];
          wantedBy = [ "samba.target" ];

          environment.LD_LIBRARY_PATH = config.system.nssModules.path;

          serviceConfig = {
            ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
            ExecStart = "${cfg.package}/sbin/winbindd --foreground --no-process-group ${lib.escapeShellArgs cfg.winbindd.extraArgs}";
            LimitCORE = "infinity";
            PIDFile = "/run/samba/winbindd.pid";
            Slice = "system-samba.slice";
            Type = "notify";
          };

          unitConfig.RequiresMountsFor = "/var/lib/samba";

          restartTriggers = [ configFile ];
        };
      })
    ];
}