Commit d4b59bcd authored by Jennifer Graul's avatar Jennifer Graul Committed by Yureka
Browse files

nixos/librenms: add nixos test

parent e94820df
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -433,6 +433,7 @@ in {
  lemmy = handleTest ./lemmy.nix {};
  libinput = handleTest ./libinput.nix {};
  libreddit = handleTest ./libreddit.nix {};
  librenms = handleTest ./librenms.nix {};
  libresprite = handleTest ./libresprite.nix {};
  libreswan = handleTest ./libreswan.nix {};
  librewolf = handleTest ./firefox.nix { firefoxPackage = pkgs.librewolf; };
+108 −0
Original line number Diff line number Diff line
import ./make-test-python.nix ({ pkgs, lib, ... }:

let
  api_token = "f87f42114e44b63ad1b9e3c3d33d6fbe"; # random md5 hash
  wrong_api_token = "e68ba041fcf1eab923a7a6de3af5f726"; # another random md5 hash
in {
  name = "librenms";
  meta.maintainers = lib.teams.wdz.members;

  nodes.librenms = {
    time.timeZone = "Europe/Berlin";

    environment.systemPackages = with pkgs; [
      curl
      jq
    ];

    services.librenms = {
      enable = true;
      hostname = "librenms";
      database = {
        createLocally = true;
        host = "localhost";
        database = "librenms";
        username = "librenms";
        passwordFile = pkgs.writeText "librenms-db-pass" "librenmsdbpass";
      };
      nginx = {
        default = true;
      };
      enableOneMinutePolling = true;
      settings = {
        enable_billing = true;
      };
    };

    # systemd oneshot to create a dummy admin user and a API token for testing
    systemd.services.lnms-api-init = {
      description = "LibreNMS API init";
      after = [ "librenms-setup.service" ];
      wantedBy = [ "multi-user.target" ];
      serviceConfig = {
        Type = "oneshot";
        RemainAfterExit = true;
        User = "root";
        Group = "root";
      };
      script = ''
        API_USER_NAME=api
        API_TOKEN=${api_token} # random md5 hash

        # we don't need to know the password, it just has to exist
        API_USER_PASS=$(${pkgs.pwgen}/bin/pwgen -s 64 1)
        ${pkgs.librenms}/artisan user:add $API_USER_NAME -r admin -p $API_USER_PASS
        API_USER_ID=$(${pkgs.mariadb}/bin/mysql -D librenms -N -B -e "SELECT user_id FROM users WHERE username = '$API_USER_NAME';")

        ${pkgs.mariadb}/bin/mysql -D librenms -e "INSERT INTO api_tokens (user_id, token_hash, description) VALUES ($API_USER_ID, '$API_TOKEN', 'API User')"
      '';
    };
  };

  nodes.snmphost = {
    networking.firewall.allowedUDPPorts = [ 161 ];

    systemd.services.snmpd = {
      description = "snmpd";
      after = [ "network-online.target" ];
      wants = [ "network-online.target" ];
      wantedBy = [ "multi-user.target" ];
      serviceConfig = {
        Type = "forking";
        User = "root";
        Group = "root";
        ExecStart = let
          snmpd-config = pkgs.writeText "snmpd-config" ''
            com2sec readonly default public

            group MyROGroup v2c        readonly
            view all    included  .1                               80
            access MyROGroup ""      any       noauth    exact  all    none   none

            syslocation Testcity, Testcountry
            syscontact Testi mc Test <test@example.com>
          '';
        in "${pkgs.net-snmp}/bin/snmpd -c ${snmpd-config} -C";
      };
    };
  };

  testScript = ''
    start_all()

    snmphost.wait_until_succeeds("pgrep snmpd")

    librenms.wait_for_unit("lnms-api-init.service")
    librenms.wait_for_open_port(80)

    # Test that we can authenticate against the API
    librenms.succeed("curl --fail -H 'X-Auth-Token: ${api_token}' http://localhost/api/v0")
    librenms.fail("curl --fail -H 'X-Auth-Token: ${wrong_api_token}' http://localhost/api/v0")

    # add snmphost as a device
    librenms.succeed("curl --fail -X POST -d '{\"hostname\":\"snmphost\",\"version\":\"v2c\",\"community\":\"public\"}' -H 'X-Auth-Token: ${api_token}' http://localhost/api/v0/devices")

    # wait until snmphost gets polled
    librenms.wait_until_succeeds("test $(curl -H 'X-Auth-Token: ${api_token}' http://localhost/api/v0/devices/snmphost | jq -Mr .devices[0].last_polled) != 'null'")
  '';
})
+11 −2
Original line number Diff line number Diff line
{ pkgs, stdenv, lib, fetchFromGitHub, unixtools, php82, python3, makeWrapper
{ lib
, fetchFromGitHub
, unixtools
, php82
, python3
, makeWrapper
, nixosTests
# run-time dependencies
, graphviz
, ipmitool
@@ -95,7 +101,10 @@ in phpPackage.buildComposerProject rec {
    runHook postInstall
  '';

  passthru = { phpPackage = phpPackage; };
  passthru = {
    phpPackage = phpPackage;
    tests.librenms = nixosTests.librenms;
  };

  meta = with lib; {
    description = "A auto-discovering PHP/MySQL/SNMP based network monitoring";