Files
acme-client-rs/src/network.rs
2021-05-05 16:04:05 +08:00

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());
}