1
0
mirror of https://gitlab.com/JKANetwork/CheckServer.git synced 2026-02-20 04:01:42 +01:00

23 Commits
v0.9 ... v0.9.4

Author SHA1 Message Date
c0d3912413 Latest 0.9.4 commit 2019-03-14 09:19:15 +00:00
635a223538 Test JSON API check 2018-01-16 09:36:53 +01:00
84cb21dcf3 Mini visual fix 2018-01-16 09:02:44 +01:00
f9e219ebb1 update.php to master 2018-01-15 12:50:29 +01:00
a478f8a587 Fixes 2018-01-15 12:47:23 +01:00
97ac06b224 Version 0.9.3 2018-01-14 21:14:10 +01:00
9e4982c838 Fixing cronchk and adding JSON API check (WIP) 2018-01-14 13:44:20 +01:00
1efecc2633 Bugfix for 0.9.2 2018-01-11 10:03:04 +01:00
a91347ca46 updater.php deleted without known 2018-01-09 23:41:22 +01:00
3547695245 README.md to V0.9.2 2018-01-09 23:35:35 +01:00
0aeaada922 Fix for new tests at index 2018-01-09 23:34:50 +01:00
5e33adbbaf Change connect to load and fix code 2018-01-09 23:27:59 +01:00
42583d198e Revert README, 0.9.2 not ready 2018-01-09 22:50:31 +01:00
cb20328a6a Version 0.9.2 2018-01-09 22:36:45 +01:00
f1b58a03f3 More info for checks activated 2018-01-09 13:26:26 +01:00
8b86e38361 Cron fixes 2018-01-09 09:35:44 +01:00
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
32 changed files with 779 additions and 348 deletions

5
.gitignore vendored Normal file
View File

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

View File

@@ -1,3 +1,5 @@
## Will not update more, we are writing a totally different CheckServer
# CheckServer, a light and great Check service for servers and pages
CheckServer is a PHP app that monitor (using crons) some parameters in servers, like http responses, pings to ports (http,ssh,...), databases, and views simple stadistics.
@@ -5,27 +7,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,16 +37,48 @@ 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 before updating or data may lost.
## Changelog
### (NEXT) Version 0.9.1 (Beta)
### Version 0.9.4 - Lastest Legacy Version
-TODO: See uptime percent
-TODO: Fix JSON GET/POST Check (Only add part works)
-TODO: Better index admin page (More data)
-Code fixes
### Version 0.9.3 (Beta)
-New JSON GET/POST Check
-Bugfix in cronchk!
-A bit cleaner code
### Version 0.9.2 (Beta)
-A bit more info in admin page (Checks->Errors/History info)
-Fix duplicate entries for failed checks (Less false failed tests)
-More optimizations when lot of pages/tests
-Fix dates and some texts in index
-Updater fixed, 0.9.1 not working right
### 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)
-First public version
-Supports ping at different ports, httpcode returns (default or custom), and MySQL/sqlite/PgSQL status. Also you can post news to index, and have a (invisible) visit counter of visits in your webpages.
-Supports ping at different ports, httpcode returns (default or custom), and MySQL/sqlite/PgSQL status. Also you can post news to index, and have a (invisible) visit counter of visits in your webpages.

View File

@@ -2,7 +2,7 @@
<div class="container-fluid">
<div class="row">
<div class="col-sm-6">
<p>JKA Network &copy; 2017-actualidad. Versión 0.1 Alpha</p>
<p>JKA Network &copy; 2018. Versión {{version}}</p>
</div>
<div class="col-sm-6 text-right">
<p>Design by <a href="https://bootstrapious.com" class="external">Bootstrapious</a></p>

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>
@@ -30,45 +30,31 @@
{# "Switch" type #}
{% if check.ID_TC == 1 or check.ID_TC == 2 or check.ID_TC == 4 %} {# Ping, HttpCode, SQL DB #}
{% if check.ID_TC != 3 %} {# Every except Visits that is different #}
{% if check.uptime != -1 %}{#Only if records exists#}
<td>
{#IF/SWITCH status text#}
{%if check.status == 0%}
<span class='green' data-tooltip='Type of check: {{check.nameCheck}}' data-tooltip-position='top'>{{T_.status_right}}</span>
{%elseif check.status == 1%}
<span class='blue' data-tooltip='Type of check: {{check.nameCheck}}' data-tooltip-position='top'>{{T_.status_lproblems}}</span>
{%elseif check.status == 2%}
<span class='orange' data-tooltip='Type of check: {{check.nameCheck}}' data-tooltip-position='top'>{{T_.status_problems}}</span>
{%elseif check.status == 3%}
<span class='red' data-tooltip='Type of check: {{check.nameCheck}}' data-tooltip-position='top'>{{T_.status_outofserv}}</span>
{%elseif check.status == 4%}
<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#}
<span class='{{check.statusColor}}' data-tooltip='Type of check: {{T_[check.nameCheck]}}' data-tooltip-position='top'>{{check.statusText}}</span> {# Use T_[Var] to merge var to array #}
({{ check.uptime}}%)
</td>
<td>
{{check.dateLastChk}} -
{% if check.failedLastChk == 0 %}
<span style="color:green">{{T_.status_right}}</span>
{% else %}
<span style="color:red">{{T_.failed}}</span>
{% endif %}
</td>
{%else%} {#If not records yet#}
<td colspan="2">Dame tiempo para recopilar estadísticas</td>
{%endif%}
<td>
{%if check.dateLastErr is not null%}
{{check.dateLastErr}}
{%else%}
{{T_.no_errs}}
{%endif%}
</td>
{% if check.status is defined %}{#Only if records exists#}
<td>
{{check.dateLastChk}} -
{% if check.failedLastChk == 0 %}
<span style="color:green">{{T_.status_right}}</span>
{% else %}
<span style="color:red">{{T_.failed}}</span>
{% endif %}
</td>
{%else%}
<td>Dame tiempo para recopilar estadísticas</td>
{%endif%}
<td>
{%if check.dateLastErr is not null%}
{{check.dateLastErr}}
{%else%}
{{T_.no_errs}}
{%endif%}
</td>
{% endif %}
{% if check.ID_TC == 3 %}
<td colspan="3">

View File

@@ -29,4 +29,5 @@
</div>
</div>
</div>
</section>
</section>
{% include 'footer.twig' %}

View File

@@ -21,14 +21,14 @@
action="?page=savenewcheck"
{%endif%}>
<div class="form-group row">
<label class="col-sm-2">Nombre</label>
<label class="col-sm-2">{{T_.name}}</label>
<div class="col-sm-10">
<input name="name" type="text" placeholder="Nombre del check" value="{{check.name}}" class="form-control form-control-success"><small class="form-text">Nombre del checkeo.</small>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 form-control-label">Grupo</label>
<label class="col-sm-2 form-control-label">{{T_.group}}</label>
<div class="col-sm-10 select">
<select name="group" id="group" class="form-control">
{% for group in groups %}
@@ -54,15 +54,19 @@
</div>
</div>
{# Aquí empiezan los campos "opcionales" dependiendo del tipo de check #}
{# Aquí empiezan los campos "opcionales" dependiendo del tipo de check (Estos vienen de la tabla, al campo) #}
{# Sacar variables #}
{% if check.ID_TC == 1%}
{% set t1 = check.URL|split(':') %}
{% set t1 = check.url|split(':') %}
{% elseif check.ID_TC == 2%}
{% set t2_url = check.URL %}
{% set t2_code = check.TCParam %}
{% set t2_url = check.url %}
{% set t2_code = check.urlParam %}
{% elseif check.ID_TC == 4%}
{% set t4_url = check.URL %}
{% set t4_url = check.url %}
{% elseif check.ID_TC == 5 %}
{% set t5_url = check.url %}
{% set t5_params = check.urlParam|split('|') %}
{% set t5_exceptedRes = check.exceptedRes %}
{% endif %}
{# Trozos de formulario #}
@@ -119,7 +123,36 @@
</div>
</div>
{# Tipo 5 - Json API #}
<div id="t5" style="display:none;">
<div class="form-group row">
<label class="col-sm-2">JSON</label>
<div class="col-sm-10">
<input name="t5url" type="text" placeholder="URL" value="{{t5_url}}" class="form-control form-control-success"><small class="form-text">URL de la API</small>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2">Tipo de request</label>
<div class="col-sm-10">
<select name="t5type" class="form-control">
<option value="GET" {%if t5_params[0] == 'GET' %} selected="selected" {%endif%}>GET</option>
<option value="POST" {%if t5_params[0] == 'POST' %} selected="selected" {%endif%}>POST</option>
</select>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2">Parametros enviados</label>
<div class="col-sm-10">
<input name="t5params" type="text" placeholder="?params" value="{{t5_params[1]}}" class="form-control form-control-success"><small class="form-text">Parametros de la API (Si es GET, empezar con ? o /)</small>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2">Respuesta esperada</label>
<div class="col-sm-10">
<textarea name="t5exceptedRes" placeholder="Respuesta en formato JSON" class="form-control form-control-success">{{t5_exceptedRes}}</textarea>
</div>
</div>
</div>
<div class="form-group row">
<div class="col-sm-10 offset-sm-2">
<button type="submit" class="btn btn-primary">Guardar cambios</button>
@@ -135,28 +168,23 @@
<script>
function showOptData(valSel){
document.getElementById("t1").style.display = "none";
document.getElementById("t2").style.display = "none";
document.getElementById("t3").style.display = "none";
document.getElementById("t4").style.display = "none";
document.getElementById("t5").style.display = "none";
optVal = valSel.value;
if(optVal == '1'){
document.getElementById("t1").style.display = "block";
document.getElementById("t2").style.display = "none";
document.getElementById("t3").style.display = "none";
document.getElementById("t4").style.display = "none";
}else if(optVal == '2'){
document.getElementById("t1").style.display = "none";
document.getElementById("t2").style.display = "block";
document.getElementById("t3").style.display = "none";
document.getElementById("t4").style.display = "none";
}else if(optVal == '3'){
document.getElementById("t1").style.display = "none";
document.getElementById("t2").style.display = "none";
document.getElementById("t3").style.display = "block";
document.getElementById("t4").style.display = "none";
}else {
document.getElementById("t1").style.display = "none";
document.getElementById("t2").style.display = "none";
document.getElementById("t3").style.display = "none";
}else if(optVal == '4'){
document.getElementById("t4").style.display = "block";
}else {
document.getElementById("t5").style.display = "block";
}
}
showOptData(document.getElementById("tcheck"))

View File

@@ -36,12 +36,13 @@
{% set beforegroup = check.ID_G %}
<tr>
<td>{{check.name}}</td>
<td>{{check.nameTCheck}} - {{check.URL}}</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>
@@ -227,4 +248,4 @@ var SiteID={{check.ID_C}};
</div>
</section>
{% include 'footer.twig' %}
{% include 'footer.twig' %}

View File

@@ -39,7 +39,7 @@
<div class="wrapper recent-updated">
<div id="new-updates" class="card-header d-flex justify-content-between align-items-center">
<h2 class="h5 display"><a data-toggle="collapse" data-parent="#accordion" href="#upadtes-box" aria-expanded="true" aria-controls="upadtes-box">Ultimos fallos</a></h2>
<h2 class="h5 display"><a data-toggle="collapse" data-parent="#accordion" href="#upadtes-box" aria-expanded="true" aria-controls="upadtes-box">{{T_.lastest_fails}}</a></h2>
</div>
<div id="upadtes-box" role="tabpanel" class="collapse show">
<ul class="news list-unstyled">
@@ -48,9 +48,9 @@
<li class="d-flex justify-content-between">
<div class="left-col d-flex">
<div class="icon"><i class="icon-times"></i></div>
<div class="title">{{fail.name}} - <strong>{{fail.groupName}}</strong>
<div class="title"><a href="?page=viewhist&ID_C={{fail.ID_C}}">{{fail.name}} - <strong>{{fail.groupName}}</strong>
<p>{{fail.typeCheck}}</p>
</div>
</a></div>
</div>
<div class="right-col text-right">
<div class="update-date">{{fail.date}}<span class="month">{{fail.hour}}</span></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

@@ -0,0 +1,84 @@
{% include 'panel/p_header.twig' %}
<script src="assets/js/Chart.min.js"></script>
<!-- Checks -->
<section>
<div class="col-lg-12">
<div class="card">
<div class="card-header d-flex align-items-center">
<h2 class="h5 display">Historial de los últimos {{pagedata.cant}} checks de {{pagedata.name}} - {{pagedata.group}}</h2>
</div>
<div class="card">
<div class="card-block">
<div style="width:75%;">
<canvas id="canvas"></canvas>
</div>
<!-- Lastest fails -->
<h2>{{T_.lastest_fails}}</h2>
<table class="table table-striped table-hover">
<thead>
<tr>
<th>Fecha</th>
</tr>
</thead>
<tbody>
{% for err in pagedata.fails %}
<tr>
<td>{{err}}</td>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<!-- Script Chartjs -->
<script>
var barChartData = {
//labels: ["Correctos", "Errores"],
datasets: [{
label: "Correctos",
backgroundColor: "#2B86FF",
borderColor: "#2B86FF",
data: [ {{ pagedata.cgood }} ]
},{
label: "Errores",
backgroundColor: "#ff2a2a",
borderColor: "#ff2a2a",
data: [ {{ pagedata.cbad }} ]
}]
};
var config = {
type: 'bar',
data: barChartData,
options: {
responsive: true,
legend: {
position: 'top',
},
title: {
display: true,
text: 'Checks correctos y erroneos'
},
scales: {
yAxes: [{
ticks: {
beginAtZero: true
}
}]
}
}
};
window.onload = function() {
var ctx = document.getElementById("canvas").getContext("2d");
window.myBar = new Chart(ctx, config);
};
</script>
</div>
</div>
</div>
</div>
</section>
{% include 'footer.twig' %}

View File

@@ -1,11 +1,15 @@
<?php
//English (Use as a reference) - Maybe grammar can be fixed
define('T_ENGVERSION',1);
if (!defined('T_ENGVERSION')){
define('T_ENGVERSION',1);
}
//(indexpage.twig) In index, title
$T_['statdif1'] = 'Status of different checks';
$T_['name'] = 'Name';
$T_['group'] = 'Group';
$T_['status'] = 'Status';
$T_['status_uptime'] = 'Status (Uptime)';
$T_['failed'] = 'Failed';
$T_['last_check'] = 'Last check';
$T_['last_err'] = 'Last error';
@@ -30,10 +34,13 @@ $T_['groups'] = 'Groups';
$T_['news'] = 'News';
$T_['settings'] = 'Settings';
$T_['users'] = 'Users';
//[NEXT 4]Check texts
//[NEXT 5]Check texts
$T_['PING_IP'] = 'Ping to IP:Port';
$T_['HTTP_CODE'] = 'Http code';
$T_['VISIT_COUNT'] = 'Visit counter';
$T_['DATABASE'] = 'Database check';
$T_['JSON_API'] = 'JSON API';
$T_['add_grp_to_add_chk'] = 'Add a group for start adding checks';
$T_['view_hist'] = 'View history';
$T_['lastest_fails'] = 'Lastest fails';
?>

View File

@@ -1,11 +1,15 @@
<?php
//Español (Oficial)
define('T_VERSION',1);
if (!defined('T_VERSION')){
define('T_VERSION',1);
}
//(indexpage.twig) In index, title
$T_['statdif1'] = 'Estado de los diferentes servicios';
$T_['name'] = 'Nombre';
$T_['group'] = 'Grupo';
$T_['status'] = 'Estado';
$T_['status_uptime'] = 'Estado (Uptime)';
$T_['failed'] = 'Erróneo';
$T_['last_check'] = 'Última comprobación';
$T_['last_err'] = 'Último error';
@@ -30,10 +34,13 @@ $T_['groups'] = 'Grupos';
$T_['news'] = 'Noticias';
$T_['settings'] = 'Opciones';
$T_['users'] = 'Usuarios';
//[NEXT 4]Check texts
//[NEXT 5]Check texts
$T_['PING_IP'] = 'Ping a IP:Puerto';
$T_['HTTP_CODE'] = 'Código HTTP';
$T_['VISIT_COUNT'] = 'Contador de visitas';
$T_['DATABASE'] = 'Conexión a base de datos';
$T_['JSON_API'] = 'JSON API';
$T_['add_grp_to_add_chk'] = 'Añade un grupo para empezar a añadir checks';
$T_['view_hist'] = 'Ver histórico';
$T_['lastest_fails'] = 'Ultimos errores';
?>

View File

@@ -1,33 +0,0 @@
<?php
require_once "lib/dbwrapper.php";
$db_file = __DIR__."/sqlite.db3";
if (!is_file($db_file)){ //Go to install if not.
header("Location: install.php");
die();
}
$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,"/");
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');
//Translations
require_once __DIR__."/assets/translations/en.php"; //Ever first English, and then your lang (Database)
require_once __DIR__."/assets/translations/$lang.php";
?>

View File

@@ -1,33 +1,29 @@
<?php
require_once "functions.php";
require_once "load.php";
function PING_IP($db_conn,$ID_C,$URL,$timestamp){
function PING_IP($ID_C,$URL){
if (strpos($URL, ":")){ //Si usa un puerto, dividir
$host = explode(":", $URL)[0];
$port = explode(":", $URL)[1];
}else{$host=$URL;}
$result = isset($port) ? ping($host,$port) : ping($host); //Ping IP with or without port
dbw_query($db_conn, "INSERT INTO `CHKHIST` (`ID_C`,`code`,`timestamp`) VALUES ('$ID_C','$result','$timestamp')");
return $result; //Returns result
}
function HTTP_CODE($db_conn,$ID_C,$URL,$Param,$timestamp){
function HTTP_CODE($ID_C,$URL,$Param){
$httpCode = httpCode($URL); //Code
$code = (int)$Param != 0 ? $Param : 200; //Establish the code test want to see
if ($httpCode == $code){ //Si es igual
dbw_query($db_conn, "INSERT INTO `CHKHIST` (`ID_C`,`code`,`timestamp`) VALUES ('$ID_C','0','$timestamp')");
$ret = 0; //All right
}else{ //Si no es igual (Incluye false)
$httpCode = (int)$httpCode; //Force int
dbw_query($db_conn, "INSERT INTO `CHKHIST` (`ID_C`,`code`,`codeText`,`timestamp`) VALUES ('$ID_C','1','$httpCode','$timestamp')");
$ret = 1;
$ret = (int)$httpCode; //Code not 0 (And it's received code)
}
return $ret;
}
function DATABASE_CONN($db_conn,$ID_C,$URL,$timestamp){
function DATABASE_CONN($ID_C,$URL){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $URL);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
@@ -37,19 +33,44 @@ function DATABASE_CONN($db_conn,$ID_C,$URL,$timestamp){
curl_close($ch);
$result = htmlentities($body);
if($result == 'OK'){
dbw_query($db_conn, "INSERT INTO `CHKHIST` (`ID_C`,`code`,`timestamp`) VALUES ('$ID_C','0','$timestamp')");
$ret = 0;
}else{ //Fail if it's not ok.
dbw_query($db_conn, "INSERT INTO `CHKHIST` (`ID_C`,`code`,`timestamp`) VALUES ('$ID_C','1','$timestamp')");
$ret = 1;
return 0;
}else{ //Fail if it returns other than "OK".
return 1;
}
return $ret;
}
function JSON_API($ID_C,$URL,$params,$exceptedRes){
$type = explode('|',$params)[0];
$JSONParams = explode('|',$params)[1];
$ch = curl_init();
if ($type == 'GET'){
curl_setopt($ch, CURLOPT_URL, $URL . $JSONParams);
}else if ($type == 'POST'){
curl_setopt($ch, CURLOPT_URL, $URL);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $JSONParams);
}
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_TIMEOUT, 4); //timeout in seconds
$body = curl_exec($ch); //All file
curl_close($ch);
$json_ret = json_decode($body,true);
$json_param = json_decode($exceptedRes,true);
if ($json_ret == $json_param){
return 0;
}else{
return 1;
}
}
$db_conn = getconn();
$sites = dbw_query($db_conn,"SELECT * FROM CHECKS");
while ($site = dbw_fetch_array($db_conn,$sites)){
$try = 0;
$extitC = 0;
$ID_C= $site['ID_C'];
do {
$try++; //This is for avoiding posible "second" problems in some checks that are working but doesn't answer to first time
@@ -57,31 +78,38 @@ while ($site = dbw_fetch_array($db_conn,$sites)){
switch ($site['ID_TC']) {
case '1': //Ping to IP:Port
$exitC = PING_IP($db_conn,$ID_C,$site['URL'],time());
$exitC = PING_IP($ID_C,$site['url']);
break;
case '2': //HttpCode
$exitC = HTTP_CODE($db_conn,$ID_C,$site['URL'],$site['TCParam'],time());
$exitC = HTTP_CODE($ID_C,$site['url'],$site['urlParam']);
break;
case '4': //MySQL|Database connect
$exitC = DATABASE_CONN($db_conn,$ID_C,$site['URL'],time());
$exitC = DATABASE_CONN($ID_C,$site['url']);
break;
case '5': //JSON GET | POST
$exitC = JSON_API($ID_C,$site['url'],$site['urlParam'],$site['exceptedRes']);
break;
}
}while($try <= 2 && $exitC == 1);
}
//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
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");
$timestamp = time();
if ($exitC == 0){ //Check successful
dbw_query($db_conn, "INSERT INTO `CHKHIST` (`ID_C`,`code`,`timestamp`) VALUES ('$ID_C','0','$timestamp')");
}else if ($exitC == 1){ //Normal check failed
dbw_query($db_conn, "INSERT INTO `CHKHIST` (`ID_C`,`code`,`timestamp`) VALUES ('$ID_C','1','$timestamp')");
}else{ //Other code of check failed
dbw_query($db_conn, "INSERT INTO `CHKHIST` (`ID_C`,`code`,`errorText`,`timestamp`) VALUES ('$ID_C','1','$exitC','$timestamp')");
}
}
//Delete old Checks (Based on time to save, put in secs)
$mintime = time()-(getSystemOpt("maxTimeSave")*24*3600);
dbw_query($db_conn,"DELETE FROM CHKHIST WHERE `timestamp` < $mintime");
//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

@@ -1,46 +1,57 @@
<?php
/* First, db connection */
require_once "connect.php";
require_once 'lib/loadTwig.php';
//Functions
/** 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 getUptime($ID_C,$precision = 0){
$db_conn = getconn();
if ($precision == 0){
$time = time()-30*7*3600; //Last week
}else{
$time = $precision;
}
$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'];
}
if ($count == 0){
return '-1'; //No registers
}else{
if ($err != 0){
$uptime = (100 - round(($err/$count)*100,2));
return $uptime;
}else{
return 100;
}
}
}
function checkUptime($db_conn,$ID_C,$precision = 0){
$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];
function getStatus($ID_C){
$T_ = loadLang();
$db_conn = getconn();
$resql = dbw_query($db_conn,"SELECT code FROM CHKHIST WHERE ID_C='$ID_C' ORDER BY `timestamp` DESC LIMIT 5");
$err = 0;
while ($x = dbw_fetch_array($db_conn,$resql)){
if ($x['code'] != 0){
$err++;
}
}
if ($all != 0){
$uptime = ($good/$all)*100;
return $uptime;
}else{
return 100;
switch ($err){
case 0:
case 1:
return array($T_['status_right'],'green');
break;
case 2:
return array($T_['status_lproblems'],'blue');
break;
case 3:
case 4:
return array($T_['status_problems'],'orange');
break;
default: // > 4
return array($T_['status_outofserv'],'red');
break;
}
}
@@ -54,16 +65,16 @@ function ping($host,$port = '80') {
/** Returns web root (ie. http://jkanetwork.com) */
function webRoot(){
$root = $_SERVER['HTTPS'] ? "https://" : "http://"; //Variable = condicion ? Verdadero : Falso
$root = isset($_SERVER['HTTPS']) ? "https://" : "http://"; //Variable = condicion ? Verdadero : Falso
return $root . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']);
}
/** Returns a system option */
function getSystemOpt($db_conn,$sysopt){
return dbw_query_fetch_array($db_conn,"SELECT * FROM SYS WHERE option = '$sysopt'")['value'];
function getSystemOpt($sysopt){
return dbw_query_fetch_array(getconn(),"SELECT * FROM SYS WHERE option = '$sysopt'")['value'];
}
/** Return HttpCode of page. Returns false if page is not found */
/** Return HttpCode of page. Returns false if page is not found (Used in cron) */
function httpCode($url, $wait = 5)
{
$ch = curl_init();
@@ -99,45 +110,71 @@ 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
}
}
function nameFromIDC($db_conn,$ID_C){
return dbw_query_fetch_array($db_conn,"SELECT name FROM CHECKS WHERE ID_C='$ID_C'")[0];
function nameFromIDC($ID_C){
return dbw_query_fetch_array(getconn(),"SELECT name FROM CHECKS WHERE ID_C='$ID_C'")[0];
}
function nameGroupFromIDG($db_conn,$ID_G){
return dbw_query_fetch_array($db_conn,"SELECT * FROM GROUPS WHERE ID_G='$ID_G'")['name'];
function nameGroupFromIDG($ID_G){
return dbw_query_fetch_array(getconn(),"SELECT ID_G,name FROM GROUPS WHERE ID_G='$ID_G'")['name'];
}
function IDGFromIDC($db_conn,$ID_C){
return dbw_query_fetch_array($db_conn,"SELECT ID_G FROM CHECKS WHERE ID_C='$ID_C'")['ID_G'];
function IDGFromIDC($ID_C){
return dbw_query_fetch_array(getconn(),"SELECT ID_G FROM CHECKS WHERE ID_C='$ID_C'")['ID_G'];
}
/* This funtion returns the array with type of checks */
function arrayTypeChk(){
return array(
'1' => 'PING_IP',
'2' => 'HTTP_CODE',
'3' => 'VISIT_COUNT',
'4' => 'DATABASE');
1 => 'PING_IP',
2 => 'HTTP_CODE',
3 => 'VISIT_COUNT',
4 => 'DATABASE',
5 => 'JSON_API');
}
/* This funtion returns the translated text of a type check */
function textTypeChk($T_,$typeChk){
function textTypeChk($typeChk){
$T_ = loadLang();
$arr = array(
'1' => $T_['PING_IP'],
'2' => $T_['HTTP_CODE'],
'3' => $T_['VISIT_COUNT'],
'4' => $T_['DATABASE']);
1 => $T_['PING_IP'],
2 => $T_['HTTP_CODE'],
3 => $T_['VISIT_COUNT'],
4 => $T_['DATABASE'],
5 => $T_['JSON_API']
);
return $arr[$typeChk];
}
}
//This function is an alias to Twig render, with "standard args" added
function renderPage($page,$array = array()){
$T_ = loadLang(); //Load transactions
//Default params to send
$allarray = array(
'version' => VERSION,
'T_' => $T_,
);
foreach ($array as $key => $value) {
$allarray[$key] = $value;
}
require 'lib/loadTwig.php';
echo $twig->render($page, $allarray);
}
function loadLang(){
//Translations
require __DIR__."/assets/translations/en.php"; //Ever first English, and then your lang (Database)
require __DIR__."/assets/translations/".LANG.".php";
return $T_;
}

View File

@@ -1,12 +1,12 @@
<?php
require_once "functions.php";
require_once "load.php";
$results = dbw_query($db_conn,"SELECT * FROM GROUPS"); //All groups
while ($group = dbw_fetch_array($db_conn,$results)){ //Know name of all groups
$groups[$group['ID_G']] = $group['name'];
}
unset($results); //Free mem
$results = dbw_query($db_conn,"SELECT * FROM CHECKS ORDER BY ID_G"); //All checks
@@ -14,32 +14,44 @@ while ($onechk = dbw_fetch_array($db_conn,$results)){
$idchk = $onechk['ID_C'];
$chks[$idchk] = $onechk; //First array data
$chks[$idchk]['nameGroup'] = $groups[$onechk['ID_G']]; //Know group of this check
$ID_TC = $chks[$idchk]['ID_TC']; //Type of Check
switch ($chks[$idchk]['ID_TC']){
// Case 1 and 2 are normal status, case 3 (Visits) is numeric, not status
switch ($ID_TC){
// Case 3 (Visits) is numeric, not status
case 1: //Ping
case 2: //HttpCode
case 4: //MySQL
case 4: //MySQL
case 5: //JSON GET|POST
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']);
//To enter or not, check if has history (Instead of count > 0, only see if there is any timestamp, is faster)
if (dbw_query_fetch_array($db_conn, "SELECT `timestamp` FROM CHKHIST WHERE ID_C = '$idchk' LIMIT 1")[0] != 0){
$consul = dbw_query_fetch_array($db_conn, "SELECT `code`,`timestamp` FROM CHKHIST WHERE ID_C = '$idchk' ORDER BY `timestamp` DESC LIMIT 1");
$chks[$idchk]['dateLastChk'] = date('d/m H:i',$consul['timestamp']);
$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'];
$chks[$idchk]['failedLastChk'] = $consul['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.
$lastErr = dbw_query_fetch_array($db_conn, "SELECT MAX(`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);
$chks[$idchk]['nameCheck'] = arrayTypeChk()[$ID_TC]; //To send array name and not the word
if ($onechk['manStatus'] != ''){
$chks[$idchk]['uptime'] = 255;//255 = Maintenance I suppose, not implemented
}else{
$chks[$idchk]['uptime'] = getUptime($idchk);
}
list($chks[$idchk]['statusText'],$chks[$idchk]['statusColor']) = getStatus($idchk);
}else{ //If nothing collected yet
$chks[$idchk]['uptime'] = -1; // -1 is nothing in twig page
}
break;
case 3: //Visits
$visitsSite = dbw_query($db_conn, "SELECT * FROM (SELECT * FROM VISITS WHERE ID_C = '$idchk' ORDER BY `date` DESC LIMIT 0,5) sub ORDER BY `Date` ASC");
$visitsSite = dbw_query($db_conn, "SELECT * FROM (SELECT * FROM VISITS WHERE ID_C = '$idchk' ORDER BY `date` DESC LIMIT 0,5) sub ORDER BY `date` ASC"); //Subquery for reorder lastest days in reverse
//Create array from last 5 days
while ($visitsDay = dbw_fetch_array($db_conn, $visitsSite)){
$dateArray[] = $visitsDay['date'];
@@ -53,7 +65,7 @@ while ($onechk = dbw_fetch_array($db_conn,$results)){
}
//Here load "News"
//Here load "News"
$incidents = dbw_query($db_conn,"SELECT * FROM NEWS ORDER BY ID_N DESC LIMIT 20");
while ($incident = dbw_fetch_array($db_conn,$incidents)){
@@ -72,7 +84,5 @@ while ($incident = dbw_fetch_array($db_conn,$incidents)){
->text($incident['text']);
$incs[$ID_N]['ID_N'] = $incident['ID_N'];
}
echo $twig->render('indexpage.twig', array('T_' => $T_, 'you' => $you, 'checks' => $chks, 'news' => $incs)); //Render
?>
renderPage('indexpage.twig',array('checks' => $chks, 'news' => $incs)); //Render
?>

View File

@@ -1,6 +1,6 @@
<?php
$ver = '0.9';
//require "functions.php"; //THIS FILE CAN'T BE USED THERE, BECAUSE IT HAS connect.php dependence
define('VERSION','0.9.4');
//define('INSTALLER_MODE','1');
require_once 'lib/loadTwig.php';
$db_file = __DIR__."/sqlite.db3";
@@ -12,7 +12,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 +30,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" (
@@ -64,24 +63,26 @@ CREATE TABLE "CHECKS" (
`ID_C` INTEGER PRIMARY KEY AUTOINCREMENT,
`ID_G` INTEGER,
`name` TEXT NOT NULL,
`URL` TEXT,
`url` TEXT,
`manStatus` INTEGER,
`ID_TC` INTEGER,
`TCParam` TEXT,
`urlParam` TEXT,
`exceptedRes` TEXT,
FOREIGN KEY(`ID_G`) REFERENCES `GROUPS`(`ID_G`),
FOREIGN KEY(`ID_TC`) REFERENCES `TYPECHK`(`ID_TC`)
);
COMMIT;';
dbw_multi_query($db_conn,$sqlcreate); //Create scheme
$user = $_POST[username];
$user = $_POST['username'];
$pass = hash("sha256",$_POST['passw1']);
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."')");
dbw_query($db_conn,"INSERT INTO SYS VALUES ('maintenance','0')");
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)
@@ -212,7 +230,7 @@
* fixed reserved keywords (forbids true, false, null and none keywords for variables names)
* fixed support for PHP7 (Throwable support)
* marked the following methods as being internals on Twig_Environment:
* marked the following methods as being internals on Twig_Environment:
getFunctions(), getFilters(), getTests(), getFunction(), getFilter(), getTest(),
getTokenParsers(), getTags(), getNodeVisitors(), getUnaryOperators(), getBinaryOperators(),
getFunctions(), getFilters(), getGlobals(), initGlobals(), initExtensions(), and initExtension()

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);
}

41
load.php Normal file
View File

@@ -0,0 +1,41 @@
<?php
require_once 'functions.php'; //Preloads functions
require_once 'lib/dbwrapper.php';
define('VERSION','0.9.4');
session_start(); //Session in all page
//Preload file
//This function loads all things needed, with optional db things if needed
function getconn(){
$db_file = __DIR__."/sqlite.db3";
if (!is_file($db_file)){ //Go to install if not.
header("Location: install.php");
die();
}
return dbw_connect("sqlite",$db_file); //Database
}
$db_conn = getconn();
/** Check if user SessionID exists, if not, delete Cookie */
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['webRoot'] = webRoot();
}
define('LANG', getSystemOpt('lang'));
if (getSystemOpt('version') != VERSION){
die("<p>Please run updater.php to update before using page");
}
if (getSystemOpt('maintenance') == '1'){
die("<p>CheckStatus is in maintenance mode, wait for admin to disable maintenance mode</p>");
}

View File

@@ -1,35 +1,31 @@
<?php
require "functions.php";
require "load.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,"/");
session_destroy();
header('Location: index.php');
}
}
if (isset($_COOKIE['SessionID'])){ //Ya está logueado
if (isset($_SESSION['UserID'])){ //Ya está logueado
header('Location: panel.php');
}
if (!isset($_POST['nick'])){
echo $twig->render('login.twig');
renderPage('login.twig');
}
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","/");
header('Location: panel.php');
$_SESSION['UserID'] = $resql['ID_U'];
header('Location: panel.php');
}else{
echo $twig->render('login.twig', array('status' => 'error'));
renderPage('login.twig', array('status' => 'error'));
}
}

View File

@@ -1,5 +1,5 @@
<?php
require_once 'functions.php';
require_once 'load.php';
requirelogin();
//Calculo día 1 del mes en curso
@@ -18,7 +18,7 @@ if (in_array($page,$arrPagesFullRigths) && $you['fullRights'] != 1){
switch($page){
case 'notperm':
echo $twig->render('panel/p_notperm.twig', array('T_' => $T_, 'you' => $you));
renderPage('panel/p_notperm.twig', array('you' => $you));
break;
case 'checks':
//Groups (For "fast-change-group option in html")
@@ -38,7 +38,7 @@ switch($page){
$ID_G = $chks[$idchk]['ID_G']; //For nameGroup
$chks[$idchk]['nameGroup'] = dbw_query_fetch_array($db_conn,"SELECT * FROM GROUPS WHERE ID_G='$ID_G'")['name'];
$ID_TC = $chks[$idchk]['ID_TC'];
$chks[$idchk]['nameTCheck'] = textTypeChk($T_,$ID_TC);
$chks[$idchk]['nameTCheck'] = textTypeChk($ID_TC);
}
@@ -47,7 +47,7 @@ switch($page){
$emptyG[] = array('name' =>$emptygrp['name']);
}
echo $twig->render('panel/p_checks.twig', array('T_' => $T_, 'mpage' => 'checks','you' => $you, 'checks' => $chks,'groups' => $groups,'emptygrp' => $emptyG));
renderPage('panel/p_checks.twig',array('mpage' => 'checks','you' => $you, 'checks' => $chks,'groups' => $groups,'emptygrp' => $emptyG));
break;
//Forms to add or edit a check (Not saving, only forms)
@@ -65,17 +65,18 @@ switch($page){
foreach(arrayTypeChk() as $key => $value){
$tchecks[] = array(
'ID_TC' =>$key,
'name' => textTypeChk($T_,$key)
'name' => textTypeChk($key)
);
}
//En este if hago las diferencias entre add y edit, para no repetir código.
if ($page == 'addcheck'){
echo $twig->render('panel/p_addedit.twig', array('T_' => $T_, 'mpage' => 'checks', 'type' => 'new','groups' => $groups,'tchecks' => $tchecks));
renderPage('panel/p_addedit.twig', array('mpage' => 'checks', 'type' => 'new','groups' => $groups,'tchecks' => $tchecks));
}elseif ($page == 'editcheck'){
$ID_C = (int)$_GET['ID_C']; //Check to edit
$checkdata = dbw_query_fetch_array($db_conn,"SELECT * FROM CHECKS WHERE ID_C='$ID_C'"); //Checkdata
echo $twig->render('panel/p_addedit.twig', array('T_' => $T_, 'mpage' => 'checks', 'you' => $you, 'type' => 'edit','groups' => $groups,'tchecks' => $tchecks,'check' => $checkdata));
renderPage('panel/p_addedit.twig', array('mpage' => 'checks', 'you' => $you, 'type' => 'edit','groups' => $groups,'tchecks' => $tchecks,'check' => $checkdata));
}
break;
@@ -89,17 +90,28 @@ switch($page){
$ID_G = $_POST['group'];
$ID_TC = $_POST['tcheck'];
//Datos que dependen del tipo de check
if ($ID_TC == 1){
$URL = $_POST['t1url'] . ':' . $_POST['t1port'];
dbw_query($db_conn,"UPDATE CHECKS SET URL='$URL' WHERE ID_C='$ID_C'");
}elseif ($ID_TC == 2){
$URL = $_POST['t2url'];
$TCParam = isset($_POST['t2code']) ? $_POST['t2code'] : '';
dbw_query($db_conn,"UPDATE CHECKS SET URL='$URL',TCParam = '$TCParam' WHERE ID_C='$ID_C'");
}elseif ($ID_TC == 4){
$URL = $_POST['t4url'];
dbw_query($db_conn,"UPDATE CHECKS SET URL='$URL' WHERE ID_C='$ID_C'");
switch ($ID_TC){
case 1:
$url = $_POST['t1url'] . ':' . $_POST['t1port'];
dbw_query($db_conn,"UPDATE CHECKS SET url='$url' WHERE ID_C='$ID_C'");
break;
case 2:
$url = $_POST['t2url'];
$urlParam = isset($_POST['t2code']) ? $_POST['t2code'] : '';
dbw_queryurl($db_conn,"UPDATE CHECKS SET url='$url',urlParam = '$urlParam' WHERE ID_C='$ID_C'");
break;
case 4:
$url = $_POST['t4url'];
dbw_query($db_conn,"UPDATE CHECKS SET url='$url' WHERE ID_C='$ID_C'");
break;
case 5:
$url = $_POST['t5url'];
$urlParam = dbw_escape_string($db_conn,$_POST['t5type'].'|'.$_POST['t5params']);
$exceptedRes = dbw_escape_string($db_conn,$_POST['t5exceptedRes']);
dbw_query($db_conn,"UPDATE CHECKS SET url='$url', urlParam='$urlParam',exceptedRes='$exceptedRes' WHERE ID_C='$ID_C'");
break;
}//Si es 3 no hay datos que guardar (de momento)
//Guardamos el resto de datos
dbw_query($db_conn,"UPDATE CHECKS SET name='$name', ID_G='$ID_G', ID_TC='$ID_TC' WHERE ID_C='$ID_C'");
@@ -144,8 +156,7 @@ switch($page){
'checks' => $countchk
);
}
echo $twig->render('panel/p_groups.twig', array('T_' => $T_, 'you' => $you, 'mpage' => 'groups', 'groups' => $groups));
renderPage('panel/p_groups.twig', array('you' => $you, 'mpage' => 'groups', 'groups' => $groups));
break;
case 'addgroup':
@@ -186,8 +197,7 @@ switch($page){
->text($result['text']);
$news[$ID_N]['mdtext'] = $result['text']; //Raw text
}
echo $twig->render('panel/p_news.twig', array('T_' => $T_, 'you' => $you, 'mpage' => 'news', 'allnews' => $news));
renderPage('panel/p_news.twig', array('you' => $you, 'mpage' => 'news', 'allnews' => $news));
break;
case 'newnews':
@@ -208,15 +218,17 @@ 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
while ($syso = dbw_fetch_array($db_conn,$results)){
$sys[$syso['option']] = $syso['value'];
}
echo $twig->render('panel/p_settings.twig', array('T_' => $T_, 'you' => $you, 'mpage' => 'settings', 'sys' => $sys));
renderPage('panel/p_settings.twig', array('you' => $you, 'mpage' => 'settings', 'sys' => $sys));
break;
case 'users':
@@ -230,8 +242,7 @@ switch($page){
'fullrights' => $us['fullRights']
);
}
echo $twig->render('panel/p_users.twig', array('T_' => $T_, 'mpage' => 'users', 'you' => $you, 'users' => $user));
renderPage('panel/p_users.twig', array('mpage' => 'users', 'you' => $you, 'users' => $user));
break;
case 'adduser':
@@ -268,6 +279,32 @@ switch($page){
header('Location: panel.php?page=users');
break;
//History of checks for a ID_C
case 'viewhist':
//All page data
$ID_C = (int)$_GET['ID_C'];
$page = dbw_query_fetch_array($db_conn,"SELECT name FROM CHECKS WHERE ID_C='$ID_C'");
$cant = 100;
$results = dbw_query($db_conn,"SELECT * FROM CHKHIST WHERE ID_C='$ID_C' ORDER BY `timestamp` DESC LIMIT $cant");
//TODO TIMESTAMPS FAILS
$cgood = 0;$cbad = 0; $fails = array();
while ($us = dbw_fetch_array($db_conn,$results)){
if ($us['code'] == 0){
$cgood++;
}else{
$cbad++;
$fails[] = date('d/m/Y H:i',$us['timestamp']); //Record timestamps
}
}
$group = nameGroupFromIDG(IDGFromIDC($ID_C));
$pagedata = array('cgood' => $cgood,'cbad' => $cbad,'name' => nameFromIDC($db_conn,$ID_C), 'group' => $group,'cant' => $cant,'fails' => $fails);
renderPage('panel/p_viewhist.twig', array('mpage' => 'viewhist', 'you' => $you,'pagedata' => $pagedata));
break;
// Página principal
case 'status':
default:
@@ -280,9 +317,10 @@ switch($page){
if ($failssql != false){
while ($fail = dbw_fetch_array($db_conn,$failssql)){ //Create array
$fails[] = array (
'name' => nameFromIDC($db_conn,$fail['ID_C']),
'groupName' => nameGroupFromIDG($db_conn,IDGFromIDC($db_conn,$fail['ID_C'])),
'typeCheck' => textTypeChk($T_,$fail['ID_TC']),
'ID_C' => $fail['ID_C'],
'name' => nameFromIDC($fail['ID_C']),
'groupName' => nameGroupFromIDG(IDGFromIDC($fail['ID_C'])),
/* 'typeCheck' => textTypeChk($fail['ID_TC']), Doesnt work yet */
'errorText' => $fail['errorText'],
'date' => date('j/n/Y',$fail['timestamp']),
'hour' => date('H:i',$fail['timestamp'])
@@ -292,7 +330,7 @@ switch($page){
$fails = array(); //Empty
}
echo $twig->render('panel/p_index.twig', array('T_' => $T_, 'you' => $you, 'mpage' => 'index', 'data' => $data,'fails' => $fails)); //Render
renderPage('panel/p_index.twig', array('you' => $you, 'mpage' => 'index', 'data' => $data,'fails' => $fails)); //Render
break;
}

53
updater.php Normal file
View File

@@ -0,0 +1,53 @@
<?php
echo "<h2>Updater of CheckServer</h2>";
echo "<p>Connecting to database</p>";
require_once 'lib/dbwrapper.php';
$db_file = __DIR__."/sqlite.db3";
if (!is_file($db_file)){ //Go to install if not.
header("Location: install.php");
die();
}
$db_conn = dbw_connect("sqlite",$db_file); //Database
dbw_query($db_conn,"UPDATE SYS SET value='1' WHERE option='maintenance'");
$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 "<p>0.9.1->0.9.2</p>";
case '0.9.2':
echo "<p>0.9.2->0.9.3</p>";
dbw_query($db_conn,'ALTER TABLE CHECKS RENAME TO CHECKS_orig;');
dbw_query($db_conn,'
CREATE TABLE "CHECKS" (
`ID_C` INTEGER PRIMARY KEY AUTOINCREMENT,
`ID_G` INTEGER,
`ID_TC` INTEGER,
`name` TEXT NOT NULL,
`url` TEXT,
`manStatus` INTEGER,
`urlParam` TEXT,
`exceptedRes` TEXT,
FOREIGN KEY(`ID_G`) REFERENCES `GROUPS`(`ID_G`),
FOREIGN KEY(`ID_TC`) REFERENCES `TYPECHK`(`ID_TC`)
);
');
dbw_query($db_conn,"INSERT INTO CHECKS(ID_C, ID_G,ID_TC,name,url,manStatus,urlParam) SELECT ID_C,ID_G,ID_TC,name,URL,manStatus,TCParam FROM CHECKS_orig;");
dbw_query($db_conn,"DROP TABLE CHECKS_orig");
dbw_query($db_conn,"INSERT INTO SYS VALUES ('maintenance','1')"); //New system opt
case '0.9.3':
echo "<p>0.9.3->0.9.4</p>";
case '0.9.4':
dbw_query($db_conn,"UPDATE SYS SET value='0.9.4' WHERE option='version'");
dbw_query($db_conn,"UPDATE SYS SET value='0' WHERE option='maintenance'");
echo "<p>0.9.4-Lastest</p>";
echo "<p>Updated to lastest. Close this and go to index</p>";
echo "<p>Remember to delete updater.php and install.php for security!</p>";
}