mirror of
https://github.com/shadowsocks/shadowsocks-rust.git
synced 2026-02-09 01:59:16 +08:00
ref #452 - support `locals` in configuration file, running multiple local server instance simultaneously - support `unix://` in `dns` configuration BREAKING CHANGE: - `sslocal`'s `--dns-addr` is now only available in Android - shadowsocks-service's `Config` struct have lots of changes
81 lines
2.3 KiB
Rust
81 lines
2.3 KiB
Rust
//! Shadowsocks manager service
|
|
//!
|
|
//! Service for managing multiple relay servers. [Manage Multiple Users](https://github.com/shadowsocks/shadowsocks/wiki/Manage-Multiple-Users)
|
|
|
|
use std::{io, sync::Arc};
|
|
|
|
use log::{trace, warn};
|
|
use shadowsocks::net::{AcceptOpts, ConnectOpts};
|
|
|
|
use crate::{
|
|
config::{Config, ConfigType},
|
|
dns::build_dns_resolver,
|
|
};
|
|
|
|
pub use self::server::Manager;
|
|
|
|
pub mod server;
|
|
|
|
/// Starts a manager server
|
|
pub async fn run(config: Config) -> io::Result<()> {
|
|
assert_eq!(config.config_type, ConfigType::Manager);
|
|
|
|
trace!("{:?}", config);
|
|
|
|
#[cfg(unix)]
|
|
if let Some(nofile) = config.nofile {
|
|
use crate::sys::set_nofile;
|
|
if let Err(err) = set_nofile(nofile) {
|
|
warn!("set_nofile {} failed, error: {}", nofile, err);
|
|
}
|
|
}
|
|
|
|
let mut manager = Manager::new(config.manager.expect("missing manager config"));
|
|
manager.set_mode(config.mode);
|
|
|
|
let mut connect_opts = ConnectOpts {
|
|
#[cfg(any(target_os = "linux", target_os = "android"))]
|
|
fwmark: config.outbound_fwmark,
|
|
|
|
#[cfg(target_os = "android")]
|
|
vpn_protect_path: config.outbound_vpn_protect_path,
|
|
|
|
bind_local_addr: config.local_addr,
|
|
|
|
#[cfg(any(target_os = "linux", target_os = "android", target_os = "macos", target_os = "ios"))]
|
|
bind_interface: config.outbound_bind_interface,
|
|
|
|
..Default::default()
|
|
};
|
|
|
|
connect_opts.tcp.send_buffer_size = config.outbound_send_buffer_size;
|
|
connect_opts.tcp.recv_buffer_size = config.outbound_recv_buffer_size;
|
|
connect_opts.tcp.nodelay = config.no_delay;
|
|
|
|
let mut accept_opts = AcceptOpts::default();
|
|
accept_opts.tcp.send_buffer_size = config.inbound_send_buffer_size;
|
|
accept_opts.tcp.recv_buffer_size = config.inbound_recv_buffer_size;
|
|
accept_opts.tcp.nodelay = config.no_delay;
|
|
|
|
if let Some(resolver) = build_dns_resolver(config.dns, config.ipv6_first, &connect_opts).await {
|
|
manager.set_dns_resolver(Arc::new(resolver));
|
|
}
|
|
|
|
manager.set_connect_opts(connect_opts);
|
|
manager.set_accept_opts(accept_opts);
|
|
|
|
if let Some(c) = config.udp_max_associations {
|
|
manager.set_udp_capacity(c);
|
|
}
|
|
|
|
if let Some(d) = config.udp_timeout {
|
|
manager.set_udp_expiry_duration(d);
|
|
}
|
|
|
|
for svr_cfg in config.server {
|
|
manager.add_server(svr_cfg, None).await;
|
|
}
|
|
|
|
manager.run().await
|
|
}
|