From 50a34e55b20764fe0ff638a9c15312b5be9ceca1 Mon Sep 17 00:00:00 2001 From: Maximilian Bosch Date: Sat, 7 Apr 2018 15:06:51 +0200 Subject: [PATCH] nixos/iftop: add module This patch is heavily inspired by bd0d8ed807d29faa3deee96bafcbbd76c8fa4060 which added a setcap wrapper for `mtr` in order to allow running `mtr` without `sudo`. The need for the capability `cap_net_raw` that can be registered using `setcap` has been documented in the Arch Wiki: https://wiki.archlinux.org/index.php/Capabilities#iftop A simple testcase has been added which starts two machines, one with a setcap wrapper for `iftop`, one without. Both testcases monitor the bandwidth usage of the machine using the options `-t -s 1` once, the machine with setcap wrapper is expected to succeed, the `iftop` on the machine without setcap wrapper is expected to return a non-zero exit code. --- nixos/modules/module-list.nix | 1 + nixos/modules/programs/iftop.nix | 18 ++++++++++++++++++ nixos/release.nix | 1 + nixos/tests/iftop.nix | 30 ++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+) create mode 100644 nixos/modules/programs/iftop.nix create mode 100644 nixos/tests/iftop.nix diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 3a8b1014553c..46ec2022195f 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -86,6 +86,7 @@ ./programs/freetds.nix ./programs/gnupg.nix ./programs/gphoto2.nix + ./programs/iftop.nix ./programs/java.nix ./programs/kbdlight.nix ./programs/less.nix diff --git a/nixos/modules/programs/iftop.nix b/nixos/modules/programs/iftop.nix new file mode 100644 index 000000000000..a98a9a8187d4 --- /dev/null +++ b/nixos/modules/programs/iftop.nix @@ -0,0 +1,18 @@ +{ config, pkgs, lib, ... }: + +with lib; + +let + cfg = config.programs.iftop; +in { + options = { + programs.iftop.enable = mkEnableOption "iftop + setcap wrapper"; + }; + config = mkIf cfg.enable { + environment.systemPackages = [ pkgs.iftop ]; + security.wrappers.iftop = { + source = "${pkgs.iftop}/bin/iftop"; + capabilities = "cap_net_raw+p"; + }; + }; +} diff --git a/nixos/release.nix b/nixos/release.nix index c84853a142c1..4fd77e6471cf 100644 --- a/nixos/release.nix +++ b/nixos/release.nix @@ -295,6 +295,7 @@ in rec { tests.hound = callTest tests/hound.nix {}; tests.hocker-fetchdocker = callTest tests/hocker-fetchdocker {}; tests.i3wm = callTest tests/i3wm.nix {}; + tests.iftop = callTest tests/iftop.nix {}; tests.initrd-network-ssh = callTest tests/initrd-network-ssh {}; tests.installer = callSubTests tests/installer.nix {}; tests.influxdb = callTest tests/influxdb.nix {}; diff --git a/nixos/tests/iftop.nix b/nixos/tests/iftop.nix new file mode 100644 index 000000000000..21ff3cafed7c --- /dev/null +++ b/nixos/tests/iftop.nix @@ -0,0 +1,30 @@ +import ./make-test.nix ({ pkgs, lib, ... }: + +with lib; + +{ + name = "iftop"; + meta.maintainers = with pkgs.stdenv.lib.maintainers; [ ma27 ]; + + nodes = { + withIftop = { + imports = [ ./common/user-account.nix ]; + + programs.iftop.enable = true; + }; + withoutIftop = { + imports = [ ./common/user-account.nix ]; + }; + }; + + testScript = '' + subtest "machine with iftop enabled", sub { + $withIftop->start; + $withIftop->succeed("su -l alice -c 'iftop -t -s 1'"); + }; + subtest "machine without iftop", sub { + $withoutIftop->start; + $withoutIftop->mustFail("su -l alice -c 'iftop -t -s 1'"); + }; + ''; +})