jlcodes99/cockpit-tools · error

crontab_range_invalid

crontab_range_invalid

Error message

crontab_range_invalid

What it means

When a crontab segment contains an explicit range 'start-end', both bounds are validated against the field's min/max, then compared. If end < start the range is descending and cannot be expanded, so parseCrontabSegment throws 'crontab_range_invalid'.

Source

Thrown at src/pages/WakeupTasksPage.tsx:497

  const rangePart = rawRange.trim();
  const step = rawStep ? parseCrontabNumber(rawStep) : 1;
  if (step <= 0) {
    throw new Error('crontab_step_must_be_positive');
  }

  if (rangePart === '*') {
    insertCrontabRange(target, min, max, step, normalizeDayOfWeek);
    return;
  }

  if (rangePart.includes('-')) {
    const [rawStart, rawEnd] = rangePart.split('-');
    const start = parseCrontabNumber(rawStart);
    const end = parseCrontabNumber(rawEnd);
    validateCrontabValue(start, min, max, normalizeDayOfWeek);
    validateCrontabValue(end, min, max, normalizeDayOfWeek);
    if (end < start) {
      throw new Error('crontab_range_invalid');
    }
    insertCrontabRange(target, start, end, step, normalizeDayOfWeek);
    return;
  }

  const single = parseCrontabNumber(rangePart);
  validateCrontabValue(single, min, max, normalizeDayOfWeek);
  if (step === 1) {
    target.add(normalizeDayOfWeek ? normalizeCrontabDayOfWeek(single) : single);
    return;
  }
  insertCrontabRange(target, single, max, step, normalizeDayOfWeek);
};

const parseCrontabField = (
  field: string,
  min: number,
  max: number,

View on GitHub (pinned to 1ed8b77992)

Solutions

  1. Rewrite the range so start <= end (e.g. '5-10' instead of '10-5').
  2. If a wrap-around range is intended, express it as two ranges (e.g. '22-23,0-5' instead of '22-5').
  3. Catch the error at input time and surface 'crontab_range_invalid' as an inline form validation message before submit.

Example fix

// before
'22-5 * * * *'   // end < start
// after
'22-23,0-5 * * * *'  // or '5-22 * * * *'
Defensive patterns

Strategy: validation

Validate before calling

const m = segment.match(/^(\d+)-(\d+)/);
if (m && Number(m[2]) < Number(m[1])) {
  throw new Error('crontab_range_invalid');
}

Type guard

const isAscendingRange = (start: number, end: number): boolean => end >= start;

Try / catch

try {
  const parsed = parseCrontabExpression(expr);
} catch (e) {
  if ((e as Error).message === 'crontab_range_invalid') {
    setFieldError('range end must be >= start; use a comma list for wrap-around');
  }
}

Prevention

When it happens

Trigger: A segment like '10-5' in the minute field, or any 'start-end/step' segment where the numeric end is less than the start (both already passing validateCrontabValue bounds).

Common situations: Hand-typed cron expressions in the Wakeup Tasks UI where the user swaps bounds ('30-10' meaning 'every 10 from 30'); copy-pasted cron from docs using a different dialect that permits wrap-around ranges.

Related errors


AI-assisted analysis of jlcodes99/cockpit-tools@1ed8b77992 (2026-09-05). Data as JSON: /api/errors/8bd750eb14e061be. Report an issue: GitHub.