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;