From f3df7da4f93d56f579eb5826cf518d515a80840a Mon Sep 17 00:00:00 2001 From: Silvan Mosberger Date: Tue, 17 Oct 2017 18:55:57 +0200 Subject: [PATCH 1/2] usbmuxd service: init --- nixos/modules/module-list.nix | 1 + nixos/modules/services/hardware/usbmuxd.nix | 25 +++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 nixos/modules/services/hardware/usbmuxd.nix diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index a8cb957ffe21..16af3200a4be 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -237,6 +237,7 @@ ./services/hardware/udev.nix ./services/hardware/udisks2.nix ./services/hardware/upower.nix + ./services/hardware/usbmuxd.nix ./services/hardware/thermald.nix ./services/logging/SystemdJournal2Gelf.nix ./services/logging/awstats.nix diff --git a/nixos/modules/services/hardware/usbmuxd.nix b/nixos/modules/services/hardware/usbmuxd.nix new file mode 100644 index 000000000000..4d7320953f07 --- /dev/null +++ b/nixos/modules/services/hardware/usbmuxd.nix @@ -0,0 +1,25 @@ +{ config, lib, pkgs, ... }: + +with lib; + +{ + 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. + ''; + }; + + config = mkIf config.services.usbmuxd.enable { + systemd.services.usbmuxd = { + description = "usbmuxd"; + wantedBy = [ "multi-user.target" ]; + unitConfig.Documentation = "man:usbmuxd(8)"; + serviceConfig.ExecStart = "${pkgs.usbmuxd}/bin/usbmuxd -f"; + }; + }; +} From 2d019b3de374f4888e3ca57ef262b4e8bcf35849 Mon Sep 17 00:00:00 2001 From: Silvan Mosberger Date: Wed, 18 Oct 2017 22:21:29 +0200 Subject: [PATCH 2/2] usbmuxd service: user and group options --- nixos/modules/services/hardware/usbmuxd.nix | 71 +++++++++++++++++---- 1 file 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"; + }; }; + }; }