aboutsummaryrefslogtreecommitdiff
path: root/home-manager/modules/services/dropbox.nix
blob: bcf3ba2b457cd6499217812196378af7f50a9cde (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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}" "DISPLAY=" ];

        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" ''
          # 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

          # get the dropbox bins if needed
          if [[ ! -f $HOME/.dropbox-dist/VERSION ]]; then
            ${pkgs.coreutils}/bin/yes | ${dropboxCmd} update
          fi

          ${dropboxCmd} start
        '');
      };
    };
  };
}