nixosModules.MooseFS: Format
This commit is contained in:
parent
93ff48c9be
commit
10f6382917
@ -1,29 +1,55 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
cfg = config.services.moosefs;
|
||||
|
||||
mfsUser = if cfg.runAsUser then "moosefs" else "root";
|
||||
|
||||
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;
|
||||
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 ([
|
||||
(listOf valueType)
|
||||
] ++ allowedTypes) // {
|
||||
description = "Flat key-value file";
|
||||
};
|
||||
in attrsOf valueType;
|
||||
in
|
||||
{
|
||||
type =
|
||||
with lib.types;
|
||||
let
|
||||
valueType =
|
||||
oneOf (
|
||||
[
|
||||
(listOf valueType)
|
||||
]
|
||||
++ allowedTypes
|
||||
)
|
||||
// {
|
||||
description = "Flat key-value file";
|
||||
};
|
||||
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
|
||||
@ -44,18 +70,22 @@ 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";
|
||||
ExecStart = "${pkgs.moosefs}/bin/mfs${name} -c ${configFile} start";
|
||||
ExecStop = "${pkgs.moosefs}/bin/mfs${name} -c ${configFile} stop";
|
||||
ExecStart = "${pkgs.moosefs}/bin/mfs${name} -c ${configFile} start";
|
||||
ExecStop = "${pkgs.moosefs}/bin/mfs${name} -c ${configFile} stop";
|
||||
ExecReload = "${pkgs.moosefs}/bin/mfs${name} -c ${configFile} reload";
|
||||
PIDFile = "${cfg."${name}".settings.DATA_PATH}/.mfs${name}.lock";
|
||||
} // extraConfig;
|
||||
};
|
||||
|
||||
in {
|
||||
in
|
||||
{
|
||||
###### interface
|
||||
options = {
|
||||
services.moosefs = {
|
||||
@ -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 {
|
||||
@ -197,7 +230,7 @@ in {
|
||||
};
|
||||
};
|
||||
};
|
||||
default = {};
|
||||
default = { };
|
||||
description = "CGI server configuration options.";
|
||||
};
|
||||
};
|
||||
@ -205,115 +238,139 @@ in {
|
||||
};
|
||||
|
||||
###### implementation
|
||||
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.") ];
|
||||
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 [
|
||||
{
|
||||
WORKING_USER = mfsUser;
|
||||
EXPORTS_FILENAME = toString ( pkgs.writeText "mfsexports.cfg"
|
||||
(lib.concatStringsSep "\n" cfg.master.exports));
|
||||
}
|
||||
(lib.mkIf cfg.cgiserver.enable {
|
||||
MFSCGISERV = toString cfg.cgiserver.settings.PORT;
|
||||
})
|
||||
]);
|
||||
services.moosefs = {
|
||||
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)
|
||||
);
|
||||
}
|
||||
(lib.mkIf cfg.cgiserver.enable {
|
||||
MFSCGISERV = toString cfg.cgiserver.settings.PORT;
|
||||
})
|
||||
]
|
||||
);
|
||||
|
||||
metalogger.settings = lib.mkIf cfg.metalogger.enable {
|
||||
WORKING_USER = mfsUser;
|
||||
MASTER_HOST = cfg.masterHost;
|
||||
};
|
||||
metalogger.settings = lib.mkIf cfg.metalogger.enable {
|
||||
WORKING_USER = mfsUser;
|
||||
MASTER_HOST = cfg.masterHost;
|
||||
};
|
||||
|
||||
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));
|
||||
};
|
||||
};
|
||||
|
||||
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";
|
||||
group = "moosefs";
|
||||
};
|
||||
groups.moosefs = {};
|
||||
};
|
||||
|
||||
environment.systemPackages =
|
||||
(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.optional cfg.chunkserver.openFirewall 9422)
|
||||
(lib.optional (cfg.cgiserver.enable && cfg.cgiserver.openFirewall) cfg.cgiserver.settings.PORT)
|
||||
];
|
||||
|
||||
systemd.tmpfiles.rules = [
|
||||
# Master directories
|
||||
(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} -")
|
||||
|
||||
# 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);
|
||||
|
||||
systemd.services = lib.mkMerge [
|
||||
(lib.mkIf cfg.master.enable {
|
||||
mfs-master = (lib.mkMerge [
|
||||
(systemdService "master" {
|
||||
TimeoutStartSec = 1800;
|
||||
TimeoutStopSec = 1800;
|
||||
Restart = "on-failure";
|
||||
User = mfsUser;
|
||||
} masterCfg)
|
||||
{
|
||||
preStart = lib.mkIf cfg.master.autoInit "${initTool}/bin/mfsmaster-init";
|
||||
}
|
||||
]);
|
||||
})
|
||||
|
||||
(lib.mkIf cfg.metalogger.enable {
|
||||
mfs-metalogger = systemdService "metalogger" {
|
||||
Restart = "on-abnormal";
|
||||
User = mfsUser;
|
||||
} metaloggerCfg;
|
||||
})
|
||||
|
||||
(lib.mkIf cfg.chunkserver.enable {
|
||||
mfs-chunkserver = systemdService "chunkserver" {
|
||||
Restart = "on-abnormal";
|
||||
User = mfsUser;
|
||||
} chunkserverCfg;
|
||||
})
|
||||
|
||||
(lib.mkIf cfg.cgiserver.enable {
|
||||
mfs-cgiserv = {
|
||||
description = "MooseFS CGI Server";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
after = [ "mfs-master.service" ];
|
||||
|
||||
serviceConfig = {
|
||||
Type = "simple";
|
||||
ExecStart = "${pkgs.moosefs}/bin/mfscgiserv -D /var/lib/mfs -f start";
|
||||
ExecStop = "${pkgs.moosefs}/bin/mfscgiserv -D /var/lib/mfs stop";
|
||||
Restart = "on-failure";
|
||||
RestartSec = "30s";
|
||||
User = mfsUser;
|
||||
Group = mfsUser;
|
||||
WorkingDirectory = "/var/lib/mfs";
|
||||
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)
|
||||
);
|
||||
};
|
||||
};
|
||||
})
|
||||
];
|
||||
};
|
||||
|
||||
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";
|
||||
group = "moosefs";
|
||||
};
|
||||
groups.moosefs = { };
|
||||
};
|
||||
|
||||
environment.systemPackages =
|
||||
(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.optional cfg.chunkserver.openFirewall 9422)
|
||||
(lib.optional (cfg.cgiserver.enable && cfg.cgiserver.openFirewall) cfg.cgiserver.settings.PORT)
|
||||
];
|
||||
|
||||
systemd.tmpfiles.rules =
|
||||
[
|
||||
# Master directories
|
||||
(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} -")
|
||||
|
||||
# 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
|
||||
);
|
||||
|
||||
systemd.services = lib.mkMerge [
|
||||
(lib.mkIf cfg.master.enable {
|
||||
mfs-master = (
|
||||
lib.mkMerge [
|
||||
(systemdService "master" {
|
||||
TimeoutStartSec = 1800;
|
||||
TimeoutStopSec = 1800;
|
||||
Restart = "on-failure";
|
||||
User = mfsUser;
|
||||
} masterCfg)
|
||||
{
|
||||
preStart = lib.mkIf cfg.master.autoInit "${initTool}/bin/mfsmaster-init";
|
||||
}
|
||||
]
|
||||
);
|
||||
})
|
||||
|
||||
(lib.mkIf cfg.metalogger.enable {
|
||||
mfs-metalogger = systemdService "metalogger" {
|
||||
Restart = "on-abnormal";
|
||||
User = mfsUser;
|
||||
} metaloggerCfg;
|
||||
})
|
||||
|
||||
(lib.mkIf cfg.chunkserver.enable {
|
||||
mfs-chunkserver = systemdService "chunkserver" {
|
||||
Restart = "on-abnormal";
|
||||
User = mfsUser;
|
||||
} chunkserverCfg;
|
||||
})
|
||||
|
||||
(lib.mkIf cfg.cgiserver.enable {
|
||||
mfs-cgiserv = {
|
||||
description = "MooseFS CGI Server";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
after = [ "mfs-master.service" ];
|
||||
|
||||
serviceConfig = {
|
||||
Type = "simple";
|
||||
ExecStart = "${pkgs.moosefs}/bin/mfscgiserv -D /var/lib/mfs -f start";
|
||||
ExecStop = "${pkgs.moosefs}/bin/mfscgiserv -D /var/lib/mfs stop";
|
||||
Restart = "on-failure";
|
||||
RestartSec = "30s";
|
||||
User = mfsUser;
|
||||
Group = mfsUser;
|
||||
WorkingDirectory = "/var/lib/mfs";
|
||||
};
|
||||
};
|
||||
})
|
||||
];
|
||||
};
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user