243 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			243 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { config, lib, pkgs, ... }:
 | |
| 
 | |
| with lib;
 | |
| 
 | |
| let
 | |
|   cfg = config.services.unifi-poller;
 | |
| 
 | |
|   configFile = pkgs.writeText "unifi-poller.json" (generators.toJSON {} {
 | |
|     inherit (cfg) poller influxdb prometheus unifi;
 | |
|   });
 | |
| 
 | |
| in {
 | |
|   options.services.unifi-poller = {
 | |
|     enable = mkEnableOption "unifi-poller";
 | |
| 
 | |
|     poller = {
 | |
|       debug = mkOption {
 | |
|         type = types.bool;
 | |
|         default = false;
 | |
|         description = ''
 | |
|           Turns on line numbers, microsecond logging, and a per-device log.
 | |
|           This may be noisy if you have a lot of devices. It adds one line per device.
 | |
|         '';
 | |
|       };
 | |
|       quiet = mkOption {
 | |
|         type = types.bool;
 | |
|         default = false;
 | |
|         description = ''
 | |
|           Turns off per-interval logs. Only startup and error logs will be emitted.
 | |
|         '';
 | |
|       };
 | |
|       plugins = mkOption {
 | |
|         type = with types; listOf str;
 | |
|         default = [];
 | |
|         description = ''
 | |
|           Load additional plugins.
 | |
|         '';
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     prometheus = {
 | |
|       disable = mkOption {
 | |
|         type = types.bool;
 | |
|         default = false;
 | |
|         description = ''
 | |
|           Whether to disable the prometheus ouput plugin.
 | |
|         '';
 | |
|       };
 | |
|       http_listen = mkOption {
 | |
|         type = types.str;
 | |
|         default = "[::]:9130";
 | |
|         description = ''
 | |
|           Bind the prometheus exporter to this IP or hostname.
 | |
|         '';
 | |
|       };
 | |
|       report_errors = mkOption {
 | |
|         type = types.bool;
 | |
|         default = false;
 | |
|         description = ''
 | |
|           Whether to report errors.
 | |
|         '';
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     influxdb = {
 | |
|       disable = mkOption {
 | |
|         type = types.bool;
 | |
|         default = false;
 | |
|         description = ''
 | |
|           Whether to disable the influxdb ouput plugin.
 | |
|         '';
 | |
|       };
 | |
|       url = mkOption {
 | |
|         type = types.str;
 | |
|         default = "http://127.0.0.1:8086";
 | |
|         description = ''
 | |
|           URL of the influxdb host.
 | |
|         '';
 | |
|       };
 | |
|       user = mkOption {
 | |
|         type = types.str;
 | |
|         default = "unifipoller";
 | |
|         description = ''
 | |
|           Username for the influxdb.
 | |
|         '';
 | |
|       };
 | |
|       pass = mkOption {
 | |
|         type = types.path;
 | |
|         default = pkgs.writeText "unifi-poller-influxdb-default.password" "unifipoller";
 | |
|         defaultText = "unifi-poller-influxdb-default.password";
 | |
|         description = ''
 | |
|           Path of a file containing the password for influxdb.
 | |
|           This file needs to be readable by the unifi-poller user.
 | |
|         '';
 | |
|         apply = v: "file://${v}";
 | |
|       };
 | |
|       db = mkOption {
 | |
|         type = types.str;
 | |
|         default = "unifi";
 | |
|         description = ''
 | |
|           Database name. Database should exist.
 | |
|         '';
 | |
|       };
 | |
|       verify_ssl = mkOption {
 | |
|         type = types.bool;
 | |
|         default = true;
 | |
|         description = ''
 | |
|           Verify the influxdb's certificate.
 | |
|         '';
 | |
|       };
 | |
|       interval = mkOption {
 | |
|         type = types.str;
 | |
|         default = "30s";
 | |
|         description = ''
 | |
|           Setting this lower than the Unifi controller's refresh
 | |
|           interval may lead to zeroes in your database.
 | |
|         '';
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     unifi = let
 | |
|       controllerOptions = {
 | |
|         user = mkOption {
 | |
|           type = types.str;
 | |
|           default = "unifi";
 | |
|           description = ''
 | |
|             Unifi service user name.
 | |
|           '';
 | |
|         };
 | |
|         pass = mkOption {
 | |
|           type = types.path;
 | |
|           default = pkgs.writeText "unifi-poller-unifi-default.password" "unifi";
 | |
|           defaultText = "unifi-poller-unifi-default.password";
 | |
|           description = ''
 | |
|             Path of a file containing the password for the unifi service user.
 | |
|             This file needs to be readable by the unifi-poller user.
 | |
|           '';
 | |
|           apply = v: "file://${v}";
 | |
|         };
 | |
|         url = mkOption {
 | |
|           type = types.str;
 | |
|           default = "https://unifi:8443";
 | |
|           description = ''
 | |
|             URL of the Unifi controller.
 | |
|           '';
 | |
|         };
 | |
|         sites = mkOption {
 | |
|           type = with types; either (enum [ "default" "all" ]) (listOf str);
 | |
|           default = "all";
 | |
|           description = ''
 | |
|             List of site names for which statistics should be exported.
 | |
|             Or the string "default" for the default site or the string "all" for all sites.
 | |
|           '';
 | |
|           apply = toList;
 | |
|         };
 | |
|         save_ids = mkOption {
 | |
|           type = types.bool;
 | |
|           default = false;
 | |
|           description = ''
 | |
|             Collect and save data from the intrusion detection system to influxdb.
 | |
|           '';
 | |
|         };
 | |
|         save_dpi = mkOption {
 | |
|           type = types.bool;
 | |
|           default = false;
 | |
|           description = ''
 | |
|             Collect and save data from deep packet inspection.
 | |
|             Adds around 150 data points and impacts performance.
 | |
|           '';
 | |
|         };
 | |
|         save_sites = mkOption {
 | |
|           type = types.bool;
 | |
|           default = true;
 | |
|           description = ''
 | |
|             Collect and save site data.
 | |
|           '';
 | |
|         };
 | |
|         hash_pii = mkOption {
 | |
|           type = types.bool;
 | |
|           default = false;
 | |
|           description = ''
 | |
|             Hash, with md5, client names and MAC addresses. This attempts
 | |
|             to protect personally identifiable information.
 | |
|           '';
 | |
|         };
 | |
|         verify_ssl = mkOption {
 | |
|           type = types.bool;
 | |
|           default = true;
 | |
|           description = ''
 | |
|             Verify the Unifi controller's certificate.
 | |
|           '';
 | |
|         };
 | |
|       };
 | |
| 
 | |
|     in {
 | |
|       dynamic = mkOption {
 | |
|         type = types.bool;
 | |
|         default = false;
 | |
|         description = ''
 | |
|           Let prometheus select which controller to poll when scraping.
 | |
|           Use with default credentials. See unifi-poller wiki for more.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       defaults = controllerOptions;
 | |
| 
 | |
|       controllers = mkOption {
 | |
|         type = with types; listOf (submodule { options = controllerOptions; });
 | |
|         default = [];
 | |
|         description = ''
 | |
|           List of Unifi controllers to poll. Use defaults if empty.
 | |
|         '';
 | |
|         apply = map (flip removeAttrs [ "_module" ]);
 | |
|       };
 | |
|     };
 | |
|   };
 | |
| 
 | |
|   config = mkIf cfg.enable {
 | |
|     users.groups.unifi-poller = { };
 | |
|     users.users.unifi-poller = {
 | |
|       description = "unifi-poller Service User";
 | |
|       group = "unifi-poller";
 | |
|       isSystemUser = true;
 | |
|     };
 | |
| 
 | |
|     systemd.services.unifi-poller = {
 | |
|       wantedBy = [ "multi-user.target" ];
 | |
|       after = [ "network.target" ];
 | |
|       serviceConfig = {
 | |
|         ExecStart = "${pkgs.unifi-poller}/bin/unifi-poller --config ${configFile}";
 | |
|         Restart = "always";
 | |
|         PrivateTmp = true;
 | |
|         ProtectHome = true;
 | |
|         ProtectSystem = "full";
 | |
|         DevicePolicy = "closed";
 | |
|         NoNewPrivileges = true;
 | |
|         User = "unifi-poller";
 | |
|         WorkingDirectory = "/tmp";
 | |
|       };
 | |
|     };
 | |
|   };
 | |
| }
 | 
