init rest

This commit is contained in:
worker committed 2026-01-26 16:49:04 +01:00
1 parent ebb8e82c51
commit a0674b2587
19 files changed
+1041 -125

No files matched your search

+73
View File
@@ -0,0 +1,73 @@
#!/bin/bash
while true; do
echo ""
echo "============================="
echo " Git Management Script"
echo "============================="
echo ""
echo "1) Geänderte Dateien anzeigen"
echo "2) Einzelne Dateien zum Commit auswählen"
echo "3) Alles stagen"
echo "4) Commit & Push"
echo "5) Alte Stände anzeigen"
echo "6) Aktueller Branch"
echo "7) Änderungen"
echo "99) Programm beenden"
echo ""
read -p "Auswahl: " auswahl
case $auswahl in
1)
echo "Geänderte Dateien:"
git status -s
;;
2)
echo "Geänderte Dateien:"
git status -s
echo ""
read -p "Welche Datei soll gestaged werden? (Pfad eingeben): " file
git add "$file"
echo ">> Datei '$file' wurde gestaged."
;;
3)
echo ">> Alle Dateien werden gestaged..."
git add -A
;;
4)
read -p "Commit Nachricht: " commitmsg
git commit -m "$commitmsg"
echo ">> Pushen..."
git push
;;
5)
echo ">> Alte Commits:"
git log --oneline --graph --decorate --all
;;
6)
echo "Aktueller Branch"
git branch
;;
7)
echo "Änderungen"
git status
;;
99)
echo "Beendet."
exit 0
;;
*)
echo "Ungültige Auswahl!"
;;
esac
done
+46
View File
@@ -0,0 +1,46 @@
{
"folders": [
{
"path": "."
}
],
"settings": {
"workbench.colorTheme": "Default Dark Modern",
"workbench.colorCustomizations": {
"activityBar.background": "#ff000075",
"activityBar.foreground": "#000000",
"breadcrumb.foreground": "#FFFFFF",
},
"editor.renderWhitespace": "all",
"editor.smoothScrolling": true,
"editor.fontSize": 14,
"editor.formatOnSave": true,
"editor.minimap.enabled": true,
"editor.minimap.scale": 2,
"editor.minimap.side": "right",
"editor.minimap.maxColumn": 100,
"editor.minimap.renderCharacters": true,
"editor.minimap.showSlider": "always",
"files.autoSave": "off",
"files.autoSaveDelay": 3000,
"window.title": "BACKEND",
"workbench.editor.wrapTabs": true,
},
"extensions": {
"recommendations": [
"oderwat.indent-rainbow",
"pranaygp.vscode-css-peek",
"wayou.vscode-todo-highlight",
"mrmlnc.vscode-mustache",
"fabiospampinato.vscode-highlight",
"junstyle.php-cs-fixer",
"mtea.gettext-editor",
"neilbrayfield.php-docblocker",
"bmewburn.vscode-intelephense-client",
"mohamed-ali.html-css-class-completion",
"rifi2k.format-html-in-php",
"mrorz.language-gettext",
"voldemortensen.rainbow-tags",
]
}
}
+8
View File
@@ -0,0 +1,8 @@
<?php
$services = [
'service2' => ['name' => 'Service 1', 'active' => false],
'request_logs' => ['name' => 'Request Logs', 'active' => true],
'request_chart' => ['name' => 'Request Statics', 'active' => true],
'services_control' => ['name' => 'Services Control', 'active' => true],
];
?>
+39
View File
@@ -0,0 +1,39 @@
<?php
class cookieController {
public function setCookie(string $CookieName, int $CookieValue, int $CookieTime) {
setcookie($CookieName, $CookieValue, time()+($CookieTime*60));
}
public function readCookieValue(string $CookieName) {
if (isset($_COOKIE[$CookieName])) {
return $_COOKIE[$CookieName];
}
return 'Cookie not set';
}
public function DeleteCookie(string $CookieName) {
setcookie($CookieName, "", time()-(3600*24));
}
}
// USE:
/**
* Cookie setzen:
* $cookieManager = new cookieController();
* $cookieManager->SetCookie("USER", "7", 60);
*/
/**
* Cookie auslesen:
* $cookieValue = $cookieManager->readCookieValueCookie("USER");
* echo $cookieValue;
*/
/**
* Cookie loeschen:
* $cookieManager->DeleteCookie("USER");
*/
+188
View File
@@ -0,0 +1,188 @@
<?php
class getSpecificData {
public function getUserAgent(): string {
return $_SERVER['HTTP_USER_AGENT'] ?? 'Unbekannt';
}
public function getRequestURL(): string {
return $_SERVER['REQUEST_URI'] ?? 'Unbekannt';
}
public function getCookie(string $name): ?string {
return $_COOKIE[$name] ?? 'Unbekannt';
}
public function getServerCookie(string $name): ?string {
return $_COOKIE[$name] ?? 'Unbekannt';
}
public function getSessionID(): string {
return $session_id ?? 'Unbekannt ';
}
public function getServerPort(): string {
return $_SERVER['SERVER_PORT'] ?? 'Unbekannt';
}
public function getClientPort(): string {
return $_SERVER['REMOTE_PORT'] ?? 'Unbekannt';
}
public function getDocumentRoot(): string {
return $_SERVER['DOCUMENT_ROOT'] ?? 'Unbekannt';
}
public function getQuery(): string {
return $_SERVER['QUERY_STRING'] ?? 'Unbekannt';
}
public function getRequestMethod(): string {
return $_SERVER['REQUEST_METHOD'] ?? 'Unbekannt';
}
public function getCurrentDir(): string {
return __DIR__ ;
}
public function getReferer(): string {
return $_SERVER['HTTP_REFERER'] ?? 'Unbekannt';
}
public function getDatabase(): string {
$conn = db_connect();
return $conn->host_info;
}
public function getServerName(): string {
$Servername = $_SERVER['SERVER_NAME'] ?? 'Unbekannt';
if (in_array($Servername, ['Unbekannt', '0.0.0.0', '127.0.0.1'])) {
return "Lokal";
} else {
return $Servername;
}
}
public function getServerIP(): string {
$ServerIP = $_SERVER['SERVER_ADDR'] ?? 'Unbekannt';
if (in_array($ServerIP, ['Unbekannt', '0.0.0.0', '127.0.0.1'])) {
return "Lokal";
} else {
return $ServerIP;
}
}
public function getClientIP(): string {
$xff = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? null;
if ($xff) {
$ips = array_map('trim', explode(',', $xff));
$clientIp = $ips[0];
return $clientIp;
} else {
return $_SERVER['REMOTE_ADDR'];
}
}
public function getRequestTime(): string {
date_default_timezone_set('Europe/Berlin');
$timestamp = $_SERVER['REQUEST_TIME'] ?? time();
return date('Y-m-d H:i:s', $timestamp);
}
function getGeoIP($ClientIP) {
$whitelist = (new getSpecificData())->getWhitelistedIPs();
if (in_array($ClientIP, $whitelist)) {
return "Lokal";
} else {
$response = file_get_contents("http://ip-api.com/json/{$ClientIP}?fields=country,countryCode");
$data = json_decode($response);
return $data->country;
}
}
function getWhitelistedIPs() {
include_once 'DatabaseController.php';
$data = DatabaseShow(
"Whitelisted",
"`IP-ADDRESSE`"
);
$results = [];
foreach ($data as $row) {
$results[] =$row['IP-ADDRESSE'];
}
return $results;
}
function getServerNode($ServerIP) {
$nodes = [
'node1' => '172.30.0.11',
'node2' => '172.30.0.12',
'node3' => '172.30.0.13',
'node4' => '172.30.0.14',
'Lokal' => 'Lokal',
];
foreach ($nodes as $node => $ip) {
if ($ServerIP == $ip) {
return $node;
break;
}
}
}
function getClientStatus($ClientIP) {
if (in_array($ClientIP, $this->getWhitelistedIPs())) {
return "Trusted";
}
return "Untrusted";
}
function test() {
return "TEST";
}
public function getAllData(): array {
return [
'Document-Root' => $this->getDocumentRoot(),
'CurrentDir' => $this->getCurrentDir(),
'Referer' => $this->getReferer(),
'Request URL' => $this->getRequestURL(),
'Server-Port' => $this->getServerPort(),
'Server-IP' => $this->getServerIP(),
'Server-Name' => $this->getServerName(),
'Server-Node' => $this->getServerNode($this->getServerIP()),
'Client-IP' => $this->getClientIP(),
'Client-Port' => $this->getClientPort(),
'Client-Land' => $this->getGeoIP($this->getClientIP()),
'Client-User-Agent' => $this->getUserAgent(),
'Client-Cookie' => $this->getCookie('USER'),
'Client-Server-Cookie' => $this->getCookie('SESSSRV'),
'Client-Session-ID' => $this->getSessionID(),
'Query' => $this->getQuery(),
'Request-Method' => $this->getRequestMethod(),
'Request-Time' => $this->getRequestTime(),
'Database' => $this->getDatabase(),
'Whitelisted Status' => $this->getClientStatus($this->getClientIP()),
'Whitelisted IPs' => $this->getWhitelistedIPs(),
];
}
public function ShowAllData(): void {
$SpecificData = (new getSpecificData())->getAllData();
echo "<pre>";
foreach ($SpecificData as $key => $value) {
if (is_array($value)) {
$value = implode(', ', $value);
}
printf("%-22s : %s\n", $key, $value);
}
echo "</pre>";
}
}
+42
View File
@@ -0,0 +1,42 @@
<?php
function db_connect() {
$servers = [
'dev' => [
'hostaddr' => '10.233.1.29',
'username' => 'worker',
'password' => 'bBHofurUJWKzPE8Z',
'database' => 'DEV',
],
'vpn' => [
'hostaddr' => '100.123.136.86',
'username' => 'worker',
'password' => 'bBHofurUJWKzPE8Z',
'database' => 'DEV',
],
'live' => [
'hostaddr' => '10.233.1.244',
'username' => 'worker',
'password' => 'bBHofurUJWKzPE8Z',
'database' => 'DEV',
]
];
$enviroment = 'vpn';
$conn = new mysqli(
$servers[$enviroment]['hostaddr'],
$servers[$enviroment]['username'],
$servers[$enviroment]['password'],
$servers[$enviroment]['database'],
);
if ($conn->connect_error) {
throw new Exception('Connection Error: ' . $conn->connect_error);
}
$conn->set_charset("utf8mb4");
return $conn;
}
?>
+177
View File
@@ -0,0 +1,177 @@
<?php
function DatabaseShow($table, $columns = "*", $where = "", ...$values) {
include_once 'DatabaseConnect.php';
$conn = db_connect();
$sql = "SELECT $columns FROM `$table`";
if (!empty($where)) {
$sql .= " WHERE $where";
}
$stmt = $conn->prepare($sql);
if (!$stmt) {
die("Fehler beim Prepare: " . $conn->error);
}
if (!$stmt->execute($values)) {
die("Fehler beim Execute: " . $stmt->error);
}
$result = $stmt->get_result();
return $result->fetch_all(MYSQLI_ASSOC);
}
function DatabaseInsert($table, $columns, ...$values) {
include_once 'DatabaseConnect.php';
$conn = db_connect();
$placeholders = rtrim(str_repeat("?,", count($values)), ",");
$sql = "INSERT INTO `$table` ($columns) VALUES ($placeholders)";
$stmt = $conn->prepare($sql);
if (!$stmt) {
die("Fehler beim Prepare: " . $conn->error);
}
if (!$stmt->execute($values)) {
die("Fehler beim Execute: " . $stmt->error);
}
return true;
}
function DatabaseDelete($table, $where, ...$values) {
include_once 'DatabaseConnect.php';
$conn = db_connect();
$sql = "DELETE FROM `$table` WHERE $where";
$stmt = $conn->prepare($sql);
if (!$stmt) {
die("Fehler beim Prepare: " . $conn->error);
}
if (!$stmt->execute($values)) {
die("Fehler beim Execute: " . $stmt->error);
}
return true;
}
function DatabaseUpdate($table, $set, $where, ...$values) {
include_once 'DatabaseConnect.php';
$conn = db_connect();
$sql = "UPDATE `$table` SET $set WHERE $where";
$stmt = $conn->prepare($sql);
if (!$stmt) {
die("Fehler beim Prepare: " . $conn->error);
}
if (!$stmt->execute($values)) {
die("Fehler beim Execute: " . $stmt->error);
}
return true;
}
function DatabaseShowWithFK($table, $fkMap = [], $columns = "*", $where = "", ...$values) {
include_once 'DatabaseConnect.php';
$conn = db_connect();
$select = is_array($columns) ? implode(", ", $columns) : $columns;
$sql = "SELECT $select FROM `$table`";
if (!empty($where)) {
$sql .= " WHERE $where";
}
$stmt = $conn->prepare($sql);
if (!$stmt) die("Fehler beim Prepare: " . $conn->error);
if (!$stmt->execute($values)) die("Fehler beim Execute: " . $stmt->error);
$result = $stmt->get_result();
if (!$result) die("Fehler beim get_result: " . $stmt->error);
$columnsResult = [];
while ($fieldinfo = $result->fetch_field()) {
$columnsResult[] = $fieldinfo->name;
}
$rows = $result->fetch_all(MYSQLI_ASSOC);
foreach ($rows as &$row) {
foreach ($fkMap as $fkColumn => $fkInfo) {
if (isset($row[$fkColumn]) && $row[$fkColumn] !== null) {
$fkStmt = $conn->prepare(
"SELECT {$fkInfo['value']} FROM `{$fkInfo['table']}` WHERE {$fkInfo['key']} = ?"
);
if (!$fkStmt) die("Fehler beim Prepare FK: " . $conn->error);
$fkStmt->bind_param("i", $row[$fkColumn]);
$fkStmt->execute();
$fkResult = $fkStmt->get_result();
$fkRow = $fkResult->fetch_assoc();
$row[$fkColumn] = $fkRow ? $fkRow[$fkInfo['value']] : null;
}
}
}
return [
"rows" => $rows
];
}
$Berufsschulberichte = [
"FACH_S1" => ["table" => "Fach", "key" => "ID", "value" => "Fach"],
"LEHRER_S1" => ["table" => "Lehrer", "key" => "ID", "value" => "NAME"],
"RAUM_S1" => ["table" => "Raum", "key" => "ID", "value" => "Raum_NR"],
"FACH_S2" => ["table" => "Fach", "key" => "ID", "value" => "Fach"],
"LEHRER_S2" => ["table" => "Lehrer", "key" => "ID", "value" => "NAME"],
"RAUM_S2" => ["table" => "Raum", "key" => "ID", "value" => "Raum_NR"],
"FACH_S3" => ["table" => "Fach", "key" => "ID", "value" => "Fach"],
"LEHRER_S3" => ["table" => "Lehrer", "key" => "ID", "value" => "NAME"],
"RAUM_S3" => ["table" => "Raum", "key" => "ID", "value" => "Raum_NR"],
"FACH_S4" => ["table" => "Fach", "key" => "ID", "value" => "Fach"],
"LEHRER_S4" => ["table" => "Lehrer", "key" => "ID", "value" => "NAME"],
"RAUM_S4" => ["table" => "Raum", "key" => "ID", "value" => "Raum_NR"],
"FACH_S5" => ["table" => "Fach", "key" => "ID", "value" => "Fach"],
"LEHRER_S5" => ["table" => "Lehrer", "key" => "ID", "value" => "NAME"],
"RAUM_S5" => ["table" => "Raum", "key" => "ID", "value" => "Raum_NR"],
"FACH_S6" => ["table" => "Fach", "key" => "ID", "value" => "Fach"],
"LEHRER_S6" => ["table" => "Lehrer", "key" => "ID", "value" => "NAME"],
"RAUM_S6" => ["table" => "Raum", "key" => "ID", "value" => "Raum_NR"],
"FACH_S7" => ["table" => "Fach", "key" => "ID", "value" => "Fach"],
"LEHRER_S7" => ["table" => "Lehrer", "key" => "ID", "value" => "NAME"],
"RAUM_S7" => ["table" => "Raum", "key" => "ID", "value" => "Raum_NR"],
"FACH_S8" => ["table" => "Fach", "key" => "ID", "value" => "Fach"],
"LEHRER_S8" => ["table" => "Lehrer", "key" => "ID", "value" => "NAME"],
"RAUM_S8" => ["table" => "Raum", "key" => "ID", "value" => "Raum_NR"],
];
$Stundenplan = [
"MO" => ["table" => "Fach", "key" => "ID", "value" => "Fach"],
"DI" => ["table" => "Fach", "key" => "ID", "value" => "Fach"],
"MI" => ["table" => "Fach", "key" => "ID", "value" => "Fach"],
"DO" => ["table" => "Fach", "key" => "ID", "value" => "Fach"],
"FR" => ["table" => "Fach", "key" => "ID", "value" => "Fach"],
];
$Berechtigungen = [
"BENUTZER_ID" => ["table" => "Benutzer", "key" => "ID", "value" => "ID"],
"BERECHTIGUNGEN_ID" => ["table" => "Berechtigungen", "key" => "ID", "value" => "ID"]
];
+80
View File
@@ -0,0 +1,80 @@
<?php
function logging() {
include_once 'DatabaseConnect.php';
include_once 'DatabaseController.php';
include_once 'DataController.php';
$ClientIP = (new getSpecificData())->getClientIP();
$UserAgent = (new getSpecificData())->getUserAgent();
$RequestURL = (new getSpecificData())->getRequestURL();
$USERCOOKIE = (new getSpecificData())->getCookie("USER");
$SessionID = (new getSpecificData())->getSessionID();
$REQUESTTIME = (new getSpecificData())->getRequestTime();
$QUERY = (new getSpecificData())->getQuery();
$LAND = (new getSpecificData())->getGeoIP($ClientIP);
$Whitelisted = (new getSpecificData())->getWhitelistedIPs();
$node = (new getSpecificData())->getServerNode((new getSpecificData())->getServerIP());
if (in_array($ClientIP, $Whitelisted)) {
return;
}
$db_conn = db_connect();
$stmt = $db_conn->prepare("SELECT * FROM logs WHERE
`CLIENT_IP` LIKE ? and
`REQUEST_URL` = ? and
`REQUEST_URL` <> '/favicon.ico'
");
$stmt->bind_param("ss", $ClientIP, $RequestURL);
$stmt->execute();
$stmt->store_result();
if ($RequestURL !== '/favicon.ico') {
if ($stmt->num_rows > 0) { //wenn mindestens eine zeile vorhanden ist für die client ip dann führe updates durch, wenn nicht mache neue zeile
$updateCounter = $db_conn->prepare("
UPDATE logs
SET COUNTER = COUNTER + 1
WHERE `CLIENT_IP` = ?
AND `REQUEST_URL` = ?
");
$updateCounter->bind_param("ss", $ClientIP, $RequestURL);
$updateCounter->execute();
$updateLastRequest = $db_conn->prepare("
UPDATE logs
SET `LAST_REQUEST` = ?
WHERE `CLIENT_IP` = ?
AND `REQUEST_URL` = ?
");
$updateLastRequest->bind_param("sss", $REQUESTTIME, $ClientIP, $RequestURL);
$updateLastRequest->execute();
$updateCookieValue = $db_conn->prepare("
UPDATE logs
SET `USER_COOKIE_VALUE` = ?
WHERE `CLIENT_IP` = ?
AND `REQUEST_URL` = ?
");
$updateCookieValue->bind_param("sss", $USERCOOKIE, $ClientIP, $RequestURL);
$updateCookieValue->execute();
} else {
DatabaseInsert(
"logs",
"CLIENT_IP, LAND, SERVER_IP, USER_AGENT, REQUEST_URL, USER_COOKIE_VALUE, USER_SESSION_VALUE, FIRST_REQUEST, QUERY",
$ClientIP,
$LAND,
$node,
$UserAgent,
$RequestURL,
$USERCOOKIE,
$SessionID,
$REQUESTTIME,
$QUERY
);
}
}
}
+31
View File
@@ -0,0 +1,31 @@
<?php
include_once '../controller/LogController.php';
// logging();
if (!isset($_GET['website'])) {
die("Fehlender Parameter: website");
}
$website = trim($_GET['website']);
$blocked_schemes = ['javascript:', 'data:', 'file:'];
foreach ($blocked_schemes as $scheme) {
if (stripos($website, $scheme) === 0) {
die("Ungültige URL.");
}
}
if (preg_match('/^https?:\/\//i', $website)) {
header("Location: " . $website);
exit;
}
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https://" : "http://";
$domain = $_SERVER['HTTP_HOST'];
$website = ltrim($website, "/");
$redirectUrl = $protocol . $domain . "/" . $website;
header("Location: " . $redirectUrl);
exit;
+49
View File
@@ -0,0 +1,49 @@
<?php
include_once 'DatabaseController.php';
include_once 'DatabaseConnect.php';
class UserController {
public function setUser($name, $nachname, $email, $passwort, $rolle, $admin) {
$hashedPasswort = password_hash($passwort, PASSWORD_DEFAULT);
DatabaseInsert(
"Benutzer",
"NAME, NACHNAME, EMAIL, PASSWORD, ROLLE, ADMIN",
$name,
$nachname,
$email,
$hashedPasswort,
$rolle,
$admin,
);
}
public function DeleteUSer() {
}
public function CheckUser($login, $passwort) {
$user = DatabaseShow(
"Benutzer",
"*",
"NAME = ? OR EMAIL = ?",
$login,
$login
);
if (empty($user)) {
return false;
}
$user = $user[0];
if (password_verify($passwort, $user['PASSWORD'])) {
return true;
}
return false;
}
}
+32 -22
View File
@@ -1,5 +1,12 @@
<?php
include 'config.php';
include_once './controller/CookieController.php';
include_once './controller/DatabaseConnect.php';
include_once './controller/DatabaseController.php';
include_once './controller/DataController.php';
include_once './controller/LogController.php';
// include_once './controller/RoutesController.php';
include_once './controller/UserController.php';
// Bestimme ausgewählten Service (default = erster aktiver Service)
$selectedService = null;
@@ -15,12 +22,14 @@ if (isset($_GET['service']) && isset($services[$_GET['service']]) && $services[$
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Service Website</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header>
Meine Services
@@ -29,13 +38,13 @@ if (isset($_GET['service']) && isset($services[$_GET['service']]) && $services[$
<div class="main">
<div class="sidebar">
<?php foreach ($services as $key => $service): ?>
<?php if ($service['active']): ?>
<a href="?service=<?php echo $key; ?>">
<button class="<?php echo $selectedService === $key ? 'active' : ''; ?>">
<?php echo $service['name']; ?>
</button>
</a>
<?php endif; ?>
<?php if ($service['active']): ?>
<a href="?service=<?php echo $key; ?>">
<button class="<?php echo $selectedService === $key ? 'active' : ''; ?>">
<?php echo $service['name']; ?>
</button>
</a>
<?php endif; ?>
<?php endforeach; ?>
</div>
<div class="content">
@@ -50,22 +59,23 @@ if (isset($_GET['service']) && isset($services[$_GET['service']]) && $services[$
</div>
<script>
const toggle = document.getElementById('darkModeToggle');
const body = document.body;
const toggle = document.getElementById('darkModeToggle');
const body = document.body;
// Prüfen, ob Dark Mode vorher aktiviert war
if (localStorage.getItem('darkMode') === 'enabled') {
body.classList.add('dark-mode');
// Prüfen, ob Dark Mode vorher aktiviert war
if (localStorage.getItem('darkMode') === 'enabled') {
body.classList.add('dark-mode');
}
toggle.addEventListener('click', () => {
body.classList.toggle('dark-mode');
if (body.classList.contains('dark-mode')) {
localStorage.setItem('darkMode', 'enabled');
} else {
localStorage.setItem('darkMode', 'disabled');
}
toggle.addEventListener('click', () => {
body.classList.toggle('dark-mode');
if (body.classList.contains('dark-mode')) {
localStorage.setItem('darkMode', 'enabled');
} else {
localStorage.setItem('darkMode', 'disabled');
}
});
});
</script>
</body>
</html>
</html>
+96
View File
@@ -0,0 +1,96 @@
<?php
$servername = "testserver.blackpi.ipv64.net";
$username = "worker";
$password = "bBHofurUJWKzPE8Z";
$dbname = "DEV";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Verbindung fehlgeschlagen: " . $conn->connect_error);
}
$sql = "SELECT DATE(FIRST_REQUEST) as tag, COUNT(*) as anzahl FROM logs GROUP BY DATE(FIRST_REQUEST) ORDER BY DATE(FIRST_REQUEST)";
$result = $conn->query($sql);
$labels = [];
$data = [];
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$labels[] = $row['tag'];
$data[] = (int)$row['anzahl'];
}
}
$conn->close();
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>Logs Chart</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
<canvas id="logChart" width="600" height="400"></canvas>
<script>
const ctx = document.getElementById('logChart').getContext('2d');
const logChart = new Chart(ctx, {
type: 'line',
data: {
labels: <?php echo json_encode($labels); ?>,
datasets: [{
label: 'Logs pro Tag',
data: <?php echo json_encode($data); ?>,
borderColor: 'rgba(75, 192, 192, 1)',
backgroundColor: 'rgba(75, 192, 192, 0.2)',
fill: true,
tension: 0
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
title: {
display: true,
text: 'Logs pro Tag'
},
legend: {
display: true,
position: 'top'
}
},
scales: {
x: {
title: {
display: true,
text: 'Datum'
}
},
y: {
min: 0,
max: 300,
title: {
display: true,
text: 'Anzahl Logs'
},
ticks: {
stepSize: 20
},
beginAtZero: true
}
}
}
});
</script>
</body>
</html>
+173
View File
@@ -0,0 +1,173 @@
<?php
include_once '../controller/LogController.php';
include_once '../controller/DatabaseConnect.php';
$conn = db_connect();
// Dev-IPs
$devips = (new getSpecificData())->getWhitelistedIPs();
$devips_sql = "'" . implode("','", $devips) . "'";
// Filter
$filter = $_GET['filter'] ?? 'today';
$customQuery = $_POST['custom_query'] ?? '';
$useCustom = false;
// Custom Query Schutz
if ($customQuery) {
$forbidden = ['DELETE', 'UPDATE', 'INSERT', 'DROP', 'ALTER', 'TRUNCATE'];
$upper = strtoupper($customQuery);
foreach ($forbidden as $bad) {
if (strpos($upper, $bad) !== false) {
echo "<b style='color:red'>Gefährliche Query blockiert ($bad)</b>";
return;
}
}
if (stripos(trim($customQuery), "SELECT") !== 0) {
echo "<b style='color:red'>Nur SELECT erlaubt</b>";
return;
}
$sql = $customQuery;
$useCustom = true;
}
// Standard Queries
if (!$useCustom) {
switch ($filter) {
case 'today':
$sql = "
SELECT `CLIENT_IP`, `LAND`, `REQUEST_URL`, `COUNTER`
FROM logs
WHERE CLIENT_IP NOT IN ($devips_sql)
AND DATE(FIRST_REQUEST) = CURDATE()
ORDER BY FIRST_REQUEST DESC
";
break;
case 'counterperip':
$sql = "
SELECT CLIENT_IP, LAND, USER_AGENT, SUM(counter) AS gesamt_counter
FROM logs
WHERE CLIENT_IP NOT IN ($devips_sql)
GROUP BY CLIENT_IP
ORDER BY gesamt_counter DESC
";
break;
case 'node1':
$sql = "
SELECT `CLIENT_IP`, `LAND`, `REQUEST_URL`, `COUNTER`
FROM logs
WHERE `SERVER_IP` = 'node1'
ORDER BY `FIRST_REQUEST` DESC;
";
break;
case 'node2':
$sql = "
SELECT `CLIENT_IP`, `LAND`, `REQUEST_URL`, `COUNTER`
FROM logs
WHERE `SERVER_IP` = 'node2'
ORDER BY `FIRST_REQUEST` DESC;
";
break;
case 'node3':
$sql = "
SELECT `CLIENT_IP`, `LAND`, `REQUEST_URL`, `COUNTER`
FROM logs
WHERE `SERVER_IP` = 'node3'
ORDER BY `FIRST_REQUEST` DESC;
";
break;
case 'node4':
$sql = "
SELECT `CLIENT_IP`, `LAND`, `REQUEST_URL`, `COUNTER`
FROM logs
WHERE `SERVER_IP` = 'node4'
ORDER BY `FIRST_REQUEST` DESC;
";
break;
$sql = "
SELECT *
FROM logs
WHERE SERVER_IP = '$filter'
ORDER BY FIRST_REQUEST DESC
";
break;
default:
$sql = "
SELECT `CLIENT_IP`, `LAND`, `REQUEST_URL`, `COUNTER`
FROM logs
WHERE CLIENT_IP NOT IN ($devips_sql)
ORDER BY FIRST_REQUEST DESC
";
}
}
?>
<h1>📊 Logs</h1>
<form method="GET">
<select name="filter" onchange="this.form.submit()">
<?php
$options = ['alle','today','node1','node2','node3','node4','counterperip'];
foreach ($options as $opt) {
$sel = $filter === $opt ? 'selected' : '';
echo "<option value='$opt' $sel>$opt</option>";
}
?>
</select>
</form>
<br>
<form method="POST">
<textarea name="custom_query" style="width:100%;height:60px;"><?= htmlspecialchars($customQuery) ?></textarea>
<br>
<button type="submit">Query ausführen</button>
</form>
<hr>
<?php
$daten = [];
if ($erg = $conn->query($sql)) {
echo "<pre style='background:var(--bg-soft,#f4f4f4);padding:10px;'>$sql</pre>";
while ($row = $erg->fetch_object()) {
$daten[] = $row;
}
}
?>
<?php if (!$daten): ?>
<b>Keine Daten gefunden</b>
<?php else: ?>
<div style="overflow-x:auto;">
<table border="1" cellpadding="5" cellspacing="0" style="border-collapse:collapse;width:100%;">
<tr>
<?php foreach ($daten[0] as $key => $_): ?>
<th><?= htmlspecialchars($key) ?></th>
<?php endforeach; ?>
</tr>
<?php foreach ($daten as $row): ?>
<tr>
<?php foreach ($row as $val): ?>
<td><?= htmlspecialchars($val ?? '') ?></td>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
</table>
</div>
<?php endif; ?>
File renamed without changes.
File renamed without changes.
+7
View File
@@ -47,6 +47,7 @@ header {
.content {
flex: 1;
padding: 20px;
overflow: auto;
}
/* Dark Mode Styles */
@@ -54,21 +55,26 @@ body.dark-mode {
background-color: #121212;
color: #f0f0f0;
}
body.dark-mode header {
background-color: #1f1f1f;
}
body.dark-mode .sidebar {
background-color: #1a1a1a;
border-right: 1px solid #333;
}
body.dark-mode .sidebar button {
background-color: #333;
color: #f0f0f0;
}
body.dark-mode .sidebar button.active {
background-color: #007bff;
color: white;
}
body.dark-mode .content {
background-color: #121212;
}
@@ -84,6 +90,7 @@ body.dark-mode .content {
border: none;
border-radius: 4px;
}
body.dark-mode #darkModeToggle {
background-color: #333;
color: white;
-8
View File
@@ -1,8 +0,0 @@
<?php
$services = [
'service2' => ['name' => 'Service 1', 'active' => true],
'service3' => ['name' => 'Service 2', 'active' => true],
'request_chart' => ['name' => 'Request Logs', 'active' => true],
'services_control' => ['name' => 'Services Control', 'active' => true],
];
?>
-93
View File
@@ -1,93 +0,0 @@
<?php
$servername = "testserver.blackpi.ipv64.net";
$username = "worker";
$password = "bBHofurUJWKzPE8Z";
$dbname = "DEV";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Verbindung fehlgeschlagen: " . $conn->connect_error);
}
$sql = "SELECT DATE(FIRST_REQUEST) as tag, COUNT(*) as anzahl FROM logs GROUP BY DATE(FIRST_REQUEST) ORDER BY DATE(FIRST_REQUEST)";
$result = $conn->query($sql);
$labels = [];
$data = [];
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$labels[] = $row['tag'];
$data[] = (int)$row['anzahl'];
}
}
$conn->close();
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>Logs Chart</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
<canvas id="logChart" width="600" height="400"></canvas>
<script>
const ctx = document.getElementById('logChart').getContext('2d');
const logChart = new Chart(ctx, {
type: 'line',
data: {
labels: <?php echo json_encode($labels); ?>,
datasets: [{
label: 'Logs pro Tag',
data: <?php echo json_encode($data); ?>,
borderColor: 'rgba(75, 192, 192, 1)',
backgroundColor: 'rgba(75, 192, 192, 0.2)',
fill: true,
tension: 0
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
title: {
display: true,
text: 'Logs pro Tag'
},
legend: {
display: true,
position: 'top'
}
},
scales: {
x: {
title: {
display: true,
text: 'Datum'
}
},
y: {
min: 0,
max: 300,
title: {
display: true,
text: 'Anzahl Logs'
},
ticks: {
stepSize: 20
},
beginAtZero: true
}
}
}
});
</script>
</body>
</html>
-2
View File
@@ -1,2 +0,0 @@
<h2>Service 2</h2>
<p>Dies ist der Inhalt von Service 2.</p>