use serde::{Deserialize, Serialize}; use trust_dns_resolver::Resolver; use trust_dns_resolver::config::{ResolverConfig, ResolverOpts}; use rust_util::XResult; #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct PublicIpResponse { pub status: i32, pub message: String, pub ip: String, pub user_agent: Option, } pub fn get_local_public_ip() -> XResult { let response = opt_result!(reqwest::blocking::get("https://hatter.ink/ip/ip.jsonp"), "Get local public ip failed: {}"); let response_text = opt_result!(response.text(), "Get local public ip failed: {}"); debugging!("Get local public ip response: {}", response_text); let response_json: PublicIpResponse = opt_result!(deser_hjson::from_str(&response_text), "Parse get public ip response failed: {}"); information!("Get local public ip: {}", response_json.ip); Ok(response_json.ip) } pub fn get_resolver() -> XResult { Ok(Resolver::new(ResolverConfig::default(), ResolverOpts::default())?) } pub fn resolve_first_ipv4(resolver: &Resolver, domain: &str) -> XResult> { let ip = opt_result!(resolver.ipv4_lookup(domain), "Resolve domain: {}, failed: {}", domain); Ok(ip.iter().next().map(|i| i.to_string())) } #[test] fn test() { println!("{:?}", resolve_first_ipv4(&get_resolver().unwrap(),"hatter.ink")); println!("{:?}", get_local_public_ip()); }