|
@@ -65,6 +65,8 @@ pub struct BridgeInfo {
|
|
|
pub fingerprint: [u8; 20],
|
|
pub fingerprint: [u8; 20],
|
|
|
/// nickname of bridge (probably not necessary)
|
|
/// nickname of bridge (probably not necessary)
|
|
|
pub nickname: String,
|
|
pub nickname: String,
|
|
|
|
|
+ /// first Julian date we started collecting data on this bridge
|
|
|
|
|
+ pub first_seen: u32,
|
|
|
/// flag indicating whether the bridge is believed to be blocked
|
|
/// flag indicating whether the bridge is believed to be blocked
|
|
|
pub is_blocked: bool,
|
|
pub is_blocked: bool,
|
|
|
/// map of dates to data for that day
|
|
/// map of dates to data for that day
|
|
@@ -76,6 +78,7 @@ impl BridgeInfo {
|
|
|
Self {
|
|
Self {
|
|
|
fingerprint: fingerprint,
|
|
fingerprint: fingerprint,
|
|
|
nickname: nickname,
|
|
nickname: nickname,
|
|
|
|
|
+ first_seen: get_date(),
|
|
|
is_blocked: false,
|
|
is_blocked: false,
|
|
|
info_by_day: HashMap::<u32, DailyBridgeInfo>::new(),
|
|
info_by_day: HashMap::<u32, DailyBridgeInfo>::new(),
|
|
|
}
|
|
}
|
|
@@ -89,6 +92,7 @@ impl fmt::Display for BridgeInfo {
|
|
|
array_bytes::bytes2hex("", self.fingerprint).as_str()
|
|
array_bytes::bytes2hex("", self.fingerprint).as_str()
|
|
|
);
|
|
);
|
|
|
str.push_str(format!("nickname: {}\n", self.nickname).as_str());
|
|
str.push_str(format!("nickname: {}\n", self.nickname).as_str());
|
|
|
|
|
+ str.push_str(format!("first_seen: {}\n", self.first_seen).as_str());
|
|
|
str.push_str(format!("is_blocked: {}\n", self.is_blocked).as_str());
|
|
str.push_str(format!("is_blocked: {}\n", self.is_blocked).as_str());
|
|
|
str.push_str("info_by_day:");
|
|
str.push_str("info_by_day:");
|
|
|
for day in self.info_by_day.keys() {
|
|
for day in self.info_by_day.keys() {
|
|
@@ -111,8 +115,8 @@ pub struct DailyBridgeInfo {
|
|
|
/// Map of country codes and how many users (rounded up to a multiple of
|
|
/// Map of country codes and how many users (rounded up to a multiple of
|
|
|
/// 8) have connected to that bridge during the day.
|
|
/// 8) have connected to that bridge during the day.
|
|
|
pub bridge_ips: BTreeMap<String, u32>,
|
|
pub bridge_ips: BTreeMap<String, u32>,
|
|
|
- /// Set of negative reports received during this day
|
|
|
|
|
- pub negative_reports: Vec<SerializableNegativeReport>,
|
|
|
|
|
|
|
+ /// Map of negative reports to count of negative reports received
|
|
|
|
|
+ pub negative_reports: BTreeMap<SerializableNegativeReport, u32>,
|
|
|
/// Set of positive reports received during this day
|
|
/// Set of positive reports received during this day
|
|
|
pub positive_reports: Vec<SerializablePositiveReport>,
|
|
pub positive_reports: Vec<SerializablePositiveReport>,
|
|
|
// We don't care about ordering of the reports, but I'm using vectors for
|
|
// We don't care about ordering of the reports, but I'm using vectors for
|
|
@@ -127,7 +131,7 @@ impl DailyBridgeInfo {
|
|
|
pub fn new() -> Self {
|
|
pub fn new() -> Self {
|
|
|
Self {
|
|
Self {
|
|
|
bridge_ips: BTreeMap::<String, u32>::new(),
|
|
bridge_ips: BTreeMap::<String, u32>::new(),
|
|
|
- negative_reports: Vec::<SerializableNegativeReport>::new(),
|
|
|
|
|
|
|
+ negative_reports: BTreeMap::<SerializableNegativeReport, u32>::new(),
|
|
|
positive_reports: Vec::<SerializablePositiveReport>::new(),
|
|
positive_reports: Vec::<SerializablePositiveReport>::new(),
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -191,7 +195,7 @@ pub fn add_extra_info_to_db(db: &Db, extra_info: ExtraInfo) {
|
|
|
// No existing entry; make a new one.
|
|
// No existing entry; make a new one.
|
|
|
let daily_bridge_info = DailyBridgeInfo {
|
|
let daily_bridge_info = DailyBridgeInfo {
|
|
|
bridge_ips: extra_info.bridge_ips,
|
|
bridge_ips: extra_info.bridge_ips,
|
|
|
- negative_reports: Vec::<SerializableNegativeReport>::new(),
|
|
|
|
|
|
|
+ negative_reports: BTreeMap::<SerializableNegativeReport, u32>::new(),
|
|
|
positive_reports: Vec::<SerializablePositiveReport>::new(),
|
|
positive_reports: Vec::<SerializablePositiveReport>::new(),
|
|
|
};
|
|
};
|
|
|
bridge_info
|
|
bridge_info
|