{ config, lib, pkgs, ... }: with lib; let cfg = config.services.osmscout-server; in { meta.maintainers = [ maintainers.Thra11 ]; options = { services.osmscout-server = { enable = mkEnableOption "OSM Scout Server"; package = mkPackageOption pkgs "osmscout-server" { }; network = { startWhenNeeded = mkOption { type = types.bool; default = true; description = '' Enable systemd socket activation. ''; }; listenAddress = mkOption { type = types.str; default = "127.0.0.1"; description = '' The address for the server to listen on. ''; }; port = mkOption { type = types.port; default = 8553; description = '' The TCP port on which the server will listen. ''; }; }; }; }; config = mkIf cfg.enable { assertions = [ (lib.hm.assertions.assertPlatform "services.osmscout-server" pkgs lib.platforms.linux) ]; systemd.user.services.osmscout-server = { Unit = { Description = "OSM Scout Server"; }; Install = mkIf (!cfg.network.startWhenNeeded) { WantedBy = [ "default.target" ]; }; Service = { ExecStart = "'${cfg.package}/bin/osmscout-server' --systemd --quiet"; }; }; systemd.user.sockets.osmscout-server = mkIf cfg.network.startWhenNeeded { Unit = { Description = "OSM Scout Server Socket"; }; Socket = { ListenStream = "${cfg.network.listenAddress}:${toString cfg.network.port}"; TriggerLimitIntervalSec = "60s"; TriggerLimitBurst = 1; }; Install = { WantedBy = [ "sockets.target" ]; }; }; home.packages = [ cfg.package ]; }; }