117 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{ config, lib, pkgs, ... }:
 | 
						|
 | 
						|
with lib;
 | 
						|
 | 
						|
let
 | 
						|
 | 
						|
  cfg = config.services.ntopng;
 | 
						|
  redisCfg = config.services.redis;
 | 
						|
 | 
						|
  configFile = if cfg.configText != "" then
 | 
						|
    pkgs.writeText "ntopng.conf" ''
 | 
						|
      ${cfg.configText}
 | 
						|
    ''
 | 
						|
    else
 | 
						|
    pkgs.writeText "ntopng.conf" ''
 | 
						|
      ${concatStringsSep " " (map (e: "--interface=" + e) cfg.interfaces)}
 | 
						|
      --http-port=${toString cfg.http-port}
 | 
						|
      --redis=localhost:${toString redisCfg.port}
 | 
						|
      ${cfg.extraConfig}
 | 
						|
    '';
 | 
						|
 | 
						|
in
 | 
						|
 | 
						|
{
 | 
						|
 | 
						|
  options = {
 | 
						|
 | 
						|
    services.ntopng = {
 | 
						|
 | 
						|
      enable = mkOption {
 | 
						|
        default = false;
 | 
						|
        type = types.bool;
 | 
						|
        description = ''
 | 
						|
          Enable ntopng, a high-speed web-based traffic analysis and flow
 | 
						|
          collection tool.
 | 
						|
 | 
						|
          With the default configuration, ntopng monitors all network
 | 
						|
          interfaces and displays its findings at http://localhost:${toString
 | 
						|
          cfg.http-port}. Default username and password is admin/admin.
 | 
						|
 | 
						|
          See the ntopng(8) manual page and http://www.ntop.org/products/ntop/
 | 
						|
          for more info.
 | 
						|
 | 
						|
          Note that enabling ntopng will also enable redis (key-value
 | 
						|
          database server) for persistent data storage.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      interfaces = mkOption {
 | 
						|
        default = [ "any" ];
 | 
						|
        example = [ "eth0" "wlan0" ];
 | 
						|
        type = types.listOf types.str;
 | 
						|
        description = ''
 | 
						|
          List of interfaces to monitor. Use "any" to monitor all interfaces.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      http-port = mkOption {
 | 
						|
        default = 3000;
 | 
						|
        type = types.int;
 | 
						|
        description = ''
 | 
						|
          Sets the HTTP port of the embedded web server.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      configText = mkOption {
 | 
						|
        default = "";
 | 
						|
        example = ''
 | 
						|
          --interface=any
 | 
						|
          --http-port=3000
 | 
						|
          --disable-login
 | 
						|
        '';
 | 
						|
        type = types.lines;
 | 
						|
        description = ''
 | 
						|
          Overridable configuration file contents to use for ntopng. By
 | 
						|
          default, use the contents automatically generated by NixOS.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      extraConfig = mkOption {
 | 
						|
        default = "";
 | 
						|
        type = types.lines;
 | 
						|
        description = ''
 | 
						|
          Configuration lines that will be appended to the generated ntopng
 | 
						|
          configuration file. Note that this mechanism does not work when the
 | 
						|
          manual <option>configText</option> option is used.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
    };
 | 
						|
 | 
						|
  };
 | 
						|
 | 
						|
  config = mkIf cfg.enable {
 | 
						|
 | 
						|
    # ntopng uses redis for data storage
 | 
						|
    services.redis.enable = true;
 | 
						|
 | 
						|
    # nice to have manual page and ntopng command in PATH
 | 
						|
    environment.systemPackages = [ pkgs.ntopng ];
 | 
						|
 | 
						|
    systemd.services.ntopng = {
 | 
						|
      description = "Ntopng Network Monitor";
 | 
						|
      requires = [ "redis.service" ];
 | 
						|
      after = [ "network.target" "redis.service" ];
 | 
						|
      wantedBy = [ "multi-user.target" ];
 | 
						|
      preStart = "mkdir -p /var/lib/ntopng/";
 | 
						|
      serviceConfig.ExecStart = "${pkgs.ntopng}/bin/ntopng ${configFile}";
 | 
						|
      unitConfig.Documentation = "man:ntopng(8)";
 | 
						|
    };
 | 
						|
 | 
						|
    # ntopng drops priveleges to user "nobody" and that user is already defined
 | 
						|
    # in users-groups.nix.
 | 
						|
  };
 | 
						|
 | 
						|
}
 |