Simon Bruder
10b8d432d5
This applies the REUSE specification to the repository, so the licensing information can be tracked for every file individually.
74 lines
2.2 KiB
Nix
74 lines
2.2 KiB
Nix
# SPDX-FileCopyrightText: 2021 Simon Bruder <simon@sbruder.de>
|
|
#
|
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
# 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);
|
|
}
|