{ lib, pkgs, config, mylibs, ... }: let cfg = config.services.myWebsites.commons.stats; in { options = { services.myWebsites.commons.stats = { enable = lib.mkEnableOption "enable statistics"; sites = lib.mkOption { type = lib.types.listOf (lib.types.submodule { options = { conf = lib.mkOption { type = lib.types.path; }; name = lib.mkOption { type = lib.types.string; }; }; }); default = []; description = "Sites to generate stats"; }; }; }; config = lib.mkIf cfg.enable { environment.systemPackages = [ pkgs.goaccess ]; nixpkgs.config.packageOverrides = oldpkgs: rec { goaccess = oldpkgs.goaccess.overrideAttrs(old: rec { name = "goaccess-${version}"; version = "1.3"; src = pkgs.fetchurl { url = "https://tar.goaccess.io/${name}.tar.gz"; sha256 = "16vv3pj7pbraq173wlxa89jjsd279004j4kgzlrsk1dz4if5qxwc"; }; configureFlags = old.configureFlags ++ [ "--enable-tcb=btree" ]; buildInputs = old.buildInputs ++ [ pkgs.tokyocabinet pkgs.bzip2 ]; }); }; services.cron = { enable = true; systemCronJobs = let stats = domain: conf: let d = pkgs.writeScriptBin "stats-${domain}" '' #!${pkgs.stdenv.shell} set -e shopt -s nullglob date_regex=$(LC_ALL=C date -d yesterday +'%d\/%b\/%Y') TMPFILE=$(mktemp) trap "rm -f $TMPFILE" EXIT cat /var/log/httpd/access_log-${domain} | sed -n "/\\[$date_regex/ p" > $TMPFILE for i in /var/log/httpd/access_log-${domain}*.gz; do zcat "$i" | sed -n "/\\[$date_regex/ p" >> $TMPFILE done goaccess $TMPFILE --no-progress -o /var/lib/goaccess/${domain}/index.html -p ${conf} ''; in "${d}/bin/stats-${domain}"; allStats = sites: pkgs.writeScript "stats" '' #!${pkgs.stdenv.shell} ${builtins.concatStringsSep "\n" (map (v: stats v.name v.conf) sites)} ''; in [ "5 0 * * * root ${allStats cfg.sites}" ]; }; system.activationScripts.goaccess = '' mkdir -p /var/lib/goaccess '' + builtins.concatStringsSep "\n" (map (v: "mkdir -p /var/lib/goaccess/${v.name}") cfg.sites); }; }