feat: display whether or not the instance is up to date on error (#310)
This commit is contained in:
parent
2fd358f3ed
commit
f03bdcf472
@ -85,7 +85,7 @@ fn info_html(req: &Request<Body>) -> Result<Response<Body>, Error> {
|
|||||||
pub struct InstanceInfo {
|
pub struct InstanceInfo {
|
||||||
package_name: String,
|
package_name: String,
|
||||||
crate_version: String,
|
crate_version: String,
|
||||||
git_commit: String,
|
pub git_commit: String,
|
||||||
deploy_date: String,
|
deploy_date: String,
|
||||||
compile_mode: String,
|
compile_mode: String,
|
||||||
deploy_unix_ts: i64,
|
deploy_unix_ts: i64,
|
||||||
|
31
src/main.rs
31
src/main.rs
@ -2,15 +2,16 @@
|
|||||||
#![forbid(unsafe_code)]
|
#![forbid(unsafe_code)]
|
||||||
#![allow(clippy::cmp_owned)]
|
#![allow(clippy::cmp_owned)]
|
||||||
|
|
||||||
// Import Crates
|
use cached::proc_macro::cached;
|
||||||
use clap::{Arg, ArgAction, Command};
|
use clap::{Arg, ArgAction, Command};
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
use futures_lite::FutureExt;
|
use futures_lite::FutureExt;
|
||||||
|
use hyper::Uri;
|
||||||
use hyper::{header::HeaderValue, Body, Request, Response};
|
use hyper::{header::HeaderValue, Body, Request, Response};
|
||||||
|
|
||||||
use log::info;
|
use log::info;
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
use redlib::client::{canonical_path, proxy};
|
use redlib::client::{canonical_path, proxy, CLIENT};
|
||||||
use redlib::server::{self, RequestExt};
|
use redlib::server::{self, RequestExt};
|
||||||
use redlib::utils::{error, redirect, ThemeAssets};
|
use redlib::utils::{error, redirect, ThemeAssets};
|
||||||
use redlib::{config, duplicates, headers, instance_info, post, search, settings, subreddit, user};
|
use redlib::{config, duplicates, headers, instance_info, post, search, settings, subreddit, user};
|
||||||
@ -217,6 +218,11 @@ async fn main() {
|
|||||||
app
|
app
|
||||||
.at("/highlighted.js")
|
.at("/highlighted.js")
|
||||||
.get(|_| resource(include_str!("../static/highlighted.js"), "text/javascript", false).boxed());
|
.get(|_| resource(include_str!("../static/highlighted.js"), "text/javascript", false).boxed());
|
||||||
|
app
|
||||||
|
.at("/check_update.js")
|
||||||
|
.get(|_| resource(include_str!("../static/check_update.js"), "text/javascript", false).boxed());
|
||||||
|
|
||||||
|
app.at("/commits.atom").get(|_| async move { proxy_commit_info().await }.boxed());
|
||||||
|
|
||||||
// Proxy media through Redlib
|
// Proxy media through Redlib
|
||||||
app.at("/vid/:id/:size").get(|r| proxy(r, "https://v.redd.it/{id}/DASH_{size}").boxed());
|
app.at("/vid/:id/:size").get(|r| proxy(r, "https://v.redd.it/{id}/DASH_{size}").boxed());
|
||||||
@ -374,3 +380,22 @@ async fn main() {
|
|||||||
eprintln!("Server error: {e}");
|
eprintln!("Server error: {e}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn proxy_commit_info() -> Result<Response<Body>, String> {
|
||||||
|
Ok(
|
||||||
|
Response::builder()
|
||||||
|
.status(200)
|
||||||
|
.header("content-type", "application/atom+xml")
|
||||||
|
.body(Body::from(fetch_commit_info().await))
|
||||||
|
.unwrap_or_default(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cached(time = 600)]
|
||||||
|
async fn fetch_commit_info() -> String {
|
||||||
|
let uri = Uri::from_str("https://github.com/redlib-org/redlib/commits/main.atom").expect("Invalid URI");
|
||||||
|
|
||||||
|
let resp: Body = CLIENT.get(uri).await.expect("Failed to request GitHub").into_body();
|
||||||
|
|
||||||
|
hyper::body::to_bytes(resp).await.expect("Failed to read body").iter().copied().map(|x| x as char).collect()
|
||||||
|
}
|
||||||
|
38
static/check_update.js
Normal file
38
static/check_update.js
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
async function checkInstanceUpdateStatus() {
|
||||||
|
try {
|
||||||
|
const response = await fetch('/commits.atom');
|
||||||
|
const text = await response.text();
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const xmlDoc = parser.parseFromString(text, "application/xml");
|
||||||
|
const entries = xmlDoc.getElementsByTagName('entry');
|
||||||
|
const localCommit = document.getElementById('git_commit').dataset.value;
|
||||||
|
|
||||||
|
let statusMessage = '';
|
||||||
|
|
||||||
|
if (entries.length > 0) {
|
||||||
|
const commitHashes = Array.from(entries).map(entry => {
|
||||||
|
const id = entry.getElementsByTagName('id')[0].textContent;
|
||||||
|
return id.split('/').pop();
|
||||||
|
});
|
||||||
|
|
||||||
|
const commitIndex = commitHashes.indexOf(localCommit);
|
||||||
|
|
||||||
|
if (commitIndex === 0) {
|
||||||
|
statusMessage = '✅ Instance is up to date.';
|
||||||
|
} else if (commitIndex > 0) {
|
||||||
|
statusMessage = `⚠️ This instance is not up to date and is ${commitIndex} commits old. Test and confirm on an up-to-date instance before reporting.`;
|
||||||
|
} else {
|
||||||
|
statusMessage = `⚠️ This instance is not up to date and is at least ${commitHashes.length} commits old. Test and confirm on an up-to-date instance before reporting.`;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
statusMessage = '⚠️ Unable to fetch commit information.';
|
||||||
|
}
|
||||||
|
|
||||||
|
document.getElementById('update-status').innerText = statusMessage;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error fetching commits:', error);
|
||||||
|
document.getElementById('update-status').innerText = '⚠️ Error checking update status.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
checkInstanceUpdateStatus();
|
@ -6,6 +6,11 @@
|
|||||||
<h1>{{ msg }}</h1>
|
<h1>{{ msg }}</h1>
|
||||||
<h3><a href="https://www.redditstatus.com/">Reddit Status</a></h3>
|
<h3><a href="https://www.redditstatus.com/">Reddit Status</a></h3>
|
||||||
<br />
|
<br />
|
||||||
|
<h3 id="update-status"></h3>
|
||||||
|
<br>
|
||||||
|
<div id="git_commit" data-value="{{ crate::instance_info::INSTANCE_INFO.git_commit }}"></div>
|
||||||
|
<script src="/check_update.js"></script>
|
||||||
|
|
||||||
<h3>Expected something to work? <a
|
<h3>Expected something to work? <a
|
||||||
href="https://github.com/redlib-org/redlib/issues/new?assignees=&labels=bug&projects=&template=bug_report.md&title=%F0%9F%90%9B+Bug+Report%3A+{{ msg }}">Report
|
href="https://github.com/redlib-org/redlib/issues/new?assignees=&labels=bug&projects=&template=bug_report.md&title=%F0%9F%90%9B+Bug+Report%3A+{{ msg }}">Report
|
||||||
an issue</a></h3>
|
an issue</a></h3>
|
||||||
|
Loading…
Reference in New Issue
Block a user