summaryrefslogtreecommitdiffstats
path: root/nixos/modules/services/development
diff options
context:
space:
mode:
authorGuillaume Girol <symphorien@users.noreply.github.com>2024-01-07 17:45:13 +0100
committerGitHub <noreply@github.com>2024-01-07 17:45:13 +0100
commitdb0f76e8c96b94b8ab5d170b4098fe4f83408680 (patch)
treebfaad711fcbca80737e3a9f079bdbd49dae514f5 /nixos/modules/services/development
parent883d136078544fe53cab7410b557ba4f78c2df5d (diff)
parentdece72548ee0fee77eda54f3a8a958c86f460191 (diff)
Merge pull request #271030 from symphorien/nixseparatedebuginfod
nixseparatedebuginfod: init at 0.3.0, plus module and nixos test
Diffstat (limited to 'nixos/modules/services/development')
-rw-r--r--nixos/modules/services/development/nixseparatedebuginfod.nix105
1 files changed, 105 insertions, 0 deletions
diff --git a/nixos/modules/services/development/nixseparatedebuginfod.nix b/nixos/modules/services/development/nixseparatedebuginfod.nix
new file mode 100644
index 000000000000..daf85153d339
--- /dev/null
+++ b/nixos/modules/services/development/nixseparatedebuginfod.nix
@@ -0,0 +1,105 @@
+{ pkgs, lib, config, ... }:
+let
+ cfg = config.services.nixseparatedebuginfod;
+ url = "127.0.0.1:${toString cfg.port}";
+in
+{
+ options = {
+ services.nixseparatedebuginfod = {
+ enable = lib.mkEnableOption "separatedebuginfod, a debuginfod server providing source and debuginfo for nix packages";
+ port = lib.mkOption {
+ description = "port to listen";
+ default = 1949;
+ type = lib.types.port;
+ };
+ nixPackage = lib.mkOption {
+ type = lib.types.package;
+ default = pkgs.nix;
+ defaultText = lib.literalExpression "pkgs.nix";
+ description = ''
+ The version of nix that nixseparatedebuginfod should use as client for the nix daemon. It is strongly advised to use nix version >= 2.18, otherwise some debug info may go missing.
+ '';
+ };
+ allowOldNix = lib.mkOption {
+ type = lib.types.bool;
+ default = false;
+ description = ''
+ Do not fail evaluation when {option}`services.nixseparatedebuginfod.nixPackage` is older than nix 2.18.
+ '';
+ };
+ };
+ };
+ config = lib.mkIf cfg.enable {
+ assertions = [ {
+ assertion = cfg.allowOldNix || (lib.versionAtLeast cfg.nixPackage.version "2.18");
+ message = "nixseparatedebuginfod works better when `services.nixseparatedebuginfod.nixPackage` is set to nix >= 2.18 (instead of ${cfg.nixPackage.name}). Set `services.nixseparatedebuginfod.allowOldNix` to bypass.";
+ } ];
+
+ systemd.services.nixseparatedebuginfod = {
+ wantedBy = [ "multi-user.target" ];
+ wants = [ "nix-daemon.service" ];
+ after = [ "nix-daemon.service" ];
+ path = [ cfg.nixPackage ];
+ serviceConfig = {
+ ExecStart = [ "${pkgs.nixseparatedebuginfod}/bin/nixseparatedebuginfod -l ${url}" ];
+ Restart = "on-failure";
+ CacheDirectory = "nixseparatedebuginfod";
+ # nix does not like DynamicUsers in allowed-users
+ User = "nixseparatedebuginfod";
+ Group = "nixseparatedebuginfod";
+
+ # hardening
+ # Filesystem stuff
+ ProtectSystem = "strict"; # Prevent writing to most of /
+ ProtectHome = true; # Prevent accessing /home and /root
+ PrivateTmp = true; # Give an own directory under /tmp
+ PrivateDevices = true; # Deny access to most of /dev
+ ProtectKernelTunables = true; # Protect some parts of /sys
+ ProtectControlGroups = true; # Remount cgroups read-only
+ RestrictSUIDSGID = true; # Prevent creating SETUID/SETGID files
+ PrivateMounts = true; # Give an own mount namespace
+ RemoveIPC = true;
+ UMask = "0077";
+
+ # Capabilities
+ CapabilityBoundingSet = ""; # Allow no capabilities at all
+ NoNewPrivileges = true; # Disallow getting more capabilities. This is also implied by other options.
+
+ # Kernel stuff
+ ProtectKernelModules = true; # Prevent loading of kernel modules
+ SystemCallArchitectures = "native"; # Usually no need to disable this
+ ProtectKernelLogs = true; # Prevent access to kernel logs
+ ProtectClock = true; # Prevent setting the RTC
+
+ # Networking
+ RestrictAddressFamilies = "AF_UNIX AF_INET AF_INET6";
+
+ # Misc
+ LockPersonality = true; # Prevent change of the personality
+ ProtectHostname = true; # Give an own UTS namespace
+ RestrictRealtime = true; # Prevent switching to RT scheduling
+ MemoryDenyWriteExecute = true; # Maybe disable this for interpreters like python
+ RestrictNamespaces = true;
+ };
+ };
+
+ users.users.nixseparatedebuginfod = {
+ isSystemUser = true;
+ group = "nixseparatedebuginfod";
+ };
+
+ users.groups.nixseparatedebuginfod = { };
+
+ nix.settings.extra-allowed-users = [ "nixseparatedebuginfod" ];
+
+ environment.variables.DEBUGINFOD_URLS = "http://${url}";
+
+ environment.systemPackages = [
+ # valgrind support requires debuginfod-find on PATH
+ (lib.getBin pkgs.elfutils)
+ ];
+
+ environment.etc."gdb/gdbinit.d/nixseparatedebuginfod.gdb".text = "set debuginfod enabled on";
+
+ };
+}