2024-01-06 01:19:35 +01:00
|
|
|
# SPDX-FileCopyrightText: 2021 Simon Bruder <simon@sbruder.de>
|
|
|
|
#
|
|
|
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
|
2021-02-15 12:09:55 +01:00
|
|
|
# This module implements an option with the same structure as the nginx module
|
|
|
|
# but does not extend the nginx module since that would cause infinite
|
|
|
|
# recursion.
|
|
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
let
|
|
|
|
enabledLocations = lib.fold
|
|
|
|
(x: a: a ++ x)
|
|
|
|
[ ]
|
|
|
|
(lib.mapAttrsToList
|
|
|
|
(vhostName: vhostConfig: lib.mapAttrsToList
|
|
|
|
(locationName: locationConfig: [ vhostName locationName ])
|
|
|
|
(lib.filterAttrs
|
|
|
|
(_: location: location.enable)
|
|
|
|
vhostConfig.locations))
|
|
|
|
config.services.nginx-interactive-index.virtualHosts);
|
|
|
|
in
|
|
|
|
{
|
|
|
|
options.services.nginx-interactive-index.virtualHosts = with lib.types; lib.mkOption {
|
|
|
|
default = { };
|
|
|
|
type = attrsOf (submodule {
|
|
|
|
options = {
|
|
|
|
locations = lib.mkOption {
|
|
|
|
default = { };
|
|
|
|
type = attrsOf (submodule {
|
|
|
|
options = {
|
|
|
|
enable = lib.mkEnableOption "interactive directory index";
|
|
|
|
};
|
|
|
|
});
|
|
|
|
};
|
|
|
|
};
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
config.services.nginx.virtualHosts = lib.fold
|
|
|
|
(x: a: a // x)
|
|
|
|
{ }
|
|
|
|
(map
|
|
|
|
(path:
|
|
|
|
let
|
|
|
|
vhost = lib.elemAt path 0;
|
|
|
|
location = lib.elemAt path 1;
|
|
|
|
assetsPath = "${location}__nginx-interactive-index-assets__";
|
|
|
|
in
|
|
|
|
{
|
|
|
|
"${vhost}".locations = {
|
|
|
|
"${location}" = {
|
|
|
|
extraConfig = ''
|
|
|
|
autoindex on;
|
|
|
|
autoindex_exact_size on;
|
|
|
|
add_before_body ${assetsPath}/header.html;
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
"${assetsPath}/" = {
|
|
|
|
alias = "${builtins.filterSource
|
|
|
|
(path: type: baseNameOf path != "default.nix")
|
|
|
|
./.}/";
|
|
|
|
};
|
|
|
|
"=${assetsPath}/header.html" = {
|
|
|
|
alias = pkgs.writeText "nginx-interactive-index-${location}-header.html" ''
|
|
|
|
<!DOCTYPE html>
|
|
|
|
<meta charset="utf-8">
|
|
|
|
<link rel="stylesheet" href="${assetsPath}/listing.css">
|
|
|
|
<script src="${assetsPath}/listing.js"></script>
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
};
|
|
|
|
})
|
|
|
|
enabledLocations);
|
|
|
|
}
|