website/src/main.rs
2023-06-13 17:33:21 -04:00

187 lines
No EOL
8.5 KiB
Rust

#![recursion_limit = "1024"]
use std::env::args;
use std::fs;
use crate::config::{ListgenConfig, ListgenConfigServerOwnership};
use typed_html::{html, text};
use typed_html::dom::DOMTree;
pub mod config;
fn main() {
let config_file;
if args().len() != 1 {
println!("[e3t-listgen] no config file provided, defaulting to listing.yaml");
config_file = "listing.yaml".to_string();
} else {
let args = args().collect::<Vec<_>>();
config_file = args[0].clone();
}
println!("[e3t-listgen] loading config from {}", config_file);
let config_str = match fs::read_to_string(config_file) {
Ok(s) => s,
Err(e) => {
eprintln!("[e3t-listgen] unable to load config: {}", e);
std::process::exit(1);
}
};
println!("[e3t-listgen] parsing configuration");
let config: ListgenConfig = match serde_yaml::from_str(&config_str) {
Ok(s) => s,
Err(e) => {
eprintln!("[e3t-listgen] unable to parse config: {}", e);
std::process::exit(1);
}
};
println!("[e3t-listgen] building servers.html");
let servers_html_text = generate_servershtml(&config);
println!("[e3t-listgen] building services.html");
let services_html_text = generate_serviceslist(&config);
println!("[e3t-listgen] writing servers.html");
match fs::write("servers.html", servers_html_text) {
Ok(s) => s,
Err(e) => {
eprintln!("[e3t-listgen] unable to write servers.html: {}", e);
std::process::exit(1);
}
}
println!("[e3t-listgen] writing services.html");
match fs::write("services.html", services_html_text) {
Ok(s) => s,
Err(e) => {
eprintln!("[e3t-listgen] unable to write services.html: {}", e);
std::process::exit(1);
}
}
}
fn generate_servershtml(config: &ListgenConfig) -> String {
let html: DOMTree<String> = html!(
<html>
<head>
<title>"e3team Servers"</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<link rel="stylesheet" href="nav.css" />
</head>
<body>
<div id="nav">
<div class="nav-section">
<span>"Navigation"</span>
<a class="nav-item" href="/">"About"</a>
<a class="nav-item" href="services.html">"Services"</a>
<a class="nav-item" href="servers.html">"Machines"</a>
</div>
<div class="nav-section">
<span>"another entry"</span>
<a class="nav-item" href="example">"example"</a>
</div>
</div>
<div id="main">
<h1>"e3team-owned servers"</h1>
<p>"e3team owns and controls several servers around the globe. Following is a list of them all:"</p>
<table style="border: 1px solid;">
<tr>
<th style="border: 1px solid;">"Hostname"</th>
<th style="border: 1px solid;">"Public?"</th>
<th style="border: 1px solid;">"Public IP"</th>
<th style="border: 1px solid;">"Edge?"</th>
<th style="border: 1px solid;">"Domain Name"</th>
<th style="border: 1px solid;">"Ownership"</th>
<th style="border: 1px solid;">"Country"</th>
<th style="border: 1px solid;">"Region"</th>
<th style="border: 1px solid;">"Primary Admin(s)"</th>
</tr>
{ config.servers.iter().map(|u| {
html! (
<tr>
<td style="border: 1px solid;">{ text!("{}", u.hostname) }</td>
<td style="border: 1px solid;">{ text!("{}", if u.public { "Yes" } else { "No" }) }</td>
<td style="border: 1px solid;">{ text!("{}", if let Some(ips) = &u.public_ips { ips.iter().map(|u| u.to_string()).collect::<Vec<_>>().join(", ") } else { "N/A".into() } ) }</td>
<td style="border: 1px solid;">{ text!("{}", if u.edge { "Yes" } else { "No" }) }</td>
<td style="border: 1px solid;">{ text!("{}", if let Some(domain) = &u.domain { domain.as_str() } else { "N/A" }) }</td>
<td style="border: 1px solid;">{ text!("{}", if matches!(u.ownership, ListgenConfigServerOwnership::Rented) { "Rented" } else { "Owned" }) }</td>
<td style="border: 1px solid;">{ text!("{}", u.country ) }</td>
<td style="border: 1px solid;">{ text!("{}", u.region ) }</td>
<td style="border: 1px solid;">{ text!("{}", u.admins.join(", ")) }</td>
</tr>
)
})}
</table>
<p>"Generated automatically by e3t-listgen from "<a href="listing.yaml">"listing.yaml"</a>"."</p>
<a href="services.html">"View our services list"</a>
</div>
</body>
</html>
);
html.to_string()
}
fn generate_serviceslist(config: &ListgenConfig) -> String {
let html: DOMTree<String> = html!(
<html>
<head>
<title>"e3team Services"</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<link rel="stylesheet" href="nav.css" />
</head>
<body>
<div id="nav">
<div class="nav-section">
<span>"Navigation"</span>
<a class="nav-item" href="/">"About"</a>
<a class="nav-item" href="services.html">"Services"</a>
<a class="nav-item" href="servers.html">"Machines"</a>
</div>
<div class="nav-section">
<span>"another entry"</span>
<a class="nav-item" href="example">"example"</a>
</div>
</div>
<div id="main">
<h1>"e3team-hosted servers"</h1>
<p>"e3team hosts many services on it's servers around the globe. Many are public. Following is a list of them all:"</p>
<table style="border: 1px solid;">
<tr>
<th style="border: 1px solid;">"Name"</th>
<th style="border: 1px solid;">"Software"</th>
<th style="border: 1px solid;">"Public?"</th>
<th style="border: 1px solid;">"Public URL"</th>
<th style="border: 1px solid;">"Hosted On"</th>
<th style="border: 1px solid;">"Backed Up"</th>
<th style="border: 1px solid;">"Primary Admin(s)"</th>
</tr>
{ config.services.iter().map(|u| {
html! (
<tr>
<td style="border: 1px solid;">{ text!("{}", u.name) }</td>
<td style="border: 1px solid;">{ text!("{}", u.software) }</td>
<td style="border: 1px solid;">{ text!("{}", if u.public { "Yes" } else { "No" }) }</td>
<td style="border: 1px solid;">{ text!("{}", u.url ) }</td>
<td style="border: 1px solid;">{ text!("{}", u.host) }</td>
<td style="border: 1px solid;">{ text!("{}", u.backups ) }</td>
<td style="border: 1px solid;">{ text!("{}", u.admins.join(", ")) }</td>
</tr>
)
})}
</table>
<p>"Generated automatically by e3t-listgen from "<a href="listing.yaml">"listing.yaml"</a>"."</p>
<a href="servers.html">"View our server list"</a>
</div>
</body>
</html>
);
html.to_string()
}