Skip to content

Commit

Permalink
nixos/autotierfs: init module
Browse files Browse the repository at this point in the history
  • Loading branch information
philipwilk committed Dec 24, 2024
1 parent e29dd75 commit ad186e6
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 0 deletions.
1 change: 1 addition & 0 deletions nixos/modules/module-list.nix
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,7 @@
./services/audio/squeezelite.nix
./services/audio/tts.nix
./services/audio/ympd.nix
./services/autotierfs.nix
./services/backup/automysqlbackup.nix
./services/backup/bacula.nix
./services/backup/borgbackup.nix
Expand Down
93 changes: 93 additions & 0 deletions nixos/modules/services/autotierfs.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
{ config, lib, pkgs, ... }:
let
cfg = config.services.autotierfs;
ini = pkgs.formats.ini { };
format = lib.types.attrsOf ini.type;
stateDir = "/var/lib/autotier";

generateConfigName = name:
builtins.replaceStrings [ "/" ] [ "-" ] (lib.strings.removePrefix "/" name);
configFiles = builtins.mapAttrs
(name: val: ini.generate "${generateConfigName name}-autotier.conf" val)
cfg.settings;

getMountDeps = settings:
builtins.concatStringsSep " "
(builtins.catAttrs "Path" (builtins.attrValues settings));

mountPaths = builtins.attrNames cfg.settings;
in {
options.services.autotierfs = {
enable = lib.mkEnableOption "the autotier passthrough tiering filesystem";
package = lib.mkOption {
type = lib.types.package;
default = pkgs.autotier;
defaultText = lib.options.literalExpression "pkgs.autotier";
description = "Configured package for the filesystem and its cli.";
};
settings = lib.mkOption {
type = lib.types.nullOr format;
default = null;
description = ''
The contents of the configuration file for autotier.
Config can be found in the [autotier repo](https://github.com/45Drives/autotier#configuration)
'';
example = {
"/mnt/autotier" = {
Global = {
"Log Level" = 1;
"Tier Period" = 1000;
"Copy Buffer Size" = "1 MiB";
};
"Tier 1" = {
Path = "/mnt/tier1";
Quota = "30GiB";
};
"Tier 2" = {
Path = "/mnt/tier2";
Quota = "200GiB";
};
};
};
};
};

config = lib.mkIf cfg.enable {
assertions = [{
assertion = cfg.enable -> cfg.settings != null;
message = "Autotier needs a config file to know how to tier your paths.";
}];

system.fsPackages = [ cfg.package ];

# Not necessary for module to work but makes it easier to pass config into cli
environment.etc = lib.attrsets.mapAttrs' (name: value:
lib.attrsets.nameValuePair "autotier/${(generateConfigName name)}.conf" {
source = value;
}) configFiles;

systemd.tmpfiles.rules = (map (path: "d ${path} 1700 autotier autotier - -") mountPaths) ++ [
"d ${stateDir} 1744 autotier autotier - -"
];

users.users.autotier = {
isSystemUser = true;
group = "autotier";
};
users.groups.autotier = {};

systemd.services = lib.attrsets.mapAttrs' (path: values:
lib.attrsets.nameValuePair (generateConfigName path) {
description = "Mount autotierfs virtual path ${path}";
unitConfig.RequiresMountsFor = getMountDeps values;
serviceConfig = {
Type = "oneshot";
User = "autotier";
ReadWritePaths = stateDir;
ExecStart = "${cfg.package}/bin/autotierfs -c ${
configFiles.${path}
} ${path} -o allow_other,default_permissions";
};
}) cfg.settings;
};
}

0 comments on commit ad186e6

Please sign in to comment.