This commit is contained in:
anonymous 2025-07-11 21:28:24 +02:00
commit 08fddcd73e
364 changed files with 111462 additions and 0 deletions

View file

@ -0,0 +1,30 @@
namespace PrometheOSWeb
{
internal class Program
{
static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
}
}
}

View file

@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
</Project>

View file

@ -0,0 +1,30 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:38829",
"launchUrl": "index.html",
"sslPort": 0
}
},
"profiles": {
"PrometheOSWeb": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:5190",
"launchUrl": "index.html",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View file

@ -0,0 +1,9 @@
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View file

@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

View file

@ -0,0 +1,30 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<title>PrometheOS</title>
<link rel="icon" type="image/x-icon" href="favicon.ico" />
<link href="pico.css" rel="stylesheet" />
</head>
<body>
<main class="container">
<form>
<h2>PrometheOS: Cerbios INI</h2>
<div>
<span id="content">Please Wait...</span>
</div>
<br />
<div class="grid">
<a role="button" href="javascript:void(0)" onclick="setCerbiosIni()">Save</a>
<a role="button" class="secondary" href="index.html">Back</a>
</div>
<br />
<div>
<b>Copyright 2024 - Team Cerbios + Team Resurgent</b>
</div>
</form>
</main>
<script src="cerbiosini.js"></script>
</body>
</html>

View file

@ -0,0 +1,61 @@
window.onload = function () {
getCerbiosIni();
};
async function getCerbiosIni()
{
await fetch("http://192.168.1.66/api/cerbiosini").then(async response => {
const reader = response.body.getReader();
const decoder = new TextDecoder("utf-8");
let body = '';
while (true)
{
const { done, value } = await reader.read();
if (done)
{
break;
}
const chunk = decoder.decode(value, { stream: true });
body += chunk;
}
let contentBody = "";
contentBody += "<p><div class=\"grid\"><textarea rows=\"40\" cols=\"80\" spellcheck=\"false\" id=\"cerbiosini\">" + body + "</textarea></div></p>";
let content = document.getElementById("content");
content.innerHTML = contentBody;
}).catch(error => {
let content = document.getElementById("content");
content.innerHTML = "Failed to connect."
});
}
async function setCerbiosIni()
{
let content = document.getElementById("cerbiosini");
var data = new FormData();
data.append('body', content.innerText);
await fetch("http://192.168.1.66/api/cerbiosini", {
method: 'POST',
body: data
}).then(response => {
if (response.status == 200) {
window.location.href = "/index.html";
} else {
uploadFailure();
}
}).catch(() => {
uploadFailure()
}
);
}
function uploadFailure() {
alert("Upload failed.");
}

View file

@ -0,0 +1,29 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<title>PrometheOS</title>
<link rel="icon" type="image/x-icon" href="favicon.ico" />
<link href="pico.css" rel="stylesheet" />
</head>
<body>
<main class="container">
<form>
<h2>PrometheOS: Download BIOS</h2>
<div>
<span id="content">Please Wait...</span>
</div>
<br />
<div class="grid">
<a role="button" class="secondary" href="index.html">Back</a>
</div>
<br />
<div>
<b>Copyright 2024 - Team Cerbios + Team Resurgent</b>
</div>
</form>
</main>
<script src="download.js"></script>
</body>
</html>

View file

@ -0,0 +1,37 @@
window.onload = function () {
getBankInfo();
};
async function getBankInfo() {
await fetch("http://192.168.1.66/api/bankinfo.json").then(async response => {
const json = await response.json();
let contentBody = "";
for (let i = 0; i < json.length; i++) {
if (json[i].slots > 0) {
contentBody += "<p><div class=\"grid\"><a role=\"button\" href=\"javascript:void(0)\" onclick=\"downloadBank(" + json[i].id + ", '" + json[i].name + ".bin')\">" + json[i].name + "</a></div></p>";
}
}
let content = document.getElementById("content");
content.innerHTML = contentBody == "" ? "No items found." : contentBody;
}).catch(error => {
let content = document.getElementById("content");
content.innerHTML = "Failed to connect."
});
}
async function downloadBank(id, name)
{
await fetch("http://192.168.1.66/api/downloadbank?" + id).catch(error => {
content.innerHTML = "Failed to connect."
}).then(response => response.blob()).then(blob => {
var url = window.URL.createObjectURL(blob);
var a = document.createElement('a');
a.href = url;
a.download = name;
document.body.appendChild(a);
a.click();
a.remove();
});
}

View file

@ -0,0 +1,37 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<title>PrometheOS</title>
<link rel="icon" type="image/x-icon" href="favicon.ico" />
<link href="pico.css" rel="stylesheet" />
</head>
<body>
<main class="container">
<form>
<h2>PrometheOS</h2>
<div class="grid">
<a role="button" href="download.html">Download BIOS</a>
</div>
<br />
<div class="grid">
<a role="button" href="javascript:void(0)" onclick="downloadEeprom()">Download EEPROM</a>
</div>
<br />
<div class="grid">
<a role="button" href="javascript:void(0)" onclick="downloadPrometheOS()">Download PrometheOS</a>
</div>
<br />
<div class="grid">
<a role="button" class="secondary" href="index.html">Back</a>
</div>
<br />
<div>
<b>Copyright 2024 - Team Cerbios + Team Resurgent</b>
</div>
</form>
</main>
<script src="downloads.js"></script>
</body>
</html>

View file

@ -0,0 +1,27 @@
async function downloadEeprom() {
await fetch("http://192.168.1.66/api/downloadeeprom").catch(error => {
content.innerHTML = "Failed to connect."
}).then(response => response.blob()).then(blob => {
var url = window.URL.createObjectURL(blob);
var a = document.createElement('a');
a.href = url;
a.download = "EEPROM.bin";
document.body.appendChild(a);
a.click();
a.remove();
});
}
async function downloadPrometheOS(id, name) {
await fetch("http://192.168.1.66/api/downloadprom").catch(error => {
content.innerHTML = "Failed to connect."
}).then(response => response.blob()).then(blob => {
var url = window.URL.createObjectURL(blob);
var a = document.createElement('a');
a.href = url;
a.download = "PrometheOS.bin";
document.body.appendChild(a);
a.click();
a.remove();
});
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View file

@ -0,0 +1,56 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<title>PrometheOS</title>
<link rel="icon" type="image/x-icon" href="favicon.ico" />
<link href="pico.css" rel="stylesheet" />
<link href="main.css" rel="stylesheet" />
</head>
<body>
<main class="container">
<form>
<h2>PrometheOS: Flash BIOS</h2>
<label for="file"><b>File:</b></label>
<input type="file" id="file" onchange="refreshFileInfo()" />
<br />
<label for="name"><b>Name:</b></label>
<input class="form-control" type="text" maxlength="40" id="name" />
<br />
<label for="slotsNeeded"><b>Needed Slots:</b></label>
<div id="slotsNeeded">NA</div>
<br />
<label for="freeSlots"><b>Free Slots:</b></label>
<div id="freeSlots">0</div>
<br />
<label for="ledColorButtons"><b>LED Color:</b> <span id="ledColor">Off</span></label>
<div id="ledColorButtons">
<div class="grid">
<button type="button" class="btn-ledoff" onclick="setLedColor(0)">Off</button>
<button type="button" class="btn-ledred" onclick="setLedColor(1)">Red</button>
<button type="button" class="btn-ledgreen" onclick="setLedColor(2)">Green</button>
<button type="button" class="btn-ledyellow" onclick="setLedColor(3)">Yellow</button>
</div>
<div class="grid">
<button type="button" class="btn-ledblue" onclick="setLedColor(4)">Blue</button>
<button type="button" class="btn-ledpurple" onclick="setLedColor(5)">Purple</button>
<button type="button" class="btn-ledturquoise" onclick="setLedColor(6)">Turquoise</button>
<button type="button" class="btn-ledwhite" onclick="setLedColor(7)">White</button>
</div>
</div>
<hr />
<br />
<div class="grid">
<a role="button" disabled id="upload" href="javascript:void(0)" onclick="upload()">Upload</a>
<a role="button" class="secondary" href="index.html">Back</a>
</div>
<br />
<div>
<b>Copyright 2024 - Team Cerbios + Team Resurgent</b>
</div>
</form>
</main>
<script src="flash.js"></script>
</body>
</html>

View file

@ -0,0 +1,129 @@
let ledColorState = 0;
window.onload = function () {
refreshFileInfo();
};
function getFileSize()
{
const file = document.getElementById("file");
if (file.value == "") {
return -1;
}
const fileSize = file.files[0].size;
if (fileSize == 0) {
return -1;
} else if (fileSize % (256 * 1024) != 0) {
return -1;
} else if (fileSize > (1024 * 1024)) {
return -1;
}
return fileSize;
}
async function refreshFileInfo()
{
const file = document.getElementById("file");
if (file.value != "") {
const name = document.getElementById("name");
name.value = file.files[0].name.substring(0, 40);
}
await fetch("http://192.168.1.66/api/freeslots.json").then(async response => {
const json = await response.json();
const freeSlots = document.getElementById("freeSlots");
freeSlots.textContent = json["freeslots"];
const upload = document.getElementById("upload");
const slotsNeeeded = document.getElementById("slotsNeeded");
const fileSize = getFileSize();
if (fileSize < 0) {
upload.setAttribute("disabled", "disabled");
slotsNeeeded.textContent = "NA";
}
else
{
const slotsNeededValue = fileSize / (256 * 1024);
slotsNeeeded.textContent = slotsNeededValue;
if (slotsNeededValue > json["freeslots"]) {
upload.setAttribute("disabled", "disabled");
} else {
upload.removeAttribute("disabled");
}
}
}).catch(error => {
//
});
}
function setLedColor(ledColor)
{
ledColorState = ledColor;
let ledColorText = document.getElementById("ledColor");
switch (ledColor) {
case 1:
ledColorText.textContent = "Red";
break;
case 2:
ledColorText.textContent = "Green";
break;
case 3:
ledColorText.textContent = "Yellow";
break;
case 4:
ledColorText.textContent = "Blue";
break;
case 5:
ledColorText.textContent = "Purple";
break;
case 6:
ledColorText.textContent = "Turquoise";
break;
case 7:
ledColorText.textContent = "White";
break;
default:
ledColorText.textContent = "Off";
}
}
async function upload()
{
const upload = document.getElementById("upload");
upload.setAttribute("disabled", "disabled");
const file = document.getElementById("file");
file.setAttribute("disabled", "disabled");
const name = document.getElementById("name");
var data = new FormData();
data.append('file', file.files[0]);
data.append('body', "{\"ledColor\":" + ledColorState + ",\"bankName\":\"" + name.value + "\"}");
await fetch("http://192.168.1.66/api/upload", {
method: 'POST',
body: data
}).then(response => {
if (response.status == 200) {
window.location.href = "/index.html";
} else {
uploadFailure();
}
}).catch(() => {
uploadFailure()
}
);
}
function uploadFailure()
{
alert("Upload failed.");
let upload = document.getElementById("upload");
upload.removeAttribute("disabled");
let file = document.getElementById("file");
file.removeAttribute("disabled");
}

View file

@ -0,0 +1,57 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<title>PrometheOS</title>
<link rel="icon" type="image/x-icon" href="favicon.ico" />
<link href="pico.css" rel="stylesheet" />
</head>
<body>
<main class="container">
<form>
<h2>PrometheOS</h2>
<div class="grid">
<a role="button" href="launch.html">Launch BIOS</a>
</div>
<br />
<div class="grid">
<a role="button" href="remove.html">Remove BIOS</a>
</div>
<br />
<div class="grid">
<a role="button" href="flash.html">Flash BIOS</a>
</div>
<br />
<div class="grid">
<a role="button" href="downloads.html">Downloads</a>
</div>
<br />
<div class="grid">
<a role="button" href="cerbiosini.html">Cerbios INI</a>
</div>
<br />
<div class="grid">
<a role="button" href="javascript:void(0)" onclick="screenshot()">Take Screenshot</a>
</div>
<br />
<div class="grid">
<a role="button" href="remoteview.html">Remote View</a>
</div>
<br />
<div class="grid">
<a role="button" href="javascript:void(0)" onclick="reboot()">Reboot</a>
</div>
<br />
<div class="grid">
<a role="button" href="javascript:void(0)" onclick="shutdown()">Shutdown</a>
</div>
<br />
<div>
<b>Copyright 2024 - Team Cerbios + Team Resurgent</b>
</div>
</form>
</main>
<script src="index.js"></script>
</body>
</html>

View file

@ -0,0 +1,19 @@
async function screenshot() {
await fetch("http://192.168.1.66/api/screenshot").catch(error => {
content.innerHTML = "Failed to connect."
}).then(response => response.blob()).then(blob => {
var url = window.URL.createObjectURL(blob);
var a = document.createElement('a');
a.href = url;
a.download = "screenshot.png";
document.body.appendChild(a);
a.click();
a.remove();
});
}
async function reboot() {
await fetch("http://192.168.1.66/api/reboot");
}
async function shutdown() {
await fetch("http://192.168.1.66/api/shutdown");
}

View file

@ -0,0 +1,29 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<title>PrometheOS</title>
<link rel="icon" type="image/x-icon" href="favicon.ico" />
<link href="pico.css" rel="stylesheet" />
</head>
<body>
<main class="container">
<form>
<h2>PrometheOS: Launch BIOS</h2>
<div>
<span id="content">Please Wait...</span>
</div>
<br />
<div class="grid">
<a role="button" class="secondary" href="index.html">Back</a>
</div>
<br />
<div>
<b>Copyright 2024 - Team Cerbios + Team Resurgent</b>
</div>
</form>
</main>
<script src="launch.js"></script>
</body>
</html>

View file

@ -0,0 +1,53 @@
window.onload = function () {
getBankInfo();
};
async function getBankInfo() {
await fetch("http://192.168.1.66/api/bankinfo.json").then(async response => {
const json = await response.json();
let contentBody = "";
for (let i = 0; i < json.length; i++) {
if (json[i].slots > 0) {
contentBody += "<p><div class=\"grid\"><a role=\"button\" href=\"javascript:void(0)\" onclick=\"launchBank(" + json[i].id + ")\">" + json[i].name + "</a></div></p>";
}
}
contentBody += "<p><div class=\"grid\"><a role=\"button\" href=\"javascript:void(0)\" onclick=\"launchTsop()\">TSOP</a></div></p>";
let content = document.getElementById("content");
content.innerHTML = contentBody;
}).catch(error => {
let content = document.getElementById("content");
content.innerHTML = "Failed to connect."
});
}
async function launchBank(id)
{
await fetch("http://192.168.1.66/api/launchbank?" + id).catch(error => {
content.innerHTML = "Failed to connect."
}).then(response => {
if (response.status == 200) {
let content = document.getElementById("content");
content.innerHTML = "Launching..."
} else {
let content = document.getElementById("content");
content.innerHTML = "Failed to launch."
}
});
}
async function launchTsop() {
await fetch("http://192.168.1.66/api/launchtsop").catch(error => {
content.innerHTML = "Failed to connect."
}).then(response => {
if (response.status == 200) {
let content = document.getElementById("content");
content.innerHTML = "Launching..."
} else {
let content = document.getElementById("content");
content.innerHTML = "Failed to launch."
}
});
}

View file

@ -0,0 +1,119 @@
.btn-ledoff {
color: #ffffff;
background-color: #404040;
border-color: #000000;
}
.btn-ledoff:hover,
.btn-ledoff:focus,
.btn-ledoff:active,
.btn-ledoff.active {
color: #ffffff;
background-color: #202020;
border-color: #000000;
}
.btn-ledred {
color: #000000;
background-color: #aa0a00;
border-color: #000000;
}
.btn-ledred:hover,
.btn-ledred:focus,
.btn-ledred:active,
.btn-ledred.active {
color: #000000;
background-color: #d40c00;
border-color: #000000;
}
.btn-ledgreen {
color: #000000;
background-color: #289a23;
border-color: #000000;
}
.btn-ledgreen:hover,
.btn-ledgreen:focus,
.btn-ledgreen:active,
.btn-ledgreen.active {
color: #000000;
background-color: #32c12c;
border-color: #000000;
}
.btn-ledyellow {
color: #000000;
background-color: #cca400;
border-color: #000000;
}
.btn-ledyellow:hover,
.btn-ledyellow:focus,
.btn-ledyellow:active,
.btn-ledyellow.active {
color: #000000;
background-color: #ffcd00;
border-color: #000000;
}
.btn-ledblue {
color: #000000;
background-color: #4358cc;
border-color: #000000;
}
.btn-ledblue:hover,
.btn-ledblue:focus,
.btn-ledblue:active,
.btn-ledblue.active {
color: #ffffff;
background-color: #526eff;
border-color: #000000;
}
.btn-ledpurple {
color: #000000;
background-color: #663fa1;
border-color: #000000;
}
.btn-ledpurple:hover,
.btn-ledpurple:focus,
.btn-ledpurple:active,
.btn-ledpurple.active {
color: #000000;
background-color: #7f4fc9;
border-color: #000000;
}
.btn-ledturquoise {
color: #000000;
background-color: #0096ae;
border-color: #000000;
}
.btn-ledturquoise:hover,
.btn-ledturquoise:focus,
.btn-ledturquoise:active,
.btn-ledturquoise.active {
color: #000000;
background-color: #00bcd9;
border-color: #000000;
}
.btn-ledwhite {
color: #000000;
background-color: #c0c0c0;
border-color: #000000;
}
.btn-ledwhite:hover,
.btn-ledwhite:focus,
.btn-ledwhite:active,
.btn-ledwhite.active {
color: #000000;
background-color: #f0f0f0;
border-color: #000000;
}

View file

@ -0,0 +1,33 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<title>PrometheOS</title>
<link rel="icon" type="image/x-icon" href="favicon.ico" />
<link href="pico.css" rel="stylesheet" />
</head>
<body>
<main class="container">
<form>
<h2>PrometheOS: Remote View</h2>
<div>
<span id="content">Please Wait...</span>
</div>
<br />
<div class="grid">
<a role="button" href="javascript:void(0)" onclick="screenshot()">Refresh View</a>
</div>
<br />
<div class="grid">
<a role="button" class="secondary" href="index.html">Back</a>
</div>
<br />
<div>
<b>Copyright 2024 - Team Cerbios + Team Resurgent</b>
</div>
</form>
</main>
<script src="remoteview.js"></script>
</body>
</html>

View file

@ -0,0 +1,19 @@
window.onload = function () {
screenshot();
};
async function screenshot() {
await fetch("http://192.168.1.66/api/screenshot").catch(error => {
content.innerHTML = "Failed to connect."
}).then(response => response.blob()).then(blob => {
var url = window.URL.createObjectURL(blob);
var img = document.createElement('img');
img.src = url;
img.alt = "Screenshot";
img.style = "max-width: 100%; height: auto";
const content = document.getElementById('content');
content.innerHTML = "";
content.appendChild(img);
});
}

View file

@ -0,0 +1,29 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<title>PrometheOS</title>
<link rel="icon" type="image/x-icon" href="favicon.ico" />
<link href="pico.css" rel="stylesheet" />
</head>
<body>
<main class="container">
<form>
<h2>PrometheOS: Remove BIOS</h2>
<div>
<span id="content">Please Wait...</span>
</div>
<br />
<div class="grid">
<a role="button" class="secondary" href="index.html">Back</a>
</div>
<br />
<div>
<b>Copyright 2024 - Team Cerbios + Team Resurgent</b>
</div>
</form>
</main>
<script src="remove.js"></script>
</body>
</html>

View file

@ -0,0 +1,35 @@
window.onload = function () {
getBankInfo();
};
async function getBankInfo()
{
await fetch("http://192.168.1.66/api/bankinfo.json").then(async response => {
const json = await response.json();
let contentBody = "";
for (let i = 0; i < json.length; i++) {
if (json[i].slots > 0) {
contentBody += "<p><div class=\"grid\"><a role=\"button\" href=\"javascript:void(0)\" onclick=\"removeBank(" + json[i].id + ")\">" + json[i].name + "</a></div></p>";
}
}
let content = document.getElementById("content");
content.innerHTML = contentBody == "" ? "No items found." : contentBody;
}).catch(error => {
let content = document.getElementById("content");
content.innerHTML = "Failed to connect."
});
}
async function removeBank(id)
{
await fetch("http://192.168.1.66/api/removebank?" + id).then(() => {
getBankInfo();
}).catch(error => {
content.innerHTML = "Failed to connect."
});
}