diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 82433473f..ee1781ea2 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -113,6 +113,9 @@ /modules/services/clipmenu.nix @DamienCassou +/modules/services/dropbox.nix @eyJhb +/tests/modules/services/dropbox @eyJhb + /modules/services/dunst.nix @rycee /modules/services/emacs.nix @tadfisher diff --git a/modules/misc/news.nix b/modules/misc/news.nix index 608fcc2b2..62f57a44c 100644 --- a/modules/misc/news.nix +++ b/modules/misc/news.nix @@ -1611,6 +1611,14 @@ in A new module is available: 'programs.nushell'. ''; } + + { + time = "2020-07-25T21:04:59+00:00"; + condition = hostPlatform.isLinux; + message = '' + A new module is available: 'services.dropbox'. + ''; + } ]; }; } diff --git a/modules/modules.nix b/modules/modules.nix index 6d24cb672..76ff5aaa8 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -127,6 +127,7 @@ let (loadModule ./services/cbatticon.nix { condition = hostPlatform.isLinux; }) (loadModule ./services/clipmenu.nix { condition = hostPlatform.isLinux; }) (loadModule ./services/compton.nix { }) + (loadModule ./services/dropbox.nix { condition = hostPlatform.isLinux; }) (loadModule ./services/dunst.nix { }) (loadModule ./services/dwm-status.nix { condition = hostPlatform.isLinux; }) (loadModule ./services/emacs.nix { condition = hostPlatform.isLinux; }) diff --git a/modules/services/dropbox.nix b/modules/services/dropbox.nix new file mode 100644 index 000000000..fa8a2fc52 --- /dev/null +++ b/modules/services/dropbox.nix @@ -0,0 +1,77 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + + cfg = config.services.dropbox; + baseDir = ".dropbox-hm"; + dropboxCmd = "${pkgs.dropbox-cli}/bin/dropbox"; + homeBaseDir = "${config.home.homeDirectory}/${baseDir}"; + +in { + meta.maintainers = [ maintainers.eyjhb ]; + + options = { + services.dropbox = { + enable = mkEnableOption "Dropbox daemon"; + + path = mkOption { + type = types.path; + default = "${config.home.homeDirectory}/Dropbox"; + defaultText = + literalExample ''"''${config.home.homeDirectory}/Dropbox"''; + apply = toString; # Prevent copies to Nix store. + description = "Where to put the Dropbox directory."; + }; + }; + }; + + config = mkIf cfg.enable { + home.packages = [ pkgs.dropbox-cli ]; + + systemd.user.services.dropbox = { + Unit = { Description = "dropbox"; }; + + Install = { WantedBy = [ "default.target" ]; }; + + Service = { + Environment = [ "HOME=${homeBaseDir}" ]; + + Type = "forking"; + PIDFile = "${homeBaseDir}/.dropbox/dropbox.pid"; + + Restart = "on-failure"; + PrivateTmp = true; + ProtectSystem = "full"; + Nice = 10; + + ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; + ExecStop = "${dropboxCmd} stop"; + ExecStart = toString (pkgs.writeShellScript "dropbox-start" '' + if [[ ! -f $HOME/.dropbox-dist/VERSION ]]; then + ${pkgs.coreutils}/bin/yes | ${dropboxCmd} update + fi + + ${dropboxCmd} start + ''); + }; + }; + + home.activation.dropbox = hm.dag.entryAfter [ "writeBoundary" ] '' + # ensure we have the dirs we need + $DRY_RUN_CMD ${pkgs.coreutils}/bin/mkdir $VERBOSE_ARG -p \ + ${homeBaseDir}/{.dropbox,.dropbox-dist,Dropbox} + + # symlink them as needed + if [[ ! -d ${config.home.homeDirectory}/.dropbox ]]; then + $DRY_RUN_CMD ${pkgs.coreutils}/bin/ln $VERBOSE_ARG -s \ + ${homeBaseDir}/.dropbox ${config.home.homeDirectory}/.dropbox + fi + if [[ ! -d ${escapeShellArg cfg.path} ]]; then + $DRY_RUN_CMD ${pkgs.coreutils}/bin/ln $VERBOSE_ARG -s \ + ${homeBaseDir}/Dropbox ${escapeShellArg cfg.path} + fi + ''; + }; +} diff --git a/tests/default.nix b/tests/default.nix index bad49546e..53c221bcf 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -75,7 +75,9 @@ import nmt { ./modules/misc/xsession ./modules/programs/abook ./modules/programs/autorandr + ./modules/services/dropbox ./modules/services/emacs + ./modules/services/dropbox ./modules/programs/firefox ./modules/programs/getmail ./modules/services/lieer diff --git a/tests/modules/services/dropbox/basic-configuration.nix b/tests/modules/services/dropbox/basic-configuration.nix new file mode 100644 index 000000000..96a17cd73 --- /dev/null +++ b/tests/modules/services/dropbox/basic-configuration.nix @@ -0,0 +1,25 @@ +{ config, pkgs, ... }: + +{ + config = { + services.dropbox = { + enable = true; + path = "${config.home.homeDirectory}/dropbox"; + }; + + nixpkgs.overlays = [ + (self: super: { + dropbox-cli = pkgs.writeScriptBin "dummy-dropbox-cli" "" // { + outPath = "@dropbox-cli@"; + }; + }) + ]; + + nmt.script = '' + serviceFile=home-files/.config/systemd/user/dropbox.service + + assertFileExists $serviceFile + ''; + + }; +} diff --git a/tests/modules/services/dropbox/default.nix b/tests/modules/services/dropbox/default.nix new file mode 100644 index 000000000..ad5197903 --- /dev/null +++ b/tests/modules/services/dropbox/default.nix @@ -0,0 +1 @@ +{ dropbox-basic-configuration = ./basic-configuration.nix; }