108 lines
3.7 KiB
Nix
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" ];
|
|
};
|
|
};
|
|
};
|
|
};
|
|
}
|