38 lines
1.4 KiB
Rust
38 lines
1.4 KiB
Rust
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<String>,
|
|
}
|
|
|
|
pub fn get_local_public_ip() -> XResult<String> {
|
|
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<Resolver> {
|
|
Ok(Resolver::new(ResolverConfig::default(), ResolverOpts::default())?)
|
|
}
|
|
|
|
pub fn resolve_first_ipv4(resolver: &Resolver, domain: &str) -> XResult<Option<String>> {
|
|
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());
|
|
}
|