diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index ec5e4e0fab4..2cee8cb502a 100755 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -137,6 +137,7 @@ ./services/desktops/gnome3/seahorse.nix ./services/desktops/gnome3/sushi.nix ./services/desktops/gnome3/tracker.nix + ./services/desktops/profile-sync-daemon.nix ./services/desktops/telepathy.nix ./services/games/ghost-one.nix ./services/games/minecraft-server.nix diff --git a/nixos/modules/services/desktops/profile-sync-daemon.nix b/nixos/modules/services/desktops/profile-sync-daemon.nix new file mode 100644 index 00000000000..c662c5d0fa6 --- /dev/null +++ b/nixos/modules/services/desktops/profile-sync-daemon.nix @@ -0,0 +1,139 @@ +{ config, pkgs, lib, ... }: + +with lib; + +let + cfg = config.services.psd; + + configFile = '' + ${if cfg.users != [ ] then '' + USERS="${concatStringsSep " " cfg.users}" + '' else ""} + + ${if cfg.browsers != [ ] then '' + BROWSERS="${concatStringsSep " " cfg.browsers}" + '' else ""} + + ${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 - 1 Hour"; + partOf = [ "psd-resync.service" "psd.service" ]; + + timerConfig = { + OnUnitActiveSec = "${cfg.resyncTimer}"; + }; + }; + }; + + environment.etc."psd.conf".text = configFile; + + }; +} diff --git a/pkgs/tools/misc/profile-sync-daemon/default.nix b/pkgs/tools/misc/profile-sync-daemon/default.nix new file mode 100644 index 00000000000..d3f017171cb --- /dev/null +++ b/pkgs/tools/misc/profile-sync-daemon/default.nix @@ -0,0 +1,32 @@ +{ stdenv, fetchurl, rsync, glibc, gawk }: + +stdenv.mkDerivation rec { + version = "v5.53"; + name = "profile-sync-daemon-${version}"; + + src = fetchurl { + url = "http://github.com/graysky2/profile-sync-daemon/archive/${version}.tar.gz"; + sha256 = "0m7h9l7dndqgb5k3grpc00f6dpg73p6h4q5sgkf8bvyzvcbdafwx"; + }; + + installPhase = "PREFIX=\"\" DESTDIR=$out make install-systemd-all"; + + preferLocalBuild = true; + + meta = with stdenv.lib; { + description = "Syncs browser profile dirs to RAM"; + longDescription = '' + Profile-sync-daemon (psd) is a tiny pseudo-daemon designed to manage your + browser's profile in tmpfs and to periodically sync it back to your + physical disc (HDD/SSD). This is accomplished via a symlinking step and + an innovative use of rsync to maintain back-up and synchronization + between the two. One of the major design goals of psd is a completely + transparent user experience. + ''; + homepage = https://github.com/graysky2/profile-sync-daemon; + downloadPage = https://github.com/graysky2/profile-sync-daemon/releases; + license = licenses.mit; + maintainers = [ maintainers.prikhi ]; + platforms = platforms.linux; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 42de5f12242..32c4431b8a3 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -2171,6 +2171,8 @@ let prey-bash-client = callPackage ../tools/security/prey { }; + profile-sync-daemon = callPackage ../tools/misc/profile-sync-daemon { }; + projectm = callPackage ../applications/audio/projectm { }; proot = callPackage ../tools/system/proot { };