Loading nixos/modules/services/network-filesystems/moosefs.nix +191 −134 Original line number Diff line number Diff line { config, lib, pkgs, ... }: { config, lib, pkgs, ... }: let cfg = config.services.moosefs; mfsUser = if cfg.runAsUser then "moosefs" else "root"; settingsFormat = let settingsFormat = let listSep = " "; allowedTypes = with lib.types; [ bool int float str ]; valueToString = val: if lib.isList val then lib.concatStringsSep listSep (map (x: valueToString x) val) else if lib.isBool val then (if val then "1" else "0") else toString val; in { type = with lib.types; let valueType = oneOf ([ allowedTypes = with lib.types; [ bool int float str ]; valueToString = val: if lib.isList val then lib.concatStringsSep listSep (map (x: valueToString x) val) else if lib.isBool val then (if val then "1" else "0") else toString val; in { type = with lib.types; let valueType = oneOf ( [ (listOf valueType) ] ++ allowedTypes) // { ] ++ allowedTypes ) // { description = "Flat key-value file"; }; in attrsOf valueType; in attrsOf valueType; generate = name: value: pkgs.writeText name ( lib.concatStringsSep "\n" ( lib.mapAttrsToList (key: val: "${key} = ${valueToString val}") value )); generate = name: value: pkgs.writeText name ( lib.concatStringsSep "\n" (lib.mapAttrsToList (key: val: "${key} = ${valueToString val}") value) ); }; # Manual initialization tool Loading @@ -44,7 +70,10 @@ let systemdService = name: extraConfig: configFile: { wantedBy = [ "multi-user.target" ]; wants = [ "network-online.target" ]; after = [ "network.target" "network-online.target" ]; after = [ "network.target" "network-online.target" ]; serviceConfig = { Type = "forking"; Loading @@ -55,7 +84,8 @@ let } // extraConfig; }; in { in { ###### interface options = { services.moosefs = { Loading Loading @@ -150,7 +180,10 @@ in { type = with lib.types; listOf str; default = null; description = "Mount points used by chunkserver for data storage (see mfshdd.cfg)."; example = [ "/mnt/hdd1" "/mnt/hdd2" ]; example = [ "/mnt/hdd1" "/mnt/hdd2" ]; }; settings = lib.mkOption { Loading Loading @@ -205,20 +238,32 @@ in { }; ###### implementation config = lib.mkIf (cfg.client.enable || cfg.master.enable || cfg.metalogger.enable || cfg.chunkserver.enable || cfg.cgiserver.enable) { config = lib.mkIf ( cfg.client.enable || cfg.master.enable || cfg.metalogger.enable || cfg.chunkserver.enable || cfg.cgiserver.enable ) { warnings = [ (lib.mkIf (!cfg.runAsUser) "Running MooseFS services as root is not recommended.") ]; services.moosefs = { master.settings = lib.mkIf cfg.master.enable (lib.mkMerge [ master.settings = lib.mkIf cfg.master.enable ( lib.mkMerge [ { WORKING_USER = mfsUser; EXPORTS_FILENAME = toString ( pkgs.writeText "mfsexports.cfg" (lib.concatStringsSep "\n" cfg.master.exports)); EXPORTS_FILENAME = toString ( pkgs.writeText "mfsexports.cfg" (lib.concatStringsSep "\n" cfg.master.exports) ); } (lib.mkIf cfg.cgiserver.enable { MFSCGISERV = toString cfg.cgiserver.settings.PORT; }) ]); ] ); metalogger.settings = lib.mkIf cfg.metalogger.enable { WORKING_USER = mfsUser; Loading @@ -228,12 +273,19 @@ in { chunkserver.settings = lib.mkIf cfg.chunkserver.enable { WORKING_USER = mfsUser; MASTER_HOST = cfg.masterHost; HDD_CONF_FILENAME = toString ( pkgs.writeText "mfshdd.cfg" (lib.concatStringsSep "\n" cfg.chunkserver.hdds)); HDD_CONF_FILENAME = toString ( pkgs.writeText "mfshdd.cfg" (lib.concatStringsSep "\n" cfg.chunkserver.hdds) ); }; }; users = lib.mkIf ( cfg.runAsUser && ( cfg.master.enable || cfg.metalogger.enable || cfg.chunkserver.enable || cfg.cgiserver.enable ) ) { users = lib.mkIf ( cfg.runAsUser && (cfg.master.enable || cfg.metalogger.enable || cfg.chunkserver.enable || cfg.cgiserver.enable) ) { users.moosefs = { isSystemUser = true; description = "MooseFS daemon user"; Loading @@ -243,33 +295,37 @@ in { }; environment.systemPackages = (lib.optional cfg.client.enable pkgs.moosefs) ++ (lib.optional cfg.master.enable initTool); (lib.optional cfg.client.enable pkgs.moosefs) ++ (lib.optional cfg.master.enable initTool); networking.firewall.allowedTCPPorts = lib.mkMerge [ (lib.optionals cfg.master.openFirewall [ 9419 9420 9421 ]) (lib.optionals cfg.master.openFirewall [ 9419 9420 9421 ]) (lib.optional cfg.chunkserver.openFirewall 9422) (lib.optional (cfg.cgiserver.enable && cfg.cgiserver.openFirewall) cfg.cgiserver.settings.PORT) ]; systemd.tmpfiles.rules = [ systemd.tmpfiles.rules = [ # Master directories (lib.optionalString cfg.master.enable "d ${cfg.master.settings.DATA_PATH} 0700 ${mfsUser} ${mfsUser} -") (lib.optionalString cfg.master.enable "d ${cfg.master.settings.DATA_PATH} 0700 ${mfsUser} ${mfsUser} -") # Metalogger directories (lib.optionalString cfg.metalogger.enable "d ${cfg.metalogger.settings.DATA_PATH} 0700 ${mfsUser} ${mfsUser} -") (lib.optionalString cfg.metalogger.enable "d ${cfg.metalogger.settings.DATA_PATH} 0700 ${mfsUser} ${mfsUser} -") # Chunkserver directories (lib.optionalString cfg.chunkserver.enable "d ${cfg.chunkserver.settings.DATA_PATH} 0700 ${mfsUser} ${mfsUser} -") ] ++ lib.optionals (cfg.chunkserver.enable && cfg.chunkserver.hdds != null) (map (dir: "d ${dir} 0755 ${mfsUser} ${mfsUser} -") cfg.chunkserver.hdds); (lib.optionalString cfg.chunkserver.enable "d ${cfg.chunkserver.settings.DATA_PATH} 0700 ${mfsUser} ${mfsUser} -") ] ++ lib.optionals (cfg.chunkserver.enable && cfg.chunkserver.hdds != null) ( map (dir: "d ${dir} 0755 ${mfsUser} ${mfsUser} -") cfg.chunkserver.hdds ); systemd.services = lib.mkMerge [ (lib.mkIf cfg.master.enable { mfs-master = (lib.mkMerge [ mfs-master = ( lib.mkMerge [ (systemdService "master" { TimeoutStartSec = 1800; TimeoutStopSec = 1800; Loading @@ -279,7 +335,8 @@ in { { preStart = lib.mkIf cfg.master.autoInit "${initTool}/bin/mfsmaster-init"; } ]); ] ); }) (lib.mkIf cfg.metalogger.enable { Loading Loading
nixos/modules/services/network-filesystems/moosefs.nix +191 −134 Original line number Diff line number Diff line { config, lib, pkgs, ... }: { config, lib, pkgs, ... }: let cfg = config.services.moosefs; mfsUser = if cfg.runAsUser then "moosefs" else "root"; settingsFormat = let settingsFormat = let listSep = " "; allowedTypes = with lib.types; [ bool int float str ]; valueToString = val: if lib.isList val then lib.concatStringsSep listSep (map (x: valueToString x) val) else if lib.isBool val then (if val then "1" else "0") else toString val; in { type = with lib.types; let valueType = oneOf ([ allowedTypes = with lib.types; [ bool int float str ]; valueToString = val: if lib.isList val then lib.concatStringsSep listSep (map (x: valueToString x) val) else if lib.isBool val then (if val then "1" else "0") else toString val; in { type = with lib.types; let valueType = oneOf ( [ (listOf valueType) ] ++ allowedTypes) // { ] ++ allowedTypes ) // { description = "Flat key-value file"; }; in attrsOf valueType; in attrsOf valueType; generate = name: value: pkgs.writeText name ( lib.concatStringsSep "\n" ( lib.mapAttrsToList (key: val: "${key} = ${valueToString val}") value )); generate = name: value: pkgs.writeText name ( lib.concatStringsSep "\n" (lib.mapAttrsToList (key: val: "${key} = ${valueToString val}") value) ); }; # Manual initialization tool Loading @@ -44,7 +70,10 @@ let systemdService = name: extraConfig: configFile: { wantedBy = [ "multi-user.target" ]; wants = [ "network-online.target" ]; after = [ "network.target" "network-online.target" ]; after = [ "network.target" "network-online.target" ]; serviceConfig = { Type = "forking"; Loading @@ -55,7 +84,8 @@ let } // extraConfig; }; in { in { ###### interface options = { services.moosefs = { Loading Loading @@ -150,7 +180,10 @@ in { type = with lib.types; listOf str; default = null; description = "Mount points used by chunkserver for data storage (see mfshdd.cfg)."; example = [ "/mnt/hdd1" "/mnt/hdd2" ]; example = [ "/mnt/hdd1" "/mnt/hdd2" ]; }; settings = lib.mkOption { Loading Loading @@ -205,20 +238,32 @@ in { }; ###### implementation config = lib.mkIf (cfg.client.enable || cfg.master.enable || cfg.metalogger.enable || cfg.chunkserver.enable || cfg.cgiserver.enable) { config = lib.mkIf ( cfg.client.enable || cfg.master.enable || cfg.metalogger.enable || cfg.chunkserver.enable || cfg.cgiserver.enable ) { warnings = [ (lib.mkIf (!cfg.runAsUser) "Running MooseFS services as root is not recommended.") ]; services.moosefs = { master.settings = lib.mkIf cfg.master.enable (lib.mkMerge [ master.settings = lib.mkIf cfg.master.enable ( lib.mkMerge [ { WORKING_USER = mfsUser; EXPORTS_FILENAME = toString ( pkgs.writeText "mfsexports.cfg" (lib.concatStringsSep "\n" cfg.master.exports)); EXPORTS_FILENAME = toString ( pkgs.writeText "mfsexports.cfg" (lib.concatStringsSep "\n" cfg.master.exports) ); } (lib.mkIf cfg.cgiserver.enable { MFSCGISERV = toString cfg.cgiserver.settings.PORT; }) ]); ] ); metalogger.settings = lib.mkIf cfg.metalogger.enable { WORKING_USER = mfsUser; Loading @@ -228,12 +273,19 @@ in { chunkserver.settings = lib.mkIf cfg.chunkserver.enable { WORKING_USER = mfsUser; MASTER_HOST = cfg.masterHost; HDD_CONF_FILENAME = toString ( pkgs.writeText "mfshdd.cfg" (lib.concatStringsSep "\n" cfg.chunkserver.hdds)); HDD_CONF_FILENAME = toString ( pkgs.writeText "mfshdd.cfg" (lib.concatStringsSep "\n" cfg.chunkserver.hdds) ); }; }; users = lib.mkIf ( cfg.runAsUser && ( cfg.master.enable || cfg.metalogger.enable || cfg.chunkserver.enable || cfg.cgiserver.enable ) ) { users = lib.mkIf ( cfg.runAsUser && (cfg.master.enable || cfg.metalogger.enable || cfg.chunkserver.enable || cfg.cgiserver.enable) ) { users.moosefs = { isSystemUser = true; description = "MooseFS daemon user"; Loading @@ -243,33 +295,37 @@ in { }; environment.systemPackages = (lib.optional cfg.client.enable pkgs.moosefs) ++ (lib.optional cfg.master.enable initTool); (lib.optional cfg.client.enable pkgs.moosefs) ++ (lib.optional cfg.master.enable initTool); networking.firewall.allowedTCPPorts = lib.mkMerge [ (lib.optionals cfg.master.openFirewall [ 9419 9420 9421 ]) (lib.optionals cfg.master.openFirewall [ 9419 9420 9421 ]) (lib.optional cfg.chunkserver.openFirewall 9422) (lib.optional (cfg.cgiserver.enable && cfg.cgiserver.openFirewall) cfg.cgiserver.settings.PORT) ]; systemd.tmpfiles.rules = [ systemd.tmpfiles.rules = [ # Master directories (lib.optionalString cfg.master.enable "d ${cfg.master.settings.DATA_PATH} 0700 ${mfsUser} ${mfsUser} -") (lib.optionalString cfg.master.enable "d ${cfg.master.settings.DATA_PATH} 0700 ${mfsUser} ${mfsUser} -") # Metalogger directories (lib.optionalString cfg.metalogger.enable "d ${cfg.metalogger.settings.DATA_PATH} 0700 ${mfsUser} ${mfsUser} -") (lib.optionalString cfg.metalogger.enable "d ${cfg.metalogger.settings.DATA_PATH} 0700 ${mfsUser} ${mfsUser} -") # Chunkserver directories (lib.optionalString cfg.chunkserver.enable "d ${cfg.chunkserver.settings.DATA_PATH} 0700 ${mfsUser} ${mfsUser} -") ] ++ lib.optionals (cfg.chunkserver.enable && cfg.chunkserver.hdds != null) (map (dir: "d ${dir} 0755 ${mfsUser} ${mfsUser} -") cfg.chunkserver.hdds); (lib.optionalString cfg.chunkserver.enable "d ${cfg.chunkserver.settings.DATA_PATH} 0700 ${mfsUser} ${mfsUser} -") ] ++ lib.optionals (cfg.chunkserver.enable && cfg.chunkserver.hdds != null) ( map (dir: "d ${dir} 0755 ${mfsUser} ${mfsUser} -") cfg.chunkserver.hdds ); systemd.services = lib.mkMerge [ (lib.mkIf cfg.master.enable { mfs-master = (lib.mkMerge [ mfs-master = ( lib.mkMerge [ (systemdService "master" { TimeoutStartSec = 1800; TimeoutStopSec = 1800; Loading @@ -279,7 +335,8 @@ in { { preStart = lib.mkIf cfg.master.autoInit "${initTool}/bin/mfsmaster-init"; } ]); ] ); }) (lib.mkIf cfg.metalogger.enable { Loading