dhcp_server.ncdi 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. include_guard "dhcp_server"
  2. template dhcp_server {
  3. alias("_arg0") addr;
  4. alias("_arg1") prefix;
  5. alias("_arg2") range_start;
  6. alias("_arg3") range_end;
  7. alias("_arg4") routers;
  8. alias("_arg5") dns_servers;
  9. # Choose lease file.
  10. concat("/var/lib/dhcp/dhcpd-", addr, ".leases") leases_file;
  11. # Create leases file if it doesn't exist.
  12. file_stat(leases_file) stat;
  13. If (stat.succeeded) { print(); } Else {
  14. file_write(leases_file, "");
  15. };
  16. # Create a temporary directory.
  17. concat("/run/ncd-dhcp-server-", addr) run_dir;
  18. run({"/bin/rm", "-rf", run_dir}, {});
  19. run({"/bin/mkdir", run_dir}, {"/bin/rm", "-rf", run_dir});
  20. # Compute path for dhcp.conf.
  21. concat(run_dir, "/dhcp.conf") dhcp_conf_path;
  22. # This is a template for dhcp.conf.
  23. var("
  24. default-lease-time 43200;
  25. max-lease-time 43200;
  26. log-facility local7;
  27. ddns-update-style none;
  28. local-address <LOCAL_ADDRESS>;
  29. subnet <NETWORK> netmask <NETMASK> {
  30. authoritative;
  31. range <RANGE_START> <RANGE_END>;
  32. option routers <ROUTERS>;
  33. option domain-name-servers <DNS_SERVERS>;
  34. }
  35. " ) config_template;
  36. # Compute some of the variables.
  37. ipv4_net_from_addr_and_prefix(addr, prefix) network;
  38. ipv4_prefix_to_mask(prefix) netmask;
  39. implode(", ", routers) routers_str;
  40. implode(", ", dns_servers) dns_servers_str;
  41. # Perform substitutions.
  42. var({"<LOCAL_ADDRESS>", "<NETWORK>", "<NETMASK>", "<RANGE_START>", "<RANGE_END>", "<ROUTERS>", "<DNS_SERVERS>"}) regex;
  43. var({addr, network, netmask, range_start, range_end, routers_str, dns_servers_str}) replace;
  44. regex_replace(config_template, regex, replace) config_data;
  45. # Write dhcp.conf.
  46. file_write(dhcp_conf_path, config_data);
  47. # Start dhcpd.
  48. daemon({"/usr/sbin/dhcpd", "-f", "-cf", dhcp_conf_path, "-user", "dhcp", "-group", "dhcp", "--no-pid", "-lf", leases_file});
  49. }