In your dreams.

> 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.

Reply via email to