use std::ffi::OsStr;
#[cfg(any(feature = "native-tls", feature = "rustls-tls"))]
use opensearch::cert::CertificateValidation;
use opensearch::{
auth::Credentials,
cat::CatIndicesParts,
http::transport::{SingleNodeConnectionPool, TransportBuilder},
Error, OpenSearch, DEFAULT_ADDRESS,
};
use sysinfo::{ProcessRefreshKind, RefreshKind, System};
use url::Url;
#[tokio::main]
pub async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = create_client()?;
let response = client
.cat()
.indices(CatIndicesParts::None)
.v(true)
.send()
.await?;
let text = response.text().await?;
println!("{}", text);
Ok(())
}
fn create_client() -> Result<OpenSearch, Error> {
fn cluster_addr() -> String {
match std::env::var("OPENSEARCH_URL") {
Ok(server) => server,
Err(_) => DEFAULT_ADDRESS.into(),
}
}
fn running_proxy() -> bool {
let system = System::new_with_specifics(
RefreshKind::nothing().with_processes(ProcessRefreshKind::default()),
);
let has_fiddler = system
.processes_by_name(OsStr::new("Fiddler"))
.next()
.is_some();
has_fiddler
}
let mut url = Url::parse(cluster_addr().as_ref()).unwrap();
let credentials = if url.scheme() == "https" {
let username = if !url.username().is_empty() {
let u = url.username().to_string();
url.set_username("").unwrap();
u
} else {
std::env::var("OPENSEARCH_USERNAME").unwrap_or_else(|_| "admin".into())
};
let password = match url.password() {
Some(p) => {
let pass = p.to_string();
url.set_password(None).unwrap();
pass
}
None => std::env::var("OPENSEARCH_PASSWORD").unwrap_or_else(|_| "admin".into()),
};
Some(Credentials::Basic(username, password))
} else {
None
};
let conn_pool = SingleNodeConnectionPool::new(url);
let mut builder = TransportBuilder::new(conn_pool);
builder = match credentials {
Some(c) => {
builder = builder.auth(c);
#[cfg(any(feature = "native-tls", feature = "rustls-tls"))]
{
builder = builder.cert_validation(CertificateValidation::None);
}
builder
}
None => builder,
};
if running_proxy() {
let proxy_url = Url::parse("http://localhost:8888").unwrap();
builder = builder.proxy(proxy_url, None, None);
}
let transport = builder.build()?;
Ok(OpenSearch::new(transport))
}