Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit2d12e6d

Browse files
authored
Merge pull request#320 from bittcrafter/dev/0.17.0
feat(config): add environment variable support for MQTT bridge credentials#317
2 parents3eeb38b +f16cd3b commit2d12e6d

File tree

7 files changed

+76
-8
lines changed

7 files changed

+76
-8
lines changed

‎rmqtt-net/src/stream.rs‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ pub mod v3 {
147147
/// io: Framed::new(stream, MqttCodec::V3(Default::default())),
148148
/// remote_addr: addr,
149149
/// cfg: Arc::new(Builder::default()),
150+
/// cert_info: None,
150151
/// };
151152
///
152153
/// // Send a PING request
@@ -364,6 +365,7 @@ pub mod v5 {
364365
/// io: Framed::new(stream, MqttCodec::V5(Default::default())),
365366
/// remote_addr: addr,
366367
/// cfg: Arc::new(Builder::default()),
368+
/// cert_info: None
367369
/// };
368370
///
369371
/// // Send authentication packet

‎rmqtt-plugins/rmqtt-bridge-egress-mqtt.toml‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ server = "tcp://127.0.0.1:2883"
2424
#client_key = "./rmqtt-bin/client.key"
2525

2626
# Username to connect to the remote MQTT broker
27+
#username = "${ENV:MQTT_USER}"
2728
username ="rmqtt_u"
2829
# Password to connect to the remote MQTT broker
30+
#password = "${ENV:MQTT_PASS}"
2931
password ="public"
3032

3133
# Maximum limit of clients connected to the remote MQTT broker

‎rmqtt-plugins/rmqtt-bridge-egress-mqtt/src/config.rs‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use serde_json::{self, Map, Value};
1616

1717
use rmqtt::{
1818
codec::types::{Protocol,MQTT_LEVEL_31,MQTT_LEVEL_311,MQTT_LEVEL_5},
19-
utils::{deserialize_duration, to_duration,Bytesize},
19+
utils::{deserialize_duration,deserialize_expand_env_vars_option,to_duration,Bytesize},
2020
Result,
2121
};
2222

@@ -44,9 +44,9 @@ pub struct Bridge {
4444
// #Client key file
4545
pubclient_key:Option<String>,
4646

47-
#[serde(default)]
47+
#[serde(default, deserialize_with ="deserialize_expand_env_vars_option")]
4848
pubusername:Option<String>,
49-
#[serde(default)]
49+
#[serde(default, deserialize_with ="deserialize_expand_env_vars_option")]
5050
pubpassword:Option<String>,
5151

5252
#[serde(default ="Bridge::concurrent_client_limit_default")]

‎rmqtt-plugins/rmqtt-bridge-ingress-mqtt.toml‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@ server = "tcp://127.0.0.1:2883"
2525
#client_key = "./rmqtt-bin/client.key"
2626

2727
# Username to connect to the remote MQTT broker
28+
#username = "${ENV:MQTT_USER}"
2829
username ="rmqtt_u"
2930
# Password to connect to the remote MQTT broker
31+
#password = "${ENV:MQTT_PASS}"
3032
password ="public"
3133

3234
# Maximum limit of clients connected to the remote MQTT broker

‎rmqtt-plugins/rmqtt-bridge-ingress-mqtt/src/config.rs‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use rmqtt::codec::types::{Protocol, MQTT_LEVEL_31, MQTT_LEVEL_311, MQTT_LEVEL_5}
1818

1919
use rmqtt::{
2020
types::TopicName,
21-
utils::{deserialize_duration, to_duration,Bytesize},
21+
utils::{deserialize_duration,deserialize_expand_env_vars_option,to_duration,Bytesize},
2222
Result,
2323
};
2424

@@ -44,9 +44,9 @@ pub struct Bridge {
4444
// #Client key file
4545
pubclient_key:Option<String>,
4646

47-
#[serde(default)]
47+
#[serde(default, deserialize_with ="deserialize_expand_env_vars_option")]
4848
pubusername:Option<String>,
49-
#[serde(default)]
49+
#[serde(default, deserialize_with ="deserialize_expand_env_vars_option")]
5050
pubpassword:Option<String>,
5151

5252
#[serde(default ="Bridge::concurrent_client_limit_default")]

‎rmqtt-utils/Cargo.toml‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name ="rmqtt-utils"
3-
version ="0.1.3"
3+
version ="0.1.4"
44
description ="Essential utilities for RMQTT system operations."
55
repository ="https://github.com/rmqtt/rmqtt/tree/master/rmqtt-utils"
66
edition.workspace =true
@@ -18,5 +18,6 @@ chrono = { workspace = true, features = ["clock"] }
1818
serde_json.workspace =true
1919
log.workspace =true
2020
bytestring = {workspace =true,features = ["serde"] }
21-
21+
regex.workspace =true
22+
once_cell.workspace =true
2223

‎rmqtt-utils/src/lib.rs‎

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,3 +616,64 @@ impl<'de> de::Deserialize<'de> for NodeAddr {
616616
NodeAddr::from_str(&String::deserialize(deserializer)?).map_err(de::Error::custom)
617617
}
618618
}
619+
620+
/// Expand all environment variable placeholders in the form `${ENV:VAR_NAME}`
621+
/// within a string.
622+
///
623+
/// Each occurrence of `${ENV:VAR_NAME}` will be replaced with the value of the
624+
/// corresponding environment variable `VAR_NAME`.
625+
/// If an environment variable is not set, it will be replaced with an empty string
626+
/// and a warning will be logged.
627+
///
628+
/// # Example
629+
///
630+
/// ```
631+
/// use std::env;
632+
/// env::set_var("MQTT_USER", "user");
633+
/// env::set_var("MQTT_PASS", "pass");
634+
///
635+
/// let p = rmqtt_utils::expand_env_vars("${env:MQTT_PASS}");
636+
/// assert_eq!(p, "pass");
637+
///
638+
/// let s = rmqtt_utils::expand_env_vars("mqtt://${ENV:MQTT_USER}:${ENV:MQTT_PASS}@localhost");
639+
/// assert_eq!(s, "mqtt://user:pass@localhost");
640+
/// ```
641+
#[inline]
642+
pubfnexpand_env_vars(value:&str) ->String{
643+
staticENV_PATTERN: once_cell::sync::Lazy<regex::Regex> = once_cell::sync::Lazy::new(||{
644+
regex::Regex::new(r"(?i)\$\{ENV:([A-Z0-9_]+)\}").expect("Invalid regex pattern")
645+
});
646+
647+
ENV_PATTERN
648+
.replace_all(value, |caps:&regex::Captures|{
649+
let env_name =&caps[1];
650+
std::env::var(env_name).unwrap_or_else(|_|{
651+
log::warn!("environment variable `{}` not set", env_name);
652+
String::new()
653+
})
654+
})
655+
.into_owned()
656+
}
657+
658+
#[inline]
659+
pubfndeserialize_expand_env_vars<'de,D>(deserializer:D) ->Result<String,D::Error>
660+
where
661+
D:Deserializer<'de>,
662+
{
663+
let v =String::deserialize(deserializer)?;
664+
Ok(expand_env_vars(&v))
665+
}
666+
667+
#[inline]
668+
pubfndeserialize_expand_env_vars_option<'de,D>(deserializer:D) ->Result<Option<String>,D::Error>
669+
where
670+
D:Deserializer<'de>,
671+
{
672+
String::deserialize(deserializer).map(|s|expand_env_vars(&s)).map(|s|{
673+
if s.is_empty(){
674+
None
675+
}else{
676+
Some(s)
677+
}
678+
})
679+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp