mirror of
https://github.com/ShaYmez/FreeSTAR-Status-Engine.git
synced 2025-06-30 15:55:16 -04:00
Compare commits
27 Commits
Version2Be
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
3171670a43 | ||
|
f942c4905e | ||
|
ee37419582 | ||
|
788ca4ccd0 | ||
|
dbd918fd6f | ||
|
541555294b | ||
|
e7a294ef42 | ||
|
c7003cfa32 | ||
|
e0ff612569 | ||
|
9d5ab1f0d2 | ||
|
8731add072 | ||
|
8845ad65f0 | ||
|
7601038f6b | ||
|
9ef3938e10 | ||
|
5374602896 | ||
|
b2baa5051b | ||
|
9951c22d07 | ||
|
2d65d0f9df | ||
|
c9bcbc241b | ||
|
184f803d6e | ||
|
002bb13e10 | ||
|
9d3d14f67c | ||
|
58b375161d | ||
|
f33bf996c6 | ||
|
3e706233a4 | ||
|
1408d0ad91 | ||
|
8007097d2f |
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
config.php
|
||||
.idea/
|
||||
.vscode/
|
||||
.code/
|
3
404.php
3
404.php
@ -1,4 +1,7 @@
|
||||
<?php
|
||||
define("NAME", "");
|
||||
define("TITLE", "");
|
||||
define("WEB_URL", "");
|
||||
require_once("template.php");
|
||||
if (!file_exists("config.php"))
|
||||
{
|
||||
|
32
Dockerfile
Normal file
32
Dockerfile
Normal file
@ -0,0 +1,32 @@
|
||||
FROM php:8.2-apache
|
||||
RUN docker-php-ext-install mysqli
|
||||
RUN docker-php-ext-enable mysqli
|
||||
RUN apt-get update
|
||||
RUN apt-get install libzip-dev -y
|
||||
RUN docker-php-ext-install zip
|
||||
RUN docker-php-ext-enable zip
|
||||
RUN a2enmod rewrite
|
||||
RUN touch /usr/local/etc/php/conf.d/ssp.ini
|
||||
RUN echo "output_buffering = 16384" >> /usr/local/etc/php/conf.d/ssp.ini
|
||||
RUN echo "display_errors = off" >> /usr/local/etc/php/conf.d/ssp.ini
|
||||
RUN echo "error_reporting = E_ERROR" >> /usr/local/etc/php/conf.d/ssp.ini
|
||||
RUN apt install git -y
|
||||
WORKDIR /var/www/html
|
||||
RUN docker-php-ext-install gettext
|
||||
RUN docker-php-ext-install pdo_mysql
|
||||
RUN apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev && docker-php-ext-configure gd --with-freetype --with-jpeg && docker-php-ext-install -j$(nproc) gd
|
||||
RUN apt-get install -y locales
|
||||
RUN locale-gen en_GB.UTF-8
|
||||
RUN sed -i '/en_GB.UTF-8/s/^# //g' /etc/locale.gen && \
|
||||
locale-gen
|
||||
RUN apt-get install -y curl
|
||||
# And clean up the image
|
||||
RUN rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN curl -Lsf 'https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz' | tar -C '/usr/local' -xvzf -
|
||||
ENV PATH /usr/local/go/bin:$PATH
|
||||
RUN go get github.com/mailhog/mhsendmail
|
||||
RUN cp /root/go/bin/mhsendmail /usr/bin/mhsendmail
|
||||
RUN echo 'sendmail_path = /usr/bin/mhsendmail --smtp-addr mailhog:1025' > /usr/local/etc/php/php.ini
|
||||
|
||||
|
12
README.md
12
README.md
@ -1,19 +1,19 @@
|
||||
# Server Status Beta (Official)
|
||||
## This is the official beta fork of Server Status by the contributors.
|
||||
# Server Status (Official)
|
||||
## This is the official Server Status Project.
|
||||
 
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
<!--
|
||||
## What does **contributor beta** mean?
|
||||
It means the beta that is heavily unstable that is meant for contributors to make changes and use as a recovery point.
|
||||
### Other Beta Type
|
||||
### Other Beta Types
|
||||
#### Development Beta
|
||||
##### This beta has some bugs that are noticeable and is sometimes unstable. Best for new contributors
|
||||
#### Public Beta
|
||||
##### This beta has some bugs that are not really noticeable and mostly exist as bugs. Best for trying the new features before updating!
|
||||
Very simple server status page written in PHP that can run on **PHP 5.4+** - even on **shared webhosting** even without shell access. Because why waste your money on another server (or host on a server that you might want to do maintenance on), when you can use cheap webhosting? And as a cherry on top - it works even without javascript!
|
||||
-->
|
||||
Very simple server status page written in PHP that can run on **PHP 5.5+** - even on **shared webhosting** even without shell access. Because why waste your money on another server (or host on a server that you might want to do maintenance on), when you can use cheap webhosting? And as a cherry on top - it works even without javascript!
|
||||
|
||||
## How do I install this thing?
|
||||
Simply put the files on your server and access it from your browser. There will be a simple install dialog waiting for you.
|
||||
|
15
SECURITY.md
Normal file
15
SECURITY.md
Normal file
@ -0,0 +1,15 @@
|
||||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
Only the latest version of server-status is being supported. Older versions won't recieve security updates.
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
If you believe that you have have discovered a vulnerability you can report it by emailing the [lead maintainer](https://github.com/Pryx) at vojtech@sajdl.com.
|
||||
|
||||
Please include the keyword VULNERABILITY and the repository name in the subject of the email.
|
||||
|
||||
In the email, please describe your findings, the project versions you tested and were affected by the vulnerability and also include the full steps to reproduce it.
|
||||
We appreciate your efforts to make server-status more secure and will try to do everytihing in our power to get the issues resolved as fast as possible. We will
|
||||
keep you informed of the progress towards a fix.
|
@ -47,7 +47,7 @@ Template::render_header(_("User"), true);
|
||||
?>
|
||||
<div class="text-center">
|
||||
<h1><?php
|
||||
if ($_SESSION['user'] == $_GET['id'])
|
||||
if (isset($_GET['id']) && isset($_SESSION['user']) && $_SESSION['user'] == $_GET['id'])
|
||||
{
|
||||
echo _("User settings");
|
||||
}else{
|
||||
|
@ -15,26 +15,25 @@ else{
|
||||
$array = $constellation->render_status(true, false);
|
||||
echo json_encode($array);
|
||||
}else{
|
||||
$query = $mysqli->prepare("SELECT name FROM services WHERE id=?");
|
||||
$query->bind_param("i", $_GET['id']);
|
||||
$query->execute();
|
||||
$result = $query->get_result()->fetch_assoc();
|
||||
// get id of service, check if service exists
|
||||
$queryId = $mysqli->prepare("SELECT id from services where id = ?;");
|
||||
$queryId->bind_param("i", $_GET['id']);
|
||||
$queryId->execute();
|
||||
$result = $queryId->get_result()->fetch_assoc();
|
||||
if (!count($result))
|
||||
{
|
||||
die(json_encode(["error" => _("Service does not exist!")]));
|
||||
}
|
||||
|
||||
$sql = $mysqli->prepare("SELECT type FROM services_status INNER JOIN status ON services_status.status_id = status.id WHERE service_id = ? AND `time` <= ? AND (`end_time` >= ? OR `end_time`=0) ORDER BY `time` DESC LIMIT 1");
|
||||
|
||||
$sql->bind_param("iii", $id, $timestamp, $timestamp);
|
||||
$sql->execute();
|
||||
$tmp = $sql->get_result();
|
||||
if ($tmp->num_rows)
|
||||
{
|
||||
$service = new Service($_GET['id'], $result['name'], $tmp->fetch_assoc()['type']);
|
||||
}
|
||||
else{
|
||||
$service = new Service($_GET['id'], $result['name']);
|
||||
// get name, description and status.type (status of service) by id
|
||||
$query = $mysqli->prepare("select services.id, name, description, status.type from services inner join status on status.id = services.id where services.id = ?;");
|
||||
$query->bind_param("i", $_GET['id']);
|
||||
$query->execute();
|
||||
$result = $query->get_result()->fetch_assoc();
|
||||
// if type is a number then return it, else just return the service name/desc
|
||||
if (is_numeric($result["type"])) {
|
||||
$service = new Service($_GET["id"], $result["name"], $result["description"], '', $result["type"]);
|
||||
} else {
|
||||
$service = new Service($_GET["id"], $result["name"], $result["description"]);
|
||||
}
|
||||
|
||||
echo json_encode($service);
|
||||
|
@ -69,11 +69,11 @@ class Constellation
|
||||
* @param boolean $admin
|
||||
* @return array of services
|
||||
*/
|
||||
public function render_status($admin = false, $heading = true){
|
||||
public function render_status($admin = false, $heading = true): array{
|
||||
global $mysqli;
|
||||
|
||||
//$query = $mysqli->query("SELECT id, name, description FROM services");
|
||||
$query = $mysqli->query("SELECT services.id, services.name, services.description, services_groups.name as group_name FROM services LEFT JOIN services_groups ON services.group_id=services_groups.id ORDER BY services_groups.name ");
|
||||
$query = $mysqli->query("SELECT services.id, services.name, services.description, services_groups.name as group_name FROM services LEFT JOIN services_groups ON services.group_id=services_groups.id ORDER BY services_groups.name ASC, services.name;");
|
||||
$array = array();
|
||||
if ($query->num_rows){
|
||||
$timestamp = time();
|
||||
@ -104,27 +104,12 @@ class Constellation
|
||||
}
|
||||
if (!$admin)
|
||||
{
|
||||
?>
|
||||
<script>
|
||||
$(document).ready(function(){
|
||||
$('[data-toggle="tooltip"]').tooltip();
|
||||
});
|
||||
</script>
|
||||
<?php
|
||||
//echo '<div id="status-container" class="clearfix">';
|
||||
//$arrCompletedGroups = array();
|
||||
|
||||
foreach($array as $service){
|
||||
//print_r($service);
|
||||
//if ( !empty($service->group_name) && !in_array($service->group_name, $arrCompletedGroups)) {
|
||||
//print $service->name;
|
||||
// $arrCompletedGroups[] = $service['group_name'];
|
||||
// $service->render(true);
|
||||
//} else {
|
||||
$service->render();
|
||||
//}
|
||||
}
|
||||
echo '</ul>';
|
||||
//echo '</div>';
|
||||
return $array;
|
||||
}
|
||||
else{
|
||||
return $array;
|
||||
|
@ -223,7 +223,7 @@ class Incident implements JsonSerializable
|
||||
<?php
|
||||
}
|
||||
|
||||
public function jsonSerialize() {
|
||||
public function jsonSerialize():mixed {
|
||||
return [
|
||||
"id" => $this->id,
|
||||
"date" => $this->timestamp,
|
||||
|
@ -150,7 +150,6 @@ class LocaleNegotiator
|
||||
'nl_BE' => 'Nederlands',
|
||||
'nl_NL' => 'Nederlands',
|
||||
'nn_NO' => 'Nynorsk',
|
||||
'nb_NO' => 'Norsk Bokmål',
|
||||
'nso_ZA' => 'Northern sotho',
|
||||
'oc_FR' => 'Occitan',
|
||||
'or_IN' => 'ଓଡ଼ିଆ',
|
||||
|
@ -60,6 +60,11 @@ class Notification
|
||||
$sql = "SELECT DISTINCT subscriberIDFK FROM services_subscriber WHERE serviceIDFK IN (" . $this->serviceids . ")";
|
||||
$query = $mysqli->query($sql);
|
||||
|
||||
if (0 === $query->num_rows) {
|
||||
// skip processing if no one needs to be notified
|
||||
return;
|
||||
}
|
||||
|
||||
// Create the queue tasks for email/telegram notifications
|
||||
$queue = new Queue();
|
||||
$queue->status = $queue->all_status['populating'];
|
||||
@ -125,7 +130,7 @@ class Notification
|
||||
* @param string $msg Body of message
|
||||
* @return boolean true = Sent / False = failed
|
||||
*/
|
||||
public function submit_queue_telegram($userID, $firstname, $msg)
|
||||
public static function submit_queue_telegram($userID, $firstname, $msg)
|
||||
{
|
||||
// TODO Handle limitations (Max 30 different subscribers per second)
|
||||
// TODO Error handling
|
||||
@ -150,7 +155,7 @@ class Notification
|
||||
* @param String $uthkey Users token for managing subscription
|
||||
* @return void
|
||||
*/
|
||||
public function submit_queue_email($subscriber, $subject, $msg)
|
||||
public static function submit_queue_email($subscriber, $subject, $msg): bool
|
||||
{
|
||||
// TODO Error handling
|
||||
$mailer = new Mailer();
|
||||
|
@ -49,7 +49,7 @@ class Queue
|
||||
* Remove task from the queue
|
||||
* @return void
|
||||
*/
|
||||
public function delete_task($task_id){
|
||||
public static function delete_task($task_id){
|
||||
global $mysqli;
|
||||
$stmt = $mysqli->prepare("DELETE FROM queue_task WHERE id = ?");
|
||||
$stmt->bind_param("i", $task_id);
|
||||
@ -98,14 +98,14 @@ class Queue
|
||||
$this->set_task_status($this->all_status['ready']); // Make task available for release
|
||||
}
|
||||
|
||||
public function update_notification_retries($task_id, $subscriber_id) {
|
||||
public static function update_notification_retries($task_id, $subscriber_id) {
|
||||
global $mysqli;
|
||||
$stmt = $mysqli->prepare("UPDATE queue_notify SET retries = retries+1 WHERE task_id = ? AND subscriber_id = ?");
|
||||
$stmt->bind_param("ii", $task_id, $subscriber_id);
|
||||
$stmt->execute();
|
||||
}
|
||||
|
||||
public function delete_notification($task_id, $subscriber_id) {
|
||||
public static function delete_notification($task_id, $subscriber_id) {
|
||||
global $mysqli;
|
||||
$stmt = $mysqli->prepare("DELETE FROM queue_notify WHERE task_id = ? AND subscriber_id = ?");
|
||||
$stmt->bind_param("ii", $task_id, $subscriber_id);
|
||||
@ -114,7 +114,7 @@ class Queue
|
||||
}
|
||||
|
||||
// TODO: Fix max attempts for notifications
|
||||
public function process_queue(){
|
||||
public static function process_queue(){
|
||||
global $mysqli;
|
||||
$stmt = $mysqli->query("SELECT qn.id, qn.task_id, qn.status, qn.subscriber_id, qn.retries, sub.firstname, sub.userID, sub.token FROM queue_notify AS qn INNER JOIN subscribers AS sub ON qn.subscriber_id = sub.subscriberID WHERE qn.status NOT LIKE 2 AND sub.active=1");
|
||||
while ( $result = $stmt->fetch_assoc() ) {
|
||||
|
@ -8,6 +8,7 @@ class ServiceGroup
|
||||
private $name;
|
||||
private $description;
|
||||
private $visibility_id;
|
||||
private $status;
|
||||
|
||||
/**
|
||||
* Constructs servicegroup from its data.
|
||||
@ -16,7 +17,7 @@ class ServiceGroup
|
||||
* @param String $description tooltip text
|
||||
* @param int $visibility_id how to display group items
|
||||
*/
|
||||
function __construct($id, $name, $description, $visibility_id)
|
||||
function __construct($id, $name, $description, $visibility_id, $status)
|
||||
|
||||
{
|
||||
//TODO: Maybe get data from ID?
|
||||
@ -153,7 +154,7 @@ class ServiceGroup
|
||||
* Get list of services groups.
|
||||
* @return array $groups
|
||||
*/
|
||||
public function get_groups() {
|
||||
public static function get_groups() {
|
||||
global $mysqli;
|
||||
$stmt = $mysqli->query("SELECT id, name FROM services_groups ORDER by name ASC");
|
||||
|
||||
|
@ -180,7 +180,7 @@ class Service implements JsonSerializable
|
||||
* @param Service[] $array array of services
|
||||
* @return void
|
||||
*/
|
||||
public static function current_status($array){
|
||||
public static function current_status($array): void{
|
||||
global $all, $some, $classes;
|
||||
$statuses = array(0,0,0,0);
|
||||
$worst = 5;
|
||||
@ -258,7 +258,7 @@ class Service implements JsonSerializable
|
||||
}
|
||||
}
|
||||
|
||||
public function jsonSerialize() {
|
||||
public function jsonSerialize(): mixed {
|
||||
global $statuses;
|
||||
return [
|
||||
"id" => $this->id,
|
||||
|
@ -190,7 +190,7 @@ Class Subscriber
|
||||
{
|
||||
global $mysqli;
|
||||
|
||||
|
||||
// error_log(print_r($token, TRUE));
|
||||
$stmt = $mysqli->prepare("SELECT subscriberID, token, userID, active, expires FROM subscribers WHERE token LIKE ? LIMIT 1");
|
||||
$stmt->bind_param("s", $token );
|
||||
$stmt->execute();
|
||||
@ -202,7 +202,7 @@ Class Subscriber
|
||||
// No data found, fail gently...
|
||||
return false;
|
||||
}
|
||||
|
||||
// error_log(print_r($row, TRUE));
|
||||
// If account is not already active, check if we are within timeframe of exipre +2h
|
||||
// and active if so, otherwise,delete account and return falsev
|
||||
if ( $row['active'] <> 1 ) {
|
||||
|
@ -210,12 +210,12 @@ class User
|
||||
public static function login()
|
||||
{
|
||||
global $message, $mysqli;
|
||||
if (!isset($_POST['email']) && !isset($_POST['email']))
|
||||
if (!isset($_POST['email']) && !isset($_POST['pass']))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if ((!isset($_POST['email']) || !isset($_POST['email'])))
|
||||
if ((!isset($_POST['email']) || !isset($_POST['pass'])))
|
||||
{
|
||||
$message = _("Please fill in your email and password!");
|
||||
return;
|
||||
|
@ -7,17 +7,26 @@
|
||||
// This is needed because some hosts do not either unzip hidden files
|
||||
// or neither GitHub puts that file inside the zips.
|
||||
/********************************************************************/
|
||||
$apacheExampleName = "ApacheHtaccess";
|
||||
$apacheProductionName = ".htaccess";
|
||||
$iisExampleName = "IISWebConfig";
|
||||
$iisProductionName = "web.config";
|
||||
if(stripos($_SERVER['SERVER_SOFTWARE'],'apache')!== false){
|
||||
$f = fopen(".htaccess", "a+");
|
||||
$f2 = fopen("ApacheHtaccess","r");
|
||||
fwrite($f, fread($f2, filesize("ApacheHtaccess")));
|
||||
fclose($f);
|
||||
fclose($f2);
|
||||
if(!file_exists($apacheProductionName)) {
|
||||
$f = fopen($apacheProductionName, "a+");
|
||||
$f2 = fopen($apacheExampleName,"r");
|
||||
fwrite($f, fread($f2, filesize($apacheExampleName)));
|
||||
fclose($f);
|
||||
fclose($f2);
|
||||
}
|
||||
// skipping renaming file if it already exists
|
||||
} else {
|
||||
$f = fopen("web.config", "a+");
|
||||
$f2 = fopen("IISWebConfig","r");
|
||||
fwrite($f, fread($f2, filesize("IISWebConfig")));
|
||||
fclose($f);
|
||||
fclose($f2);
|
||||
if(!file_exists($iisProductionName)) {
|
||||
$f = fopen($iisProductionName, "a+");
|
||||
$f2 = fopen($iisExampleName,"r");
|
||||
fwrite($f, fread($f2, filesize($iisExampleName)));
|
||||
fclose($f);
|
||||
fclose($f2);
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
10
css/main.css
10
css/main.css
@ -64,9 +64,9 @@ a.desc-tool-tip, a.desc-tool-tip:hover, a.desc-tool-tip:visited {
|
||||
background: gray;
|
||||
}
|
||||
.navbar-default {
|
||||
z-index: 200;
|
||||
background-color: gray;
|
||||
border-color: transparent;
|
||||
z-index: 200;
|
||||
background-color: gray;
|
||||
border-color: transparent;
|
||||
border-radius: 0px 0px 30px 30px;
|
||||
height: 77px;
|
||||
position: fixed;
|
||||
@ -95,7 +95,7 @@ div.center {
|
||||
#wrapper
|
||||
{
|
||||
max-width: 1024px;
|
||||
min-height: calc(100vh - 157px);
|
||||
min-height: calc(100vh - 139px);
|
||||
padding-right: 15px;
|
||||
padding-left: 15px
|
||||
}
|
||||
@ -133,7 +133,7 @@ body a h1{
|
||||
.status{
|
||||
float: right;
|
||||
box-sizing: border-box;
|
||||
padding: 15px 35px;
|
||||
padding: 0px 35px;
|
||||
text-align: right;
|
||||
font-size: 1.05em;
|
||||
font-family: 'Fira Sans', sans-serif;
|
||||
|
31
docker-compose.yml
Normal file
31
docker-compose.yml
Normal file
@ -0,0 +1,31 @@
|
||||
version: '3'
|
||||
|
||||
networks:
|
||||
status-db:
|
||||
|
||||
services:
|
||||
server-status:
|
||||
build: .
|
||||
volumes:
|
||||
- ./:/var/www/html
|
||||
ports:
|
||||
- 4000:80
|
||||
networks:
|
||||
- status-db
|
||||
dbserver:
|
||||
image: mysql
|
||||
command: --default-authentication-plugin=mysql_native_password
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: e347h43cve89
|
||||
MYSQL_DATABASE: server_status
|
||||
volumes:
|
||||
- ./database:/var/lib/mysql
|
||||
networks:
|
||||
- status-db
|
||||
mailhog:
|
||||
image: mailhog/mailhog
|
||||
ports:
|
||||
- "1025:1025"
|
||||
- "8025:8025"
|
||||
networks:
|
||||
- status-db
|
24
index.php
24
index.php
@ -40,14 +40,13 @@ define("TITLE", $db->getSetting($mysqli,"title"));
|
||||
define("WEB_URL", $db->getSetting($mysqli,"url"));
|
||||
define("MAILER_NAME", $db->getSetting($mysqli,"mailer"));
|
||||
define("MAILER_ADDRESS", $db->getSetting($mysqli,"mailer_email"));
|
||||
|
||||
define("SUBSCRIBE_EMAIL", $db->getBooleanSetting($mysqli,"subscribe_email"));
|
||||
define("SUBSCRIBE_TELEGRAM", $db->getBooleanSetting($mysqli,"subscribe_telegram"));
|
||||
define("TG_BOT_USERNAME", $db->getSetting($mysqli,"tg_bot_username"));
|
||||
define("TG_BOT_API_TOKEN", $db->getSetting($mysqli,"tg_bot_api_token"));
|
||||
define("GOOGLE_RECAPTCHA", $db->getBooleanSetting($mysqli,"google_recaptcha"));
|
||||
define("GOOGLE_RECAPTCHA_SITEKEY", $db->getSetting($mysqli,"google_recaptcha_sitekey"));
|
||||
define("GOOGLE_RECAPTCHA_SECRET", $db->getSetting($mysqli,"google_recaptcha_secret"));
|
||||
define("SUBSCRIBE_EMAIL", $db->getBooleanSetting($mysqli,"subscribe_email") ?: "");
|
||||
define("SUBSCRIBE_TELEGRAM", $db->getBooleanSetting($mysqli,"subscribe_telegram") ?: "");
|
||||
define("TG_BOT_USERNAME", $db->getSetting($mysqli,"tg_bot_username") ?: "");
|
||||
define("TG_BOT_API_TOKEN", $db->getSetting($mysqli,"tg_bot_api_token") ?: "");
|
||||
define("GOOGLE_RECAPTCHA", $db->getBooleanSetting($mysqli,"google_recaptcha") ?: "");
|
||||
define("GOOGLE_RECAPTCHA_SITEKEY", $db->getSetting($mysqli,"google_recaptcha_sitekey") ?: "");
|
||||
define("GOOGLE_RECAPTCHA_SECRET", $db->getSetting($mysqli,"google_recaptcha_secret") ?: "");
|
||||
$offset = 0;
|
||||
|
||||
if (isset($_GET['ajax']))
|
||||
@ -101,7 +100,7 @@ Template::render_header("Status");
|
||||
<?php $constellation->render_status();?>
|
||||
</div>
|
||||
|
||||
<?php if ($mysqli->query("SELECT count(*) FROM status")->num_rows)
|
||||
<?php if ($mysqli->query("SELECT count(*) FROM status"))
|
||||
{
|
||||
?>
|
||||
<div id="timeline">
|
||||
@ -119,3 +118,10 @@ Template::render_header("Status");
|
||||
|
||||
Template::render_footer();
|
||||
}
|
||||
?>
|
||||
<script>
|
||||
$(document).ready(function(){
|
||||
$('[data-toggle="tooltip"]').tooltip();
|
||||
});
|
||||
</script>
|
||||
<?php
|
19
install.php
19
install.php
@ -9,6 +9,14 @@ define("COPYRIGHT_TEXT","");
|
||||
require_once("classes/locale-negotiator.php");
|
||||
require_once("classes/db-class.php");
|
||||
|
||||
$isDeveleoperEnvironement = false;
|
||||
if(isset($_GET["isDev"])){
|
||||
if($_GET["isDev"] == "devMode"){
|
||||
$isDeveleoperEnvironement = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$negotiator = new LocaleNegotiator("en_GB");
|
||||
$message = "";
|
||||
$db = new SSDB();
|
||||
@ -161,11 +169,12 @@ if(isset($_POST['server']) && empty($message))
|
||||
$db->setSetting($mysqli,"google_recaptcha_secret","");
|
||||
$db->setSetting($mysqli,"google_recaptcha_sitekey","");
|
||||
$db->setSetting($mysqli,"cron_server_ip","");
|
||||
unlink("create-server-config.php");
|
||||
unlink("config.php.template");
|
||||
unlink("install.sql");
|
||||
unlink(__FILE__);
|
||||
|
||||
if(!$isDeveleoperEnvironement) {
|
||||
unlink("create-server-config.php");
|
||||
unlink("config.php.template");
|
||||
unlink("install.sql");
|
||||
unlink(__FILE__);
|
||||
}
|
||||
header("Location: ".WEB_URL);
|
||||
}
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ function ordUTF8($c, $index = 0, &$bytes = null)
|
||||
$bytes = 0;
|
||||
if ($index >= $len)
|
||||
return false;
|
||||
$h = ord($c{$index});
|
||||
$h = ord($c[$index]);
|
||||
if ($h <= 0x7F) {
|
||||
$bytes = 1;
|
||||
return $h;
|
||||
@ -21,18 +21,18 @@ function ordUTF8($c, $index = 0, &$bytes = null)
|
||||
return false;
|
||||
else if ($h <= 0xDF && $index < $len - 1) {
|
||||
$bytes = 2;
|
||||
return ($h & 0x1F) << 6 | (ord($c{$index + 1}) & 0x3F);
|
||||
return ($h & 0x1F) << 6 | (ord($c[$index + 1]) & 0x3F);
|
||||
}
|
||||
else if ($h <= 0xEF && $index < $len - 2) {
|
||||
$bytes = 3;
|
||||
return ($h & 0x0F) << 12 | (ord($c{$index + 1}) & 0x3F) << 6
|
||||
| (ord($c{$index + 2}) & 0x3F);
|
||||
return ($h & 0x0F) << 12 | (ord($c[$index + 1]) & 0x3F) << 6
|
||||
| (ord($c[$index + 2]) & 0x3F);
|
||||
}
|
||||
else if ($h <= 0xF4 && $index < $len - 3) {
|
||||
$bytes = 4;
|
||||
return ($h & 0x0F) << 18 | (ord($c{$index + 1}) & 0x3F) << 12
|
||||
| (ord($c{$index + 2}) & 0x3F) << 6
|
||||
| (ord($c{$index + 3}) & 0x3F);
|
||||
return ($h & 0x0F) << 18 | (ord($c[$index + 1]) & 0x3F) << 12
|
||||
| (ord($c[$index + 2]) & 0x3F) << 6
|
||||
| (ord($c[$index + 3]) & 0x3F);
|
||||
}
|
||||
else
|
||||
return false;
|
||||
|
@ -52,5 +52,5 @@
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p style="text-align: center;"><a href="%url%/?do=unsubscribe&token=%token%"><sub><sup>%unsubscribe%</sup></sub></a></p>
|
||||
<p style="text-align: center;"><a href="%url%/?do=unsubscribe&type=2&token=%token%"><sub><sup>%unsubscribe%</sup></sub></a></p>
|
||||
<p style="text-align: center;"><a href="%url%"><img src="%url%/favicon/apple-icon-57x57.png" alt="" /> %powered_by% Server-Status</a></p>
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
27
template.php
27
template.php
@ -1,6 +1,11 @@
|
||||
<?php
|
||||
//This should later be translatable, maybe find a better solution?
|
||||
//This is here for better generation of POT files :)
|
||||
|
||||
// enable this for debugging
|
||||
// error_reporting(E_ALL);
|
||||
// ini_set('display_startup_errors', 1);
|
||||
// ini_set('display_errors', 1);
|
||||
// ini_set("log_errors", 1);
|
||||
|
||||
$statuses = array(_("Major outage"), _("Minor outage"), _("Planned maintenance"), _("Operational") );
|
||||
$classes = array("danger", "warning", "primary", "success" );
|
||||
$icons = array("fa fa-times", "fa fa-exclamation", "fa fa-info", "fa fa-check" );
|
||||
@ -28,7 +33,8 @@ class Template{
|
||||
if ( 'admin' == $str_url ) {
|
||||
$strSubsMenu = '';
|
||||
} else {
|
||||
if (SUBSCRIBE_EMAIL || SUBSCRIBE_TELEGRAM ) {
|
||||
$strSubsMenu = '';
|
||||
if (defined('SUBSCRIBE_EMAIL') || defined('SUBSCRIBE_TELEGRAM') ) {
|
||||
// Subscriber menu is to be shown...
|
||||
$strSubsMenu = '<ul class="nav navbar-nav mr-auto">';
|
||||
// If subscriber is not logged on, display subscriber menus
|
||||
@ -58,9 +64,13 @@ class Template{
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php
|
||||
if(defined('admin') && !admin){
|
||||
$headfile = fopen("head.txt", "r") or die("Unable to open head.txt!");
|
||||
$head_additionalcode = fread($versionfile,filesize("head.txt"));
|
||||
fclose($headfile); ?>
|
||||
$head_additionalcode = fread($versionfile ?? "Version2Beta8",filesize("head.txt"));
|
||||
fclose($headfile);
|
||||
echo $head_additionalcode;
|
||||
}
|
||||
?>
|
||||
<meta charset="utf-8">
|
||||
<title><?php echo $page_name." - ".NAME ?></title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
@ -174,6 +184,9 @@ class Template{
|
||||
/**
|
||||
* Renders a toggle switch
|
||||
* Created by Yigit Kerem Oktay
|
||||
* @param String $toggletext will decide what the description text next to the toggle will be
|
||||
* @param String $input_name will decide what the HTML Name attribute of the toggle will be
|
||||
* @param Boolean $checked will decide if the toggle will initially be on or off
|
||||
*/
|
||||
public static function render_toggle($toggletext,$input_name,$checked){
|
||||
?>
|
||||
@ -199,7 +212,7 @@ class Template{
|
||||
<div id="footerwrap">
|
||||
<div class="container">
|
||||
<div class="row centered">
|
||||
<div class="col-md-4 text-left"><a href="https://github.com/Pryx/server-status/graphs/contributors" target="_blank">Copyright © <?php echo date("Y");?> Server Status Project Contributors </a><?php if(strlen(COPYRIGHT_TEXT)>1){ echo " and ".COPYRIGHT_TEXT; } ?></div>
|
||||
<div class="col-md-4 text-left"><a href="https://github.com/server-status-project/server-status/graphs/contributors" target="_blank">Copyright © <?php echo date("Y");?> Server Status Project Contributors </a><?php if(strlen(COPYRIGHT_TEXT)>1){ echo " and ".COPYRIGHT_TEXT; } ?></div>
|
||||
<div class="col-md-4 text-center">
|
||||
<div class="btn-group dropup">
|
||||
<button type="button" class="btn btn-primary"><?php echo '<img src="'.WEB_URL.'/locale/'.$_SESSION['locale'].'/flag.png" alt="'.$lang_names[$_SESSION['locale']].'">'.$lang_names[$_SESSION['locale']];?></button>
|
||||
@ -232,7 +245,7 @@ class Template{
|
||||
<?php }?>
|
||||
<script src="<?php echo WEB_URL;?>/js/vendor/bootstrap.min.js"></script>
|
||||
<script src="<?php echo WEB_URL;?>/js/main.js"></script>
|
||||
<?php if ( GOOGLE_RECAPTCHA ) { ?><script src='https://www.google.com/recaptcha/api.js'></script><?php }?>
|
||||
<?php if ( defined('GOOGLE_RECAPTCHA') ) { ?><script src='https://www.google.com/recaptcha/api.js'></script><?php }?>
|
||||
</body>
|
||||
</html>
|
||||
<?php
|
||||
|
Loading…
x
Reference in New Issue
Block a user