Prepare for the list of ASNs to be mutable

This commit is contained in:
Frank Denis 2016-10-27 10:45:56 +02:00
parent d63d7a4528
commit 3b9bfe1084
2 changed files with 10 additions and 8 deletions

View File

@ -20,6 +20,7 @@ mod webservice;
use asns::*; use asns::*;
use clap::{Arg, App}; use clap::{Arg, App};
use std::sync::{Arc, RwLock};
use webservice::*; use webservice::*;
fn logger_init() { fn logger_init() {
@ -65,6 +66,7 @@ fn main() {
Ok(asns) => asns, Ok(asns) => asns,
Err(err) => panic!(format!("{} [{}]", err, db_url)), Err(err) => panic!(format!("{} [{}]", err, db_url)),
}; };
let asns_arc = RwLock::new(Arc::new(asns));
info!("Starting the webservice"); info!("Starting the webservice");
WebService::start(asns, listen_addr); WebService::start(asns_arc, listen_addr);
} }

View File

@ -9,12 +9,12 @@ use router::Router;
use serde_json; use serde_json;
use std::net::IpAddr; use std::net::IpAddr;
use std::str::FromStr; use std::str::FromStr;
use std::sync::Arc; use std::sync::{Arc, RwLock};
const TTL: u32 = 86400; const TTL: u32 = 86400;
struct ASNsMiddleware { struct ASNsMiddleware {
asns: Arc<ASNs>, asns_arc: RwLock<Arc<ASNs>>,
} }
impl typemap::Key for ASNsMiddleware { impl typemap::Key for ASNsMiddleware {
@ -22,14 +22,14 @@ impl typemap::Key for ASNsMiddleware {
} }
impl ASNsMiddleware { impl ASNsMiddleware {
fn new(asns: ASNs) -> ASNsMiddleware { fn new(asns_arc: RwLock<Arc<ASNs>>) -> ASNsMiddleware {
ASNsMiddleware { asns: Arc::new(asns) } ASNsMiddleware { asns_arc: asns_arc }
} }
} }
impl BeforeMiddleware for ASNsMiddleware { impl BeforeMiddleware for ASNsMiddleware {
fn before(&self, req: &mut Request) -> IronResult<()> { fn before(&self, req: &mut Request) -> IronResult<()> {
req.extensions.insert::<ASNsMiddleware>(self.asns.clone()); req.extensions.insert::<ASNsMiddleware>(self.asns_arc.read().unwrap().clone());
Ok(()) Ok(())
} }
} }
@ -101,11 +101,11 @@ impl WebService {
Ok(Response::with((status::Ok, mime_json, cache_header, json))) Ok(Response::with((status::Ok, mime_json, cache_header, json)))
} }
pub fn start(asns: ASNs, listen_addr: &str) { pub fn start(asns_arc: RwLock<Arc<ASNs>>, listen_addr: &str) {
let router = router!(index: get "/" => Self::index, let router = router!(index: get "/" => Self::index,
ip_lookup: get "/v1/as/ip/:ip" => Self::ip_lookup); ip_lookup: get "/v1/as/ip/:ip" => Self::ip_lookup);
let mut chain = Chain::new(router); let mut chain = Chain::new(router);
let asns_middleware = ASNsMiddleware::new(asns); let asns_middleware = ASNsMiddleware::new(asns_arc);
chain.link_before(asns_middleware); chain.link_before(asns_middleware);
warn!("webservice ready"); warn!("webservice ready");
Iron::new(chain).http(listen_addr).unwrap(); Iron::new(chain).http(listen_addr).unwrap();