99 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| 
 | |
| { config, lib, pkgs, ... }:
 | |
| 
 | |
| with lib;
 | |
| 
 | |
| let
 | |
| 
 | |
|   cfg = config.services.incron;
 | |
| 
 | |
| in
 | |
| 
 | |
| {
 | |
|   options = {
 | |
| 
 | |
|     services.incron = {
 | |
| 
 | |
|       enable = mkOption {
 | |
|         type = types.bool;
 | |
|         default = false;
 | |
|         description = ''
 | |
|           Whether to enable the incron daemon.
 | |
| 
 | |
|           Note that commands run under incrontab only support common Nix profiles for the <envar>PATH</envar> provided variable.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       allow = mkOption {
 | |
|         type = types.nullOr (types.listOf types.str);
 | |
|         default = null;
 | |
|         description = ''
 | |
|           Users allowed to use incrontab.
 | |
| 
 | |
|           If empty then no user will be allowed to have their own incrontab.
 | |
|           If <literal>null</literal> then will defer to <option>deny</option>.
 | |
|           If both <option>allow</option> and <option>deny</option> are null
 | |
|           then all users will be allowed to have their own incrontab.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       deny = mkOption {
 | |
|         type = types.nullOr (types.listOf types.str);
 | |
|         default = null;
 | |
|         description = "Users forbidden from using incrontab.";
 | |
|       };
 | |
| 
 | |
|       systab = mkOption {
 | |
|         type = types.lines;
 | |
|         default = "";
 | |
|         description = "The system incrontab contents.";
 | |
|         example = ''
 | |
|           /var/mail IN_CLOSE_WRITE abc $@/$#
 | |
|           /tmp IN_ALL_EVENTS efg $@/$# $&
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       extraPackages = mkOption {
 | |
|         type = types.listOf types.package;
 | |
|         default = [];
 | |
|         example = literalExample "[ pkgs.rsync ]";
 | |
|         description = "Extra packages available to the system incrontab.";
 | |
|       };
 | |
| 
 | |
|     };
 | |
| 
 | |
|   };
 | |
| 
 | |
|   config = mkIf cfg.enable {
 | |
| 
 | |
|     warnings = optional (cfg.allow != null && cfg.deny != null)
 | |
|       ''If `services.incron.allow` is set then `services.incron.deny` will be ignored.'';
 | |
| 
 | |
|     environment.systemPackages = [ pkgs.incron ];
 | |
| 
 | |
|     security.wrappers.incrontab.source = "${pkgs.incron}/bin/incrontab";
 | |
| 
 | |
|     # incron won't read symlinks
 | |
|     environment.etc."incron.d/system" = {
 | |
|       mode = "0444";
 | |
|       text = cfg.systab;
 | |
|     };
 | |
|     environment.etc."incron.allow" = mkIf (cfg.allow != null) {
 | |
|       text = concatStringsSep "\n" cfg.allow;
 | |
|     };
 | |
|     environment.etc."incron.deny" = mkIf (cfg.deny != null) {
 | |
|       text = concatStringsSep "\n" cfg.deny;
 | |
|     };
 | |
| 
 | |
|     systemd.services.incron = {
 | |
|       description = "File System Events Scheduler";
 | |
|       wantedBy = [ "multi-user.target" ];
 | |
|       path = cfg.extraPackages;
 | |
|       serviceConfig.PIDFile = "/run/incrond.pid";
 | |
|       serviceConfig.ExecStartPre = "${pkgs.coreutils}/bin/mkdir -m 710 -p /var/spool/incron";
 | |
|       serviceConfig.ExecStart = "${pkgs.incron}/bin/incrond --foreground";
 | |
|     };
 | |
|   };
 | |
| 
 | |
| }
 | 
