{ 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" ]; }; }; }; }; }