Create a CLI application.fr_FR - gd-99/symbiogd GitHub Wiki

Vous pouvez créer une application en ligne de commande soit en Javascript soit en PHP. Il est cependant conseillé d'utiliser Javascript tant que possible pour des raisons de sécurité.

En PHP

Attention ! Il faut être particulièrement vigilant lors de la création d'applications en PHP. En effet, tout utilisateur (connecté ou non) peut exécuter des commandes, il faudra bien veiller à vérifier leurs autorisations si des modifications sont apportées au système.

Hello World!

Pour créer une application en ligne de commande écrite en PHP, il suffit de créer une fichier /usr/bin/myapp.php.

Dans ce fichier, écrivez simplement le code de votre commande. Voici une implémentation de Hello World! :

/usr/bin/hello-world.php

<?php
echo 'Hello World!';

Pour exécuter cette commande, tapez hello-world dans le terminal (nom du fichier sans l'extension).

Sécurité

Il est très important de tenir compte de la sécurité lorsque l'on crée des applications PHP. En effet, n'importe qui peut exécuter des commandes. Dans le cas d'un script PHP, la tâche de vérifier si l'utilisateur a le droit ou non d'effectuer une action (supprimer des fichiers, en créer, ajouter un utilisateur, etc...) est laissée au script. Cela signifie que vous devez effectuer des vérifications sur les droits de l'utilisateur quand vous créez un script PHP.

Voici comment vérifier si l'utilisateur a le droit d'effectuer une action. Ici, on vérifie si l'utilisateur a le droit d'écrire dans le dossier / (racine du webos).

<?php
$authManager = $this->managers()->getManagerOf('authorization'); //On récupère le gestionnaire des autorisations
$pid = $this->cmd['id']; //On récupère l'id du processus actuel
$processAuths = $authManager->getByPid($pid); //On récupère les autorisations du processus

//Contrôle des autorisations
//On vérifie que l'utilisateur a les droits "file.write" sur le dossier "/"
$this->guardian->controlArgAuth('file.write', '/', $processAuths);

//Autre exemple : on vérifie que l'utilisateur peut lister les autres utilisateurs et lire leurs caractéristiques (nom, e-mail, etc...)
$this->guardian->controlAuth('user.read', $processAuths);

Bibliothèque

Pour la plupart des actions à effectuer, vous pourrez utiliser la bibliothèque PHP existante. Par exemple, pour gérer les fichiers, utilisez le gestionnaire de fichiers. Voici l'exemple de la commande cat qui permet d'afficher le contenu d'un fichier : /usr/bin/cat.php.

N'hésitez pas à consulter le code des commandes existantes dans le dossier /usr/bin.

En Javascript

Comme pour une application PHP, il faut créer un fichier /usr/bin/myapp.js. Contrairement aux scripts PHP, il n'y aura pas de problèmes au niveau de la sécurité.

Pour afficher du texte, voici comment procéder :

var terminal = this.getTerminal(); //On récupère l'objet correspondant au terminal
//En effet, la variable "this" correspond à la commande actuellement en cours d'exécution

terminal.echo('Hello World!'); //On affiche le texte voulu

this.stop(); //On arrête le script pour redonner la main à l'utilisateur

Pour voir le résultat, une fois encore tapez le nom du fichier dans le terminal (sans l'extension).

Bibliothèque

Vous devrez utiliser la bibliothèque Javascript pour communiquer avec le serveur.

Par exemple, voici la commande cat :

var that = this; //On crée une copie de la variable "this" pour y accéder plus tard
//Rappel : this correspond au processus courant

var terminal = this.getTerminal(), args = this.getArguments();

var filename = args.getParam(0); //On récupère le premier argument
var currentWorkingDir = terminal.get('location'); //On récupère le dossier courant
var filepath = terminal.absolutePath(filename); //On détermine le chemin du fichier

var file = Webos.File.get(filepath); //On récupère l'objet correspondant au fichier à l'aide de la bibliothèque
file.readAsText([function(contents) { //Si tout s'est bien passé lors de la lecture
   terminal.echo(contents); //On affiche le contenu du fichier
   this.stop(); //On arrête le script pour redonner la main à l'utilisateur
}, function(response) { //S'il y a eut une erreur
   terminal.echo(response.getAllChannels()); //On affiche l'erreur
   this.stop(); //On arrête le script pour redonner la main à l'utilisateur
}]);
⚠️ **GitHub.com Fallback** ⚠️