From f9e3b1104ee6f69e3f4c511fc8e1d478e4d9f572 Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Wed, 29 Apr 2020 11:59:31 +0200 Subject: [PATCH] change index to templates using handlebars using a handlebars instance in ApiConfig, to cache the templates as long as possible, this is currently ok, as the index template can only change when the whole package changes if we split this in the future, we have to trigger a reload of the daemon on gui package upgrade (so that the template gets reloaded) Signed-off-by: Dominik Csapak --- Cargo.toml | 1 + debian/proxmox-backup-server.install | 1 + src/bin/proxmox-backup-api.rs | 2 +- src/bin/proxmox-backup-proxy.rs | 2 +- src/server/config.rs | 15 ++++-- src/server/rest.rs | 69 +++++++++++----------------- www/Makefile | 3 +- www/index.hbs | 43 +++++++++++++++++ 8 files changed, 87 insertions(+), 49 deletions(-) create mode 100644 www/index.hbs diff --git a/Cargo.toml b/Cargo.toml index 2df47e9b..a155c872 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,6 +22,7 @@ endian_trait = { version = "0.6", features = ["arrays"] } anyhow = "1.0" futures = "0.3" h2 = { version = "0.2", features = ["stream"] } +handlebars = "3.0" http = "0.2" hyper = "0.13" lazy_static = "1.4" diff --git a/debian/proxmox-backup-server.install b/debian/proxmox-backup-server.install index fe3ba602..2704228d 100644 --- a/debian/proxmox-backup-server.install +++ b/debian/proxmox-backup-server.install @@ -5,6 +5,7 @@ usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-backup-api usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-backup-proxy usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-backup-banner usr/sbin/proxmox-backup-manager +usr/share/javascript/proxmox-backup/index.hbs usr/share/javascript/proxmox-backup/css/ext6-pbs.css usr/share/javascript/proxmox-backup/images/logo-128.png usr/share/javascript/proxmox-backup/images/proxmox_logo.png diff --git a/src/bin/proxmox-backup-api.rs b/src/bin/proxmox-backup-api.rs index f5e8bbe6..892ae58b 100644 --- a/src/bin/proxmox-backup-api.rs +++ b/src/bin/proxmox-backup-api.rs @@ -45,7 +45,7 @@ async fn run() -> Result<(), Error> { let _ = csrf_secret(); // load with lazy_static let config = server::ApiConfig::new( - buildcfg::JS_DIR, &proxmox_backup::api2::ROUTER, RpcEnvironmentType::PRIVILEGED); + buildcfg::JS_DIR, &proxmox_backup::api2::ROUTER, RpcEnvironmentType::PRIVILEGED)?; let rest_server = RestServer::new(config); diff --git a/src/bin/proxmox-backup-proxy.rs b/src/bin/proxmox-backup-proxy.rs index f1612e69..ef6e6703 100644 --- a/src/bin/proxmox-backup-proxy.rs +++ b/src/bin/proxmox-backup-proxy.rs @@ -34,7 +34,7 @@ async fn run() -> Result<(), Error> { let _ = csrf_secret(); // load with lazy_static let mut config = ApiConfig::new( - buildcfg::JS_DIR, &proxmox_backup::api2::ROUTER, RpcEnvironmentType::PUBLIC); + buildcfg::JS_DIR, &proxmox_backup::api2::ROUTER, RpcEnvironmentType::PUBLIC)?; // add default dirs which includes jquery and bootstrap // my $base = '/usr/share/libpve-http-server-perl'; diff --git a/src/server/config.rs b/src/server/config.rs index d9aa076c..e8b3c946 100644 --- a/src/server/config.rs +++ b/src/server/config.rs @@ -1,7 +1,9 @@ use std::collections::HashMap; use std::path::{PathBuf}; +use anyhow::Error; use hyper::Method; +use handlebars::Handlebars; use proxmox::api::{ApiMethod, Router, RpcEnvironmentType}; @@ -10,17 +12,22 @@ pub struct ApiConfig { router: &'static Router, aliases: HashMap, env_type: RpcEnvironmentType, + pub templates: Handlebars<'static>, } impl ApiConfig { - pub fn new>(basedir: B, router: &'static Router, env_type: RpcEnvironmentType) -> Self { - Self { - basedir: basedir.into(), + pub fn new>(basedir: B, router: &'static Router, env_type: RpcEnvironmentType) -> Result { + let mut templates = Handlebars::new(); + let basedir = basedir.into(); + templates.register_template_file("index", basedir.join("index.hbs"))?; + Ok(Self { + basedir, router, aliases: HashMap::new(), env_type, - } + templates + }) } pub fn find_method( diff --git a/src/server/rest.rs b/src/server/rest.rs index f648af3a..95f73191 100644 --- a/src/server/rest.rs +++ b/src/server/rest.rs @@ -16,6 +16,7 @@ use serde_json::{json, Value}; use tokio::fs::File; use tokio::time::Instant; use url::form_urlencoded; +use handlebars::Handlebars; use proxmox::http_err; use proxmox::api::{ApiHandler, ApiMethod, HttpError}; @@ -311,59 +312,43 @@ pub async fn handle_api_request, token: Option) -> Response { +fn get_index(username: Option, token: Option, template: &Handlebars, parts: Parts) -> Response { let nodename = proxmox::tools::nodename(); let username = username.unwrap_or_else(|| String::from("")); let token = token.unwrap_or_else(|| String::from("")); - let setup = json!({ - "Setup": { "auth_cookie_name": "PBSAuthCookie" }, + let mut debug = false; + + if let Some(query_str) = parts.uri.query() { + for (k, v) in form_urlencoded::parse(query_str.as_bytes()).into_owned() { + if k == "debug" && v == "1" || v == "true" { + debug = true; + } + } + } + + let data = json!({ "NodeName": nodename, "UserName": username, "CSRFPreventionToken": token, + "debug": debug, }); - let index = format!(r###" - - - - - - - Proxmox Backup Server - - - - - - - - - - - - - - - - - -
- -
- - -"###, setup.to_string()); + let mut ct = "text/html"; + + let index = match template.render("index", &data) { + Ok(index) => index, + Err(err) => { + ct = "text/plain"; + format!("Error rendering template: {}", err.desc) + }, + }; Response::builder() .status(StatusCode::OK) - .header(header::CONTENT_TYPE, "text/html") + .header(header::CONTENT_TYPE, ct) .body(index.into()) .unwrap() } @@ -595,15 +580,15 @@ pub async fn handle_request(api: Arc, req: Request) -> Result { let new_token = assemble_csrf_prevention_token(csrf_secret(), &username); - return Ok(get_index(Some(username), Some(new_token))); + return Ok(get_index(Some(username), Some(new_token), &api.templates, parts)); } _ => { tokio::time::delay_until(Instant::from_std(delay_unauth_time)).await; - return Ok(get_index(None, None)); + return Ok(get_index(None, None, &api.templates, parts)); } } } else { - return Ok(get_index(None, None)); + return Ok(get_index(None, None, &api.templates, parts)); } } else { let filename = api.find_alias(&components); diff --git a/www/Makefile b/www/Makefile index ef7c7300..461b5522 100644 --- a/www/Makefile +++ b/www/Makefile @@ -36,8 +36,9 @@ clean: find . -name '*~' -exec rm {} ';' rm -rf js -install: js/proxmox-backup-gui.js css/ext6-pbs.css +install: js/proxmox-backup-gui.js css/ext6-pbs.css index.hbs install -dm755 $(DESTDIR)$(JSDIR) + install -m644 index.hbs $(DESTDIR)$(JSDIR)/ install -dm755 $(DESTDIR)$(JSDIR)/js install -m644 js/proxmox-backup-gui.js $(DESTDIR)$(JSDIR)/js/ install -dm755 $(DESTDIR)$(JSDIR)/css diff --git a/www/index.hbs b/www/index.hbs new file mode 100644 index 00000000..9ede7645 --- /dev/null +++ b/www/index.hbs @@ -0,0 +1,43 @@ + + + + + + + Proxmox Backup Server + + + + + + + + {{#if debug}} + + + {{else}} + + + {{/if}} + + + + + + + + +
+ +
+ +