diff --git a/css/base.css b/css/base.css
index e31bc21..b4161be 100644
--- a/css/base.css
+++ b/css/base.css
@@ -68,9 +68,16 @@ input[type="submit"] {
margin: 0 0 50px;
}
img.list {
+ opacity: .4;
+}
+
+.clickme {
cursor: pointer;
}
+.clickme:hover {
+ opacity: 1;
+}
/* overrides jtable.css */
div.jtable-main-container > div.jtable-title {
background-color: #FFFFFF;
diff --git a/img/lock_open.png b/img/lock_open.png
index a471765..6bb98df 100644
Binary files a/img/lock_open.png and b/img/lock_open.png differ
diff --git a/index.php b/index.php
index f67d645..3c36113 100644
--- a/index.php
+++ b/index.php
@@ -149,7 +149,7 @@ $(document).ready(function () {
function displayDnssecIcon(zone) {
if (zone.record.dnssec == true) {
- var $img = $('
');
+ var $img = $('
');
$img.click(function () {
$("#dnssecinfo").html("");
$.each(zone.record.keyinfo, function ( i, val) {
@@ -170,10 +170,23 @@ function displayDnssecIcon(zone) {
});
return $img;
} else {
- return '
';
+ return '
';
}
}
+function displayExportIcon(zone) {
+ var $img = $('
');
+ $img.click(function () {
+ var $zexport = $.getJSON("zones.php?zone="+zone.record.name+"&action=export", function(data) {
+ var dl = document.createElement('a');
+ dl.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(data.Record.zone));
+ dl.setAttribute('download', zone.record.name+'.txt');
+ dl.click();
+ });
+ });
+ return $img;
+}
+
function displayContent(fieldName) {
return function(data) {
var value = data.record[fieldName];
@@ -331,6 +344,14 @@ $(document).ready(function () {
});
return $img;
}
+ },
+ exportzone: {
+ title: '',
+ width: '1%',
+ create: false,
+ edit: false,
+ display: displayExportIcon,
+ listClass: 'exportzone'
}
}
});
@@ -564,6 +585,14 @@ $(document).ready(function () {
});
return $img;
}
+ },
+ exportzone: {
+ title: '',
+ width: '1%',
+ create: false,
+ edit: false,
+ display: displayExportIcon,
+ listClass: 'exportzone'
}
}
});
diff --git a/zones.php b/zones.php
index f8ed210..c64f008 100644
--- a/zones.php
+++ b/zones.php
@@ -28,9 +28,11 @@ function api_request($path, $opts = null, $type = null) {
}
}
+ $headers = array();
+ array_push($headers, 'Accept: application/json');
$ch = curl_init();
if ($authmethod == "xapikey") {
- curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-API-Key: '.$apipass));
+ array_push($headers, 'X-API-Key: '.$apipass);
} else {
curl_setopt($ch, CURLOPT_USERPWD, "$apiuser:$apipass");
}
@@ -41,10 +43,11 @@ function api_request($path, $opts = null, $type = null) {
$type = 'POST';
}
$postdata = json_encode($opts);
- curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
+ array_push($headers, 'Content-Type: application/json');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
}
+
switch ($type) {
case 'DELETE':
case 'PATCH':
@@ -55,6 +58,7 @@ function api_request($path, $opts = null, $type = null) {
break;
}
+ curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$return = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$json = json_decode($return, 1);
@@ -622,6 +626,13 @@ case "deleterecord":
jtable_respond(null, 'delete');
break;
+case "export":
+ $zone = $_GET['zone'];
+ $export = api_request("/servers/${apisid}/zones/${zone}/export");
+
+ jtable_respond($export, 'single');
+ break;
+
default:
jtable_respond(null, 'error', 'No such action');
break;