Проверка записей Crontab с PHP

В вашем классе контроллеров, BookCatalogController, вы объявляете метод catalogSimple для приема запросов, и вам следует определить маршрут. Вместо @GetMapping("Mappings.CATALOG_SIMPLE") используйте @GetMapping("/home").

12
задан TRiG 7 October 2016 в 15:25
поделиться

3 ответа

Хм, интересная проблема.

Если Вы собираетесь действительно проверить его, regex не будет достаточно, необходимо будет на самом деле проанализировать запись и проверить каждый из битов планирования. Поэтому каждый бит может быть числом, месяц/день недельной строки, диапазон (2-7), набор (3, 4, в субботу), ярлык стиля крона Vixie (60/5) или любая комбинация вышеупомянутого - любой единственный подход regex собирается стать очень волосатым, быстро.

Просто использование crontab программа крона Vixie для проверки не достаточна, потому что это на самом деле не проверяет полностью! Я могу добраться crontab принять все виды недопустимых вещей.

Злые Прохладные Сценарии оболочки Dave Taylor (книжная ссылка Google) имеют sh сценарий, который делает частичную проверку, я нашел обсуждение интересным. Вы могли бы также использовать или адаптировать код.

Я также поднял ссылки на два класса PHP, которые делают то, что Вы говорите (чье качество я не оценил):

Другой подход (в зависимости от того, что должно сделать Ваше приложение) мог бы быть должен иметь PHP, создают crontab запись программно и вставляют его, таким образом, Вы знаете, что это всегда допустимо, а не попытайтесь проверить недоверяемую строку. Затем необходимо было бы просто сделать "сборку crontab записью" UI, который мог быть простым, если Вам не нужны действительно сложные комбинации планирования.

8
ответ дан 2 December 2019 в 04:09
поделиться

Необходимо смочь сделать это довольно легко с regex. На самом деле я не был бы удивлен, могли ли Вы найти существующий regex для просто этого на Google. Это не тестируется, но возможно что-то как:

/^((\*)|(\d+((-\d+)|(,\d+)+))\s+){5}/
0
ответ дан 2 December 2019 в 04:09
поделиться

Кто сказал, что регулярные выражения не могут этого сделать?

С разрешения моего работодателя, Salir.com , вот тест PHPUnit, который выполняет такую ​​проверку. Не стесняйтесь изменять и распространять. Буду признателен, если вы сохраните уведомление @author и ссылку на веб-сайт.

<?php
/**
 * @author Jordi Salvat i Alabart - with thanks to <a href="www.salir.com">Salir.com</a>.
 */

abstract class CrontabChecker extends PHPUnit_Framework_TestCase {
    protected function assertFileIsValidUserCrontab($file) {
        $f= @fopen($file, 'r', 1);
        $this->assertTrue($f !== false, 'Crontab file must exist');
        while (($line= fgets($f)) !== false) {
            $this->assertLineIsValid($line);
        }
    }

    protected function assertLineIsValid($line) {
        $regexp= $this->buildRegexp();
        $this->assertTrue(preg_match("/$regexp/", $line) !== 0);
    }

    private function buildRegexp() {
        $numbers= array(
            'min'=>'[0-5]?\d',
            'hour'=>'[01]?\d|2[0-3]',
            'day'=>'0?[1-9]|[12]\d|3[01]',
            'month'=>'[1-9]|1[012]',
            'dow'=>'[0-7]'
        );

        foreach($numbers as $field=>$number) {
            $range= "($number)(-($number)(\/\d+)?)?";
            $field_re[$field]= "\*(\/\d+)?|$range(,$range)*";
        }

        $field_re['month'].='|jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec';
        $field_re['dow'].='|mon|tue|wed|thu|fri|sat|sun';

        $fields_re= '('.join(')\s+(', $field_re).')';

        $replacements= '@reboot|@yearly|@annually|@monthly|@weekly|@daily|@midnight|@hourly';

        return '^\s*('.
                '$'.
                '|#'.
                '|\w+\s*='.
                "|$fields_re\s+\S".
                "|($replacements)\s+\S".
            ')';
    }
}
23
ответ дан 2 December 2019 в 04:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: