added homelab page

This commit is contained in:
Chad Baxter 2024-01-09 00:33:51 -05:00
commit a261c71fea
No known key found for this signature in database
GPG key ID: FE5FA57E02944FB5
35 changed files with 2230 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/target

1309
Cargo.lock generated Normal file

File diff suppressed because it is too large Load diff

16
Cargo.toml Normal file
View 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
View 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
View 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

File diff suppressed because one or more lines are too long

1
static/css/spectre-icons.min.css vendored Normal file

File diff suppressed because one or more lines are too long

1
static/css/spectre.min.css vendored Normal file

File diff suppressed because one or more lines are too long

89
static/css/starground.css Normal file

File diff suppressed because one or more lines are too long

165
static/css/styles.css Normal file
View 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
View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
static/img/adryd.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

BIN
static/img/archbtw.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

46
static/img/blog.svg Normal file
View 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_" />&#10;<style
type="text/css"
id="style1">&#10;<![CDATA[
.st0{fill:#000000;}
]]>&#10;</style>&#10;<g
id="g2"
style="fill:#ededed;fill-opacity:1">&#10; <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" />&#10; <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" />&#10;</g>&#10;</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
static/img/cbax.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 B

BIN
static/img/eva.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

57
static/img/github.svg Normal file
View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 441 B

BIN
static/img/kofi.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
static/img/mat.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
static/img/neovim.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 695 B

BIN
static/img/notnite.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
static/img/rack-min.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 521 KiB

BIN
static/img/rack.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 MiB

BIN
static/img/shwecky.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
static/img/ssi.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

BIN
static/img/ublockorigin.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5 KiB

View 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';
}

View 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

Binary file not shown.

BIN
static/woff/im.woff2 Normal file

Binary file not shown.

BIN
static/woff/sf.woff Normal file

Binary file not shown.

128
templates/homelab.html Normal file
View 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
View 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&nbsp;.&nbsp;&nbsp;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>