shadowsocks/
config.rs

1use std::env;
2use std::path::Path;
3use std::{fs, io};
4
5use serde_derive::{Deserialize, Serialize};
6
7static LOCAL_ADDR: &str = "0.0.0.0:6009";
8static SERVER_ADDR: &str = "0.0.0.0:9006";
9static PASSWORD: &str = "password";
10static METHOD: &str = "aes-256-cfb";
11
12#[derive(Serialize, Deserialize, Debug, Default)]
13#[serde(default)]
14pub struct Config {
15    pub local_addr: String,
16    pub server_addr: String,
17    pub password: String,
18    pub method: String,
19}
20
21impl Config {
22    pub fn new<P: AsRef<Path>>(path: P) -> Result<Config, io::Error> {
23        if path.as_ref().exists() {
24            let contents = fs::read_to_string(path)?;
25            let config = match serde_json::from_str(&contents) {
26                Ok(c) => c,
27                Err(e) => {
28                    log::error!("{}", e);
29                    return Err(io::Error::new(io::ErrorKind::Other, e));
30                }
31            };
32            return Ok(config);
33        }
34
35        let mut config = Config {
36            ..Default::default()
37        };
38        if config.local_addr.is_empty() {
39            config.local_addr = if let Ok(addr) = env::var("SHADOWSOCKS_LOCAL_ADDR") {
40                addr
41            } else {
42                LOCAL_ADDR.to_string()
43            }
44        }
45        if config.server_addr.is_empty() {
46            config.server_addr = if let Ok(addr) = env::var("SHADOWSOCKS_SERVER_ADDR") {
47                addr
48            } else {
49                SERVER_ADDR.to_string()
50            }
51        }
52        if config.password.is_empty() {
53            config.password = if let Ok(addr) = env::var("SHADOWSOCKS_PASSWORD") {
54                addr
55            } else {
56                PASSWORD.to_string()
57            }
58        }
59        if config.method.is_empty() {
60            config.method = if let Ok(addr) = env::var("SHADOWSOCKS_METHOD") {
61                addr
62            } else {
63                METHOD.to_string()
64            }
65        }
66        Ok(config)
67    }
68}