From 4a24f168e3fb44073237d9aca95a97e77bdefa3c Mon Sep 17 00:00:00 2001 From: Quentin Aristote Date: Sun, 27 Nov 2022 17:41:34 +0100 Subject: services: web: rss: make configuration into a module --- config/services/web/rss/default.nix | 53 ++++++++++++++++++--------- modules/default.nix | 1 + modules/rss-bridge.nix | 71 +++++++++++++++++++++++++++++++++++++ tests/configuration.nix | 2 ++ 4 files changed, 111 insertions(+), 16 deletions(-) create mode 100644 modules/rss-bridge.nix diff --git a/config/services/web/rss/default.nix b/config/services/web/rss/default.nix index 18a6763..acc9331 100644 --- a/config/services/web/rss/default.nix +++ b/config/services/web/rss/default.nix @@ -2,31 +2,52 @@ let cfg = config.services.rss-bridge; - debug = true; - rss-bridge = pkgs.rss-bridge.overrideAttrs (oldAttrs: - oldAttrs // { - installPhase = oldAttrs.installPhase + '' - pushd $out/bridges - ln -sf ${./ParisJazzClubBridge.php} ParisJazzClubBridge.php - ln -sf ${./MaisonDeLaRadioBridge.php} MaisonDeLaRadioBridge.php - ln -sf ${./FipAlbumsBridge.php} FipAlbumsBridge.php - ln -sf ${./WhatsOnMubiBridge.php} WhatsOnMubiBridge.php - popd - '' + lib.optionalString debug '' - touch $out/DEBUG - ''; - }); + # debug = true; + # rss-bridge = pkgs.rss-bridge.overrideAttrs (oldAttrs: + # oldAttrs // { + # installPhase = oldAttrs.installPhase + '' + # pushd $out/bridges + # ln -sf ${./ParisJazzClubBridge.php} ParisJazzClubBridge.php + # ln -sf ${./MaisonDeLaRadioBridge.php} MaisonDeLaRadioBridge.php + # ln -sf ${./FipAlbumsBridge.php} FipAlbumsBridge.php + # ln -sf ${./WhatsOnMubiBridge.php} WhatsOnMubiBridge.php + # popd + # '' + lib.optionalString debug '' + # touch $out/DEBUG + # ''; + # }); in { services.rss-bridge = { enable = true; - whitelist = [ "ParisJazzClub" "MaisonDeLaRadio" "FipAlbumsBridge" "WhatsOnMubi" ]; + # whitelist = [ "ParisJazzClub" "MaisonDeLaRadio" "FipAlbumsBridge" "WhatsOnMubi" ]; + extraBridges = [ + # Music + { + name = "FipAlbums"; + source = ./FipAlbumsBridge.php; + } + ## Concerts + { + name = "ParisJazzClub"; + source = ./ParisJazzClubBridge.php; + } + { + name = "MaisonDeLaRadio"; + source = ./MaisonDeLaRadioBridge.php; + } + # Cinema + { + name = "WhatsOnMubi"; + source = ./WhatsOnMubiBridge.php; + } + ]; virtualHost = "rss"; }; services.nginx = lib.mkIf (cfg.virtualHost != null) { virtualHosts.${cfg.virtualHost} = { serverName = "rss.${config.networking.domain}"; - root = lib.mkForce "${rss-bridge}"; + # root = lib.mkForce "${rss-bridge}"; forceSSL = true; enableACME = true; }; diff --git a/modules/default.nix b/modules/default.nix index d09a8c0..95f75b4 100644 --- a/modules/default.nix +++ b/modules/default.nix @@ -3,5 +3,6 @@ { imports = [ ./filtron.nix + ./rss-bridge.nix ]; } diff --git a/modules/rss-bridge.nix b/modules/rss-bridge.nix new file mode 100644 index 0000000..c7aaf05 --- /dev/null +++ b/modules/rss-bridge.nix @@ -0,0 +1,71 @@ +{ config, lib, pkgs, ... }: + +with lib; +let + cfg = config.services.rss-bridge; + rss-bridge = pkgs.rss-bridge.overrideAttrs (oldAttrs: + oldAttrs // { + installPhase = oldAttrs.installPhase + '' + pushd $out/bridges + ln -sf ${./ParisJazzClubBridge.php} ParisJazzClubBridge.php + ln -sf ${./MaisonDeLaRadioBridge.php} MaisonDeLaRadioBridge.php + ln -sf ${./FipAlbumsBridge.php} FipAlbumsBridge.php + ln -sf ${./WhatsOnMubiBridge.php} WhatsOnMubiBridge.php + popd + '' + lib.optionalString debug '' + touch $out/DEBUG + ''; + }); +in { + options.services.rss-bridge = { + package = mkOption { + type = types.package; + description = "Which derivation to use."; + default = pkgs.rss-bridge; + defaultText = literalExample "pkgs.rss-bridge"; + }; + debug = mkEnableOption "debug mode"; + extraBridges = mkOption { + type = types.listOf (types.submodule { + options = { + name = mkOption { + type = types.strMatching "[a-zA-Z0-9]*"; + description = '' + The name of the bridge. + It need not include 'Bridge' at the end, unlike required in RSS-Bridge. + ''; + example = "SomeAppWithANewsletter"; + }; + source = mkOption { + type = types.path; + description = '' + The path to a file whose contents is the PHP sourcecode of the bridge. + See also the RSS-Bridge documentation: https://rss-bridge.github.io/rss-bridge/Bridge_API/index.html. + ''; + }; + }; + }); + default = [ ]; + description = '' + A list of additional bridges that aren't already included in RSS-Bridge. + These bridges are automatically whitelisted''; + }; + }; + + config.services.rss-bridge.whitelist = + map (bridge: bridge.name) cfg.extraBridges; + config.services.nginx = mkIf (cfg.virtualHost != null) { + virtualHosts.${cfg.virtualHost}.root = mkIf (cfg.extraBridges != [ ]) + (mkForce (pkgs.runCommand "rss-bridge" { } ('' + mkdir -p $out/bridges + cp -r ${cfg.package}/* $out/ + pushd $out/bridges + '' + concatStringsSep "\n" + (map (bridge: ''ln -sf ${bridge.source} "${bridge.name}Bridge.php"'') + cfg.extraBridges) + '' + popd + '' + lib.optionalString cfg.debug '' + touch $out/DEBUG + ''))); + }; +} diff --git a/tests/configuration.nix b/tests/configuration.nix index 37b043c..a1ccf52 100644 --- a/tests/configuration.nix +++ b/tests/configuration.nix @@ -29,6 +29,8 @@ in { services.filtron.rules = lib.mkForce [ ]; + services.rss-bridge.debug = true; + services.nginx.virtualHosts = { quentin = nginxMakeLocal 8080; searx = nginxMakeLocal 8081; -- cgit v1.2.3