Hi guys,
here is a simple patch to replace /etc/crontab by /etc/cron.d/.
You need to manually mkdir /etc/cron.d.
--- pathnames_original.h Mon Apr 7 22:31:53 2014
+++ pathnames.h Tue Apr 8 16:12:30 2014
@@ -92,8 +92,8 @@
#define PIDFILE "cron.pid"
#define _PATH_CRON_PID PIDDIR PIDFILE
- /* 4.3BSD-style crontab */
-#define SYSCRONTAB "/etc/crontab"
+ /* system crontab dir */
+#define SYSCRON_DIR "/etc/cron.d"
/* what editor to use if no EDITOR or VISUAL
* environment variable specified.
@@ -42,30 +42,31 @@
Debug(DLOAD, ("[%ld] load_database()\n", (long)getpid()))
- /* before we start loading any data, do a stat on SPOOL_DIR
- * so that if anything changes as of this moment (i.e., before
we've
- * cached any of the database), we'll see the changes next time.
+ /* before we start loading any data, do a stat on SPOOL_DIR and
+ * SYSCRON_DIR so that if anything changes as of this moment
+ * (i.e., before we've 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);
return;
}
- /* track system crontab file
- */
- if (stat(SYSCRONTAB, &syscron_stat) < OK)
- syscron_stat.st_mtime = 0;
+ if (stat(SYSCRON_DIR, &syscron_stat) < OK) {
+ log_it("CRON", getpid(), "STAT FAILED", SYSCRON_DIR);
+ return;
+ }
- /* if spooldir's mtime has not changed, we don't need to fiddle
with
- * the database.
+ /* if spooldir's and syscrondir's mtime has not changed, we
don't
+ * need to fiddle with the database.
*
* Note that old_db->mtime is initialized to 0 in main(), and
* so is guaranteed to be different than the stat() mtime the
first
* time this function is called.
*/
if (old_db->mtime == HASH(statbuf.st_mtime,
syscron_stat.st_mtime)) {
- Debug(DLOAD, ("[%ld] spool dir mtime unch, no load
needed.\n",
- (long)getpid()))
+ Debug(DLOAD, ("[%ld] spool dirs mtime unch, no load
needed.\n",
+ (long)getpid()))
return;
}
@@ -77,28 +78,45 @@
new_db.mtime = HASH(statbuf.st_mtime, syscron_stat.st_mtime);
new_db.head = new_db.tail = NULL;
- if (syscron_stat.st_mtime) {
- process_crontab(ROOT_USER, NULL, SYSCRONTAB,
&syscron_stat,
- &new_db, old_db);
- }
-
/* we used to keep this dir open all the time, for the sake of
* efficiency. however, we need to close it in every fork, and
* 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);
+ if (!(dir = opendir(SYSCRON_DIR))) {
+ log_it("CRON", getpid(), "OPENDIR FAILED", SYSCRON_DIR);
return;
}
- while (NULL != (dp = readdir(dir))) {
- char fname[MAXNAMLEN+1], tabname[MAXNAMLEN];
+ char fname[MAXNAMLEN+1], tabname[MAXNAMLEN];
+ while (NULL != (dp = readdir(dir))) {
/* avoid file names beginning with ".". this is good
* because we would otherwise waste two guaranteed calls
* to getpwnam() for . and .., and also because user
names
* starting with a period are just too nasty to
consider.
*/
+ if (dp->d_name[0] == '.')
+ continue;
+
+ if (strlcpy(fname, dp->d_name, sizeof fname) >= sizeof
fname)
+ continue; /* XXX log? */
+
+ if (snprintf(tabname, sizeof tabname, "%s/%s",
SYSCRON_DIR,
+ fname) >= sizeof(tabname))
+ continue; /* XXX log? */
+
+ process_crontab(ROOT_USER, NULL, tabname, &syscron_stat,
+ &new_db, old_db);
+ }
+
+ closedir(dir);
+
+ if (!(dir = opendir(SPOOL_DIR))) {
+ log_it("CRON", getpid(), "OPENDIR FAILED", SPOOL_DIR);
+ return;
+ }
+
+ while (NULL != (dp = readdir(dir))) {
if (dp->d_name[0] == '.')
continue;
--- cron_original.8 Mon Apr 7 22:31:53 2014
+++ cron.8 Tue Apr 8 16:12:30 2014
@@ -71,9 +71,8 @@
commands.
Additionally,
.Nm
-checks the modification time on the system crontab file
-.Pq Pa /etc/crontab ,
-the crontab spool
+checks the modification time on the crontab spool dirs
+.Pq Pa /etc/cron.d,
.Pq Pa /var/cron/tabs ,
and the at spool
.Pq Pa /var/cron/atjobs
@@ -187,8 +186,8 @@
.El
.Sh FILES
.Bl -tag -width "/var/cron/tabs/.sock" -compact
-.It Pa /etc/crontab
-system crontab file
+.It Pa /etc/cron.d
+system crontab directory
.It Pa /var/cron/atjobs
directory containing
.Xr at 1
@@ -217,6 +216,9 @@
For user crontab files created by
.Xr crontab 1 ,
the mode must be 0400 or 0600.
-If the system crontab file is used,
-.Pa /etc/crontab
-must not be writable by any user other than root.
+If the system crontab spool dir is used,
+.Pa /etc/cron.d
+files inside must not be writable by any user other than root.
+Files inside the system crontab directory
+.Pa /etc/cron.d
+will be ignored if they start by a dot (.).
--- crontab_original.5 Tue Apr 8 16:33:54 2014
+++ crontab.5 Tue Apr 8 16:22:27 2014
@@ -279,7 +279,7 @@
.El
.Sh FILES
.Bl -tag -width "/var/cron/tabs/<user>XXX" -compact
-.It Pa /etc/crontab
+.It Pa /etc/cron.d
System crontab.
.It Pa /var/cron/tabs/ Ns Aq Ar user
User crontab.