mirror of
https://github.com/sadoyan/aralez.git
synced 2026-05-30 03:44:06 +08:00
Cleanup. Making clippy happy.
This commit is contained in:
@@ -32,19 +32,20 @@ impl BackgroundService for LB {
|
||||
let file_load = FromFileProvider {
|
||||
path: self.config.upstreams_conf.clone(),
|
||||
};
|
||||
let _ = tokio::spawn(async move { file_load.start(tx).await });
|
||||
// let _ = tokio::spawn(async move { file_load.start(tx).await });
|
||||
drop(tokio::spawn(async move { file_load.start(tx).await }));
|
||||
}
|
||||
"kubernetes" => {
|
||||
info!("Running Kubernetes discovery, requested type is: {}", config.typecfg);
|
||||
let cf = Arc::from(config);
|
||||
let kuber_load = KubernetesProvider { config: cf.clone() };
|
||||
let _ = tokio::spawn(async move { kuber_load.start(tx).await });
|
||||
drop(tokio::spawn(async move { kuber_load.start(tx).await }));
|
||||
}
|
||||
"consul" => {
|
||||
info!("Running Consul discovery, requested type is: {}", config.typecfg);
|
||||
let cf = Arc::from(config);
|
||||
let consul_load = ConsulProvider { config: cf.clone() };
|
||||
let _ = tokio::spawn(async move { consul_load.start(tx).await });
|
||||
drop(tokio::spawn(async move { consul_load.start(tx).await }));
|
||||
}
|
||||
_ => {
|
||||
error!("Unknown discovery type: {}", config.typecfg);
|
||||
@@ -57,7 +58,7 @@ impl BackgroundService for LB {
|
||||
let api_load = APIUpstreamProvider {
|
||||
address: self.config.config_address.clone(),
|
||||
masterkey: self.config.master_key.clone(),
|
||||
config_api_enabled: self.config.config_api_enabled.clone(),
|
||||
config_api_enabled: self.config.config_api_enabled,
|
||||
// certs_dir: self.config.proxy_certificates.clone().unwrap_or_else(|| "/tmp".to_string()),
|
||||
config_dir: confdir.clone(),
|
||||
certs_dir: certdir.clone(),
|
||||
@@ -71,14 +72,16 @@ impl BackgroundService for LB {
|
||||
};
|
||||
// let crtdir = api_load.certs_dir.clone();
|
||||
// let tx_api = tx.clone();
|
||||
let _ = tokio::spawn(async move { api_load.start(tx_api).await });
|
||||
drop(tokio::spawn(async move { api_load.start(tx_api).await }));
|
||||
|
||||
let uu = self.ump_upst.clone();
|
||||
let ff = self.ump_full.clone();
|
||||
let im = self.ump_byid.clone();
|
||||
let (hc_method, hc_interval) = (self.config.hc_method.clone(), self.config.hc_interval);
|
||||
let _ = tokio::spawn(async move { healthcheck::hc2(uu, ff, im, (&*hc_method.to_string(), hc_interval.to_string().parse().unwrap())).await });
|
||||
let _ = tokio::spawn(async move { refresh_order(certdir, confdir).await });
|
||||
drop(tokio::spawn(async move {
|
||||
healthcheck::hc2(uu, ff, im, (&*hc_method.to_string(), hc_interval.to_string().parse().unwrap())).await
|
||||
}));
|
||||
drop(tokio::spawn(async move { refresh_order(certdir, confdir).await }));
|
||||
|
||||
loop {
|
||||
tokio::select! {
|
||||
@@ -86,57 +89,49 @@ impl BackgroundService for LB {
|
||||
break;
|
||||
}
|
||||
val = rx.next() => {
|
||||
match val {
|
||||
Some(ss) => {
|
||||
clone_dashmap_into(&ss.upstreams, &self.ump_full);
|
||||
clone_dashmap_into(&ss.upstreams, &self.ump_upst);
|
||||
let current = self.extraparams.load_full();
|
||||
let mut new = (*current).clone();
|
||||
new.to_https = ss.extraparams.to_https;
|
||||
new.sticky_sessions = ss.extraparams.sticky_sessions;
|
||||
new.authentication = ss.extraparams.authentication.clone();
|
||||
new.rate_limit = ss.extraparams.rate_limit;
|
||||
self.extraparams.store(Arc::new(new));
|
||||
self.client_headers.clear();
|
||||
self.server_headers.clear();
|
||||
if let Some(ss) = val {
|
||||
clone_dashmap_into(&ss.upstreams, &self.ump_full);
|
||||
clone_dashmap_into(&ss.upstreams, &self.ump_upst);
|
||||
let current = self.extraparams.load_full();
|
||||
let mut new = (*current).clone();
|
||||
new.to_https = ss.extraparams.to_https;
|
||||
new.sticky_sessions = ss.extraparams.sticky_sessions;
|
||||
new.authentication = ss.extraparams.authentication.clone();
|
||||
new.rate_limit = ss.extraparams.rate_limit;
|
||||
self.extraparams.store(Arc::new(new));
|
||||
self.client_headers.clear();
|
||||
self.server_headers.clear();
|
||||
for entry in ss.upstreams.iter() {
|
||||
let global_key = entry.key().clone();
|
||||
let client_global_values = DashMap::new();
|
||||
let server_global_values = DashMap::new();
|
||||
|
||||
for entry in ss.upstreams.iter() {
|
||||
let global_key = entry.key().clone();
|
||||
let client_global_values = DashMap::new();
|
||||
let server_global_values = DashMap::new();
|
||||
|
||||
let mut client_target_entry = ss.client_headers.entry(global_key.clone()).or_insert_with(DashMap::new);
|
||||
client_target_entry.extend(client_global_values);
|
||||
let mut server_target_entry = ss.server_headers.entry(global_key).or_insert_with(DashMap::new);
|
||||
server_target_entry.extend(server_global_values);
|
||||
self.server_headers.insert(server_target_entry.key().to_owned(), server_target_entry.value().to_owned());
|
||||
}
|
||||
|
||||
for path in ss.client_headers.iter() {
|
||||
let path_key = path.key().clone();
|
||||
let path_headers = path.value().clone();
|
||||
self.client_headers.insert(path_key.clone(), path_headers);
|
||||
if let Some(global_headers) = ss.client_headers.get("GLOBAL_CLIENT_HEADERS") {
|
||||
if let Some(existing_headers) = self.client_headers.get_mut(&path_key) {
|
||||
merge_headers(&existing_headers, &global_headers);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for path in ss.server_headers.iter() {
|
||||
let path_key = path.key().clone();
|
||||
let path_headers = path.value().clone();
|
||||
self.server_headers.insert(path_key.clone(), path_headers);
|
||||
if let Some(global_headers) = ss.server_headers.get("GLOBAL_SERVER_HEADERS") {
|
||||
if let Some(existing_headers) = self.server_headers.get_mut(&path_key) {
|
||||
merge_headers(&existing_headers, &global_headers);
|
||||
}
|
||||
}
|
||||
}
|
||||
// info!("Upstreams list is changed, updating to:");
|
||||
// print_upstreams(&self.ump_full);
|
||||
let mut client_target_entry = ss.client_headers.entry(global_key.clone()).or_insert_with(DashMap::new);
|
||||
client_target_entry.extend(client_global_values);
|
||||
let mut server_target_entry = ss.server_headers.entry(global_key).or_insert_with(DashMap::new);
|
||||
server_target_entry.extend(server_global_values);
|
||||
self.server_headers.insert(server_target_entry.key().to_owned(), server_target_entry.value().to_owned());
|
||||
}
|
||||
for path in ss.client_headers.iter() {
|
||||
let path_key = path.key().clone();
|
||||
let path_headers = path.value().clone();
|
||||
self.client_headers.insert(path_key.clone(), path_headers);
|
||||
if let Some(global_headers) = ss.client_headers.get("GLOBAL_CLIENT_HEADERS") {
|
||||
if let Some(existing_headers) = self.client_headers.get_mut(&path_key) {
|
||||
merge_headers(&existing_headers, &global_headers);
|
||||
}
|
||||
}
|
||||
}
|
||||
for path in ss.server_headers.iter() {
|
||||
let path_key = path.key().clone();
|
||||
let path_headers = path.value().clone();
|
||||
self.server_headers.insert(path_key.clone(), path_headers);
|
||||
if let Some(global_headers) = ss.server_headers.get("GLOBAL_SERVER_HEADERS") {
|
||||
if let Some(existing_headers) = self.server_headers.get_mut(&path_key) {
|
||||
merge_headers(&existing_headers, &global_headers);
|
||||
}
|
||||
}
|
||||
}
|
||||
None => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ use tokio::time::Instant;
|
||||
|
||||
// static RATE_LIMITER: Lazy<Rate> = Lazy::new(|| Rate::new(Duration::from_secs(1)));
|
||||
// static REVERSE_STORE: Lazy<DashMap<String, String>> = Lazy::new(|| DashMap::new());
|
||||
static REVERSE_STORE: LazyLock<DashMap<String, String>> = LazyLock::new(|| DashMap::new());
|
||||
static REVERSE_STORE: LazyLock<DashMap<String, String>> = LazyLock::new(DashMap::new);
|
||||
thread_local! {static IP_BUFFER: RefCell<String> = RefCell::new(String::with_capacity(50));}
|
||||
pub static RATE_LIMITER: LazyLock<Rate> = LazyLock::new(|| Rate::new(Duration::from_secs(1)));
|
||||
|
||||
@@ -132,8 +132,8 @@ impl ProxyHttp for LB {
|
||||
s.push_str("https://");
|
||||
s.push_str(host);
|
||||
if port != "443" {
|
||||
s.push_str(":");
|
||||
s.push_str(&port);
|
||||
s.push(':');
|
||||
s.push_str(port);
|
||||
}
|
||||
s.push_str(uri);
|
||||
let mut resp = ResponseHeader::build(StatusCode::MOVED_PERMANENTLY, None)?;
|
||||
|
||||
@@ -18,7 +18,7 @@ use std::sync::Arc;
|
||||
use std::{fs, thread};
|
||||
pub fn run() {
|
||||
// default_provider().install_default().expect("Failed to install rustls crypto provider");
|
||||
let parameters = Some(Opt::parse_args()).unwrap();
|
||||
let parameters = Opt::parse_args();
|
||||
let file = parameters.conf.clone().unwrap();
|
||||
let maincfg = crate::utils::parceyaml::parce_main_config(file.as_str());
|
||||
|
||||
@@ -60,50 +60,44 @@ pub fn run() {
|
||||
|
||||
check_priv(bind_address_http.as_str());
|
||||
|
||||
match bind_address_tls {
|
||||
Some(bind_address_tls) => {
|
||||
check_priv(bind_address_tls.as_str());
|
||||
let (tx, rx): (Sender<Vec<CertificateConfig>>, Receiver<Vec<CertificateConfig>>) = channel();
|
||||
let certs_path = cfg.proxy_configs.clone().unwrap() + "/certificates";
|
||||
if let Some(bind_address_tls) = bind_address_tls {
|
||||
check_priv(bind_address_tls.as_str());
|
||||
let (tx, rx): (Sender<Vec<CertificateConfig>>, Receiver<Vec<CertificateConfig>>) = channel();
|
||||
let certs_path = cfg.proxy_configs.clone().unwrap() + "/certificates";
|
||||
|
||||
if !fs::metadata(certs_path.clone()).is_ok() {
|
||||
fs::create_dir_all(certs_path.clone()).unwrap();
|
||||
}
|
||||
thread::spawn(move || {
|
||||
watch_folder(certs_path, tx).unwrap();
|
||||
});
|
||||
let certificate_configs = rx.recv().unwrap();
|
||||
let first_set = load::Certificates::new(&certificate_configs, grade.as_str()).unwrap_or_else(|| panic!("Unable to load initial certificate info"));
|
||||
let certificates = Arc::new(ArcSwap::from_pointee(first_set));
|
||||
let certs_for_callback = certificates.clone();
|
||||
|
||||
let certs_for_watcher = certificates.clone();
|
||||
let new_certs = load::Certificates::new(&certificate_configs, grade.as_str());
|
||||
certs_for_watcher.store(Arc::new(new_certs.unwrap()));
|
||||
|
||||
let mut tls_settings =
|
||||
TlsSettings::intermediate(&certs_for_callback.load().default_cert_path, &certs_for_callback.load().default_key_path).expect("unable to load or parse cert/key");
|
||||
|
||||
grades::set_tsl_grade(&mut tls_settings, grade.as_str());
|
||||
tls_settings.set_servername_callback(move |ssl_ref: &mut SslRef, ssl_alert: &mut SslAlert| certs_for_callback.load().server_name_callback(ssl_ref, ssl_alert));
|
||||
tls_settings.set_alpn_select_callback(grades::prefer_h2);
|
||||
|
||||
proxy.add_tls_with_settings(&bind_address_tls, None, tls_settings);
|
||||
|
||||
let certs_for_watcher = certificates.clone();
|
||||
thread::spawn(move || {
|
||||
while let Ok(new_configs) = rx.recv() {
|
||||
let new_certs = load::Certificates::new(&new_configs, grade.as_str());
|
||||
match new_certs {
|
||||
Some(new_certs) => {
|
||||
certs_for_watcher.store(Arc::new(new_certs));
|
||||
}
|
||||
None => {}
|
||||
};
|
||||
}
|
||||
});
|
||||
if fs::metadata(certs_path.clone()).is_err() {
|
||||
fs::create_dir_all(certs_path.clone()).unwrap();
|
||||
}
|
||||
None => {}
|
||||
thread::spawn(move || {
|
||||
watch_folder(certs_path, tx).unwrap();
|
||||
});
|
||||
let certificate_configs = rx.recv().unwrap();
|
||||
let first_set = load::Certificates::new(&certificate_configs, grade.as_str()).unwrap_or_else(|| panic!("Unable to load initial certificate info"));
|
||||
let certificates = Arc::new(ArcSwap::from_pointee(first_set));
|
||||
let certs_for_callback = certificates.clone();
|
||||
|
||||
let certs_for_watcher = certificates.clone();
|
||||
let new_certs = load::Certificates::new(&certificate_configs, grade.as_str());
|
||||
certs_for_watcher.store(Arc::new(new_certs.unwrap()));
|
||||
|
||||
let mut tls_settings =
|
||||
TlsSettings::intermediate(&certs_for_callback.load().default_cert_path, &certs_for_callback.load().default_key_path).expect("unable to load or parse cert/key");
|
||||
|
||||
grades::set_tsl_grade(&mut tls_settings, grade.as_str());
|
||||
tls_settings.set_servername_callback(move |ssl_ref: &mut SslRef, ssl_alert: &mut SslAlert| certs_for_callback.load().server_name_callback(ssl_ref, ssl_alert));
|
||||
tls_settings.set_alpn_select_callback(grades::prefer_h2);
|
||||
|
||||
proxy.add_tls_with_settings(&bind_address_tls, None, tls_settings);
|
||||
|
||||
let certs_for_watcher = certificates.clone();
|
||||
thread::spawn(move || {
|
||||
while let Ok(new_configs) = rx.recv() {
|
||||
let new_certs = load::Certificates::new(&new_configs, grade.as_str());
|
||||
if let Some(new_certs) = new_certs {
|
||||
certs_for_watcher.store(Arc::new(new_certs));
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
info!("Running HTTP listener on :{}", bind_address_http.as_str());
|
||||
proxy.add_tcp(bind_address_http.as_str());
|
||||
|
||||
@@ -85,7 +85,7 @@ pub async fn run_server(config: &APIUpstreamProvider, mut to_return: Sender<Conf
|
||||
let static_files = ServeDir::new(folder);
|
||||
let static_serve: Router = Router::new().fallback_service(static_files);
|
||||
let static_listen = TcpListener::bind(address).await.unwrap();
|
||||
let _ = tokio::spawn(async move { axum::serve(static_listen, static_serve).await.unwrap() });
|
||||
drop(tokio::spawn(async move { axum::serve(static_listen, static_serve).await.unwrap() }));
|
||||
}
|
||||
|
||||
let listener = TcpListener::bind(config.address.clone()).await.unwrap();
|
||||
@@ -103,7 +103,7 @@ async fn conf(State(st): State<AppState>, Query(params): Query<HashMap<String, S
|
||||
let parsed = serde_yml::from_str::<Config>(strcontent);
|
||||
match parsed {
|
||||
Ok(_) => {
|
||||
let _ = tokio::spawn(async move { apply_config(content.as_str(), st).await });
|
||||
drop(tokio::spawn(async move { apply_config(content.as_str(), st).await }));
|
||||
return Response::builder().status(StatusCode::OK).body(Body::from("Accepted! Applying in background\n")).unwrap();
|
||||
}
|
||||
Err(err) => {
|
||||
@@ -172,8 +172,9 @@ async fn metrics() -> impl IntoResponse {
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
#[allow(clippy::needless_return)]
|
||||
async fn status(State(st): State<AppState>, Query(params): Query<HashMap<String, String>>) -> impl IntoResponse {
|
||||
if let Some(_) = params.get("live") {
|
||||
if params.contains_key("live") {
|
||||
let r = upstreams_liveness_json(&st.full_upstreams, &st.current_upstreams);
|
||||
return Response::builder()
|
||||
.status(StatusCode::OK)
|
||||
@@ -181,7 +182,7 @@ async fn status(State(st): State<AppState>, Query(params): Query<HashMap<String,
|
||||
.body(Body::from(format!("{}", r)))
|
||||
.unwrap();
|
||||
}
|
||||
if let Some(_) = params.get("all") {
|
||||
if params.contains_key("all") {
|
||||
let resp = upstreams_to_json(&st.current_upstreams);
|
||||
match resp {
|
||||
Ok(j) => {
|
||||
@@ -201,16 +202,17 @@ async fn status(State(st): State<AppState>, Query(params): Query<HashMap<String,
|
||||
}
|
||||
Response::builder()
|
||||
.status(StatusCode::INTERNAL_SERVER_ERROR)
|
||||
.body(Body::from(format!("{}", "Parameter mismatch")))
|
||||
.body(Body::from("Parameter mismatch"))
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
#[allow(clippy::needless_return)]
|
||||
async fn acme_create(State(state): State<AppState>, Query(params): Query<HashMap<String, String>>, headers: HeaderMap) -> impl IntoResponse {
|
||||
if !key_authorization(&headers, ¶ms, &state.master_key) {
|
||||
return Response::builder().status(StatusCode::FORBIDDEN).body(Body::from("Access Denied !\n")).unwrap();
|
||||
}
|
||||
|
||||
let _ = match account::load_or_create(state.cert_creds.as_str()).await {
|
||||
match account::load_or_create(state.cert_creds.as_str()).await {
|
||||
Ok(txt) => {
|
||||
return Response::builder()
|
||||
.status(StatusCode::OK)
|
||||
@@ -226,6 +228,7 @@ async fn acme_create(State(state): State<AppState>, Query(params): Query<HashMap
|
||||
}
|
||||
};
|
||||
}
|
||||
#[allow(clippy::needless_return)]
|
||||
async fn acme_order(
|
||||
State(state): State<AppState>,
|
||||
axum::extract::Path(domain): axum::extract::Path<String>,
|
||||
@@ -237,7 +240,7 @@ async fn acme_order(
|
||||
}
|
||||
|
||||
let domain_clean = domain.trim_matches('/');
|
||||
let _ = match order::order(domain_clean, state.cert_creds.as_str(), state.certs_dir).await {
|
||||
match order::order(domain_clean, state.cert_creds.as_str(), state.certs_dir).await {
|
||||
Ok(txt) => {
|
||||
return Response::builder()
|
||||
.status(StatusCode::OK)
|
||||
|
||||
Reference in New Issue
Block a user