parent
85001098db
commit
6f9fe31b42
@ -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 <citerefentry> |
||||
<refentrytitle>systemd.time</refentrytitle> |
||||
<manvolnum>5</manvolnum></citerefentry>) |
||||
''; |
||||
}; |
||||
|
||||
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/" |
||||
|
||||
<Directory "${package.out}/wwwroot"> |
||||
Options None |
||||
AllowOverride None |
||||
Order allow,deny |
||||
Allow from all |
||||
</Directory> |
||||
''; |
||||
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; |
||||
}; |
||||
}; |
||||
|
||||
} |
||||
|
@ -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; |
||||
}; |
||||
} |
||||
|
Loading…
Reference in new issue