Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .env.dist
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ DATABASE_PORT=3306
DATABASE_NAME=web
DATABASE_USER=afup
DATABASE_PASSWORD=afup
DATABASE_TIMEZONE=+01:00

SECRET=ThisTokenIsNotSoSecretChangeIt

Expand Down
45 changes: 45 additions & 0 deletions app/Resources/views/admin/healthcheck.html.twig
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{% extends 'admin/base_with_header.html.twig' %}

{% block content %}
<h1>Healthcheck</h1>
<div class="ui grid">
<div class="eight wide column">
<div class="ui segment">
<h2 class="ui header">Dates</h2>
<div class="ui clearing divider"></div>
<dl>
<dt>PHP</dt>
<dd>{{ dates.php }}</dd>
<dt>MySQL Base_De_Donnees</dt>
<dd>{{ dates.mysql_bdd }}</dd>
<dt>MySQL Ting</dt>
<dd>{{ dates.mysql_ting }}</dd>
<dt>Différence MySQL et PHP</dt>
<dd>
{{ dates.diff ? 'Les timezones sont différentes' : 'Pas de différence de timezones' }}
</dd>
</dl>
</div>
</div>
<div class="eight wide column">
<div class="ui segment">
<h2 class="ui header">Versions</h2>
<div class="ui clearing divider"></div>
<dl>
<dt>PHP</dt>
<dd>{{ versions.php }}</dd>
<dt>Symfony</dt>
<dd>{{ versions.symfony }}</dd>
</dl>
</div>
</div>
</div>
<style>
dt {
font-weight: bold;
}
dd {
font-family: "Noto Sans Mono", monospace;
}
</style>
{% endblock %}
9 changes: 9 additions & 0 deletions app/config/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,10 @@ parameters:
forum_partenaire:
nom: 'Sponsors/Partenaires'
niveau: 'ROLE_ADMIN'
healthcheck:
nom: 'Healthcheck'
niveau: 'ROLE_ADMIN'
url: '/admin/healthcheck'
connexion:
nom: 'Connexion'
masquee: true
Expand Down Expand Up @@ -357,6 +361,11 @@ ting:
port: "%database_port%"
user: "%database_user%"
password: "%database_password%"

databases_options:
"%database_name%":
timezone: "%database_timezone%"

repositories:
event:
namespace : AppBundle\Event\Model\Repository
Expand Down
4 changes: 4 additions & 0 deletions app/config/routing/admin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -108,3 +108,7 @@ admin_site:
admin_github_user_routes:
resource: "admin_github_user.yml"
prefix: /event/github-user

admin_healthcheck:
path: /healthcheck
defaults: {_controller: AppBundle\Controller\Admin\HealthcheckController}
2 changes: 1 addition & 1 deletion app/config/security.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ security:
- { path: ^/admin/members/general_meeting_vote, roles: ROLE_ADMIN }
- { path: ^/admin/site, roles: ROLE_ADMIN }
- { path: ^/admin/planete, roles: ROLE_ADMIN }
- { path: ^/admin/(members/reporting|association/relances|talk|slackmembers/check), roles: ROLE_ADMIN}
- { path: ^/admin/(members/reporting|association/relances|talk|slackmembers/check|healthcheck), roles: ROLE_ADMIN}
- { path: ^/member, roles: [ROLE_USER, ROLE_MEMBER_EXPIRED]}
- { path: ^/admin/, roles: ROLE_MEMBER_EXPIRED }
- { path: ^/blog, allow_if: "request.getClientIp() in ['217.70.189.71', '127.0.0.1', '192.168.42.1'] or request.server.get('ALLOW_BLOG_FROM_ALL') == 1 or request.headers.get('x-afup-blog-api-key') == '%blog_api_key%'" }
Expand Down
1 change: 1 addition & 0 deletions docker/dockerfiles/mysql/my.cnf
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ skip-host-cache
skip-name-resolve
innodb_file_per_table=1
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
default-time-zone = "+00:00"
1 change: 1 addition & 0 deletions docker/dockerfiles/mysqltest/my.cnf
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ skip-host-cache
skip-name-resolve
innodb_file_per_table=1
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
default-time-zone = "+00:00"
1 change: 1 addition & 0 deletions sources/Afup/Utils/Base_De_Donnees.php
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ public function getDbLink()
if ($this->link === null) {
$this->link = mysqli_connect($this->config['host'], $this->config['user'], $this->config['password'], null, (int) $this->config['port']) or die('Connexion à la base de données impossible');
mysqli_set_charset($this->link, "utf8mb4");
mysqli_query($this->link, "SET time_zone = '" . getenv('DATABASE_TIMEZONE') . "'");
$this->selectionnerBase($this->config['database']);
}
return $this->link;
Expand Down
51 changes: 51 additions & 0 deletions sources/AppBundle/Controller/Admin/HealthcheckController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?php

declare(strict_types=1);

namespace AppBundle\Controller\Admin;

use Afup\Site\Corporate\_Site_Base_De_Donnees;
use AppBundle\Event\Model\Repository\EventRepository;
use CCMBenchmark\TingBundle\Repository\RepositoryFactory;
use DateTime;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Kernel;

class HealthcheckController extends AbstractController
{
private RepositoryFactory $ting;

public function __construct(RepositoryFactory $ting)
{
$this->ting = $ting;
}

public function __invoke(): Response
{
$php = new DateTime();

$bdd = new _Site_Base_De_Donnees();
$mysqlBdd = $bdd->obtenirUn('SELECT CURRENT_TIMESTAMP');
$mysqlBdd = new DateTime($mysqlBdd);

$repo = $this->ting->get(EventRepository::class);
$mysqlTing = $repo->getQuery('SELECT CURRENT_TIMESTAMP')->execute()['CURRENT_TIMESTAMP'];
$mysqlTing = new DateTime($mysqlTing);

$diff = $php->getTimestamp() !== $mysqlBdd->getTimestamp() || $php->getTimestamp() !== $mysqlTing->getTimestamp();

return $this->render('admin/healthcheck.html.twig', [
'dates' => [
'php' => $php->format(\DateTime::ATOM),
'mysql_bdd' => $mysqlBdd->format(\DateTime::ATOM),
'mysql_ting' => $mysqlTing->format(\DateTime::ATOM),
'diff' => $diff
],
'versions' => [
'php' => phpversion(),
'symfony' => Kernel::VERSION
]
]);
}
}
15 changes: 15 additions & 0 deletions tests/behat/features/Admin/Divers/Healthcheck.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
Feature: Administration - Healthcheck

@reloadDbWithTestData
Scenario: Un membre ne peut pas accéder aux vérifications du site
Given I am logged-in with the user "paul" and the password "paul"
And I am on "/admin/healthcheck"
Then the response status code should be 403

@reloadDbWithTestData
Scenario: Vérifications du site
Given I am logged in as admin and on the Administration
And I follow "Healthcheck"
Then I should see "Healthcheck"
And I should see "Pas de différence de timezones"
And I should not see "Les timezones sont différentes"