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}