summary refs log tree commit diff
path: root/nixos/modules/services/networking/wakeonlan.nix
blob: f41b6ec27405fc30a6175803b4a4466957da61c8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
{ config, lib, pkgs, ... }:

with lib;

let
  interfaces = config.services.wakeonlan.interfaces;

  ethtool = "${pkgs.ethtool}/sbin/ethtool";

  passwordParameter = password : if (password == "") then "" else
    "sopass ${password}";

  methodParameter = {method, password} :
    if method == "magicpacket" then "wol g"
    else if method == "password" then "wol s so ${passwordParameter password}"
    else throw "Wake-On-Lan method not supported";

  line = { interface, method ? "magicpacket", password ? "" }: ''
    ${ethtool} -s ${interface} ${methodParameter {inherit method password;}}
  '';

  concatStrings = foldr (x: y: x + y) "";
  lines = concatStrings (map (l: line l) interfaces);

in
{

  ###### interface

  options = {

    services.wakeonlan.interfaces = mkOption {
      default = [ ];
      example = [
        {
          interface = "eth0";
          method = "password";
          password = "00:11:22:33:44:55";
        }
      ];
      description = ''
        Interfaces where to enable Wake-On-LAN, and how. Two methods available:
        "magicpacket" and "password". The password has the shape of six bytes
        in hexadecimal separated by a colon each. For more information,
        check the ethtool manual.
      '';
    };

  };


  ###### implementation

  config.powerManagement.powerUpCommands = lines;

}