QueryLogsSqlite: updated app to log response rtt value.

This commit is contained in:
Shreyas Zare
2024-12-21 15:25:21 +05:30
parent c873a5c4a9
commit 9f880ce4fb

View File

@@ -186,12 +186,13 @@ namespace QueryLogsSqlite
{ {
await using (SqliteCommand command = connection.CreateCommand()) await using (SqliteCommand command = connection.CreateCommand())
{ {
command.CommandText = "INSERT INTO dns_logs (timestamp, client_ip, protocol, response_type, rcode, qname, qtype, qclass, answer) VALUES (@timestamp, @client_ip, @protocol, @response_type, @rcode, @qname, @qtype, @qclass, @answer);"; command.CommandText = "INSERT INTO dns_logs (timestamp, client_ip, protocol, response_type, response_rtt, rcode, qname, qtype, qclass, answer) VALUES (@timestamp, @client_ip, @protocol, @response_type, @response_rtt, @rcode, @qname, @qtype, @qclass, @answer);";
SqliteParameter paramTimestamp = command.Parameters.Add("@timestamp", SqliteType.Text); SqliteParameter paramTimestamp = command.Parameters.Add("@timestamp", SqliteType.Text);
SqliteParameter paramClientIp = command.Parameters.Add("@client_ip", SqliteType.Text); SqliteParameter paramClientIp = command.Parameters.Add("@client_ip", SqliteType.Text);
SqliteParameter paramProtocol = command.Parameters.Add("@protocol", SqliteType.Integer); SqliteParameter paramProtocol = command.Parameters.Add("@protocol", SqliteType.Integer);
SqliteParameter paramResponseType = command.Parameters.Add("@response_type", SqliteType.Integer); SqliteParameter paramResponseType = command.Parameters.Add("@response_type", SqliteType.Integer);
SqliteParameter paramResponseRtt = command.Parameters.Add("@response_rtt", SqliteType.Real);
SqliteParameter paramRcode = command.Parameters.Add("@rcode", SqliteType.Integer); SqliteParameter paramRcode = command.Parameters.Add("@rcode", SqliteType.Integer);
SqliteParameter paramQname = command.Parameters.Add("@qname", SqliteType.Text); SqliteParameter paramQname = command.Parameters.Add("@qname", SqliteType.Text);
SqliteParameter paramQtype = command.Parameters.Add("@qtype", SqliteType.Integer); SqliteParameter paramQtype = command.Parameters.Add("@qtype", SqliteType.Integer);
@@ -204,10 +205,19 @@ namespace QueryLogsSqlite
paramClientIp.Value = log.RemoteEP.Address.ToString(); paramClientIp.Value = log.RemoteEP.Address.ToString();
paramProtocol.Value = (int)log.Protocol; paramProtocol.Value = (int)log.Protocol;
DnsServerResponseType responseType;
if (log.Response.Tag == null) if (log.Response.Tag == null)
paramResponseType.Value = (int)DnsServerResponseType.Recursive; responseType = DnsServerResponseType.Recursive;
else else
paramResponseType.Value = (int)(DnsServerResponseType)log.Response.Tag; responseType = (DnsServerResponseType)log.Response.Tag;
paramResponseType.Value = (int)responseType;
if ((responseType == DnsServerResponseType.Recursive) && (log.Response.Metadata is not null))
paramResponseRtt.Value = log.Response.Metadata.RoundTripTime;
else
paramResponseRtt.Value = DBNull.Value;
paramRcode.Value = (int)log.Response.RCODE; paramRcode.Value = (int)log.Response.RCODE;
@@ -238,12 +248,12 @@ namespace QueryLogsSqlite
{ {
string answer = null; string answer = null;
for (int i = 0; i < log.Response.Answer.Count; i++) foreach (DnsResourceRecord record in log.Response.Answer)
{ {
if (answer is null) if (answer is null)
answer = log.Response.Answer[i].RDATA.ToString(); answer = record.Type.ToString() + " " + record.RDATA.ToString();
else else
answer += ", " + log.Response.Answer[i].RDATA.ToString(); answer += ", " + record.Type.ToString() + " " + record.RDATA.ToString();
} }
paramAnswer.Value = answer; paramAnswer.Value = answer;
@@ -331,6 +341,7 @@ CREATE TABLE IF NOT EXISTS dns_logs
client_ip VARCHAR(39) NOT NULL, client_ip VARCHAR(39) NOT NULL,
protocol TINYINT NOT NULL, protocol TINYINT NOT NULL,
response_type TINYINT NOT NULL, response_type TINYINT NOT NULL,
response_rtt REAL,
rcode TINYINT NOT NULL, rcode TINYINT NOT NULL,
qname VARCHAR(255), qname VARCHAR(255),
qtype SMALLINT, qtype SMALLINT,
@@ -341,6 +352,17 @@ CREATE TABLE IF NOT EXISTS dns_logs
await command.ExecuteNonQueryAsync(); await command.ExecuteNonQueryAsync();
} }
try
{
await using (SqliteCommand command = connection.CreateCommand())
{
command.CommandText = "ALTER TABLE dns_logs ADD COLUMN response_rtt REAL;";
await command.ExecuteNonQueryAsync();
}
}
catch
{ }
await using (SqliteCommand command = connection.CreateCommand()) await using (SqliteCommand command = connection.CreateCommand())
{ {
command.CommandText = "CREATE INDEX IF NOT EXISTS index_timestamp ON dns_logs (timestamp);"; command.CommandText = "CREATE INDEX IF NOT EXISTS index_timestamp ON dns_logs (timestamp);";
@@ -570,6 +592,7 @@ SELECT * FROM (
client_ip, client_ip,
protocol, protocol,
response_type, response_type,
response_rtt,
rcode, rcode,
qname, qname,
qtype, qtype,
@@ -617,21 +640,28 @@ ORDER BY row_num" + (descendingOrder ? " DESC" : "");
{ {
while (await reader.ReadAsync()) while (await reader.ReadAsync())
{ {
double? responseRtt;
if (reader.IsDBNull(5))
responseRtt = null;
else
responseRtt = reader.GetDouble(5);
DnsQuestionRecord question; DnsQuestionRecord question;
if (reader.IsDBNull(6)) if (reader.IsDBNull(7))
question = null; question = null;
else else
question = new DnsQuestionRecord(reader.GetString(6), (DnsResourceRecordType)reader.GetInt32(7), (DnsClass)reader.GetInt32(8), false); question = new DnsQuestionRecord(reader.GetString(7), (DnsResourceRecordType)reader.GetInt32(8), (DnsClass)reader.GetInt32(9), false);
string answer; string answer;
if (reader.IsDBNull(9)) if (reader.IsDBNull(10))
answer = null; answer = null;
else else
answer = reader.GetString(9); answer = reader.GetString(10);
entries.Add(new DnsLogEntry(reader.GetInt64(0), reader.GetDateTime(1), IPAddress.Parse(reader.GetString(2)), (DnsTransportProtocol)reader.GetByte(3), (DnsServerResponseType)reader.GetByte(4), (DnsResponseCode)reader.GetByte(5), question, answer)); entries.Add(new DnsLogEntry(reader.GetInt64(0), reader.GetDateTime(1), IPAddress.Parse(reader.GetString(2)), (DnsTransportProtocol)reader.GetByte(3), (DnsServerResponseType)reader.GetByte(4), responseRtt, (DnsResponseCode)reader.GetByte(6), question, answer));
} }
} }
} }