ppaass_v3_agent_core/
lib.rs

1mod config;
2mod error;
3mod tunnel;
4pub use config::AgentConfig;
5use ppaass_common::config::RetrieveServerConfig;
6use ppaass_common::error::CommonError;
7use ppaass_common::server::{CommonServer, Server, ServerListener, ServerState};
8use ppaass_common::user::UserInfoRepository;
9use ppaass_common::ProxyTcpConnectionPool;
10use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};
11use std::sync::Arc;
12use tokio::net::TcpListener;
13use tracing::{debug, info};
14use tunnel::handle_client_connection;
15async fn create_server_listener<T: RetrieveServerConfig>(
16    config: Arc<T>,
17) -> Result<ServerListener, CommonError> {
18    if config.ip_v6() {
19        debug!(
20            "Starting server listener with IPv6 on port: {}",
21            config.server_port()
22        );
23        Ok(ServerListener::TcpListener(
24            TcpListener::bind(SocketAddr::new(
25                IpAddr::V6(Ipv6Addr::UNSPECIFIED),
26                config.server_port(),
27            ))
28            .await?,
29        ))
30    } else {
31        debug!(
32            "Starting server listener with IPv4 on port: {}",
33            config.server_port()
34        );
35        Ok(ServerListener::TcpListener(
36            TcpListener::bind(SocketAddr::new(
37                IpAddr::V4(Ipv4Addr::UNSPECIFIED),
38                config.server_port(),
39            ))
40            .await?,
41        ))
42    }
43}
44
45pub async fn start_server<T>(config: Arc<AgentConfig>, user_repo: Arc<T>) -> Result<(), CommonError>
46where
47    T: UserInfoRepository + Send + Sync + 'static,
48{
49    let mut server_state = ServerState::new();
50    let (username, user_info) = {
51        let username = &config.username;
52        let user_info = user_repo
53            .get_user(username)
54            .await?
55            .ok_or(CommonError::Other(format!(
56                "Can not get user info from repository: {username}"
57            )))?;
58        (&config.username.to_owned(), user_info)
59    };
60    info!("Start agent server with username: {}", &username);
61    server_state.add_value((username.clone(), user_info.clone()));
62    if config.connection_pool.is_some() {
63        let proxy_tcp_connection_pool =
64            ProxyTcpConnectionPool::new(config.clone(), &username, user_info.clone()).await?;
65        server_state.add_value(Arc::new(proxy_tcp_connection_pool));
66    }
67    let server = CommonServer::new(config.clone(), server_state);
68    server
69        .run(create_server_listener, handle_client_connection)
70        .await?;
71    Ok(())
72}