1
0
mirror of https://gitlab.com/JKANetwork/CheckServer.git synced 2026-02-25 22:43:47 +01:00

7 Commits
v0.9 ... v0.9.1

Author SHA1 Message Date
374bd97a91 Version 0.9.1 fix before release 2017-12-28 23:38:33 +01:00
3ded2a052c Version 0.9.1 (Beta) 2017-12-28 23:14:37 +01:00
0e13bfc91a Add gitignore file 2017-12-28 22:08:14 +00:00
446102796f Merge branch 'master' of gitlab.com:JKANetwork/CheckServer 2017-12-16 20:19:35 +01:00
a44f87cea4 Optimize index and fix delete older checks from hist 2017-12-16 20:18:43 +01:00
Kevin Puertas
344f837c30 Optimize index and fix delete older checks from hist 2017-12-16 20:17:00 +01:00
Kevin Puertas
1be1751a3d View uptime in index page 2017-11-04 18:58:17 +01:00
26 changed files with 312 additions and 174 deletions

5
.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
#Database file
sqlite.db3
#Well known (Other)
**/.well-known/

View File

@@ -5,27 +5,26 @@ without dependencies and installable only coping repository and ajusting some pa
Also can show stadistics for all sites
Demo can be viewed in https://status.jkanetwork.com/
Real using index 'demo' can be viewed in https://status.jkanetwork.com/
## Disclaimer
This is an beta, opensource, and human made program. **There may be bugs and problems**, and
although we can help or fix things, JKANetwork is **not** responsable for derivated problems.
This is an beta, opensource, and a human made program. **There may be bugs and problems**, and
although we can update and fix things, JKANetwork is **not** responsable for derivated problems.
You can see the master code and tell us any improvment or bug. Plase see indications for installing if you want
to install instead of downloading master and install, that it will not work right. Master is like beta, and tags its like releases.
to install without problems. Master is bleeding edge, use tags for versions and not having problems.
## Requirements
-Modern PHP (5.6+) with SQLite enabled
-Modern PHP (5.6+) with SQLite3 enabled
-Cron support
## Install
For installing, only download last version from https://gitlab.com/JKANetwork/CheckServer/tags (not git master, reason
below. **Think of tags as releases**)
, decompress it and copy all to the folder in your hosting.
below. **Think of tags as releases**), decompress it and copy all to the folder in your hosting.
Please **do not download and use master git**,it is not recommended, because is for devel and things like installer sql can not work right. Use the tags. **Think of tags as releases**
@@ -36,13 +35,23 @@ For finishing it, you have to add a cron in your system for running checks. The
*/5 * * * * root cd /srv/http/checkserver/ && /usr/bin/php -f cronchk.php >/dev/null 2>&1
```
## Update
Decompress folder over your installation folder, and run "updater.php",
it will update and say if something goes wrong. Its a good idea to make
a backup of your sqlite.db3 database.
## Changelog
### (NEXT) Version 0.9.1 (Beta)
### (WIP) Version 0.9.2
-TODO: See uptime percent
-TODO: More info in admin page
-TODO: Better index admin page (More data)
### Version 0.9.1 (Beta)
-See uptime percent
-Optimized index webpage, times went down to half when have a lot of pages
### Version 0.9 (Beta)

View File

@@ -12,7 +12,7 @@
<tr>
<!--<th>#</th>-->
<th>{{T_.name}}</th>
<th>{{T_.status}}</th>
<th>{{T_.status_uptime}}</th>
<th>{{T_.last_check}}</th>
<th>{{T_.last_err}}</th>
</tr>
@@ -32,24 +32,24 @@
{# "Switch" type #}
{% if check.ID_TC == 1 or check.ID_TC == 2 or check.ID_TC == 4 %} {# Ping, HttpCode, SQL DB #}
<td>
{#IF/SWITCH status text#}
{%if check.status == 0%}
{#IF/SWITCH uptime to text#}
{%if check.uptime <= 100 and check.uptime > 90 %}
<span class='green' data-tooltip='Type of check: {{check.nameCheck}}' data-tooltip-position='top'>{{T_.status_right}}</span>
{%elseif check.status == 1%}
{%elseif check.uptime <= 95 and check.uptime > 60 %}
<span class='blue' data-tooltip='Type of check: {{check.nameCheck}}' data-tooltip-position='top'>{{T_.status_lproblems}}</span>
{%elseif check.status == 2%}
{%elseif check.uptime <= 60 and check.uptime > 15 %}
<span class='orange' data-tooltip='Type of check: {{check.nameCheck}}' data-tooltip-position='top'>{{T_.status_problems}}</span>
{%elseif check.status == 3%}
{%elseif check.uptime <= 15 and check.uptime >= 0 %}
<span class='red' data-tooltip='Type of check: {{check.nameCheck}}' data-tooltip-position='top'>{{T_.status_outofserv}}</span>
{%elseif check.status == 4%}
{%elseif check.uptime == 255 %}
<span class='blue' data-tooltip='Type of check: {{check.nameCheck}}' data-tooltip-position='top'>{{T_.status_maintenance}}</span>
{%else%}
<span class='grey' data-tooltip='Type of check: {{check.nameCheck}}' data-tooltip-position='top'>{{T_.status_empty}}</span>
{%endif%}
{#END IF/SWITCH#}
({{ check.uptime}}%)
</td>
{% if check.status is defined %}{#Only if records exists#}
{% if check.uptime != -1 %}{#Only if records exists#}
<td>
{{check.dateLastChk}} -
{% if check.failedLastChk == 0 %}

View File

@@ -38,10 +38,11 @@
<td>{{check.name}}</td>
<td>{{check.nameTCheck}} - {{check.URL}}</td>
<td>
<a href="?page=viewhist&ID_C={{check.ID_C}}" class="btn btn-info">{{T_.view_hist}}</a>
{% if you.fullRights == 1 %}
<a href="?page=editcheck&ID_C={{check.ID_C}}" class="btn btn-primary">{{T_.edit}}</a>
{% if check.ID_TC == 3 %}{#Visitas#}
<button type="button" class="btn btn-info" data-toggle="modal" data-target="#countercode_{{check.ID_C}}">Código del contador</button>
<button type="button" class="btn btn-secondary" data-toggle="modal" data-target="#countercode_{{check.ID_C}}">Código del contador</button>
{% elseif check.ID_TC == 4 %}{#Database#}
<a href="#" data-toggle="modal" data-target="#dbcode_{{check.ID_C}}" class="btn btn-info">Codigo para check database</a>
@@ -187,18 +188,38 @@ var SiteID={{check.ID_C}};
<div class="modal-body">
<h3>Datos de la conexión (Para generar el fichero)</h3>
<p>Tipo de base de datos:
<select name="dbcode_type">
<select id="dbcode_type" name="dbcode_type" onchange="showOptD(this);">
<option value="sqlite3">SQLite3</option>
<option value="mysqli">MySql</option>
<option value="pgsql">PostgreSQL</option>
</select>
</p>
<p><small>En Sqlite3 solo hay que rellenar en host la ubicación de la base de datos, nada más</small></p>
<p><small>En sqlite, el host es la ubicación relativa al fichero</small></p>
<p>Host (Usualmente localhost): <input type="text" name="dbcode_host" placeholder="Host" /></p>
<p>Usuario bd<input type="text" name="dbcode_user" placeholder="Usuario" /></p>
<p>Contraseña bd<input type="pass" name="dbcode_pass" placeholder="Contraseña" /></p>
<p>Base de datos<input type="text" name="dbcode_db" placeholder="Base de datos" /></p>
<p id="userBD">Usuario bd<input type="text" name="dbcode_user" placeholder="Usuario" /></p>
<p id="passBD">Contraseña bd<input type="password" name="dbcode_pass" placeholder="Contraseña" /></p>
<p id="baseBD">Base de datos<input type="text" name="dbcode_db" placeholder="Base de datos" /></p>
</div>
<!-- Script for showing options -->
<script>
function showOptD(valSel){
optVal = valSel.value;
if(optVal == 'sqlite3'){
document.getElementById("userBD").style.display = "none";
document.getElementById("passBD").style.display = "none";
document.getElementById("baseBD").style.display = "none";
}else if(optVal == 'mysqli'){
document.getElementById("userBD").style.display = "block";
document.getElementById("passBD").style.display = "block";
document.getElementById("baseBD").style.display = "none";
}else if(optVal == 'pgsql'){
document.getElementById("userBD").style.display = "block";
document.getElementById("passBD").style.display = "block";
document.getElementById("baseBD").style.display = "block";
}
}
showOptD(document.getElementById("dbcode_type"))
</script>
<div class="modal-footer">
<button type="submit" class="btn btn-primary">Enviar y descargar php</button>
</div>

View File

@@ -10,18 +10,18 @@
<div class="col-lg-12">
<div class="card">
<div class="card-block">
<form class="form-horizontal" method="POST" action="?page=saveopts">
<form class="form-horizontal" method="POST" action="?page=savesettings">
<div class="form-group row">
<label class="col-sm-2">Nombre de la web</label>
<div class="col-sm-10">
<input name="name" type="text" placeholder="Nombre del check" value="{{sys.name}}" class="form-control form-control-success"><small class="form-text">Nombre para sacar en titulos.</small>
<input name="name" type="text" placeholder="Nombre de la web" value="{{sys.name}}" class="form-control form-control-success"><small class="form-text">Nombre para sacar en titulos.</small>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2">Cantidad de resultados (Individuales) a guardar en historial por cada check</label>
<label class="col-sm-2">Cantidad de tiempo a guardar historial de resultados en días.</label>
<div class="col-sm-10">
<input name="maxChecksSave" type="numeric" placeholder="Nombre del check" value="{{sys.maxChecksSave}}" class="form-control form-control-success"><small class="form-text">300 es un buen numero</small>
<input name="maxTimeSave" type="numeric" placeholder="Nombre del check" value="{{sys.maxTimeSave}}" class="form-control form-control-success"><small class="form-text">Por defecto, dos semanas</small>
</div>
</div>

View File

@@ -6,6 +6,7 @@ define('T_ENGVERSION',1);
$T_['statdif1'] = 'Status of different checks';
$T_['name'] = 'Name';
$T_['status'] = 'Status';
$T_['status_uptime'] = 'Status (Uptime)';
$T_['failed'] = 'Failed';
$T_['last_check'] = 'Last check';
$T_['last_err'] = 'Last error';
@@ -36,4 +37,5 @@ $T_['HTTP_CODE'] = 'Http code';
$T_['VISIT_COUNT'] = 'Visit counter';
$T_['DATABASE'] = 'Database check';
$T_['add_grp_to_add_chk'] = 'Add a group for start adding checks';
$T_['view_hist'] = 'View history';
?>

View File

@@ -6,6 +6,7 @@ define('T_VERSION',1);
$T_['statdif1'] = 'Estado de los diferentes servicios';
$T_['name'] = 'Nombre';
$T_['status'] = 'Estado';
$T_['status_uptime'] = 'Estado (Uptime)';
$T_['failed'] = 'Erróneo';
$T_['last_check'] = 'Última comprobación';
$T_['last_err'] = 'Último error';
@@ -36,4 +37,5 @@ $T_['HTTP_CODE'] = 'Código HTTP';
$T_['VISIT_COUNT'] = 'Contador de visitas';
$T_['DATABASE'] = 'Conexión a base de datos';
$T_['add_grp_to_add_chk'] = 'Añade un grupo para empezar a añadir checks';
$T_['view_hist'] = 'Ver histórico';
?>

View File

@@ -1,4 +1,6 @@
<?php
define('VERSION','0.9.1');
session_start(); //Session in all page
require_once "lib/dbwrapper.php";
$db_file = __DIR__."/sqlite.db3";
@@ -10,19 +12,17 @@ if (!is_file($db_file)){ //Go to install if not.
$db_conn = dbw_connect("sqlite",$db_file); //Database
/** In connect.php check if user SessionID exists, if not, delete Cookie */
if (isset($_COOKIE['SessionID'])){
$data = dbw_query_fetch_array($db_conn, "SELECT * FROM USERS WHERE SessionID='$_COOKIE[SessionID]'");
if (!isset($data['SessionID'])){
setcookie("SessionID", "", time()-3600,"/");
if (isset($_SESSION['UserID'])){
$data = dbw_query_fetch_array($db_conn, "SELECT * FROM USERS WHERE ID_U='$_SESSION[UserID]'");
if ($data['ID_U'] != $_SESSION['UserID']){
session_destroy();
header("Location: index.php");
}
$you['ID_U'] = $data['ID_U'];
$you['nick'] = $data['nick'];
$you['fullRights'] = $data['fullRights'];
$you['SessionID'] = $data['SessionID'];
$you['webRoot'] = webRoot();
}
$lang=getSystemOpt($db_conn,'lang');
@@ -30,4 +30,8 @@ $lang=getSystemOpt($db_conn,'lang');
require_once __DIR__."/assets/translations/en.php"; //Ever first English, and then your lang (Database)
require_once __DIR__."/assets/translations/$lang.php";
$ver=getSystemOpt($db_conn,'version');
if (getSystemOpt($db_conn,'version') != VERSION){
die("<p>Please run updater.php to update before using page");
}
?>

View File

@@ -72,16 +72,10 @@ while ($site = dbw_fetch_array($db_conn,$sites)){
}
//Delete old Checks (Based on user input)
$sites = dbw_query($db_conn,"SELECT * FROM CHECKS");
while ($site = dbw_fetch_array($db_conn,$sites)){
$count = dbw_query_fetch_array($db_conn,"SELECT COUNT(*) FROM CHKHIST WHERE ID_C='$site[ID_C]'")[0]; //Count how much checks has a site
//Delete old Checks (Based on time to save, put in secs)
$mintime = time()-(getSystemOpt($db_conn,"maxTimeSave")*24*3600);
dbw_query($db_conn,"DELETE FROM CHKHIST WHERE `timestamp` < $mintime");
if ($count > getSystemOpt($db_conn,"maxChecksSave")){
$todelete = $count - getSystemOpt($db_conn,"maxChecksSave"); //How much to delete
dbw_query($db_conn, "DELETE FROM CHKHIST WHERE ID_C='$site[ID_C]' ORDER BY `timestamp` ASC LIMIT $todelete");
}
}
//Delete Checks stored for pages that not exist
dbw_query($db_conn, "DELETE FROM CHKHIST WHERE ID_C NOT IN (SELECT ID_C FROM CHECKS)");

View File

@@ -15,9 +15,8 @@ switch($type){
case 'mysqli':
$dbUser = $_POST['dbcode_user'];
$dbPass = $_POST['dbcode_pass'];
$dbDb = $_POST['dbcode_db'];
$file = '<?php
mysqli_connect("'.$dbHost.'","'.$dbUser.'","'.$dbPass.'","'.$dbDb.'") or die("FAIL");
mysqli_connect("'.$dbHost.'","'.$dbUser.'","'.$dbPass.'",) or die("FAIL");
die("OK");
?>';
break;

View File

@@ -3,47 +3,33 @@
require_once "connect.php";
require_once 'lib/loadTwig.php';
/** Function checkStatus checks last "Checks" and their return
Return can be:
A value from 0-1-2 for status. 3 for Out Of Service. 3 and 4 can be turned up manually (
0-Perfect
1-Little problems
2-Problems
3-Out of service
4-In maintenance
255-Not results recolected (grey)
*/
function checkStatus($db_conn,$ID_C){
//First, check if the status is marked to any manual value
$manualPage = dbw_query_fetch_array($db_conn,"SELECT ID_C,manStatus FROM CHECKS WHERE ID_C='$ID_C'")['manStatus'];
if ($manualPage != NULL){return $manualPage;}
//If it's not manual-setted, see real status
$result = checkUptime($db_conn,$ID_C);
//Return status
if ($result == 255){return 255;}
if ($result > 95 && $result <= 100){return 0;}
if ($result > 60 && $result <= 95){return 1;}
if ($result > 10 && $result <= 60){return 2;}
if ($result >= 0 && $result <= 10){return 3;} //If test fail much (90% fail)
}
function checkUptime($db_conn,$ID_C,$precision = 0){
if ($precision == 0){
$time = time()-30*7*3600; //Last week
}else{
$time = $precision;
if ($precision != 0){
$good = dbw_query_fetch_array($db_conn,"SELECT COUNT(*) FROM CHKHIST WHERE ID_C = '$ID_C' AND code == 0 AND `timestamp` > $time")[0];
$all = dbw_query_fetch_array($db_conn,"SELECT COUNT(*) FROM CHKHIST WHERE ID_C = '$ID_C' AND `timestamp` > $time")[0];
}else{ //Uptime of all time
$good = dbw_query_fetch_array($db_conn,"SELECT COUNT(*) FROM CHKHIST WHERE ID_C = '$ID_C' AND code == 0")[0];
$all = dbw_query_fetch_array($db_conn,"SELECT COUNT(*) FROM CHKHIST WHERE ID_C = '$ID_C'")[0];
}
if ($all != 0){
$uptime = ($good/$all)*100;
$res = dbw_query($db_conn,"SELECT code FROM CHKHIST WHERE ID_C='$ID_C' AND `timestamp` > $time");
$count = 0;
$err = 0;
while ($fila = dbw_fetch_array($db_conn,$res)){
$count++;
$err += $fila['code'];
}
echo $count."-";
if ($count == 0){
return '-1'; //No registers
}else{
if ($err != 0){
$uptime = (100 - round(($err/$count)*100,2));
return $uptime;
}else{
return 100;
}
}
}
/** Ping a WebSite */
function ping($host,$port = '80') {
@@ -99,13 +85,12 @@ function RandomString($length)
/** 1 if its logued, 0 if not */
function isLogued(){
if (isset($_COOKIE['SessionID'])){
if (isset($_SESSION['UserID'])){
return 1;
}else{
return 0;
}
}
function requireLogin(){
if (isLogued() == 0){
die('You dont have admin rights'); //This blocks edit or create nothing if its not logued

View File

@@ -21,19 +21,28 @@ while ($onechk = dbw_fetch_array($db_conn,$results)){
case 2: //HttpCode
case 4: //MySQL
if (dbw_query_fetch_array($db_conn, "SELECT COUNT(*) FROM CHKHIST WHERE ID_C = '$idchk'")[0] != 0){
$chks[$idchk]['status'] = checkStatus($db_conn,$idchk); //Check status of a site
$chks[$idchk]['dateLastChk'] = date('d/m H:i',dbw_query_fetch_array($db_conn, "SELECT `timestamp` FROM CHKHIST WHERE ID_C = '$idchk' ORDER BY `timestamp` DESC")['timestamp']);
if (dbw_query_fetch_array($db_conn, "SELECT COUNT(`ID_CHist`) FROM CHKHIST WHERE ID_C = '$idchk'")[0] != 0){
$chks[$idchk]['failedLastChk'] = dbw_query_fetch_array($db_conn, "SELECT `code` FROM CHKHIST WHERE ID_C = '$idchk' ORDER BY `timestamp` DESC LIMIT 0,1")['code'];
$lastErr = dbw_query_fetch_array($db_conn, "SELECT `timestamp` FROM CHKHIST WHERE ID_C = '$idchk' AND code != 0 ORDER BY `timestamp` DESC LIMIT 0,1")['timestamp']; //Record last error, for showing if there are any.
$consul = dbw_query_fetch_array($db_conn, "SELECT `code`,`timestamp` FROM CHKHIST WHERE ID_C = '$idchk' AND (select min(`timestamp`) FROM CHKHIST)");
$chks[$idchk]['dateLastChk'] = date('d/m H:i',$consul['timestamp']);
$chks[$idchk]['failedLastChk'] = $consul['code'];
$lastErr = dbw_query_fetch_array($db_conn, "SELECT MIN(`timestamp`) FROM CHKHIST WHERE ID_C = '$idchk' AND code != 0")[0]; //Record last error, for showing if there are any.
if ($lastErr != false){
$chks[$idchk]['dateLastErr'] = date('d/m H:i',$lastErr);
}
$ID_TC = $chks[$idchk]['ID_TC'];
$chks[$idchk]['nameCheck'] = textTypeChk($T_,$ID_TC);
if ($onechk['manStatus'] != ''){
$chks[$idchk]['uptime'] = 255;//255 = Maintenance I suppose, not implemented
}else{
$chks[$idchk]['uptime'] = checkUptime($db_conn,$idchk);
}
}
break;
@@ -74,5 +83,4 @@ while ($incident = dbw_fetch_array($db_conn,$incidents)){
}
echo $twig->render('indexpage.twig', array('T_' => $T_, 'you' => $you, 'checks' => $chks, 'news' => $incs)); //Render
?>

View File

@@ -1,6 +1,5 @@
<?php
$ver = '0.9';
//require "functions.php"; //THIS FILE CAN'T BE USED THERE, BECAUSE IT HAS connect.php dependence
define('VERSION','0.9.1');
require_once 'lib/loadTwig.php';
$db_file = __DIR__."/sqlite.db3";
@@ -12,7 +11,7 @@ if (!isset($_POST['websiteName']) && !isset($_POST['username']) && !isset($_POST
echo $twig->render('install.twig');
}else{
if ($_POST['passw1'] !== $_POST['passw2']){
die("NONO");
die("Passwords didn't match");
}else{
//Creamos toda la base de datos
require_once "lib/dbwrapper.php"; //For using database
@@ -30,7 +29,6 @@ CREATE TABLE "USERS" (
`ID_U` INTEGER PRIMARY KEY AUTOINCREMENT,
`nick` TEXT NOT NULL UNIQUE,
`passw` TEXT,
`SessionID` INTEGER UNIQUE,
`fullRights` INTEGER NOT NULL
);
CREATE TABLE "TOKENS" (
@@ -78,10 +76,10 @@ COMMIT;';
dbw_query($db_conn,"INSERT INTO USERS (nick,passw,fullRights) VALUES('$user','$pass',1)"); //Create user
//System opts
dbw_query($db_conn,"INSERT INTO SYS VALUES ('maxChecksSave',300)");
dbw_query($db_conn,"INSERT INTO SYS VALUES ('maxTimeSave',14)");
dbw_query($db_conn,"INSERT INTO SYS VALUES ('lang','$_POST[lang]')");
dbw_query($db_conn,"INSERT INTO SYS VALUES ('websiteTitle','Status')");
dbw_query($db_conn,"INSERT INTO SYS VALUES ('version','$ver')");
dbw_query($db_conn,"INSERT INTO SYS VALUES ('version','".VERSION."')");
echo $twig->render('install.twig', array('part' => 2));
}

View File

@@ -1,3 +1,13 @@
* 2.4.4 (2017-09-27)
* added Twig_Profiler_Profile::reset()
* fixed use TokenParser to return an empty Node
* added RuntimeExtensionInterface
* added circular reference detection when loading templates
* added support for runtime loaders in IntegrationTestCase
* fixed deprecation when using Twig_Profiler_Dumper_Html
* removed @final from Twig_Profiler_Dumper_Text
* 2.4.3 (2017-06-07)
* fixed namespaces introduction
@@ -69,9 +79,17 @@
* improved the performance of the filesystem loader
* removed features that were deprecated in 1.x
* 1.34.4 (2017-XX-XX)
* 1.35.0 (2017-XX-XX)
* n/a
* added Twig_Profiler_Profile::reset()
* fixed use TokenParser to return an empty Node
* added RuntimeExtensionInterface
* added circular reference detection when loading templates
* 1.34.4 (2017-07-04)
* added support for runtime loaders in IntegrationTestCase
* fixed deprecation when using Twig_Profiler_Dumper_Html
* 1.34.3 (2017-06-07)

View File

@@ -16,11 +16,11 @@
*/
class Twig_Environment
{
const VERSION = '2.4.3';
const VERSION_ID = 20403;
const VERSION = '2.4.4';
const VERSION_ID = 20404;
const MAJOR_VERSION = 2;
const MINOR_VERSION = 4;
const RELEASE_VERSION = 3;
const RELEASE_VERSION = 4;
const EXTRA_VERSION = '';
private $charset;
@@ -42,6 +42,7 @@ class Twig_Environment
private $runtimeLoaders = array();
private $runtimes = array();
private $optionsHash;
private $loading = array();
/**
* Constructor.
@@ -308,6 +309,10 @@ class Twig_Environment
*
* @param string|Twig_TemplateWrapper|Twig_Template $name The template name
*
* @throws Twig_Error_Loader When the template cannot be found
* @throws Twig_Error_Runtime When a previously generated cache is corrupted
* @throws Twig_Error_Syntax When an error occurred during compilation
*
* @return Twig_TemplateWrapper
*/
public function load($name)
@@ -382,7 +387,19 @@ class Twig_Environment
// to be removed in 3.0
$this->extensionSet->initRuntime($this);
return $this->loadedTemplates[$cls] = new $cls($this);
if (isset($this->loading[$cls])) {
throw new Twig_Error_Runtime(sprintf('Circular reference detected for Twig template "%s", path: %s.', $name, implode(' -> ', array_merge($this->loading, array($name)))));
}
$this->loading[$cls] = $name;
try {
$this->loadedTemplates[$cls] = new $cls($this);
} finally {
unset($this->loading[$cls]);
}
return $this->loadedTemplates[$cls];
}
/**

View File

@@ -1430,8 +1430,6 @@ function twig_array_batch($items, $size, $fill = null)
*/
function twig_get_attribute(Twig_Environment $env, Twig_Source $source, $object, $item, array $arguments = array(), $type = Twig_Template::ANY_CALL, $isDefinedTest = false, $ignoreStrictCheck = false)
{
static $cache = array();
// array
if (Twig_Template::METHOD_CALL !== $type) {
$arrayItem = is_bool($item) || is_float($item) ? (int) $item : $item;
@@ -1518,6 +1516,8 @@ function twig_get_attribute(Twig_Environment $env, Twig_Source $source, $object,
}
}
static $cache = array();
$class = get_class($object);
// object method

View File

@@ -0,0 +1,62 @@
<?php
/*
* This file is part of Twig.
*
* (c) Fabien Potencier
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
/**
* @author Fabien Potencier <fabien@symfony.com>
*/
abstract class Twig_Profiler_Dumper_Base
{
private $root;
public function dump(Twig_Profiler_Profile $profile)
{
return $this->dumpProfile($profile);
}
abstract protected function formatTemplate(Twig_Profiler_Profile $profile, $prefix);
abstract protected function formatNonTemplate(Twig_Profiler_Profile $profile, $prefix);
abstract protected function formatTime(Twig_Profiler_Profile $profile, $percent);
private function dumpProfile(Twig_Profiler_Profile $profile, $prefix = '', $sibling = false)
{
if ($profile->isRoot()) {
$this->root = $profile->getDuration();
$start = $profile->getName();
} else {
if ($profile->isTemplate()) {
$start = $this->formatTemplate($profile, $prefix);
} else {
$start = $this->formatNonTemplate($profile, $prefix);
}
$prefix .= $sibling ? '│ ' : ' ';
}
$percent = $this->root ? $profile->getDuration() / $this->root * 100 : 0;
if ($profile->getDuration() * 1000 < 1) {
$str = $start."\n";
} else {
$str = sprintf("%s %s\n", $start, $this->formatTime($profile, $percent));
}
$nCount = count($profile->getProfiles());
foreach ($profile as $i => $p) {
$str .= $this->dumpProfile($p, $prefix, $i + 1 !== $nCount);
}
return $str;
}
}
class_alias('Twig_Profiler_Dumper_Base', 'Twig\Profiler\Dumper\BaseDumper', false);
class_exists('Twig_Profiler_Profile');

View File

@@ -12,7 +12,7 @@
/**
* @author Fabien Potencier <fabien@symfony.com>
*/
final class Twig_Profiler_Dumper_Html extends Twig_Profiler_Dumper_Text
final class Twig_Profiler_Dumper_Html extends Twig_Profiler_Dumper_Base
{
private static $colors = array(
'block' => '#dfd',

View File

@@ -11,18 +11,9 @@
/**
* @author Fabien Potencier <fabien@symfony.com>
*
* @final
*/
class Twig_Profiler_Dumper_Text
final class Twig_Profiler_Dumper_Text extends Twig_Profiler_Dumper_Base
{
private $root;
public function dump(Twig_Profiler_Profile $profile)
{
return $this->dumpProfile($profile);
}
protected function formatTemplate(Twig_Profiler_Profile $profile, $prefix)
{
return sprintf('%s└ %s', $prefix, $profile->getTemplate());
@@ -37,36 +28,6 @@ class Twig_Profiler_Dumper_Text
{
return sprintf('%.2fms/%.0f%%', $profile->getDuration() * 1000, $percent);
}
private function dumpProfile(Twig_Profiler_Profile $profile, $prefix = '', $sibling = false)
{
if ($profile->isRoot()) {
$this->root = $profile->getDuration();
$start = $profile->getName();
} else {
if ($profile->isTemplate()) {
$start = $this->formatTemplate($profile, $prefix);
} else {
$start = $this->formatNonTemplate($profile, $prefix);
}
$prefix .= $sibling ? '│ ' : ' ';
}
$percent = $this->root ? $profile->getDuration() / $this->root * 100 : 0;
if ($profile->getDuration() * 1000 < 1) {
$str = $start."\n";
} else {
$str = sprintf("%s %s\n", $start, $this->formatTime($profile, $percent));
}
$nCount = count($profile->getProfiles());
foreach ($profile as $i => $p) {
$str .= $this->dumpProfile($p, $prefix, $i + 1 !== $nCount);
}
return $str;
}
}
class_alias('Twig_Profiler_Dumper_Text', 'Twig\Profiler\Dumper\TextDumper', false);

View File

@@ -149,6 +149,12 @@ class Twig_Profiler_Profile implements IteratorAggregate, Serializable
);
}
public function reset()
{
$this->starts = $this->ends = $this->profiles = array();
$this->enter();
}
public function getIterator()
{
return new ArrayIterator($this->profiles);

View File

@@ -24,6 +24,14 @@ abstract class Twig_Test_IntegrationTestCase extends TestCase
*/
abstract protected function getFixturesDir();
/**
* @return Twig_RuntimeLoaderInterface[]
*/
protected function getRuntimeLoaders()
{
return array();
}
/**
* @return Twig_ExtensionInterface[]
*/
@@ -143,6 +151,10 @@ abstract class Twig_Test_IntegrationTestCase extends TestCase
), $match[2] ? eval($match[2].';') : array());
$twig = new Twig_Environment($loader, $config);
$twig->addGlobal('global', 'global');
foreach ($this->getRuntimeLoaders() as $runtimeLoader) {
$twig->addRuntimeLoader($runtimeLoader);
}
foreach ($this->getExtensions() as $extension) {
$twig->addExtension($extension);
}

View File

@@ -55,6 +55,8 @@ final class Twig_TokenParser_Use extends Twig_TokenParser
$stream->expect(Twig_Token::BLOCK_END_TYPE);
$this->parser->addTrait(new Twig_Node(array('template' => $template, 'targets' => new Twig_Node($targets))));
return new Twig_Node();
}
public function getTag()

View File

@@ -49,14 +49,20 @@ function dbw_escape_string($conn,$string){
/** Make query */
function dbw_query($conn,$query){
$time = microtime(true);
switch ($conn[1]){
case "mysqli":
return mysqli_query($conn[0],$query);
$ret = mysqli_query($conn[0],$query);
break;
case "sqlite":
return $conn[0]->query($query);
$ret = $conn[0]->query($query);
break;
case "PgSQL":
return pg_query($query); //Last error (pg_last_error()) not implemented
$ret = pg_query($query);
break;
}
//echo "<p>".$query."->".(microtime(true)-$time)." milisegundos</p>";
return $ret;
}
/** Fetch array from query */
@@ -83,23 +89,27 @@ function dbw_fetch_array($conn,$result,$typearray = NULL){
/** Make query and fetch array */
function dbw_query_fetch_array($conn,$query){
$time = microtime(true);
switch ($conn[1]){
case "mysqli":
$query = mysqli_query($conn[0],$query);
if ($query == false || $query == NULL){return false;}
return mysqli_fetch_array($query);
$result = mysqli_query($conn[0],$query);
if (!$result){return false;}
$ret = mysqli_fetch_array($result);
break;
case "sqlite":
$query = $conn[0]->query($query);
if ($query == false || $query == NULL){return false;}
return $query->fetchArray();
$result = $conn[0]->query($query);
if (!$result){return false;}
$ret = $result->fetchArray();
break;
case "PgSQL":
$query = pg_query($query);
if ($query == false || $query == NULL){return false;}
return pg_fetch_array($query); //Last error (pg_last_error()) not implemented
$result = pg_query($query);
if (!$result){return false;}
$ret = pg_fetch_array($result); //Last error (pg_last_error()) not implemented
break;
}
//echo "<p>".$query."->".(microtime(true)-$time)." milisegundos</p>";
return $ret;
}
/** Goes a query to $row. $row starts in 0 as first row as if not specified */
@@ -155,7 +165,8 @@ function dbw_num_rows($conn,$result){
case "mysqli":
return mysqli_num_rows($result);
case "sqlite":
return $result->numRows();
die("Sqlite3 not supports numRows, use query with COUNT(*)");
return $result->numRows(); //ERROR
case "PgSQL":
return pg_num_rows ($result);
}

View File

@@ -4,13 +4,13 @@ require "functions.php";
if (isset($_GET['do'])){
if ($_GET['do'] == 'logout'){
require_once "connect.php";
dbw_query($db_conn, "UPDATE USERS SET SessionID = NULL WHERE SessionID='$_COOKIE[SessionID]'");
setcookie("SessionID", "", time()-3600,"/");
//dbw_query($db_conn, "UPDATE USERS SET SessionID = NULL WHERE SessionID='$_COOKIE[SessionID]'");
session_destroy();
header('Location: index.php');
}
}
if (isset($_COOKIE['SessionID'])){ //Ya está logueado
if (isset($_SESSION['UserID'])){ //Ya está logueado
header('Location: panel.php');
}
@@ -20,13 +20,11 @@ if (!isset($_POST['nick'])){
if (isset($_POST['nick'])){
$nick=$_POST['nick'];
$pass= hash("sha256",$_POST['pass']);
$finalpass = dbw_query_fetch_array($db_conn,"SELECT `Passw` FROM `USERS` WHERE nick ='$nick'");
$passcomprobar = $finalpass[0];
$resql = dbw_query_fetch_array($db_conn,"SELECT ID_U,`passw` FROM `USERS` WHERE nick ='$nick'");
$passcomprobar = $resql['passw'];
if ($pass == $passcomprobar)
{
$sesid = RandomString(12);
dbw_query($db_conn, "UPDATE USERS SET SessionID = '$sesid' WHERE nick = '$nick'");
setcookie("SessionID",$sesid,"0","/");
$_SESSION['UserID'] = $resql['ID_U'];
header('Location: panel.php');
}else{
echo $twig->render('login.twig', array('status' => 'error'));

View File

@@ -208,7 +208,10 @@ switch($page){
header('Location: panel.php?page=news');
break;
case 'savesettings':
//All group names and IDs
dbw_query($db_conn,"UPDATE SYS SET `value`='$_POST[name]' WHERE `option`='name'");
dbw_query($db_conn,"UPDATE SYS SET `value`='$_POST[maxTimeSave]' WHERE `option`='maxTimeSave'");
case 'settings':
//All group names and IDs
$results = dbw_query($db_conn,"SELECT * FROM SYS"); //All groups

21
updater.php Normal file
View File

@@ -0,0 +1,21 @@
<?php
echo "<h2>Updater of CheckServer</h2>";
echo "<p>Connecting to database</p>";
require_once 'connect.php';
$version = dbw_query_fetch_array($db_conn,"SELECT value FROM SYS WHERE option = 'version'")[0];
echo "<p>Your version: ".$version;
echo "<p>Updating to lastest</p>";
switch ($version){
case '0.9':
echo "<p>0.9->0.9.1<p>";
dbw_query($db_conn,"DELETE FROM SYS WHERE option='maxChecksSave'");
dbw_query($db_conn,"INSERT INTO SYS VALUES('maxTimeSave',14)");
//Can not delete USERS.SessionID because sqlite3 not supports it, but doesn't do any harm.
case '0.9.1':
echo "0.9.1-Lastest";
echo "<p>Updated to lastest. Close this and go to index</p>";
//Remove files on a good update
unlink('updater.php');
unlink('installer.php');
}