use module-based-service for hostapd

This commit is contained in:
Daniel Barlow 2023-07-16 17:50:06 +01:00
parent 17abd42cf3
commit 648ea5613b
3 changed files with 40 additions and 14 deletions

View file

@ -0,0 +1,13 @@
{ lib, pkgs, config, ...}:
let
inherit (lib) mkOption types;
in {
options = {
system.service.hostapd = mkOption {
type = types.functionTo types.package;
};
};
config = {
system.service.hostapd = pkgs.callPackage ./service.nix {};
};
}

View file

@ -0,0 +1,51 @@
{
liminix
, hostapd
, writeText
, lib
}:
let
inherit (liminix.services) longrun;
inherit (lib) concatStringsSep mapAttrsToList;
inherit (liminix.lib) typeChecked;
inherit (lib) mkOption types;
# This is not a friendly interface to configuring a wireless AP: it
# just passes everything straight through to the hostapd config.
# When we've worked out what the sensible options are to expose,
# we'll add them as top-level attributes and rename params to
# extraParams
t = {
interface = mkOption {
type = liminix.lib.types.service;
};
params = mkOption {
type = types.attrs;
};
};
in
args:
let
inherit (typeChecked "hostapd" t args)
interface params;
name = "${interface.device}.hostapd";
defaults = {
driver = "nl80211";
logger_syslog = "-1";
logger_syslog_level = 1;
ctrl_interface = "/run/hostapd";
ctrl_interface_group = 0;
};
conf = writeText "hostapd.conf"
(concatStringsSep
"\n"
(mapAttrsToList
(name: value: "${name}=${toString value}")
(defaults // params)));
in longrun {
inherit name;
dependencies = [ interface ];
run = "${hostapd}/bin/hostapd -i ${interface.device} -P /run/${name}.pid -S ${conf}";
}