about summary refs log tree commit diff
path: root/nixos/modules/services/hardware
diff options
context:
space:
mode:
authorGraham Christensen <graham@grahamc.com>2018-01-06 15:53:42 -0500
committerGitHub <noreply@github.com>2018-01-06 15:53:42 -0500
commit013580caf060b0778c5c31e595850c3412d03406 (patch)
treea8e02c6dae61559fc3ba6d802ebe041d19d60482 /nixos/modules/services/hardware
parent3700765c3d876cad4745790c5953f1cbedc6d59e (diff)
parent2d019b3de374f4888e3ca57ef262b4e8bcf35849 (diff)
downloadnixlib-013580caf060b0778c5c31e595850c3412d03406.tar
nixlib-013580caf060b0778c5c31e595850c3412d03406.tar.gz
nixlib-013580caf060b0778c5c31e595850c3412d03406.tar.bz2
nixlib-013580caf060b0778c5c31e595850c3412d03406.tar.lz
nixlib-013580caf060b0778c5c31e595850c3412d03406.tar.xz
nixlib-013580caf060b0778c5c31e595850c3412d03406.tar.zst
nixlib-013580caf060b0778c5c31e595850c3412d03406.zip
Merge pull request #30518 from Infinisil/usbmuxd-service
usbmuxd service: init
Diffstat (limited to 'nixos/modules/services/hardware')
-rw-r--r--nixos/modules/services/hardware/usbmuxd.nix74
1 files changed, 74 insertions, 0 deletions
diff --git a/nixos/modules/services/hardware/usbmuxd.nix b/nixos/modules/services/hardware/usbmuxd.nix
new file mode 100644
index 000000000000..7ebd49fa01c2
--- /dev/null
+++ b/nixos/modules/services/hardware/usbmuxd.nix
@@ -0,0 +1,74 @@
+{ config, lib, pkgs, ... }:
+
+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.
+      '';
+    };
+
+    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 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 = {
+        # 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";
+      };
+    };
+
+  };
+}