fix(settings): allow UCI reflector file loading to be disabled
This commit is contained in:
2 files changed
+42
No files matched your search
@@ -57,3 +57,22 @@ You can also build an OpenWrt package to install in your images with the SDK:
|
||||
# Copy the generated .ipk from bin/packages/... to your router
|
||||
opkg install sqm-autorate-rust_*.ipk
|
||||
```
|
||||
|
||||
## Reflector files and inline UCI reflectors
|
||||
|
||||
Inline `config reflector` sections supplement the default
|
||||
`/etc/sqm-autorate-rust/reflectors.csv`. To use only inline reflectors, explicitly
|
||||
disable file loading:
|
||||
|
||||
```uci
|
||||
config reflectors
|
||||
option files 'none'
|
||||
|
||||
config reflector
|
||||
option host 'global.irtt.lochnair.net'
|
||||
list protocols 'irtt'
|
||||
```
|
||||
|
||||
Use `list files '/path/to/reflectors.csv'` instead of `option files 'none'` to
|
||||
combine CSV files with inline reflectors. Omitting `files` keeps the default CSV;
|
||||
UCI discards empty string options, so `option files ''` does not disable it.
|
||||
@@ -270,6 +270,7 @@ impl NetworkSettings {
|
||||
#[derive(Clone, Debug, Deserialize, UciSection)]
|
||||
#[serde(default)]
|
||||
pub(crate) struct ReflectorSettings {
|
||||
#[serde(deserialize_with = "deserialize_reflector_files")]
|
||||
pub(crate) files: Vec<String>,
|
||||
pub(crate) countries: Vec<String>,
|
||||
|
||||
@@ -472,3 +473,25 @@ where
|
||||
let value = String::deserialize(deserializer)?;
|
||||
value.parse().map_err(de::Error::custom)
|
||||
}
|
||||
|
||||
// UCI drops empty string options; `option files 'none'` disables file loading.
|
||||
fn deserialize_reflector_files<'de, D>(deserializer: D) -> Result<Vec<String>, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
#[derive(Deserialize)]
|
||||
#[serde(untagged)]
|
||||
enum Files {
|
||||
List(Vec<String>),
|
||||
String(String),
|
||||
}
|
||||
|
||||
match Files::deserialize(deserializer)? {
|
||||
Files::List(files) => Ok(files),
|
||||
Files::String(value) if value.trim().is_empty() || value.trim() == "none" => Ok(Vec::new()),
|
||||
Files::String(_) => Err(de::Error::custom(
|
||||
"reflector files must be a list, an empty string, or none",
|
||||
)),
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user