Unverified Commit b7210760 authored by Seth Flynn's avatar Seth Flynn Committed by GitHub
Browse files

autotier: init at 1.2.0, lib45d: init at 0.3.6, nixos/autotierfs: init module (#335846)

parents c57c7c14 eb408716
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -97,6 +97,8 @@

- [Bat](https://github.com/sharkdp/bat), a {manpage}`cat(1)` clone with wings. Available as [programs.bat](options.html#opt-programs.bat).

- [Autotier](https://github.com/45Drives/autotier), a passthrough FUSE filesystem. Available as [services.autotierfs](options.html#opt-services.autotierfs.enable).

- [µStreamer](https://github.com/pikvm/ustreamer), a lightweight MJPEG-HTTP streamer. Available as [services.ustreamer](options.html#opt-services.ustreamer).

- [Whoogle Search](https://github.com/benbusby/whoogle-search), a self-hosted, ad-free, privacy-respecting metasearch engine. Available as [services.whoogle-search](options.html#opt-services.whoogle-search.enable).
+1 −0
Original line number Diff line number Diff line
@@ -417,6 +417,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
+95 −0
Original line number Diff line number Diff line
{
  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}.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.mkPackageOption pkgs "autotier" { };
    settings = lib.mkOption {
      type = lib.types.submodule {
        freeformType = format;
      };
      default = { };
      description = ''
        The contents of the configuration file for autotier.
        See the [autotier repo](https://github.com/45Drives/autotier#configuration) for supported values.
      '';
      example = lib.literalExpression ''
        {
          "/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.settings != { };
        message = "`services.autotierfs.settings` must be configured.";
      }
    ];

    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} 0770 - autotier - -") mountPaths) ++ [
      "d ${stateDir} 0774 - 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;
        wantedBy = [ "local-fs.target" ];
        serviceConfig = {
          Type = "forking";
          ExecStart = "${lib.getExe' cfg.package "autotierfs"} -c /etc/autotier/${generateConfigName path}.conf ${path} -o allow_other,default_permissions";
          ExecStop = "umount ${path}";
        };
      }
    ) cfg.settings;
  };
}
+88 −0
Original line number Diff line number Diff line
{
  stdenv,
  lib,
  fetchFromGitHub,
  fetchpatch,
  pkg-config,
  rocksdb,
  boost,
  fuse3,
  lib45d,
  tbb_2021_11,
  liburing,
  installShellFiles,
}:
stdenv.mkDerivation (finalAttrs: {
  name = "autotier";
  version = "1.2.0";
  src = fetchFromGitHub {
    owner = "45Drives";
    repo = "autotier";
    tag = "v${finalAttrs.version}";
    hash = "sha256-Pf1baDJsyt0ScASWrrgMu8+X5eZPGJSu0/LDQNHe1Ok=";
  };

  patches = [
    # https://github.com/45Drives/autotier/pull/70
    # fix "error: 'uintmax_t' has not been declared" build failure until next release
    (fetchpatch {
      url = "https://github.com/45Drives/autotier/commit/d447929dc4262f607d87cbc8ad40a54d64f5011a.patch";
      hash = "sha256-0ab8YBgdJMxBHfOgUsgPpyUE1GyhAU3+WCYjYA2pjqo=";
    })
    # Unvendor rocksdb (nixpkgs already applies RTTI and PORTABLE flags) and use pkg-config for flags
    (fetchpatch {
      url = "https://github.com/45Drives/autotier/commit/fa282f5079ff17c144a7303d64dad0e44681b87f.patch";
      hash = "sha256-+W3RwSe8zJKgZIXOaawHuI6xRzedYIcZundPC8eHuwM=";
    })
    # Add missing list import to src/incl/config.hpp
    (fetchpatch {
      url = "https://github.com/45Drives/autotier/commit/1f97703f4dfbfe093f5c18c4ee01dcc1c8fe04f3.patch";
      hash = "sha256-3+KOh7JvbujCMbMqnZ5SGopAuOKHitKq6XV6a/jkcog=";
    })
  ];

  buildInputs = [
    rocksdb
    boost
    fuse3
    lib45d
    tbb_2021_11
    liburing
  ];

  nativeBuildInputs = [
    pkg-config
    installShellFiles
  ];

  installPhase = ''
    runHook preInstall

    # binaries
    installBin dist/from_source/*

    # docs
    installManPage doc/man/autotier.8

    # Completions
    installShellCompletion --bash doc/completion/autotier.bash-completion
    installShellCompletion --bash doc/completion/autotierfs.bash-completion

    # Scripts
    installBin script/autotier-init-dirs

    # Default config
    install -Dm755 -t $out/etc/autotier.conf doc/autotier.conf.template

    runHook postInstall
  '';

  meta = {
    homepage = "https://github.com/45Drives/autotier";
    description = "Passthrough FUSE filesystem that intelligently moves files between storage tiers based on frequency of use, file age, and tier fullness";
    license = lib.licenses.gpl3;
    maintainers = with lib.maintainers; [ philipwilk ];
    mainProgram = "autotier"; # cli, for file system use autotierfs
    platforms = lib.platforms.linux; # uses io_uring so only available on linux not unix
  };
})
+44 −0
Original line number Diff line number Diff line
{
  stdenv,
  fetchFromGitHub,
  fetchpatch,
  lib,
}:
stdenv.mkDerivation (finalAttrs: {
  name = "lib45d";
  version = "0.3.6";
  src = fetchFromGitHub {
    owner = "45Drives";
    repo = "lib45d";
    tag = "v${finalAttrs.version}";
    hash = "sha256-42xB30Iu2WxNrBxomVBKd/uyIRt27y/Y1ah5mckOrc0=";
  };

  patches = [
    # https://github.com/45Drives/lib45d/issues/3
    # fix "error: 'uintmax_t' has not been declared" build failure until next release
    (fetchpatch {
      url = "https://github.com/45Drives/lib45d/commit/a607e278182a3184c004c45c215aa22c15d6941d.patch";
      hash = "sha256-sMAvOp4EjBXGHa9PGuuEqJvpEvUlMuzRKCfq9oqQLgY=";
    })
  ];

  installPhase = ''
    runHook preInstall

    install -Dm755 -t $out/lib dist/shared/lib45d.so

    mkdir -p $out/include/45d
    cp -f -r src/incl/45d/* $out/include/45d/

    runHook postInstall
  '';

  meta = {
    homepage = "https://github.com/45Drives/lib45d";
    description = "45Drives C++ Library";
    license = lib.licenses.gpl3;
    maintainers = with lib.maintainers; [ philipwilk ];
    platforms = lib.platforms.linux;
  };
})