2021-11-03 09:52:02 +00:00
|
|
|
use log::info;
|
|
|
|
use rocket::{
|
2021-11-15 15:32:00 +00:00
|
|
|
form::{Form, FromForm},
|
2021-11-03 09:52:02 +00:00
|
|
|
get, post,
|
2021-11-04 13:10:41 +00:00
|
|
|
request::FlashMessage,
|
2021-11-15 15:32:00 +00:00
|
|
|
serde::{
|
|
|
|
json::{Json, Value},
|
|
|
|
Deserialize, Serialize,
|
|
|
|
},
|
2021-11-03 09:52:02 +00:00
|
|
|
};
|
2021-11-04 11:03:40 +00:00
|
|
|
use rocket_dyn_templates::Template;
|
2021-10-28 08:01:31 +00:00
|
|
|
|
|
|
|
use peach_lib::config_manager;
|
2021-11-03 09:52:02 +00:00
|
|
|
use peach_lib::config_manager::load_peach_config;
|
2021-10-28 08:01:31 +00:00
|
|
|
use peach_lib::dyndns_client;
|
2021-11-03 09:52:02 +00:00
|
|
|
use peach_lib::dyndns_client::{
|
|
|
|
check_is_new_dyndns_domain, get_dyndns_subdomain, get_full_dynamic_domain,
|
|
|
|
is_dns_updater_online,
|
|
|
|
};
|
2021-10-28 08:01:31 +00:00
|
|
|
use peach_lib::error::PeachError;
|
|
|
|
use peach_lib::jsonrpc_client_core::{Error, ErrorKind};
|
|
|
|
use peach_lib::jsonrpc_core::types::error::ErrorCode;
|
2021-10-28 12:09:56 +00:00
|
|
|
|
2021-10-28 12:33:27 +00:00
|
|
|
use crate::error::PeachWebError;
|
2021-11-08 15:38:10 +00:00
|
|
|
use crate::routes::authentication::Authenticated;
|
2021-11-03 14:08:57 +00:00
|
|
|
use crate::utils::build_json_response;
|
2021-10-28 12:33:27 +00:00
|
|
|
|
2021-10-28 08:01:31 +00:00
|
|
|
#[derive(Debug, Deserialize, FromForm)]
|
|
|
|
pub struct DnsForm {
|
|
|
|
pub external_domain: String,
|
|
|
|
pub enable_dyndns: bool,
|
|
|
|
pub dynamic_domain: String,
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn save_dns_configuration(dns_form: DnsForm) -> Result<(), PeachWebError> {
|
|
|
|
// first save local configurations
|
|
|
|
config_manager::set_external_domain(&dns_form.external_domain)?;
|
|
|
|
config_manager::set_dyndns_enabled_value(dns_form.enable_dyndns)?;
|
|
|
|
// if dynamic dns is enabled and this is a new domain name, then register it
|
|
|
|
if dns_form.enable_dyndns {
|
|
|
|
let full_dynamic_domain = get_full_dynamic_domain(&dns_form.dynamic_domain);
|
|
|
|
// check if this is a new domain or if its already registered
|
|
|
|
let is_new_domain = check_is_new_dyndns_domain(&full_dynamic_domain);
|
|
|
|
if is_new_domain {
|
|
|
|
match dyndns_client::register_domain(&full_dynamic_domain) {
|
|
|
|
Ok(_) => {
|
|
|
|
info!("Registered new dyndns domain");
|
|
|
|
// successful update
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
Err(err) => {
|
|
|
|
info!("Failed to register dyndns domain: {:?}", err);
|
|
|
|
// json response for failed update
|
|
|
|
let msg: String = match err {
|
2021-12-08 08:07:58 +00:00
|
|
|
PeachError::JsonRpcClientCore(source) => {
|
2021-10-28 08:01:31 +00:00
|
|
|
match source {
|
|
|
|
Error(ErrorKind::JsonRpcError(err), _state) => match err.code {
|
|
|
|
ErrorCode::ServerError(-32030) => {
|
|
|
|
format!("Error registering domain: {} was previously registered", full_dynamic_domain)
|
|
|
|
}
|
|
|
|
_ => {
|
|
|
|
format!("Failed to register dyndns domain {:?}", err)
|
|
|
|
}
|
|
|
|
},
|
|
|
|
_ => {
|
|
|
|
format!("Failed to register dyndns domain: {:?}", source)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
_ => "Failed to register dyndns domain".to_string(),
|
|
|
|
};
|
|
|
|
Err(PeachWebError::FailedToRegisterDynDomain { msg })
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// if the domain is already registered, then dont re-register, and just return success
|
|
|
|
else {
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug, Serialize)]
|
|
|
|
pub struct ConfigureDNSContext {
|
|
|
|
pub external_domain: String,
|
|
|
|
pub dyndns_subdomain: String,
|
|
|
|
pub enable_dyndns: bool,
|
|
|
|
pub is_dyndns_online: bool,
|
|
|
|
pub back: Option<String>,
|
|
|
|
pub title: Option<String>,
|
|
|
|
pub flash_name: Option<String>,
|
|
|
|
pub flash_msg: Option<String>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl ConfigureDNSContext {
|
|
|
|
pub fn build() -> ConfigureDNSContext {
|
|
|
|
let peach_config = load_peach_config().unwrap();
|
|
|
|
let dyndns_fulldomain = peach_config.dyn_domain;
|
|
|
|
let is_dyndns_online = is_dns_updater_online().unwrap();
|
|
|
|
let dyndns_subdomain =
|
|
|
|
get_dyndns_subdomain(&dyndns_fulldomain).unwrap_or(dyndns_fulldomain);
|
|
|
|
ConfigureDNSContext {
|
|
|
|
external_domain: peach_config.external_domain,
|
|
|
|
dyndns_subdomain,
|
|
|
|
enable_dyndns: peach_config.dyn_enabled,
|
|
|
|
is_dyndns_online,
|
|
|
|
back: None,
|
|
|
|
title: None,
|
|
|
|
flash_name: None,
|
|
|
|
flash_msg: None,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-15 15:32:00 +00:00
|
|
|
#[get("/dns")]
|
2021-11-08 15:55:58 +00:00
|
|
|
pub fn configure_dns(flash: Option<FlashMessage>, _auth: Authenticated) -> Template {
|
2021-10-28 08:01:31 +00:00
|
|
|
let mut context = ConfigureDNSContext::build();
|
|
|
|
// set back icon link to network route
|
2021-11-15 15:32:00 +00:00
|
|
|
context.back = Some("/settings/network".to_string());
|
2021-10-28 08:01:31 +00:00
|
|
|
context.title = Some("Configure DNS".to_string());
|
|
|
|
// check to see if there is a flash message to display
|
|
|
|
if let Some(flash) = flash {
|
|
|
|
// add flash message contents to the context object
|
2021-11-04 11:03:40 +00:00
|
|
|
context.flash_name = Some(flash.kind().to_string());
|
|
|
|
context.flash_msg = Some(flash.message().to_string());
|
2021-10-28 08:01:31 +00:00
|
|
|
};
|
2021-11-15 15:32:00 +00:00
|
|
|
Template::render("settings/network/configure_dns", &context)
|
2021-10-28 08:01:31 +00:00
|
|
|
}
|
|
|
|
|
2021-11-15 15:32:00 +00:00
|
|
|
#[post("/dns", data = "<dns>")]
|
2021-11-08 15:55:58 +00:00
|
|
|
pub fn configure_dns_post(dns: Form<DnsForm>, _auth: Authenticated) -> Template {
|
2021-10-28 08:01:31 +00:00
|
|
|
let result = save_dns_configuration(dns.into_inner());
|
|
|
|
match result {
|
|
|
|
Ok(_) => {
|
|
|
|
let mut context = ConfigureDNSContext::build();
|
|
|
|
// set back icon link to network route
|
2021-11-15 15:32:00 +00:00
|
|
|
context.back = Some("/settings/network".to_string());
|
2021-10-28 08:01:31 +00:00
|
|
|
context.title = Some("Configure DNS".to_string());
|
|
|
|
context.flash_name = Some("success".to_string());
|
|
|
|
context.flash_msg = Some("New dynamic dns configuration is now enabled".to_string());
|
2021-11-15 15:32:00 +00:00
|
|
|
Template::render("settings/network/configure_dns", &context)
|
2021-10-28 08:01:31 +00:00
|
|
|
}
|
|
|
|
Err(err) => {
|
|
|
|
let mut context = ConfigureDNSContext::build();
|
|
|
|
// set back icon link to network route
|
2021-11-15 15:32:00 +00:00
|
|
|
context.back = Some("/settings/network".to_string());
|
2021-10-28 08:01:31 +00:00
|
|
|
context.title = Some("Configure DNS".to_string());
|
|
|
|
context.flash_name = Some("error".to_string());
|
|
|
|
context.flash_msg = Some(format!("Failed to save dns configurations: {}", err));
|
2021-11-15 15:32:00 +00:00
|
|
|
Template::render("settings/network/configure_dns", &context)
|
2021-10-28 08:01:31 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-15 15:32:00 +00:00
|
|
|
#[post("/dns/configure", data = "<dns_form>")]
|
2021-11-08 15:55:58 +00:00
|
|
|
pub fn save_dns_configuration_endpoint(dns_form: Json<DnsForm>, _auth: Authenticated) -> Value {
|
2021-10-28 08:01:31 +00:00
|
|
|
let result = save_dns_configuration(dns_form.into_inner());
|
|
|
|
match result {
|
|
|
|
Ok(_) => {
|
|
|
|
let status = "success".to_string();
|
|
|
|
let msg = "New dynamic dns configuration is now enabled".to_string();
|
2021-11-04 11:03:40 +00:00
|
|
|
build_json_response(status, None, Some(msg))
|
2021-10-28 08:01:31 +00:00
|
|
|
}
|
|
|
|
Err(err) => {
|
|
|
|
let status = "error".to_string();
|
|
|
|
let msg = format!("{}", err);
|
2021-11-04 11:03:40 +00:00
|
|
|
build_json_response(status, None, Some(msg))
|
2021-10-28 08:01:31 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|