nixos-piaware/feeder.nix
2023-12-13 23:32:42 -06:00

162 lines
4.9 KiB
Nix

{ 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" ];
};
};
}