added homelab page
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/target
|
1309
Cargo.lock
generated
Normal file
16
Cargo.toml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
[package]
|
||||||
|
name = "cbax_dev"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
askama = { version = "0.12.1", features = ["with-axum"] }
|
||||||
|
askama_axum = "0.4.0"
|
||||||
|
axum = "0.7.2"
|
||||||
|
tokio = { version = "1.34.0", features = ["full"] }
|
||||||
|
tower = "0.4.13"
|
||||||
|
tower-http = { version = "0.5.0", features = ["full"] }
|
||||||
|
tracing = "0.1.40"
|
||||||
|
tracing-subscriber = { version = "0.3.18", features = ["env-filter"] }
|
90
src/main.rs
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
use std::io::prelude::*;
|
||||||
|
use std::fs::File;
|
||||||
|
|
||||||
|
use askama::Template;
|
||||||
|
use axum::{
|
||||||
|
http::StatusCode,
|
||||||
|
response::{Html, IntoResponse, Response},
|
||||||
|
routing::get,
|
||||||
|
Router,
|
||||||
|
};
|
||||||
|
use tower::ServiceBuilder;
|
||||||
|
use tower_http::services::ServeDir;
|
||||||
|
use tower_http::trace::TraceLayer;
|
||||||
|
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
|
||||||
|
|
||||||
|
#[derive(Template)]
|
||||||
|
#[template(path = "index.html", escape = "none")]
|
||||||
|
struct IndexTemplate {
|
||||||
|
styles: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Template)]
|
||||||
|
#[template(path = "homelab.html", escape = "none")]
|
||||||
|
struct HomelabTemplate {
|
||||||
|
styles: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct HtmlTemplate<T>(T);
|
||||||
|
|
||||||
|
impl<T> IntoResponse for HtmlTemplate<T>
|
||||||
|
where
|
||||||
|
T: Template,
|
||||||
|
{
|
||||||
|
fn into_response(self) -> Response {
|
||||||
|
match self.0.render() {
|
||||||
|
Ok(html) => Html(html).into_response(),
|
||||||
|
Err(err) => (
|
||||||
|
StatusCode::INTERNAL_SERVER_ERROR,
|
||||||
|
format!("Failed to render template. Error: {err}"),
|
||||||
|
)
|
||||||
|
.into_response(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn homelab() -> impl IntoResponse {
|
||||||
|
let mut styles_file = File::open("static/css/styles.css").expect("Failed to open stylesheet.");
|
||||||
|
let mut styles = String::new();
|
||||||
|
styles_file.read_to_string(&mut styles).expect("Failed to read stylesheet.");
|
||||||
|
let template = HomelabTemplate { styles };
|
||||||
|
HtmlTemplate(template)
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn index() -> impl IntoResponse {
|
||||||
|
let mut styles_file = File::open("static/css/styles.css").expect("Failed to open stylesheet.");
|
||||||
|
let mut styles = String::new();
|
||||||
|
styles_file.read_to_string(&mut styles).expect("Failed to read stylesheet.");
|
||||||
|
let template = IndexTemplate { styles };
|
||||||
|
HtmlTemplate(template)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serve_dir() -> Router {
|
||||||
|
// serve the file in the "assets" directory under `/assets`
|
||||||
|
Router::new().nest_service("/res", ServeDir::new("static"))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() {
|
||||||
|
tracing_subscriber::registry()
|
||||||
|
.with(
|
||||||
|
tracing_subscriber::EnvFilter::try_from_default_env()
|
||||||
|
.unwrap_or_else(|_| "example_templates=debug".into()),
|
||||||
|
)
|
||||||
|
.with(tracing_subscriber::fmt::layer())
|
||||||
|
.init();
|
||||||
|
|
||||||
|
// build our application with some routes
|
||||||
|
let app = Router::new()
|
||||||
|
.route("/", get(index))
|
||||||
|
.route("/homelab", get(homelab))
|
||||||
|
.fallback_service(serve_dir())
|
||||||
|
.layer(ServiceBuilder::new().layer(TraceLayer::new_for_http()));
|
||||||
|
|
||||||
|
// run it
|
||||||
|
let listener = tokio::net::TcpListener::bind("127.0.0.1:7654")
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
tracing::debug!("listening on {}", listener.local_addr().unwrap());
|
||||||
|
axum::serve(listener, app).await.unwrap();
|
||||||
|
}
|
24
src/templating.rs.old
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
use log::debug;
|
||||||
|
use pug::parse;
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::prelude::*;
|
||||||
|
use std::io::{BufReader, BufWriter};
|
||||||
|
|
||||||
|
pub fn render(path: &str) -> String {
|
||||||
|
match File::open(path) {
|
||||||
|
Ok(file_handle) => {
|
||||||
|
let mut reader = BufReader::new(file_handle);
|
||||||
|
let mut template = String::new();
|
||||||
|
let _ = reader.read_to_string(&mut template);
|
||||||
|
let mut writer = BufWriter::new(Vec::new());
|
||||||
|
parse(template).unwrap().to_html(&mut writer).unwrap();
|
||||||
|
let bytes = writer.into_inner().unwrap();
|
||||||
|
|
||||||
|
return String::from_utf8(bytes).unwrap();
|
||||||
|
}
|
||||||
|
Err(_e) => {
|
||||||
|
debug!("Failed to open template file: {}", _e);
|
||||||
|
return String::new();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
1
static/css/spectre-exp.min.css
vendored
Normal file
1
static/css/spectre-icons.min.css
vendored
Normal file
1
static/css/spectre.min.css
vendored
Normal file
89
static/css/starground.css
Normal file
165
static/css/styles.css
Normal file
|
@ -0,0 +1,165 @@
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Intel One Mono Regular';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: normal;
|
||||||
|
src: local('Intel One Mono Regular'), url('/res/woff/im.woff2') format('woff2');
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Sans Forgetica Regular';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: normal;
|
||||||
|
src: local('Sans Forgetica Regular'), url('/res/woff/sf.woff') format('woff');
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
background: #00fcff;
|
||||||
|
padding: 0px;
|
||||||
|
margin: 0px;
|
||||||
|
font-family: 'Intel One Mono Regular';
|
||||||
|
color: #ededed;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-family: 'Sans Forgetica Regular';
|
||||||
|
font-size: 4em;
|
||||||
|
color: #00fcff;
|
||||||
|
text-shadow: #ededed 3px -3px;
|
||||||
|
margin-top: 2svh;
|
||||||
|
margin-bottom: 2svh;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vl {
|
||||||
|
border-left: 1px solid #ededed;
|
||||||
|
border-right: 1px solid #ededed;
|
||||||
|
margin-left: 1ch;
|
||||||
|
margin-right: 1ch;
|
||||||
|
height: 4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
width: 4rem;
|
||||||
|
height: 4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
display: flex;
|
||||||
|
flex-flow: column;
|
||||||
|
height: 100svh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.links {
|
||||||
|
display: flex
|
||||||
|
}
|
||||||
|
|
||||||
|
figure {
|
||||||
|
display: inline-block;
|
||||||
|
margin: 20px; /* adjust as needed */
|
||||||
|
}
|
||||||
|
figure img {
|
||||||
|
width: 10vw;
|
||||||
|
height: auto;
|
||||||
|
border-radius: 20px;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
figure figcaption {
|
||||||
|
width: 10vw;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
border-radius: 20px;
|
||||||
|
margin-top: 1svh;
|
||||||
|
margin-left: 1svh;
|
||||||
|
margin-right: 1svh;
|
||||||
|
margin-bottom: 1svh;
|
||||||
|
padding: 1svh;
|
||||||
|
/*height: 78svh;*/
|
||||||
|
background: #3c3c3c;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.article {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 1vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
flex: 0 1 15svh;
|
||||||
|
border-radius: 20px;
|
||||||
|
margin-left: 1svh;
|
||||||
|
margin-right: 1svh;
|
||||||
|
margin-bottom: 1svh;
|
||||||
|
padding: 1svh;
|
||||||
|
background: #3c3c3c;
|
||||||
|
display: flex;
|
||||||
|
/*height: 15svh;
|
||||||
|
min-height: 32px;*/
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #ededed;
|
||||||
|
text-decoration: underline #00fcff;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:visited {
|
||||||
|
color: #444;
|
||||||
|
text-decoration: underline #00fcff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fancy {
|
||||||
|
background-image: linear-gradient(
|
||||||
|
to right,
|
||||||
|
#00fcff,
|
||||||
|
#00fcff 50%,
|
||||||
|
#ededed 50%
|
||||||
|
);
|
||||||
|
text-decoration: underline #00fcff;
|
||||||
|
background-size: 200% 100%;
|
||||||
|
background-position: -100%;
|
||||||
|
display: inline-block;
|
||||||
|
padding: 5px 0;
|
||||||
|
position: relative;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
transition: all 0.3s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fancy:before {
|
||||||
|
content: '';
|
||||||
|
background: #00fcff;
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
bottom: -3px;
|
||||||
|
left: 0;
|
||||||
|
width: 0;
|
||||||
|
height: 3px;
|
||||||
|
transition: all 0.3s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fancy:hover {
|
||||||
|
background-position: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fancy:hover::before {
|
||||||
|
width: 100%;
|
||||||
|
}
|
137
static/epstein_bingo.html
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Epstein Bingo</title>
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--nomap-1: #5a9ecf;
|
||||||
|
--nomap-2: #9cd2dc;
|
||||||
|
--nomap-3: #f4f58d;
|
||||||
|
--nomap-4: #ffb6c1;
|
||||||
|
--nomap-5: #cb5c7d;
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Comfortaa Bold';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: bold;
|
||||||
|
src: local('Comfortaa Bold'), url('/res/woff/cfa-b.woff') format('woff');
|
||||||
|
}
|
||||||
|
td:nth-child(0n + 1) {
|
||||||
|
background-color: var(--nomap-1);
|
||||||
|
}
|
||||||
|
td:nth-child(0n + 2) {
|
||||||
|
background-color: var(--nomap-2);
|
||||||
|
}
|
||||||
|
td:nth-child(0n + 3) {
|
||||||
|
background-color: var(--nomap-3);
|
||||||
|
}
|
||||||
|
td:nth-child(0n + 4) {
|
||||||
|
background-color: var(--nomap-4);
|
||||||
|
}
|
||||||
|
td:nth-child(0n + 5) {
|
||||||
|
background-color: var(--nomap-5);
|
||||||
|
}
|
||||||
|
th:nth-child(0n + 1) {
|
||||||
|
color: var(--nomap-1);
|
||||||
|
}
|
||||||
|
th:nth-child(0n + 2) {
|
||||||
|
color: var(--nomap-2);
|
||||||
|
}
|
||||||
|
th:nth-child(0n + 3) {
|
||||||
|
color: var(--nomap-3);
|
||||||
|
}
|
||||||
|
th:nth-child(0n + 4) {
|
||||||
|
color: var(--nomap-4);
|
||||||
|
}
|
||||||
|
th:nth-child(0n + 5) {
|
||||||
|
color: var(--nomap-5);
|
||||||
|
}
|
||||||
|
th {
|
||||||
|
background-color: #000;
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
td {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
margin-top: 1em;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
table {
|
||||||
|
border: 1em solid;
|
||||||
|
border-radius: 25px;
|
||||||
|
text-align: center;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
.tile {
|
||||||
|
font-weight: bold;
|
||||||
|
width: 10vw;
|
||||||
|
height: 10vh;
|
||||||
|
text-align: center;
|
||||||
|
text-shadow: #888 2px 2px;
|
||||||
|
font-size: 2em;
|
||||||
|
display: table-cell;
|
||||||
|
vertical-align: middle;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.free {
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
button {
|
||||||
|
display: block;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
font-family: "Comfortaa Bold";
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script src="/res/js/epstein_bingo.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Epstein Bingo</h1>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>P</th>
|
||||||
|
<th>E</th>
|
||||||
|
<th>D</th>
|
||||||
|
<th>O</th>
|
||||||
|
<th>S</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
<td><div class="tile free" onclick=selected(this)>Bill Clinton</div></td>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
<td><div class="tile" onclick=selected(this)></div></td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
BIN
static/img/abc.gif
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
static/img/adryd.png
Normal file
After Width: | Height: | Size: 878 B |
BIN
static/img/archbtw.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
46
static/img/blog.svg
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
version="1.1"
|
||||||
|
id="_x32_"
|
||||||
|
width="800px"
|
||||||
|
height="800px"
|
||||||
|
viewBox="0 0 512 512"
|
||||||
|
xml:space="preserve"
|
||||||
|
sodipodi:docname="blog.svg"
|
||||||
|
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||||
|
id="defs2" /><sodipodi:namedview
|
||||||
|
id="namedview2"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#999999"
|
||||||
|
borderopacity="1"
|
||||||
|
inkscape:showpageshadow="0"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:zoom="1.02125"
|
||||||
|
inkscape:cx="400"
|
||||||
|
inkscape:cy="400"
|
||||||
|
inkscape:window-width="2554"
|
||||||
|
inkscape:window-height="1054"
|
||||||
|
inkscape:window-x="2"
|
||||||
|
inkscape:window-y="22"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="_x32_" /> <style
|
||||||
|
type="text/css"
|
||||||
|
id="style1"> <![CDATA[
|
||||||
|
.st0{fill:#000000;}
|
||||||
|
]]> </style> <g
|
||||||
|
id="g2"
|
||||||
|
style="fill:#ededed;fill-opacity:1"> <path
|
||||||
|
class="st0"
|
||||||
|
d="M421.073,221.719c-0.578,11.719-9.469,26.188-23.797,40.094v183.25c-0.016,4.719-1.875,8.719-5.016,11.844 c-3.156,3.063-7.25,4.875-12.063,4.906H81.558c-4.781-0.031-8.891-1.844-12.047-4.906c-3.141-3.125-4.984-7.125-5-11.844V152.219 c0.016-4.703,1.859-8.719,5-11.844c3.156-3.063,7.266-4.875,12.047-4.906h158.609c12.828-16.844,27.781-34.094,44.719-49.906 c0.078-0.094,0.141-0.188,0.219-0.281H81.558c-18.75-0.016-35.984,7.531-48.25,19.594c-12.328,12.063-20.016,28.938-20,47.344 v292.844c-0.016,18.406,7.672,35.313,20,47.344C45.573,504.469,62.808,512,81.558,512h298.641c18.781,0,36.016-7.531,48.281-19.594 c12.297-12.031,20-28.938,19.984-47.344V203.469c0,0-0.125-0.156-0.328-0.313C440.37,209.813,431.323,216.156,421.073,221.719z"
|
||||||
|
id="path1"
|
||||||
|
style="fill:#ededed;fill-opacity:1" /> <path
|
||||||
|
class="st0"
|
||||||
|
d="M498.058,0c0,0-15.688,23.438-118.156,58.109C275.417,93.469,211.104,237.313,211.104,237.313 c-15.484,29.469-76.688,151.906-76.688,151.906c-16.859,31.625,14.031,50.313,32.156,17.656 c34.734-62.688,57.156-119.969,109.969-121.594c77.047-2.375,129.734-69.656,113.156-66.531c-21.813,9.5-69.906,0.719-41.578-3.656 c68-5.453,109.906-56.563,96.25-60.031c-24.109,9.281-46.594,0.469-51-2.188C513.386,138.281,498.058,0,498.058,0z"
|
||||||
|
id="path2"
|
||||||
|
style="fill:#ededed;fill-opacity:1" /> </g> </svg>
|
After Width: | Height: | Size: 2.4 KiB |
BIN
static/img/cbax.gif
Normal file
After Width: | Height: | Size: 367 B |
BIN
static/img/eva.gif
Normal file
After Width: | Height: | Size: 14 KiB |
57
static/img/github.svg
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="800px"
|
||||||
|
height="800px"
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
version="1.1"
|
||||||
|
id="svg1"
|
||||||
|
sodipodi:docname="github.svg"
|
||||||
|
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview1"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#999999"
|
||||||
|
borderopacity="1"
|
||||||
|
inkscape:showpageshadow="0"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:zoom="1.02125"
|
||||||
|
inkscape:cx="400"
|
||||||
|
inkscape:cy="400"
|
||||||
|
inkscape:window-width="2554"
|
||||||
|
inkscape:window-height="1054"
|
||||||
|
inkscape:window-x="2"
|
||||||
|
inkscape:window-y="22"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg1" />
|
||||||
|
<defs
|
||||||
|
id="defs1" />
|
||||||
|
<g
|
||||||
|
id="Page-1"
|
||||||
|
stroke="none"
|
||||||
|
stroke-width="1"
|
||||||
|
fill="none"
|
||||||
|
fill-rule="evenodd"
|
||||||
|
style="fill:#ededed;fill-opacity:1">
|
||||||
|
<g
|
||||||
|
id="Dribbble-Light-Preview"
|
||||||
|
transform="translate(-140.000000, -7559.000000)"
|
||||||
|
fill="#000000"
|
||||||
|
style="fill:#ededed;fill-opacity:1">
|
||||||
|
<g
|
||||||
|
id="icons"
|
||||||
|
transform="translate(56.000000, 160.000000)"
|
||||||
|
style="fill:#ededed;fill-opacity:1">
|
||||||
|
<path
|
||||||
|
d="M94,7399 C99.523,7399 104,7403.59 104,7409.253 C104,7413.782 101.138,7417.624 97.167,7418.981 C96.66,7419.082 96.48,7418.762 96.48,7418.489 C96.48,7418.151 96.492,7417.047 96.492,7415.675 C96.492,7414.719 96.172,7414.095 95.813,7413.777 C98.04,7413.523 100.38,7412.656 100.38,7408.718 C100.38,7407.598 99.992,7406.684 99.35,7405.966 C99.454,7405.707 99.797,7404.664 99.252,7403.252 C99.252,7403.252 98.414,7402.977 96.505,7404.303 C95.706,7404.076 94.85,7403.962 94,7403.958 C93.15,7403.962 92.295,7404.076 91.497,7404.303 C89.586,7402.977 88.746,7403.252 88.746,7403.252 C88.203,7404.664 88.546,7405.707 88.649,7405.966 C88.01,7406.684 87.619,7407.598 87.619,7408.718 C87.619,7412.646 89.954,7413.526 92.175,7413.785 C91.889,7414.041 91.63,7414.493 91.54,7415.156 C90.97,7415.418 89.522,7415.871 88.63,7414.304 C88.63,7414.304 88.101,7413.319 87.097,7413.247 C87.097,7413.247 86.122,7413.234 87.029,7413.87 C87.029,7413.87 87.684,7414.185 88.139,7415.37 C88.139,7415.37 88.726,7417.2 91.508,7416.58 C91.513,7417.437 91.522,7418.245 91.522,7418.489 C91.522,7418.76 91.338,7419.077 90.839,7418.982 C86.865,7417.627 84,7413.783 84,7409.253 C84,7403.59 88.478,7399 94,7399"
|
||||||
|
id="github-[#142]"
|
||||||
|
style="fill:#ededed;fill-opacity:1" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.7 KiB |
BIN
static/img/honbra.png
Normal file
After Width: | Height: | Size: 441 B |
BIN
static/img/kofi.gif
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
static/img/mat.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
static/img/neovim.gif
Normal file
After Width: | Height: | Size: 695 B |
BIN
static/img/notnite.gif
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
static/img/rack-min.jpg
Normal file
After Width: | Height: | Size: 521 KiB |
BIN
static/img/rack.jpg
Normal file
After Width: | Height: | Size: 4.9 MiB |
BIN
static/img/shwecky.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
static/img/ssi.gif
Normal file
After Width: | Height: | Size: 92 KiB |
BIN
static/img/ublockorigin.png
Normal file
After Width: | Height: | Size: 5 KiB |
19
static/js/epstein_bingo.js
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
window.addEventListener("load", (event) => {
|
||||||
|
const names = ["James Gunn", "Ben Affleck", "Bill Cosby", "Hillary Clinton", "Rey Emerito", "Beyonce", "James Franco", "Elon Musk", "Donald Trump", "Bill Gates", "Madonna", "John Travolta", "Charles III", "Eminem", "Bruce Willis", "Joe Biden", "George Clooney", "Quentin Tarantino", "Obama", "Bernie Sanders", "Steven Spielberg", "Tom Hanks", "Justin Roiland", "Justin Trudeau", "Angelina Jolie", "Taylor Swift", "George Lopez", "George Lucas", "Steve Huffman", "Mark Zuckerberg", "R. Kelly", "Stephen Hawking", "Prince Andrew", "Alan Dershowitz"];
|
||||||
|
shuffleArray(names);
|
||||||
|
const tiles = document.getElementsByClassName("tile");
|
||||||
|
for(i=0; i<tiles.length; i++) {
|
||||||
|
if (!tiles[i].classList.contains("free")) {
|
||||||
|
tiles[i].innerText = names[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
function shuffleArray(array) {
|
||||||
|
for (let i = array.length - 1; i > 0; i--) {
|
||||||
|
const j = Math.floor(Math.random() * (i + 1));
|
||||||
|
[array[i], array[j]] = [array[j], array[i]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function selected(item) {
|
||||||
|
item.style.backgroundColor = '#000';
|
||||||
|
}
|
95
static/sass/starground.sass
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
@import compass
|
||||||
|
|
||||||
|
|
||||||
|
// n is number of stars required
|
||||||
|
@function multiple-box-shadow ($n)
|
||||||
|
$value: '#{random(2000)}px #{random(2000)}px #FFF'
|
||||||
|
@for $i from 2 through $n
|
||||||
|
$value: '#{$value} , #{random(2000)}px #{random(2000)}px #FFF'
|
||||||
|
|
||||||
|
@return unquote($value)
|
||||||
|
|
||||||
|
$shadows-small: multiple-box-shadow(700)
|
||||||
|
$shadows-medium: multiple-box-shadow(200)
|
||||||
|
$shadows-big: multiple-box-shadow(100)
|
||||||
|
|
||||||
|
html
|
||||||
|
height: 100%
|
||||||
|
background: radial-gradient(ellipse at bottom, #1B2735 0%, #090A0F 100%)
|
||||||
|
overflow: hidden
|
||||||
|
|
||||||
|
#stars
|
||||||
|
width: 1px
|
||||||
|
height: 1px
|
||||||
|
background: transparent
|
||||||
|
box-shadow: $shadows-small
|
||||||
|
animation : animStar 50s linear infinite
|
||||||
|
|
||||||
|
&:after
|
||||||
|
content: " "
|
||||||
|
position: absolute
|
||||||
|
top: 2000px
|
||||||
|
width: 1px
|
||||||
|
height: 1px
|
||||||
|
background: transparent
|
||||||
|
box-shadow: $shadows-small
|
||||||
|
|
||||||
|
#stars2
|
||||||
|
width: 2px
|
||||||
|
height: 2px
|
||||||
|
background: transparent
|
||||||
|
box-shadow: $shadows-medium
|
||||||
|
animation : animStar 100s linear infinite
|
||||||
|
|
||||||
|
&:after
|
||||||
|
content: " "
|
||||||
|
position: absolute
|
||||||
|
top: 2000px
|
||||||
|
width: 2px
|
||||||
|
height: 2px
|
||||||
|
background: transparent
|
||||||
|
box-shadow: $shadows-medium
|
||||||
|
|
||||||
|
#stars3
|
||||||
|
width: 3px
|
||||||
|
height: 3px
|
||||||
|
background: transparent
|
||||||
|
box-shadow: $shadows-big
|
||||||
|
animation : animStar 150s linear infinite
|
||||||
|
|
||||||
|
&:after
|
||||||
|
content: " "
|
||||||
|
position: absolute
|
||||||
|
top: 2000px
|
||||||
|
width: 3px
|
||||||
|
height: 3px
|
||||||
|
background: transparent
|
||||||
|
box-shadow: $shadows-big
|
||||||
|
|
||||||
|
#title
|
||||||
|
position: absolute
|
||||||
|
top: 50%
|
||||||
|
left: 0
|
||||||
|
right: 0
|
||||||
|
|
||||||
|
color: #FFF
|
||||||
|
text-align: center
|
||||||
|
font-family: 'lato',sans-serif
|
||||||
|
font-weight: 300
|
||||||
|
font-size: 50px
|
||||||
|
letter-spacing: 10px
|
||||||
|
|
||||||
|
margin-top: -60px
|
||||||
|
padding-left: 10px
|
||||||
|
|
||||||
|
span
|
||||||
|
background: -webkit-linear-gradient(white, #38495a)
|
||||||
|
-webkit-background-clip: text
|
||||||
|
-webkit-text-fill-color: transparent
|
||||||
|
|
||||||
|
@keyframes animStar
|
||||||
|
from
|
||||||
|
transform: translateY(0px)
|
||||||
|
to
|
||||||
|
transform: translateY(-2000px)
|
||||||
|
|
BIN
static/woff/cfa-b.woff
Normal file
BIN
static/woff/im.woff2
Normal file
BIN
static/woff/sf.woff
Normal file
128
templates/homelab.html
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>CBAX dot DEV - Homelab</title>
|
||||||
|
<style>
|
||||||
|
{{styles}}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="main">
|
||||||
|
<div id="card">
|
||||||
|
<h1>Homelab</h1>
|
||||||
|
<div class="article">
|
||||||
|
<div>
|
||||||
|
<figure>
|
||||||
|
<a href="/res/img/rack.jpg"><img src="/res/img/rack-min.jpg"/></a>
|
||||||
|
<figcaption>click to enlarge</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<p>The rack consists of the following devices:</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
Dell PowerEdge T610 (Alpine)
|
||||||
|
<ul>
|
||||||
|
<li>RAID Controller</li>
|
||||||
|
<li>Print Server</li>
|
||||||
|
<li><a class="fancy" href="//github.com/mrcbax/ReimageVideoControl">RDU1502 Controller</a></li>
|
||||||
|
<li>Kubernetes Controller</li>
|
||||||
|
<li>General Purpose</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Dell PowerEdge R610 (PFSense/FreeBSD)
|
||||||
|
<ul>
|
||||||
|
<li>PFSense Router</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Dell PowerEdge R630 (Proxmox/Debian)
|
||||||
|
<ul>
|
||||||
|
<li>Proxmox Host</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Dell PowerEdge 2850 (Debian)
|
||||||
|
<ul>
|
||||||
|
<li>Space-heater (unused)</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Shiva LanRover
|
||||||
|
<ul>
|
||||||
|
<li>Dial-In Server</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Netgear CM1200
|
||||||
|
<ul>
|
||||||
|
<li>LAGG Connection</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Obihai OBi508vs
|
||||||
|
<ul>
|
||||||
|
<li>SIP Client</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Mac Mini PowerPC G3 (ArchLinux)
|
||||||
|
<ul>
|
||||||
|
<li>Certificate Authority</li>
|
||||||
|
<li>Secure Compute Environment</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
4x Raspberry Pi
|
||||||
|
<ul>
|
||||||
|
<li>Kubernetes Cluster Member</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
ImageVideo RDU1502
|
||||||
|
<ul>
|
||||||
|
<li><a class="fancy" href="//github.com/mrcbax/ReimageVideo">Custom Firmware</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Cisco 2901 Router
|
||||||
|
<ul>
|
||||||
|
<li>Cellular Failover</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Cisco Catalyst 3750-X
|
||||||
|
<ul>
|
||||||
|
<li>Main Switch</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Cisco Catalyst 4948
|
||||||
|
<ul>
|
||||||
|
<li>Cold Failover</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
APC Smart-UPS 3000 RM XL (3000KVA)
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<p>Services hosted:</p>
|
||||||
|
<ul>
|
||||||
|
<li>THIS WEBSITE</li>
|
||||||
|
<li>DosLab Electronics Free Dial-Up: <a class="fancy" href="//dialin.doslabelectronics.com">dialin.doslabelectronics.com</a></li>
|
||||||
|
<li>DosLab Electronics Public Fileshare: <a class="fancy" href="//repo.doslabelectronics.com">repo.doslabelectronics.com</a></li>
|
||||||
|
<li>DosLab Electronics IRC: irc.doslabelectronics.com</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
51
templates/index.html
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>CBAX dot DEV</title>
|
||||||
|
<style>
|
||||||
|
{{styles}}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="main">
|
||||||
|
<div id="card">
|
||||||
|
<span>
|
||||||
|
<h1>cbax ❲. ❳ dev</h1>
|
||||||
|
</span>
|
||||||
|
<br>
|
||||||
|
<hl></hl>
|
||||||
|
<br>
|
||||||
|
<div>
|
||||||
|
<ul>
|
||||||
|
<li>42U homelab owner <a class="fancy" href="/homelab">See Details</a></li>
|
||||||
|
<li>Amateur radio operator</li>
|
||||||
|
<li>AS202239 - 44net member</li>
|
||||||
|
<li>Retro-tech enthusiast</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<span class="links">
|
||||||
|
<a href="//computeco.de"><img class="icon" src="/res/img/blog.svg"/></a><div class="vl"></div><a href="//github.com/mrcbax"><img class="icon" src="/res/img/github.svg"/></a>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<footer>
|
||||||
|
<a href="//cbax.dev"><img src="/res/img/cbax.gif"/></a>
|
||||||
|
<a href="//ssi.fyi"><img src="/res/img/ssi.gif"/></a>
|
||||||
|
<a href="//matdoes.dev"><img src="/res/img/mat.png"/></a>
|
||||||
|
<a href="//adryd.com"><img src="/res/img/adryd.png"/></a>
|
||||||
|
<a href="//kibty.town"><img src="/res/img/eva.gif"/></a>
|
||||||
|
<a href="//shrecked.dev"><img src="/res/img/shwecky.png"/></a>
|
||||||
|
<a href="//honbra.com"><img src="/res/img/honbra.png"/></a>
|
||||||
|
<a href="//notnite.com"><img src="/res/img/notnite.gif"/></a>
|
||||||
|
<a href="//archlinux.org"><img src="/res/img/archbtw.png"/></a>
|
||||||
|
<a href="//neovim.io"><img src="/res/img/neovim.gif"/></a>
|
||||||
|
<a href="//ublockorigin.com"><img src="/res/img/ublockorigin.png"/></a>
|
||||||
|
<a href="//www.mozilla.org/en-US/firefox/new"><img src="/res/img/abc.gif"/></a>
|
||||||
|
<a href="//ko-fi.com/mrcbax"><img src="/res/img/kofi.gif"/></a>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|