149 lines
4 KiB
Rust
149 lines
4 KiB
Rust
// SPDX-FileCopyrightText: 2024 Aravinth Manivannan <realaravinth@batsense.net>
|
|
//
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
use std::fmt::Display;
|
|
use std::os::unix::fs::symlink as unix_symlink;
|
|
use std::process::Command;
|
|
|
|
use actix_web::web::ServiceConfig;
|
|
use actix_web::HttpResponse;
|
|
use actix_web::{get, http::header, post, web, App, HttpServer, Responder};
|
|
use clap::Parser;
|
|
use log::info;
|
|
use url::Url;
|
|
|
|
fn thirappu(ribbon: &str, store: &str) {
|
|
let ribbon_link = format!("/etc/nginx/sites-enabled/{ribbon}");
|
|
let store_original = format!("/etc/nginx/sites-available/{store}");
|
|
let store_link = format!("/etc/nginx/sites-enabled/{store}");
|
|
std::fs::remove_file(ribbon_link).unwrap();
|
|
info!("removed store");
|
|
unix_symlink(store_original, store_link).unwrap();
|
|
info!("Linked store");
|
|
Command::new("nginx")
|
|
.args(["-s", "reload"])
|
|
.output()
|
|
.unwrap();
|
|
info!("nginx reloaded");
|
|
}
|
|
|
|
fn reset(ribbon: &str, store: &str) {
|
|
let ribbon_link = format!("/etc/nginx/sites-enabled/{ribbon}");
|
|
let ribbon_original = format!("/etc/nginx/sites-available/{ribbon}");
|
|
let store_link = format!("/etc/nginx/sites-enabled/{store}");
|
|
info!("resetting vizha: store_link {store_link} ribbon_link: {ribbon_link} ribbon_original: {ribbon_original}");
|
|
std::fs::remove_file(store_link).unwrap();
|
|
info!("Removed store link");
|
|
unix_symlink(ribbon_original, ribbon_link).unwrap();
|
|
info!("Linked ribbon");
|
|
Command::new("nginx")
|
|
.args(["-s", "reload"])
|
|
.output()
|
|
.unwrap();
|
|
info!("nginx reloaded");
|
|
}
|
|
|
|
#[derive(Parser, Debug, Clone)]
|
|
#[command(version, about, long_about = None)]
|
|
struct Args {
|
|
/// Port number to start server
|
|
#[arg(short, long)]
|
|
port: u16,
|
|
|
|
/// File name of nginx vhost for the ribbon service
|
|
#[arg(short, long)]
|
|
ribbon: String,
|
|
/// File name of nginx vhost for the store front
|
|
#[arg(short, long)]
|
|
store: String,
|
|
|
|
#[arg(long)]
|
|
store_weburl: Url,
|
|
}
|
|
|
|
impl Display for Args {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
write!(
|
|
f,
|
|
"port: {} ribbon: {} store: {} store_weburl: {}",
|
|
self.port,
|
|
self.ribbon,
|
|
self.store,
|
|
self.store_weburl.to_string()
|
|
)
|
|
}
|
|
}
|
|
|
|
#[get("/reset")]
|
|
async fn reset_get() -> impl Responder {
|
|
let reset = include_str!("./reset.html");
|
|
|
|
HttpResponse::Ok()
|
|
.content_type("text/html; charset=utf-8")
|
|
.body(reset)
|
|
}
|
|
|
|
#[post("/reset")]
|
|
async fn reset_post(ctx: web::Data<Args>) -> impl Responder {
|
|
reset(&ctx.ribbon, &ctx.store);
|
|
|
|
HttpResponse::Found()
|
|
.append_header((header::LOCATION, ctx.store_weburl.to_string()))
|
|
.finish()
|
|
}
|
|
|
|
#[post("/")]
|
|
async fn open_post(ctx: web::Data<Args>) -> impl Responder {
|
|
thirappu(&ctx.ribbon, &ctx.store);
|
|
|
|
HttpResponse::Found()
|
|
.append_header((header::LOCATION, ctx.store_weburl.to_string()))
|
|
.finish()
|
|
}
|
|
|
|
#[get("/curtain.jpeg")]
|
|
async fn curtain_jpeg() -> impl Responder {
|
|
let curtain = include_bytes!("./curtain.jpeg");
|
|
|
|
let curtain = actix_web::web::Bytes::from_static(curtain);
|
|
|
|
HttpResponse::Ok().content_type("image/jpeg").body(curtain)
|
|
}
|
|
|
|
#[get("/")]
|
|
async fn open_get() -> impl Responder {
|
|
let open = include_str!("./open.html");
|
|
|
|
HttpResponse::Ok()
|
|
.content_type("text/html; charset=utf-8")
|
|
.body(open)
|
|
}
|
|
|
|
fn services(cfg: &mut ServiceConfig) {
|
|
cfg.service(reset_get);
|
|
cfg.service(reset_post);
|
|
cfg.service(curtain_jpeg);
|
|
cfg.service(open_get);
|
|
cfg.service(open_post);
|
|
}
|
|
|
|
#[actix_web::main] // or #[tokio::main]
|
|
async fn main() -> std::io::Result<()> {
|
|
if std::env::var("RUST_LOG").is_err() {
|
|
std::env::set_var("RUST_LOG", "info");
|
|
}
|
|
|
|
pretty_env_logger::init();
|
|
|
|
let args = Args::parse();
|
|
|
|
info!("Starting server with {args}");
|
|
|
|
let data = web::Data::new(args.clone());
|
|
HttpServer::new(move || App::new().app_data(data.clone()).configure(services))
|
|
.bind(("127.0.0.1", args.port))?
|
|
.run()
|
|
.await
|
|
}
|