Files
shadowsocks-rust/crates/shadowsocks-service/src/manager/mod.rs
zonyitoo 6bebb6c6c0 support multiple local servers in configuration file
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
2021-03-14 17:09:41 +08:00

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
}