diff options
Diffstat (limited to 'src/geoparsers')
| -rw-r--r-- | src/geoparsers/geoip2.rs | 61 | ||||
| -rw-r--r-- | src/geoparsers/mod.rs | 3 | ||||
| -rw-r--r-- | src/geoparsers/toml.rs | 15 |
3 files changed, 57 insertions, 22 deletions
diff --git a/src/geoparsers/geoip2.rs b/src/geoparsers/geoip2.rs index 9323280..9f2cc8b 100644 --- a/src/geoparsers/geoip2.rs +++ b/src/geoparsers/geoip2.rs @@ -1,42 +1,61 @@ -use ipnet::IpNet; use crate::config::Config; +use maxminddb::{Reader, geoip2}; +use serde::Deserialize; +use std::net::IpAddr; -/// Enum for declaring GeoSite/IP routing +// For now only MMDB because i cant found .proto schemes of +// V2Ray GeoSite.dat :(( +// TODO: V2Ray protobuf parsing && Test 4 ts + +/// Interface enum for `dst_addr` info +#[derive(Debug, Deserialize)] pub enum RouteType { /// GeoSite MMDB type, like `category-ads-all` GeoSite(String), - /// Subnet - GeoIp(IpNet), + /// Result with GeoCode like "RU" + GeoIp(String), + // String because enum will used as interface in result of `route_packet`. } /// Routing actions +#[derive(Debug, Deserialize)] pub enum RouteAction { + #[serde(alias = "block")] Block, + #[serde(alias = "proxy")] Proxy, + #[serde(alias = "direct")] Direct, } -type Rules = Vec<Rule>; - -/// Type for declaring the routing rules like: -/// ```toml -/// [rule] -/// action = enum RouteAction -/// target = enum RouteType -/// -/// [rule] -/// target = "geosite:category-ads-all" -/// action = "block" -/// ``` +pub type Rules = Vec<Rule>; + +/// Type for deserializing the routing rules like: +#[derive(serde::Deserialize)] pub struct Rule { pub target: RouteType, pub action: RouteAction, } -pub fn parse_ruleset(config: Config) -> Result<Rules, Box<dyn std::error::Error>> { - let reader = maxminddb::Reader::open_readfile(config.geo_files[0].clone())?; - - // Ok(()) - todo!(); +pub struct GeoIpService { + reader: Reader<Vec<u8>>, } +impl GeoIpService { + pub fn new(config: Config) -> Result<Self, Box<dyn std::error::Error>> { + let path = config.geo_files.get(0).unwrap(); + let reader = Reader::open_readfile(path)?; + Ok(Self { reader }) + } + + pub fn lookup_country<'a>( + &'a self, + ip: IpAddr, + ) -> Result<maxminddb::geoip2::Country<'a>, Box<dyn std::error::Error>> { + let result = self.reader.lookup(ip)?; + + result + .decode::<geoip2::Country>()? + .ok_or_else(|| "Couldnt lookup IP geo.".into()) + } +} diff --git a/src/geoparsers/mod.rs b/src/geoparsers/mod.rs index 9f95b8f..43af0f3 100644 --- a/src/geoparsers/mod.rs +++ b/src/geoparsers/mod.rs @@ -1 +1,2 @@ -mod geoip2; +pub mod geoip2; +pub mod toml; diff --git a/src/geoparsers/toml.rs b/src/geoparsers/toml.rs new file mode 100644 index 0000000..3638aa7 --- /dev/null +++ b/src/geoparsers/toml.rs @@ -0,0 +1,15 @@ +use crate::config::Config; +use crate::geoparsers::geoip2::Rules; + +pub fn parse_rules(config: Config) -> Result<Option<Rules>, Box<dyn std::error::Error>> { + let data = match std::fs::read_to_string(config.routing) { + Ok(result) => result, + Err(_) => { + println!("Couldnt find your `rules.toml`; Using default mode. All to anonymizers"); + return Ok(None); + } + }; + + let rules: Rules = toml::from_str(&data)?; + Ok(Some(rules)) +} |
