diff --git a/Apps/QueryLogsSqliteApp/App.cs b/Apps/QueryLogsSqliteApp/App.cs index d7fc0414..4c302003 100644 --- a/Apps/QueryLogsSqliteApp/App.cs +++ b/Apps/QueryLogsSqliteApp/App.cs @@ -186,12 +186,13 @@ namespace QueryLogsSqlite { 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 paramClientIp = command.Parameters.Add("@client_ip", SqliteType.Text); SqliteParameter paramProtocol = command.Parameters.Add("@protocol", 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 paramQname = command.Parameters.Add("@qname", SqliteType.Text); SqliteParameter paramQtype = command.Parameters.Add("@qtype", SqliteType.Integer); @@ -204,10 +205,19 @@ namespace QueryLogsSqlite paramClientIp.Value = log.RemoteEP.Address.ToString(); paramProtocol.Value = (int)log.Protocol; + DnsServerResponseType responseType; + if (log.Response.Tag == null) - paramResponseType.Value = (int)DnsServerResponseType.Recursive; + responseType = DnsServerResponseType.Recursive; 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; @@ -238,12 +248,12 @@ namespace QueryLogsSqlite { string answer = null; - for (int i = 0; i < log.Response.Answer.Count; i++) + foreach (DnsResourceRecord record in log.Response.Answer) { if (answer is null) - answer = log.Response.Answer[i].RDATA.ToString(); + answer = record.Type.ToString() + " " + record.RDATA.ToString(); else - answer += ", " + log.Response.Answer[i].RDATA.ToString(); + answer += ", " + record.Type.ToString() + " " + record.RDATA.ToString(); } paramAnswer.Value = answer; @@ -331,6 +341,7 @@ CREATE TABLE IF NOT EXISTS dns_logs client_ip VARCHAR(39) NOT NULL, protocol TINYINT NOT NULL, response_type TINYINT NOT NULL, + response_rtt REAL, rcode TINYINT NOT NULL, qname VARCHAR(255), qtype SMALLINT, @@ -341,6 +352,17 @@ CREATE TABLE IF NOT EXISTS dns_logs 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()) { command.CommandText = "CREATE INDEX IF NOT EXISTS index_timestamp ON dns_logs (timestamp);"; @@ -570,6 +592,7 @@ SELECT * FROM ( client_ip, protocol, response_type, + response_rtt, rcode, qname, qtype, @@ -617,21 +640,28 @@ ORDER BY row_num" + (descendingOrder ? " DESC" : ""); { while (await reader.ReadAsync()) { + double? responseRtt; + + if (reader.IsDBNull(5)) + responseRtt = null; + else + responseRtt = reader.GetDouble(5); + DnsQuestionRecord question; - if (reader.IsDBNull(6)) + if (reader.IsDBNull(7)) question = null; 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; - if (reader.IsDBNull(9)) + if (reader.IsDBNull(10)) answer = null; 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)); } } }