2021-09-18 19:02:40 +05:30
|
|
|
|
/*
|
|
|
|
|
Technitium DNS Server
|
2025-01-11 17:48:52 +05:30
|
|
|
|
Copyright (C) 2025 Shreyas Zare (shreyas@technitium.com)
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
|
|
|
|
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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
2023-01-01 17:56:51 +05:30
|
|
|
|
using DnsServerCore.Auth;
|
2021-09-18 19:02:40 +05:30
|
|
|
|
using DnsServerCore.Dns;
|
2023-01-01 17:56:51 +05:30
|
|
|
|
using Microsoft.AspNetCore.Http;
|
2021-09-18 19:02:40 +05:30
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Globalization;
|
|
|
|
|
using System.Net;
|
2022-12-24 13:07:15 +05:30
|
|
|
|
using System.Text.Json;
|
2021-09-18 19:02:40 +05:30
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using TechnitiumLibrary.Net.Dns;
|
2021-11-06 13:30:18 +05:30
|
|
|
|
using TechnitiumLibrary.Net.Dns.ResourceRecords;
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
|
|
|
|
namespace DnsServerCore
|
|
|
|
|
{
|
2025-02-15 12:51:16 +05:30
|
|
|
|
public partial class DnsWebService
|
2021-09-18 19:02:40 +05:30
|
|
|
|
{
|
2025-02-15 12:51:16 +05:30
|
|
|
|
class WebServiceDashboardApi
|
2021-09-18 19:02:40 +05:30
|
|
|
|
{
|
2025-02-15 12:51:16 +05:30
|
|
|
|
#region variables
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
readonly DnsWebService _dnsWebService;
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
#endregion
|
2022-12-24 13:07:15 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
#region constructor
|
2022-12-24 13:07:15 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
public WebServiceDashboardApi(DnsWebService dnsWebService)
|
|
|
|
|
{
|
|
|
|
|
_dnsWebService = dnsWebService;
|
|
|
|
|
}
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
#endregion
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
#region private
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
private static void WriteChartDataSet(Utf8JsonWriter jsonWriter, string label, string backgroundColor, string borderColor, List<KeyValuePair<string, long>> statsPerInterval)
|
2021-09-18 19:02:40 +05:30
|
|
|
|
{
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteStartObject();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteString("label", label);
|
|
|
|
|
jsonWriter.WriteString("backgroundColor", backgroundColor);
|
|
|
|
|
jsonWriter.WriteString("borderColor", borderColor);
|
|
|
|
|
jsonWriter.WriteNumber("borderWidth", 2);
|
|
|
|
|
jsonWriter.WriteBoolean("fill", true);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WritePropertyName("data");
|
|
|
|
|
jsonWriter.WriteStartArray();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
foreach (KeyValuePair<string, long> item in statsPerInterval)
|
|
|
|
|
jsonWriter.WriteNumberValue(item.Value);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndArray();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndObject();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
}
|
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
private async Task<IDictionary<string, string>> ResolvePtrTopClientsAsync(List<KeyValuePair<string, long>> topClients)
|
2021-09-18 19:02:40 +05:30
|
|
|
|
{
|
2025-02-15 12:51:16 +05:30
|
|
|
|
IDictionary<string, string> dhcpClientIpMap = _dnsWebService._dhcpServer.GetAddressHostNameMap();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
async Task<KeyValuePair<string, string>> ResolvePtrAsync(string ip)
|
|
|
|
|
{
|
|
|
|
|
if (dhcpClientIpMap.TryGetValue(ip, out string dhcpDomain))
|
|
|
|
|
return new KeyValuePair<string, string>(ip, dhcpDomain);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
IPAddress address = IPAddress.Parse(ip);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if (IPAddress.IsLoopback(address))
|
|
|
|
|
return new KeyValuePair<string, string>(ip, "localhost");
|
2022-10-09 15:43:00 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
DnsDatagram ptrResponse = await _dnsWebService._dnsServer.DirectQueryAsync(new DnsQuestionRecord(address, DnsClass.IN), 500);
|
|
|
|
|
if (ptrResponse.Answer.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
IReadOnlyList<string> ptrDomains = DnsClient.ParseResponsePTR(ptrResponse);
|
|
|
|
|
if (ptrDomains.Count > 0)
|
|
|
|
|
return new KeyValuePair<string, string>(ip, ptrDomains[0]);
|
|
|
|
|
}
|
2022-10-22 11:30:39 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
return new KeyValuePair<string, string>(ip, null);
|
|
|
|
|
}
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
List<Task<KeyValuePair<string, string>>> resolverTasks = new List<Task<KeyValuePair<string, string>>>();
|
2023-01-01 17:56:51 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
foreach (KeyValuePair<string, long> item in topClients)
|
|
|
|
|
{
|
|
|
|
|
resolverTasks.Add(ResolvePtrAsync(item.Key));
|
|
|
|
|
}
|
2022-10-22 11:30:39 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
Dictionary<string, string> result = new Dictionary<string, string>();
|
2022-10-22 11:30:39 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
foreach (Task<KeyValuePair<string, string>> resolverTask in resolverTasks)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
KeyValuePair<string, string> ptrResult = await resolverTask;
|
|
|
|
|
result[ptrResult.Key] = ptrResult.Value;
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{ }
|
|
|
|
|
}
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
return result;
|
|
|
|
|
}
|
2022-10-22 11:30:39 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
#endregion
|
2022-10-22 11:30:39 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
#region public
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
public async Task GetStats(HttpContext context)
|
|
|
|
|
{
|
|
|
|
|
if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Dashboard, context.GetCurrentSession().User, PermissionFlag.View))
|
|
|
|
|
throw new DnsWebServiceException("Access was denied.");
|
2022-10-22 11:30:39 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
HttpRequest request = context.Request;
|
2022-10-22 11:30:39 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
string strType = request.GetQueryOrForm("type", "lastHour");
|
|
|
|
|
bool utcFormat = request.GetQueryOrForm("utc", bool.Parse, false);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
bool isLanguageEnUs = true;
|
|
|
|
|
string acceptLanguage = request.Headers.AcceptLanguage;
|
|
|
|
|
if (!string.IsNullOrEmpty(acceptLanguage))
|
|
|
|
|
isLanguageEnUs = acceptLanguage.StartsWith("en-us", StringComparison.OrdinalIgnoreCase);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
Dictionary<string, List<KeyValuePair<string, long>>> data;
|
|
|
|
|
string labelFormat;
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
switch (strType.ToLowerInvariant())
|
|
|
|
|
{
|
|
|
|
|
case "lasthour":
|
|
|
|
|
data = _dnsWebService._dnsServer.StatsManager.GetLastHourMinuteWiseStats(utcFormat);
|
|
|
|
|
labelFormat = "HH:mm";
|
|
|
|
|
break;
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
case "lastday":
|
|
|
|
|
data = _dnsWebService._dnsServer.StatsManager.GetLastDayHourWiseStats(utcFormat);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if (isLanguageEnUs)
|
|
|
|
|
labelFormat = "MM/DD HH:00";
|
|
|
|
|
else
|
|
|
|
|
labelFormat = "DD/MM HH:00";
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
break;
|
2025-01-11 17:48:52 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
case "lastweek":
|
|
|
|
|
data = _dnsWebService._dnsServer.StatsManager.GetLastWeekDayWiseStats(utcFormat);
|
2022-10-22 11:30:39 +05:30
|
|
|
|
|
|
|
|
|
if (isLanguageEnUs)
|
|
|
|
|
labelFormat = "MM/DD";
|
|
|
|
|
else
|
|
|
|
|
labelFormat = "DD/MM";
|
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case "lastmonth":
|
|
|
|
|
data = _dnsWebService._dnsServer.StatsManager.GetLastMonthDayWiseStats(utcFormat);
|
2025-01-11 17:48:52 +05:30
|
|
|
|
|
|
|
|
|
if (isLanguageEnUs)
|
2025-02-15 12:51:16 +05:30
|
|
|
|
labelFormat = "MM/DD";
|
2025-01-11 17:48:52 +05:30
|
|
|
|
else
|
2025-02-15 12:51:16 +05:30
|
|
|
|
labelFormat = "DD/MM";
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
break;
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
case "lastyear":
|
|
|
|
|
labelFormat = "MM/YYYY";
|
|
|
|
|
data = _dnsWebService._dnsServer.StatsManager.GetLastYearMonthWiseStats(utcFormat);
|
|
|
|
|
break;
|
2023-01-01 17:56:51 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
case "custom":
|
|
|
|
|
string strStartDate = request.GetQueryOrForm("start");
|
|
|
|
|
string strEndDate = request.GetQueryOrForm("end");
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if (!DateTime.TryParse(strStartDate, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out DateTime startDate))
|
|
|
|
|
throw new DnsWebServiceException("Invalid start date format.");
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if (!DateTime.TryParse(strEndDate, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out DateTime endDate))
|
|
|
|
|
throw new DnsWebServiceException("Invalid end date format.");
|
2022-04-23 18:00:53 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if (startDate > endDate)
|
|
|
|
|
throw new DnsWebServiceException("Start date must be less than or equal to end date.");
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
TimeSpan duration = endDate - startDate;
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if ((Convert.ToInt32(duration.TotalDays) + 1) > 7)
|
|
|
|
|
{
|
|
|
|
|
data = _dnsWebService._dnsServer.StatsManager.GetDayWiseStats(startDate, endDate, utcFormat);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if (isLanguageEnUs)
|
|
|
|
|
labelFormat = "MM/DD";
|
|
|
|
|
else
|
|
|
|
|
labelFormat = "DD/MM";
|
|
|
|
|
}
|
|
|
|
|
else if ((Convert.ToInt32(duration.TotalHours) + 1) > 3)
|
|
|
|
|
{
|
|
|
|
|
data = _dnsWebService._dnsServer.StatsManager.GetHourWiseStats(startDate, endDate, utcFormat);
|
2022-10-09 15:43:00 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if (isLanguageEnUs)
|
|
|
|
|
labelFormat = "MM/DD HH:00";
|
|
|
|
|
else
|
|
|
|
|
labelFormat = "DD/MM HH:00";
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
data = _dnsWebService._dnsServer.StatsManager.GetMinuteWiseStats(startDate, endDate, utcFormat);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if (isLanguageEnUs)
|
|
|
|
|
labelFormat = "MM/DD HH:mm";
|
|
|
|
|
else
|
|
|
|
|
labelFormat = "DD/MM HH:mm";
|
|
|
|
|
}
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
break;
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
default:
|
|
|
|
|
throw new DnsWebServiceException("Unknown stats type requested: " + strType);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
}
|
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
Utf8JsonWriter jsonWriter = context.GetCurrentJsonWriter();
|
|
|
|
|
|
|
|
|
|
//stats
|
2021-09-18 19:02:40 +05:30
|
|
|
|
{
|
2025-02-15 12:51:16 +05:30
|
|
|
|
List<KeyValuePair<string, long>> stats = data["stats"];
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WritePropertyName("stats");
|
|
|
|
|
jsonWriter.WriteStartObject();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
foreach (KeyValuePair<string, long> item in stats)
|
|
|
|
|
jsonWriter.WriteNumber(item.Key, item.Value);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteNumber("zones", _dnsWebService._dnsServer.AuthZoneManager.TotalZones);
|
|
|
|
|
jsonWriter.WriteNumber("cachedEntries", _dnsWebService._dnsServer.CacheZoneManager.TotalEntries);
|
|
|
|
|
jsonWriter.WriteNumber("allowedZones", _dnsWebService._dnsServer.AllowedZoneManager.TotalZonesAllowed);
|
|
|
|
|
jsonWriter.WriteNumber("blockedZones", _dnsWebService._dnsServer.BlockedZoneManager.TotalZonesBlocked);
|
|
|
|
|
jsonWriter.WriteNumber("allowListZones", _dnsWebService._dnsServer.BlockListZoneManager.TotalZonesAllowed);
|
|
|
|
|
jsonWriter.WriteNumber("blockListZones", _dnsWebService._dnsServer.BlockListZoneManager.TotalZonesBlocked);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndObject();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
}
|
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
//main chart
|
|
|
|
|
{
|
|
|
|
|
jsonWriter.WritePropertyName("mainChartData");
|
|
|
|
|
jsonWriter.WriteStartObject();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
//label format
|
|
|
|
|
{
|
|
|
|
|
jsonWriter.WriteString("labelFormat", labelFormat);
|
|
|
|
|
}
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
//label
|
|
|
|
|
{
|
|
|
|
|
List<KeyValuePair<string, long>> statsPerInterval = data["totalQueriesPerInterval"];
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WritePropertyName("labels");
|
|
|
|
|
jsonWriter.WriteStartArray();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
foreach (KeyValuePair<string, long> item in statsPerInterval)
|
|
|
|
|
jsonWriter.WriteStringValue(item.Key);
|
|
|
|
|
|
|
|
|
|
jsonWriter.WriteEndArray();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//datasets
|
2021-09-18 19:02:40 +05:30
|
|
|
|
{
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WritePropertyName("datasets");
|
|
|
|
|
jsonWriter.WriteStartArray();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
WriteChartDataSet(jsonWriter, "Total", "rgba(102, 153, 255, 0.1)", "rgb(102, 153, 255)", data["totalQueriesPerInterval"]);
|
|
|
|
|
WriteChartDataSet(jsonWriter, "No Error", "rgba(92, 184, 92, 0.1)", "rgb(92, 184, 92)", data["totalNoErrorPerInterval"]);
|
|
|
|
|
WriteChartDataSet(jsonWriter, "Server Failure", "rgba(217, 83, 79, 0.1)", "rgb(217, 83, 79)", data["totalServerFailurePerInterval"]);
|
|
|
|
|
WriteChartDataSet(jsonWriter, "NX Domain", "rgba(120, 120, 120, 0.1)", "rgb(120, 120, 120)", data["totalNxDomainPerInterval"]);
|
|
|
|
|
WriteChartDataSet(jsonWriter, "Refused", "rgba(91, 192, 222, 0.1)", "rgb(91, 192, 222)", data["totalRefusedPerInterval"]);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
WriteChartDataSet(jsonWriter, "Authoritative", "rgba(150, 150, 0, 0.1)", "rgb(150, 150, 0)", data["totalAuthHitPerInterval"]);
|
|
|
|
|
WriteChartDataSet(jsonWriter, "Recursive", "rgba(23, 162, 184, 0.1)", "rgb(23, 162, 184)", data["totalRecursionsPerInterval"]);
|
|
|
|
|
WriteChartDataSet(jsonWriter, "Cached", "rgba(111, 84, 153, 0.1)", "rgb(111, 84, 153)", data["totalCacheHitPerInterval"]);
|
|
|
|
|
WriteChartDataSet(jsonWriter, "Blocked", "rgba(255, 165, 0, 0.1)", "rgb(255, 165, 0)", data["totalBlockedPerInterval"]);
|
|
|
|
|
WriteChartDataSet(jsonWriter, "Dropped", "rgba(30, 30, 30, 0.1)", "rgb(30, 30, 30)", data["totalDroppedPerInterval"]);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
WriteChartDataSet(jsonWriter, "Clients", "rgba(51, 122, 183, 0.1)", "rgb(51, 122, 183)", data["totalClientsPerInterval"]);
|
2024-02-04 18:04:43 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndArray();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
}
|
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndObject();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
}
|
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
//query response chart
|
2021-09-18 19:02:40 +05:30
|
|
|
|
{
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WritePropertyName("queryResponseChartData");
|
2021-09-18 19:02:40 +05:30
|
|
|
|
jsonWriter.WriteStartObject();
|
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
List<KeyValuePair<string, long>> stats = data["stats"];
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
//labels
|
2021-09-18 19:02:40 +05:30
|
|
|
|
{
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WritePropertyName("labels");
|
|
|
|
|
jsonWriter.WriteStartArray();
|
|
|
|
|
|
|
|
|
|
foreach (KeyValuePair<string, long> item in stats)
|
2021-09-18 19:02:40 +05:30
|
|
|
|
{
|
2025-02-15 12:51:16 +05:30
|
|
|
|
switch (item.Key)
|
|
|
|
|
{
|
|
|
|
|
case "totalAuthoritative":
|
|
|
|
|
jsonWriter.WriteStringValue("Authoritative");
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case "totalRecursive":
|
|
|
|
|
jsonWriter.WriteStringValue("Recursive");
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case "totalCached":
|
|
|
|
|
jsonWriter.WriteStringValue("Cached");
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case "totalBlocked":
|
|
|
|
|
jsonWriter.WriteStringValue("Blocked");
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case "totalDropped":
|
|
|
|
|
jsonWriter.WriteStringValue("Dropped");
|
|
|
|
|
break;
|
|
|
|
|
}
|
2021-09-18 19:02:40 +05:30
|
|
|
|
}
|
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndArray();
|
|
|
|
|
}
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
//datasets
|
|
|
|
|
{
|
|
|
|
|
jsonWriter.WritePropertyName("datasets");
|
|
|
|
|
jsonWriter.WriteStartArray();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteStartObject();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WritePropertyName("data");
|
|
|
|
|
jsonWriter.WriteStartArray();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
foreach (KeyValuePair<string, long> item in stats)
|
|
|
|
|
{
|
|
|
|
|
switch (item.Key)
|
|
|
|
|
{
|
|
|
|
|
case "totalAuthoritative":
|
|
|
|
|
case "totalRecursive":
|
|
|
|
|
case "totalCached":
|
|
|
|
|
case "totalBlocked":
|
|
|
|
|
case "totalDropped":
|
|
|
|
|
jsonWriter.WriteNumberValue(item.Value);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndArray();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WritePropertyName("backgroundColor");
|
|
|
|
|
jsonWriter.WriteStartArray();
|
|
|
|
|
jsonWriter.WriteStringValue("rgba(150, 150, 0, 0.5)");
|
|
|
|
|
jsonWriter.WriteStringValue("rgba(23, 162, 184, 0.5)");
|
|
|
|
|
jsonWriter.WriteStringValue("rgba(111, 84, 153, 0.5)");
|
|
|
|
|
jsonWriter.WriteStringValue("rgba(255, 165, 0, 0.5)");
|
|
|
|
|
jsonWriter.WriteStringValue("rgba(7, 7, 7, 0.5)");
|
|
|
|
|
jsonWriter.WriteEndArray();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndObject();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndArray();
|
|
|
|
|
}
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndObject();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
}
|
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
//query type chart
|
2021-09-18 19:02:40 +05:30
|
|
|
|
{
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WritePropertyName("queryTypeChartData");
|
2021-09-18 19:02:40 +05:30
|
|
|
|
jsonWriter.WriteStartObject();
|
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
List<KeyValuePair<string, long>> queryTypes = data["queryTypes"];
|
2022-12-24 13:07:15 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
//labels
|
|
|
|
|
{
|
|
|
|
|
jsonWriter.WritePropertyName("labels");
|
|
|
|
|
jsonWriter.WriteStartArray();
|
2022-12-24 13:07:15 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
foreach (KeyValuePair<string, long> item in queryTypes)
|
|
|
|
|
jsonWriter.WriteStringValue(item.Key);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndArray();
|
|
|
|
|
}
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
//datasets
|
|
|
|
|
{
|
|
|
|
|
jsonWriter.WritePropertyName("datasets");
|
|
|
|
|
jsonWriter.WriteStartArray();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteStartObject();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WritePropertyName("data");
|
|
|
|
|
jsonWriter.WriteStartArray();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
foreach (KeyValuePair<string, long> item in queryTypes)
|
|
|
|
|
jsonWriter.WriteNumberValue(item.Value);
|
2024-02-04 18:04:43 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndArray();
|
2024-02-04 18:04:43 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WritePropertyName("backgroundColor");
|
|
|
|
|
jsonWriter.WriteStartArray();
|
|
|
|
|
jsonWriter.WriteStringValue("rgba(102, 153, 255, 0.5)");
|
|
|
|
|
jsonWriter.WriteStringValue("rgba(92, 184, 92, 0.5)");
|
|
|
|
|
jsonWriter.WriteStringValue("rgba(7, 7, 7, 0.5)");
|
|
|
|
|
jsonWriter.WriteStringValue("rgba(91, 192, 222, 0.5)");
|
|
|
|
|
jsonWriter.WriteStringValue("rgba(150, 150, 0, 0.5)");
|
|
|
|
|
jsonWriter.WriteStringValue("rgba(23, 162, 184, 0.5)");
|
|
|
|
|
jsonWriter.WriteStringValue("rgba(111, 84, 153, 0.5)");
|
|
|
|
|
jsonWriter.WriteStringValue("rgba(255, 165, 0, 0.5)");
|
|
|
|
|
jsonWriter.WriteStringValue("rgba(51, 122, 183, 0.5)");
|
|
|
|
|
jsonWriter.WriteStringValue("rgba(150, 150, 150, 0.5)");
|
|
|
|
|
jsonWriter.WriteEndArray();
|
2024-02-04 18:04:43 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndObject();
|
2024-02-04 18:04:43 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndArray();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
jsonWriter.WriteEndObject();
|
2024-02-04 18:04:43 +05:30
|
|
|
|
}
|
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
//protocol type chart
|
2024-02-04 18:04:43 +05:30
|
|
|
|
{
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WritePropertyName("protocolTypeChartData");
|
2024-02-04 18:04:43 +05:30
|
|
|
|
jsonWriter.WriteStartObject();
|
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
List<KeyValuePair<string, long>> protocolTypes = data["protocolTypes"];
|
2024-02-04 18:04:43 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
//labels
|
|
|
|
|
{
|
|
|
|
|
jsonWriter.WritePropertyName("labels");
|
|
|
|
|
jsonWriter.WriteStartArray();
|
2024-02-04 18:04:43 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
foreach (KeyValuePair<string, long> item in protocolTypes)
|
|
|
|
|
jsonWriter.WriteStringValue(item.Key);
|
2024-02-04 18:04:43 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndArray();
|
|
|
|
|
}
|
2024-02-04 18:04:43 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
//datasets
|
|
|
|
|
{
|
|
|
|
|
jsonWriter.WritePropertyName("datasets");
|
|
|
|
|
jsonWriter.WriteStartArray();
|
2024-02-04 18:04:43 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteStartObject();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WritePropertyName("data");
|
|
|
|
|
jsonWriter.WriteStartArray();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
foreach (KeyValuePair<string, long> item in protocolTypes)
|
|
|
|
|
jsonWriter.WriteNumberValue(item.Value);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndArray();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WritePropertyName("backgroundColor");
|
|
|
|
|
jsonWriter.WriteStartArray();
|
|
|
|
|
jsonWriter.WriteStringValue("rgba(111, 84, 153, 0.5)");
|
|
|
|
|
jsonWriter.WriteStringValue("rgba(150, 150, 0, 0.5)");
|
|
|
|
|
jsonWriter.WriteStringValue("rgba(23, 162, 184, 0.5)"); ;
|
|
|
|
|
jsonWriter.WriteStringValue("rgba(255, 165, 0, 0.5)");
|
|
|
|
|
jsonWriter.WriteStringValue("rgba(91, 192, 222, 0.5)");
|
|
|
|
|
jsonWriter.WriteEndArray();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndObject();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndArray();
|
|
|
|
|
}
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
|
|
|
|
jsonWriter.WriteEndObject();
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
//top clients
|
|
|
|
|
{
|
|
|
|
|
List<KeyValuePair<string, long>> topClients = data["topClients"];
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
IDictionary<string, string> clientIpMap = await ResolvePtrTopClientsAsync(topClients);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WritePropertyName("topClients");
|
|
|
|
|
jsonWriter.WriteStartArray();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
foreach (KeyValuePair<string, long> item in topClients)
|
|
|
|
|
{
|
|
|
|
|
jsonWriter.WriteStartObject();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteString("name", item.Key);
|
2023-04-23 16:29:01 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if (clientIpMap.TryGetValue(item.Key, out string clientDomain) && !string.IsNullOrEmpty(clientDomain))
|
|
|
|
|
jsonWriter.WriteString("domain", clientDomain);
|
2023-04-23 16:29:01 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteNumber("hits", item.Value);
|
|
|
|
|
jsonWriter.WriteBoolean("rateLimited", _dnsWebService._dnsServer.IsQpmLimitCrossed(IPAddress.Parse(item.Key)));
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndObject();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
jsonWriter.WriteEndArray();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
}
|
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
//top domains
|
|
|
|
|
{
|
|
|
|
|
List<KeyValuePair<string, long>> topDomains = data["topDomains"];
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WritePropertyName("topDomains");
|
|
|
|
|
jsonWriter.WriteStartArray();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
foreach (KeyValuePair<string, long> item in topDomains)
|
|
|
|
|
{
|
|
|
|
|
jsonWriter.WriteStartObject();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteString("name", item.Key);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if (DnsClient.TryConvertDomainNameToUnicode(item.Key, out string idn))
|
|
|
|
|
jsonWriter.WriteString("nameIdn", idn);
|
2023-04-23 16:29:01 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteNumber("hits", item.Value);
|
2023-04-23 16:29:01 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndObject();
|
|
|
|
|
}
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndArray();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
}
|
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
//top blocked domains
|
|
|
|
|
{
|
|
|
|
|
List<KeyValuePair<string, long>> topBlockedDomains = data["topBlockedDomains"];
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WritePropertyName("topBlockedDomains");
|
|
|
|
|
jsonWriter.WriteStartArray();
|
|
|
|
|
|
|
|
|
|
foreach (KeyValuePair<string, long> item in topBlockedDomains)
|
|
|
|
|
{
|
|
|
|
|
jsonWriter.WriteStartObject();
|
|
|
|
|
|
|
|
|
|
jsonWriter.WriteString("name", item.Key);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if (DnsClient.TryConvertDomainNameToUnicode(item.Key, out string idn))
|
|
|
|
|
jsonWriter.WriteString("nameIdn", idn);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteNumber("hits", item.Value);
|
|
|
|
|
|
|
|
|
|
jsonWriter.WriteEndObject();
|
|
|
|
|
}
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndArray();
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
public async Task GetTopStats(HttpContext context)
|
2021-09-18 19:02:40 +05:30
|
|
|
|
{
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Dashboard, context.GetCurrentSession().User, PermissionFlag.View))
|
|
|
|
|
throw new DnsWebServiceException("Access was denied.");
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
HttpRequest request = context.Request;
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
string strType = request.GetQueryOrForm("type", "lastHour");
|
|
|
|
|
TopStatsType statsType = request.GetQueryOrFormEnum<TopStatsType>("statsType");
|
|
|
|
|
int limit = request.GetQueryOrForm("limit", int.Parse, 1000);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
List<KeyValuePair<string, long>> topStatsData;
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
switch (strType.ToLowerInvariant())
|
|
|
|
|
{
|
|
|
|
|
case "lasthour":
|
|
|
|
|
topStatsData = _dnsWebService._dnsServer.StatsManager.GetLastHourTopStats(statsType, limit);
|
|
|
|
|
break;
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
case "lastday":
|
|
|
|
|
topStatsData = _dnsWebService._dnsServer.StatsManager.GetLastDayTopStats(statsType, limit);
|
|
|
|
|
break;
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
case "lastweek":
|
|
|
|
|
topStatsData = _dnsWebService._dnsServer.StatsManager.GetLastWeekTopStats(statsType, limit);
|
|
|
|
|
break;
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
case "lastmonth":
|
|
|
|
|
topStatsData = _dnsWebService._dnsServer.StatsManager.GetLastMonthTopStats(statsType, limit);
|
|
|
|
|
break;
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
case "lastyear":
|
|
|
|
|
topStatsData = _dnsWebService._dnsServer.StatsManager.GetLastYearTopStats(statsType, limit);
|
|
|
|
|
break;
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
case "custom":
|
|
|
|
|
string strStartDate = request.GetQueryOrForm("start");
|
|
|
|
|
string strEndDate = request.GetQueryOrForm("end");
|
2025-01-11 17:48:52 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if (!DateTime.TryParse(strStartDate, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out DateTime startDate))
|
|
|
|
|
throw new DnsWebServiceException("Invalid start date format.");
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if (!DateTime.TryParse(strEndDate, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out DateTime endDate))
|
|
|
|
|
throw new DnsWebServiceException("Invalid end date format.");
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if (startDate > endDate)
|
|
|
|
|
throw new DnsWebServiceException("Start date must be less than or equal to end date.");
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
TimeSpan duration = endDate - startDate;
|
2023-01-01 17:56:51 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if ((Convert.ToInt32(duration.TotalDays) + 1) > 7)
|
|
|
|
|
topStatsData = _dnsWebService._dnsServer.StatsManager.GetDayWiseTopStats(startDate, endDate, statsType, limit);
|
|
|
|
|
else if ((Convert.ToInt32(duration.TotalHours) + 1) > 3)
|
|
|
|
|
topStatsData = _dnsWebService._dnsServer.StatsManager.GetHourWiseTopStats(startDate, endDate, statsType, limit);
|
|
|
|
|
else
|
|
|
|
|
topStatsData = _dnsWebService._dnsServer.StatsManager.GetMinuteWiseTopStats(startDate, endDate, statsType, limit);
|
2024-05-19 16:12:54 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
break;
|
2024-05-19 16:12:54 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
default:
|
|
|
|
|
throw new DnsWebServiceException("Unknown stats type requested: " + strType);
|
|
|
|
|
}
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
Utf8JsonWriter jsonWriter = context.GetCurrentJsonWriter();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
switch (statsType)
|
|
|
|
|
{
|
|
|
|
|
case TopStatsType.TopClients:
|
2021-09-18 19:02:40 +05:30
|
|
|
|
{
|
2025-02-15 12:51:16 +05:30
|
|
|
|
bool noReverseLookup = request.GetQueryOrForm("noReverseLookup", bool.Parse, false);
|
|
|
|
|
bool onlyRateLimitedClients = request.GetQueryOrForm("onlyRateLimitedClients", bool.Parse, false);
|
2024-05-19 16:12:54 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
IDictionary<string, string> clientIpMap = null;
|
2024-05-19 16:12:54 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if (!noReverseLookup)
|
|
|
|
|
clientIpMap = await ResolvePtrTopClientsAsync(topStatsData);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WritePropertyName("topClients");
|
|
|
|
|
jsonWriter.WriteStartArray();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
foreach (KeyValuePair<string, long> item in topStatsData)
|
|
|
|
|
{
|
|
|
|
|
bool rateLimited = _dnsWebService._dnsServer.IsQpmLimitCrossed(IPAddress.Parse(item.Key));
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if (onlyRateLimitedClients && !rateLimited)
|
|
|
|
|
continue;
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteStartObject();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteString("name", item.Key);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if ((clientIpMap is not null) && clientIpMap.TryGetValue(item.Key, out string clientDomain) && !string.IsNullOrEmpty(clientDomain))
|
|
|
|
|
jsonWriter.WriteString("domain", clientDomain);
|
|
|
|
|
|
|
|
|
|
jsonWriter.WriteNumber("hits", item.Value);
|
|
|
|
|
jsonWriter.WriteBoolean("rateLimited", rateLimited);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndObject();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
jsonWriter.WriteEndArray();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case TopStatsType.TopDomains:
|
2021-09-18 19:02:40 +05:30
|
|
|
|
{
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WritePropertyName("topDomains");
|
|
|
|
|
jsonWriter.WriteStartArray();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
foreach (KeyValuePair<string, long> item in topStatsData)
|
|
|
|
|
{
|
|
|
|
|
jsonWriter.WriteStartObject();
|
2023-04-23 16:29:01 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteString("name", item.Key);
|
2023-04-23 16:29:01 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if (DnsClient.TryConvertDomainNameToUnicode(item.Key, out string idn))
|
|
|
|
|
jsonWriter.WriteString("nameIdn", idn);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteNumber("hits", item.Value);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndObject();
|
|
|
|
|
}
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndArray();
|
|
|
|
|
}
|
|
|
|
|
break;
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
case TopStatsType.TopBlockedDomains:
|
2021-09-18 19:02:40 +05:30
|
|
|
|
{
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WritePropertyName("topBlockedDomains");
|
|
|
|
|
jsonWriter.WriteStartArray();
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
foreach (KeyValuePair<string, long> item in topStatsData)
|
|
|
|
|
{
|
|
|
|
|
jsonWriter.WriteStartObject();
|
2023-04-23 16:29:01 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteString("name", item.Key);
|
2023-04-23 16:29:01 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
if (DnsClient.TryConvertDomainNameToUnicode(item.Key, out string idn))
|
|
|
|
|
jsonWriter.WriteString("nameIdn", idn);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteNumber("hits", item.Value);
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
jsonWriter.WriteEndObject();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
jsonWriter.WriteEndArray();
|
|
|
|
|
}
|
|
|
|
|
break;
|
2021-09-18 19:02:40 +05:30
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
default:
|
|
|
|
|
throw new NotSupportedException();
|
|
|
|
|
}
|
2021-09-18 19:02:40 +05:30
|
|
|
|
}
|
|
|
|
|
|
2025-02-15 12:51:16 +05:30
|
|
|
|
#endregion
|
|
|
|
|
}
|
2021-09-18 19:02:40 +05:30
|
|
|
|
}
|
|
|
|
|
}
|