calDAVtoCSV/flake.nix
2025-11-17 17:42:26 +01:00

108 lines
3.7 KiB
Nix

{
description =
"A flake for calDAVtoCSV, a middleman program between my Radicale server and my ESP32";
inputs = {
nixpkgs.url =
"github:nixos/nixpkgs/nixos-unstable"; # Specify the version or channel as needed
};
outputs = { self, nixpkgs, ... }:
let pkgs = nixpkgs.legacyPackages.x86_64-linux;
in {
nixosModules.calDavToCsv = { config, lib, pkgs, ... }:
let
flaskApp = ./main.py;
cfg = config.services.calDavToCsv;
python-env = pkgs.python3.withPackages (ps: [ ps.flask ps.caldav ]);
app_ini = pkgs.writeText "api.ini" ''
[uwsgi]
wsgi-file = ${flaskApp}
callable = app
http = :${toString cfg.port}
processes = 1
threads = 1
master = true
chmod-socket = 660
vacuum = true
plugins = python3
die-on-term = true
uid = calDAVtoCSV
gid = calDAVtoCSV
'';
uwsgi = pkgs.uwsgi.override {
python3 = python-env;
plugins = [ "python3" ];
};
run-with-wsgi = pkgs.writeShellApplication {
name = "run-app";
text = ''
export PYTHONPATH="${python-env}/lib/python${
builtins.substring 0 4 python-env.python.version
}/site-packages"
${uwsgi}/bin/uwsgi --ini ${app_ini}
'';
};
in {
options.services.calDavToCsv = {
enable = lib.mkEnableOption "calDavToCsv";
port = lib.mkOption {
type = lib.types.int;
default = 8000;
description = "Port on which calDAVtoCSV will listen";
};
calendarUrl = lib.mkOption {
type = lib.types.str;
description = "url of the calendar";
};
calendarUsername = lib.mkOption {
type = lib.types.str;
description = "username of the calendar account";
};
calendarName = lib.mkOption {
type = lib.types.str;
description =
"name of the calendar we will fetch the todo items from";
};
calendarPasswordFile = lib.mkOption {
type = lib.types.str;
description =
"file where we need to look for password to connect, needs to be readeable by the service user";
};
package = lib.mkOption {
type = lib.types.package;
default = self.packages.x86_64-linux.calDavToCsv;
};
};
config = lib.mkIf cfg.enable {
environment.etc."calDAVtoCSV/config.ini".text = ''
[calDAV]
address = ${cfg.calendarUrl}
username = ${cfg.calendarUsername}
calendarName = ${cfg.calendarName}
passwordFile = ${cfg.calendarPasswordFile}
[server]
port = ${toString cfg.port}
'';
users.groups."calDAVtoCSV".name = "calDAVtoCSV";
users.users."calDAVtoCSV" = {
name = "calDAVtoCSV";
isSystemUser = true;
group = "calDAVtoCSV";
};
systemd.services.calDavToCsv = {
description =
"calDAV to CSV Service used as a middleman between my esp32 and my caldav server";
after = [ "network.target" ];
serviceConfig = {
ExecStart = "${run-with-wsgi}/bin/run-app";
Restart = "on-failure";
};
wantedBy = [ "multi-user.target" ];
};
};
};
};
}