 1fa1bcbab0
			
		
	
	
		1fa1bcbab0
		
			
		
	
	
	
	
		
			
			This was overlooked on a rebase of mine on master, when I didn't realize that in the time of me writing the znc changes this new option got introduced.
		
			
				
	
	
		
			271 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			271 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { lib, config, ... }:
 | |
| 
 | |
| with lib;
 | |
| 
 | |
| let
 | |
| 
 | |
|   cfg = config.services.znc;
 | |
| 
 | |
|   networkOpts = {
 | |
|     options = {
 | |
| 
 | |
|       server = mkOption {
 | |
|         type = types.str;
 | |
|         example = "chat.freenode.net";
 | |
|         description = ''
 | |
|           IRC server address.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       port = mkOption {
 | |
|         type = types.ints.u16;
 | |
|         default = 6697;
 | |
|         description = ''
 | |
|           IRC server port.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       password = mkOption {
 | |
|         type = types.str;
 | |
|         default = "";
 | |
|         description = ''
 | |
|           IRC server password, such as for a Slack gateway.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       useSSL = mkOption {
 | |
|         type = types.bool;
 | |
|         default = true;
 | |
|         description = ''
 | |
|           Whether to use SSL to connect to the IRC server.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       modules = mkOption {
 | |
|         type = types.listOf types.str;
 | |
|         default = [ "simple_away" ];
 | |
|         example = literalExample "[ simple_away sasl ]";
 | |
|         description = ''
 | |
|           ZNC network modules to load.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       channels = mkOption {
 | |
|         type = types.listOf types.str;
 | |
|         default = [];
 | |
|         example = [ "nixos" ];
 | |
|         description = ''
 | |
|           IRC channels to join.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       hasBitlbeeControlChannel = mkOption {
 | |
|         type = types.bool;
 | |
|         default = false;
 | |
|         description = ''
 | |
|           Whether to add the special Bitlbee operations channel.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       extraConf = mkOption {
 | |
|         default = "";
 | |
|         type = types.lines;
 | |
|         example = ''
 | |
|           Encoding = ^UTF-8
 | |
|           FloodBurst = 4
 | |
|           FloodRate = 1.00
 | |
|           IRCConnectEnabled = true
 | |
|           Ident = johntron
 | |
|           JoinDelay = 0
 | |
|           Nick = johntron
 | |
|         '';
 | |
|         description = ''
 | |
|           Extra config for the network. Consider using
 | |
|           <option>services.znc.config</option> instead.
 | |
|         '';
 | |
|       };
 | |
|     };
 | |
|   };
 | |
| 
 | |
| in
 | |
| 
 | |
| {
 | |
| 
 | |
|   options = {
 | |
|     services.znc = {
 | |
| 
 | |
|       useLegacyConfig = mkOption {
 | |
|         default = true;
 | |
|         type = types.bool;
 | |
|         description = ''
 | |
|           Whether to propagate the legacy options under
 | |
|           <option>services.znc.confOptions.*</option> to the znc config. If this
 | |
|           is turned on, the znc config will contain a user with the default name
 | |
|           "znc", global modules "webadmin" and "adminlog" will be enabled by
 | |
|           default, and more, all controlled through the
 | |
|           <option>services.znc.confOptions.*</option> options.
 | |
|           You can use <command>nix-instantiate --eval --strict '<nixpkgs/nixos>' -A config.services.znc.config</command>
 | |
|           to view the current value of the config.
 | |
|           </para>
 | |
|           <para>
 | |
|           In any case, if you need more flexibility,
 | |
|           <option>services.znc.config</option> can be used to override/add to
 | |
|           all of the legacy options.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       confOptions = {
 | |
|         modules = mkOption {
 | |
|           type = types.listOf types.str;
 | |
|           default = [ "webadmin" "adminlog" ];
 | |
|           example = [ "partyline" "webadmin" "adminlog" "log" ];
 | |
|           description = ''
 | |
|             A list of modules to include in the `znc.conf` file.
 | |
|           '';
 | |
|         };
 | |
| 
 | |
|         userModules = mkOption {
 | |
|           type = types.listOf types.str;
 | |
|           default = [ "chansaver" "controlpanel" ];
 | |
|           example = [ "chansaver" "controlpanel" "fish" "push" ];
 | |
|           description = ''
 | |
|             A list of user modules to include in the `znc.conf` file.
 | |
|           '';
 | |
|         };
 | |
| 
 | |
|         userName = mkOption {
 | |
|           default = "znc";
 | |
|           example = "johntron";
 | |
|           type = types.str;
 | |
|           description = ''
 | |
|             The user name used to log in to the ZNC web admin interface.
 | |
|           '';
 | |
|         };
 | |
| 
 | |
|         networks = mkOption {
 | |
|           default = { };
 | |
|           type = with types; attrsOf (submodule networkOpts);
 | |
|           description = ''
 | |
|             IRC networks to connect the user to.
 | |
|           '';
 | |
|           example = literalExample ''
 | |
|             {
 | |
|               "freenode" = {
 | |
|                 server = "chat.freenode.net";
 | |
|                 port = 6697;
 | |
|                 useSSL = true;
 | |
|                 modules = [ "simple_away" ];
 | |
|               };
 | |
|             };
 | |
|           '';
 | |
|         };
 | |
| 
 | |
|         nick = mkOption {
 | |
|           default = "znc-user";
 | |
|           example = "john";
 | |
|           type = types.str;
 | |
|           description = ''
 | |
|             The IRC nick.
 | |
|           '';
 | |
|         };
 | |
| 
 | |
|         passBlock = mkOption {
 | |
|           example = literalExample ''
 | |
|             <Pass password>
 | |
|                Method = sha256
 | |
|                Hash = e2ce303c7ea75c571d80d8540a8699b46535be6a085be3414947d638e48d9e93
 | |
|                Salt = l5Xryew4g*!oa(ECfX2o
 | |
|             </Pass>
 | |
|           '';
 | |
|           type = types.str;
 | |
|           description = ''
 | |
|             Generate with `nix-shell -p znc --command "znc --makepass"`.
 | |
|             This is the password used to log in to the ZNC web admin interface.
 | |
|             You can also set this through
 | |
|             <option>services.znc.config.User.<username>.Pass.Method</option>
 | |
|             and co.
 | |
|           '';
 | |
|         };
 | |
| 
 | |
|         port = mkOption {
 | |
|           default = 5000;
 | |
|           type = types.int;
 | |
|           description = ''
 | |
|             Specifies the port on which to listen.
 | |
|           '';
 | |
|         };
 | |
| 
 | |
|         useSSL = mkOption {
 | |
|           default = true;
 | |
|           type = types.bool;
 | |
|           description = ''
 | |
|             Indicates whether the ZNC server should use SSL when listening on
 | |
|             the specified port. A self-signed certificate will be generated.
 | |
|           '';
 | |
|         };
 | |
| 
 | |
|         uriPrefix = mkOption {
 | |
|           type = types.nullOr types.str;
 | |
|           default = null;
 | |
|           example = "/znc/";
 | |
|           description = ''
 | |
|             An optional URI prefix for the ZNC web interface. Can be
 | |
|             used to make ZNC available behind a reverse proxy.
 | |
|           '';
 | |
|         };
 | |
| 
 | |
|         extraZncConf = mkOption {
 | |
|           default = "";
 | |
|           type = types.lines;
 | |
|           description = ''
 | |
|             Extra config to `znc.conf` file.
 | |
|           '';
 | |
|         };
 | |
|       };
 | |
| 
 | |
|     };
 | |
|   };
 | |
| 
 | |
|   config = mkIf cfg.useLegacyConfig {
 | |
| 
 | |
|     services.znc.config = let
 | |
|       c = cfg.confOptions;
 | |
|       # defaults here should override defaults set in the non-legacy part
 | |
|       mkDefault = mkOverride 900;
 | |
|     in {
 | |
|       LoadModule = mkDefault c.modules;
 | |
|       Listener.l = {
 | |
|         Port = mkDefault c.port;
 | |
|         IPv4 = mkDefault true;
 | |
|         IPv6 = mkDefault true;
 | |
|         SSL = mkDefault c.useSSL;
 | |
|         URIPrefix = c.uriPrefix;
 | |
|       };
 | |
|       User.${c.userName} = {
 | |
|         Admin = mkDefault true;
 | |
|         Nick = mkDefault c.nick;
 | |
|         AltNick = mkDefault "${c.nick}_";
 | |
|         Ident = mkDefault c.nick;
 | |
|         RealName = mkDefault c.nick;
 | |
|         LoadModule = mkDefault c.userModules;
 | |
|         Network = mapAttrs (name: net: {
 | |
|           LoadModule = mkDefault net.modules;
 | |
|           Server = mkDefault "${net.server} ${optionalString net.useSSL "+"}${toString net.port} ${net.password}";
 | |
|           Chan = optionalAttrs net.hasBitlbeeControlChannel { "&bitlbee" = mkDefault {}; } //
 | |
|             listToAttrs (map (n: nameValuePair "#${n}" (mkDefault {})) net.channels);
 | |
|           extraConfig = if net.extraConf == "" then mkDefault null else net.extraConf;
 | |
|         }) c.networks;
 | |
|         extraConfig = [ c.passBlock ];
 | |
|       };
 | |
|       extraConfig = optional (c.extraZncConf != "") c.extraZncConf;
 | |
|     };
 | |
|   };
 | |
| 
 | |
|   imports = [
 | |
|     (mkRemovedOptionModule ["services" "znc" "zncConf"] ''
 | |
|       Instead of `services.znc.zncConf = "... foo ...";`, use
 | |
|       `services.znc.configFile = pkgs.writeText "znc.conf" "... foo ...";`.
 | |
|     '')
 | |
|   ];
 | |
| }
 |