Skip to content

Commit 9829a70

Browse files
committed
Update config to support local, staging & prod env
1 parent a00835a commit 9829a70

3 files changed

Lines changed: 114 additions & 47 deletions

File tree

src/config.rs

Lines changed: 99 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ lazy_static! {
1414
#[derive(Parser)]
1515
struct Args {
1616
#[clap(long)]
17-
test: bool,
17+
staging: bool,
18+
#[clap(long)]
19+
local: bool,
1820
#[clap(long = "d", short = 'd', value_parser = parse_hashrate)]
1921
downstream_hashrate: Option<f32>,
2022
#[clap(long = "loglevel", short = 'l')]
@@ -29,8 +31,10 @@ struct Args {
2931
adjustment_interval: Option<u64>,
3032
#[clap(long = "pool", short = 'p', value_delimiter = ',')]
3133
pool_addresses: Option<Vec<String>>,
32-
#[clap(long = "test-pool", value_delimiter = ',')]
33-
test_pool_addresses: Option<Vec<String>>,
34+
#[clap(long = "staging-pool", value_delimiter = ',')]
35+
staging_pool_addresses: Option<Vec<String>>,
36+
#[clap(long = "local-pool", value_delimiter = ',')]
37+
local_pool_addresses: Option<Vec<String>>,
3438
#[clap(long)]
3539
token: Option<String>,
3640
#[clap(long)]
@@ -52,32 +56,60 @@ struct ConfigFile {
5256
token: Option<String>,
5357
tp_address: Option<String>,
5458
pool_addresses: Option<Vec<String>>,
55-
test_pool_addresses: Option<Vec<String>>,
59+
staging_pool_addresses: Option<Vec<String>>,
60+
local_pool_addresses: Option<Vec<String>>,
5661
interval: Option<u64>,
5762
delay: Option<u64>,
5863
downstream_hashrate: Option<String>,
5964
loglevel: Option<String>,
6065
nc_loglevel: Option<String>,
6166
sv1_log: Option<bool>,
62-
test: Option<bool>,
67+
staging: Option<bool>,
68+
local: Option<bool>,
6369
listening_addr: Option<String>,
6470
api_server_port: Option<String>,
6571
monitor: Option<bool>,
6672
auto_update: Option<bool>,
6773
}
6874

75+
impl ConfigFile {
76+
pub fn default() -> Self {
77+
ConfigFile {
78+
token: None,
79+
tp_address: None,
80+
pool_addresses: None,
81+
staging_pool_addresses: None,
82+
local_pool_addresses: None,
83+
interval: None,
84+
delay: None,
85+
downstream_hashrate: None,
86+
loglevel: None,
87+
nc_loglevel: None,
88+
sv1_log: None,
89+
staging: None,
90+
local: None,
91+
listening_addr: None,
92+
api_server_port: None,
93+
monitor: None,
94+
auto_update: None,
95+
}
96+
}
97+
}
98+
6999
pub struct Configuration {
70100
token: Option<String>,
71101
tp_address: Option<String>,
72102
pool_addresses: Option<Vec<SocketAddr>>,
73-
test_pool_addresses: Option<Vec<SocketAddr>>,
103+
staging_pool_addresses: Option<Vec<SocketAddr>>,
104+
local_pool_addresses: Option<Vec<SocketAddr>>,
74105
interval: u64,
75106
delay: u64,
76107
downstream_hashrate: f32,
77108
loglevel: String,
78109
nc_loglevel: String,
79110
sv1_log: bool,
80-
test: bool,
111+
staging: bool,
112+
local: bool,
81113
listening_addr: Option<String>,
82114
api_server_port: String,
83115
monitor: bool,
@@ -93,10 +125,12 @@ impl Configuration {
93125
}
94126

95127
pub fn pool_address() -> Option<Vec<SocketAddr>> {
96-
if CONFIG.test {
97-
CONFIG.test_pool_addresses.clone() // Return test pool addresses in test mode
128+
if CONFIG.staging {
129+
CONFIG.staging_pool_addresses.clone() // Return staging pool addresses
130+
} else if CONFIG.local {
131+
CONFIG.local_pool_addresses.clone() // Return local pool addresses
98132
} else {
99-
CONFIG.pool_addresses.clone()
133+
CONFIG.pool_addresses.clone() // Return production pool addresses
100134
}
101135
}
102136

@@ -149,8 +183,25 @@ impl Configuration {
149183
CONFIG.sv1_log
150184
}
151185

152-
pub fn test() -> bool {
153-
CONFIG.test
186+
pub fn staging() -> bool {
187+
CONFIG.staging
188+
}
189+
190+
pub fn local() -> bool {
191+
CONFIG.local
192+
}
193+
194+
/// Returns the environment based on the configuration.
195+
/// Possible values: "staging", "local", "production".
196+
/// If no environment is set, it defaults to "production".
197+
pub fn environment() -> String {
198+
if CONFIG.staging {
199+
"staging".to_string()
200+
} else if CONFIG.local {
201+
"local".to_string()
202+
} else {
203+
"production".to_string()
204+
}
154205
}
155206

156207
pub fn monitor() -> bool {
@@ -168,23 +219,7 @@ impl Configuration {
168219
let config: ConfigFile = std::fs::read_to_string(&config_path)
169220
.ok()
170221
.and_then(|content| toml::from_str(&content).ok())
171-
.unwrap_or(ConfigFile {
172-
token: None,
173-
tp_address: None,
174-
pool_addresses: None,
175-
test_pool_addresses: None,
176-
interval: None,
177-
delay: None,
178-
downstream_hashrate: None,
179-
loglevel: None,
180-
nc_loglevel: None,
181-
sv1_log: None,
182-
test: None,
183-
listening_addr: None,
184-
api_server_port: None,
185-
monitor: None,
186-
auto_update: None,
187-
});
222+
.unwrap_or(ConfigFile::default());
188223

189224
let token = args
190225
.token
@@ -221,24 +256,48 @@ impl Configuration {
221256
})
222257
});
223258

224-
let test_pool_addresses: Option<Vec<SocketAddr>> = args
225-
.test_pool_addresses
259+
let staging_pool_addresses: Option<Vec<SocketAddr>> = args
260+
.staging_pool_addresses
226261
.map(|addresses| {
227262
addresses
228263
.into_iter()
229264
.map(parse_address)
230265
.collect::<Vec<SocketAddr>>()
231266
})
232267
.or_else(|| {
233-
config.test_pool_addresses.map(|addresses| {
268+
config.staging_pool_addresses.map(|addresses| {
234269
addresses
235270
.into_iter()
236271
.map(parse_address)
237272
.collect::<Vec<SocketAddr>>()
238273
})
239274
})
240275
.or_else(|| {
241-
std::env::var("TEST_POOL_ADDRESSES").ok().map(|s| {
276+
std::env::var("STAGING_POOL_ADDRESSES").ok().map(|s| {
277+
s.split(',')
278+
.map(|s| parse_address(s.trim().to_string()))
279+
.collect::<Vec<SocketAddr>>()
280+
})
281+
});
282+
283+
let local_pool_addresses: Option<Vec<SocketAddr>> = args
284+
.local_pool_addresses
285+
.map(|addresses| {
286+
addresses
287+
.into_iter()
288+
.map(parse_address)
289+
.collect::<Vec<SocketAddr>>()
290+
})
291+
.or_else(|| {
292+
config.local_pool_addresses.map(|addresses| {
293+
addresses
294+
.into_iter()
295+
.map(parse_address)
296+
.collect::<Vec<SocketAddr>>()
297+
})
298+
})
299+
.or_else(|| {
300+
std::env::var("LOCAL_POOL_ADDRESSES").ok().map(|s| {
242301
s.split(',')
243302
.map(|s| parse_address(s.trim().to_string()))
244303
.collect::<Vec<SocketAddr>>()
@@ -316,8 +375,9 @@ impl Configuration {
316375
|| config.sv1_log.unwrap_or(false)
317376
|| std::env::var("SV1_LOGLEVEL").is_ok();
318377

319-
let test = args.test || config.test.unwrap_or(false) || std::env::var("TEST").is_ok();
320-
378+
let staging =
379+
args.staging || config.staging.unwrap_or(false) || std::env::var("STAGING").is_ok();
380+
let local = args.local || config.local.unwrap_or(false) || std::env::var("LOCAL").is_ok();
321381
let monitor =
322382
args.monitor || config.monitor.unwrap_or(false) || std::env::var("MONITOR").is_ok();
323383

@@ -329,14 +389,16 @@ impl Configuration {
329389
token,
330390
tp_address,
331391
pool_addresses,
332-
test_pool_addresses,
392+
staging_pool_addresses,
393+
local_pool_addresses,
333394
interval,
334395
delay,
335396
downstream_hashrate,
336397
loglevel,
337398
nc_loglevel,
338399
sv1_log,
339-
test,
400+
staging,
401+
local,
340402
listening_addr,
341403
api_server_port,
342404
monitor,

src/main.rs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,10 @@ lazy_static! {
5555
}
5656

5757
lazy_static! {
58-
pub static ref AUTH_PUB_KEY: &'static str = if Configuration::test() {
58+
59+
// for staging and local environments, use the test auth public key
60+
// for production, use the main auth public key
61+
pub static ref AUTH_PUB_KEY: &'static str = if Configuration::staging() || Configuration::local() {
5962
TEST_AUTH_PUB_KEY
6063
} else {
6164
MAIN_AUTH_PUB_KEY
@@ -88,20 +91,22 @@ async fn main() {
8891
};
8992
}
9093

91-
if Configuration::test() {
92-
info!("Package is running in test mode");
94+
if Configuration::staging() {
95+
info!("Package is running in staging mode");
96+
}
97+
if Configuration::local() {
98+
info!("Package is running in local mode");
9399
}
94100

95101
let auth_pub_k: Secp256k1PublicKey = AUTH_PUB_KEY.parse().expect("Invalid public key");
96102

97103
let pool_addresses = Configuration::pool_address()
98104
.filter(|p| !p.is_empty())
99-
.unwrap_or_else(|| {
100-
if Configuration::test() {
101-
panic!("Test pool address is missing");
102-
} else {
103-
panic!("Pool address is missing");
104-
}
105+
.unwrap_or_else(|| match Configuration::environment().as_str() {
106+
"staging" => panic!("Staging pool address is missing"),
107+
"local" => panic!("Local pool address is missing"),
108+
"production" => panic!("Pool address is missing"),
109+
_ => unreachable!(),
105110
});
106111

107112
let mut router = router::Router::new(pool_addresses, auth_pub_k, None, None);

src/translator/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ mod downstream;
33
mod error;
44
mod proxy;
55
mod upstream;
6-
pub mod utils;
6+
mod utils;
77

88
use bitcoin::Address;
99
use error::Error;

0 commit comments

Comments
 (0)