test persistent config
parent
4ec5d66d25
commit
90b6b6913e
|
@ -1,6 +1,7 @@
|
|||
/*.tar.gz
|
||||
/app_packages
|
||||
/config
|
||||
/data
|
||||
/ptth_server.toml
|
||||
/ptth_relay.toml
|
||||
/ptth_build_L6KLMVS6/
|
||||
|
|
|
@ -30,19 +30,31 @@ pub mod machine_editable {
|
|||
|
||||
use super::file::Server;
|
||||
|
||||
#[derive (Deserialize, Serialize)]
|
||||
#[derive (Default, Deserialize, Serialize)]
|
||||
pub struct Config {
|
||||
pub servers: Vec <Server>,
|
||||
pub debug_toggle: bool,
|
||||
}
|
||||
|
||||
impl Config {
|
||||
pub async fn from_file (path: &Path) -> Result <Self, crate::ConfigError>
|
||||
pub fn from_file (path: &Path) -> Result <Self, crate::ConfigError>
|
||||
{
|
||||
let config_s = tokio::fs::read_to_string (path).await?;
|
||||
let config_s = std::fs::read_to_string (path)?;
|
||||
let new_config: Config = toml::from_str (&config_s)?;
|
||||
|
||||
Ok (new_config)
|
||||
}
|
||||
|
||||
pub async fn save (&self, path: &Path) -> Result <(), crate::ConfigError> {
|
||||
let s = toml::to_string (self)?;
|
||||
// This is way easier in C++ but also not safe
|
||||
let mut temp_path = path.file_name ().unwrap ().to_os_string ();
|
||||
temp_path.push (".partial");
|
||||
let temp_path = path.with_file_name (temp_path);
|
||||
tokio::fs::write (&temp_path, &s).await?;
|
||||
tokio::fs::rename (&temp_path, path).await?;
|
||||
Ok (())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -20,6 +20,9 @@ pub enum ConfigError {
|
|||
#[error ("Bad server address")]
|
||||
BadServerAddress,
|
||||
|
||||
#[error (transparent)]
|
||||
TomlSerialization (#[from] toml::ser::Error),
|
||||
|
||||
#[error ("unknown config error")]
|
||||
Unknown,
|
||||
}
|
||||
|
|
|
@ -542,13 +542,36 @@ async fn handle_all (
|
|||
ClientServerList => handle_server_list (state, handlebars).await?,
|
||||
ClientUnregisteredServers => handle_unregistered_servers (state, handlebars).await?,
|
||||
Debug => {
|
||||
let s = handlebars.render ("debug", &())?;
|
||||
#[derive (Serialize)]
|
||||
struct DebugPage {
|
||||
persistent_toggle: bool,
|
||||
}
|
||||
|
||||
let page;
|
||||
|
||||
{
|
||||
let guard = state.me_config.read ().await;
|
||||
page = DebugPage {
|
||||
persistent_toggle: guard.debug_toggle,
|
||||
};
|
||||
}
|
||||
|
||||
let s = handlebars.render ("debug", &page)?;
|
||||
ok_reply (s)?
|
||||
},
|
||||
DebugEndlessSink => handle_endless_sink (req).await?,
|
||||
DebugEndlessSource (throttle) => handle_endless_source (1, throttle).await?,
|
||||
DebugGenKey => handle_gen_scraper_key (state).await?,
|
||||
DebugMysteriousError => return Err (RequestError::Mysterious),
|
||||
DebugToggle => {
|
||||
trace! ("Toggling debug toggle");
|
||||
{
|
||||
let mut guard = state.me_config.write ().await;
|
||||
guard.debug_toggle = ! guard.debug_toggle;
|
||||
guard.save (Path::new ("data/ptth_relay_me_config.toml")).await.unwrap ();
|
||||
}
|
||||
error_reply (StatusCode::OK, "Toggled.")?
|
||||
},
|
||||
ErrorBadUriFormat => error_reply (StatusCode::BAD_REQUEST, "Bad URI format")?,
|
||||
ErrorCantPost => {
|
||||
error! ("Can't POST {}", path);
|
||||
|
@ -613,7 +636,7 @@ async fn reload_config (
|
|||
let new_config = Config::from_file (config_reload_path).await?;
|
||||
|
||||
// Reload machine-editable config, if possible
|
||||
let me_config = machine_editable::Config::from_file (Path::new ("data/ptth_relay_me_config.toml")).await.ok ();
|
||||
// let me_config = machine_editable::Config::from_file (Path::new ("data/ptth_relay_me_config.toml")).await.ok ();
|
||||
|
||||
let mut config = state.config.write ().await;
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
use std::{
|
||||
collections::HashMap,
|
||||
convert::TryFrom,
|
||||
path::Path,
|
||||
time::Instant,
|
||||
};
|
||||
|
||||
|
@ -18,6 +19,7 @@ use crate::{
|
|||
Config,
|
||||
RelayError,
|
||||
ShuttingDownError,
|
||||
config::machine_editable,
|
||||
};
|
||||
|
||||
use ptth_core::{
|
||||
|
@ -76,6 +78,7 @@ impl Default for ServerStatus {
|
|||
|
||||
pub struct Relay {
|
||||
pub (crate) config: RwLock <Config>,
|
||||
pub (crate) me_config: RwLock <machine_editable::Config>,
|
||||
|
||||
/// The parked clients or parked server, keyed by server
|
||||
|
||||
|
@ -170,8 +173,20 @@ impl TryFrom <Config> for Relay {
|
|||
fn try_from (config: Config) -> Result <Self, Self::Error> {
|
||||
let (shutdown_watch_tx, shutdown_watch_rx) = watch::channel (false);
|
||||
|
||||
let me_config = machine_editable::Config::default ();
|
||||
|
||||
let me_config = match machine_editable::Config::from_file (Path::new ("data/ptth_relay_me_config.toml"))
|
||||
{
|
||||
Err (e) => {
|
||||
error! ("Can't load machine-editable config: {:?}", e);
|
||||
me_config
|
||||
},
|
||||
Ok (x) => x,
|
||||
};
|
||||
|
||||
Ok (Self {
|
||||
config: config.into (),
|
||||
me_config: me_config.into (),
|
||||
request_rendezvous: Default::default (),
|
||||
server_status: Default::default (),
|
||||
response_rendezvous: Default::default (),
|
||||
|
|
|
@ -15,6 +15,7 @@ pub enum Route <'a> {
|
|||
DebugEndlessSource (Option <usize>),
|
||||
DebugGenKey,
|
||||
DebugMysteriousError,
|
||||
DebugToggle,
|
||||
ErrorBadUriFormat,
|
||||
ErrorCantPost,
|
||||
ErrorMethodNotAllowed,
|
||||
|
@ -41,6 +42,9 @@ pub fn route_url <'a> (method: &Method, path: &'a str) -> Route <'a> {
|
|||
else if path == "/frontend/debug/endless_sink" {
|
||||
Route::DebugEndlessSink
|
||||
}
|
||||
else if path == "/frontend/debug/toggle" {
|
||||
Route::DebugToggle
|
||||
}
|
||||
else {
|
||||
Route::ErrorCantPost
|
||||
}
|
||||
|
|
|
@ -52,5 +52,11 @@ Lorem ipsum dolor set amet
|
|||
<p>
|
||||
<a href="endless_sink">Data sink (POST only)</a>
|
||||
|
||||
<p>Persistent toggle is <pre>{{persistent_toggle}}</pre></p>
|
||||
|
||||
<form action="toggle" method="post">
|
||||
<input type="submit" value="Toggle">
|
||||
</form>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
Loading…
Reference in New Issue