On 2023 May 05 (Fri) at 16:13:01 +1000 (+1000), Mark Jamsek wrote: :On 23-05-04 05:40PM, Todd C. Miller wrote: :> On Thu, 04 May 2023 21:41:26 -0000, Klemens Nanni wrote: :> :> > On Thu, May 04, 2023 at 03:30:30PM -0600, Todd C. Miller wrote: :> > > This fixes two issues with the parsing of random values: :> > > :> > > 1) A random value with a step is now rejected. For example: :> > > :> > > ~/10 * * * * echo invalid :> > :> > I've ben using ~/10 to randomly distribute four similar tasks so that :> > they don't start at the same time. :> > :> > Is that wrong? :> :> I'm fairly certain that doesn't do what you think it does. When I :> tested it "~/10" behaved the same as "~". The step value is not :> even parsed. :
I really dislike "previously accepted (even if behaved differently)" configs being rejected ... :todd is correct in that the step value is not parsed with "~/10". We :recently discovered this when setting up Got mirrors to sync every 15 :minutes. IIRC, Lucas (or op?) asked about syncing each mirror at :a different 15 minute interval by using the same syntax kn is using. : :I found kn's attempted syntax intuitive though; it feels like a natural :extension of the existing random and step syntax. I also assumed ~/15 :would run every 15 minutes starting with a random minute, and since :discovering it didn't work like that, I've been carrying a simple patch :that allows kn's syntax: : : ~/15 random 15 minute intervals in [0, 59] : 1~9/10 random 10 minute intervals in [1,59] : ... but I really like this syntax and behaviour. I haven't had a chance to review the code, but I think this would be a better direction for us to go. -peter :----8<-------- :diff refs/remotes/origin/master refs/heads/master :commit - e253a7cc21de530da6fcf49c1279258fecade8f4 :commit + 761b09ae46431344766330cc14c958ffca5a3a0a :blob - ab683b8476a8c862aabc53101b4080959820835a :blob + 030ab599dcf07eb3e94efe90c118e4e9bea8f6c4 :--- usr.sbin/cron/entry.c :+++ usr.sbin/cron/entry.c :@@ -456,10 +456,11 @@ get_range(bitstr_t *bits, int low, int high, const cha : /* range = number | number* "~" number* | number "-" number ["/" number] : */ : :- int i, num1, num2, num3; :+ int i, num1, num2, num3, rndstep; : : num1 = low; : num2 = high; :+ rndstep = 0; : : if (ch == '*') { : /* '*' means [low, high] but can still be modified by /step :@@ -497,7 +498,7 @@ get_range(bitstr_t *bits, int low, int high, const cha : : /* get the (optional) number following the tilde : */ :- ch = get_number(&num2, low, names, ch, file, ", \t\n"); :+ ch = get_number(&num2, low, names, ch, file, "/, \t\n"); : if (ch == EOF) : ch = get_char(file); : if (ch == EOF || num1 > num2) { :@@ -509,6 +510,10 @@ get_range(bitstr_t *bits, int low, int high, const cha : */ : num3 = num1; : num1 = arc4random_uniform(num2 - num3 + 1) + num3; :+ if (ch == '/') { :+ rndstep = 1; :+ break; :+ } : /* FALLTHROUGH */ : default: : /* not a range, it's a single number. :@@ -538,6 +543,10 @@ get_range(bitstr_t *bits, int low, int high, const cha : ch = get_number(&num3, 0, NULL, ch, file, ", \t\n"); : if (ch == EOF || num3 == 0) : return (EOF); :+ if (rndstep) { :+ num1 %= num3; :+ num2 = high; :+ } : } else { : /* no step. default==1. : */ :-------->8---- : :> It sounds like what you want is the proposed syntax "*/~10" :> to use a random offset. : :But this would be nice too! Anything that enables regular intervals from :a random offset would satisfy a common enough use case. : :-- :Mark Jamsek <fnc.bsdbox.org|got.bsdbox.org> :GPG: F2FF 13DE 6A06 C471 CA80 E6E2 2930 DC66 86EE CF68 -- Time flies like an arrow, but fruit flies like a banana.