Pass confidence to analyzer
This commit is contained in:
parent
5c6a076289
commit
cba8aea553
|
@ -7,6 +7,7 @@
|
||||||
"Lox": "127.0.0.1:8002"
|
"Lox": "127.0.0.1:8002"
|
||||||
},
|
},
|
||||||
"extra_infos_base_url": "https://collector.torproject.org/recent/bridge-descriptors/extra-infos/",
|
"extra_infos_base_url": "https://collector.torproject.org/recent/bridge-descriptors/extra-infos/",
|
||||||
|
"confidence": 0.95,
|
||||||
"port": 8003,
|
"port": 8003,
|
||||||
"require_bridge_token": false,
|
"require_bridge_token": false,
|
||||||
"updater_schedule": "* * 22 * * * *"
|
"updater_schedule": "* * 22 * * * *"
|
||||||
|
|
|
@ -3,14 +3,14 @@ use std::collections::HashSet;
|
||||||
|
|
||||||
/// Provides a function for predicting which countries block this bridge
|
/// Provides a function for predicting which countries block this bridge
|
||||||
pub trait Analyzer {
|
pub trait Analyzer {
|
||||||
fn blocked_in(&self, bridge_info: &BridgeInfo) -> HashSet<String>;
|
fn blocked_in(&self, bridge_info: &BridgeInfo, confidence: f64) -> HashSet<String>;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ExampleAnalyzer {}
|
pub struct ExampleAnalyzer {}
|
||||||
|
|
||||||
/// Dummy example which just tells us about blockages we already know about
|
/// Dummy example which just tells us about blockages we already know about
|
||||||
impl Analyzer for ExampleAnalyzer {
|
impl Analyzer for ExampleAnalyzer {
|
||||||
fn blocked_in(&self, bridge_info: &BridgeInfo) -> HashSet<String> {
|
fn blocked_in(&self, bridge_info: &BridgeInfo, confidence: f64) -> HashSet<String> {
|
||||||
let mut blocked_in = HashSet::<String>::new();
|
let mut blocked_in = HashSet::<String>::new();
|
||||||
for (country, info) in &bridge_info.info_by_country {
|
for (country, info) in &bridge_info.info_by_country {
|
||||||
if info.blocked {
|
if info.blocked {
|
||||||
|
|
|
@ -41,6 +41,8 @@ pub struct Config {
|
||||||
// map of distributor name to IP:port to contact it
|
// map of distributor name to IP:port to contact it
|
||||||
pub distributors: BTreeMap<BridgeDistributor, String>,
|
pub distributors: BTreeMap<BridgeDistributor, String>,
|
||||||
extra_infos_base_url: String,
|
extra_infos_base_url: String,
|
||||||
|
// confidence required to consider a bridge blocked
|
||||||
|
confidence: f64,
|
||||||
//require_bridge_token: bool,
|
//require_bridge_token: bool,
|
||||||
port: u16,
|
port: u16,
|
||||||
updater_schedule: String,
|
updater_schedule: String,
|
||||||
|
@ -64,13 +66,14 @@ async fn update_daily_info(
|
||||||
db: &Db,
|
db: &Db,
|
||||||
distributors: &BTreeMap<BridgeDistributor, String>,
|
distributors: &BTreeMap<BridgeDistributor, String>,
|
||||||
extra_infos_base_url: &str,
|
extra_infos_base_url: &str,
|
||||||
|
confidence: f64,
|
||||||
) {
|
) {
|
||||||
update_extra_infos(&db, &extra_infos_base_url)
|
update_extra_infos(&db, &extra_infos_base_url)
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
update_negative_reports(&db, &distributors).await;
|
update_negative_reports(&db, &distributors).await;
|
||||||
update_positive_reports(&db, &distributors).await;
|
update_positive_reports(&db, &distributors).await;
|
||||||
let new_blockages = guess_blockages(&db, &analyzer::ExampleAnalyzer {});
|
let new_blockages = guess_blockages(&db, &analyzer::ExampleAnalyzer {}, confidence);
|
||||||
report_blockages(&distributors, new_blockages).await;
|
report_blockages(&distributors, new_blockages).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,11 +85,12 @@ async fn create_context_manager(
|
||||||
db_config: DbConfig,
|
db_config: DbConfig,
|
||||||
distributors: BTreeMap<BridgeDistributor, String>,
|
distributors: BTreeMap<BridgeDistributor, String>,
|
||||||
extra_infos_base_url: &str,
|
extra_infos_base_url: &str,
|
||||||
|
confidence: f64,
|
||||||
context_rx: mpsc::Receiver<Command>,
|
context_rx: mpsc::Receiver<Command>,
|
||||||
mut kill: broadcast::Receiver<()>,
|
mut kill: broadcast::Receiver<()>,
|
||||||
) {
|
) {
|
||||||
tokio::select! {
|
tokio::select! {
|
||||||
create_context = context_manager(db_config, distributors, extra_infos_base_url, context_rx) => create_context,
|
create_context = context_manager(db_config, distributors, extra_infos_base_url, confidence, context_rx) => create_context,
|
||||||
_ = kill.recv() => {println!("Shut down manager");},
|
_ = kill.recv() => {println!("Shut down manager");},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -95,6 +99,7 @@ async fn context_manager(
|
||||||
db_config: DbConfig,
|
db_config: DbConfig,
|
||||||
distributors: BTreeMap<BridgeDistributor, String>,
|
distributors: BTreeMap<BridgeDistributor, String>,
|
||||||
extra_infos_base_url: &str,
|
extra_infos_base_url: &str,
|
||||||
|
confidence: f64,
|
||||||
mut context_rx: mpsc::Receiver<Command>,
|
mut context_rx: mpsc::Receiver<Command>,
|
||||||
) {
|
) {
|
||||||
let db: Db = sled::open(&db_config.db_path).unwrap();
|
let db: Db = sled::open(&db_config.db_path).unwrap();
|
||||||
|
@ -115,7 +120,7 @@ async fn context_manager(
|
||||||
println!("Shutdown Sent.");
|
println!("Shutdown Sent.");
|
||||||
}
|
}
|
||||||
Update {} => {
|
Update {} => {
|
||||||
update_daily_info(&db, &distributors, &extra_infos_base_url).await;
|
update_daily_info(&db, &distributors, &extra_infos_base_url, confidence).await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -182,6 +187,7 @@ async fn main() {
|
||||||
config.db,
|
config.db,
|
||||||
config.distributors,
|
config.distributors,
|
||||||
&config.extra_infos_base_url,
|
&config.extra_infos_base_url,
|
||||||
|
config.confidence,
|
||||||
request_rx,
|
request_rx,
|
||||||
kill,
|
kill,
|
||||||
)
|
)
|
||||||
|
|
|
@ -564,7 +564,11 @@ pub async fn update_positive_reports(db: &Db, distributors: &BTreeMap<BridgeDist
|
||||||
|
|
||||||
/// Guess which countries block a bridge. This function returns a map of new
|
/// Guess which countries block a bridge. This function returns a map of new
|
||||||
/// blockages (fingerprint : set of countries which block the bridge)
|
/// blockages (fingerprint : set of countries which block the bridge)
|
||||||
pub fn guess_blockages(db: &Db, analyzer: &dyn Analyzer) -> HashMap<[u8; 20], HashSet<String>> {
|
pub fn guess_blockages(
|
||||||
|
db: &Db,
|
||||||
|
analyzer: &dyn Analyzer,
|
||||||
|
confidence: f64,
|
||||||
|
) -> HashMap<[u8; 20], HashSet<String>> {
|
||||||
// Map of bridge fingerprint to set of countries which newly block it
|
// Map of bridge fingerprint to set of countries which newly block it
|
||||||
let mut blockages = HashMap::<[u8; 20], HashSet<String>>::new();
|
let mut blockages = HashMap::<[u8; 20], HashSet<String>>::new();
|
||||||
|
|
||||||
|
@ -579,7 +583,7 @@ pub fn guess_blockages(db: &Db, analyzer: &dyn Analyzer) -> HashMap<[u8; 20], Ha
|
||||||
let mut bridge_info: BridgeInfo =
|
let mut bridge_info: BridgeInfo =
|
||||||
bincode::deserialize(&db.get(fingerprint).unwrap().unwrap()).unwrap();
|
bincode::deserialize(&db.get(fingerprint).unwrap().unwrap()).unwrap();
|
||||||
let mut new_blockages = HashSet::<String>::new();
|
let mut new_blockages = HashSet::<String>::new();
|
||||||
let blocked_in = analyzer.blocked_in(&bridge_info);
|
let blocked_in = analyzer.blocked_in(&bridge_info, confidence);
|
||||||
for country in blocked_in {
|
for country in blocked_in {
|
||||||
let bridge_country_info = bridge_info.info_by_country.get_mut(&country).unwrap();
|
let bridge_country_info = bridge_info.info_by_country.get_mut(&country).unwrap();
|
||||||
if !bridge_country_info.blocked {
|
if !bridge_country_info.blocked {
|
||||||
|
|
Loading…
Reference in New Issue