summary refs log tree commit diff
path: root/nixos/modules/services/hardware/usbmuxd.nix
diff options
context:
space:
mode:
authorSilvan Mosberger <infinisil@icloud.com>2017-10-18 22:21:29 +0200
committerSilvan Mosberger <infinisil@icloud.com>2017-10-18 22:21:29 +0200
commit2d019b3de374f4888e3ca57ef262b4e8bcf35849 (patch)
tree871af0a8ca0fac523452e581a92a8a422059ff2a /nixos/modules/services/hardware/usbmuxd.nix
parentf3df7da4f93d56f579eb5826cf518d515a80840a (diff)
downloadnixlib-2d019b3de374f4888e3ca57ef262b4e8bcf35849.tar
nixlib-2d019b3de374f4888e3ca57ef262b4e8bcf35849.tar.gz
nixlib-2d019b3de374f4888e3ca57ef262b4e8bcf35849.tar.bz2
nixlib-2d019b3de374f4888e3ca57ef262b4e8bcf35849.tar.lz
nixlib-2d019b3de374f4888e3ca57ef262b4e8bcf35849.tar.xz
nixlib-2d019b3de374f4888e3ca57ef262b4e8bcf35849.tar.zst
nixlib-2d019b3de374f4888e3ca57ef262b4e8bcf35849.zip
usbmuxd service: user and group options
Diffstat (limited to 'nixos/modules/services/hardware/usbmuxd.nix')
-rw-r--r--nixos/modules/services/hardware/usbmuxd.nix71
1 files changed, 60 insertions, 11 deletions
diff --git a/nixos/modules/services/hardware/usbmuxd.nix b/nixos/modules/services/hardware/usbmuxd.nix
index 4d7320953f07..7ebd49fa01c2 100644
--- a/nixos/modules/services/hardware/usbmuxd.nix
+++ b/nixos/modules/services/hardware/usbmuxd.nix
@@ -2,24 +2,73 @@
 
 with lib;
 
+let
+
+  defaultUserGroup = "usbmux";
+  apple = "05ac";
+
+  cfg = config.services.usbmuxd;
+
+in
+
 {
-  options.services.usbmuxd.enable = mkOption {
-    type = types.bool;
-    default = false;
-    description = ''
-      Enable the usbmuxd ("USB multiplexing daemon") service. This daemon is in
-      charge of multiplexing connections over USB to an iOS device. This is
-      needed for transferring data from and to iOS devices (see ifuse). Also
-      this may enable plug-n-play tethering for iPhones.
-    '';
+  options.services.usbmuxd = {
+    enable = mkOption {
+      type = types.bool;
+      default = false;
+      description = ''
+        Enable the usbmuxd ("USB multiplexing daemon") service. This daemon is
+        in charge of multiplexing connections over USB to an iOS device. This is
+        needed for transferring data from and to iOS devices (see ifuse). Also
+        this may enable plug-n-play tethering for iPhones.
+      '';
+    };
+
+    user = mkOption {
+      type = types.str;
+      default = defaultUserGroup;
+      description = ''
+        The user usbmuxd should use to run after startup.
+      '';
+    };
+
+    group = mkOption {
+      type = types.str;
+      default = defaultUserGroup;
+      description = ''
+        The group usbmuxd should use to run after startup.
+      '';
+    };
   };
 
-  config = mkIf config.services.usbmuxd.enable {
+  config = mkIf cfg.enable {
+
+    users.extraUsers = optional (cfg.user == defaultUserGroup) {
+      name = cfg.user;
+      description = "usbmuxd user";
+      group = cfg.group;
+    };
+
+    users.extraGroups = optional (cfg.group == defaultUserGroup) {
+      name = cfg.group;
+    };
+
+    # Give usbmuxd permission for Apple devices
+    services.udev.extraRules = ''
+      SUBSYSTEM=="usb", ATTR{idVendor}=="${apple}", GROUP="${cfg.group}"
+    '';
+
     systemd.services.usbmuxd = {
       description = "usbmuxd";
       wantedBy = [ "multi-user.target" ];
       unitConfig.Documentation = "man:usbmuxd(8)";
-      serviceConfig.ExecStart = "${pkgs.usbmuxd}/bin/usbmuxd -f";
+      serviceConfig = {
+        # Trigger the udev rule manually. This doesn't require replugging the
+        # device when first enabling the option to get it to work
+        ExecStartPre = "${pkgs.libudev}/bin/udevadm trigger -s usb -a idVendor=${apple}";
+        ExecStart = "${pkgs.usbmuxd}/bin/usbmuxd -U ${cfg.user} -f";
+      };
     };
+
   };
 }