1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6
7 cfg = config.services.octoprint;
8
9 cfgUpdate = pkgs.writeText "octoprint-config.yaml" (builtins.toJSON {
10 plugins.cura.cura_engine = "${pkgs.curaengine}/bin/CuraEngine";
11 server.host = cfg.host;
12 server.port = cfg.port;
13 webcam.ffmpeg = "${pkgs.ffmpeg}/bin/ffmpeg";
14 });
15
16 pluginsEnv = pkgs.python.buildEnv.override {
17 extraLibs = cfg.plugins pkgs.octoprint-plugins;
18 };
19
20in
21{
22 ##### interface
23
24 options = {
25
26 services.octoprint = {
27
28 enable = mkEnableOption "OctoPrint, web interface for 3D printers";
29
30 host = mkOption {
31 type = types.str;
32 default = "0.0.0.0";
33 description = ''
34 Host to bind OctoPrint to.
35 '';
36 };
37
38 port = mkOption {
39 type = types.int;
40 default = 5000;
41 description = ''
42 Port to bind OctoPrint to.
43 '';
44 };
45
46 user = mkOption {
47 type = types.str;
48 default = "octoprint";
49 description = "User for the daemon.";
50 };
51
52 group = mkOption {
53 type = types.str;
54 default = "octoprint";
55 description = "Group for the daemon.";
56 };
57
58 stateDir = mkOption {
59 type = types.path;
60 default = "/var/lib/octoprint";
61 description = "State directory of the daemon.";
62 };
63
64 plugins = mkOption {
65 default = plugins: [];
66 example = literalExample "plugins: [ m3d-fio ]";
67 description = "Additional plugins.";
68 };
69
70 };
71
72 };
73
74 ##### implementation
75
76 config = mkIf cfg.enable {
77
78 users.extraUsers = optionalAttrs (cfg.user == "octoprint") (singleton
79 { name = "octoprint";
80 group = cfg.group;
81 uid = config.ids.uids.octoprint;
82 });
83
84 users.extraGroups = optionalAttrs (cfg.group == "octoprint") (singleton
85 { name = "octoprint";
86 gid = config.ids.gids.octoprint;
87 });
88
89 systemd.services.octoprint = {
90 description = "OctoPrint, web interface for 3D printers";
91 wantedBy = [ "multi-user.target" ];
92 after = [ "network.target" ];
93 path = [ pluginsEnv ];
94 environment.PYTHONPATH = makeSearchPath pkgs.python.sitePackages [ pluginsEnv ];
95
96 preStart = ''
97 mkdir -p "${cfg.stateDir}"
98 if [ -e "${cfg.stateDir}/config.yaml" ]; then
99 ${pkgs.yaml-merge}/bin/yaml-merge "${cfg.stateDir}/config.yaml" "${cfgUpdate}" > "${cfg.stateDir}/config.yaml.tmp"
100 mv "${cfg.stateDir}/config.yaml.tmp" "${cfg.stateDir}/config.yaml"
101 else
102 cp "${cfgUpdate}" "${cfg.stateDir}/config.yaml"
103 chmod 600 "${cfg.stateDir}/config.yaml"
104 fi
105 chown -R ${cfg.user}:${cfg.group} "${cfg.stateDir}"
106 '';
107
108 serviceConfig = {
109 ExecStart = "${pkgs.octoprint}/bin/octoprint -b ${cfg.stateDir}";
110 User = cfg.user;
111 Group = cfg.group;
112 PermissionsStartOnly = true;
113 };
114 };
115
116 };
117
118}