Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 12 additions & 6 deletions nixos/modules/services/logging/logrotate.nix
Original file line number Diff line number Diff line change
Expand Up @@ -97,12 +97,18 @@ let
'';

paths = sortProperties (attrValues (filterAttrs (_: pathOpts: pathOpts.enable) cfg.paths));
configFile = pkgs.writeText "logrotate.conf" (
concatStringsSep "\n" (
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 = [
Expand Down Expand Up @@ -172,7 +178,7 @@ in
serviceConfig = {
Restart = "no";
User = "root";
ExecStart = "${pkgs.logrotate}/sbin/logrotate ${configFile}";
ExecStart = "${pkgs.logrotate}/sbin/logrotate ${mailOption} ${configFile}";
};
};
};
Expand Down
31 changes: 21 additions & 10 deletions nixos/tests/logrotate.nix
Original file line number Diff line number Diff line change
@@ -1,37 +1,48 @@
# Test logrotate service works and is enabled by default

import ./make-test-python.nix ({ pkgs, ...} : rec {
import ./make-test-python.nix ({ pkgs, ... }: rec {
name = "logrotate";
meta = with pkgs.lib.maintainers; {
maintainers = [ martinetd ];
};

# default machine
machine = { ... }: {
nodes = {
defaultMachine = { ... }: { };
machine = { config, ... }: {
services.logrotate.paths = {
# using mail somewhere should add --mail to logrotate invokation
sendmail = {
extraConfig = "mail user@domain.tld";
};
};
};
};

testScript =
''
with subtest("whether logrotate works"):
machine.succeed(
# we must rotate once first to create logrotate stamp
"systemctl start logrotate.service")
# we must rotate once first to create logrotate stamp
defaultMachine.succeed("systemctl start logrotate.service")
# we need to wait for console text once here to
# clear console buffer up to this point for next wait
machine.wait_for_console_text('logrotate.service: Deactivated successfully')
defaultMachine.wait_for_console_text('logrotate.service: Deactivated successfully')

machine.succeed(
defaultMachine.succeed(
# wtmp is present in default config.
"rm -f /var/log/wtmp*",
# we need to give it at least 1MB
"dd if=/dev/zero of=/var/log/wtmp bs=2M count=1",

# move into the future and check rotation.
"date -s 'now + 1 month + 1 day'")
machine.wait_for_console_text('logrotate.service: Deactivated successfully')
machine.succeed(
defaultMachine.wait_for_console_text('logrotate.service: Deactivated successfully')
defaultMachine.succeed(
# check rotate worked
"[ -e /var/log/wtmp.1 ]",
)
with subtest("default config does not have mail"):
defaultMachine.fail("systemctl cat logrotate.service | grep -- --mail")
with subtest("using mails adds mail option"):
machine.succeed("systemctl cat logrotate.service | grep -- --mail")
'';
})
3 changes: 0 additions & 3 deletions pkgs/tools/system/logrotate/default.nix
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
{ lib, stdenv, fetchFromGitHub, gzip, popt, autoreconfHook
, mailutils ? null
, aclSupport ? true, acl
, nixosTests
}:
Expand All @@ -19,8 +18,6 @@ stdenv.mkDerivation rec {
configureFlags = [
"--with-compress-command=${gzip}/bin/gzip"
"--with-uncompress-command=${gzip}/bin/gunzip"
] ++ lib.optionals (mailutils != null) [
"--with-default-mail-command=${mailutils}/bin/mail"
];

nativeBuildInputs = [ autoreconfHook ];
Expand Down