diff --git a/nixos/doc/manual/release-notes/rl-1909.xml b/nixos/doc/manual/release-notes/rl-1909.xml
index ead8f3abd8b2b..dffe5a531b2e0 100644
--- a/nixos/doc/manual/release-notes/rl-1909.xml
+++ b/nixos/doc/manual/release-notes/rl-1909.xml
@@ -154,6 +154,18 @@
+
+
+ The package avahi is now built using the well-known
+ location /etc/avahi/services for looking up service
+ definitions. Additionally the module now supports
+ custom service definitions via
+ , wich are then placed
+ in the aforementioned directory. See
+ avahi.service5
+ for more information on custom service definitions.
+
+
diff --git a/nixos/modules/misc/ids.nix b/nixos/modules/misc/ids.nix
index 5b7fa5d2b98ff..8e5bb69a40620 100644
--- a/nixos/modules/misc/ids.nix
+++ b/nixos/modules/misc/ids.nix
@@ -44,7 +44,7 @@
vsftpd = 7;
ftp = 8;
bitlbee = 9;
- avahi = 10;
+ #avahi = 10; # removed 2019-05-22
nagios = 11;
atd = 12;
postfix = 13;
@@ -358,7 +358,7 @@
vsftpd = 7;
ftp = 8;
bitlbee = 9;
- avahi = 10;
+ #avahi = 10; # removed 2019-05-22
#nagios = 11; # unused
atd = 12;
postfix = 13;
diff --git a/nixos/modules/services/networking/avahi-daemon.nix b/nixos/modules/services/networking/avahi-daemon.nix
index 4c91a0c415b60..4b8e06044b406 100644
--- a/nixos/modules/services/networking/avahi-daemon.nix
+++ b/nixos/modules/services/networking/avahi-daemon.nix
@@ -1,10 +1,8 @@
-# Avahi daemon.
{ config, lib, pkgs, ... }:
with lib;
let
-
cfg = config.services.avahi;
yesNo = yes : if yes then "yes" else "no";
@@ -39,215 +37,241 @@ let
enable-reflector=${yesNo reflector}
${extraConfig}
'';
-
in
-
{
+ options.services.avahi = {
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether to run the Avahi daemon, which allows Avahi clients
+ to use Avahi's service discovery facilities and also allows
+ the local machine to advertise its presence and services
+ (through the mDNS responder implemented by `avahi-daemon').
+ '';
+ };
- ###### interface
+ hostName = mkOption {
+ type = types.str;
+ default = config.networking.hostName;
+ defaultText = "config.networking.hostName";
+ description = ''
+ Host name advertised on the LAN. If not set, avahi will use the value
+ of config.networking.hostName.
+ '';
+ };
- options = {
+ domainName = mkOption {
+ type = types.str;
+ default = "local";
+ description = ''
+ Domain name for all advertisements.
+ '';
+ };
- services.avahi = {
+ browseDomains = mkOption {
+ type = types.listOf types.str;
+ default = [ ];
+ example = [ "0pointer.de" "zeroconf.org" ];
+ description = ''
+ List of non-local DNS domains to be browsed.
+ '';
+ };
- enable = mkOption {
- default = false;
- description = ''
- Whether to run the Avahi daemon, which allows Avahi clients
- to use Avahi's service discovery facilities and also allows
- the local machine to advertise its presence and services
- (through the mDNS responder implemented by `avahi-daemon').
- '';
- };
+ ipv4 = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''Whether to use IPv4'';
+ };
- hostName = mkOption {
- type = types.str;
- description = ''
- Host name advertised on the LAN. If not set, avahi will use the value
- of config.networking.hostName.
- '';
- };
+ ipv6 = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''Whether to use IPv6'';
+ };
- domainName = mkOption {
- type = types.str;
- default = "local";
- description = ''
- Domain name for all advertisements.
- '';
- };
+ interfaces = mkOption {
+ type = types.nullOr (types.listOf types.str);
+ default = null;
+ description = ''
+ List of network interfaces that should be used by the avahi-daemon.
+ Other interfaces will be ignored. If null all local interfaces
+ except loopback and point-to-point will be used.
+ '';
+ };
- browseDomains = mkOption {
- default = [ ];
- example = [ "0pointer.de" "zeroconf.org" ];
- description = ''
- List of non-local DNS domains to be browsed.
- '';
- };
+ openFirewall = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''
+ Wether to open the firewall for UDP port 5353.
+ '';
+ };
- ipv4 = mkOption {
- default = true;
- description = ''Whether to use IPv4'';
- };
+ allowPointToPoint = mkOption {
+ type = types.bool;
+ default = false;
+ description= ''
+ Whether to use POINTTOPOINT interfaces. Might make mDNS unreliable due to usually large
+ latencies with such links and opens a potential security hole by allowing mDNS access from Internet
+ connections. Use with care and YMMV!
+ '';
+ };
- ipv6 = mkOption {
- default = false;
- description = ''Whether to use IPv6'';
- };
+ wideArea = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''Whether to enable wide-area service discovery.'';
+ };
- interfaces = mkOption {
- type = types.nullOr (types.listOf types.str);
- default = null;
- description = ''
- List of network interfaces that should be used by the avahi-daemon.
- Other interfaces will be ignored. If null all local interfaces
- except loopback and point-to-point will be used.
- '';
- };
+ reflector = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''Reflect incoming mDNS requests to all allowed network interfaces.'';
+ };
- allowPointToPoint = mkOption {
- default = false;
- description= ''
- Whether to use POINTTOPOINT interfaces. Might make mDNS unreliable due to usually large
- latencies with such links and opens a potential security hole by allowing mDNS access from Internet
- connections. Use with care and YMMV!
- '';
- };
+ extraServiceFiles = mkOption {
+ type = types.attrsOf types.str;
+ default = {};
+ example = literalExample ''
+ {
+ ssh = "''${pkgs.avahi}/etc/avahi/services/ssh.service";
+ smb = '''
+
+
+
+ %h
+
+ _smb._tcp
+ 445
+
+
+ ''';
+ }
+ '';
+ description = ''
+ Specify custom service definitions which are placed in the avahi service directory.
+ See the avahi.service(5) manpage for detailed information.
+ '';
+ };
- wideArea = mkOption {
- default = true;
- description = ''Whether to enable wide-area service discovery.'';
+ publish = {
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''Whether to allow publishing in general.'';
};
- reflector = mkOption {
+ userServices = mkOption {
+ type = types.bool;
default = false;
- description = ''Reflect incoming mDNS requests to all allowed network interfaces.'';
+ description = ''Whether to publish user services. Will set addresses=true.'';
};
- publish = {
- enable = mkOption {
- default = false;
- description = ''Whether to allow publishing in general.'';
- };
-
- userServices = mkOption {
- default = false;
- description = ''Whether to publish user services. Will set addresses=true.'';
- };
-
- addresses = mkOption {
- default = false;
- description = ''Whether to register mDNS address records for all local IP addresses.'';
- };
-
- hinfo = mkOption {
- default = false;
- description = ''
- Whether to register an mDNS HINFO record which contains information about the
- local operating system and CPU.
- '';
- };
-
- workstation = mkOption {
- default = false;
- description = ''Whether to register a service of type "_workstation._tcp" on the local LAN.'';
- };
-
- domain = mkOption {
- default = false;
- description = ''Whether to announce the locally used domain name for browsing by other hosts.'';
- };
-
+ addresses = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''Whether to register mDNS address records for all local IP addresses.'';
};
- nssmdns = mkOption {
+ hinfo = mkOption {
+ type = types.bool;
default = false;
description = ''
- Whether to enable the mDNS NSS (Name Service Switch) plug-in.
- Enabling it allows applications to resolve names in the `.local'
- domain by transparently querying the Avahi daemon.
+ Whether to register an mDNS HINFO record which contains information about the
+ local operating system and CPU.
'';
};
- cacheEntriesMax = mkOption {
- default = null;
- type = types.nullOr types.int;
- description = ''
- Number of resource records to be cached per interface. Use 0 to
- disable caching. Avahi daemon defaults to 4096 if not set.
- '';
+ workstation = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''Whether to register a service of type "_workstation._tcp" on the local LAN.'';
};
- extraConfig = mkOption {
- default = "";
- type = types.lines;
- description = ''
- Extra config to append to avahi-daemon.conf.
- '';
+ domain = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''Whether to announce the locally used domain name for browsing by other hosts.'';
};
-
};
- };
+ nssmdns = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether to enable the mDNS NSS (Name Service Switch) plug-in.
+ Enabling it allows applications to resolve names in the `.local'
+ domain by transparently querying the Avahi daemon.
+ '';
+ };
+ cacheEntriesMax = mkOption {
+ type = types.nullOr types.int;
+ default = null;
+ description = ''
+ Number of resource records to be cached per interface. Use 0 to
+ disable caching. Avahi daemon defaults to 4096 if not set.
+ '';
+ };
- ###### implementation
+ extraConfig = mkOption {
+ type = types.lines;
+ default = "";
+ description = ''
+ Extra config to append to avahi-daemon.conf.
+ '';
+ };
+ };
config = mkIf cfg.enable {
+ users.users.avahi = {
+ description = "`avahi-daemon' privilege separation user";
+ home = "/var/empty";
+ group = "avahi";
+ };
- services.avahi.hostName = mkDefault config.networking.hostName;
-
- users.users = singleton
- { name = "avahi";
- uid = config.ids.uids.avahi;
- description = "`avahi-daemon' privilege separation user";
- home = "/var/empty";
- };
-
- users.groups = singleton
- { name = "avahi";
- gid = config.ids.gids.avahi;
- };
+ users.groups.avahi = {};
system.nssModules = optional cfg.nssmdns pkgs.nssmdns;
environment.systemPackages = [ pkgs.avahi ];
- systemd.sockets.avahi-daemon =
- { description = "Avahi mDNS/DNS-SD Stack Activation Socket";
- listenStreams = [ "/run/avahi-daemon/socket" ];
- wantedBy = [ "sockets.target" ];
- };
+ environment.etc = (mapAttrs' (n: v: nameValuePair
+ "avahi/services/${n}.service"
+ (if builtins.substring 0 1 v == "/" then { source = v; } else { text = v; })
+ ) cfg.extraServiceFiles);
- systemd.services.avahi-daemon =
- { description = "Avahi mDNS/DNS-SD Stack";
- wantedBy = [ "multi-user.target" ];
- requires = [ "avahi-daemon.socket" ];
+ systemd.sockets.avahi-daemon = {
+ description = "Avahi mDNS/DNS-SD Stack Activation Socket";
+ listenStreams = [ "/run/avahi-daemon/socket" ];
+ wantedBy = [ "sockets.target" ];
+ };
- serviceConfig."NotifyAccess" = "main";
- serviceConfig."BusName" = "org.freedesktop.Avahi";
- serviceConfig."Type" = "dbus";
+ systemd.services.avahi-daemon = {
+ description = "Avahi mDNS/DNS-SD Stack";
+ wantedBy = [ "multi-user.target" ];
+ requires = [ "avahi-daemon.socket" ];
- path = [ pkgs.coreutils pkgs.avahi ];
+ # Make NSS modules visible so that `avahi_nss_support ()' can
+ # return a sensible value.
+ environment.LD_LIBRARY_PATH = config.system.nssModules.path;
- preStart = "mkdir -p /run/avahi-daemon";
+ path = [ pkgs.coreutils pkgs.avahi ];
- script =
- ''
- # Make NSS modules visible so that `avahi_nss_support ()' can
- # return a sensible value.
- export LD_LIBRARY_PATH="${config.system.nssModules.path}"
+ preStart = "mkdir -p /run/avahi-daemon";
- exec ${pkgs.avahi}/sbin/avahi-daemon --syslog -f "${avahiDaemonConf}"
- '';
+ serviceConfig = {
+ NotifyAccess = "main";
+ BusName = "org.freedesktop.Avahi";
+ Type = "dbus";
+ ExecStart = "${pkgs.avahi}/sbin/avahi-daemon --syslog -f ${avahiDaemonConf}";
};
+ };
services.dbus.enable = true;
services.dbus.packages = [ pkgs.avahi ];
- # Enabling Avahi without exposing it in the firewall doesn't make
- # sense.
- networking.firewall.allowedUDPPorts = [ 5353 ];
-
+ networking.firewall.allowedUDPPorts = mkIf cfg.openFirewall [ 5353 ];
};
-
}
diff --git a/pkgs/development/libraries/avahi/default.nix b/pkgs/development/libraries/avahi/default.nix
index f276d0bf12ee3..b7f682990afba 100644
--- a/pkgs/development/libraries/avahi/default.nix
+++ b/pkgs/development/libraries/avahi/default.nix
@@ -44,6 +44,8 @@ stdenv.mkDerivation rec {
# autoipd won't build on darwin
++ stdenv.lib.optional stdenv.isDarwin "--disable-autoipd";
+ NIX_CFLAGS_COMPILE = "-DAVAHI_SERVICE_DIR=\"/etc/avahi/services\"";
+
preBuild = stdenv.lib.optionalString stdenv.isDarwin ''
sed -i '20 i\
#define __APPLE_USE_RFC_2292' \