smbind-ng/src/commit.php

192 lines
6.1 KiB
PHP

<?php
/*
* commit.php
*
* Copyright 2015 Péter Szládovics <peti@szladovics.hu>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
**********************************************************************
*
* Applies the zone/record changes to the system
*
*/
require_once "include.php";
$dslave = array();
$dmaster = array();
$dslave = $user->getDeletedZones('slave');
$dmaster = $user->getDeletedZones('master');
$cslave = $user->getCommitableZones('slave');
$cmaster = $user->getCommitableZones('master');
$allz = count($dmaster) + count($dslave) + count($cmaster) + count($cslave);
$done = 0;
if (isset($_SERVER['HTTP_REFERER']) &&
(preg_replace('/https?:\/\/[^\/]+/', '', $_SERVER['HTTP_REFERER']) != $_SERVER['PHP_SELF']) &&
(!isset($_GET['commit'])) &&
($allz >0)) {
$smarty->assign("pagetitle", "Commit changes");
$smarty->assign("template", "commit.tpl");
$smarty->assign("help", help("precommit"));
$smarty->assign("menu_button", menu_buttons());
$smarty->display("main.tpl");
die();
} elseif ((isset($_GET['commit'])) && ($_GET['commit'] != 'y')) {
problem();
} elseif (count($dmaster) +
count($dslave) +
count($cmaster) +
count($cslave) == 0) {
problem("nocommit");
}
$bind = new bindConfig($conf->conf);
$deleted = '';
$commited = '';
$error = '';
$delm = (count($dmaster) > 0) ? "<strong>" . "Deleting master records" . "</strong>\n\n" : '';
foreach ($dmaster as $master) {
$dmz = new masterZone(intval($master['id']));
$dmz->loadZoneHead();
$hd = $dmz->getZoneHead();
$hdr = $dmz->getZoneHeadRaw();
$dmz->eraseZone();
$err = $dmz->getErr();
if ($err > '') {
$error .= "<u>" . $hd['name'] . ":</u> " . "Error in deleting" . "\n" . $err . '\n\n';
} else {
$deleted .= "<u>" . $hd['name'] . ":</u> Deleting success.\n\n";
$bind->eraseConfig($hdr['name']);
$done++;
}
}
$error = ($error > '') ? $delm . $error : '';
$deleted = ($deleted > '') ? $delm . $deleted : '';
$errors = '';
$deleteds = '';
$delm .= (count($dslave) > 0) ? "<strong>" . "Deleting slave records" . "</strong>\n\n" : '';
$delm = ($deleted > '') ? "\n" . $delm : $delm;
foreach ($dslave as $slave) {
$dsz = new slaveZone(intval($slave['id']));
$dsz->loadZoneHead();
$hd = $dsz->getZoneHead();
$hdr = $dsz->getZoneHeadRaw();
$dsz->eraseZone();
$err = $dsz->getErr();
if ($err > '') {
$errors .= "<u>" . $hd['name'] . ":</u> Error in deleting\n" . $err . '\n\n';
} else {
$deleteds .= "<u>" . $hd['name'] . "</u>: Deleting success.\n\n";
$bind->eraseConfig($hdr['name']);
$done++;
}
}
$error .= ($errors > '') ? $delm . $errors : '';
$deleted .= ($deleteds > '') ? $delm . $deleteds : '';
$errors = '';
$comm = (count($cmaster) > 0) ? "<strong>" . "Committing master records" . "</strong>\n\n" : '';
$mcomm = '';
foreach ($cmaster as $master) {
$cmz = new masterZone(intval($master['id']));
$cmz->loadZoneHead();
$hd = $cmz->getZoneHead();
$hdr = $cmz->getZoneHeadRaw();
$cmz->writeZone($conf->path . $hdr['name'], $conf->hostMaster);
$zarray = array(
'type' => 'master',
'file' => $hdr['name'],
);
$zarray['file'] .= (($hd['secured'] == 'yes') && ($cmz->doSecure($conf->path, $conf->zoneSigner, $conf->rollInit, $conf->rollerConf))) ? ".signed" : "";
$cmz->doCommit();
$err = $cmz->getErr();
if ($err > '') {
$errors .= "<u>" . $hd['name'] . ":</u> Error in committing\n" . $err . '\n\n';
} else {
$mcomm .= "<u>" . $hd['name'] . "</u>: Committing success.\n" . $cmz->getMsg() . "\n";
$bind->addConfig($hdr['name'], $zarray);
$done++;
}
}
$error .= ($errors > '') ? $comm . $errors : '';
$commited .= ($mcomm > '') ? $comm . $mcomm: '';
$errors = '';
$comm = (count($cslave) > 0) ? "<strong>" . "Committing slave records" . "</strong>\n\n" : '';
$commited .= ($comm > '') ? "\n" : '';
$scomm = '';
foreach ($cslave as $slave) {
$csz = new slaveZone(intval($slave['id']));
$csz->loadZoneHead();
$hd = $csz->getZoneHead();
$hdr = $csz->getZoneHeadRaw();
$err = $csz->getErr();
if ($err > '') {
$errors .= "<u>" . $hd['name'] . ":</u> Error in committing\n" . $err . '\n\n';
} else {
$csz->doCommit();
$scomm .= "<u>" . $hd['name'] . "</u>: Committing success.\n\n";
$bind->addConfig($hdr['name'], array (
'type' => 'slave',
'masters' => $hdr['master'],
'file' => $hdr['name'],
));
$done++;
}
}
$error .= ($errors > '') ? $comm . $errors : '';
$commited .= ($scomm > '') ? $comm . $scomm : '';
$bind->saveConfig($conf->conf);
if ($done > 0) {
$cmd = $conf->rndc . " reload 2> /dev/stdout";
unset($coutput);
exec($cmd, $coutput, $exit);
if ($exit != 0) {
$error .= "Rndc error(" . $exit . "):\n" . implode("\n", $coutput);
} else {
$multi = ($done > 1) ? "zones" : "zone";
$commited .= "<b>" . $done . " " . $multi . " has been commited and reloaded:" . "</b>\n " . implode("\n ", $coutput) . "\n";
}
} else {
$commited .= "<b>" . "There wasn't commited zone" . "</b>";
}
$error = implode("<br />", explode("\n", $error));
$smarty->assign("popuperror", $error);
$smarty->assign("success", $deleted . $commited);
$smarty->assign("pagetitle", "Commit changes");
$smarty->assign("template", "commitdone.tpl");
$smarty->assign("help", help("commit"));
$smarty->assign("menu_button", menu_buttons());
$smarty->display("main.tpl");
?>