mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-12-12 08:43:06 +00:00
210 lines
6.0 KiB
Nix
210 lines
6.0 KiB
Nix
{ config, lib, pkgs, ... }:
|
|
|
|
with lib;
|
|
|
|
let
|
|
cfg = config.services.logrotate;
|
|
|
|
pathOpts = { name, ... }: {
|
|
options = {
|
|
enable = mkOption {
|
|
type = types.bool;
|
|
default = true;
|
|
description = ''
|
|
Whether to enable log rotation for this path. This can be used to explicitly disable
|
|
logging that has been configured by NixOS.
|
|
'';
|
|
};
|
|
|
|
name = mkOption {
|
|
type = types.str;
|
|
internal = true;
|
|
};
|
|
|
|
path = mkOption {
|
|
type = with types; either str (listOf str);
|
|
default = name;
|
|
defaultText = "attribute name";
|
|
description = ''
|
|
The path to log files to be rotated.
|
|
Spaces are allowed and normal shell quoting rules apply,
|
|
with ', ", and \ characters supported.
|
|
'';
|
|
};
|
|
|
|
user = mkOption {
|
|
type = with types; nullOr str;
|
|
default = null;
|
|
description = ''
|
|
The user account to use for rotation.
|
|
'';
|
|
};
|
|
|
|
group = mkOption {
|
|
type = with types; nullOr str;
|
|
default = null;
|
|
description = ''
|
|
The group to use for rotation.
|
|
'';
|
|
};
|
|
|
|
frequency = mkOption {
|
|
type = types.enum [ "hourly" "daily" "weekly" "monthly" "yearly" ];
|
|
default = "daily";
|
|
description = ''
|
|
How often to rotate the logs.
|
|
'';
|
|
};
|
|
|
|
keep = mkOption {
|
|
type = types.int;
|
|
default = 20;
|
|
description = ''
|
|
How many rotations to keep.
|
|
'';
|
|
};
|
|
|
|
extraConfig = mkOption {
|
|
type = types.lines;
|
|
default = "";
|
|
description = ''
|
|
Extra logrotate config options for this path. Refer to
|
|
<link xlink:href="https://linux.die.net/man/8/logrotate"/> for details.
|
|
'';
|
|
};
|
|
|
|
priority = mkOption {
|
|
type = types.int;
|
|
default = 1000;
|
|
description = ''
|
|
Order of this logrotate block in relation to the others. The semantics are
|
|
the same as with `lib.mkOrder`. Smaller values have a greater priority.
|
|
'';
|
|
};
|
|
};
|
|
|
|
config.name = name;
|
|
};
|
|
|
|
mkConf = pathOpts: ''
|
|
# generated by NixOS using the `services.logrotate.paths.${pathOpts.name}` attribute set
|
|
${concatMapStringsSep " " (path: ''"${path}"'') (toList pathOpts.path)} {
|
|
${optionalString (pathOpts.user != null || pathOpts.group != null) "su ${pathOpts.user} ${pathOpts.group}"}
|
|
${pathOpts.frequency}
|
|
rotate ${toString pathOpts.keep}
|
|
${pathOpts.extraConfig}
|
|
}
|
|
'';
|
|
|
|
paths = sortProperties (attrValues (filterAttrs (_: pathOpts: pathOpts.enable) cfg.paths));
|
|
configText = concatStringsSep "\n" (
|
|
[ "missingok" "notifempty" cfg.extraConfig ] ++ (map mkConf paths)
|
|
);
|
|
configFile = pkgs.writeText "logrotate.conf" configText;
|
|
|
|
mailOption =
|
|
# add mail option to service if a mail is requested in config
|
|
# this ugly match will be replaced by cleaner attribute check in
|
|
# the near future
|
|
if builtins.match "(.*[[:space:]])?mail[[:space:]].*" configText != null
|
|
then "--mail=${pkgs.mailutils}/bin/mail"
|
|
else "";
|
|
in
|
|
{
|
|
imports = [
|
|
(mkRenamedOptionModule [ "services" "logrotate" "config" ] [ "services" "logrotate" "extraConfig" ])
|
|
];
|
|
|
|
options = {
|
|
services.logrotate = {
|
|
enable = mkEnableOption "the logrotate systemd service" // {
|
|
default = foldr (n: a: a || n.enable) false (attrValues cfg.paths);
|
|
defaultText = literalExpression "cfg.paths != {}";
|
|
};
|
|
|
|
configFile = mkOption {
|
|
type = types.path;
|
|
default = configFile;
|
|
defaultText = ''
|
|
A configuration file automatically generated by NixOS.
|
|
'';
|
|
description = ''
|
|
Override the configuration file used by MySQL. By default,
|
|
NixOS generates one automatically from <option>services.logrotate.settings</option>.
|
|
'';
|
|
example = literalExpression ''
|
|
pkgs.writeText "logrotate.conf" '''
|
|
missingok
|
|
"/var/log/*.log" {
|
|
rotate 4
|
|
weekly
|
|
}
|
|
''';
|
|
'';
|
|
};
|
|
|
|
paths = mkOption {
|
|
type = with types; attrsOf (submodule pathOpts);
|
|
default = { };
|
|
description = ''
|
|
Attribute set of paths to rotate. The order each block appears in the generated configuration file
|
|
can be controlled by the <link linkend="opt-services.logrotate.paths._name_.priority">priority</link> option
|
|
using the same semantics as `lib.mkOrder`. Smaller values have a greater priority.
|
|
'';
|
|
example = literalExpression ''
|
|
{
|
|
httpd = {
|
|
path = "/var/log/httpd/*.log";
|
|
user = config.services.httpd.user;
|
|
group = config.services.httpd.group;
|
|
keep = 7;
|
|
};
|
|
|
|
myapp = {
|
|
path = "/var/log/myapp/*.log";
|
|
user = "myuser";
|
|
group = "mygroup";
|
|
frequency = "weekly";
|
|
keep = 5;
|
|
priority = 1;
|
|
};
|
|
}
|
|
'';
|
|
};
|
|
|
|
extraConfig = mkOption {
|
|
default = "";
|
|
type = types.lines;
|
|
description = ''
|
|
Extra contents to append to the logrotate configuration file. Refer to
|
|
<link xlink:href="https://linux.die.net/man/8/logrotate"/> for details.
|
|
'';
|
|
};
|
|
};
|
|
};
|
|
|
|
config = mkIf cfg.enable {
|
|
assertions = mapAttrsToList
|
|
(name: pathOpts:
|
|
{
|
|
assertion = (pathOpts.user != null) == (pathOpts.group != null);
|
|
message = ''
|
|
If either of `services.logrotate.paths.${name}.user` or `services.logrotate.paths.${name}.group` are specified then *both* must be specified.
|
|
'';
|
|
}
|
|
)
|
|
cfg.paths;
|
|
|
|
systemd.services.logrotate = {
|
|
description = "Logrotate Service";
|
|
startAt = "hourly";
|
|
|
|
serviceConfig = {
|
|
Restart = "no";
|
|
User = "root";
|
|
ExecStart = "${pkgs.logrotate}/sbin/logrotate ${mailOption} ${cfg.configFile}";
|
|
};
|
|
};
|
|
};
|
|
}
|