X-Git-Url: http://these/git/?a=blobdiff_plain;f=src%2Fscheduled_tasks.rs;h=4fc85b8f765cc959316d42656f6a9f5e58d51d4c;hb=3735c6fabfd85d6c98c2fc126b70e593db532eb8;hp=5785491108e4901682ce8966ca5004fc12b61b46;hpb=47f4aa3550e7e79736f87673e007f930a9442f1f;p=lemmy.git diff --git a/src/scheduled_tasks.rs b/src/scheduled_tasks.rs index 57854911..4fc85b8f 100644 --- a/src/scheduled_tasks.rs +++ b/src/scheduled_tasks.rs @@ -2,17 +2,25 @@ use clokwerk::{Scheduler, TimeUnits}; // Import week days and WeekDay use diesel::{sql_query, PgConnection, RunQueryDsl}; use diesel::{Connection, ExpressionMethods, QueryDsl}; -use lemmy_utils::error::LemmyError; +use lemmy_db_schema::{ + source::instance::{Instance, InstanceForm}, + utils::naive_now, +}; +use lemmy_routes::nodeinfo::NodeInfo; +use lemmy_utils::{error::LemmyError, REQWEST_TIMEOUT}; +use reqwest::blocking::Client; use std::{thread, time::Duration}; use tracing::info; /// Schedules various cleanup tasks for lemmy in a background thread -pub fn setup(db_url: String) -> Result<(), LemmyError> { +pub fn setup(db_url: String, user_agent: String) -> Result<(), LemmyError> { // Setup the connections let mut scheduler = Scheduler::new(); let mut conn = PgConnection::establish(&db_url).expect("could not establish connection"); + let mut conn_2 = PgConnection::establish(&db_url).expect("could not establish connection"); + active_counts(&mut conn); update_banned_when_expired(&mut conn); @@ -33,6 +41,11 @@ pub fn setup(db_url: String) -> Result<(), LemmyError> { clear_old_activities(&mut conn); }); + update_instance_software(&mut conn_2, &user_agent); + scheduler.every(1.days()).run(move || { + update_instance_software(&mut conn_2, &user_agent); + }); + // Manually run the scheduler in an event loop loop { scheduler.run_pending(); @@ -120,3 +133,67 @@ fn drop_ccnew_indexes(conn: &mut PgConnection) { .execute(conn) .expect("drop ccnew indexes"); } + +/// Updates the instance software and version +fn update_instance_software(conn: &mut PgConnection, user_agent: &str) { + use lemmy_db_schema::schema::instance; + info!("Updating instances software and versions..."); + + let client = Client::builder() + .user_agent(user_agent) + .timeout(REQWEST_TIMEOUT) + .build() + .expect("couldnt build reqwest client"); + + let instances = instance::table + .get_results::(conn) + .expect("no instances found"); + + for instance in instances { + let node_info_url = format!("https://{}/nodeinfo/2.0.json", instance.domain); + + // Skip it if it can't connect + let res = client + .get(&node_info_url) + .send() + .ok() + .and_then(|t| t.json::().ok()); + + if let Some(node_info) = res { + let software = node_info.software.as_ref(); + let form = InstanceForm::builder() + .domain(instance.domain) + .software(software.and_then(|s| s.name.clone())) + .version(software.and_then(|s| s.version.clone())) + .updated(Some(naive_now())) + .build(); + + diesel::update(instance::table.find(instance.id)) + .set(form) + .execute(conn) + .expect("update site instance software"); + } + } + info!("Done."); +} + +#[cfg(test)] +mod tests { + use lemmy_routes::nodeinfo::NodeInfo; + use reqwest::Client; + + #[tokio::test] + async fn test_nodeinfo() { + let client = Client::builder().build().unwrap(); + let lemmy_ml_nodeinfo = client + .get("https://lemmy.ml/nodeinfo/2.0.json") + .send() + .await + .unwrap() + .json::() + .await + .unwrap(); + + assert_eq!(lemmy_ml_nodeinfo.software.unwrap().name.unwrap(), "lemmy"); + } +}