1use crate::custom_deserializers;
2use crate::fake_hash_map;
3use crate::ftl_types::*;
4use chrono::prelude::*;
5use serde::{Deserialize, Serialize};
6use serde_tuple::*;
7use std::collections::HashMap;
8use std::net::IpAddr;
9use std::time::Duration;
10
11#[derive(Deserialize, Serialize, Debug)]
13pub struct SummaryRaw {
14 pub domains_being_blocked: u64,
16
17 pub dns_queries_today: u64,
19
20 pub ads_blocked_today: u64,
22
23 pub ads_percentage_today: f64,
25
26 pub unique_domains: u64,
28
29 pub queries_forwarded: u64,
31
32 pub queries_cached: u64,
34
35 pub clients_ever_seen: u64,
37
38 pub unique_clients: u64,
40
41 pub dns_queries_all_types: u64,
43
44 #[serde(rename = "reply_NODATA")]
46 pub reply_nodata: u64,
47
48 #[serde(rename = "reply_NXDOMAIN")]
50 pub reply_nxdomain: u64,
51
52 #[serde(rename = "reply_CNAME")]
54 pub reply_cname: u64,
55
56 #[serde(rename = "reply_IP")]
58 pub reply_ip: u64,
59
60 pub privacy_level: u64,
62
63 pub status: String,
65}
66
67#[derive(Deserialize, Serialize, Debug)]
69pub struct Summary {
70 pub domains_being_blocked: String,
72
73 pub dns_queries_today: String,
75
76 pub ads_blocked_today: String,
78
79 pub ads_percentage_today: String,
81
82 pub unique_domains: String,
84
85 pub queries_forwarded: String,
87
88 pub queries_cached: String,
90
91 pub clients_ever_seen: String,
93
94 pub unique_clients: String,
96
97 pub dns_queries_all_types: String,
99
100 #[serde(rename = "reply_NODATA")]
102 pub reply_nodata: String,
103
104 #[serde(rename = "reply_NXDOMAIN")]
106 pub reply_nxdomain: String,
107
108 #[serde(rename = "reply_CNAME")]
110 pub reply_cname: String,
111
112 #[serde(rename = "reply_IP")]
114 pub reply_ip: String,
115
116 pub privacy_level: String,
118
119 pub status: String,
121}
122
123#[derive(Deserialize, Serialize, Debug)]
125pub struct OverTimeData {
126 #[serde(deserialize_with = "fake_hash_map::deserialize_fake_hash_map")]
128 pub domains_over_time: HashMap<String, u64>,
129
130 #[serde(deserialize_with = "fake_hash_map::deserialize_fake_hash_map")]
132 pub ads_over_time: HashMap<String, u64>,
133}
134
135#[derive(Deserialize, Serialize, Debug)]
137pub struct TopItems {
138 #[serde(deserialize_with = "fake_hash_map::deserialize_fake_hash_map")]
140 pub top_queries: HashMap<String, u64>,
141
142 #[serde(deserialize_with = "fake_hash_map::deserialize_fake_hash_map")]
144 pub top_ads: HashMap<String, u64>,
145}
146
147#[derive(Deserialize, Serialize, Debug)]
149pub struct TopClients {
150 #[serde(deserialize_with = "fake_hash_map::deserialize_fake_hash_map")]
152 pub top_sources: HashMap<String, u64>,
153}
154
155#[derive(Deserialize, Serialize, Debug)]
157pub struct TopClientsBlocked {
158 #[serde(deserialize_with = "fake_hash_map::deserialize_fake_hash_map")]
160 pub top_sources_blocked: HashMap<String, u64>,
161}
162
163#[derive(Deserialize, Serialize, Debug)]
165pub struct ForwardDestinations {
166 #[serde(deserialize_with = "fake_hash_map::deserialize_fake_hash_map")]
168 pub forward_destinations: HashMap<String, f64>,
169}
170
171#[derive(Deserialize, Serialize, Debug)]
173pub struct QueryTypes {
174 #[serde(deserialize_with = "fake_hash_map::deserialize_fake_hash_map")]
176 pub querytypes: HashMap<String, f64>,
177}
178
179#[derive(Deserialize, Serialize_tuple, Debug)]
181pub struct Query {
182 #[serde(deserialize_with = "custom_deserializers::deserialize_string_to_naive_datetime")]
184 pub timestring: NaiveDateTime,
185
186 pub query_type: QueryType,
188
189 pub domain: String,
191
192 pub client: String,
194
195 #[serde(deserialize_with = "custom_deserializers::deserialize_string_to_query_status")]
197 pub status: QueryStatus,
198
199 #[serde(deserialize_with = "custom_deserializers::deserialize_string_to_dnssec_status")]
201 pub dnssec_status: DNSSECStatus,
202
203 #[serde(deserialize_with = "custom_deserializers::deserialize_string_to_reply_type")]
205 pub reply_type: ReplyType,
206
207 #[serde(
209 deserialize_with = "custom_deserializers::deserialize_string_to_duration_100_microseconds"
210 )]
211 pub response_time: Duration,
212
213 pub cname_domain: String,
215
216 #[serde(deserialize_with = "custom_deserializers::deserialize_string_to_i32")]
218 pub regex_id: i32,
219
220 pub upstream_destination: String,
222
223 pub ede: String,
225}
226
227#[derive(Deserialize, Serialize, Debug)]
229pub struct AllQueries {
230 pub data: Vec<Query>,
232}
233
234#[derive(Deserialize, Serialize, Debug)]
236pub struct Status {
237 pub status: String,
239}
240
241#[derive(Deserialize, Serialize, Debug)]
243pub struct Version {
244 pub version: u32,
246}
247
248#[derive(Deserialize, Serialize, Debug)]
250pub struct Versions {
251 pub core_update: bool,
253 pub web_update: bool,
255 #[serde(rename = "FTL_update")]
257 pub ftl_update: bool,
258 pub core_current: String,
260 pub web_current: String,
262 #[serde(rename = "FTL_current")]
264 pub ftl_current: String,
265 pub core_latest: String,
267 pub web_latest: String,
269 #[serde(rename = "FTL_latest")]
271 pub ftl_latest: String,
272 pub core_branch: String,
274 pub web_branch: String,
276 #[serde(rename = "FTL_branch")]
278 pub ftl_branch: String,
279}
280
281#[derive(Deserialize, Serialize, Debug)]
283pub struct CacheInfo {
284 #[serde(rename = "cache-size")]
286 pub cache_size: u64,
287
288 #[serde(rename = "cache-live-freed")]
290 pub cache_live_freed: u64,
291
292 #[serde(rename = "cache-inserted")]
294 pub cache_inserted: u64,
295}
296
297#[derive(Deserialize, Serialize, Debug)]
299pub struct ClientName {
300 pub name: String,
302
303 pub ip: IpAddr,
305}
306
307#[derive(Deserialize, Serialize, Debug)]
309pub struct NetworkClient {
310 pub id: u64,
312
313 pub ip: Vec<IpAddr>,
315
316 pub hwaddr: String,
318
319 pub interface: String,
321
322 pub name: Vec<String>,
324
325 #[serde(rename = "firstSeen", with = "chrono::naive::serde::ts_seconds")]
327 pub first_seen: NaiveDateTime,
328
329 #[serde(rename = "lastQuery", with = "chrono::naive::serde::ts_seconds")]
331 pub last_query: NaiveDateTime,
332
333 #[serde(rename = "numQueries")]
335 pub num_queries: u64,
336
337 #[serde(rename = "macVendor")]
339 pub mac_vendor: String,
340}
341
342#[derive(Deserialize, Serialize, Debug)]
344pub struct Network {
345 pub network: Vec<NetworkClient>,
347}
348
349#[derive(Deserialize, Serialize, Debug)]
351pub struct ListModificationResponse {
352 pub success: bool,
354 pub message: Option<String>,
356}
357
358#[derive(Deserialize, Serialize, Debug)]
360pub struct CustomListDomainDetails {
361 pub id: u64,
363 #[serde(rename = "type")]
365 pub domain_type: u64,
366 pub domain: String,
368 #[serde(deserialize_with = "custom_deserializers::deserialize_uint_to_bool")]
370 pub enabled: bool,
371 #[serde(with = "chrono::naive::serde::ts_seconds")]
373 pub date_added: NaiveDateTime,
374 #[serde(with = "chrono::naive::serde::ts_seconds")]
376 pub date_modified: NaiveDateTime,
377 pub comment: String,
379 pub groups: Vec<u64>,
381}
382
383#[derive(Deserialize, Serialize, Debug)]
385pub struct CustomDNSRecord {
386 pub domain: String,
388 pub ip_address: IpAddr,
390}
391
392#[derive(Deserialize, Serialize, Debug)]
394pub struct CustomCNAMERecord {
395 pub domain: String,
397 pub target_domain: String,
399}
400
401#[derive(Deserialize, Serialize, Debug)]
403pub struct FTLNotRunning {
404 #[serde(rename = "FTLnotrunning")]
406 pub ftl_not_running: bool,
407}