' . preg_quote($_POST['zone']) . '[\t ]+[0-9]{1,16}[\t ]+SOA[\t ]+.+)$/m', $current_zone_content, $matches) !== 1) output(500, 'Unable to get current serial from zone file.'); // Generate new zone content $new_zone_content = $matches['soa'] . LF; if (strlen($_POST['zone-content']) > ZONE_MAX_CHARACTERS) output(403, 'La zone n\'est pas autorisée à dépasser ' . ZONE_MAX_CHARACTERS . ' caractères.'); foreach (explode("\r\n", $_POST['zone-content']) as $line) { if ($line === '') continue; if (preg_match('/^(?[a-z0-9@._-]+)(?:[\t ]+(?[0-9]{1,16}))?(?:[\t ]+IN)?[\t ]+(?[A-Z]{1,16})[\t ]+(?.+)$/', $line, $matches) !== 1) output(403, 'La zone est mal formatée (selon Niver).'); if (in_array($matches['type'], ALLOWED_TYPES, true) !== true) output(403, 'Le type ' . $matches['type'] . ' n\'est pas autorisé.'); if ($matches['ttl'] !== '' AND $matches['ttl'] < MIN_TTL) output(403, 'Les TTLs inférieurs à ' . MIN_TTL . ' secondes ne sont pas autorisés.'); if ($matches['ttl'] !== '' AND $matches['ttl'] > MAX_TTL) output(403, 'Les TTLs supérieurs à ' . MAX_TTL . ' secondes ne sont pas autorisés.'); $new_zone_content .= $matches['domain'] . ' ' . (($matches['ttl'] === '') ? DEFAULT_TTL : $matches['ttl']) . ' ' . $matches['type'] . ' ' . $matches['value'] . LF; } // Send the zone content to kzonecheck's stdin $process = proc_open(CONF['ns']['kzonecheck_path'] . ' --origin ' . $_POST['zone'] . ' --dnssec off -', [0 => ['pipe', 'r']], $pipes); if (is_resource($process) !== true) output(500, 'Can\'t spawn kzonecheck.'); fwrite($pipes[0], $new_zone_content); fclose($pipes[0]); if (proc_close($process) !== 0) output(403, 'Le contenu de zone envoyé n\'est pas valide (selon kzonecheck).'); ratelimit(); exec(CONF['dns']['knotc_path'] . ' --blocking --timeout 10 zone-freeze ' . $_POST['zone'], $output, $return_code); if ($return_code !== 0) output(500, 'Failed to freeze zone file.', $output); exec(CONF['dns']['knotc_path'] . ' --blocking --timeout 10 zone-flush ' . $_POST['zone'], $output, $return_code); if ($return_code !== 0) output(500, 'Failed to flush zone file.', $output); if (file_put_contents(CONF['ns']['knot_zones_path'] . '/' . $_POST['zone'] . 'zone', $new_zone_content) === false) output(500, 'Failed to write zone file.'); exec(CONF['dns']['knotc_path'] . ' --blocking --timeout 10 zone-reload ' . $_POST['zone'], $output, $return_code); if ($return_code !== 0) output(500, 'Failed to reload zone file.', $output); exec(CONF['dns']['knotc_path'] . ' --blocking --timeout 10 zone-thaw ' . $_POST['zone'], $output, $return_code); if ($return_code !== 0) output(500, 'Failed to thaw zone file.', $output); usleep(1000000); output(200, 'La zone a été mise à jour.'); } ?>


[A-Z]{1,16})[\t ]+.+$/', $zone_line, $matches)) { if (in_array($matches['type'], ALLOWED_TYPES, true) !== true) continue; $displayed_zone_content .= $zone_line . LF; } } $displayed_zone_content .= LF; ?>

Valeurs par défaut

Si le TTL est omis, il sera définit à secondes.

La précision de la classe (IN) est facultative.

Valeurs autorisées

La zone n'est pas autorisée à dépasser caractères.

Les TTLs ne sont autorisés qu'entre et secondes.

Les seuls types dont l'édition est autorisée sont :

    ' . $allowed_type . ''; ?>