--- Begin Message ---
Package: cron
Version: 3.0pl1-127+deb8u1
Severity: wishlist
Tags: patch
Dear Maintainer,
it makes sense to me to Log output to stdout, when cron is executed in
foreground mode using the -f argument.
This can be especially helpful in containerized environments (LXC,
Docker), where a syslog facility is most of the times not available, and
the logging can be handled with a simple redirect.
I have included a patch, which implements this functionality.
NOTE: This patch also incorporates the fix for Bug#887014!
If you need any more info/help, please do not hesitate to contact me (or
reply to this bug report).
-- Package-specific info:
--- EDITOR:
--- /usr/bin/editor:
/bin/nano
--- /usr/bin/crontab:
-rwxr-sr-x 1 root crontab 36008 Jun 11 2015 /usr/bin/crontab
--- /var/spool/cron:
drwxr-xr-x 3 root root 4 Jan 12 13:58 /var/spool/cron
--- /var/spool/cron/crontabs:
drwx-wx--T 2 root crontab 2 Jun 11 2015 /var/spool/cron/crontabs
--- /etc/cron.d:
drwxr-xr-x 2 root root 4 Jan 12 13:58 /etc/cron.d
--- /etc/cron.daily:
drwxr-xr-x 2 root root 11 Jan 12 13:58 /etc/cron.daily
--- /etc/cron.hourly:
drwxr-xr-x 2 root root 3 Jan 12 13:58 /etc/cron.hourly
--- /etc/cron.monthly:
drwxr-xr-x 2 root root 4 Jan 12 13:58 /etc/cron.monthly
--- /etc/cron.weekly:
drwxr-xr-x 2 root root 5 Jan 12 13:58 /etc/cron.weekly
-- System Information:
Debian Release: 8.10
APT prefers oldstable-updates
APT policy: (500, 'oldstable-updates'), (500, 'oldstable')
Architecture: amd64 (x86_64)
Kernel: Linux 4.9.0-4-amd64 (SMP w/4 CPU cores)
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)
Shell: /bin/sh linked to /bin/dash
Init: unable to detect
Versions of packages cron depends on:
ii adduser 3.113+nmu3
ii debianutils 4.4+b1
ii dpkg 1.17.27
ii init-system-helpers 1.22
ii libc6 2.19-18+deb8u10
ii libpam-runtime 1.1.8-3.1+deb8u2
ii libpam0g 1.1.8-3.1+deb8u2+b1
ii libselinux1 2.3-2
ii lsb-base 4.1+Debian13+nmu1
Versions of packages cron recommends:
ii exim4 4.84.2-2+deb8u4
ii exim4-daemon-light [mail-transport-agent] 4.84.2-2+deb8u4
Versions of packages cron suggests:
ii anacron 2.3-23
pn checksecurity <none>
ii logrotate 3.8.7-1+b1
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>
-- Configuration Files:
/etc/crontab changed:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / &&
run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / &&
run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / &&
run-parts --report /etc/cron.monthly )
* * * * * root echo test >> /var/log/test
-- no debconf information
diff -u cron-3.0pl1/cron.c cron-3.0pl1/cron.c
--- cron-3.0pl1/cron.c
+++ cron-3.0pl1/cron.c
@@ -106,7 +106,7 @@
setlocale(LC_COLLATE, "C"); /* Except for collation, since
load_database() uses a-z */
/* Except that "US-ASCII" is preferred to "ANSI_x3.4-1968" in MIME,
* even though "ANSI_x3.4-1968" is the official charset name. */
- if ( ( cs = nl_langinfo( CODESET ) ) != 0L &&
+ if ( ( cs = nl_langinfo( CODESET ) ) != 0L &&
strcasecmp(cs, "ANSI_x3.4-1968") != 0 )
strncpy( cron_default_mail_charset, cs, MAX_ENVSTR );
else
@@ -123,12 +123,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);
@@ -234,8 +234,8 @@
getpid(), timeRunning - virtualTime))
/* run wildcard jobs for current minute */
find_jobs(timeRunning, &database, TRUE, FALSE);
-
- /* run fixed-time jobs for each minute missed
*/
+
+ /* run fixed-time jobs for each minute missed */
do {
if (job_runqueue())
sleep(10);
@@ -245,7 +245,7 @@
} while (virtualTime< timeRunning &&
clockTime == timeRunning);
break;
-
+
case 0:
/*
* case 3: timeDiff is a small or medium-sized
@@ -290,23 +290,23 @@
/* 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], Debian running reboot jobs\n",getpid()));
-
+
#endif
Debug(DMISC, ("[%d], vixie running reboot jobs\n", getpid()));
for (u = db->head; u != NULL; u = u->next) {
@@ -455,7 +455,7 @@
sighup_handler(x) {
log_close();
- /* we should use sigaction for proper signal blocking as this
+ /* we should use sigaction for proper signal blocking as this
has a race, but... */
signal(SIGHUP, sighup_handler);
}
diff -u cron-3.0pl1/cron.h cron-3.0pl1/cron.h
--- cron-3.0pl1/cron.h
+++ cron-3.0pl1/cron.h
@@ -140,6 +140,21 @@
#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
@@ -171,7 +186,7 @@
typedef struct _entry {
struct _entry *next;
- uid_t uid;
+ uid_t uid;
gid_t gid;
char **envp;
char *cmd;
@@ -236,7 +251,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 cron-3.0pl1/crontab.c cron-3.0pl1/crontab.c
--- cron-3.0pl1/crontab.c
+++ cron-3.0pl1/crontab.c
@@ -112,7 +112,7 @@
#endif
if (argv[1] == NULL) {
argv[1] = "-";
- }
+ }
parse_args(argc, argv); /* sets many globals, opens a file */
set_cron_cwd();
if (!allowed(User)) {
@@ -121,7 +121,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 */
@@ -152,7 +152,7 @@
exit(exitstatus);
/*NOTREACHED*/
}
-
+
#if DEBUGGING
char *getoptarg = "u:lerix:";
#else
@@ -307,10 +307,10 @@
char *ctnh;
#endif
- 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)
+ if (errno == ENOENT)
fprintf(stderr, "no crontab for %s\n", User);
else {
fprintf(stderr, "%s/: fopen: %s\n", n,
strerror(errno));
@@ -327,7 +327,7 @@
/* ignore the top few comments since we probably put them there.
*/
if (!(ctnh = getenv("CRONTAB_NOHEADER")) ||
- toupper(*ctnh) != 'N')
+ toupper(*ctnh) != 'N')
{
for (x = 0; x < NHEADER_LINES; x++) {
ch = get_char(f);
@@ -386,7 +386,7 @@
exit(OK_EXIT);
}
- 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);
@@ -502,7 +502,7 @@
just bail, and let the user/admin deal with it.*/
static void
-cleanup_tmp_crontab(void)
+cleanup_tmp_crontab(void)
{
DIR *dp;
struct dirent *ep;
@@ -555,7 +555,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) {
@@ -588,7 +588,7 @@
Set_LineNum(1)
if (add_help_text) {
- fprintf(NewCrontab,
+ fprintf(NewCrontab,
"# Edit this file to introduce tasks to be run by cron.\n"
"# \n"
"# Each task to run has to be defined through a single line\n"
@@ -609,7 +609,7 @@
"# at 5 a.m every week with:\n"
"# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/\n"
"# \n"
-"# For more information see the manual pages of crontab(5) and cron(8)\n"
+"# For more information see the manual pages of crontab(5) and cron(8)\n"
"# \n"
"# m h dom mon dow command\n" );
}
@@ -795,7 +795,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();
@@ -809,7 +809,7 @@
{
unlink(tn);
exit(1);
-}
+}
/* returns 0 on success
* -1 on syntax error
@@ -953,7 +953,7 @@
}
- log_it(RealUser, Pid, "REPLACE", User);
+ log_it(LOG_INFO, RealUser, Pid, "REPLACE", User);
poke_daemon();
diff -u cron-3.0pl1/database.c cron-3.0pl1/database.c
--- cron-3.0pl1/database.c
+++ cron-3.0pl1/database.c
@@ -39,7 +39,7 @@
#ifndef PATH_MAX
#ifdef MAXPATHLEN
-#define PATH_MAX MAXPATHLEN
+#define PATH_MAX MAXPATHLEN
#else
#define PATH_MAX 2048
#endif
@@ -72,7 +72,7 @@
#ifdef DEBIAN
struct stat syscrond_stat;
struct stat syscrond_file_stat;
-
+
char syscrond_fname[PATH_MAX+1];
int syscrond_change = 0;
#endif
@@ -84,14 +84,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;
}
@@ -101,7 +101,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;
}
@@ -184,7 +184,7 @@
#ifdef DEBIAN
/* 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))) {
@@ -226,7 +226,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))) {
@@ -344,7 +344,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;
@@ -355,38 +355,38 @@
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;
}
@@ -394,11 +394,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;
}
@@ -411,30 +411,30 @@
error is bad so we 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);
goto next_crontab;
} 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;
}
@@ -443,7 +443,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;
}
@@ -456,7 +456,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;
}
@@ -492,7 +492,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);
@@ -507,7 +507,7 @@
* has actually taken place.
*/
force_rescan_user(old_db, new_db, fname, statbuf->st_mtime);
- }
+ }
next_crontab:
@@ -542,7 +542,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);
}
}
@@ -595,11 +595,11 @@
/* Allocate an empty crontab with the specified mtime, add it to new DB
*/
if ((u = (user *) malloc(sizeof(user))) == NULL) {
errno = ENOMEM;
- }
+ }
if ((u->name = strdup(fname)) == NULL) {
free(u);
errno = ENOMEM;
- }
+ }
u->mtime = old_mtime;
u->crontab = NULL;
#ifdef WITH_SELINUX
@@ -634,7 +634,7 @@
orphans = next;
} else {
prev_orphan->next = next;
- }
+ }
process_crontab(o->uname, o->fname, o->tabname,
&statbuf, db, NULL);
@@ -642,19 +642,19 @@
/* process_crontab could have added a new orphan */
if (prev_orphan == NULL && orphans != next) {
prev_orphan = orphans;
- }
+ }
free_orphan(o);
o = next;
} else {
prev_orphan = o;
o = o->next;
- }
- }
+ }
+ }
}
static void
add_orphan(const char *uname, const char *fname, const char *tabname) {
- orphan *o;
+ orphan *o;
o = calloc(1, sizeof(*o));
if (o == NULL)
diff -u cron-3.0pl1/debian/changelog cron-3.0pl1/debian/changelog
--- cron-3.0pl1/debian/changelog
+++ cron-3.0pl1/debian/changelog
@@ -1,3 +1,10 @@
+cron (3.0pl1-127+deb8u1.1) UNRELEASED; urgency=medium
+
+ * Non-maintainer upload.
+ * SYSLOG fix
+
+ -- root <root@b257580ceda0> Fri, 12 Jan 2018 12:53:51 +0000
+
cron (3.0pl1-127+deb8u1) jessie; urgency=medium
* d/cron.service: Use KillMode=process to kill only the daemon.
diff -u cron-3.0pl1/do_command.c cron-3.0pl1/do_command.c
--- cron-3.0pl1/do_command.c
+++ cron-3.0pl1/do_command.c
@@ -39,7 +39,7 @@
};
#define PAM_FAIL_CHECK if (retcode != PAM_SUCCESS) { \
fprintf(stderr,"\n%s\n",pam_strerror(pamh, retcode)); \
- syslog(LOG_ERR,"%s",pam_strerror(pamh, retcode)); \
+ log_it(LOG_ERR, "CRON", getpid(), "PAM ERROR", pam_strerror(pamh,
retcode)); \
pam_end(pamh, retcode); exit(1); \
}
#endif
@@ -71,7 +71,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;
}
}
@@ -96,7 +100,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 */
@@ -164,7 +168,7 @@
end = mailto + strcspn(mailto, " \t\n");
if (*mailto == '-' || *end != '\0') {
printf("Bad Mailto karma.\n");
- log_it("CRON",getpid(),"error","bad mailto");
+ log_it(LOG_ERR, "CRON", getpid(), "error", "bad
mailto");
mailto = NULL;
}
}
@@ -193,10 +197,10 @@
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);
}
-
+
/* since we are a forked process, we can diddle the command string
* we were passed -- nobody else is going to use it again, right?
*
@@ -252,7 +256,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:
@@ -266,7 +270,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.
@@ -313,7 +317,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)
@@ -321,23 +325,23 @@
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
if (setuid(e->uid) !=0) { /* we aren't root after this... */
char msg[256];
snprintf(msg, 256, "do_command:setuid(%lu) failed: %s",
- (unsigned long) e->uid, strerror(errno));
- log_it("CRON",getpid(),"error",msg);
+ (unsigned long) e->uid, strerror(errno));
+ log_it(LOG_ERR, "CRON", getpid(), "error", msg);
exit(ERROR_EXIT);
- }
+ }
chdir(env_get("HOME", e->envp));
/* exec the command.
*/
{
- char **jobenv = build_env(e->envp);
+ char **jobenv = build_env(e->envp);
char *shell = env_get("SHELL", jobenv);
# if DEBUGGING
if (DebugFlags & DTEST) {
@@ -386,7 +390,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;
@@ -495,14 +499,14 @@
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);
+ }
}
}
@@ -510,10 +514,10 @@
// the user if their job failed. Avoid popening the mailcmd until now
// since sendmail may time out, and to write info about the exit
// status.
-
+
long pos;
struct stat mcsb;
- int statret;
+ int statret;
fseek(tmpout, 0, SEEK_END);
pos = ftell(tmpout);
@@ -534,7 +538,7 @@
if ((statret = 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_NOTICE, "CRON", getpid(), "info", "No MTA
installed, discarding output");
}
goto mail_finished;
} else {
@@ -545,7 +549,7 @@
register int bytes = 0;
register char **env;
- char **jobenv = build_env(e->envp);
+ char **jobenv = build_env(e->envp);
auto char mailcmd[MAX_COMMAND];
auto char hostname[MAXHOSTNAMELEN];
char *content_type = env_get("CONTENT_TYPE",jobenv),
@@ -573,7 +577,7 @@
fprintf(mail, "Content-Type: text/plain; charset=%s\n",
cron_default_mail_charset
);
- } else {
+ } else {
/* user specified Content-Type header.
* disallow new-lines for security reasons
* (else users could specify arbitrary mail headers!)
@@ -606,7 +610,7 @@
fputc('\n', mail);
// Append the actual output of the child to the mail
-
+
char buf[4096];
int ret, remain;
@@ -638,11 +642,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_NOTICE, 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:
@@ -657,7 +661,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);
}
diff -u cron-3.0pl1/misc.c cron-3.0pl1/misc.c
--- cron-3.0pl1/misc.c
+++ cron-3.0pl1/misc.c
@@ -197,7 +197,7 @@
struct stat sb;
mode_t um;
struct group *gr;
-
+
/* first check for CRONDIR ("/var/cron" or some such)
*/
if (stat(CRONDIR, &sb) < OK && errno == ENOENT) {
@@ -304,7 +304,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);
}
@@ -315,11 +315,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);
}
@@ -331,7 +331,7 @@
/* abandon fd and fp even though the file is open. we need to
* keep it open and locked, but we don't need the handles elsewhere.
*/
-
+
}
/* get_char(file) : like getc() but increment LineNumber on newlines
@@ -487,7 +487,7 @@
#endif
}
- if (allow)
+ if (allow)
isallowed = in_file(username, allow);
else
isallowed = TRUE; /* Allow access if ALLOW_FILE does not exist
*/
@@ -496,7 +496,7 @@
#endif
#ifdef WITH_AUDIT
- /* Log an audit message if the user is rejected */
+ /* Log an audit message if the user is rejected */
if (isallowed == FALSE) {
int audit_fd = audit_open();
audit_log_user_message(audit_fd, AUDIT_USER_START, "cron deny",
@@ -509,7 +509,8 @@
void
-log_it(username, xpid, event, detail)
+log_it(priority, username, xpid, event, detail)
+ int priority;
char *username;
int xpid;
char *event;
@@ -525,9 +526,42 @@
#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;
+ }
+
/* 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... */
@@ -549,8 +583,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);
@@ -581,16 +615,16 @@
# else
openlog(ProgramName, LOG_PID);
# endif
-
- syslog(LOG_INFO, "(%s) %s (%s)", username, event, detail);
+
+ syslog(priority, "(%s) %s (%s)", username, event, detail);
closelog();
#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
}
diff -u cron-3.0pl1/pathnames.h cron-3.0pl1/pathnames.h
--- cron-3.0pl1/pathnames.h
+++ cron-3.0pl1/pathnames.h
@@ -54,7 +54,7 @@
#define ALLOW_FILE "allow" /*-*/
#define DENY_FILE "deny" /*-*/
#endif
-/* #define LOG_FILE "log" -*/
+/* #define LOG_FILE "log" -*/
/* where should the daemon stick its PID?
*/
@@ -68,7 +68,7 @@
/* 4.3BSD-style crontab */
#define SYSCRONTAB "/etc/crontab"
#ifdef DEBIAN
- /* where package specific crontabs live */
+ /* where package specific crontabs live */
#define SYSCRONDIR "/etc/cron.d"
#endif
/* what editor to use if no EDITOR or VISUAL
@@ -111,7 +111,7 @@
#ifndef SPOOL_DIR_GROUP
/* Chown SPOOL_DIR to this group (needed by Debian's
* SGID crontab feature)
- */
+ */
#define SPOOL_DIR_GROUP "crontab"
#endif
#endif
diff -u cron-3.0pl1/popen.c cron-3.0pl1/popen.c
--- cron-3.0pl1/popen.c
+++ cron-3.0pl1/popen.c
@@ -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,17 +136,17 @@
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
if (setuid(e->uid) !=0) {
char msg[256];
snprintf(msg, 256, "popen: setuid(%lu) failed: %s",
- (unsigned long) e->uid, strerror(errno));
- log_it("CRON",getpid(),"error",msg);
+ (unsigned long) e->uid, strerror(errno));
+ log_it(LOG_ERR, "CRON", getpid(), "error", msg);
exit(ERROR_EXIT);
- }
+ }
chdir(env_get("HOME", e->envp));
#if WANT_GLOBBING
diff -u cron-3.0pl1/user.c cron-3.0pl1/user.c
--- cron-3.0pl1/user.c
+++ cron-3.0pl1/user.c
@@ -22,8 +22,9 @@
/* vix 26jan87 [log is in RCS file]
*/
-
+#if defined(SYSLOG)
#include <syslog.h>
+#endif
#include <string.h>
#include "cron.h"
@@ -49,7 +50,7 @@
if (name != NULL) {
if (getseuserbyname(name, &seuser, &level)) {
- log_it(name, getpid(), "getseuserbyname FAILED", tabname);
+ log_it(LOG_ERR, name, getpid(), "getseuserbyname FAILED", tabname);
return (security_getenforce() > 0);
}
}
@@ -60,7 +61,7 @@
*rcontext = NULL;
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;
}
list_count = get_ordered_context_list_with_level(seuser, level,
current_con, &context_list);
@@ -69,10 +70,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;
@@ -81,11 +82,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);
@@ -117,11 +118,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);
}
@@ -143,14 +144,24 @@
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);
}
}
@@ -217,7 +228,7 @@
if (pw==NULL) {
sname="system_u";
}
- if (get_security_context(sname, crontab_fd,
+ if (get_security_context(sname, crontab_fd,
&u->scontext, tabname) != 0 ) {
u->scontext = NULL;
free_user(u);
@@ -228,7 +239,7 @@
#endif
- /*
+ /*
* init environment. this will be copied/augmented for each entry.
*/
if ((envp = env_init()) == NULL) {
@@ -251,7 +262,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);
@@ -271,9 +282,9 @@
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");
+ "ignored");
free_user(u);
u = NULL;
goto done;
--- End Message ---