2015-10-04 14:42:04 +00:00
|
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
|
2016-10-20 18:54:38 +00:00
|
|
|
with import <stockholm/lib>;
|
2015-10-04 14:42:04 +00:00
|
|
|
let
|
2015-10-22 13:33:05 +00:00
|
|
|
cfg = config.krebs.tinc_graphs;
|
2015-10-04 14:42:04 +00:00
|
|
|
internal_dir = "${cfg.workingDir}/internal";
|
|
|
|
external_dir = "${cfg.workingDir}/external";
|
|
|
|
|
|
|
|
out = {
|
2015-10-22 13:33:05 +00:00
|
|
|
options.krebs.tinc_graphs = api;
|
2016-02-14 15:43:44 +00:00
|
|
|
config = lib.mkIf cfg.enable imp ;
|
2015-10-04 14:42:04 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
api = {
|
2015-10-04 16:55:36 +00:00
|
|
|
enable = mkEnableOption "tinc graphs";
|
2015-10-04 14:42:04 +00:00
|
|
|
|
|
|
|
geodbPath = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
description = "Path to geocitydb, defaults to geolite-legacy";
|
2015-10-04 16:55:36 +00:00
|
|
|
default = "${pkgs.geolite-legacy}/share/GeoIP/GeoIPCity.dat";
|
|
|
|
};
|
|
|
|
|
2016-06-23 14:45:06 +00:00
|
|
|
hostsPath = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
description = "Path to Hosts directory";
|
2016-07-20 15:20:47 +00:00
|
|
|
default = "${config.krebs.tinc.retiolum.hostsPackage}";
|
2021-11-08 03:23:30 +00:00
|
|
|
defaultText = "\${config.krebs.tinc.retiolum.hostsPackage}";
|
2016-06-23 14:45:06 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
network = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
description = "Tinc Network to use";
|
|
|
|
default = "retiolum";
|
|
|
|
};
|
|
|
|
|
2015-10-21 15:13:12 +00:00
|
|
|
nginx = {
|
|
|
|
enable = mkEnableOption "enable tinc_graphs to be served with nginx";
|
|
|
|
|
2016-12-24 22:38:39 +00:00
|
|
|
anonymous = mkOption {
|
|
|
|
type = types.attrsOf types.unspecified;
|
2020-01-11 19:27:01 +00:00
|
|
|
default = {};
|
2016-12-24 22:38:39 +00:00
|
|
|
description = ''
|
|
|
|
nginx virtualHost options to be merged into the anonymous graphs
|
|
|
|
vhost entry.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
anonymous-domain = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
description = ''
|
|
|
|
external domainname to be used for anonymous graphs
|
|
|
|
it will be used if you want to enable ACME
|
|
|
|
'';
|
2017-06-18 12:03:43 +00:00
|
|
|
default = "graph.krebsco.de";
|
2015-10-04 16:55:36 +00:00
|
|
|
};
|
|
|
|
|
2016-12-24 22:38:39 +00:00
|
|
|
complete = mkOption {
|
|
|
|
type = types.attrsOf types.unspecified;
|
|
|
|
description = ''
|
|
|
|
nginx virtualHost options to be merged into the complete graphs
|
|
|
|
vhost entry.
|
|
|
|
'';
|
2015-10-04 16:55:36 +00:00
|
|
|
};
|
2015-10-04 14:42:04 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
workingDir = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
description = ''
|
|
|
|
Path to working dir, will create interal and external/.
|
|
|
|
Defaults to the new users home dir which defaults to
|
|
|
|
/var/cache/tinc_graphs'';
|
2015-10-04 16:55:36 +00:00
|
|
|
default = config.users.extraUsers.tinc_graphs.home;
|
2021-11-08 03:23:30 +00:00
|
|
|
defaultText = "<literal>\${config.users.extraUsers.tinc_graphs.home}</literal>";
|
2015-10-04 14:42:04 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
timerConfig = mkOption {
|
|
|
|
type = with types; attrsOf str;
|
|
|
|
default = {
|
|
|
|
OnCalendar = "*:0/15";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
imp = {
|
2016-06-23 14:45:06 +00:00
|
|
|
environment.systemPackages = [ pkgs.tinc_graphs ];
|
2015-10-04 14:42:04 +00:00
|
|
|
systemd.timers.tinc_graphs = {
|
|
|
|
description = "Build Tinc Graphs via via timer";
|
2016-06-23 14:45:06 +00:00
|
|
|
wantedBy = [ "timers.target" ];
|
2015-10-04 14:42:04 +00:00
|
|
|
timerConfig = cfg.timerConfig;
|
|
|
|
};
|
|
|
|
systemd.services.tinc_graphs = {
|
|
|
|
description = "Build Tinc Graphs";
|
2015-10-04 16:55:36 +00:00
|
|
|
environment = {
|
|
|
|
EXTERNAL_FOLDER = external_dir;
|
|
|
|
INTERNAL_FOLDER = internal_dir;
|
|
|
|
GEODB = cfg.geodbPath;
|
2016-06-23 14:45:06 +00:00
|
|
|
TINC_HOSTPATH = cfg.hostsPath;
|
|
|
|
TINC_NETWORK = cfg.network;
|
2015-10-04 16:55:36 +00:00
|
|
|
};
|
2015-10-04 14:42:04 +00:00
|
|
|
|
|
|
|
restartIfChanged = true;
|
|
|
|
serviceConfig = {
|
|
|
|
Type = "simple";
|
2015-12-03 19:39:29 +00:00
|
|
|
TimeoutSec = 300; # we will wait 5 minutes, kill otherwise
|
2015-11-13 11:24:43 +00:00
|
|
|
restart = "always";
|
2015-10-04 20:29:30 +00:00
|
|
|
|
2016-06-13 00:04:22 +00:00
|
|
|
ExecStartPre = pkgs.writeDash "tinc_graphs-init" ''
|
2015-10-25 20:54:59 +00:00
|
|
|
mkdir -p "${internal_dir}" "${external_dir}"
|
2015-10-17 21:51:02 +00:00
|
|
|
if ! test -e "${cfg.workingDir}/internal/index.html"; then
|
2015-10-25 20:54:59 +00:00
|
|
|
cp -fr "$(${pkgs.tinc_graphs}/bin/tincstats-static-dir)/internal/." "${internal_dir}"
|
|
|
|
fi
|
|
|
|
if ! test -e "${cfg.workingDir}/external/index.html"; then
|
|
|
|
cp -fr "$(${pkgs.tinc_graphs}/bin/tincstats-static-dir)/external/." "${external_dir}"
|
2015-10-17 21:51:02 +00:00
|
|
|
fi
|
2015-10-04 14:42:04 +00:00
|
|
|
'';
|
2016-06-23 14:45:06 +00:00
|
|
|
ExecStart = ''${pkgs.tinc_graphs}/bin/all-the-graphs "${cfg.network}"'';
|
2015-10-04 20:29:30 +00:00
|
|
|
|
2016-06-13 00:04:22 +00:00
|
|
|
ExecStartPost = pkgs.writeDash "tinc_graphs-post" ''
|
2015-10-04 20:29:30 +00:00
|
|
|
# TODO: this may break if workingDir is set to something stupid
|
|
|
|
# this is needed because homedir is created with 700
|
|
|
|
chmod 755 "${cfg.workingDir}"
|
|
|
|
'';
|
2015-10-17 21:51:02 +00:00
|
|
|
PrivateTmp = "yes";
|
2015-10-04 20:29:30 +00:00
|
|
|
|
|
|
|
User = "root"; # tinc cannot be queried as user,
|
2015-10-04 16:55:36 +00:00
|
|
|
# seems to be a tinc-pre issue
|
2015-10-04 14:42:04 +00:00
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
users.extraUsers.tinc_graphs = {
|
2018-12-03 08:46:19 +00:00
|
|
|
uid = genid_uint31 "tinc_graphs";
|
2015-10-04 20:29:30 +00:00
|
|
|
home = "/var/spool/tinc_graphs";
|
2021-06-05 12:57:08 +00:00
|
|
|
isSystemUser = true;
|
2015-10-04 14:42:04 +00:00
|
|
|
};
|
2016-12-24 22:38:39 +00:00
|
|
|
services.nginx = mkIf cfg.nginx.enable {
|
2016-06-23 14:45:06 +00:00
|
|
|
enable = mkDefault true;
|
2016-12-24 22:38:39 +00:00
|
|
|
virtualHosts = {
|
2016-06-23 14:45:06 +00:00
|
|
|
tinc_graphs_complete = mkMerge [ cfg.nginx.complete {
|
2016-12-24 22:38:39 +00:00
|
|
|
locations = {
|
|
|
|
"/".extraConfig = "autoindex on;";
|
|
|
|
"/".root = internal_dir;
|
|
|
|
};
|
|
|
|
}];
|
|
|
|
"${cfg.nginx.anonymous-domain}" = mkMerge [ cfg.nginx.anonymous {
|
|
|
|
locations = {
|
|
|
|
"/".extraConfig = "autoindex on;";
|
|
|
|
"/".root = external_dir;
|
|
|
|
};
|
2016-06-23 14:45:06 +00:00
|
|
|
}];
|
|
|
|
};
|
2015-10-04 16:55:36 +00:00
|
|
|
};
|
2015-10-04 14:42:04 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
in
|
|
|
|
out
|