Look what linux are accepting now : stuff like systemd, how modern ! and so
nicely done !

Maybe having a .d looks .damned cool but does it really solve something ?

New is not better, modern surely isn't.

If there is a way for OpenBSD to move to a cron.d  it probably needs a nice
explanation :
 - problems to be solved
 - why is it the best way to solved it
 - what other solution has been discarded and why.
 - (and does the gain of the change worth the work of the change)

PS:
If you install a software that require recurrent task it should be done
with a user with specific priviledge , so set up a crontab for this user.


Geez don't you have a TLS server to patch !

On Tue, Apr 8, 2014 at 4:59 PM, Dag Richards <dagricha...@speakeasy.net>wrote:

> No Theo I don't think understand, if you accept the patch then you will be
> more like Ubuntu and other MODERN operating systems.
>
> Why put everything in a single easily readable file, when you can split it
> up in to multiple directories.
>
> Which reminds me when are you going to ditch /etc for a nice registry data
> base.
>
>
>
>
> Theo de Raadt wrote:
>
>> 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.
>>>
>>
>


-- 
---------------------------------------------------------------------------------------------------------------------
() ascii ribbon campaign - against html e-mail
/\

Reply via email to