]>
Commit | Line | Data |
---|---|---|
252dd7d8 IB |
1 | { lib, pkgs, config, ... }: |
2 | let | |
3 | name = "goaccess"; | |
4 | cfg = config.services.webstats; | |
5 | in { | |
6 | options.services.webstats = { | |
7 | dataDir = lib.mkOption { | |
8 | type = lib.types.path; | |
9 | default = "/var/lib/${name}"; | |
10 | description = '' | |
11 | The directory where Goaccess stores its data. | |
12 | ''; | |
13 | }; | |
14 | sites = lib.mkOption { | |
15 | type = lib.types.listOf (lib.types.submodule { | |
16 | options = { | |
17 | conf = lib.mkOption { | |
18 | type = lib.types.nullOr lib.types.path; | |
19 | default = null; | |
20 | description = '' | |
21 | use custom goaccess configuration file instead of the | |
22 | default one. | |
23 | ''; | |
24 | }; | |
25 | name = lib.mkOption { | |
26 | type = lib.types.string; | |
27 | description = '' | |
28 | Domain name. Corresponds to the Apache file name and the | |
29 | folder name in which the state will be saved. | |
30 | ''; | |
31 | }; | |
32 | }; | |
33 | }); | |
34 | default = []; | |
35 | description = "Sites to generate stats"; | |
36 | }; | |
37 | }; | |
38 | ||
39 | config = lib.mkIf (builtins.length cfg.sites > 0) { | |
40 | users.users.root.packages = [ | |
41 | pkgs.goaccess | |
42 | ]; | |
43 | ||
44 | services.cron = { | |
45 | enable = true; | |
46 | systemCronJobs = let | |
47 | stats = domain: conf: let | |
48 | config = if builtins.isNull conf | |
49 | then pkgs.runCommand "goaccess.conf" { | |
50 | dbPath = "${cfg.dataDir}/${domain}"; | |
51 | } "substituteAll ${./goaccess.conf} $out" | |
52 | else conf; | |
53 | d = pkgs.writeScriptBin "stats-${domain}" '' | |
54 | #!${pkgs.stdenv.shell} | |
55 | set -e | |
56 | shopt -s nullglob | |
57 | date_regex=$(LC_ALL=C date -d yesterday +'%d\/%b\/%Y') | |
58 | TMPFILE=$(mktemp) | |
59 | trap "rm -f $TMPFILE" EXIT | |
60 | ||
61 | mkdir -p ${cfg.dataDir}/${domain} | |
62 | cat /var/log/httpd/access-${domain}.log | sed -n "/\\[$date_regex/ p" > $TMPFILE | |
63 | for i in /var/log/httpd/access-${domain}*.gz; do | |
64 | zcat "$i" | sed -n "/\\[$date_regex/ p" >> $TMPFILE | |
65 | done | |
66 | ${pkgs.goaccess}/bin/goaccess $TMPFILE --no-progress -o ${cfg.dataDir}/${domain}/index.html -p ${config} | |
67 | ''; | |
68 | in "${d}/bin/stats-${domain}"; | |
69 | allStats = sites: pkgs.writeScript "stats" '' | |
70 | #!${pkgs.stdenv.shell} | |
71 | ||
72 | mkdir -p ${cfg.dataDir} | |
73 | ${builtins.concatStringsSep "\n" (map (v: stats v.name v.conf) sites)} | |
74 | ''; | |
75 | in | |
76 | [ | |
77 | "5 0 * * * root ${allStats cfg.sites}" | |
78 | ]; | |
79 | }; | |
80 | }; | |
81 | } |