Archived
1
0

13 Commits

18 changed files with 21818 additions and 249 deletions

63
SQLDefinitions/tables.sql Normal file
View File

@@ -0,0 +1,63 @@
CREATE TABLE `apps` (
`id` TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(30),
`url` VARCHAR(50),
`icon` VARCHAR(30),
`urlbase` VARCHAR(15),
`NSFW` VARCHAR(10),
PRIMARY KEY (`id`)
);
CREATE TABLE `links` (
`id` TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
`category` VARCHAR(20),
`name` VARCHAR(50),
`url` VARCHAR(100),
PRIMARY KEY (`id`)
);
CREATE TABLE `tabs` (
`id` TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50),
`NSFW` BOOLEAN,
PRIMARY KEY (`id`)
);
CREATE TABLE `categories` (
`id` TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50),
PRIMARY KEY (`id`)
);
CREATE TABLE `messages` (
`id` TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
`message` VARCHAR(255),
`easteregg` BOOLEAN,
PRIMARY KEY (`id`)
);
CREATE TABLE `personaldata` (
`fname` VARCHAR(20),
`lname` VARCHAR(30),
`email` VARCHAR(50)
);
CREATE TABLE `providers` (
`id` TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20),
`url` VARCHAR(100),
`prefix` VARCHAR(5),
PRIMARY KEY (`id`)
);
CREATE TABLE `themes` (
`id` TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20),
`imagebackground` VARCHAR(100),
`colorbackground` VARCHAR(9),
`colorserachbackground` VARCHAR(9),
`colortextpri` VARCHAR(9),
`colortextacc` VARCHAR(9),
`colorborder` VARCHAR(9),
PRIMARY KEY (`id`)
);

13
api/package-lock.json generated
View File

@@ -1,13 +0,0 @@
{
"name": "api",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"wol": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/wol/-/wol-1.0.7.tgz",
"integrity": "sha512-kg7ETY8g3V5+3GVhUfWCVjeXuCmfrX6xfw4cw4c88+MtoxkbFmcs9Y5yhT1wwOL8inogFUQZ8JMzH9OekaaawQ=="
}
}
}

View File

@@ -9,8 +9,5 @@
}, },
"keywords": [], "keywords": [],
"author": "", "author": "",
"license": "ISC", "license": "ISC"
"dependencies": {
"wol": "^1.0.7"
}
} }

View File

@@ -3,7 +3,17 @@ const bodyParser = require("body-parser");
const cors = require("cors"); const cors = require("cors");
const fs = require("fs"); const fs = require("fs");
const wol = require("wol"); const wol = require("wol");
const mysql = require("mysql");
const sql = "SELECT * FROM "
var con = mysql.createConnection({
host: "localhost",
user: "hpadmin",
password: "changeme",
database: "home_page"
});
//Read bookmarks
try { try {
var links = require('../src/links.json'); var links = require('../src/links.json');
} catch(err) { } catch(err) {
@@ -14,7 +24,7 @@ try {
"links": [ "links": [
{ {
"name": "Gitea", "name": "Gitea",
"url": "https://home.halfaperture.com/gitea" "url": "https://sean.bet/gitea"
} }
] ]
} }
@@ -24,6 +34,7 @@ try {
var links = require('../src/links.json'); var links = require('../src/links.json');
} }
//Read personal data
try { try {
var personaldata = require('../src/personaldata.json'); var personaldata = require('../src/personaldata.json');
} catch(err) { } catch(err) {
@@ -36,6 +47,7 @@ try {
var personaldata = require('../src/personaldata.json'); var personaldata = require('../src/personaldata.json');
} }
//Read app list
if (fs.existsSync('../src/apps.json')) { if (fs.existsSync('../src/apps.json')) {
console.log("apps.json exists"); console.log("apps.json exists");
}else { }else {
@@ -47,10 +59,8 @@ if (fs.existsSync('../src/apps.json')) {
fs.writeFileSync('../src/apps.json',body); fs.writeFileSync('../src/apps.json',body);
} }
const providers = require('../src/providers.json'); //Read everything else
const themes = require('../src/themes.json'); const themes = require('../src/themes.json');
const messages = require('../src/messages.json');
// initializing app // initializing app
const app = express(); const app = express();
@@ -65,7 +75,7 @@ app.get("/sui/api/apps", (req, res) => {
let apps = JSON.parse(data); let apps = JSON.parse(data);
res.status(200).send(apps.apps); res.status(200).send(apps.apps);
}); });
}); });
app.get("/sui/api/links", (req, res) => { app.get("/sui/api/links", (req, res) => {
@@ -73,19 +83,31 @@ app.get("/sui/api/links", (req, res) => {
}); });
app.get("/sui/api/providers", (req, res) => { app.get("/sui/api/providers", (req, res) => {
res.status(200).send(providers.providers); con.query('SELECT * FROM providers', (error, results, fields) => {
if (error) throw error;
res.status(200).send(results);
});
}); });
app.get("/sui/api/themes", (req, res) => { app.get("/sui/api/themes", (req, res) => {
res.status(200).send(themes.themes); con.query('SELECT * FROM themes', (error, results, fields) => {
if (error) throw error;
res.status(200).send(results);
});
}); });
app.get("/sui/api/personaldata", (req, res) => { app.get("/sui/api/personaldata", (req, res) => {
res.status(200).send(personaldata); con.query('SELECT * FROM personaldata', (error, results, fields) => {
if (error) throw error;
res.status(200).send(results);
});
}); });
app.get("/sui/api/messages", (req, res) => { app.get("/sui/api/messages", (req, res) => {
res.status(200).send(messages.messages); con.query('SELECT * FROM messages', (error, results, fields) => {
if (error) throw error;
res.status(200).send(results);
});
}); });
app.post("/sui/api/appUpdate", jsonParser, (req, res) => { app.post("/sui/api/appUpdate", jsonParser, (req, res) => {
@@ -96,10 +118,9 @@ app.post("/sui/api/appUpdate", jsonParser, (req, res) => {
}); });
app.get("/sui/api/wakeDakota", (req, res) => { app.get("/sui/api/wakeDakota", (req, res) => {
wol.wake('18:C0:4D:81:57:68', function(err,res){ wol.wake('18:C0:4D:81:57:68', function(err, res){
console.log(res); console.log(res);
}); });
res.status(200).send("success");
}); });
// app is listening on port 5000 // app is listening on port 5000

View File

@@ -1,101 +0,0 @@
const express = require("express");
const bodyParser = require("body-parser");
const cors = require("cors");
const fs = require("fs");
const wol = require("wol");
try {
var links = require('../src/links.json');
} catch(err) {
let body = `{
"bookmarks" : [
{
"category": "Example",
"links": [
{
"name": "Gitea",
"url": "https://home.halfaperture.com/gitea"
}
]
}
]
}`;
fs.writeFileSync('../src/links.json',body);
var links = require('../src/links.json');
}
try {
var personaldata = require('../src/personaldata.json');
} catch(err) {
let body = `{
"fname":"",
"lname":"",
"email":""
}`;
fs.writeFileSync('../src/personaldata.json',body);
var personaldata = require('../src/personaldata.json');
}
if (fs.existsSync('../src/apps.json')) {
console.log("apps.json exists");
}else {
let body = `{
"apps" : [
{"name":"Example","url":"your.site.com/example","icon":"web","urlbase":"/Example","NSFW":"SAFE"}
]
}`;
fs.writeFileSync('../src/apps.json',body);
}
const providers = require('../src/providers.json');
const themes = require('../src/themes.json');
const messages = require('../src/messages.json');
// initializing app
const app = express();
// initializing cors middleware for all routes
app.use(cors());
var jsonParser = bodyParser.json();
// creating route to make request to server for API
app.get("/sui/api/apps", (req, res) => {
fs.readFile('../src/apps.json', (err, data) => {
if (err) throw err;
let apps = JSON.parse(data);
res.status(200).send(apps.apps);
});
});
app.get("/sui/api/links", (req, res) => {
res.status(200).send(links.bookmarks);
});
app.get("/sui/api/providers", (req, res) => {
res.status(200).send(providers.providers);
});
app.get("/sui/api/themes", (req, res) => {
res.status(200).send(themes.themes);
});
app.get("/sui/api/personaldata", (req, res) => {
res.status(200).send(personaldata);
});
app.get("/sui/api/messages", (req, res) => {
res.status(200).send(messages.messages);
});
app.post("/sui/api/appUpdate", jsonParser, (req, res) => {
let data = JSON.stringify(req.body)
fs.writeFileSync('../src/apps.json',data)
var applications = require('../src/apps.json');
res.status(200).send(applications.apps)
});
app.post("/sui/api/wakeDakota", (req, res) => { wol.wake('18:C0:4D:81:57:68', function(err, res){ console.log(res);// app is listening on port 5000
});app.listen(5000, () => {
}); console.log("node server is running on port 5000");
});

21728
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -3,7 +3,7 @@
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"proxy": "http://localhost:5000", "proxy": "http://localhost:5000",
"homepage": "https://home.halfaperture.com/sui", "homepage": "https://sean.bet/sui",
"dependencies": { "dependencies": {
"@testing-library/jest-dom": "^5.16.1", "@testing-library/jest-dom": "^5.16.1",
"@testing-library/react": "^11.2.7", "@testing-library/react": "^11.2.7",
@@ -14,13 +14,11 @@
"express": "^4.18.1", "express": "^4.18.1",
"formik": "^2.2.9", "formik": "^2.2.9",
"history": "^5.1.0", "history": "^5.1.0",
"mysql": "^2.18.1",
"react": "^17.0.2", "react": "^17.0.2",
"react-dom": "^17.0.2", "react-dom": "^17.0.2",
"react-router-dom": "^6.1.1", "react-router-dom": "^6.1.1",
"react-scripts": "4.0.3", "react-scripts": "4.0.3",
"web-vitals": "^1.1.2", "web-vitals": "^1.1.2",
"wol": "^1.0.7",
"yup": "^0.32.11" "yup": "^0.32.11"
}, },
"scripts": { "scripts": {

View File

@@ -1 +1,24 @@
{"apps":[{"name":"Code Server", "url":"sean.bet/code","icon":"microsoft-visual-studio-code","urlbase":"/Code","NSFW":"SAFE"},{"name":"Deluge","url":"sean.bet/deluge","icon":"water","urlbase":"/Deluge","NSFW":"NSFW"},{"name":"Gitea","url":"sean.bet/gitea","icon":"tea","urlbase":"/Gitea","NSFW":"SAFE"},{"name":"Grafana","url":"sean.bet/grafana","icon":"chart-areaspline-variant","urlbase":"/Grafana","NSFW":"SAFE"},{"name":"Guacamole","url":"sean.bet/guacamole","icon":"remote-desktop","urlbase":"/Guacamole","NSFW":"SAFE"},{"name":"Jackett","url":"sean.bet/jackett","icon":"tshirt-crew","urlbase":"/Jackett","NSFW":"NSFW"},{"name":"Lidarr","url":"sean.bet/lidarr","icon":"music-circle","urlbase":"/Lidarr","NSFW":"NSFW"},{"name":"NextCloud","url":"sean.bet/nextcloud","icon":"cloud","urlbase":"/NextCloud","NSFW":"SAFE"},{"name":"NZBHydra","url":"sean.bet/nzbhydra","icon":"snake","urlbase":"/NZBHydra","NSFW":"NSFW"},{"name":"PiHole","url":"sean.bet/admin","icon":"pi-hole","urlbase":"/Admin","NSFW":"SAFE"},{"name":"Plex","url":"sean.bet/plex","icon":"plex","urlbase":"/Plex","NSFW":"SAFE"},{"name":"OctoPrint","url":"sean.bet/octoprint","icon":"printer-3d","urlbase":"/octoprint","NSFW":"SAFE"},{"name":"Ombi","url":"sean.bet/requests","icon":"magnify","urlbase":"/Ombi","NSFW":"NSFW"},{"name":"Organizr","url":"sean.bet","icon":"home","urlbase":"/Organizr","NSFW":"SAFE"},{"name":"Radarr","url":"sean.bet/radarr","icon":"movie-open","urlbase":"/Radarr","NSFW":"NSFW"},{"name":"Readarr","url":"sean.bet/readarr","icon":"library","urlbase":"/Readarr","NSFW":"NSFW"},{"name":"SABnzbd","url":"sean.bet/sabnzbd","icon":"download","urlbase":"/SABnzbd","NSFW":"NSFW"},{"name":"Sonarr","url":"sean.bet/sonarr","icon":"television-classic","urlbase":"/Sonarr","NSFW":"NSFW"},{"name":"Tautulli","url":"sean.bet/stats","icon":"chart-bar","urlbase":"/Stats","NSFW":"NSFW"},{"name":"uBooquity","url":"sean.bet/ubooquity","icon":"book-open-outline","urlbase":"/uBooquity","NSFW":"SAFE"},{"name":"Wiki","url":"sean.bet/wiki","icon":"wikipedia","urlbase":"/Wiki","NSFW":"SAFE"}]} {
"apps" : [
{"name":"Deluge","url":"sean.bet/deluge","icon":"water","urlbase":"/Deluge","NSFW":"NSFW"},
{"name":"Gitea","url":"sean.bet/gitea","icon":"tea","urlbase":"/Gitea","NSFW":"SAFE"},
{"name":"Grafana","url":"sean.bet/grafana","icon":"chart-areaspline-variant","urlbase":"/Grafana","NSFW":"SAFE"},
{"name":"Guacamole","url":"sean.bet/guacamole","icon":"remote-desktop","urlbase":"/Guacamole","NSFW":"SAFE"},
{"name":"Jackett","url":"sean.bet/jackett","icon":"tshirt-crew","urlbase":"/Jackett","NSFW":"NSFW"},
{"name":"Lidarr","url":"sean.bet/lidarr","icon":"music-circle","urlbase":"/Lidarr","NSFW":"NSFW"},
{"name":"NextCloud","url":"sean.bet/nextcloud","icon":"cloud","urlbase":"/NextCloud","NSFW":"SAFE"},
{"name":"NZBHydra","url":"sean.bet/nzbhydra","icon":"snake","urlbase":"/NZBHydra","NSFW":"NSFW"},
{"name":"PiHole","url":"sean.bet/admin","icon":"pi-hole","urlbase":"/Admin","NSFW":"SAFE"},
{"name":"Plex","url":"sean.bet/plex","icon":"plex","urlbase":"/Plex","NSFW":"SAFE"},
{"name":"OctoPrint","url":"sean.bet/octoprint","icon":"printer-3d","urlbase":"/octoprint","NSFW":"SAFE"},
{"name":"Ombi","url":"sean.bet/requests","icon":"magnify","urlbase":"/Ombi","NSFW":"NSFW"},
{"name":"Organizr","url":"sean.bet","icon":"home","urlbase":"/Organizr","NSFW":"SAFE"},
{"name":"Radarr","url":"sean.bet/radarr","icon":"movie-open","urlbase":"/Radarr","NSFW":"NSFW"},
{"name":"Readarr","url":"sean.bet/readarr","icon":"library","urlbase":"/Readarr","NSFW":"NSFW"},
{"name":"SABnzbd","url":"sean.bet/sabnzbd","icon":"download","urlbase":"/SABnzbd","NSFW":"NSFW"},
{"name":"Sonarr","url":"sean.bet/sonarr","icon":"television-classic","urlbase":"/Sonarr","NSFW":"NSFW"},
{"name":"Tautulli","url":"sean.bet/stats","icon":"chart-bar","urlbase":"/Stats","NSFW":"NSFW"},
{"name":"uBooquity","url":"sean.bet/ubooquity","icon":"book-open-outline","urlbase":"/uBooquity","NSFW":"SAFE"},
{"name":"Wiki","url":"sean.bet/wiki","icon":"wikipedia","urlbase":"/Wiki","NSFW":"SAFE"}
]
}

View File

@@ -23,7 +23,7 @@ export function greet() {
let currentTime = new Date(); let currentTime = new Date();
let greet = Math.floor(currentTime.getHours() / 6); let greet = Math.floor(currentTime.getHours() / 6);
let easterEggChance = Math.floor(Math.random() * 100); let easterEggChance = Math.floor(Math.random() * 100);
let greetings = require('../messages.json'); let greetings = require("../messages.json");
let timeBased = []; let timeBased = [];
let easterEggs = []; let easterEggs = [];
for (var i = 0; i < greetings.messages.length; i++) { for (var i = 0; i < greetings.messages.length; i++) {

View File

@@ -13,7 +13,7 @@ const ApplicationSettings = () => {
const addRow = () => { const addRow = () => {
setState([ setState([
...state, ...state,
{ key: state.length +1,name: "", url: "home.halfaperture.com/", icon: "", urlbase: "/", NSFW: false} { key: state.length +1,name: "", url: "sean.bet/", icon: "", urlbase: "/", NSFW: false}
]); ]);
}; };

View File

@@ -4,7 +4,7 @@ import Messages from './Messages';
function MessageInfo() { function MessageInfo() {
const [state, setState] = useState([]); const [state, setState] = useState([]);
const getData = async () => { const getData = async () => {
const response = await fetch("/sui/api/messages"); const response = await fetch("/sui/api/messages");
const data = await response.json(); const data = await response.json();
setState(data); setState(data);
@@ -13,14 +13,13 @@ function MessageInfo() {
useEffect(() => { useEffect(() => {
getData(); getData();
}, []); }, []);
return ( return (
<div id="messageForm"> <div id="messageForm">
{state.map((greetings, index) => ( {state.map((greetings, index) => (
<Messages <Messages
key={index} key={index}
group={index+1} group={index+1}
index={greetings.index}
greeting={greetings.message} greeting={greetings.message}
easterEgg={greetings.easteregg} easterEgg={greetings.easteregg}
/> />
@@ -29,4 +28,4 @@ function MessageInfo() {
); );
} }
export default MessageInfo export default MessageInfo

View File

@@ -1,17 +1,15 @@
function Messages(props) { function Messages(props) {
var eeChecked; var eeChecked;
if(props.easterEgg === "TRUE") { if(props.easterEgg === 1) {
eeChecked = true; eeChecked = true;
} else if(props.easterEgg === "FALSE") { } else if(props.easterEgg === 0) {
eeChecked = false; eeChecked = false;
} else { } else {
eeChecked = false; eeChecked = false;
} }
return ( return (
<div id="messageGrid" title={props.group}> <div id="messageGrid" title={props.group}>
<label htmlFor="index">Index</label>
<input id="index" type="text" defaultValue={props.index}></input>
<label htmlFor="greeting">Greeting</label> <label htmlFor="greeting">Greeting</label>
<input id="greeting" type="text" defaultValue={props.greeting}></input> <input id="greeting" type="text" defaultValue={props.greeting}></input>
<label htmlFor="Easter Egg">Easter Egg</label> <label htmlFor="Easter Egg">Easter Egg</label>
@@ -20,4 +18,4 @@ function Messages(props) {
); );
} }
export default Messages; export default Messages;

View File

@@ -7,7 +7,7 @@ function PersonalInfo() {
const getData = async () => { const getData = async () => {
const response = await fetch("/sui/api/personaldata"); const response = await fetch("/sui/api/personaldata");
const data = await response.json(); const data = await response.json();
setState(data); setState(data[0]);
}; };
useEffect(() => { useEffect(() => {
@@ -23,4 +23,4 @@ function PersonalInfo() {
); );
} }
export default PersonalInfo; export default PersonalInfo;

View File

@@ -1,16 +0,0 @@
function WolButton(props) {
return (
<div className="wake"><input type="button" id="wolbutton" onClick={runWakeCommand}></input>
<label htmlFor="wolbutton"><span className="iconify" data-icon="mdi-monitor"></span></label></div>
);
}
export default WolButton;
function runWakeCommand() {
const requestOptions = {
method: 'GET',
headers: {'Content-Type': 'application/json'},
};
fetch("/sui/api/wakeDakota", requestOptions)
}

View File

@@ -290,7 +290,7 @@ table a{
display: grid; display: grid;
grid-column-gap: 5px; grid-column-gap: 5px;
grid-row-gap: 5px; grid-row-gap: 5px;
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr; grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
grid-template-rows: 64px; grid-template-rows: 64px;
padding-bottom: var(--module-spacing); padding-bottom: var(--module-spacing);
} }
@@ -418,10 +418,7 @@ table a{
#nav_item h4{ #nav_item h4{
color: var(--color-text-acc); color: var(--color-text-acc);
} }
#nav item button{
display: block;
color: var(--color-text-pri);
}
#nav_item a{ #nav_item a{
font-size: 1.25em; font-size: 1.25em;
display: block; display: block;
@@ -430,7 +427,6 @@ table a{
line-height: 2; line-height: 2;
justify-self: center; justify-self: center;
color: var(--color-text-pri); color: var(--color-text-pri);
border-radius: 1em;
} }
#nav_item a:hover{ #nav_item a:hover{
text-decoration: none; text-decoration: none;
@@ -688,7 +684,7 @@ table a{
} }
#modal-footer{ #modal-footer{
display:grid; display:flex;
font-size:2em; font-size:2em;
justify-content: center; justify-content: center;
} }
@@ -709,10 +705,6 @@ table a{
#modal-footer input[type="checkbox"]:checked + label{ #modal-footer input[type="checkbox"]:checked + label{
color: var(--color-text-acc); color: var(--color-text-acc);
} }
#modal-footer input[type="button"]{
display: none;
color: var(--color-text-pri);
}
.sneaky{ .sneaky{
right: 1em; right: 1em;
@@ -896,12 +888,6 @@ table a{
color: #FDF1EF; color: #FDF1EF;
} }
.theme-loyal{
background-color: #000000;
border: 4px solid #ffffff;
color: #ff0000;
}
/* MEDIA QUERIES */ /* MEDIA QUERIES */
@media screen and (max-width: 1260px) @media screen and (max-width: 1260px)

View File

@@ -149,11 +149,7 @@
{ {
"name": "Unifi", "name": "Unifi",
"url": "https://network.unifi.ui.com" "url": "https://network.unifi.ui.com"
}, }
{
"name": "Code Server",
"url": "https://sean.bet/code"
}
] ]
}, },
{ {
@@ -201,8 +197,8 @@
"url": "https://outlook.office365.com/ecp/" "url": "https://outlook.office365.com/ecp/"
}, },
{ {
"name": "Dev Ops", "name": "Classic Protection",
"url": "https://dev.azure.com/CottonIT/" "url": "https://protection.office.com"
} }
] ]
} }

View File

@@ -1,5 +1,4 @@
import HideButton from '../components/HideButton'; import HideButton from '../components/HideButton'
import WolButton from '../components/WolButton';
import { setTheme } from "../assets/functions"; import { setTheme } from "../assets/functions";
import { Outlet, Link } from "react-router-dom"; import { Outlet, Link } from "react-router-dom";
@@ -19,8 +18,6 @@ function Settings() {
</nav> </nav>
<nav id="nav_item"> <nav id="nav_item">
<header id="modal-footer"> <header id="modal-footer">
<WolButton />
<br/>
<HideButton <HideButton
checked = {isChecked} checked = {isChecked}
/> />
@@ -33,4 +30,4 @@ function Settings() {
); );
} }
export default Settings; export default Settings;

View File

@@ -179,15 +179,6 @@
"colortextpri": "#FDF1EF", "colortextpri": "#FDF1EF",
"colortextacc": "#F97E82", "colortextacc": "#F97E82",
"colorborder": "#F97E82" "colorborder": "#F97E82"
},
{
"name": "loyal",
"imagebackground": "none",
"colorbackground": "#111111",
"colorserachbackground": "#ffffff20",
"colortextpri": "#AA0000",
"colortextacc": "#dddddd",
"colorborder": "#dddddd"
} }
] ]
} }