140 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { config, pkgs, lib, ... }:
 | |
| 
 | |
| with lib;
 | |
| 
 | |
| let
 | |
|   cfg = config.services.psd;
 | |
| 
 | |
|   configFile = ''
 | |
|     ${optionalString (cfg.users != [ ]) ''
 | |
|       USERS="${concatStringsSep " " cfg.users}"
 | |
|     ''}
 | |
| 
 | |
|     ${optionalString (cfg.browsers != [ ]) ''
 | |
|       BROWSERS="${concatStringsSep " " cfg.browsers}"
 | |
|     ''}
 | |
| 
 | |
|     ${optionalString (cfg.volatile != "") "VOLATILE=${cfg.volatile}"}
 | |
|     ${optionalString (cfg.daemonFile != "") "DAEMON_FILE=${cfg.daemonFile}"}
 | |
|   '';
 | |
| 
 | |
| in {
 | |
| 
 | |
|   options.services.psd = with types; {
 | |
|     enable = mkOption {
 | |
|       type = bool;
 | |
|       default = false;
 | |
|       description = ''
 | |
|         Whether to enable the Profile Sync daemon.
 | |
|       '';
 | |
|     };
 | |
| 
 | |
|     users = mkOption {
 | |
|       type = listOf str;
 | |
|       default = [ ];
 | |
|       example = [ "demo" ];
 | |
|       description = ''
 | |
|         A list of users whose browser profiles should be sync'd to tmpfs.
 | |
|       '';
 | |
|     };
 | |
| 
 | |
|     browsers = mkOption {
 | |
|       type = listOf str;
 | |
|       default = [ ];
 | |
|       example = [ "chromium" "firefox" ];
 | |
|       description = ''
 | |
|         A list of browsers to sync. Available choices are:
 | |
| 
 | |
|         chromium chromium-dev conkeror.mozdev.org epiphany firefox
 | |
|         firefox-trunk google-chrome google-chrome-beta google-chrome-unstable
 | |
|         heftig-aurora icecat luakit midori opera opera-developer opera-beta
 | |
|         qupzilla palemoon rekonq seamonkey
 | |
| 
 | |
|         An empty list will enable all browsers.
 | |
|       '';
 | |
|     };
 | |
| 
 | |
|     resyncTimer = mkOption {
 | |
|       type = str;
 | |
|       default = "1h";
 | |
|       example = "1h 30min";
 | |
|       description = ''
 | |
|         The amount of time to wait before syncing browser profiles back to the
 | |
|         disk.
 | |
| 
 | |
|         Takes a systemd.unit time span. The time unit defaults to seconds if
 | |
|         omitted.
 | |
|       '';
 | |
|     };
 | |
| 
 | |
|     volatile = mkOption {
 | |
|       type = str;
 | |
|       default = "/run/psd-profiles";
 | |
|       description = ''
 | |
|         The directory where browser profiles should reside(this should be
 | |
|         mounted as a tmpfs). Do not include a trailing backslash.
 | |
|       '';
 | |
|     };
 | |
| 
 | |
|     daemonFile = mkOption {
 | |
|       type = str;
 | |
|       default = "/run/psd";
 | |
|       description = ''
 | |
|         Where the pid and backup configuration files will be stored.
 | |
|       '';
 | |
|     };
 | |
|   };
 | |
| 
 | |
|   config = mkIf cfg.enable {
 | |
|     systemd = {
 | |
|       services = {
 | |
|         psd = {
 | |
|           description = "Profile Sync daemon";
 | |
|           wants = [ "psd-resync.service" "local-fs.target" ];
 | |
|           wantedBy = [ "multi-user.target" ];
 | |
|           preStart = "mkdir -p ${cfg.volatile}";
 | |
| 
 | |
|           path = with pkgs; [ glibc rsync gawk ];
 | |
| 
 | |
|           unitConfig = {
 | |
|             RequiresMountsFor = [ "/home/" ];
 | |
|           };
 | |
| 
 | |
|           serviceConfig = {
 | |
|             Type = "oneshot";
 | |
|             RemainAfterExit = "yes";
 | |
|             ExecStart = "${pkgs.profile-sync-daemon}/bin/profile-sync-daemon sync";
 | |
|             ExecStop = "${pkgs.profile-sync-daemon}/bin/profile-sync-daemon unsync";
 | |
|           };
 | |
|         };
 | |
| 
 | |
|         psd-resync = {
 | |
|           description = "Timed profile resync";
 | |
|           after = [ "psd.service" ];
 | |
|           wants = [ "psd-resync.timer" ];
 | |
|           partOf = [ "psd.service" ];
 | |
| 
 | |
|           path = with pkgs; [ glibc rsync gawk ];
 | |
| 
 | |
|           serviceConfig = {
 | |
|             Type = "oneshot";
 | |
|             ExecStart = "${pkgs.profile-sync-daemon}/bin/profile-sync-daemon resync";
 | |
|           };
 | |
|         };
 | |
|       };
 | |
| 
 | |
|       timers.psd-resync = {
 | |
|         description = "Timer for profile sync daemon - ${cfg.resyncTimer}";
 | |
|         partOf = [ "psd-resync.service" "psd.service" ];
 | |
| 
 | |
|         timerConfig = {
 | |
|           OnUnitActiveSec = "${cfg.resyncTimer}";
 | |
|         };
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     environment.etc."psd.conf".text = configFile;
 | |
| 
 | |
|   };
 | |
| }
 | 
