/*
Technitium DNS Server
Copyright (C) 2021 Shreyas Zare (shreyas@technitium.com)
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 3 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, see .
*/
$(function () {
$('#dtpQueryLogStart').datetimepicker({ format: "YYYY-MM-DD HH:mm:ss" });
$('#dtpQueryLogEnd').datetimepicker({ format: "YYYY-MM-DD HH:mm:ss" });
$("#optQueryLogsAppName").change(function () {
if (appsList == null)
return;
var appName = $("#optQueryLogsAppName").val();
var optClassPaths = "";
for (var i = 0; i < appsList.length; i++) {
if (appsList[i].name == appName) {
for (var j = 0; j < appsList[i].dnsApps.length; j++) {
if (appsList[i].dnsApps[j].isQueryLogger)
optClassPaths += "" + appsList[i].dnsApps[j].classPath + " ";
}
break;
}
}
$("#optQueryLogsClassPath").html(optClassPaths);
$("#txtAddEditRecordDataData").val("");
});
});
function refreshLogsTab() {
if ($("#logsTabListLogViewer").hasClass("active"))
refreshLogFilesList();
else if ($("#logsTabListQueryLogs").hasClass("active"))
refreshQueryLogsTab();
}
function refreshLogFilesList() {
var lstLogFiles = $("#lstLogFiles");
HTTPRequest({
url: "/api/listLogs?token=" + token,
success: function (responseJSON) {
var logFiles = responseJSON.response.logFiles;
var list = "
";
if (logFiles.length == 0) {
list += "No Log Was Found
";
}
else {
list += "";
for (var i = 0; i < logFiles.length; i++) {
var logFile = logFiles[i];
list += ""
}
}
lstLogFiles.html(list);
},
invalidToken: function () {
showPageLogin();
},
objLoaderPlaceholder: lstLogFiles
});
}
function viewLog(logFile) {
var divLogViewer = $("#divLogViewer");
var txtLogViewerTitle = $("#txtLogViewerTitle");
var divLogViewerLoader = $("#divLogViewerLoader");
var preLogViewerBody = $("#preLogViewerBody");
txtLogViewerTitle.text(logFile);
preLogViewerBody.hide();
divLogViewerLoader.show();
divLogViewer.show();
HTTPGetFileRequest({
url: "/log/" + logFile + "?limit=2&token=" + token,
success: function (response) {
divLogViewerLoader.hide();
preLogViewerBody.text(response);
preLogViewerBody.show();
},
objLoaderPlaceholder: divLogViewerLoader
});
}
function downloadLog() {
var logFile = $("#txtLogViewerTitle").text();
window.open("/log/" + logFile + "?token=" + token + "&ts=" + (new Date().getTime()), "_blank");
}
function deleteLog() {
var logFile = $("#txtLogViewerTitle").text();
if (!confirm("Are you sure you want to permanently delete the log file '" + logFile + "'?"))
return;
var btn = $("#btnDeleteLog").button('loading');
HTTPRequest({
url: "/api/deleteLog?token=" + token + "&log=" + logFile,
success: function (responseJSON) {
refreshLogFilesList();
$("#divLogViewer").hide();
btn.button('reset');
showAlert("success", "Log Deleted!", "Log file was deleted successfully.");
},
error: function () {
btn.button('reset');
},
invalidToken: function () {
btn.button('reset');
showPageLogin();
}
});
}
function deleteAllLogs() {
if (!confirm("Are you sure you want to permanently delete all log files?"))
return;
HTTPRequest({
url: "/api/deleteAllLogs?token=" + token,
success: function (responseJSON) {
refreshLogFilesList();
$("#divLogViewer").hide();
showAlert("success", "Logs Deleted!", "All log files were deleted successfully.");
},
invalidToken: function () {
showPageLogin();
}
});
}
function deleteAllStats() {
if (!confirm("Are you sure you want to permanently delete all stats files?"))
return;
HTTPRequest({
url: "/api/deleteAllStats?token=" + token,
success: function (responseJSON) {
showAlert("success", "Stats Deleted!", "All stats files were deleted successfully.");
},
invalidToken: function () {
showPageLogin();
}
});
}
var appsList;
function refreshQueryLogsTab() {
var frmQueryLogs = $("#frmQueryLogs");
var divQueryLogsLoader = $("#divQueryLogsLoader");
var divQueryLogsTable = $("#divQueryLogsTable");
var optQueryLogsAppName = $("#optQueryLogsAppName");
var optQueryLogsClassPath = $("#optQueryLogsClassPath");
var currentAppName = optQueryLogsAppName.val();
var currentClassPath = optQueryLogsClassPath.val();
var loader;
if (appsList == null) {
frmQueryLogs.hide();
divQueryLogsTable.hide();
loader = divQueryLogsLoader;
}
else {
optQueryLogsAppName.prop('disabled', true);
optQueryLogsClassPath.prop('disabled', true);
}
HTTPRequest({
url: "/api/apps/list?token=" + token,
success: function (responseJSON) {
var apps = responseJSON.response.apps;
var optApps = "";
var optClassPaths = "";
for (var i = 0; i < apps.length; i++) {
for (var j = 0; j < apps[i].dnsApps.length; j++) {
if (apps[i].dnsApps[j].isQueryLogger) {
optApps += "" + apps[i].name + " ";
if (currentAppName == null)
currentAppName = apps[i].name;
break;
}
}
}
for (var i = 0; i < apps.length; i++) {
if (apps[i].name == currentAppName) {
for (var j = 0; j < apps[i].dnsApps.length; j++) {
if (apps[i].dnsApps[j].isQueryLogger)
optClassPaths += "" + apps[i].dnsApps[j].classPath + " ";
}
break;
}
}
optQueryLogsAppName.html(optApps);
optQueryLogsClassPath.html(optClassPaths);
if (currentAppName != null)
optQueryLogsAppName.val(currentAppName);
if (currentClassPath != null)
optQueryLogsClassPath.val(currentClassPath);
if (appsList == null) {
frmQueryLogs.show();
loader.hide();
}
else {
optQueryLogsAppName.prop('disabled', false);
optQueryLogsClassPath.prop('disabled', false);
}
appsList = apps;
},
error: function () {
if (appsList == null) {
frmQueryLogs.show();
divQueryLogsTable.show();
}
else {
optQueryLogsAppName.prop('disabled', false);
optQueryLogsClassPath.prop('disabled', false);
}
},
invalidToken: function () {
showPageLogin();
},
objLoaderPlaceholder: loader
});
}
function queryLogs(pageNumber) {
var btn = $("#btnQueryLogs");
var divQueryLogsLoader = $("#divQueryLogsLoader");
var divQueryLogsTable = $("#divQueryLogsTable");
var name = $("#optQueryLogsAppName").val();
if (name == null) {
showAlert("warning", "Missing!", "Please install a DNS App that supports query logging feature.");
$("#optQueryLogsAppName").focus();
return false;
}
var classPath = $("#optQueryLogsClassPath").val();
if (classPath == null) {
showAlert("warning", "Missing!", "Please select a Class Path to query logs.");
$("#optQueryLogsClassPath").focus();
return false;
}
if (pageNumber == null)
pageNumber = $("#txtQueryLogPageNumber").val();
var entriesPerPage = $("#optQueryLogsEntriesPerPage").val();
var descendingOrder = $("#optQueryLogsDescendingOrder").val();
var start = $("#txtQueryLogStart").val();
if (start != "")
start = moment(start).format("YYYY-MM-DD HH:mm:ss");
var end = $("#txtQueryLogEnd").val();
if (end != "")
end = moment(end).format("YYYY-MM-DD HH:mm:ss");
var clientIpAddress = $("#txtQueryLogClientIpAddress").val();
var protocol = $("#optQueryLogsProtocol").val();
var responseType = $("#optQueryLogsResponseType").val();
var rcode = $("#optQueryLogsResponseCode").val();
var qname = $("#txtQueryLogQName").val();
var qtype = $("#txtQueryLogQType").val();
var qclass = $("#optQueryLogQClass").val();
divQueryLogsTable.hide();
divQueryLogsLoader.show();
btn.button('loading');
HTTPRequest({
url: "/api/queryLogs?token=" + token + "&name=" + encodeURIComponent(name) + "&classPath=" + encodeURIComponent(classPath) + "&pageNumber=" + pageNumber + "&entriesPerPage=" + entriesPerPage + "&descendingOrder=" + descendingOrder +
"&start=" + encodeURIComponent(start) + "&end=" + encodeURIComponent(end) + "&clientIpAddress=" + encodeURIComponent(clientIpAddress) + "&protocol=" + protocol + "&responseType=" + responseType + "&rcode=" + rcode +
"&qname=" + encodeURIComponent(qname) + "&qtype=" + qtype + "&qclass=" + qclass,
success: function (responseJSON) {
var tableHtml = "";
for (var i = 0; i < responseJSON.response.entries.length; i++) {
tableHtml += "" + responseJSON.response.entries[i].rowNumber + " " +
moment(responseJSON.response.entries[i].timestamp).local().format("YYYY-MM-DD HH:mm:ss") + " " +
responseJSON.response.entries[i].clientIpAddress + " " +
responseJSON.response.entries[i].protocol + " " +
responseJSON.response.entries[i].responseType + " " +
responseJSON.response.entries[i].rcode + " " +
htmlEncode(responseJSON.response.entries[i].qname == "" ? "." : responseJSON.response.entries[i].qname) + " " +
(responseJSON.response.entries[i].qtype == null ? "" : responseJSON.response.entries[i].qtype) + " " +
(responseJSON.response.entries[i].qclass == null ? "" : responseJSON.response.entries[i].qclass) + " " +
htmlEncode(responseJSON.response.entries[i].answer) + " "
}
var paginationHtml = "";
if (responseJSON.response.pageNumber > 1) {
paginationHtml += "« ";
paginationHtml += "‹ ";
}
var pageStart = responseJSON.response.pageNumber - 5;
if (pageStart < 1)
pageStart = 1;
var pageEnd = pageStart + 9;
if (pageEnd > responseJSON.response.totalPages) {
var endDiff = pageEnd - responseJSON.response.totalPages;
pageEnd = responseJSON.response.totalPages;
pageStart -= endDiff;
if (pageStart < 1)
pageStart = 1;
}
for (var i = pageStart; i <= pageEnd; i++) {
if (i == responseJSON.response.pageNumber)
paginationHtml += "" + i + " ";
else
paginationHtml += "" + i + " ";
}
if (responseJSON.response.pageNumber < responseJSON.response.totalPages) {
paginationHtml += "› ";
paginationHtml += "» ";
}
$("#tableQueryLogsBody").html(tableHtml);
var statusHtml;
if (responseJSON.response.entries.length > 0)
statusHtml = responseJSON.response.entries[0].rowNumber + "-" + responseJSON.response.entries[responseJSON.response.entries.length - 1].rowNumber + " (" + responseJSON.response.entries.length + ") of " + responseJSON.response.totalEntries + " logs (page " + responseJSON.response.pageNumber + " of " + responseJSON.response.totalPages + ")";
else
statusHtml = "0 logs";
$("#tableQueryLogsTopStatus").html(statusHtml);
$("#tableQueryLogsTopPagination").html(paginationHtml);
$("#tableQueryLogsFooterStatus").html(statusHtml);
$("#tableQueryLogsFooterPagination").html(paginationHtml);
btn.button('reset');
divQueryLogsLoader.hide();
divQueryLogsTable.show();
},
error: function () {
btn.button('reset');
},
invalidToken: function () {
showPageLogin();
},
objLoaderPlaceholder: divQueryLogsLoader
});
}