Un formulaire web pour lancer vos scripts bash et powershell
Tags: bash, powershell, devops, sysadmin
Published: 2024-03-17 11:03:33

A quoi bon passer par une interface web pour lancer des scripts lorsque vous êtes un pro du terminal ?

Et bien entre autres:

- Pour déléguer aux utilisateurs métiers l'exécution de certains scripts de manière sécurisée, en limitant les options disponibles afin de prévenir toute mauvaise surprise et en gardant l'historique des exécutions:
  ![Générer et envoyer un rapport des ventes](https://pelle.link/fr/un-formulaire-web-pour-lancer-vos-scripts-bash-et-powershell/reporting-execute.png)
  *Exemple: Générer un rapport pour une plage de dates donnée et l'envoyer par mail*

- Ou pour exécuter facilement des tâches prédéfinies en cas d'urgence (un terminal n'est pas toujours à portée de main, contrairement à un smartphone):
  ![Etat d'un service](https://pelle.link/fr/un-formulaire-web-pour-lancer-vos-scripts-bash-et-powershell/service-execute.png)
  *Exemple: Connaitre l’état ou redémarrer / arrêter un service linux*

Je vous propose de répondre à ces 2 cas d'usage via l'utilisation des *tâches paramétrables* qui viennent d'être ajoutées dans la [dernière release de Ctfreak](https://ctfreak.com/docs/changelog#v1-14-0).

## Prérequis

Il nous faut:

- Un serveur Unix: Linux, Mac OS X, FreeBSD, ... (voir [en fin d'article](#lancer-des-scripts-powershell-plut%C3%B4t-que-bash) pour adapter à un serveur Windows) accessible via SSH où seront exécutés vos scripts. Nous le nommerons *scriptsrv*.

- Une instance de [Ctfreak](https://ctfreak.com) avec un compte administrateur (la *Free Edition* suffira si vous adaptez les exemples de cet article en vous limitant à un paramètre par tâche).

## Configuration du serveur *scriptsrv*

Connectez vous à votre instance Ctfreak avec un compte administrateur.

Commencez par ajouter la clef SSH permettant de se connecter au serveur via *SSH Credential* → *New SSH Credential*:

![Ajout de la clef SSH](https://pelle.link/fr/un-formulaire-web-pour-lancer-vos-scripts-bash-et-powershell/credential.png)

Puis ajoutez le serveur en lui même via *Nodes* → *Internal Nodes* → *New node*:

![Ajout du serveur](https://pelle.link/fr/un-formulaire-web-pour-lancer-vos-scripts-bash-et-powershell/node.png)

Vérifiez que la clef *SSH Key for scriptsrv* est bien sélectionnée comme *Credential*, puis validez pour créer le node *scriptsrv*.

Ctfreak peut désormais de connecter au serveur avec la clef SSH spécifiée pour y exécuter différentes tâches.

## 1er cas: Générer un rapport pour une plage de dates donnée et l'envoyer par mail

Pour notre exemple, nous allons partir du principe que vous disposez sur le serveur *scriptsrv* d'un exécutable `generatereport` permettant de générer et d'envoyer par mail un rapport des ventes pour une *période*, un *destinataire* et un *format* donné. Si nous devions lancer cet exécutable directement dans un terminal, cela pourrait donner quelque chose comme:

```bash
generatereport --from 2024-03-04 --to 2024-03-10 --recipient nigel@mycompany.zzz --format pdf
```

Nous allons donc créer dans Ctfreak une tâche qui lors de son exécution génèrera à la volée un formulaire web permettant de renseigner ces 4 paramètres avant de lancer l'exécutable `generatereport`.

### Création du projet *Reporting*

Pour commencer, créons un projet dédié aux tâches de reporting.

Allez dans *Projects* → *New Project*

![Création du projet](https://pelle.link/fr/un-formulaire-web-pour-lancer-vos-scripts-bash-et-powershell/reporting-project.png)

Validez pour créer le projet.

### Création de la tâche *Generate and send sales report*

Allez dans *Projects* → *Reporting* → *New task*

![Sélection du type de tâche](https://pelle.link/fr/un-formulaire-web-pour-lancer-vos-scripts-bash-et-powershell/task-type-selector.png)

Choisissez *Bash Script* comme type de tâche.

![Nouveau script bash](https://pelle.link/fr/un-formulaire-web-pour-lancer-vos-scripts-bash-et-powershell/reporting-task.png)

Renseignez comme indiqué les champs *Name*, *Script* et *Node filter*.

Dans le contenu de notre script, les 4 valeurs attendues sont renseignées via des variables d'environnement, toutes préfixées par `CTP_`:

```bash
#!/bin/bash
generatereport --from $CTP_FROM --to $CTP_TO --recipient $CTP_RECIPIENT --format $CTP_FORMAT
```

Ces variables correspondent aux paramètres que nous allons créer en cliquant sur le bouton *Add parameter*.

Commençons par les dates de début et de fin de notre période:

![Dates de début et de fin](https://pelle.link/fr/un-formulaire-web-pour-lancer-vos-scripts-bash-et-powershell/reporting-task-parameters-1.png)

- Le type de paramètre *Date* permet de s'assurer qu'une date valide sera saisie dans notre formulaire d'exécution.

- Le champ *Default date type* permet de prendre la semaine précédente comme période par défaut.

- Le champs *Name* sera utilisé pour définir le nom de la variable d'environnement (`CTP_FROM` dans notre script fait donc référence au paramètre nommé `FROM`).

- Lorsque le champ *Label* est renseigné, il remplace le champ *Name* pour faire référence à la variable lors de la génération du formulaire d'exécution.

- Lors de l'exécution de la tâche, la date saisie sera convertie au format `YYYY-MM-DD` pour alimenter la variable d'environnement correspondante.

En ce qui concerne les mails des destinataires autorisés à recevoir le rapport, nous limiterons les choix possibles à 2 mails via le type de paramètre *Selector*:

![Destinataire](https://pelle.link/fr/un-formulaire-web-pour-lancer-vos-scripts-bash-et-powershell/reporting-task-parameters-2.png)

Pour chaque option, le champs *Label* lorsqu'il est renseigné se substitue à *Value* lors de la génération du formulaire d'exécution. Nous aurions pu l'utiliser ici pour afficher `Nigel` et `John` dans le formulaire au lieu de leurs emails respectifs.

Pour terminer, un dernier paramètre de type *Selector* permettra de choisir le format du fichier généré (ici PDF ou Excel, mais c'est bien `pdf` ou `xlsx` qui sera transmis à notre script):

![Format](https://pelle.link/fr/un-formulaire-web-pour-lancer-vos-scripts-bash-et-powershell/reporting-task-parameters-3.png)

Toutes les informations nécessaires étant renseignées, il ne reste plus qu'à valider pour créer la tâche.

### Exécution de la tâche

Allez dans *Projects* → *Reporting* → *Generate and send sales report* → *Execute* pour faire apparaitre le formulaire d'exécution.

![Générer et envoyer un rapport des ventes](https://pelle.link/fr/un-formulaire-web-pour-lancer-vos-scripts-bash-et-powershell/reporting-execute.png)

Comme vous pouvez le constater, nos 4 paramètres sont bien pris en compte dans la génération du formulaire.

### Ajout d'un utilisateur métier

Notre tâche étant opérationnelle, reste à donner la main à un utilisateur métier afin qu'il puisse l'exécuter.

Allez dans *Users* → *New User*

![Création d'un utilisateur](https://pelle.link/fr/un-formulaire-web-pour-lancer-vos-scripts-bash-et-powershell/reporting-user.png)

Validez pour créer l'utilisateur.

De base, un utilisateur non-admin n'a accès à rien (mis à part se connecter), il faut donc lui ajouter les droits nécessaires.

Allez dans *Projects* → *Reporting* → *Access* → *Edit*

Ajouter Jack en lui donnant le rôle *Executor*.

![Accès au projet](https://pelle.link/fr/un-formulaire-web-pour-lancer-vos-scripts-bash-et-powershell/reporting-access.png)

Jack a désormais accès au projet *Reporting*, mais **uniquement** pour exécuter les tâches qu'il contient.

## 2ème cas: Connaitre l’état ou redémarrer / arrêter un service linux

### Création du projet *Sysadmin*

Créons un projet dédié aux tâches d'administration système.

Allez dans *Projects* → *New Project*

![Création du projet](https://pelle.link/fr/un-formulaire-web-pour-lancer-vos-scripts-bash-et-powershell/service-project.png)

Validez pour créer le projet.

### Création de la tâche *Systemctl*

Allez dans *Projects* → *Sysadmin* → *New task* et comme pour notre cas précédent choisissez *Bash Script* comme type de tâche.

![Nouveau script bash](https://pelle.link/fr/un-formulaire-web-pour-lancer-vos-scripts-bash-et-powershell/service-task.png)

Renseignez comme indiqué les champs *Name*, *Script* et *Node filter*.

Cliquez sur le bouton *Add parameter* pour ajouter la liste des services concernés (ici Postgresql et Apache)

![Service](https://pelle.link/fr/un-formulaire-web-pour-lancer-vos-scripts-bash-et-powershell/service-task-parameters-1.png)

Ainsi que les commandes pour connaitre l’état, redémarrer ou arrêter le service.

![Commande](https://pelle.link/fr/un-formulaire-web-pour-lancer-vos-scripts-bash-et-powershell/service-task-parameters-2.png)

Validez pour créer la tâche.

### Exécution de la tâche

Allez dans *Projects* → *Sysadmin* → *Systemctl* → *Execute* pour faire apparaitre le formulaire d'exécution.

![Etat d'un service](https://pelle.link/fr/un-formulaire-web-pour-lancer-vos-scripts-bash-et-powershell/service-execute.png)

Exécutez la tâche et consultez les logs en cliquant sur l’icône en forme d’œil.

![Logs](https://pelle.link/fr/un-formulaire-web-pour-lancer-vos-scripts-bash-et-powershell/service-log.png)

## Lancer des scripts Powershell plutôt que Bash

Si votre serveur *scriptsrv* est sous Windows, il suffit de faire quelques ajustements pour lancer des scripts *Powershell* plutôt que *Bash*:

- [Activez le serveur SSH interne](https://ctfreak.com/docs/nodes/windows) de Windows.
- Lors de la création du node *scriptsrv*, définissez la propriété *OS Family* à `Windows` plutôt que `Unix`.
- Créez des tâches de type *Powershell Script* au lieu de *Bash Script* et écrivez le contenu de vos scripts en Powershell plutôt que Bash.

Le principe d'injection des paramètres sous forme de variables d'environnement reste exactement le même. Si nous adaptions le script de notre premier cas, cela donnerait:

```powershell
generatereport --from $env:CTP_FROM --to $env:CTP_TO --recipient $env:CTP_RECIPIENT --format $env:CTP_FORMAT
```

## Pour finir

Comme vous l'aurez constaté, le simple fait d'apposer une interface web sur un script offre beaucoup de possibilités.

Commencez par adapter les exemples présentés dans cet article à vos besoins, ils vous permettrons déjà d'offrir une plus grande autonomie à vos utilisateurs.