use tokio::{io::Result, net::TcpListener};
mod connection;
mod pipe;
mod server;
mod shutdown;
#[tokio::main]
async fn main() -> Result<()> {
env_logger::init();
let own_addr = std::env::var("ADDRESS").unwrap_or_else(|_| "0.0.0.0:30000".into());
log::trace!("listener addr: {}", own_addr);
let srv_addr = std::env::var("SERVER").expect("SERVER env variable is undefinied");
log::trace!("proxied Server addr: {}", srv_addr);
let toml_config = {
if let Ok(config_file) = std::env::var("CONFIG_FILE") {
log::debug!("loading config file: '{}'", config_file);
let config = config::Config::builder()
.add_source(config::File::new(&config_file, config::FileFormat::Toml))
.build();
match config {
Ok(config) => config,
Err(err) => {
log::error!("aborting - {}", err);
return Ok(());
}
}
} else {
config::Config::builder().build().unwrap()
}
};
let config = config::Config::builder()
.set_default("masking.exclude.columns", "[]")
.unwrap()
.add_source(toml_config)
.build()
.expect("conflict in config defaults - should not happen");
log::trace!("using config: {:?}", config);
let listener = TcpListener::bind(own_addr).await?;
server::run(listener, &srv_addr, tokio::signal::ctrl_c(), &config).await;
log::info!("proxy shut down; exiting");
Ok(())
}