1{
2 config,
3 lib,
4 pkgs,
5 ...
6}:
7
8let
9 json = pkgs.formats.json { };
10 cfg = config.programs.openvpn3;
11
12 inherit (lib)
13 mkEnableOption
14 mkPackageOption
15 mkOption
16 literalExpression
17 max
18 options
19 lists
20 ;
21 inherit (lib.types) bool submodule ints;
22in
23{
24 options.programs.openvpn3 = {
25 enable = mkEnableOption "the openvpn3 client";
26 package = mkPackageOption pkgs "openvpn3" { };
27 netcfg = mkOption {
28 description = "Network configuration";
29 default = { };
30 type = submodule {
31 options = {
32 settings = mkOption {
33 description = "Options stored in {file}`/etc/openvpn3/netcfg.json` configuration file";
34 default = { };
35 type = submodule {
36 freeformType = json.type;
37 options = {
38 systemd_resolved = mkOption {
39 type = bool;
40 description = "Whether to use systemd-resolved integration";
41 default = config.services.resolved.enable;
42 defaultText = literalExpression "config.services.resolved.enable";
43 example = false;
44 };
45 };
46 };
47 };
48 };
49 };
50 };
51 log-service = mkOption {
52 description = "Log service configuration";
53 default = { };
54 type = submodule {
55 options = {
56 settings = mkOption {
57 description = "Options stored in {file}`/etc/openvpn3/log-service.json` configuration file";
58 default = { };
59 type = submodule {
60 freeformType = json.type;
61 options = {
62 journald = mkOption {
63 description = "Use systemd-journald";
64 type = bool;
65 default = true;
66 example = false;
67 };
68 log_dbus_details = mkOption {
69 description = "Add D-Bus details in log file/syslog";
70 type = bool;
71 default = true;
72 example = false;
73 };
74 log_level = mkOption {
75 description = "How verbose should the logging be";
76 type = (ints.between 0 7) // {
77 merge = _loc: defs: lists.foldl max 0 (options.getValues defs);
78 };
79 default = 3;
80 example = 6;
81 };
82 timestamp = mkOption {
83 description = "Add timestamp log file";
84 type = bool;
85 default = false;
86 example = true;
87 };
88 };
89 };
90 };
91 };
92 };
93 };
94 };
95
96 config = lib.mkIf cfg.enable {
97 services.dbus.packages = [ cfg.package ];
98
99 users.users.openvpn = {
100 isSystemUser = true;
101 uid = config.ids.uids.openvpn;
102 group = "openvpn";
103 };
104
105 users.groups.openvpn = {
106 gid = config.ids.gids.openvpn;
107 };
108
109 environment = {
110 systemPackages = [ cfg.package ];
111 etc = {
112 "openvpn3/netcfg.json".source = json.generate "netcfg.json" cfg.netcfg.settings;
113 "openvpn3/log-service.json".source = json.generate "log-service.json" cfg.log-service.settings;
114 };
115 };
116
117 systemd = {
118 packages = [ cfg.package ];
119 tmpfiles.rules = [
120 "d /etc/openvpn3/configs 0750 openvpn openvpn - -"
121 ];
122 };
123 };
124
125 meta.maintainers = with lib.maintainers; [
126 shamilton
127 progrm_jarvis
128 ];
129}