{ mainConfig, feederConfig, pkgs, self, lib }: { config = { users.groups.${feederConfig.name} = { }; users.users.${feederConfig.name} = { isSystemUser = true; group = "${feederConfig.name}"; }; systemd.services."${feederConfig.name}-mlat" = let uuidFile = pkgs.writeTextFile { name = "${feederConfig.name}-uuid"; text = "${feederConfig.uuid}"; }; options = [ "--input-type" feederConfig.mlat.input.type "--no-udp" "--input-connect" "${feederConfig.mlat.input.host}:${toString feederConfig.mlat.input.port}" "--server" feederConfig.mlat.server "--user" feederConfig.username "--lat" mainConfig.latitude "--lon" mainConfig.longitude "--alt" (toString mainConfig.altitude) "--uuid-file" "${uuidFile}" ] ++ ( if feederConfig.mlat.privacy then [ "--privacy" ] else [ ] ) ++ ( map (result: "--result ${result}") feederConfig.mlat.results ); in { enable = feederConfig.mlat.enable; description = "${feederConfig.name} MLAT client."; wants = [ "network.target" ]; after = [ "network.target" ]; unitConfig = { Documentation = "https://github.com/makrsmark/mlat-client/"; }; serviceConfig = { Type = "simple"; User = "${feederConfig.name}"; RuntimeDirectory = "${feederConfig.name}-mlat"; RuntimeDirectoryMode = "0755"; ExecStart = "${self.packages.${pkgs.system}.adsbfi-mlat-client}/bin/mlat-client ${lib.concatStringsSep " " options}"; SyslogIdentifier = "${feederConfig.name}-mlat"; Restart = "on-failure"; RestartSec = 30; Nice = -1; }; wantedBy = [ "multi-user.target" ]; }; systemd.services."${feederConfig.name}-feed" = let uuidFile = pkgs.writeTextFile { name = "${feederConfig.name}-uuid"; text = "${feederConfig.uuid}"; }; connectors = map ( connector: "--net-connector ${connector}" ) ( map ( connector: ( lib.concatStringsSep "," ( [ connector.primary.host (toString connector.primary.port) connector.protocol ] ++ ( if connector.silentFail then [ "silent_fail" ] else [ ] ) ++ ( if connector.secondary != null then [ connector.secondary.host (toString connector.secondary.port) ] else [ ] ) ) ) ) feederConfig.feed.connectors ); options = [ "--quiet" "--net" "--net-only" "--write-json" "%t/${feederConfig.name}-feed" "--net-beast-reduce-interval 0.5" "--net-heartbeat 60" "--net-ro-size 1280" "--net-ro-interval 0.2" "--net-ro-port 0" "--net-sbs-port 0" "--net-bi-port ${toString feederConfig.feed.beastInputPort}" "--net-bo-port 0" "--net-ri-port 0" "--write-json-every 1" "--lat" mainConfig.latitude "--lon" mainConfig.longitude "--max-range 450" "--json-location-accuracy 2" "--range-outline-hours 24" "--uuid-file" "${uuidFile}" ] ++ connectors; in { enable = feederConfig.feed.enable; description = "${feederConfig.name} feeder."; wants = [ "network.target" ]; after = [ "network.target" ]; unitConfig = { Documentation = "https://github.com/widehopf/readsb/"; StartLimitIntervalSec = 1; }; serviceConfig = { Type = "simple"; User = "${feederConfig.name}"; RuntimeDirectory = "${feederConfig.name}-feed"; RuntimeDirectoryMode = "0755"; ExecStart = "${self.packages.${pkgs.system}.adsbfi-readsb}/bin/readsb ${lib.concatStringsSep " " options}"; SyslogIdentifier = "${feederConfig.name}-feed"; Restart = "on-failure"; RestartSec = 30; StartLimitBurst = 100; Nice = -1; }; wantedBy = [ "multi-user.target" ]; }; }; }