diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index 0105cc3cdf2c..168977979143 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -176,6 +176,7 @@
./services/hardware/udisks2.nix
./services/hardware/upower.nix
./services/hardware/thermald.nix
+ ./services/logging/awstats.nix
./services/logging/fluentd.nix
./services/logging/klogd.nix
./services/logging/logcheck.nix
diff --git a/nixos/modules/services/logging/awstats.nix b/nixos/modules/services/logging/awstats.nix
new file mode 100644
index 000000000000..8ab7e6acd98e
--- /dev/null
+++ b/nixos/modules/services/logging/awstats.nix
@@ -0,0 +1,123 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.services.awstats;
+ package = pkgs.awstats;
+in
+
+{
+ options.services.awstats = {
+ enable = mkOption {
+ type = types.bool;
+ default = cfg.service.enable;
+ description = ''
+ Enable the awstats program (but not service).
+ Currently only simple httpd (Apache) configs are supported,
+ and awstats plugins may not work correctly.
+ '';
+ };
+ vardir = mkOption {
+ type = types.path;
+ default = "/var/lib/awstats";
+ description = "The directory where variable awstats data will be stored.";
+ };
+
+ extraConfig = mkOption {
+ type = types.lines;
+ default = "";
+ description = "Extra configuration to be appendend to awstats.conf.";
+ };
+
+ updateAt = mkOption {
+ type = types.nullOr types.string;
+ default = null;
+ example = "hourly";
+ description = ''
+ Specification of the time at which awstats will get updated.
+ (in the format described by
+ systemd.time
+ 5)
+ '';
+ };
+
+ service = {
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''Enable the awstats web service. This switches on httpd.'';
+ };
+ urlPrefix = mkOption {
+ type = types.string;
+ default = "/awstats";
+ description = "The URL prefix under which the awstats service appears.";
+ };
+ };
+ };
+
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = [ package.bin ];
+ /* TODO:
+ - heed config.services.httpd.logPerVirtualHost, etc.
+ - Can't AllowToUpdateStatsFromBrowser, as CGI scripts don't have permission
+ to read the logs, and our httpd config apparently doesn't an option for that.
+ */
+ environment.etc."awstats/awstats.conf".source = pkgs.runCommand "awstats.conf"
+ { preferLocalBuild = true; }
+ ( let
+ cfg-httpd = config.services.httpd;
+ logFormat =
+ if cfg-httpd.logFormat == "combined" then "1" else
+ if cfg-httpd.logFormat == "common" then "4" else
+ throw "awstats service doesn't support Apache log format `${cfg-httpd.logFormat}`";
+ in
+ ''
+ sed \
+ -e 's|^\(DirData\)=.*$|\1="${cfg.vardir}"|' \
+ -e 's|^\(DirIcons\)=.*$|\1="icons"|' \
+ -e 's|^\(CreateDirDataIfNotExists\)=.*$|\1=1|' \
+ -e 's|^\(SiteDomain\)=.*$|\1="${cfg-httpd.hostName}"|' \
+ -e 's|^\(LogFile\)=.*$|\1="${cfg-httpd.logDir}/access_log"|' \
+ -e 's|^\(LogFormat\)=.*$|\1=${logFormat}|' \
+ < '${package.out}/wwwroot/cgi-bin/awstats.model.conf' > "$out"
+ echo '${cfg.extraConfig}' >> "$out"
+ '');
+
+ # The httpd sub-service showing awstats.
+ services.httpd.enable = mkIf cfg.service.enable true;
+ services.httpd.extraSubservices = mkIf cfg.service.enable [ { function = { serverInfo, ... }: {
+ extraConfig =
+ ''
+ Alias ${cfg.service.urlPrefix}/classes "${package.out}/wwwroot/classes/"
+ Alias ${cfg.service.urlPrefix}/css "${package.out}/wwwroot/css/"
+ Alias ${cfg.service.urlPrefix}/icons "${package.out}/wwwroot/icon/"
+ ScriptAlias ${cfg.service.urlPrefix}/ "${package.out}/wwwroot/cgi-bin/"
+
+
+ Options None
+ AllowOverride None
+ Order allow,deny
+ Allow from all
+
+ '';
+ startupScript =
+ let
+ inherit (serverInfo.serverConfig) user group;
+ in pkgs.writeScript "awstats_startup.sh"
+ ''
+ mkdir -p '${cfg.vardir}'
+ chown '${user}:${group}' '${cfg.vardir}'
+ '';
+ };}];
+
+ systemd.services.awstats-update = mkIf (cfg.updateAt != null) {
+ description = "awstats log collector";
+ script = "exec '${package.bin}/bin/awstats' -update -config=awstats.conf";
+ startAt = cfg.updateAt;
+ };
+ };
+
+}
+
diff --git a/pkgs/tools/system/awstats/default.nix b/pkgs/tools/system/awstats/default.nix
new file mode 100644
index 000000000000..f4a14155d689
--- /dev/null
+++ b/pkgs/tools/system/awstats/default.nix
@@ -0,0 +1,58 @@
+{ stdenv, fetchurl, perlPackages, jdk }:
+
+perlPackages.buildPerlPackage rec {
+ name = "awstats-${version}";
+ version = "7.4";
+
+ src = fetchurl {
+ url = "mirror://sourceforge/awstats/${name}.tar.gz";
+ sha256 = "0mdbilsl8g9a84qgyws4pakhqr3mfhs5g5dqbgsn9gn285rzxas3";
+ };
+
+ postPatch = ''
+ substituteInPlace wwwroot/cgi-bin/awstats.pl \
+ --replace /usr/share/awstats/ "$out/wwwroot/cgi-bin/"
+ '';
+
+ outputs = [ "out" "bin" "doc" ];
+
+ buildInputs = with perlPackages; [ ]; # plugins will need some
+
+ preConfigure = ''
+ touch Makefile.PL
+ patchShebangs .
+ '';
+
+ # build our own JAR
+ preBuild = ''
+ (
+ cd wwwroot/classes/src
+ rm ../*.jar
+ PATH="${jdk}/bin" "$(type -P perl)" Makefile.pl
+ test -f ../*.jar
+ )
+ '';
+
+ doCheck = false;
+
+ installPhase = ''
+ mkdir "$out"
+ mv wwwroot "$out/wwwroot"
+ rm -r "$out/wwwroot/classes/src/"
+
+ mkdir -p "$bin/bin"
+ ln -s "$out/wwwroot/cgi-bin/awstats.pl" "$bin/bin/awstats"
+
+ mkdir -p "$doc/share/"
+ mv README.md docs/
+ mv docs "$doc/share/awstats"
+ '';
+
+ meta = with stdenv.lib; {
+ description = "Real-time logfile analyzer to get advanced statistics";
+ homepage = http://awstats.org;
+ license = licenses.gpl3Plus;
+ platforms = platforms.linux;
+ };
+}
+
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 155d3348f8b4..50ef66a66bb4 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -676,6 +676,8 @@ let
aws_mturk_clt = callPackage ../tools/misc/aws-mturk-clt { };
+ awstats = callPackage ../tools/system/awstats { };
+
axel = callPackage ../tools/networking/axel { };
azureus = callPackage ../tools/networking/p2p/azureus { };