@@ -428,15 +429,24 @@ $(document).ready(function () {
hoverAnimation: true,
hoverAnimationDuration: 60,
hoverAnimationEasing: undefined,
- items: [{
+ items: [
- icon: 'jtable/lib/themes/metro/add.png',
- text: 'Import a new zone',
- click: function() {
- $('#ImportZone').jtable('showCreateForm');
- }
+ {
+ icon: 'jtable/lib/themes/metro/add.png',
+ text: 'Import a new zone',
+ click: function() {
+ $('#ImportZone').jtable('showCreateForm');
+ }
+ },
+ {
+ icon: 'jtable/lib/themes/metro/add.png',
+ text: 'Clone a zone',
+ click: function() {
+ $('#CloneZone').jtable('showCreateForm');
+ }
+ },
- }],
+ ],
},
sorting: false,
openChildAsAccordion: true,
@@ -742,6 +752,51 @@ $(document).ready(function () {
}
});
+
+ $('#CloneZone').jtable({
+ title: 'Clone zone',
+ actions: {
+ createAction: 'zones.php?action=clone'
+ },
+ fields: {
+ id: {
+ key: true,
+ type: 'hidden'
+ },
+ sourcename: {
+ title: 'Source domain',
+ options: function(data) {
+ return 'zones.php?action=formzonelist&e='+$epoch;
+ },
+ inputClass: 'sourcename'
+ },
+ destname: {
+ title: 'Domain',
+ inputClass: 'destname'
+ },
+ account: {
+ title: 'Account',
+ options: function(data) {
+ return 'users.php?action=listoptions&e='+$epoch;
+ },
+ defaultValue: 'admin',
+ inputClass: 'account'
+ },
+ kind: {
+ title: 'Type',
+ options: {'Native': 'Native', 'Master': 'Master'},
+ defaultValue: '',
+ edit: false,
+ inputClass: 'type'
+ },
+ },
+ recordAdded: function() {
+ $("#MasterZones").jtable('load');
+ $("#SlaveZones").jtable('load');
+ }
+
+ });
+
$('#domsearch').addClear({
onClear: function() { $('#MasterZones').jtable('load'); }
});
diff --git a/zones.php b/zones.php
index c0d724c..2e9afc9 100644
--- a/zones.php
+++ b/zones.php
@@ -363,6 +363,34 @@ case "export":
jtable_respond($api->exportzone($_GET['zoneid']), 'single');
break;
+case "clone":
+ $name = $_POST['destname'];
+ $src = $_POST['sourcename'];
+
+ if (!_valid_label($name)) {
+ jtable_respond(null, 'error', "Invalid destination zonename");
+ }
+
+ $srczone = new Zone();
+ $srczone->parse($api->loadzone($src));
+
+ $srczone->setId('');
+ $srczone->setName($name);
+ $srczone->setSerial('');
+ $zone = $api->savezone($srczone->export());
+
+ $srczone->parse($zone);
+
+ foreach ($srczone->rrsets as $rrset) {
+ $newname = $rrset->name;
+ $newname = preg_replace('/'.$src.'$/', $name, $newname);
+ $rrset->setName($newname);
+ }
+ $zone = $api->savezone($srczone->export());
+
+ jtable_respond($zone, 'single');
+ break;
+
case "gettemplatenameservers":
$ret = array();
$type = $_GET['prisec'];
@@ -394,6 +422,19 @@ case "getformnameservers":
}
}
break;
+case "formzonelist":
+ $zones = $api->listzones();
+ $ret = array();
+ foreach ($zones as $zone) {
+ if ($zone['kind'] == 'Slave')
+ continue;
+ array_push($ret, array(
+ 'DisplayText' => $zone['name'],
+ 'Value' => $zone['id']));
+ }
+ jtable_respond($ret, 'options');
+ break;
+
default:
jtable_respond(null, 'error', 'No such action');
break;