nixos/preload: init
[NixPkgs.git] / nixos / modules / services / home-automation / evcc.nix
blobd0ce3fb4a1ce6815e34748ae5d81b557d7ecb895
1 { lib
2 , pkgs
3 , config
4 , ...
5 }:
7 with lib;
9 let
10   cfg = config.services.evcc;
12   format = pkgs.formats.yaml {};
13   configFile = format.generate "evcc.yml" cfg.settings;
15   package = pkgs.evcc;
19   meta.maintainers = with lib.maintainers; [ hexa ];
21   options.services.evcc = with types; {
22     enable = mkEnableOption (lib.mdDoc "EVCC, the extensible EV Charge Controller with PV integration");
24     extraArgs = mkOption {
25       type = listOf str;
26       default = [];
27       description = lib.mdDoc ''
28         Extra arguments to pass to the evcc executable.
29       '';
30     };
32     settings = mkOption {
33       type = format.type;
34       description = lib.mdDoc ''
35         evcc configuration as a Nix attribute set.
37         Check for possible options in the sample [evcc.dist.yaml](https://github.com/andig/evcc/blob/${package.version}/evcc.dist.yaml].
38       '';
39     };
40   };
42   config = mkIf cfg.enable {
43     systemd.services.evcc = {
44       after = [
45         "network-online.target"
46         "mosquitto.target"
47       ];
48       wantedBy = [
49         "multi-user.target"
50       ];
51       environment.HOME = "/var/lib/evcc";
52       path = with pkgs; [
53         getent
54       ];
55       serviceConfig = {
56         ExecStart = "${package}/bin/evcc --config ${configFile} ${escapeShellArgs cfg.extraArgs}";
57         CapabilityBoundingSet = [ "" ];
58         DeviceAllow = [
59           "char-ttyUSB"
60         ];
61         DevicePolicy = "closed";
62         DynamicUser = true;
63         LockPersonality = true;
64         MemoryDenyWriteExecute = true;
65         RestrictAddressFamilies = [
66           "AF_INET"
67           "AF_INET6"
68           "AF_UNIX"
69         ];
70         RestrictNamespaces = true;
71         RestrictRealtime = true;
72         PrivateTmp = true;
73         PrivateUsers = true;
74         ProcSubset = "pid";
75         ProtectClock = true;
76         ProtectControlGroups= true;
77         ProtectHome = true;
78         ProtectHostname = true;
79         ProtectKernelLogs = true;
80         ProtectKernelModules = true;
81         ProtectKernelTunables = true;
82         ProtectProc = "invisible";
83         StateDirectory = "evcc";
84         SystemCallArchitectures = "native";
85         SystemCallFilter = [
86           "@system-service"
87           "~@privileged"
88         ];
89         UMask = "0077";
90         User = "evcc";
91       };
92     };
93   };
95   meta.buildDocsInSandbox = false;