187 lines
No EOL
8.5 KiB
Rust
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()
|
|
} |