Package: cron Version: 3.0pl1-137 Followup-For: Bug #887035 X-Debbugs-Cc: Georges Khaznadar <georges.khazna...@orange.fr>
If anybody wants to use Greek's patch (see [1] and [2]) then I'm attaching my version of it adapted to cron 3.0pl1-137 (the version in Debian bullseye). It comes in two parts: one is the patch and one is cron-3.0pl1/debian/patches/log-to-stdout-when-in-foreground to satisfy the Debian build infrastructure. Use the patch like this to build a new, patched cron package: apt-get source cron sudo apt-get build-dep cron patch -p0 < cron-syslog-fix-and-foreground-stdout.for-new-cron.debianized.patch cp log-to-stdout-when-in-foreground cron-3.0pl1/debian/patches cd cron-3.0pl1 && dpkg-buildpackage -rfakeroot *t [1] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=887035#5 [2] https://bugs.debian.org/cgi-bin/bugreport.cgi?att=1;bug=887035;filename=cron-syslog-fix-and-foreground-stdout.patch;msg=5 -- Package-specific info: --- EDITOR: --- /usr/bin/editor: /usr/bin/vim.gtk3 --- /usr/bin/crontab: -rwxr-sr-x 1 root crontab 43568 Feb 22 2021 /usr/bin/crontab --- /var/spool/cron: drwxr-xr-x 3 root root 4096 Apr 10 2021 /var/spool/cron --- /var/spool/cron/crontabs: drwx-wx--T 2 root crontab 4096 Feb 22 2021 /var/spool/cron/crontabs --- /etc/cron.d: drwxr-xr-x 2 root root 4096 Jul 22 15:03 /etc/cron.d --- /etc/cron.daily: drwxr-xr-x 2 root root 4096 Jul 11 09:33 /etc/cron.daily --- /etc/cron.hourly: drwxr-xr-x 2 root root 4096 Apr 10 2021 /etc/cron.hourly --- /etc/cron.monthly: drwxr-xr-x 2 root root 4096 Apr 10 2021 /etc/cron.monthly --- /etc/cron.weekly: drwxr-xr-x 2 root root 4096 Apr 10 2021 /etc/cron.weekly -- System Information: Debian Release: 11.4 APT prefers stable-security APT policy: (500, 'stable-security'), (500, 'stable') Architecture: amd64 (x86_64) Foreign Architectures: i386 Kernel: Linux 5.10.0-16-amd64 (SMP w/8 CPU threads) Locale: LANG=de_CH.UTF-8, LC_CTYPE=de_CH.UTF-8 (charmap=UTF-8), LANGUAGE=de_CH:de Shell: /bin/sh linked to /usr/bin/dash Init: systemd (via /run/systemd/system) LSM: AppArmor: enabled Versions of packages cron depends on: ii adduser 3.118 ii debianutils 4.11.2 ii init-system-helpers 1.60 ii libc6 2.31-13+deb11u3 ii libpam-runtime 1.4.0-9+deb11u1 ii libpam0g 1.4.0-9+deb11u1 ii libselinux1 3.1-3 ii lsb-base 11.1.0 ii sensible-utils 0.0.14 Versions of packages cron recommends: ii msmtp-mta [mail-transport-agent] 1.8.11-2.1 Versions of packages cron suggests: ii anacron 2.3-30 pn checksecurity <none> ii logrotate 3.18.0-2+deb11u1 Versions of packages cron is related to: pn libnss-ldap <none> pn libnss-ldapd <none> pn libpam-ldap <none> pn libpam-mount <none> pn nis <none> pn nscd <none> -- no debconf information
diff -u -r orig/cron-3.0pl1/cron.c cron-3.0pl1/cron.c --- orig/cron-3.0pl1/cron.c 2022-07-19 12:18:36.000000000 +0200 +++ cron-3.0pl1/cron.c 2022-07-19 14:24:39.000000000 +0200 @@ -122,12 +122,12 @@ } else if (!stay_foreground) { switch (fork()) { case -1: - log_it("CRON",getpid(),"DEATH","can't fork"); + log_it(LOG_ERR, "CRON",getpid(),"DEATH","can't fork"); exit(0); break; case 0: /* child process */ - log_it("CRON",getpid(),"STARTUP","fork ok"); + log_it(LOG_INFO, "CRON",getpid(),"STARTUP","fork ok"); (void) setsid(); freopen("/dev/null", "r", stdin); freopen("/dev/null", "w", stdout); @@ -281,18 +281,18 @@ /* Run on actual reboot, rather than cron restart */ if (access(REBOOT_FILE, F_OK) == 0) { /* File exists, return */ - log_it("CRON", getpid(),"INFO", + log_it(LOG_INFO, "CRON", getpid(),"INFO", "Skipping @reboot jobs -- not system startup"); return; } /* Create the file */ if ((rbfd = creat(REBOOT_FILE, S_IRUSR & S_IWUSR)) < 0) { /* Bad news, bail out */ - log_it("CRON",getpid(),"DEATH","Can't create reboot check file"); + log_it(LOG_ERR, "CRON",getpid(),"DEATH","Can't create reboot check file"); exit(0); } else { close(rbfd); - log_it("CRON", getpid(),"INFO", "Running @reboot jobs"); + log_it(LOG_INFO, "CRON", getpid(),"INFO", "Running @reboot jobs"); } Debug(DMISC, ("[%d], running reboot jobs\n", getpid())); for (u = db->head; u != NULL; u = u->next) { diff -u -r orig/cron-3.0pl1/cron.h cron-3.0pl1/cron.h --- orig/cron-3.0pl1/cron.h 2022-07-19 12:18:36.000000000 +0200 +++ cron-3.0pl1/cron.h 2022-07-19 14:24:39.000000000 +0200 @@ -144,6 +144,20 @@ #define CRON_LOG_JOBFAILED 0x04 #define CRON_LOG_JOBPID 0x08 +/* Log priorities */ +#if !defined(SYSLOG) +#define LOG_EMERG 0 +#define LOG_ALERT 1 +#define LOG_CRIT 2 +#define LOG_ERR 3 +#define LOG_WARNING 4 +#define LOG_NOTICE 5 +#define LOG_INFO 6 +#define LOG_DEBUG 7 +#else +#include <syslog.h> +#endif + #define SECONDS_PER_MINUTE 60 #define FIRST_MINUTE 0 @@ -238,7 +252,7 @@ free_entry __P((entry *)), acquire_daemonlock __P((int)), skip_comments __P((FILE *)), - log_it __P((char *, int, char *, char *)), + log_it __P((int, char *, int, char *, char *)), log_close __P((void)), check_orphans __P((cron_db *)); diff -u -r orig/cron-3.0pl1/crontab.c cron-3.0pl1/crontab.c --- orig/cron-3.0pl1/crontab.c 2022-07-19 12:18:36.000000000 +0200 +++ cron-3.0pl1/crontab.c 2022-07-19 14:24:39.000000000 +0200 @@ -119,7 +119,7 @@ "You (%s) are not allowed to use this program (%s)\n", User, ProgramName); fprintf(stderr, "See crontab(1) for more information\n"); - log_it(RealUser, Pid, "AUTH", "crontab command not allowed"); + log_it(LOG_NOTICE, RealUser, Pid, "AUTH", "crontab command not allowed"); } else { /* If the user is not allowed but root is running the * program warn but do not log */ @@ -301,7 +301,7 @@ int x; char *ctnh; - log_it(RealUser, Pid, "LIST", User); + log_it(LOG_INFO, RealUser, Pid, "LIST", User); (void) snprintf(n, MAX_FNAME, CRON_TAB(User)); if (!(f = fopen(n, "r"))) { if (errno == ENOENT) @@ -383,7 +383,7 @@ } } - log_it(RealUser, Pid, "DELETE", User); + log_it(LOG_INFO, RealUser, Pid, "DELETE", User); if (unlink(n)) { if (errno == ENOENT) fprintf(stderr, "no crontab for %s\n", User); @@ -551,7 +551,7 @@ mode_t um; int add_help_text = 0; - log_it(RealUser, Pid, "BEGIN EDIT", User); + log_it(LOG_INFO, RealUser, Pid, "BEGIN EDIT", User); (void) snprintf(n, MAX_FNAME, CRON_TAB(User)); if (!(f = fopen(n, "r"))) { if (errno != ENOENT) { @@ -779,7 +779,7 @@ remove: cleanup_tmp_crontab(); done: - log_it(RealUser, Pid, "END EDIT", User); + log_it(LOG_INFO, RealUser, Pid, "END EDIT", User); return; fatal: cleanup_tmp_crontab(); @@ -941,7 +941,7 @@ unlink(tn); return (-2); } - log_it(RealUser, Pid, "REPLACE", User); + log_it(LOG_INFO, RealUser, Pid, "REPLACE", User); poke_daemon(); diff -u -r orig/cron-3.0pl1/database.c cron-3.0pl1/database.c --- orig/cron-3.0pl1/database.c 2022-07-19 12:18:36.000000000 +0200 +++ cron-3.0pl1/database.c 2022-07-19 14:24:39.000000000 +0200 @@ -78,14 +78,14 @@ * cached any of the database), we'll see the changes next time. */ if (stat(SPOOL_DIR, &statbuf) < OK) { - log_it("CRON", getpid(), "STAT FAILED", SPOOL_DIR); + log_it(LOG_WARNING, "CRON", getpid(), "STAT FAILED", SPOOL_DIR); statbuf.st_mtime = 0; } /* track system crontab file */ if (stat(SYSCRONTAB, &syscron_stat) < OK) { - log_it("CRON", getpid(), "STAT FAILED", SYSCRONTAB); + log_it(LOG_WARNING, "CRON", getpid(), "STAT FAILED", SYSCRONTAB); syscron_stat.st_mtime = 0; } @@ -94,7 +94,7 @@ * file check won't */ if (stat(SYSCRONDIR, &syscrond_stat) < OK) { - log_it("CRON", getpid(), "STAT FAILED", SYSCRONDIR); + log_it(LOG_WARNING, "CRON", getpid(), "STAT FAILED", SYSCRONDIR); syscrond_stat.st_mtime = 0; } @@ -168,7 +168,7 @@ /* Read all the package crontabs. */ if (!(dir = opendir(SYSCRONDIR))) { - log_it("CRON", getpid(), "OPENDIR FAILED", SYSCRONDIR); + log_it(LOG_WARNING, "CRON", getpid(), "OPENDIR FAILED", SYSCRONDIR); } while (dir != NULL && NULL != (dp = readdir(dir))) { @@ -209,7 +209,7 @@ * we fork a lot more often than the mtime of the dir changes. */ if (!(dir = opendir(SPOOL_DIR))) { - log_it("CRON", getpid(), "OPENDIR FAILED", SPOOL_DIR); + log_it(LOG_WARNING, "CRON", getpid(), "OPENDIR FAILED", SPOOL_DIR); } while (dir != NULL && NULL != (dp = readdir(dir))) { @@ -323,7 +323,7 @@ */ if (strncmp(fname, "tmp.", 4)) { /* don't log these temporary files */ - log_it(fname, getpid(), "ORPHAN", "no passwd entry"); + log_it(LOG_NOTICE, fname, getpid(), "ORPHAN", "no passwd entry"); add_orphan(uname, fname, tabname); } goto next_crontab; @@ -334,39 +334,39 @@ if ((crontab_fd = open(tabname, O_RDONLY|O_NOFOLLOW, 0)) < OK) { /* crontab not accessible? */ - log_it(fname, getpid(), "CAN'T OPEN", tabname); + log_it(LOG_WARNING, fname, getpid(), "CAN'T OPEN", tabname); goto next_crontab; } if (fstat(crontab_fd, statbuf) < OK) { - log_it(fname, getpid(), "FSTAT FAILED", tabname); + log_it(LOG_WARNING, fname, getpid(), "FSTAT FAILED", tabname); goto next_crontab; } /* Check to make sure that the crontab is owned by the correct user (or root) */ if (statbuf->st_uid != pw->pw_uid && statbuf->st_uid != ROOT_UID) { - log_it(fname, getpid(), "WRONG FILE OWNER", tabname); + log_it(LOG_NOTICE, fname, getpid(), "WRONG FILE OWNER", tabname); force_rescan_user(old_db, new_db, fname, 0); goto next_crontab; } /* Check to make sure that the crontab is a regular file */ if (!S_ISREG(statbuf->st_mode)) { - log_it(fname, getpid(), "NOT A REGULAR FILE", tabname); + log_it(LOG_WARNING, fname, getpid(), "NOT A REGULAR FILE", tabname); goto next_crontab; } /* Check to make sure that the crontab's permissions are secure */ if ((statbuf->st_mode & 07777) != 0600) { - log_it(fname, getpid(), "INSECURE MODE (mode 0600 expected)", tabname); + log_it(LOG_NOTICE, fname, getpid(), "INSECURE MODE (mode 0600 expected)", tabname); force_rescan_user(old_db, new_db, fname, 0); goto next_crontab; } /* Check to make sure that there are no hardlinks to the crontab */ if (statbuf->st_nlink != 1) { - log_it(fname, getpid(), "NUMBER OF HARD LINKS > 1", tabname); + log_it(LOG_NOTICE, fname, getpid(), "NUMBER OF HARD LINKS > 1", tabname); force_rescan_user(old_db, new_db, fname, 0); goto next_crontab; } @@ -374,11 +374,11 @@ /* System crontab path. These can be symlinks, but the symlink and the target must be owned by root. */ if (lstat(tabname, statbuf) < OK) { - log_it(fname, getpid(), "LSTAT FAILED", tabname); + log_it(LOG_WARNING, fname, getpid(), "LSTAT FAILED", tabname); goto next_crontab; } if (S_ISLNK(statbuf->st_mode) && statbuf->st_uid != ROOT_UID) { - log_it(fname, getpid(), "WRONG SYMLINK OWNER", tabname); + log_it(LOG_NOTICE, fname, getpid(), "WRONG SYMLINK OWNER", tabname); force_rescan_user(old_db, new_db, fname, 0); goto next_crontab; } @@ -392,29 +392,29 @@ * skip it instead. */ if (S_ISLNK(statbuf->st_mode)) { - log_it(fname, getpid(), "CAN'T OPEN SYMLINK", tabname); + log_it(LOG_NOTICE, fname, getpid(), "CAN'T OPEN SYMLINK", tabname); force_rescan_user(old_db, new_db, fname, 0); } else { - log_it(fname, getpid(), "CAN'T OPEN", tabname); + log_it(LOG_WARNING, fname, getpid(), "CAN'T OPEN", tabname); } goto next_crontab; } if (fstat(crontab_fd, statbuf) < OK) { - log_it(fname, getpid(), "FSTAT FAILED", tabname); + log_it(LOG_WARNING, fname, getpid(), "FSTAT FAILED", tabname); goto next_crontab; } /* Check to make sure that the crontab is owned by root */ if (statbuf->st_uid != ROOT_UID) { - log_it(fname, getpid(), "WRONG FILE OWNER", tabname); + log_it(LOG_NOTICE, fname, getpid(), "WRONG FILE OWNER", tabname); force_rescan_user(old_db, new_db, fname, 0); goto next_crontab; } /* Check to make sure that the crontab is a regular file */ if (!S_ISREG(statbuf->st_mode)) { - log_it(fname, getpid(), "NOT A REGULAR FILE", tabname); + log_it(LOG_NOTICE, fname, getpid(), "NOT A REGULAR FILE", tabname); goto next_crontab; } @@ -423,7 +423,7 @@ * (mode 0600). An upgrade path could be implemented for 4.1 */ if ((statbuf->st_mode & S_IWGRP) || (statbuf->st_mode & S_IWOTH)) { - log_it(fname, getpid(), "INSECURE MODE (group/other writable)", tabname); + log_it(LOG_NOTICE, fname, getpid(), "INSECURE MODE (group/other writable)", tabname); force_rescan_user(old_db, new_db, fname, 0); goto next_crontab; } @@ -436,7 +436,7 @@ /* Check to make sure that there are no hardlinks to the crontab */ if (statbuf->st_nlink != 1) { - log_it(fname, getpid(), "NUMBER OF HARD LINKS > 1", tabname); + log_it(LOG_NOTICE, fname, getpid(), "NUMBER OF HARD LINKS > 1", tabname); force_rescan_user(old_db, new_db, fname, 0); goto next_crontab; } @@ -473,7 +473,7 @@ Debug(DLOAD, (" [delete old data]")) unlink_user(old_db, u); free_user(u); - log_it(fname, getpid(), "RELOAD", tabname); + log_it(LOG_INFO, fname, getpid(), "RELOAD", tabname); } u = load_user(crontab_fd, pw, uname, fname, tabname); @@ -521,7 +521,7 @@ || regcomp(&tradre, "^[a-z0-9][a-z0-9-]*$", REG_NOSUB) || regcomp(&classicalre, "^[a-zA-Z0-9_-]+$", REG_EXTENDED | REG_NOSUB)) { - log_it("CRON", getpid(), "REGEX FAILED", "valid_name"); + log_it(LOG_NOTICE, "CRON", getpid(), "REGEX FAILED", "valid_name"); (void) exit(ERROR_EXIT); } } diff -u -r orig/cron-3.0pl1/debian/changelog cron-3.0pl1/debian/changelog --- orig/cron-3.0pl1/debian/changelog 2021-02-22 23:43:24.000000000 +0100 +++ cron-3.0pl1/debian/changelog 2022-07-19 12:37:40.866659216 +0200 @@ -1,3 +1,14 @@ +cron (3.0pl1-137+deb8u1.1) unstable; urgency=medium + + [ Greek - greek64.m...@gmail.com ] + * log to STDOUT when running in foreground + + [ Tomáš Pospíšek ] + * Non-maintainer upload. + * adapt Greek's patch to newer Debian cron + + -- Tomáš Pospíšek <tpo_...@sourcepole.ch> Tue, 19 Jul 2022 12:35:17 +0200 + cron (3.0pl1-137) unstable; urgency=medium [ Laurent Combe ] diff -u -r orig/cron-3.0pl1/debian/patches/series cron-3.0pl1/debian/patches/series --- orig/cron-3.0pl1/debian/patches/series 2021-02-22 23:43:24.000000000 +0100 +++ cron-3.0pl1/debian/patches/series 2022-07-19 14:24:39.013731786 +0200 @@ -68,3 +68,4 @@ features/Check-orphaned-crontabs-for-adoption.patch features/Add-option-to-include-FQDN-in-email.patch features/Add-MAILFROM-environment-variable.patch +log-to-stdout-when-in-foreground diff -u -r orig/cron-3.0pl1/do_command.c cron-3.0pl1/do_command.c --- orig/cron-3.0pl1/do_command.c 2022-07-19 12:18:36.000000000 +0200 +++ cron-3.0pl1/do_command.c 2022-07-19 14:24:39.000000000 +0200 @@ -72,7 +72,11 @@ while ((cronvar = cronenv[count++])) { if (!(jobenv = env_set(jobenv, cronvar))) { - syslog(LOG_ERR, "Setting Cron environment variable %s failed", cronvar); + char buf[MAX_TEMPSTR]; + snprintf(buf, MAX_TEMPSTR, + "Setting Cron environment variable %s failed\n", + cronvar); + log_it(LOG_ERR, "CRON", getpid(), "CRON ENVIROMENT FAIL", buf); return NULL; } } @@ -97,7 +102,7 @@ */ switch (fork()) { case -1: - log_it("CRON",getpid(),"error","can't fork"); + log_it(LOG_ERR, "CRON",getpid(),"error","can't fork"); break; case 0: /* child process */ @@ -175,7 +180,7 @@ pipe(stdin_pipe); /* child's stdin */ /* child's stdout */ if ((tmpout = tmpfile()) == NULL) { - log_it("CRON", getpid(), "error", "create tmpfile"); + log_it(LOG_ERR, "CRON", getpid(), "error", "create tmpfile"); exit(ERROR_EXIT); } @@ -233,7 +238,7 @@ */ switch (job_pid = fork()) { case -1: - log_it("CRON",getpid(),"error","can't fork"); + log_it(LOG_ERR, "CRON",getpid(),"error","can't fork"); exit(ERROR_EXIT); /*NOTREACHED*/ case 0: @@ -247,7 +252,7 @@ */ if ((log_level & CRON_LOG_JOBSTART) && ! (log_level & CRON_LOG_JOBPID)) { char *x = mkprints((u_char *)e->cmd, strlen(e->cmd)); - log_it(usernm, getpid(), "CMD", x); + log_it(LOG_INFO, usernm, getpid(), "CMD", x); free(x); } /* nothing to log from now on. close the log files. @@ -292,7 +297,7 @@ char msg[256]; snprintf(msg, 256, "do_command:setgid(%lu) failed: %s", (unsigned long) e->gid, strerror(errno)); - log_it("CRON",getpid(),"error",msg); + log_it(LOG_ERR, "CRON",getpid(),"error",msg); exit(ERROR_EXIT); } # if defined(BSD) || defined(POSIX) @@ -300,7 +305,7 @@ char msg[256]; snprintf(msg, 256, "do_command:initgroups(%lu) failed: %s", (unsigned long) e->gid, strerror(errno)); - log_it("CRON",getpid(),"error",msg); + log_it(LOG_ERR, "CRON",getpid(),"error",msg); exit(ERROR_EXIT); } # endif @@ -308,7 +313,7 @@ char msg[256]; snprintf(msg, 256, "do_command:setuid(%lu) failed: %s", (unsigned long) e->uid, strerror(errno)); - log_it("CRON",getpid(),"error",msg); + log_it(LOG_ERR, "CRON",getpid(),"error",msg); exit(ERROR_EXIT); } chdir(env_get("HOME", e->envp)); @@ -359,7 +364,7 @@ char logcmd[MAX_COMMAND + 8]; snprintf(logcmd, sizeof(logcmd), "[%d] %s", (int) job_pid, e->cmd); char *x = mkprints((u_char *)logcmd, strlen(logcmd)); - log_it(usernm, getpid(), "CMD", x); + log_it(LOG_INFO, usernm, getpid(), "CMD", x); free(x); } break; @@ -468,13 +473,13 @@ status = waiter; snprintf(msg, 256, "grandchild #%d failed with exit " "status %d", pid, WEXITSTATUS(waiter)); - log_it("CRON", getpid(), "error", msg); + log_it(LOG_ERR, "CRON", getpid(), "error", msg); } else if (WIFSIGNALED(waiter)) { status = waiter; snprintf(msg, 256, "grandchild #%d terminated by signal" " %d%s", pid, WTERMSIG(waiter), WCOREDUMP(waiter) ? ", dumped core" : ""); - log_it("CRON", getpid(), "error", msg); + log_it(LOG_ERR, "CRON", getpid(), "error", msg); } } } @@ -511,7 +516,7 @@ if (stat(MAILCMD, &mcsb) != 0) { Debug(DPROC|DEXT, ("%s not found, not sending mail\n", MAILCMD)) if (pos > 0) { - log_it("CRON", getpid(), "info", "No MTA installed, discarding output"); + log_it(LOG_WARNING, "CRON", getpid(), "info", "No MTA installed, discarding output"); } goto mail_finished; } else { @@ -619,11 +624,11 @@ "mailed %d byte%s of output " "but got status 0x%04x from MTA\n", bytes, (bytes==1)?"":"s", status); - log_it(usernm, getpid(), "MAIL", buf); + log_it(LOG_INFO, usernm, getpid(), "MAIL", buf); } if (ferror(tmpout)) { - log_it(usernm, getpid(), "MAIL", "stream error reading output"); + log_it(LOG_NOTICE, usernm, getpid(), "MAIL", "stream error reading output"); } mail_finished: @@ -638,7 +643,7 @@ } else { x = mkprints((u_char *)e->cmd, strlen(e->cmd)); } - log_it(usernm, job_pid, "END", x); + log_it(LOG_INFO, usernm, job_pid, "END", x); free(x); } @@ -696,7 +701,7 @@ if (isascii(ch) && isprint(ch) && (isalnum(ch) || (!first && strchr(safe_delim, ch)))) continue; - log_it(usernm, getpid(), "UNSAFE MAIL", s); + log_it(LOG_WARNING, usernm, getpid(), "UNSAFE MAIL", s); return (FALSE); } return (TRUE); diff -u -r orig/cron-3.0pl1/entry.c cron-3.0pl1/entry.c --- orig/cron-3.0pl1/entry.c 2022-07-19 12:18:36.000000000 +0200 +++ cron-3.0pl1/entry.c 2022-07-19 14:24:39.000000000 +0200 @@ -109,7 +109,7 @@ e = (entry *) calloc(sizeof(entry), sizeof(char)); if (e == NULL) { - log_it("CRON", getpid(), "OOM", "Out of memory parsing crontab"); + log_it(LOG_ERR, "CRON", getpid(), "OOM", "Out of memory parsing crontab"); return NULL; } diff -u -r orig/cron-3.0pl1/misc.c cron-3.0pl1/misc.c --- orig/cron-3.0pl1/misc.c 2022-07-19 12:18:36.000000000 +0200 +++ cron-3.0pl1/misc.c 2022-07-19 14:24:39.000000000 +0200 @@ -303,7 +303,7 @@ snprintf(buf, MAX_TEMPSTR, "can't open or create %s: %s", pidfile, strerror(errno)); fprintf(stderr, "%s: %s\n", ProgramName, buf); - log_it("CRON", getpid(), "DEATH", buf); + log_it(LOG_ERR, "CRON", getpid(), "DEATH", buf); exit(ERROR_EXIT); } @@ -314,11 +314,11 @@ snprintf(buf, MAX_TEMPSTR, "can't lock %s, otherpid may be %d: %s", pidfile, otherpid, strerror(save_errno)); fprintf(stderr, "%s: %s\n", ProgramName, buf); - log_it("CRON", getpid(), "DEATH", buf); + log_it(LOG_ERR, "CRON", getpid(), "DEATH", buf); exit(ERROR_EXIT); } snprintf(buf, MAX_TEMPSTR, "pidfile fd = %d", fd); - log_it("CRON", getpid(), "INFO", buf); + log_it(LOG_INFO, "CRON", getpid(), "INFO", buf); (void) fcntl(fd, F_SETFD, 1); } @@ -523,7 +523,8 @@ void -log_it(username, xpid, event, detail) +log_it(priority, username, xpid, event, detail) + int priority; char *username; int xpid; char *event; @@ -531,6 +532,39 @@ { PID_T pid = xpid; #if defined(LOG_FILE) + + /* Logging priority parsing */ + char *prio; + switch(priority){ + case LOG_EMERG: + prio = "EMERGENCY: "; + break; + case LOG_ALERT: + prio = "ALERT: "; + break; + case LOG_CRIT: + prio = "CRITICAL: "; + break; + case LOG_ERR: + prio = "ERROR: "; + break; + case LOG_WARNING: + prio = "WARNING: "; + break; + case LOG_NOTICE: + prio = "NOTICE: "; + break; + case LOG_INFO: + prio = "INFO: "; + break; + case LOG_DEBUG: + prio = "DEBUG: "; + break; + default: + prio = "INFO: "; + break; + } + char *msg; TIME_T now = time((TIME_T) 0); register struct tm *t = localtime(&now); @@ -540,7 +574,7 @@ #if defined(LOG_FILE) /* we assume that MAX_TEMPSTR will hold the date, time, &punctuation. */ - msg_size = strlen(username) + strlen(event) + strlen(detail) + MAX_TEMPSTR; + msg_size = strlen(prio) + strlen(username) + strlen(event) + strlen(detail) + MAX_TEMPSTR; msg = malloc(msg_size); if (msg == NULL) { /* damn, out of mem and we did not test that before... */ @@ -562,8 +596,8 @@ * everything out in one chunk and this has to be atomically appended * to the log file. */ - snprintf(msg, msg_size, "%s (%02d/%02d-%02d:%02d:%02d-%d) %s (%s)\n", - username, + snprintf(msg, msg_size, "%s%s (%02d/%02d-%02d:%02d:%02d-%d) %s (%s)\n", + prio, username, t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, pid, event, detail); @@ -586,13 +620,13 @@ openlog(ProgramName, LOG_PID); # endif - syslog(LOG_INFO, "(%s) %s (%s)", username, event, detail); + syslog(priority, "(%s) %s (%s)", username, event, detail); #endif /*SYSLOG*/ #if DEBUGGING if (DebugFlags) { - fprintf(stderr, "log_it: (%s %d) %s (%s)\n", + fprintf(stderr, "log_it: priority %d (%s %d) %s (%s)\n", username, xpid, event, detail); } #endif diff -u -r orig/cron-3.0pl1/.pc/applied-patches cron-3.0pl1/.pc/applied-patches --- orig/cron-3.0pl1/.pc/applied-patches 2022-07-19 12:18:36.185796305 +0200 +++ cron-3.0pl1/.pc/applied-patches 2022-07-19 14:24:39.029731419 +0200 @@ -68,3 +68,4 @@ features/Check-orphaned-crontabs-for-adoption.patch features/Add-option-to-include-FQDN-in-email.patch features/Add-MAILFROM-environment-variable.patch +log-to-stdout-when-in-foreground diff -u -r orig/cron-3.0pl1/popen.c cron-3.0pl1/popen.c --- orig/cron-3.0pl1/popen.c 2022-07-19 12:18:36.000000000 +0200 +++ cron-3.0pl1/popen.c 2022-07-19 14:24:39.000000000 +0200 @@ -128,7 +128,7 @@ char msg[256]; snprintf(msg, 256, "popen:setgid(%lu) failed: %s", (unsigned long) e->gid, strerror(errno)); - log_it("CRON",getpid(),"error",msg); + log_it(LOG_ERR, "CRON",getpid(),"error",msg); exit(ERROR_EXIT); } # if defined(BSD) || defined(POSIX) @@ -136,7 +136,7 @@ char msg[256]; snprintf(msg, 256, "popen:initgroups(%lu) failed: %s", (unsigned long) e->gid, strerror(errno)); - log_it("CRON",getpid(),"error",msg); + log_it(LOG_ERR, "CRON",getpid(),"error",msg); exit(ERROR_EXIT); } # endif @@ -144,7 +144,7 @@ char msg[256]; snprintf(msg, 256, "popen: setuid(%lu) failed: %s", (unsigned long) e->uid, strerror(errno)); - log_it("CRON",getpid(),"error",msg); + log_it(LOG_ERR, "CRON",getpid(),"error",msg); exit(ERROR_EXIT); } chdir(env_get("HOME", e->envp)); diff -u -r orig/cron-3.0pl1/user.c cron-3.0pl1/user.c --- orig/cron-3.0pl1/user.c 2022-07-19 12:18:36.000000000 +0200 +++ cron-3.0pl1/user.c 2022-07-19 14:24:39.000000000 +0200 @@ -23,7 +23,9 @@ */ +#if defined(SYSLOG) #include <syslog.h> +#endif #include <string.h> #include "cron.h" @@ -46,20 +48,20 @@ int i; if (getcon(¤t_con)) { - log_it(name, getpid(), "Can't get current context", tabname); + log_it(LOG_ERR, name, getpid(), "Can't get current context", tabname); return -1; } if (name != NULL) { if (getseuserbyname(name, &seuser, &level)) { - log_it(name, getpid(), "getseuserbyname FAILED", tabname); + log_it(LOG_ERR, name, getpid(), "getseuserbyname FAILED", tabname); freecon(current_con); return (security_getenforce() > 0); } } else { context_t temp_con = context_new(current_con); if (temp_con == NULL) { - log_it(name, getpid(), "context_new FAILED", tabname); + log_it(LOG_ERR, name, getpid(), "context_new FAILED", tabname); freecon(current_con); return (security_getenforce() > 0); } @@ -74,10 +76,10 @@ free(level); if (list_count == -1) { if (security_getenforce() > 0) { - log_it(name, getpid(), "No SELinux security context", tabname); + log_it(LOG_ERR, name, getpid(), "No SELinux security context", tabname); return -1; } else { - log_it(name, getpid(), + log_it(LOG_NOTICE, name, getpid(), "No security context but SELinux in permissive mode," " continuing", tabname); return 0; @@ -86,11 +88,11 @@ if (fgetfilecon(crontab_fd, &file_context) < OK) { if (security_getenforce() > 0) { - log_it(name, getpid(), "getfilecon FAILED", tabname); + log_it(LOG_ERR, name, getpid(), "getfilecon FAILED", tabname); freeconary(context_list); return -1; } else { - log_it(name, getpid(), "getfilecon FAILED but SELinux in " + log_it(LOG_NOTICE, name, getpid(), "getfilecon FAILED but SELinux in " "permissive mode, continuing", tabname); *rcontext = strdup(context_list[0]); freeconary(context_list); @@ -108,7 +110,7 @@ security_class_t tclass = string_to_security_class("file"); if (!tclass) { - log_it(name, getpid(), "Failed to translate security class file", tabname); + log_it(LOG_ERR, name, getpid(), "Failed to translate security class file", tabname); freeconary(context_list); if (security_deny_unknown() == 0) { return 0; @@ -119,7 +121,7 @@ access_vector_t bit = string_to_av_perm(tclass, "entrypoint"); if (!bit) { - log_it(name, getpid(), "Failed to translate av perm entrypoint", tabname); + log_it(LOG_ERR, name, getpid(), "Failed to translate av perm entrypoint", tabname); freeconary(context_list); if (security_deny_unknown() == 0) { return 0; @@ -143,11 +145,11 @@ } freecon(file_context); if (security_getenforce() > 0) { - log_it(name, getpid(), "ENTRYPOINT FAILED", tabname); + log_it(LOG_ERR, name, getpid(), "ENTRYPOINT FAILED", tabname); freeconary(context_list); return -1; } else { - log_it(name, getpid(), "ENTRYPOINT FAILED but SELinux in permissive mode, continuing", tabname); + log_it(LOG_NOTICE, name, getpid(), "ENTRYPOINT FAILED but SELinux in permissive mode, continuing", tabname); *rcontext = strdup(context_list[0]); freeconary(context_list); } @@ -168,14 +170,25 @@ const char *fn; /* Figure out the file name from the username */ if (0 == strcmp(err_user, "*system*")) { - syslog(LOG_ERR|LOG_CRON, "Error: %s; while reading %s", msg, SYSCRONTAB); + char buf[MAX_TEMPSTR]; + snprintf(buf, MAX_TEMPSTR, + "Error: %s; while reading %s", + msg, SYSCRONTAB); + log_it(LOG_ERR, err_user, getpid(), "ERROR", buf); } else if (0 == strncmp(err_user,"*system*",8)) { fn = err_user+8; - syslog(LOG_ERR|LOG_CRON, "Error: %s; while reading %s/%s", msg, - SYSCRONDIR,fn); + char buf[MAX_TEMPSTR]; + snprintf(buf, MAX_TEMPSTR, + "Error: %s; while reading %s/%s", + msg, SYSCRONDIR, fn); + log_it(LOG_ERR, err_user, getpid(), "ERROR", buf); + } else { - syslog(LOG_ERR|LOG_CRON, "Error: %s; while reading crontab for user %s", - msg, err_user); + char buf[MAX_TEMPSTR]; + snprintf(buf, MAX_TEMPSTR, + "Error: %s; while reading crontab for user %s", + msg, err_user); + log_it(LOG_ERR, err_user, getpid(), "ERROR", buf); } } @@ -274,7 +287,7 @@ * newline, so we bail out */ if (envstr[0] != '\0') { - log_it(u->name, getpid(), "ERROR", "Missing " + log_it(LOG_WARNING, u->name, getpid(), "ERROR", "Missing " "newline before EOF, this crontab file will be " "ignored"); free_user(u); @@ -290,7 +303,7 @@ u->crontab = e; } else { /* stop processing on syntax error */ - log_it(u->name, getpid(), "ERROR", "Syntax " + log_it(LOG_WARNING, u->name, getpid(), "ERROR", "Syntax " "error, this crontab file will be " "ignored"); free_user(u); @@ -314,7 +327,7 @@ } while (status >= OK && LineNumber < MAX_TAB_LINES + NHEADER_LINES + 2); if (LineNumber >= MAX_TAB_LINES + NHEADER_LINES + 2) { - log_it(fname, getpid(), "ERROR", "crontab must not be longer " + log_it(LOG_WARNING, fname, getpid(), "ERROR", "crontab must not be longer " "than " Stringify(MAX_TAB_LINES) " lines, " "this crontab file will be ignored"); free_user(u);
Description: <short summary of the patch> cron (3.0pl1-137+deb8u1.1) unstable; urgency=medium . [ Greek - greek64.m...@gmail.com ] * log to STDOUT when running in foreground . [ Tomáš Pospíšek ] * Non-maintainer upload. * adapt Greek's patch to newer Debian cron Author: Tomáš Pospíšek <tpo_...@sourcepole.ch> --- The information above should follow the Patch Tagging Guidelines, please checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here are templates for supplementary fields that you might want to add: Origin: other, https://bugs.debian.org/cgi-bin/bugreport.cgi?att=1;bug=887035;filename=cron-syslog-fix-and-foreground-stdout.patch;msg=5 Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=887035 Reviewed-By: Tomáš Pospíšek <tpo_...@sourcepole.ch> Last-Update: 2022-07-19 --- cron-3.0pl1.orig/cron.c +++ cron-3.0pl1/cron.c @@ -122,12 +122,12 @@ main(argc, argv) } else if (!stay_foreground) { switch (fork()) { case -1: - log_it("CRON",getpid(),"DEATH","can't fork"); + log_it(LOG_ERR, "CRON",getpid(),"DEATH","can't fork"); exit(0); break; case 0: /* child process */ - log_it("CRON",getpid(),"STARTUP","fork ok"); + log_it(LOG_INFO, "CRON",getpid(),"STARTUP","fork ok"); (void) setsid(); freopen("/dev/null", "r", stdin); freopen("/dev/null", "w", stdout); @@ -281,18 +281,18 @@ run_reboot_jobs(db) /* Run on actual reboot, rather than cron restart */ if (access(REBOOT_FILE, F_OK) == 0) { /* File exists, return */ - log_it("CRON", getpid(),"INFO", + log_it(LOG_INFO, "CRON", getpid(),"INFO", "Skipping @reboot jobs -- not system startup"); return; } /* Create the file */ if ((rbfd = creat(REBOOT_FILE, S_IRUSR & S_IWUSR)) < 0) { /* Bad news, bail out */ - log_it("CRON",getpid(),"DEATH","Can't create reboot check file"); + log_it(LOG_ERR, "CRON",getpid(),"DEATH","Can't create reboot check file"); exit(0); } else { close(rbfd); - log_it("CRON", getpid(),"INFO", "Running @reboot jobs"); + log_it(LOG_INFO, "CRON", getpid(),"INFO", "Running @reboot jobs"); } Debug(DMISC, ("[%d], running reboot jobs\n", getpid())); for (u = db->head; u != NULL; u = u->next) { --- cron-3.0pl1.orig/cron.h +++ cron-3.0pl1/cron.h @@ -144,6 +144,20 @@ typedef int time_min; #define CRON_LOG_JOBFAILED 0x04 #define CRON_LOG_JOBPID 0x08 +/* Log priorities */ +#if !defined(SYSLOG) +#define LOG_EMERG 0 +#define LOG_ALERT 1 +#define LOG_CRIT 2 +#define LOG_ERR 3 +#define LOG_WARNING 4 +#define LOG_NOTICE 5 +#define LOG_INFO 6 +#define LOG_DEBUG 7 +#else +#include <syslog.h> +#endif + #define SECONDS_PER_MINUTE 60 #define FIRST_MINUTE 0 @@ -238,7 +252,7 @@ void set_cron_uid __P((void)), free_entry __P((entry *)), acquire_daemonlock __P((int)), skip_comments __P((FILE *)), - log_it __P((char *, int, char *, char *)), + log_it __P((int, char *, int, char *, char *)), log_close __P((void)), check_orphans __P((cron_db *)); --- cron-3.0pl1.orig/crontab.c +++ cron-3.0pl1/crontab.c @@ -119,7 +119,7 @@ main(argc, argv) "You (%s) are not allowed to use this program (%s)\n", User, ProgramName); fprintf(stderr, "See crontab(1) for more information\n"); - log_it(RealUser, Pid, "AUTH", "crontab command not allowed"); + log_it(LOG_NOTICE, RealUser, Pid, "AUTH", "crontab command not allowed"); } else { /* If the user is not allowed but root is running the * program warn but do not log */ @@ -301,7 +301,7 @@ list_cmd() { int x; char *ctnh; - log_it(RealUser, Pid, "LIST", User); + log_it(LOG_INFO, RealUser, Pid, "LIST", User); (void) snprintf(n, MAX_FNAME, CRON_TAB(User)); if (!(f = fopen(n, "r"))) { if (errno == ENOENT) @@ -383,7 +383,7 @@ delete_cmd() { } } - log_it(RealUser, Pid, "DELETE", User); + log_it(LOG_INFO, RealUser, Pid, "DELETE", User); if (unlink(n)) { if (errno == ENOENT) fprintf(stderr, "no crontab for %s\n", User); @@ -551,7 +551,7 @@ edit_cmd() { mode_t um; int add_help_text = 0; - log_it(RealUser, Pid, "BEGIN EDIT", User); + log_it(LOG_INFO, RealUser, Pid, "BEGIN EDIT", User); (void) snprintf(n, MAX_FNAME, CRON_TAB(User)); if (!(f = fopen(n, "r"))) { if (errno != ENOENT) { @@ -779,7 +779,7 @@ again: /* Loop point for retrying edit a remove: cleanup_tmp_crontab(); done: - log_it(RealUser, Pid, "END EDIT", User); + log_it(LOG_INFO, RealUser, Pid, "END EDIT", User); return; fatal: cleanup_tmp_crontab(); @@ -941,7 +941,7 @@ replace_cmd() { unlink(tn); return (-2); } - log_it(RealUser, Pid, "REPLACE", User); + log_it(LOG_INFO, RealUser, Pid, "REPLACE", User); poke_daemon(); --- cron-3.0pl1.orig/database.c +++ cron-3.0pl1/database.c @@ -78,14 +78,14 @@ load_database(old_db) * cached any of the database), we'll see the changes next time. */ if (stat(SPOOL_DIR, &statbuf) < OK) { - log_it("CRON", getpid(), "STAT FAILED", SPOOL_DIR); + log_it(LOG_WARNING, "CRON", getpid(), "STAT FAILED", SPOOL_DIR); statbuf.st_mtime = 0; } /* track system crontab file */ if (stat(SYSCRONTAB, &syscron_stat) < OK) { - log_it("CRON", getpid(), "STAT FAILED", SYSCRONTAB); + log_it(LOG_WARNING, "CRON", getpid(), "STAT FAILED", SYSCRONTAB); syscron_stat.st_mtime = 0; } @@ -94,7 +94,7 @@ load_database(old_db) * file check won't */ if (stat(SYSCRONDIR, &syscrond_stat) < OK) { - log_it("CRON", getpid(), "STAT FAILED", SYSCRONDIR); + log_it(LOG_WARNING, "CRON", getpid(), "STAT FAILED", SYSCRONDIR); syscrond_stat.st_mtime = 0; } @@ -168,7 +168,7 @@ load_database(old_db) /* Read all the package crontabs. */ if (!(dir = opendir(SYSCRONDIR))) { - log_it("CRON", getpid(), "OPENDIR FAILED", SYSCRONDIR); + log_it(LOG_WARNING, "CRON", getpid(), "OPENDIR FAILED", SYSCRONDIR); } while (dir != NULL && NULL != (dp = readdir(dir))) { @@ -209,7 +209,7 @@ load_database(old_db) * we fork a lot more often than the mtime of the dir changes. */ if (!(dir = opendir(SPOOL_DIR))) { - log_it("CRON", getpid(), "OPENDIR FAILED", SPOOL_DIR); + log_it(LOG_WARNING, "CRON", getpid(), "OPENDIR FAILED", SPOOL_DIR); } while (dir != NULL && NULL != (dp = readdir(dir))) { @@ -323,7 +323,7 @@ process_crontab(uname, fname, tabname, s */ if (strncmp(fname, "tmp.", 4)) { /* don't log these temporary files */ - log_it(fname, getpid(), "ORPHAN", "no passwd entry"); + log_it(LOG_NOTICE, fname, getpid(), "ORPHAN", "no passwd entry"); add_orphan(uname, fname, tabname); } goto next_crontab; @@ -334,39 +334,39 @@ process_crontab(uname, fname, tabname, s if ((crontab_fd = open(tabname, O_RDONLY|O_NOFOLLOW, 0)) < OK) { /* crontab not accessible? */ - log_it(fname, getpid(), "CAN'T OPEN", tabname); + log_it(LOG_WARNING, fname, getpid(), "CAN'T OPEN", tabname); goto next_crontab; } if (fstat(crontab_fd, statbuf) < OK) { - log_it(fname, getpid(), "FSTAT FAILED", tabname); + log_it(LOG_WARNING, fname, getpid(), "FSTAT FAILED", tabname); goto next_crontab; } /* Check to make sure that the crontab is owned by the correct user (or root) */ if (statbuf->st_uid != pw->pw_uid && statbuf->st_uid != ROOT_UID) { - log_it(fname, getpid(), "WRONG FILE OWNER", tabname); + log_it(LOG_NOTICE, fname, getpid(), "WRONG FILE OWNER", tabname); force_rescan_user(old_db, new_db, fname, 0); goto next_crontab; } /* Check to make sure that the crontab is a regular file */ if (!S_ISREG(statbuf->st_mode)) { - log_it(fname, getpid(), "NOT A REGULAR FILE", tabname); + log_it(LOG_WARNING, fname, getpid(), "NOT A REGULAR FILE", tabname); goto next_crontab; } /* Check to make sure that the crontab's permissions are secure */ if ((statbuf->st_mode & 07777) != 0600) { - log_it(fname, getpid(), "INSECURE MODE (mode 0600 expected)", tabname); + log_it(LOG_NOTICE, fname, getpid(), "INSECURE MODE (mode 0600 expected)", tabname); force_rescan_user(old_db, new_db, fname, 0); goto next_crontab; } /* Check to make sure that there are no hardlinks to the crontab */ if (statbuf->st_nlink != 1) { - log_it(fname, getpid(), "NUMBER OF HARD LINKS > 1", tabname); + log_it(LOG_NOTICE, fname, getpid(), "NUMBER OF HARD LINKS > 1", tabname); force_rescan_user(old_db, new_db, fname, 0); goto next_crontab; } @@ -374,11 +374,11 @@ process_crontab(uname, fname, tabname, s /* System crontab path. These can be symlinks, but the symlink and the target must be owned by root. */ if (lstat(tabname, statbuf) < OK) { - log_it(fname, getpid(), "LSTAT FAILED", tabname); + log_it(LOG_WARNING, fname, getpid(), "LSTAT FAILED", tabname); goto next_crontab; } if (S_ISLNK(statbuf->st_mode) && statbuf->st_uid != ROOT_UID) { - log_it(fname, getpid(), "WRONG SYMLINK OWNER", tabname); + log_it(LOG_NOTICE, fname, getpid(), "WRONG SYMLINK OWNER", tabname); force_rescan_user(old_db, new_db, fname, 0); goto next_crontab; } @@ -392,29 +392,29 @@ process_crontab(uname, fname, tabname, s * skip it instead. */ if (S_ISLNK(statbuf->st_mode)) { - log_it(fname, getpid(), "CAN'T OPEN SYMLINK", tabname); + log_it(LOG_NOTICE, fname, getpid(), "CAN'T OPEN SYMLINK", tabname); force_rescan_user(old_db, new_db, fname, 0); } else { - log_it(fname, getpid(), "CAN'T OPEN", tabname); + log_it(LOG_WARNING, fname, getpid(), "CAN'T OPEN", tabname); } goto next_crontab; } if (fstat(crontab_fd, statbuf) < OK) { - log_it(fname, getpid(), "FSTAT FAILED", tabname); + log_it(LOG_WARNING, fname, getpid(), "FSTAT FAILED", tabname); goto next_crontab; } /* Check to make sure that the crontab is owned by root */ if (statbuf->st_uid != ROOT_UID) { - log_it(fname, getpid(), "WRONG FILE OWNER", tabname); + log_it(LOG_NOTICE, fname, getpid(), "WRONG FILE OWNER", tabname); force_rescan_user(old_db, new_db, fname, 0); goto next_crontab; } /* Check to make sure that the crontab is a regular file */ if (!S_ISREG(statbuf->st_mode)) { - log_it(fname, getpid(), "NOT A REGULAR FILE", tabname); + log_it(LOG_NOTICE, fname, getpid(), "NOT A REGULAR FILE", tabname); goto next_crontab; } @@ -423,7 +423,7 @@ process_crontab(uname, fname, tabname, s * (mode 0600). An upgrade path could be implemented for 4.1 */ if ((statbuf->st_mode & S_IWGRP) || (statbuf->st_mode & S_IWOTH)) { - log_it(fname, getpid(), "INSECURE MODE (group/other writable)", tabname); + log_it(LOG_NOTICE, fname, getpid(), "INSECURE MODE (group/other writable)", tabname); force_rescan_user(old_db, new_db, fname, 0); goto next_crontab; } @@ -436,7 +436,7 @@ process_crontab(uname, fname, tabname, s /* Check to make sure that there are no hardlinks to the crontab */ if (statbuf->st_nlink != 1) { - log_it(fname, getpid(), "NUMBER OF HARD LINKS > 1", tabname); + log_it(LOG_NOTICE, fname, getpid(), "NUMBER OF HARD LINKS > 1", tabname); force_rescan_user(old_db, new_db, fname, 0); goto next_crontab; } @@ -473,7 +473,7 @@ process_crontab(uname, fname, tabname, s Debug(DLOAD, (" [delete old data]")) unlink_user(old_db, u); free_user(u); - log_it(fname, getpid(), "RELOAD", tabname); + log_it(LOG_INFO, fname, getpid(), "RELOAD", tabname); } u = load_user(crontab_fd, pw, uname, fname, tabname); @@ -521,7 +521,7 @@ valid_name(char *filename) || regcomp(&tradre, "^[a-z0-9][a-z0-9-]*$", REG_NOSUB) || regcomp(&classicalre, "^[a-zA-Z0-9_-]+$", REG_EXTENDED | REG_NOSUB)) { - log_it("CRON", getpid(), "REGEX FAILED", "valid_name"); + log_it(LOG_NOTICE, "CRON", getpid(), "REGEX FAILED", "valid_name"); (void) exit(ERROR_EXIT); } } --- cron-3.0pl1.orig/do_command.c +++ cron-3.0pl1/do_command.c @@ -72,7 +72,11 @@ static char **build_env(char **cronenv) while ((cronvar = cronenv[count++])) { if (!(jobenv = env_set(jobenv, cronvar))) { - syslog(LOG_ERR, "Setting Cron environment variable %s failed", cronvar); + char buf[MAX_TEMPSTR]; + snprintf(buf, MAX_TEMPSTR, + "Setting Cron environment variable %s failed\n", + cronvar); + log_it(LOG_ERR, "CRON", getpid(), "CRON ENVIROMENT FAIL", buf); return NULL; } } @@ -97,7 +101,7 @@ do_command(e, u) */ switch (fork()) { case -1: - log_it("CRON",getpid(),"error","can't fork"); + log_it(LOG_ERR, "CRON",getpid(),"error","can't fork"); break; case 0: /* child process */ @@ -175,7 +179,7 @@ child_process(e, u) pipe(stdin_pipe); /* child's stdin */ /* child's stdout */ if ((tmpout = tmpfile()) == NULL) { - log_it("CRON", getpid(), "error", "create tmpfile"); + log_it(LOG_ERR, "CRON", getpid(), "error", "create tmpfile"); exit(ERROR_EXIT); } @@ -233,7 +237,7 @@ child_process(e, u) */ switch (job_pid = fork()) { case -1: - log_it("CRON",getpid(),"error","can't fork"); + log_it(LOG_ERR, "CRON",getpid(),"error","can't fork"); exit(ERROR_EXIT); /*NOTREACHED*/ case 0: @@ -247,7 +251,7 @@ child_process(e, u) */ if ((log_level & CRON_LOG_JOBSTART) && ! (log_level & CRON_LOG_JOBPID)) { char *x = mkprints((u_char *)e->cmd, strlen(e->cmd)); - log_it(usernm, getpid(), "CMD", x); + log_it(LOG_INFO, usernm, getpid(), "CMD", x); free(x); } /* nothing to log from now on. close the log files. @@ -292,7 +296,7 @@ child_process(e, u) char msg[256]; snprintf(msg, 256, "do_command:setgid(%lu) failed: %s", (unsigned long) e->gid, strerror(errno)); - log_it("CRON",getpid(),"error",msg); + log_it(LOG_ERR, "CRON",getpid(),"error",msg); exit(ERROR_EXIT); } # if defined(BSD) || defined(POSIX) @@ -300,7 +304,7 @@ child_process(e, u) char msg[256]; snprintf(msg, 256, "do_command:initgroups(%lu) failed: %s", (unsigned long) e->gid, strerror(errno)); - log_it("CRON",getpid(),"error",msg); + log_it(LOG_ERR, "CRON",getpid(),"error",msg); exit(ERROR_EXIT); } # endif @@ -308,7 +312,7 @@ child_process(e, u) char msg[256]; snprintf(msg, 256, "do_command:setuid(%lu) failed: %s", (unsigned long) e->uid, strerror(errno)); - log_it("CRON",getpid(),"error",msg); + log_it(LOG_ERR, "CRON",getpid(),"error",msg); exit(ERROR_EXIT); } chdir(env_get("HOME", e->envp)); @@ -359,7 +363,7 @@ child_process(e, u) char logcmd[MAX_COMMAND + 8]; snprintf(logcmd, sizeof(logcmd), "[%d] %s", (int) job_pid, e->cmd); char *x = mkprints((u_char *)logcmd, strlen(logcmd)); - log_it(usernm, getpid(), "CMD", x); + log_it(LOG_INFO, usernm, getpid(), "CMD", x); free(x); } break; @@ -468,13 +472,13 @@ child_process(e, u) status = waiter; snprintf(msg, 256, "grandchild #%d failed with exit " "status %d", pid, WEXITSTATUS(waiter)); - log_it("CRON", getpid(), "error", msg); + log_it(LOG_ERR, "CRON", getpid(), "error", msg); } else if (WIFSIGNALED(waiter)) { status = waiter; snprintf(msg, 256, "grandchild #%d terminated by signal" " %d%s", pid, WTERMSIG(waiter), WCOREDUMP(waiter) ? ", dumped core" : ""); - log_it("CRON", getpid(), "error", msg); + log_it(LOG_ERR, "CRON", getpid(), "error", msg); } } } @@ -511,7 +515,7 @@ child_process(e, u) if (stat(MAILCMD, &mcsb) != 0) { Debug(DPROC|DEXT, ("%s not found, not sending mail\n", MAILCMD)) if (pos > 0) { - log_it("CRON", getpid(), "info", "No MTA installed, discarding output"); + log_it(LOG_WARNING, "CRON", getpid(), "info", "No MTA installed, discarding output"); } goto mail_finished; } else { @@ -619,11 +623,11 @@ child_process(e, u) "mailed %d byte%s of output " "but got status 0x%04x from MTA\n", bytes, (bytes==1)?"":"s", status); - log_it(usernm, getpid(), "MAIL", buf); + log_it(LOG_INFO, usernm, getpid(), "MAIL", buf); } if (ferror(tmpout)) { - log_it(usernm, getpid(), "MAIL", "stream error reading output"); + log_it(LOG_NOTICE, usernm, getpid(), "MAIL", "stream error reading output"); } mail_finished: @@ -638,7 +642,7 @@ mail_finished: } else { x = mkprints((u_char *)e->cmd, strlen(e->cmd)); } - log_it(usernm, job_pid, "END", x); + log_it(LOG_INFO, usernm, job_pid, "END", x); free(x); } @@ -696,7 +700,7 @@ static int safe_p(const char *usernm, co if (isascii(ch) && isprint(ch) && (isalnum(ch) || (!first && strchr(safe_delim, ch)))) continue; - log_it(usernm, getpid(), "UNSAFE MAIL", s); + log_it(LOG_WARNING, usernm, getpid(), "UNSAFE MAIL", s); return (FALSE); } return (TRUE); --- cron-3.0pl1.orig/entry.c +++ cron-3.0pl1/entry.c @@ -109,7 +109,7 @@ load_entry(file, error_func, pw, envp) e = (entry *) calloc(sizeof(entry), sizeof(char)); if (e == NULL) { - log_it("CRON", getpid(), "OOM", "Out of memory parsing crontab"); + log_it(LOG_ERR, "CRON", getpid(), "OOM", "Out of memory parsing crontab"); return NULL; } --- cron-3.0pl1.orig/misc.c +++ cron-3.0pl1/misc.c @@ -303,7 +303,7 @@ acquire_daemonlock(closeflag) snprintf(buf, MAX_TEMPSTR, "can't open or create %s: %s", pidfile, strerror(errno)); fprintf(stderr, "%s: %s\n", ProgramName, buf); - log_it("CRON", getpid(), "DEATH", buf); + log_it(LOG_ERR, "CRON", getpid(), "DEATH", buf); exit(ERROR_EXIT); } @@ -314,11 +314,11 @@ acquire_daemonlock(closeflag) snprintf(buf, MAX_TEMPSTR, "can't lock %s, otherpid may be %d: %s", pidfile, otherpid, strerror(save_errno)); fprintf(stderr, "%s: %s\n", ProgramName, buf); - log_it("CRON", getpid(), "DEATH", buf); + log_it(LOG_ERR, "CRON", getpid(), "DEATH", buf); exit(ERROR_EXIT); } snprintf(buf, MAX_TEMPSTR, "pidfile fd = %d", fd); - log_it("CRON", getpid(), "INFO", buf); + log_it(LOG_INFO, "CRON", getpid(), "INFO", buf); (void) fcntl(fd, F_SETFD, 1); } @@ -523,7 +523,8 @@ allowed(username) void -log_it(username, xpid, event, detail) +log_it(priority, username, xpid, event, detail) + int priority; char *username; int xpid; char *event; @@ -531,6 +532,39 @@ log_it(username, xpid, event, detail) { PID_T pid = xpid; #if defined(LOG_FILE) + + /* Logging priority parsing */ + char *prio; + switch(priority){ + case LOG_EMERG: + prio = "EMERGENCY: "; + break; + case LOG_ALERT: + prio = "ALERT: "; + break; + case LOG_CRIT: + prio = "CRITICAL: "; + break; + case LOG_ERR: + prio = "ERROR: "; + break; + case LOG_WARNING: + prio = "WARNING: "; + break; + case LOG_NOTICE: + prio = "NOTICE: "; + break; + case LOG_INFO: + prio = "INFO: "; + break; + case LOG_DEBUG: + prio = "DEBUG: "; + break; + default: + prio = "INFO: "; + break; + } + char *msg; TIME_T now = time((TIME_T) 0); register struct tm *t = localtime(&now); @@ -540,7 +574,7 @@ log_it(username, xpid, event, detail) #if defined(LOG_FILE) /* we assume that MAX_TEMPSTR will hold the date, time, &punctuation. */ - msg_size = strlen(username) + strlen(event) + strlen(detail) + MAX_TEMPSTR; + msg_size = strlen(prio) + strlen(username) + strlen(event) + strlen(detail) + MAX_TEMPSTR; msg = malloc(msg_size); if (msg == NULL) { /* damn, out of mem and we did not test that before... */ @@ -562,8 +596,8 @@ log_it(username, xpid, event, detail) * everything out in one chunk and this has to be atomically appended * to the log file. */ - snprintf(msg, msg_size, "%s (%02d/%02d-%02d:%02d:%02d-%d) %s (%s)\n", - username, + snprintf(msg, msg_size, "%s%s (%02d/%02d-%02d:%02d:%02d-%d) %s (%s)\n", + prio, username, t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, pid, event, detail); @@ -586,14 +620,14 @@ log_it(username, xpid, event, detail) openlog(ProgramName, LOG_PID); # endif - syslog(LOG_INFO, "(%s) %s (%s)", username, event, detail); + syslog(priority, "(%s) %s (%s)", username, event, detail); #endif /*SYSLOG*/ #if DEBUGGING if (DebugFlags) { - fprintf(stderr, "log_it: (%s %d) %s (%s)\n", - username, xpid, event, detail); + fprintf(stderr, "log_it: priority %d (%s %d) %s (%s)\n", + priority, username, xpid, event, detail); } #endif } --- cron-3.0pl1.orig/popen.c +++ cron-3.0pl1/popen.c @@ -128,7 +128,7 @@ cron_popen(program, type, e) char msg[256]; snprintf(msg, 256, "popen:setgid(%lu) failed: %s", (unsigned long) e->gid, strerror(errno)); - log_it("CRON",getpid(),"error",msg); + log_it(LOG_ERR, "CRON",getpid(),"error",msg); exit(ERROR_EXIT); } # if defined(BSD) || defined(POSIX) @@ -136,7 +136,7 @@ cron_popen(program, type, e) char msg[256]; snprintf(msg, 256, "popen:initgroups(%lu) failed: %s", (unsigned long) e->gid, strerror(errno)); - log_it("CRON",getpid(),"error",msg); + log_it(LOG_ERR, "CRON",getpid(),"error",msg); exit(ERROR_EXIT); } # endif @@ -144,7 +144,7 @@ cron_popen(program, type, e) char msg[256]; snprintf(msg, 256, "popen: setuid(%lu) failed: %s", (unsigned long) e->uid, strerror(errno)); - log_it("CRON",getpid(),"error",msg); + log_it(LOG_ERR, "CRON",getpid(),"error",msg); exit(ERROR_EXIT); } chdir(env_get("HOME", e->envp)); --- cron-3.0pl1.orig/user.c +++ cron-3.0pl1/user.c @@ -23,7 +23,9 @@ static char rcsid[] = "$Id: user.c,v 2.8 */ +#if defined(SYSLOG) #include <syslog.h> +#endif #include <string.h> #include "cron.h" @@ -46,20 +48,20 @@ static int get_security_context(char *na int i; if (getcon(¤t_con)) { - log_it(name, getpid(), "Can't get current context", tabname); + log_it(LOG_ERR, name, getpid(), "Can't get current context", tabname); return -1; } if (name != NULL) { if (getseuserbyname(name, &seuser, &level)) { - log_it(name, getpid(), "getseuserbyname FAILED", tabname); + log_it(LOG_ERR, name, getpid(), "getseuserbyname FAILED", tabname); freecon(current_con); return (security_getenforce() > 0); } } else { context_t temp_con = context_new(current_con); if (temp_con == NULL) { - log_it(name, getpid(), "context_new FAILED", tabname); + log_it(LOG_ERR, name, getpid(), "context_new FAILED", tabname); freecon(current_con); return (security_getenforce() > 0); } @@ -74,10 +76,10 @@ static int get_security_context(char *na free(level); if (list_count == -1) { if (security_getenforce() > 0) { - log_it(name, getpid(), "No SELinux security context", tabname); + log_it(LOG_ERR, name, getpid(), "No SELinux security context", tabname); return -1; } else { - log_it(name, getpid(), + log_it(LOG_NOTICE, name, getpid(), "No security context but SELinux in permissive mode," " continuing", tabname); return 0; @@ -86,11 +88,11 @@ static int get_security_context(char *na if (fgetfilecon(crontab_fd, &file_context) < OK) { if (security_getenforce() > 0) { - log_it(name, getpid(), "getfilecon FAILED", tabname); + log_it(LOG_ERR, name, getpid(), "getfilecon FAILED", tabname); freeconary(context_list); return -1; } else { - log_it(name, getpid(), "getfilecon FAILED but SELinux in " + log_it(LOG_NOTICE, name, getpid(), "getfilecon FAILED but SELinux in " "permissive mode, continuing", tabname); *rcontext = strdup(context_list[0]); freeconary(context_list); @@ -108,7 +110,7 @@ static int get_security_context(char *na security_class_t tclass = string_to_security_class("file"); if (!tclass) { - log_it(name, getpid(), "Failed to translate security class file", tabname); + log_it(LOG_ERR, name, getpid(), "Failed to translate security class file", tabname); freeconary(context_list); if (security_deny_unknown() == 0) { return 0; @@ -119,7 +121,7 @@ static int get_security_context(char *na access_vector_t bit = string_to_av_perm(tclass, "entrypoint"); if (!bit) { - log_it(name, getpid(), "Failed to translate av perm entrypoint", tabname); + log_it(LOG_ERR, name, getpid(), "Failed to translate av perm entrypoint", tabname); freeconary(context_list); if (security_deny_unknown() == 0) { return 0; @@ -143,11 +145,11 @@ static int get_security_context(char *na } freecon(file_context); if (security_getenforce() > 0) { - log_it(name, getpid(), "ENTRYPOINT FAILED", tabname); + log_it(LOG_ERR, name, getpid(), "ENTRYPOINT FAILED", tabname); freeconary(context_list); return -1; } else { - log_it(name, getpid(), "ENTRYPOINT FAILED but SELinux in permissive mode, continuing", tabname); + log_it(LOG_NOTICE, name, getpid(), "ENTRYPOINT FAILED but SELinux in permissive mode, continuing", tabname); *rcontext = strdup(context_list[0]); freeconary(context_list); } @@ -168,14 +170,25 @@ crontab_error(msg) const char *fn; /* Figure out the file name from the username */ if (0 == strcmp(err_user, "*system*")) { - syslog(LOG_ERR|LOG_CRON, "Error: %s; while reading %s", msg, SYSCRONTAB); + char buf[MAX_TEMPSTR]; + snprintf(buf, MAX_TEMPSTR, + "Error: %s; while reading %s", + msg, SYSCRONTAB); + log_it(LOG_ERR, err_user, getpid(), "ERROR", buf); } else if (0 == strncmp(err_user,"*system*",8)) { fn = err_user+8; - syslog(LOG_ERR|LOG_CRON, "Error: %s; while reading %s/%s", msg, - SYSCRONDIR,fn); + char buf[MAX_TEMPSTR]; + snprintf(buf, MAX_TEMPSTR, + "Error: %s; while reading %s/%s", + msg, SYSCRONDIR, fn); + log_it(LOG_ERR, err_user, getpid(), "ERROR", buf); + } else { - syslog(LOG_ERR|LOG_CRON, "Error: %s; while reading crontab for user %s", - msg, err_user); + char buf[MAX_TEMPSTR]; + snprintf(buf, MAX_TEMPSTR, + "Error: %s; while reading crontab for user %s", + msg, err_user); + log_it(LOG_ERR, err_user, getpid(), "ERROR", buf); } } @@ -274,7 +287,7 @@ load_user(crontab_fd, pw, uname, fname, * newline, so we bail out */ if (envstr[0] != '\0') { - log_it(u->name, getpid(), "ERROR", "Missing " + log_it(LOG_WARNING, u->name, getpid(), "ERROR", "Missing " "newline before EOF, this crontab file will be " "ignored"); free_user(u); @@ -290,7 +303,7 @@ load_user(crontab_fd, pw, uname, fname, u->crontab = e; } else { /* stop processing on syntax error */ - log_it(u->name, getpid(), "ERROR", "Syntax " + log_it(LOG_WARNING, u->name, getpid(), "ERROR", "Syntax " "error, this crontab file will be " "ignored"); free_user(u); @@ -314,7 +327,7 @@ load_user(crontab_fd, pw, uname, fname, } while (status >= OK && LineNumber < MAX_TAB_LINES + NHEADER_LINES + 2); if (LineNumber >= MAX_TAB_LINES + NHEADER_LINES + 2) { - log_it(fname, getpid(), "ERROR", "crontab must not be longer " + log_it(LOG_WARNING, fname, getpid(), "ERROR", "crontab must not be longer " "than " Stringify(MAX_TAB_LINES) " lines, " "this crontab file will be ignored"); free_user(u);