git.iko.soy/typeable/nixpkgs
on master help sign in
prometheus-openldap-exporter: init at 2.1
commit4794829734ec88d5ab7e70703968adaa0da78088 authorMaximilian Bosch <maximilian@mbosch.me> dateFri 2 Apr 2021, 12:24 (6 years ago) parent763933b
5 files changed+158
nixos/modules/services/monitoring/prometheus/exporters.nix+1 nixos/modules/services/monitoring/prometheus/exporters/openldap.nix+67 nixos/tests/prometheus-exporters.nix+60 pkgs/servers/monitoring/prometheus/openldap-exporter.nix+29 pkgs/top-level/all-packages.nix+1
nixos/modules/services/monitoring/prometheus/exporters.nix+1
@@ -43,6 +43,7 @@ let
4343 "nginx"
4444 "nginxlog"
4545 "node"
46+ "openldap"
4647 "openvpn"
4748 "postfix"
4849 "postgres"
nixos/modules/services/monitoring/prometheus/exporters/openldap.nixnew file+67
@@ -0,0 +1,67 @@
1+{ config, lib, pkgs, ... }:
2+
3+with lib;
4+
5+let
6+ cfg = config.services.prometheus.exporters.openldap;
7+in {
8+ port = 9330;
9+ extraOpts = {
10+ ldapCredentialFile = mkOption {
11+ type = types.path;
12+ example = "/run/keys/ldap_pass";
13+ description = ''
14+ Environment file to contain the credentials to authenticate against
15+ <package>openldap</package>.
16+
17+ The file should look like this:
18+ <programlisting>
19+ ---
20+ ldapUser: "cn=monitoring,cn=Monitor"
21+ ldapPass: "secret"
22+ </programlisting>
23+ '';
24+ };
25+ protocol = mkOption {
26+ default = "tcp";
27+ example = "udp";
28+ type = types.str;
29+ description = ''
30+ Which protocol to use to connect against <package>openldap</package>.
31+ '';
32+ };
33+ ldapAddr = mkOption {
34+ default = "localhost:389";
35+ type = types.str;
36+ description = ''
37+ Address of the <package>openldap</package>-instance.
38+ '';
39+ };
40+ metricsPath = mkOption {
41+ default = "/metrics";
42+ type = types.str;
43+ description = ''
44+ URL path where metrics should be exposed.
45+ '';
46+ };
47+ interval = mkOption {
48+ default = "30s";
49+ type = types.str;
50+ example = "1m";
51+ description = ''
52+ Scrape interval of the exporter.
53+ '';
54+ };
55+ };
56+ serviceOpts.serviceConfig = {
57+ ExecStart = ''
58+ ${pkgs.prometheus-openldap-exporter}/bin/openldap_exporter \
59+ --promAddr ${cfg.listenAddress}:${toString cfg.port} \
60+ --metrPath ${cfg.metricsPath} \
61+ --ldapNet ${cfg.protocol} \
62+ --interval ${cfg.interval} \
63+ --config ${cfg.ldapCredentialFile} \
64+ ${concatStringsSep " \\\n " cfg.extraFlags}
65+ '';
66+ };
67+}
nixos/tests/prometheus-exporters.nix+60
@@ -603,6 +603,66 @@ let
603603 '';
604604 };
605605
606+ openldap = {
607+ exporterConfig = {
608+ enable = true;
609+ ldapCredentialFile = "${pkgs.writeText "exporter.yml" ''
610+ ldapUser: "cn=root,dc=example"
611+ ldapPass: "notapassword"
612+ ''}";
613+ };
614+ metricProvider = {
615+ services.openldap = {
616+ enable = true;
617+ settings.children = {
618+ "cn=schema".includes = [
619+ "${pkgs.openldap}/etc/schema/core.ldif"
620+ "${pkgs.openldap}/etc/schema/cosine.ldif"
621+ "${pkgs.openldap}/etc/schema/inetorgperson.ldif"
622+ "${pkgs.openldap}/etc/schema/nis.ldif"
623+ ];
624+ "olcDatabase={1}mdb" = {
625+ attrs = {
626+ objectClass = [ "olcDatabaseConfig" "olcMdbConfig" ];
627+ olcDatabase = "{1}mdb";
628+ olcDbDirectory = "/var/db/openldap";
629+ olcSuffix = "dc=example";
630+ olcRootDN = {
631+ # cn=root,dc=example
632+ base64 = "Y249cm9vdCxkYz1leGFtcGxl";
633+ };
634+ olcRootPW = {
635+ path = "${pkgs.writeText "rootpw" "notapassword"}";
636+ };
637+ };
638+ };
639+ "olcDatabase={2}monitor".attrs = {
640+ objectClass = [ "olcDatabaseConfig" ];
641+ olcDatabase = "{2}monitor";
642+ olcAccess = [ "to dn.subtree=cn=monitor by users read" ];
643+ };
644+ };
645+ declarativeContents."dc=example" = ''
646+ dn: dc=example
647+ objectClass: domain
648+ dc: example
649+
650+ dn: ou=users,dc=example
651+ objectClass: organizationalUnit
652+ ou: users
653+ '';
654+ };
655+ };
656+ exporterTest = ''
657+ wait_for_unit("prometheus-openldap-exporter.service")
658+ wait_for_open_port(389)
659+ wait_for_open_port(9330)
660+ wait_until_succeeds(
661+ "curl -sSf http://localhost:9330/metrics | grep -q 'openldap_scrape{result=\"ok\"} 1'"
662+ )
663+ '';
664+ };
665+
606666 openvpn = {
607667 exporterConfig = {
608668 enable = true;
pkgs/servers/monitoring/prometheus/openldap-exporter.nixnew file+29
@@ -0,0 +1,29 @@
1+{ buildGoPackage, lib, fetchFromGitHub }:
2+
3+buildGoPackage rec {
4+ pname = "openldap_exporter";
5+ version = "2.1";
6+
7+ src = fetchFromGitHub {
8+ owner = "tomcz";
9+ repo = pname;
10+ rev = "v${version}";
11+ sha256 = "sha256-Di1GiyVp/hGCFhqxhlqJSucGZK7f/FDDUFtJRaiAZu4=";
12+ };
13+
14+ buildFlagsArray = ''
15+ -ldflags=
16+ -s -w
17+ -X github.com/tomcz/openldap_exporter.tag=v${version}
18+ -X github.com/tomcz/openldap_exporter.commit=unknown
19+ '';
20+
21+ goPackagePath = "github.com/tomcz/openldap_exporter";
22+
23+ meta = with lib; {
24+ homepage = "https://github.com/tomcz/openldap_exporter";
25+ description = " Simple service that scrapes metrics from OpenLDAP and exports them via HTTP for Prometheus consumption";
26+ license = licenses.mit;
27+ maintainers = with maintainers; [ ma27 ];
28+ };
29+}
pkgs/top-level/all-packages.nix+1
@@ -18850,6 +18850,7 @@ in
1885018850 prometheus-nginx-exporter = callPackage ../servers/monitoring/prometheus/nginx-exporter.nix { };
1885118851 prometheus-nginxlog-exporter = callPackage ../servers/monitoring/prometheus/nginxlog-exporter.nix { };
1885218852 prometheus-node-exporter = callPackage ../servers/monitoring/prometheus/node-exporter.nix { };
18853+ prometheus-openldap-exporter = callPackage ../servers/monitoring/prometheus/openldap-exporter.nix { };
1885318854 prometheus-openvpn-exporter = callPackage ../servers/monitoring/prometheus/openvpn-exporter.nix { };
1885418855 prometheus-postfix-exporter = callPackage ../servers/monitoring/prometheus/postfix-exporter.nix { };
1885518856 prometheus-postgres-exporter = callPackage ../servers/monitoring/prometheus/postgres-exporter.nix { };