Background refresh
This commit is contained in:
parent
3b9bfe1084
commit
9fb4845167
|
@ -74,7 +74,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"matches 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"matches 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"quine-mc_cluskey 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"quine-mc_cluskey 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"regex-syntax 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"regex-syntax 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"toml 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
"toml 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -420,19 +420,19 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex"
|
name = "regex"
|
||||||
version = "0.1.77"
|
version = "0.1.79"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
"memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"regex-syntax 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"regex-syntax 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex-syntax"
|
name = "regex-syntax"
|
||||||
version = "0.3.7"
|
version = "0.3.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -503,7 +503,7 @@ version = "0.5.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"regex 0.1.77 (registry+https://github.com/rust-lang/crates.io-index)",
|
"regex 0.1.79 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"slog 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"slog 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"slog-stdlog 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"slog-stdlog 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"slog-term 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"slog-term 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -768,8 +768,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
"checksum pnacl-build-helper 1.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "61c9231d31aea845007443d62fcbb58bb6949ab9c18081ee1e09920e0cf1118b"
|
"checksum pnacl-build-helper 1.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "61c9231d31aea845007443d62fcbb58bb6949ab9c18081ee1e09920e0cf1118b"
|
||||||
"checksum quine-mc_cluskey 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "07589615d719a60c8dd8a4622e7946465dfef20d1a428f969e3443e7386d5f45"
|
"checksum quine-mc_cluskey 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "07589615d719a60c8dd8a4622e7946465dfef20d1a428f969e3443e7386d5f45"
|
||||||
"checksum rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "2791d88c6defac799c3f20d74f094ca33b9332612d9aef9078519c82e4fe04a5"
|
"checksum rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "2791d88c6defac799c3f20d74f094ca33b9332612d9aef9078519c82e4fe04a5"
|
||||||
"checksum regex 0.1.77 (registry+https://github.com/rust-lang/crates.io-index)" = "64b03446c466d35b42f2a8b203c8e03ed8b91c0f17b56e1f84f7210a257aa665"
|
"checksum regex 0.1.79 (registry+https://github.com/rust-lang/crates.io-index)" = "33afc849c34c7e9389435f5f2ac9bb0cc5eb69f137e9aa6e6b1ef0b2baab0226"
|
||||||
"checksum regex-syntax 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "48f0573bcee95a48da786f8823465b5f2a1fae288a55407aca991e5b3e0eae11"
|
"checksum regex-syntax 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "01acf14447f3e18588a1f42ac1402c6c66e2204210f70bd5b7b5903ba8ba01d3"
|
||||||
"checksum route-recognizer 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "4f0a750d020adb1978f5964ea7bca830585899b09da7cbb3f04961fc2400122d"
|
"checksum route-recognizer 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "4f0a750d020adb1978f5964ea7bca830585899b09da7cbb3f04961fc2400122d"
|
||||||
"checksum router 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b94397bfa5b772b4375be4da12560a7c1c1e74b2e35c46ed312958aad56df726"
|
"checksum router 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b94397bfa5b772b4375be4da12560a7c1c1e74b2e35c46ed312958aad56df726"
|
||||||
"checksum rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "6159e4e6e559c81bd706afe9c8fd68f547d3e851ce12e76b1de7914bab61691b"
|
"checksum rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "6159e4e6e559c81bd706afe9c8fd68f547d3e851ce12e76b1de7914bab61691b"
|
||||||
|
|
38
src/main.rs
38
src/main.rs
|
@ -21,6 +21,8 @@ mod webservice;
|
||||||
use asns::*;
|
use asns::*;
|
||||||
use clap::{Arg, App};
|
use clap::{Arg, App};
|
||||||
use std::sync::{Arc, RwLock};
|
use std::sync::{Arc, RwLock};
|
||||||
|
use std::thread;
|
||||||
|
use std::time::Duration;
|
||||||
use webservice::*;
|
use webservice::*;
|
||||||
|
|
||||||
fn logger_init() {
|
fn logger_init() {
|
||||||
|
@ -39,10 +41,28 @@ fn logger_init() {
|
||||||
slog_stdlog::set_logger(root_logger.clone()).unwrap();
|
slog_stdlog::set_logger(root_logger.clone()).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_asns(db_url: &str) -> Result<ASNs, &'static str> {
|
||||||
|
info!("Retrieving ASNs");
|
||||||
|
let asns = ASNs::new(db_url);
|
||||||
|
info!("ASNs loaded");
|
||||||
|
asns
|
||||||
|
}
|
||||||
|
|
||||||
|
fn update_asns(asns_arc: &Arc<RwLock<Arc<ASNs>>>, db_url: &str) {
|
||||||
|
let asns = match get_asns(db_url) {
|
||||||
|
Ok(asns) => asns,
|
||||||
|
Err(e) => {
|
||||||
|
warn!("{}", e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
*asns_arc.write().unwrap() = Arc::new(asns);
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
logger_init();
|
logger_init();
|
||||||
let matches = App::new("iptoasn webservice")
|
let matches = App::new("iptoasn webservice")
|
||||||
.version("0.1")
|
.version("0.2")
|
||||||
.author("Frank Denis")
|
.author("Frank Denis")
|
||||||
.about("Webservice for https://iptoasn.com")
|
.about("Webservice for https://iptoasn.com")
|
||||||
.arg(Arg::with_name("listen_addr")
|
.arg(Arg::with_name("listen_addr")
|
||||||
|
@ -60,13 +80,17 @@ fn main() {
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.default_value("https://iptoasn.com/data/ip2asn-combined.tsv.gz"))
|
.default_value("https://iptoasn.com/data/ip2asn-combined.tsv.gz"))
|
||||||
.get_matches();
|
.get_matches();
|
||||||
let db_url = matches.value_of("db_url").unwrap();
|
let db_url = matches.value_of("db_url").unwrap().to_owned();
|
||||||
let listen_addr = matches.value_of("listen_addr").unwrap();
|
let listen_addr = matches.value_of("listen_addr").unwrap();
|
||||||
let asns = match ASNs::new(db_url) {
|
let asns = get_asns(&db_url).expect("Unable to load the initial database");
|
||||||
Ok(asns) => asns,
|
let asns_arc = Arc::new(RwLock::new(Arc::new(asns)));
|
||||||
Err(err) => panic!(format!("{} [{}]", err, db_url)),
|
let asns_arc_copy = asns_arc.clone();
|
||||||
};
|
thread::spawn(move || {
|
||||||
let asns_arc = RwLock::new(Arc::new(asns));
|
loop {
|
||||||
|
thread::sleep(Duration::from_secs(3600));
|
||||||
|
update_asns(&asns_arc_copy, &db_url);
|
||||||
|
}
|
||||||
|
});
|
||||||
info!("Starting the webservice");
|
info!("Starting the webservice");
|
||||||
WebService::start(asns_arc, listen_addr);
|
WebService::start(asns_arc, listen_addr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ use std::sync::{Arc, RwLock};
|
||||||
const TTL: u32 = 86400;
|
const TTL: u32 = 86400;
|
||||||
|
|
||||||
struct ASNsMiddleware {
|
struct ASNsMiddleware {
|
||||||
asns_arc: RwLock<Arc<ASNs>>,
|
asns_arc: Arc<RwLock<Arc<ASNs>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl typemap::Key for ASNsMiddleware {
|
impl typemap::Key for ASNsMiddleware {
|
||||||
|
@ -22,7 +22,7 @@ impl typemap::Key for ASNsMiddleware {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ASNsMiddleware {
|
impl ASNsMiddleware {
|
||||||
fn new(asns_arc: RwLock<Arc<ASNs>>) -> ASNsMiddleware {
|
fn new(asns_arc: Arc<RwLock<Arc<ASNs>>>) -> ASNsMiddleware {
|
||||||
ASNsMiddleware { asns_arc: asns_arc }
|
ASNsMiddleware { asns_arc: asns_arc }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -101,7 +101,7 @@ 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_arc: RwLock<Arc<ASNs>>, listen_addr: &str) {
|
pub fn start(asns_arc: 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);
|
||||||
|
|
Loading…
Reference in New Issue