ppaass_v3_agent_core/
lib.rs1mod 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}