83 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{ config, lib, pkgs, ... }:
 | 
						|
 | 
						|
with lib;
 | 
						|
 | 
						|
let
 | 
						|
 | 
						|
  inherit (pkgs) ifplugd;
 | 
						|
 | 
						|
  cfg = config.networking.interfaceMonitor;
 | 
						|
 | 
						|
  # The ifplugd action script, which is called whenever the link
 | 
						|
  # status changes (i.e., a cable is plugged in or unplugged).
 | 
						|
  plugScript = pkgs.writeScript "ifplugd.action"
 | 
						|
    ''
 | 
						|
      #! ${pkgs.stdenv.shell}
 | 
						|
      iface="$1"
 | 
						|
      status="$2"
 | 
						|
      ${cfg.commands}
 | 
						|
    '';
 | 
						|
 | 
						|
in
 | 
						|
 | 
						|
{
 | 
						|
 | 
						|
  ###### interface
 | 
						|
 | 
						|
  options = {
 | 
						|
 | 
						|
    networking.interfaceMonitor.enable = mkOption {
 | 
						|
      type = types.bool;
 | 
						|
      default = false;
 | 
						|
      description = ''
 | 
						|
        If <literal>true</literal>, monitor Ethernet interfaces for
 | 
						|
        cables being plugged in or unplugged.  When this occurs, the
 | 
						|
        commands specified in
 | 
						|
        <option>networking.interfaceMonitor.commands</option> are
 | 
						|
        executed.
 | 
						|
      '';
 | 
						|
    };
 | 
						|
 | 
						|
    networking.interfaceMonitor.beep = mkOption {
 | 
						|
      type = types.bool;
 | 
						|
      default = false;
 | 
						|
      description = ''
 | 
						|
        If <literal>true</literal>, beep when an Ethernet cable is
 | 
						|
        plugged in or unplugged.
 | 
						|
      '';
 | 
						|
    };
 | 
						|
 | 
						|
    networking.interfaceMonitor.commands = mkOption {
 | 
						|
      type = types.lines;
 | 
						|
      default = "";
 | 
						|
      description = ''
 | 
						|
        Shell commands to be executed when the link status of an
 | 
						|
        interface changes.  On invocation, the shell variable
 | 
						|
        <varname>iface</varname> contains the name of the interface,
 | 
						|
        while the variable <varname>status</varname> contains either
 | 
						|
        <literal>up</literal> or <literal>down</literal> to indicate
 | 
						|
        the new status.
 | 
						|
      '';
 | 
						|
    };
 | 
						|
 | 
						|
  };
 | 
						|
 | 
						|
 | 
						|
  ###### implementation
 | 
						|
 | 
						|
  config = mkIf cfg.enable {
 | 
						|
    systemd.services.ifplugd = {
 | 
						|
      description = "Network interface connectivity monitor";
 | 
						|
      after = [ "network-interfaces.target" ];
 | 
						|
      wantedBy = [ "multi-user.target" ];
 | 
						|
      script = ''
 | 
						|
        ${ifplugd}/sbin/ifplugd --no-daemon --no-startup --no-shutdown \
 | 
						|
          ${if config.networking.interfaceMonitor.beep then "" else "--no-beep"} \
 | 
						|
          --run ${plugScript}
 | 
						|
      '';
 | 
						|
    };
 | 
						|
 | 
						|
    environment.systemPackages = [ ifplugd ];
 | 
						|
  };
 | 
						|
}
 |