--- logrotate-3.7.5/logrotate.c.errorHandling 2007-03-01 12:05:30.000000000 +0100 +++ logrotate-3.7.5/logrotate.c 2007-03-31 12:50:33.000000000 +0200 @@ -1043,6 +1043,8 @@ message(MESS_ERROR, "error running first action script " "for %s\n", log->pattern); hasErrors = 1; + /* finish early, firstaction failed, affects all logs in set */ + return hasErrors; } } } @@ -1067,16 +1069,25 @@ hasErrors |= logHasErrors[i]; } - if (log->pre) { + if (log->pre + && (! ( (logHasErrors[j] && !(log->flags & LOG_FLAG_SHAREDSCRIPTS)) + || (hasErrors && (log->flags & LOG_FLAG_SHAREDSCRIPTS)) ) )) { if (!numRotated) { message(MESS_DEBUG, "not running prerotate script, " "since no logs will be rotated\n"); } else { message(MESS_DEBUG, "running prerotate script\n"); if (runScript(log->pattern, log->pre)) { - message(MESS_ERROR, - "error running shared prerotate script " - "for %s\n", log->pattern); + if (log->flags & LOG_FLAG_SHAREDSCRIPTS) + message(MESS_ERROR, + "error running shared prerotate script " + "for '%s'\n", log->pattern); + else { + message(MESS_ERROR, + "error running non-shared prerotate script " + "for %s of '%s'\n", log->files[j], log->pattern); + } + logHasErrors[j] = 1; hasErrors = 1; } } @@ -1085,22 +1096,33 @@ for (i = j; ((log->flags & LOG_FLAG_SHAREDSCRIPTS) && i < log->numFiles) || (!(log->flags & LOG_FLAG_SHAREDSCRIPTS) && i == j); i++) { - if (!logHasErrors[i]) { + if (! ( (logHasErrors[i] && !(log->flags & LOG_FLAG_SHAREDSCRIPTS)) + || (hasErrors && (log->flags & LOG_FLAG_SHAREDSCRIPTS)) ) ) { logHasErrors[i] |= rotateSingleLog(log, i, state[i], rotNames[i]); hasErrors |= logHasErrors[i]; } } - if (log->post) { + if (log->post + && (! ( (logHasErrors[j] && !(log->flags & LOG_FLAG_SHAREDSCRIPTS)) + || (hasErrors && (log->flags & LOG_FLAG_SHAREDSCRIPTS)) ) )) { if (!numRotated) { message(MESS_DEBUG, "not running postrotate script, " "since no logs were rotated\n"); } else { message(MESS_DEBUG, "running postrotate script\n"); if (runScript(log->pattern, log->post)) { - message(MESS_ERROR, "error running postrotate script " - "for %s\n", log->pattern); + if (log->flags & LOG_FLAG_SHAREDSCRIPTS) + message(MESS_ERROR, + "error running shared postrotate script " + "for '%s'\n", log->pattern); + else { + message(MESS_ERROR, + "error running non-shared postrotate script " + "for %s of '%s'\n", log->files[j], log->pattern); + } + logHasErrors[j] = 1; hasErrors = 1; } } @@ -1109,7 +1131,8 @@ for (i = j; ((log->flags & LOG_FLAG_SHAREDSCRIPTS) && i < log->numFiles) || (!(log->flags & LOG_FLAG_SHAREDSCRIPTS) && i == j); i++) { - if (!logHasErrors[i]) { + if (! ( (logHasErrors[i] && !(log->flags & LOG_FLAG_SHAREDSCRIPTS)) + || (hasErrors && (log->flags & LOG_FLAG_SHAREDSCRIPTS)) ) ) { logHasErrors[i] |= postrotateSingleLog(log, i, state[i], rotNames[i]); hasErrors |= logHasErrors[i]; --- logrotate-3.7.5/logrotate.8.errorHandling 2006-05-17 16:46:51.000000000 +0200 +++ logrotate-3.7.5/logrotate.8 2007-03-31 12:37:06.000000000 +0200 @@ -326,7 +326,8 @@ \fBnosharedscripts\fR Run \fBprerotate\fR and \fBpostrotate\fR scripts for every log file which is rotated (this is the default, and overrides the \fBsharedscripts\fR -option). +option). If the scripts exit with error, the remaining actions will +not be executed for the affected log only. .TP \fBnotifempty\fR @@ -346,7 +347,8 @@ The lines between \fBpostrotate\fR and \fBendscript\fR (both of which must appear on lines by themselves) are executed after the log file is rotated. These directives may only appear inside of a log file definition. -See \fBprerotate\fR as well. +See \fBprerotate\fR as well. See \fBsharedscripts\fR and +\fBnosharedscripts\fR for error handling. .TP \fBprerotate\fR/\fBendscript\fR @@ -354,7 +356,8 @@ must appear on lines by themselves) are executed before the log file is rotated and only if the log will actually be rotated. These directives may only appear inside of a log file definition. See \fBpostrotate\fR -as well. +as well. See \fBsharedscripts\fR and \fBnosharedscripts\fR for error +handling. .TP \fBfirstaction\fR/\fBendscript\fR @@ -362,7 +365,8 @@ must appear on lines by themselves) are executed once before all log files that match the wildcarded pattern are rotated, before prerotate script is run and only if at least one log will actually be rotated. These directives -may only appear inside of a log file definition. See \fBlastaction\fR as well. +may only appear inside of a log file definition. If the script exits +with error, no further processing is done. See \fBlastaction\fR as well. .TP \fBlastaction\fR/\fBendscript\fR @@ -370,7 +374,9 @@ must appear on lines by themselves) are executed once after all log files that match the wildcarded pattern are rotated, after postrotate script is run and only if at least one log is rotated. These directives may only -appear inside of a log file definition. See \fBfirstaction\fR as well. +appear inside of a log file definition. If the script exits with +error, just an error message is shown (as this is the last +action). See \fBfirstaction\fR as well. .TP \fBrotate \fIcount\fR @@ -393,8 +399,10 @@ /var/log/news/* example). If \fBsharedscript\fR is specified, the scripts are only run once, no matter how many logs match the wildcarded pattern. However, if none of the logs in the pattern require rotating, the scripts -will not be run at all. This option overrides the \fBnosharedscripts\fR -option and implies \fBcreate\fR option. +will not be run at all. If the scripts exit with error, the remaining +actions will not be executed for any logs. This option overrides the +\fBnosharedscripts\fR option and implies \fBcreate\fR option. + .TP \fBstart \fIcount\fR