nixos/librenms: add nixos test

authored by Jennifer Graul and committed by Yureka d4b59bcd e94820df

+120 -2
+1
nixos/tests/all-tests.nix
··· 433 433 lemmy = handleTest ./lemmy.nix {}; 434 434 libinput = handleTest ./libinput.nix {}; 435 435 libreddit = handleTest ./libreddit.nix {}; 436 + librenms = handleTest ./librenms.nix {}; 436 437 libresprite = handleTest ./libresprite.nix {}; 437 438 libreswan = handleTest ./libreswan.nix {}; 438 439 librewolf = handleTest ./firefox.nix { firefoxPackage = pkgs.librewolf; };
+108
nixos/tests/librenms.nix
··· 1 + import ./make-test-python.nix ({ pkgs, lib, ... }: 2 + 3 + let 4 + api_token = "f87f42114e44b63ad1b9e3c3d33d6fbe"; # random md5 hash 5 + wrong_api_token = "e68ba041fcf1eab923a7a6de3af5f726"; # another random md5 hash 6 + in { 7 + name = "librenms"; 8 + meta.maintainers = lib.teams.wdz.members; 9 + 10 + nodes.librenms = { 11 + time.timeZone = "Europe/Berlin"; 12 + 13 + environment.systemPackages = with pkgs; [ 14 + curl 15 + jq 16 + ]; 17 + 18 + services.librenms = { 19 + enable = true; 20 + hostname = "librenms"; 21 + database = { 22 + createLocally = true; 23 + host = "localhost"; 24 + database = "librenms"; 25 + username = "librenms"; 26 + passwordFile = pkgs.writeText "librenms-db-pass" "librenmsdbpass"; 27 + }; 28 + nginx = { 29 + default = true; 30 + }; 31 + enableOneMinutePolling = true; 32 + settings = { 33 + enable_billing = true; 34 + }; 35 + }; 36 + 37 + # systemd oneshot to create a dummy admin user and a API token for testing 38 + systemd.services.lnms-api-init = { 39 + description = "LibreNMS API init"; 40 + after = [ "librenms-setup.service" ]; 41 + wantedBy = [ "multi-user.target" ]; 42 + serviceConfig = { 43 + Type = "oneshot"; 44 + RemainAfterExit = true; 45 + User = "root"; 46 + Group = "root"; 47 + }; 48 + script = '' 49 + API_USER_NAME=api 50 + API_TOKEN=${api_token} # random md5 hash 51 + 52 + # we don't need to know the password, it just has to exist 53 + API_USER_PASS=$(${pkgs.pwgen}/bin/pwgen -s 64 1) 54 + ${pkgs.librenms}/artisan user:add $API_USER_NAME -r admin -p $API_USER_PASS 55 + API_USER_ID=$(${pkgs.mariadb}/bin/mysql -D librenms -N -B -e "SELECT user_id FROM users WHERE username = '$API_USER_NAME';") 56 + 57 + ${pkgs.mariadb}/bin/mysql -D librenms -e "INSERT INTO api_tokens (user_id, token_hash, description) VALUES ($API_USER_ID, '$API_TOKEN', 'API User')" 58 + ''; 59 + }; 60 + }; 61 + 62 + nodes.snmphost = { 63 + networking.firewall.allowedUDPPorts = [ 161 ]; 64 + 65 + systemd.services.snmpd = { 66 + description = "snmpd"; 67 + after = [ "network-online.target" ]; 68 + wants = [ "network-online.target" ]; 69 + wantedBy = [ "multi-user.target" ]; 70 + serviceConfig = { 71 + Type = "forking"; 72 + User = "root"; 73 + Group = "root"; 74 + ExecStart = let 75 + snmpd-config = pkgs.writeText "snmpd-config" '' 76 + com2sec readonly default public 77 + 78 + group MyROGroup v2c readonly 79 + view all included .1 80 80 + access MyROGroup "" any noauth exact all none none 81 + 82 + syslocation Testcity, Testcountry 83 + syscontact Testi mc Test <test@example.com> 84 + ''; 85 + in "${pkgs.net-snmp}/bin/snmpd -c ${snmpd-config} -C"; 86 + }; 87 + }; 88 + }; 89 + 90 + testScript = '' 91 + start_all() 92 + 93 + snmphost.wait_until_succeeds("pgrep snmpd") 94 + 95 + librenms.wait_for_unit("lnms-api-init.service") 96 + librenms.wait_for_open_port(80) 97 + 98 + # Test that we can authenticate against the API 99 + librenms.succeed("curl --fail -H 'X-Auth-Token: ${api_token}' http://localhost/api/v0") 100 + librenms.fail("curl --fail -H 'X-Auth-Token: ${wrong_api_token}' http://localhost/api/v0") 101 + 102 + # add snmphost as a device 103 + librenms.succeed("curl --fail -X POST -d '{\"hostname\":\"snmphost\",\"version\":\"v2c\",\"community\":\"public\"}' -H 'X-Auth-Token: ${api_token}' http://localhost/api/v0/devices") 104 + 105 + # wait until snmphost gets polled 106 + 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'") 107 + ''; 108 + })
+11 -2
pkgs/servers/monitoring/librenms/default.nix
··· 1 - { pkgs, stdenv, lib, fetchFromGitHub, unixtools, php82, python3, makeWrapper 1 + { lib 2 + , fetchFromGitHub 3 + , unixtools 4 + , php82 5 + , python3 6 + , makeWrapper 7 + , nixosTests 2 8 # run-time dependencies 3 9 , graphviz 4 10 , ipmitool ··· 95 101 runHook postInstall 96 102 ''; 97 103 98 - passthru = { phpPackage = phpPackage; }; 104 + passthru = { 105 + phpPackage = phpPackage; 106 + tests.librenms = nixosTests.librenms; 107 + }; 99 108 100 109 meta = with lib; { 101 110 description = "A auto-discovering PHP/MySQL/SNMP based network monitoring";