100 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{ config, lib, pkgs, ... }:
 | 
						|
 | 
						|
with lib;
 | 
						|
 | 
						|
let
 | 
						|
  cfg = config.hardware.bluetooth;
 | 
						|
  bluez-bluetooth = cfg.package;
 | 
						|
 | 
						|
in {
 | 
						|
 | 
						|
  ###### interface
 | 
						|
 | 
						|
  options = {
 | 
						|
 | 
						|
    hardware.bluetooth = {
 | 
						|
      enable = mkEnableOption "support for Bluetooth";
 | 
						|
 | 
						|
      powerOnBoot = mkOption {
 | 
						|
        type    = types.bool;
 | 
						|
        default = true;
 | 
						|
        description = "Whether to power up the default Bluetooth controller on boot.";
 | 
						|
      };
 | 
						|
 | 
						|
      package = mkOption {
 | 
						|
        type = types.package;
 | 
						|
        default = pkgs.bluez;
 | 
						|
        defaultText = "pkgs.bluez";
 | 
						|
        example = "pkgs.bluezFull";
 | 
						|
        description = ''
 | 
						|
          Which BlueZ package to use.
 | 
						|
 | 
						|
          <note><para>
 | 
						|
            Use the <literal>pkgs.bluezFull</literal> package to enable all
 | 
						|
            bluez plugins.
 | 
						|
          </para></note>
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      config = mkOption {
 | 
						|
        type = with types; attrsOf (attrsOf (oneOf [ bool int str ]));
 | 
						|
        example = {
 | 
						|
          General = {
 | 
						|
            ControllerMode = "bredr";
 | 
						|
          };
 | 
						|
        };
 | 
						|
        description = "Set configuration for system-wide bluetooth (/etc/bluetooth/main.conf).";
 | 
						|
      };
 | 
						|
 | 
						|
      extraConfig = mkOption {
 | 
						|
        type = with types; nullOr lines;
 | 
						|
        default = null;
 | 
						|
        example = ''
 | 
						|
          [General]
 | 
						|
          ControllerMode = bredr
 | 
						|
        '';
 | 
						|
        description = ''
 | 
						|
          Set additional configuration for system-wide bluetooth (/etc/bluetooth/main.conf).
 | 
						|
        '';
 | 
						|
      };
 | 
						|
    };
 | 
						|
 | 
						|
  };
 | 
						|
 | 
						|
  ###### implementation
 | 
						|
 | 
						|
  config = mkIf cfg.enable {
 | 
						|
    warnings = optional (cfg.extraConfig != null) "hardware.bluetooth.`extraConfig` is deprecated, please use hardware.bluetooth.`config`.";
 | 
						|
 | 
						|
    hardware.bluetooth.config = {
 | 
						|
      Policy = {
 | 
						|
        AutoEnable = mkDefault cfg.powerOnBoot;
 | 
						|
      };
 | 
						|
    };
 | 
						|
 | 
						|
    environment.systemPackages = [ bluez-bluetooth ];
 | 
						|
 | 
						|
    environment.etc."bluetooth/main.conf"= {
 | 
						|
      source = pkgs.writeText "main.conf"
 | 
						|
        (generators.toINI { } cfg.config + optionalString (cfg.extraConfig != null) cfg.extraConfig);
 | 
						|
    };
 | 
						|
 | 
						|
    services.udev.packages = [ bluez-bluetooth ];
 | 
						|
    services.dbus.packages = [ bluez-bluetooth ];
 | 
						|
    systemd.packages       = [ bluez-bluetooth ];
 | 
						|
 | 
						|
    systemd.services = {
 | 
						|
      bluetooth = {
 | 
						|
        wantedBy = [ "bluetooth.target" ];
 | 
						|
        aliases  = [ "dbus-org.bluez.service" ];
 | 
						|
      };
 | 
						|
    };
 | 
						|
 | 
						|
    systemd.user.services = {
 | 
						|
      obex.aliases = [ "dbus-org.bluez.obex.service" ];
 | 
						|
    };
 | 
						|
 | 
						|
  };
 | 
						|
 | 
						|
}
 |