1 { lib, pkgs, config, ... }:
4 cfg = config.services.webstats;
6 options.services.webstats = {
7 dataDir = lib.mkOption {
9 default = "/var/lib/${name}";
11 The directory where Goaccess stores its data.
14 sites = lib.mkOption {
15 type = lib.types.listOf (lib.types.submodule {
18 type = lib.types.nullOr lib.types.path;
21 use custom goaccess configuration file instead of the
26 type = lib.types.string;
28 Domain name. Corresponds to the Apache file name and the
29 folder name in which the state will be saved.
35 description = "Sites to generate stats";
39 config = lib.mkIf (builtins.length cfg.sites > 0) {
40 users.users.root.packages = [
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"
53 d = pkgs.writeScriptBin "stats-${domain}" ''
54 #!${pkgs.stdenv.shell}
57 date_regex=$(LC_ALL=C date -d yesterday +'%d\/%b\/%Y')
59 trap "rm -f $TMPFILE" EXIT
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
66 ${pkgs.goaccess}/bin/goaccess $TMPFILE --no-progress -o ${cfg.dataDir}/${domain}/index.html -p ${config}
68 in "${d}/bin/stats-${domain}";
69 allStats = sites: pkgs.writeScript "stats" ''
70 #!${pkgs.stdenv.shell}
72 mkdir -p ${cfg.dataDir}
73 ${builtins.concatStringsSep "\n" (map (v: stats v.name v.conf) sites)}
77 "5 0 * * * root ${allStats cfg.sites}"