{ hostRegistry, config, lib, pkgs, modulesPath, ... }: let # soapysdr = with pkgs; soapysdr.override { # extraPackages = [ # soapyhackrf # ]; # }; soapysdr = pkgs.soapysdr-with-plugins; in { boot.initrd.availableKernelModules = [ "usbhid" ]; boot.initrd.kernelModules = [ ]; boot.kernelModules = [ ]; boot.extraModulePackages = [ ]; boot.blacklistedKernelModules = [ # no watching TV intended "dvb_usb_rtl28xxu" ]; fileSystems."/" = { device = "/dev/disk/by-label/NIXOS_SD"; fsType = "ext4"; }; fileSystems."/boot/firmware" = { device = "/dev/disk/by-label/FIRMWARE"; fsType = "vfat"; }; swapDevices = [ ]; hardware.enableRedistributableFirmware = true; #networking.wireless.enable = true; hardware.deviceTree.enable = false; powerManagement.cpuFreqGovernor = lib.mkDefault "performance"; boot = { loader = { grub.enable = false; generic-extlinux-compatible.enable = lib.mkDefault true; raspberryPi = { enable = true; version = 4; uboot.enable = true; firmwareConfig = '' gpu_mem=192 dtparam=audio=on ''; }; }; kernelPackages = pkgs.linuxPackages_latest; # Don't build ZFS for aarch64 (broken?) supportedFilesystems = lib.mkForce [ "vfat" "ext4" ]; tmpOnTmpfs = true; }; sdImage = { compressImage = false; imageBaseName = config.networking.hostName; firmwareSize = 512; }; c3d2 = { isInHq = false; hq.statistics.enable = true; pi-sensors = [ { type = "dht22"; pin = 17; location = "Schrank"; } { type = "dht22"; pin = 23; location = "Aussen"; } ]; }; nix = { buildCores = 4; maxJobs = 2; }; networking = { hostName = "radiobert"; # Define your hostname. useDHCP = false; interfaces.eth0.ipv4.addresses = [{ address = hostRegistry.hosts.${config.networking.hostName}.ip4; prefixLength = 26; }]; defaultGateway = "172.20.73.1"; firewall.enable = false; nameservers = [ "172.20.73.8" "9.9.9.9" ]; }; users.users.soapysdr = { isSystemUser = true; group = "soapysdr"; }; users.groups.soapysdr = {}; systemd.services.soapysdr-server = { wantedBy = [ "multi-user.target" ]; serviceConfig = { ExecStart = "${soapysdr}/bin/SoapySDRServer --bind"; User = "soapysdr"; Group = "soapysdr"; ProtectSystem = "full"; ProtectHome = true; }; }; users.users.dump1090 = { isSystemUser = true; group = "dump10190"; }; users.groups.dump1090 = {}; systemd.tmpfiles.rules = [ "d /tmp/dump1090 0755 dump1090 dump1090 -" ]; systemd.services.dump1090 = { wantedBy = [ "multi-user.target" ]; serviceConfig = { ExecStart = "${pkgs.dump1090_sdrplus}/bin/dump1090 --aggressive --net"; User = "dump1090"; Group = "dump1090"; ProtectSystem = "full"; ProtectHome = true; WorkingDirectory = "/tmp/dump1090"; WritablePaths = "/tmp/dump1090"; }; }; # TODO: `services.collectd.plugins.exec` is already defined by pi-sensors # (https://github.com/NixOS/nixpkgs/pull/141551) services.collectd.extraConfig = let distanceRb = pkgs.fetchurl { url = "https://github.com/djberg96/gis-distance/raw/main/lib/gis/distance.rb"; sha256 = "1m9zzikcl5pzad66r8vnlj2p2hbbcqb8vdcf34nrhyd4mg1wkgkh"; }; libDir = pkgs.runCommandNoCC "libdir" {} '' mkdir $out cp ${distanceRb} $out/distance.rb ''; in '' Exec "${config.services.collectd.user}" "${pkgs.ruby}/bin/ruby" "-I${libDir}" "${./collectd-adsb.rb}" ''; environment.systemPackages = with pkgs; [ libraspberrypi raspberrypi-eeprom vim wget dump1090_sdrplus soapysdr-with-plugins hackrf ]; programs.tmux.enable = true; # Do not log to flash: services.journald.extraConfig = '' Storage=volatile ''; # Enable the OpenSSH daemon. services.openssh = { enable = true; }; # Allow access to USB services.udev.extraRules = '' SUBSYSTEM=="usb", MODE:="0666" ''; # This value determines the NixOS release from which the default # settings for stateful data, like file locations and database versions # on your system were taken. It‘s perfectly fine and recommended to leave # this value at the release version of the first install of this system. # Before changing this value read the documentation for this option # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). system.stateVersion = "21.05"; # Did you read the comment? }