1use std::time::Duration;
2
3use crate::args::Args;
4use openssl::ssl::{SslContextBuilder, SslMethod, SslVerifyMode};
5use scylla::client::session::Session;
6use scylla::client::session_builder::SessionBuilder;
7
8pub async fn initialize_session(args: &Args) -> Session {
9 let mut builder = SessionBuilder::new()
10 .known_node(&args.host)
11 .use_keyspace(&args.keyspace, false)
12 .connection_timeout(Duration::from_secs(args.timeout));
13
14 if let (Some(user), Some(password)) = (&args.user, &args.password) {
15 builder = builder.user(user, password);
16 }
17
18 if let Some(ca) = &args.ca {
19 let mut context_builder = SslContextBuilder::new(SslMethod::tls())
20 .map_err(|e| {
21 eprintln!("Failed to create SSL context: {}", e);
22 std::process::exit(1);
23 })
24 .unwrap();
25
26 context_builder
27 .set_ca_file(ca)
28 .map_err(|e| {
29 eprintln!("Failed to set CA file: {}", e);
30 std::process::exit(1);
31 })
32 .unwrap();
33
34 context_builder.set_verify(SslVerifyMode::PEER);
35
36 if let Some(key) = &args.cert {
37 context_builder
38 .set_certificate_file(key, openssl::ssl::SslFiletype::PEM)
39 .map_err(|e| {
40 eprintln!("Failed to set certificate file: {}", e);
41 std::process::exit(1);
42 })
43 .unwrap();
44
45 let key = args
46 .key
47 .as_ref()
48 .expect("Private key file is required when certificate is provided");
49 context_builder
50 .set_private_key_file(key, openssl::ssl::SslFiletype::PEM)
51 .map_err(|e| {
52 eprintln!("Failed to set private key file: {}", e);
53 std::process::exit(1);
54 })
55 .unwrap();
56 }
57
58 builder = builder.tls_context(Some(context_builder.build()));
59 }
60
61 builder
62 .build()
63 .await
64 .map_err(|e| {
65 eprintln!("Failed to create session: {}", e);
66 std::process::exit(1);
67 })
68 .unwrap()
69}