Auteur/autrice : Vincent L

[NAS] Envoyer les notifications de votre Synology vers un canal Discord

[NAS] Envoyer les notifications de votre Synology vers un canal Discord

Si vous utilisez Discord et que vous possédez un NAS Synology, vous aurez peut-être envie d’utiliser l’application pour recevoir les notifications de votre NAS. Et comme il existe une version mobile, vous pourrez recevoir ces notifications sur votre smartphone.

Au préalable

  • Installez l’application Discord et créez un compte si cela n’est pas encore fait.
  • Créez votre propre serveur (depuis l’application, cliquez sur le « + » puis choisissez « Créer le mien » et suivez les étapes).
  • Créez votre webhook (paramètres du serveur > intégrations > webhooks > nouveau).
  • Récupérez l’URL du webhook en cliquant sur le bouton « Copier l’URL du webhook ».

Configuration sur votre NAS

Une fois l’URL du webhook récupérée, ouvrez un navigateur et connectez-vous à votre NAS Synology à l’aide de DSM.

La configuration a été réalisée sur un NAS Synology DS920+ disposant de la dernière version de DSM 7.

Ouvrez le panneau de configuration puis rendez vous dans la catégorie Notification. Choisissez le dernier onglet Service Push.

Tout en bas de la fenêtre, un bouton vous permet de gérer les webhooks. Cliquez sur celui-ci, ensuite dans la fenêtre qui s’affiche choisissez Ajouter. Votre NAS vous offre la possibilité de choisir entre sa solution Synology Chat ou de personnaliser les paramètres. C’est ce deuxième choix qui nous intéresse.

Ensuite il vous sera demandé d’indiquer le nom du fournisseur, l’objet du message, l’URL du webhook, et la méthode HTTP utilisée.

C’est à cette étape qu’il faut insérer l’URL récupérée dans le client Discord. Il faut également définir la méthode HTTP sur POST. Une fois que cela est fait, vous pouvez passer à l’étape suivante.

Au niveau des en-têtes HTTP il faudra également spécifier le type de contenu.

Pour la valeur de l’en-tête Content-Type il faut indiquer application/json. Il n’est pas nécessaire d’ajouter d’autres champs. Cliquez sur Suivant.

En ce qui concerne le corps de la demande, il va falloir un peu tricher…

En effet, on va ajouter un paramètre nommé « content », mais sans en définir sa valeur. Passez ensuite à l’étape suivante.

Ici, cependant, on va sélectionner la catégorie pour le paramètre « content » et choisir Contenu du message. Appliquez ensuite les paramètres. Dans la fenêtre, sélectionnez ensuite votre nouveau webhook et cliquez sur le bouton permettant d’envoyer un message de test.

Vous devriez obtenir quelque chose de similaire à ceci :

Synology: notifications discord

Vous savez désormais comment configurer l’envoi de notifications depuis un NAS Synology vers un canal Discord !

Sources

[NAS] Installer Uptime Kuma sur votre Synology en passant par Docker

[NAS] Installer Uptime Kuma sur votre Synology en passant par Docker

J’étais à la recherche d’un outil assez simple à configurer afin de vérifier l’état de mes sites. C’est en consultant un article sur le site Cachem que j’ai découvert Uptime Kuma, et bien sûr, j’ai cherché à l’installer sur mon NAS Synology.

Installation

Pour installer l’outil Uptime Kuma sur votre Synology, il vous faudra l’application Docker. Ensuite vous devez créer un dossier qui permettra de faire un lien avec le répertoire du conteneur.

Sur mon NAS tous les répertoires liés à mes conteneurs se trouve dans /volume1/docker. J’y ai donc créé un sous-répertoire appelé kuma.

Ensuite, à l’aide du planificateur de tâches, j’ai créé une tâche unique contenant la commande suivante :

docker run -d --name=uptime-kuma \
 -p 3001:3001 \
 -v /var/run/docker.sock:/var/run/docker.sock \
 -v /volume1/docker/kuma:/app/data \
 --restart=always \
 louislam/uptime-kuma

Comme SSH est désactivé sur mon NAS, c’est pour cette raison que j’utilise cette méthode. Cette astuce avait déjà été donnée dans le tutoriel pour installer Transmission. J’avais découvert ça sur le très bon site Marius Hosting.

Le port utilisé pour l’interface sera le port 3001. Il faudra alors utiliser l’URL suivante pour se connecter : http://<ip_du_nas>:3001/dashboard

Si l’installation se déroule bien, vous devriez avoir accès à l’interface. Vous devrez alors créer un nouvel utilisateur.

Utilisation du proxy inversé

Si vous voulez utiliser le proxy inversé et créer une adresse du type kuma.xxx.synology.me, il faut, au moment de créer la règle, se rendre dans l’onglet « En-tête personnalisé« .

Cliquez sur le bouton « Créer » puis sur « WebSocket« . Deux nouvelles entrées seront automatiquement ajoutées.

Définir les règles de surveillance

Lorsque vous vous connectez pour la première fois vous devez créer un compte. Ensuite vous pourrez accéder au tableau de bord, qui est relativement intuitif.

Cliquez sur le bouton « Add new monitor » sur la gauche. Vous pourrez ensuite définir différents paramètres, tels que le type de surveillance (le protocole utilisé), le nom d’affichage, l’URL à contrôler (dans le cas d’un site web), l’intervalle de vérification, la méthode HTTP utilisée (même chose).

Vous pourrez aussi déterminer comment Uptime Kuma doit vous prévenir en cas d’indisponibilité. Si vous disposez par exemple un serveur Discord, vous pouvez générer un webhook et l’outil enverra des messages directement dans le canal de votre choix.

Une fois votre règle créée cliquez sur le bouton « Save » en bas de page. Les paramètres de notification peuvent aussi être édités depuis les paramètres, en cliquant sur l’icône tout en haut à droite du tableau de bord (celle qui affiche la première lettre de votre nom d’utilisateur).

[PHP] Identification basique avec CakePHP 4.x

[PHP] Identification basique avec CakePHP 4.x

Si vous utilisez le framework CakePHP et que vous avez dû migrer vers la dernière version pour bénéficier de la compatibilité avec PHP 8.1, vous aurez probablement dû migrer votre système d’identification.

CakePHP : identification basique

Ce petit tutoriel se base sur la documentation officielle, en apportant quelques modifications si vous n’avez pas la même structure au niveau de votre table d’utilisateurs ou de vos contrôleurs.

Installation du plugin

Il faut tout d’abord installer le plugin fourni par CakePHP. Pour cela on utilise l’outil composer.

composer require "cakephp/authentication:^2.0"

Cette version est bien sûr compatible avec la version 4 du framework.

Chargement du plugin

Il faut maintenant éditer le fichier src/Application.php et y ajouter la méthode qui chargera le plugin.

Dans la méthode bootstrap(), après tous les éléments déjà chargés, ajoutez ce bout de code:

$this->addPlugin('Authentication');

Configuration du middleware

Le plugin va permettre de gérer facilement l’authentification d’un utilisateur, et va appliquer une stratégie de sécurité par défaut quelque soit l’action demandée.

Toujours dans le même fichier src/Application.php, ajoutez d’abord les imports nécessaires.

use Authentication\AuthenticationService;
use Authentication\AuthenticationServiceInterface;
use Authentication\AuthenticationServiceProviderInterface;
use Authentication\Identifier\IdentifierInterface;
use Authentication\Middleware\AuthenticationMiddleware;
use Cake\Http\MiddlewareQueue;
use Cake\Routing\Router;
use Psr\Http\Message\ServerRequestInterface;

Ensuite, ajoutez l’implémentation de l’interface:

class Application extends BaseApplication implements AuthenticationServiceProviderInterface

Puis modifiez la méthode middleware() et spécifiez la classe qui implémentera le middleware d’authentification. Dans ce cas, il s’agit de l’instance actuelle.

$middlewareQueue->add(new AuthenticationMiddleware($this));

Faites particulièrement attention à l’ordre : il doit être placé après BodyParserMiddleware et RoutingMiddleware.

Implémentation

Il faut ensuite ajouter la méthode getAuthenticationService(). Elle sera appelée à chaque fois qu’une requête est traitée.

public function getAuthenticationService(
    ServerRequestInterface $request
   ): AuthenticationServiceInterface
{
	$service = new AuthenticationService();

	// Automatic redirection when not authenticated
	$service->setConfig([
		'unauthenticatedRedirect' => Router::url([
			'prefix' => false,
			'plugin' => null,
			'controller' => 'Utilisateurs',
			'action' => 'login',
		]),
		'queryParam' => 'redirect',
	]);

	$fields = [
		IdentifierInterface::CREDENTIAL_USERNAME => 'nom',
		IdentifierInterface::CREDENTIAL_PASSWORD => 'password'
	];
	
	// Load the authenticators. Session should be first.
	$service->loadAuthenticator('Authentication.Session');
	$service->loadAuthenticator('Authentication.Form', [
		'fields' => $fields,
		'loginUrl' => Router::url([
			'prefix' => false,
			'plugin' => null,
			'controller' => 'Utilisateurs',
			'action' => 'login',
		]),
	]);
	
	$service->loadIdentifier('Authentication.Password', [
	  'resolver' => [
		'className' => 'Authentication.Orm',
		'userModel' => 'Utilisateurs',
	  ],
	  'fields' => [
		'username' => 'nom',
		'password' => 'password',
	  ],
	]);

	return $service;
}

Ce qu’on fait :

  • On définit avec setConfig() la stratégie à appliquer quand un utilisateur n’est pas connecté.
  • On spécifie les paramètres utilisés pour le formulaire d’identification.
  • On spécifie la liste des champs qui servent à identifier l’utilisateur.

Ici des modifications ont été apportées par rapport à l’exemple par défaut.

  • La classe du contrôleur qui gérera l’identification s’appelle UtilisateursController. Il faut donc spécifier « Utilisateurs » comme nom de contrôleur. CakePHP résoudra le nom complet lui-même.
  • Les champs de la table que l’on utilise sont le nom et password.
  • Notre table n’est pas appelée users mais utilisateurs. On le spécifie dans la clé resolver.

Charger le composant

Dans le contrôleur par défaut AppController.php (dont vos contrôleurs devront hériter), ajoutez l’appel suivant dans la méthode initialize().

$this->loadComponent('Authentication.Authentication');

L’erreur fréquente à ne pas reproduire: si vous écrivez une méthode initialize() dans un contrôleur enfant, n’oubliez pas d’appeler la méthode parent.

Désactiver l’authentification au cas par cas

Par défaut, toutes les actions nécessiteront une authentification. Mais vous pouvez modifier ce comportement en ajoutant l’événement beforeFilter() à chaque contrôleur où vous souhaitez que cela s’applique.

public function beforeFilter(EventInterface $event)
{
    $this->Authentication->allowUnauthenticated([
        'register', 'login', 'logout'
    ]);
}

On appelle la méthode allowUnauthenticated() de l’objet d’authentification, et on lui spécifie un tableau d’actions. Dans notre cas on autorise notamment login puisque c’est la méthode qui permet de gérer la requête d’auhentification.

Traiter la requête d’identification

Lorsqu’on valide le formulaire d’identification, voici l’action exécutée. La méthode est ajoutée au sein du contrôleur UtilisateursController.

public function login()
{
	if ($this->request->is('post')) 
	{
		$user = $this->Authentication->getResult();
		if ($user->isValid()) 
		{
			$target = $this->Authentication
				->getLoginRedirect() ?? '/';
			return $this->redirect($target);
		}
		
		$this->Flash->error(__("Bad user or password"));
	}
}

La méthode isValid() confirme si l’authentification s’est bien déroulée. Si c’est le cas on redirige l’utilisateur vers l’URL qu’on récupère à l’aide de getLoginRedirect(), et si celle-ci n’existe pas on redirigera vers la route « / ».

Dans le template associé, voici le code qui génère le formulaire:

<div class="users form">
<?= $this->Form->create() ?>
    <fieldset class="subfield">
        <legend><?= __("Saisissez vos identifiants") ?></legend>
        <?= $this->Form->control('nom',
                    ['label'=>'Identifiant']) ?>
        <?= $this->Form->control('password',
                    ['label'=>'Mot de passe']) ?>
  
<?= $this->Form->button(__('Connexion')); ?>
  </fieldset>
<?= $this->Form->end() ?>
</div>

Attention à bien respecter le nom des champs définis dans la configuration du middleware. Ils correspondent également aux champs définis dans le modèle.

Traiter la requête de déconnexion

Toujours dans le même contrôleur, on peut ajouter une action logout().

public function logout()
{
	$this->Authentication->logout();
	return $this->redirect([
		'controller' => 'Utilisateurs', 'action' => 'login'
	]);
}

La session de l’utilisateur est invalidée automatiquement.

Sources

[PHP] Mémo – Créer une commande avec Laravel

[PHP] Mémo – Créer une commande avec Laravel

Laravel fournit une interface en ligne de commande qui permet d’exécuter des scripts PHP directement depuis un terminal. Celle-ci s’appelle Artisan. On peut ainsi facilement gérer des tâches comme l’envoi de mails, la copie de fichiers, ou effectuer des interactions en base de données.

Créer une commande avec Laravel

Créer la classe

Votre commande sera implémentée à l’aide d’une classe. Si ce n’est pas encore fait, créez le dossier Commands dans app\Console.

Ensuite créez une classe qui héritera de Command.

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class MyTestCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'my:test';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
    }
}

Voici ce qu’on retrouve dans la classe :

  • La signature de la commande (nom de la commande, arguments, options) ;
  • La description de la commande (un texte qui indique ce que fait la commande) ;
  • Un constructeur par défaut ;
  • Une méthode handle() qui contient la logique de la commande.

Enregistrer la commande

Il faudra enregistrer la commande en l’ajoutant au tableau défini dans la classe app\Console\Kernel.php.

    protected $commands = [
        MyTestCommand::class,
    ];

Dans les versions plus récentes de Laravel, toute classe qui se trouve dans le sous-dossier Commands, est chargée par défaut, du moins si on n’a pas enlevé l’appel qui se charge de cela.

Personnaliser la commande

On peut personnaliser la commande en y ajoutant des arguments et des options. On ajoute ceux-ci dans la signature.

Pour l’appel de la commande dans un terminal, préfixez chaque option par deux tirets courts. On n’ajoute rien de spécifique lorsqu’on spécifie un argument.

Exemple :

php artisan my:test argument1 --option1

Et dans la signature cela se traduit par :

protected $signature = 'my:test {argument1} {--option1}';

Pour récupérer :

  • Un argument : $this->argument(‘arg_name’);
  • Une option : $this->option(‘option_name’);

Exemple :

$this->option("option1");

Ceci renverra true si on spécifie l’option lors de l’appel de la commande, sinon false.

Évidemment on peut modifier la signature pour accepter des valeurs alphanumériques dans l’option. Dans ce cas, on doit adapter la signature en indiquant plutôt {option1=}.

On aura un appel similaire à ceci :

php artisan my:test argument1 --option1=TEST

Afficher des messages dans le terminal

Il existe deux méthodes que vous pouvez utiliser pour afficher une information ou une erreur.

  • $this->info(‘texte’);
  • $this->error(‘texte’);

Documentation

[Java] Trucs et astuces pour Websphere et Eclipse

[Java] Trucs et astuces pour Websphere et Eclipse

Si vous utilisez l’IDE Eclipse au quotidien et le serveur IBM Websphere dans sa version 9 ou plus, voici quelques petits trucs et astuces pour vous aider dans vos tâches de développement.

Trucs et astuces pour Websphere et Eclipse

Désactiver l’auto-publish

Lorsqu’on se trouve dans Eclipse, et qu’on effectue un build du projet, l’action de publication – ou publish – du projet est réalisée automatiquement et ce même en mode debug du serveur de test. Cependant on peut modifier ce comportement grâce à l’astuce suivante.

  • Rendez-vous dans l’onglet Servers.
  • Double-cliquez sur le serveur WebSphere Application Server vX.Y.
  • Déroulez la catégorie Publishing.
  • Cochez l’option Never publish automatically.
  • Dans la barre d’outils de l’IDE, cliquez sur le bouton Enregistrer.

Lancer en mode debug

Ce mode du serveur est particulièrement utile afin que les modifications des actions et JSP soient immédiatement prises en compte. Et ce sans effectuer l’action de publication.

  • Rendez-vous dans l’onglet Servers.
  • Effectuez un clic droit sur votre serveur WebSphere.
  • Choisir Debug / Restart in Debug.

Publication d’applications en erreur

Par défaut il est impossible de publier une application avec du code en erreur.

Pour résoudre cela:

  • Dans Eclipse, allez dans le menu Window > Preferences.
  • Recherchez le bon paramètre avec le mot clé « Websphere ».
  • Déroulez la catégorie Server, sélectionner Websphere Application Server.
  • Cochez « Allow applications containing errors to be published on a server« .
  • Sauvegardez.

Supprimer la compilation des JSP

Quels sont les symptômes ? Par exemple, si vous renommez une classe de Tag Java, la JSP référencera l’ancien nom même après un publish. Ou encore, certains éléments de la page (ex : une variable statique) ont une valeur différente de celle définie dans le code.

Dès lors, si vous avez vidé le cache du navigateur et que cela persiste, c’est peut-être dû au cache de compilation des JSP géré par Websphere.

Sur votre PC ouvrez le répertoire des fichiers temporaires de votre serveur.

\WebSphere\AppServer_v9.0\profiles\AppSrv01\temp\TestNode01\server1

Supprimez le contenu du dossier. Lors du prochain rafraichissement des pages concernées par le problème, vous devriez obtenir le résultat escompté.

Supprimer les fichiers temporaires

De manière générale, lorsqu’on rencontre un problème avec Websphere, on peut nettoyer les fichiers temporaires générés dans les dossiers suivants. Il est préférable d’arrêter le serveur pour effectuer l’opération.

\WebSphere\AppServer_v9.0\profiles\AppSrv01\temp\TestNode01\server1
\WebSphere\AppServer_v9.0\profiles\AppSrv01\temp\wscache
\WebSphere\AppServer_v9.0\profiles\AppSrv01\wstemp


Ressources