97 lines
3.0 KiB
Rust
97 lines
3.0 KiB
Rust
use std::collections::HashMap;
|
|
|
|
use log::LevelFilter;
|
|
use pingora::{
|
|
server::{configuration::Opt, Server},
|
|
services::{listening::Service as ListeningService, Service},
|
|
};
|
|
use pretty_env_logger::env_logger::Builder;
|
|
use structopt::StructOpt;
|
|
|
|
use crate::config::{ProxyConfig, ProxyGroup};
|
|
use crate::service::HostConfig;
|
|
|
|
mod app;
|
|
mod service;
|
|
mod cert;
|
|
mod config;
|
|
|
|
pub fn main() {
|
|
init_logger();
|
|
|
|
let opt = Some(Opt::from_args());
|
|
let mut my_server = Server::new(opt).unwrap();
|
|
my_server.bootstrap();
|
|
|
|
let proxy_config = ProxyConfig::load("proxy_config.json").unwrap_or_else(|e| {
|
|
panic!("Load proxy_config.json failed: {}", e);
|
|
});
|
|
|
|
let mut services = build_services(&my_server, &proxy_config);
|
|
if let Some(true) = proxy_config.prometheus {
|
|
let mut prometheus_service_http = ListeningService::prometheus_http_service();
|
|
prometheus_service_http.add_tcp("127.0.0.1:6150");
|
|
services.push(Box::new(prometheus_service_http));
|
|
}
|
|
|
|
if services.is_empty() {
|
|
panic!("No services is configured!");
|
|
}
|
|
|
|
log::info!("start listen...");
|
|
my_server.add_services(services);
|
|
my_server.run_forever();
|
|
}
|
|
|
|
fn init_logger() {
|
|
let mut builder = Builder::new();
|
|
builder.filter_level(LevelFilter::Info);
|
|
let _ = builder.try_init();
|
|
}
|
|
|
|
fn build_services(server: &Server, proxy_config: &ProxyConfig) -> Vec<Box<dyn Service>> {
|
|
let mut services: Vec<Box<dyn Service>> = vec![];
|
|
for group in &proxy_config.groups {
|
|
let listen_address = format!("0.0.0.0:{}", group.port);
|
|
let host_config_map = build_host_config_map(group);
|
|
let lookup_dns = group.lookup_dns.unwrap_or(false);
|
|
|
|
log::info!("Listen at: {}, tls: {}, lookup_dns: {}", listen_address, group.tls.is_some(), lookup_dns);
|
|
|
|
match &group.tls {
|
|
None => {
|
|
services.push(Box::new(service::proxy_service_tcp(
|
|
&server.configuration,
|
|
&listen_address,
|
|
lookup_dns,
|
|
host_config_map,
|
|
)));
|
|
}
|
|
Some(proxy_tls) => {
|
|
services.push(Box::new(service::proxy_service_tls(
|
|
&server.configuration,
|
|
&listen_address,
|
|
lookup_dns,
|
|
proxy_tls,
|
|
host_config_map,
|
|
)));
|
|
}
|
|
}
|
|
}
|
|
services
|
|
}
|
|
|
|
fn build_host_config_map(group: &ProxyGroup) -> HashMap<String, HostConfig> {
|
|
let mut host_config_map = HashMap::new();
|
|
if let Some(proxy_map) = &group.proxy_map {
|
|
for (hostname, proxy_item) in proxy_map {
|
|
let host_config = HostConfig {
|
|
proxy_addr: proxy_item.address.clone(),
|
|
proxy_tls: proxy_item.tls.unwrap_or(false),
|
|
proxy_servername: proxy_item.sni.clone().unwrap_or_else(|| hostname.clone()),
|
|
};
|
|
host_config_map.insert(hostname.to_string(), host_config);
|
|
}
|
|
}
|
|
host_config_map
|
|
} |