Init IFM service at version 4.0.2

Signed-off-by: Litchi Pi <litchi.pi@proton.me>
This commit is contained in:
Litchi Pi 2024-07-18 17:17:36 +02:00
parent 2dbea5a366
commit 0fb7268b9b
5 changed files with 121 additions and 0 deletions

View File

@ -54,6 +54,8 @@
- [Apache Tika](https://github.com/apache/tika), a toolkit that detects and extracts metadata and text from over a thousand different file types. Available as [services.tika](option.html#opt-services.tika).
- [Improved File Manager](https://github.com/misterunknown/ifm), or IFM, a single-file web-based file manager.
## Backward Incompatibilities {#sec-release-24.11-incompatibilities}
- `transmission` package has been aliased with a `trace` warning to `transmission_3`. Since [Transmission 4 has been released last year](https://github.com/transmission/transmission/releases/tag/4.0.0), and Transmission 3 will eventually go away, it was decided perform this warning alias to make people aware of the new version. The `services.transmission.package` defaults to `transmission_3` as well because the upgrade can cause data loss in certain specific usage patterns (examples: [#5153](https://github.com/transmission/transmission/issues/5153), [#6796](https://github.com/transmission/transmission/issues/6796)). Please make sure to back up to your data directory per your usage:

View File

@ -1403,6 +1403,7 @@
./services/web-apps/honk.nix
./services/web-apps/icingaweb2/icingaweb2.nix
./services/web-apps/icingaweb2/module-monitoring.nix
./services/web-apps/ifm.nix
./services/web-apps/invidious.nix
./services/web-apps/invoiceplane.nix
./services/web-apps/isso.nix

View File

@ -0,0 +1,81 @@
{ config, lib, pkgs, ...}:
let
cfg = config.services.ifm;
version = "4.0.2";
src = pkgs.fetchurl {
url = "https://github.com/misterunknown/ifm/releases/download/v${version}/cdn.ifm.php";
hash = "sha256-37WbRM6D7JGmd//06zMhxMGIh8ioY8vRUmxX4OHgqBE=";
};
php = pkgs.php83;
in {
options.services.ifm = {
enable = lib.mkEnableOption ''
Improved file manager, a single-file web-based filemanager
Lightweight and minimal, served using PHP's built-in server
'';
dataDir = lib.mkOption {
type = lib.types.str;
description = "Directory to serve throught the file managing service";
};
listenAddress = lib.mkOption {
type = lib.types.str;
default = "127.0.0.1";
description = "Address on which the service is listening";
example = "0.0.0.0";
};
port = lib.mkOption {
type = lib.types.port;
default = 9090;
description = "Port on which to serve the IFM service";
};
settings = lib.mkOption {
type = with lib.types; attrsOf anything;
default = {};
description = ''
Configuration of the IFM service.
See [the documentation](https://github.com/misterunknown/ifm/wiki/Configuration)
for available options and default values.
'';
example = {
IFM_GUI_SHOWPATH = 0;
};
};
};
config = lib.mkIf cfg.enable {
systemd.services.ifm = {
description = "Improved file manager, a single-file web based filemanager";
after = [ "network-online.target" ];
wantedBy = [ "multi-user.target" ];
environment = {
IFM_ROOT_DIR = "/data";
} // (builtins.mapAttrs (_: val: toString val) cfg.settings);
script = ''
mkdir -p /tmp/ifm
ln -s ${src} /tmp/ifm/index.php
${lib.getExe php} -S ${cfg.listenAddress}:${builtins.toString cfg.port} -t /tmp/ifm
'';
serviceConfig = {
DynamicUser = true;
User = "ifm";
StandardOutput = "journal";
BindPaths = "${cfg.dataDir}:/data";
PrivateTmp = true;
};
};
};
meta.maintainers = with lib.maintainers; [ litchipi ];
}

View File

@ -439,6 +439,7 @@ in {
hydra = handleTest ./hydra {};
i3wm = handleTest ./i3wm.nix {};
icingaweb2 = handleTest ./icingaweb2.nix {};
ifm = handleTest ./ifm.nix {};
iftop = handleTest ./iftop.nix {};
incron = handleTest ./incron.nix {};
incus = pkgs.recurseIntoAttrs (handleTest ./incus { inherit handleTestOn; inherit (pkgs) incus; });

36
nixos/tests/ifm.nix Normal file
View File

@ -0,0 +1,36 @@
import ./make-test-python.nix ({ pkgs, ...} :
{
name = "ifm";
meta = with pkgs.lib.maintainers; {
maintainers = [ litchipi ];
};
nodes = {
server = rec {
services.ifm = {
enable = true;
port = 9001;
dataDir = "/data";
};
system.activationScripts.ifm-setup-dir = ''
mkdir -p ${services.ifm.dataDir}
chmod u+w,g+w,o+w ${services.ifm.dataDir}
'';
};
};
testScript = ''
start_all()
server.wait_for_unit("ifm.service")
server.wait_for_open_port(9001)
server.succeed("curl --fail http://localhost:9001")
server.succeed("echo \"testfile\" > testfile && shasum testfile >> checksums")
server.succeed("curl --fail http://localhost:9001 -X POST -F \"api=upload\" -F \"dir=\" -F \"file=@testfile\" | grep \"OK\"");
server.succeed("rm testfile")
server.succeed("curl --fail http://localhost:9001 -X POST -F \"api=download\" -F \"filename=testfile\" -F \"dir=\" --output testfile");
server.succeed("shasum testfile >> checksums && shasum --check checksums")
'';
})