Présentation
Thibaut ARRIBE - tha@kelis.fr
Objectifs : Nouveautés Scenari 6.3
Exécutable client en ligne de commande pour l'administration système
Bibliothèque Python pour l'administration système
API pour scripter des appels vers un serveur Scenari
Un exécutable pour l'administration système
De quoi parle-t-on ?
Un nouvel exécutable en ligne de commande
Objectif :
remplacer SCENARIbatch
backup-pre.sh
backup-post.sh
enrichir les actions disponibles en ligne de commande pour un administrateur système
Principes
Un produit Scenari correspond à un exécutable
Exécutable produit par Builder
URLs publiques (accès depuis le web) ou privées (accès local au serveur) pré-configurées dans l'exécutable
Installation
Récupération du package à l'issue d'un post build
Installation du package
pip install SCENARIsuite-starter_6.3.8nightly_python.tar.gz
Dépendances
Python 3.10 ou plus
Remarque : Comment gérer plusieurs versions de serveur ?
Les numéros de version majeure et medium font partie du nom du package.
Il est donc possible d'installer côte à côte :
scsuitestarter_6_3
scsuitestarter_6_4
...
Toutes les versions mineures d'un serveur Scenari sont compatibles avec la dernière version de l’exécutable.
Utilisation
[executable] [commande] [arguments] [conf] [-v]
- [executable] : Le nom de votre exécutable. Il est de forme codeserveur_x_x
- [commande] : Voir la liste des commandes disponibles ci-après.
- [arguments] : Certaines commandes acceptent des arguments. Consulter leur documentation ci-après
- [conf] : paramètres de la configuration du serveur. Valeurs possibles :
-u [login] ou --user [login] : surchage du nom de l'utilisateur
-p [password] ou --password [password] : surchage du mot de passe
-c [./maconf.json] ou --conf [./maconf.json] : surchage de la conf du portail
-l ou --local : chargement de la conf système pour un usage depuis le serveur hébergeant le portail Scenari
- [-v] : ajouter -v ou --verbose [level] pour rendre l'executable plus bavard. Valeurs de level possibles :
-v debug : tous les logs de niveau debug
-v info : tous les logs de niveau info (une ligne de log par appel réussi)
-v warning : tous les logs de niveau warning
-v error : tous les logs de niveau erreur (valeur par défaut). Les logs d'erreur sont également loggué dans le flux stderr.
-v none : désactive les logs d'erreur sur la sortie standard (les erreurs restent publiées sur le flux stderr).
-v : équivalent à -v info.
Authentification
Option 1 : passage du user et mot de passe dans la commande
scsuitestarter_6_3 ping -u system -p monPassWord
scsuitestarter_6_3 ping --user system --password monPassWord
Option 2 : externalisation de l'auth dans un fichier
scsuitestarter_6_3 ping -c maconf.json
scsuitestarter_6_3 ping --conf maconf.json
Avec conf.json :
{
"user":"system",
"password":"monPassWord"
}
Appels local ou distant
Par défaut les appels utilisent les URLs publiques
scsuitestarter_6_3 ping -l -c maconf.json
scsuitestarter_6_3 ping --localhost -c maconf.json
Exemples de commandes possibles
help
ping
backup_pre, backup_post
backupinplace_pre, backupinplace_post
odb_checkauto
store_gc
actlogs_purge
...
Lister les commandes disponibles
scsuitestarter_6_3 -h
Liste des commandes disponibles :
backup_post
Cette commande informe les portlets chain qu'il est à nouveau possible de supprimer des blobs du disque.
Cette commande se termine par des appels de purge de données obsolètes et de controle de cohérence (ces appels peuvent être désactivés en utilisant la l'argument --strict)
Argument(s):
--strict : à utiliser pour désactiver les purges de données et contrôle de cohérence en fin d'execution
--portlet [chain] : à utiliser pour appeler le service sur un unique portlet. Par défaut, la commande s'applique à tous les portlets chain et depot du portail.
backup_pre
Copie les fichier de la db interne et vérouille la suppression des blobs pour les portlets chains, elle copie un ensemble cohérent des données dans un répertoire de
backup pour les portlets depot.
Argument(s):
--portlet [chain] : à utiliser pour appeler le service sur un unique portlet. Par défaut, la commande s'applique à tous les portlets chain et depot du portail.
backupinplace_post
Cette commande est à appeler après un backup du répertoire data par "snapshot". Elle indique aux différents portlets qu'ils peuvent réouvrir les accès en ecriture.
Cette commande se termine par des appels de purge de données obsolètes et de controle de cohérence (ces appels peuvent être désactivés en utilisant la l'argument --strict)
Argument(s):
--strict : à utiliser pour désactiver les purges de données et contrôle de cohérence en fin d'execution
--portlet [chain] : à utiliser pour appeler le service sur un unique portlet. Par défaut, la commande s'applique à tous les portlets du portail ayant un service backupinplace.
backupinplace_pre
Cette commande prépare chaque portlet à un backup rapide de type "snapshot". Les données en ram sont sérialisées sur disque pour permettre un backup cohérent. Après
appel de ce service, le répertoire data du portail peut être backupé par snapshot. Le portail est accessible en lecture seule entre les appels de backupinplace_pre et backupinplace_post
Argument(s):
--portlet [chain] : à utiliser pour appeler le service sur un unique portlet. Par défaut, la commande s'applique à tous les portlets du portail ayant un service backupinplace.
help
Affiche cette page d'aide
odb_checkauto
Lance un test de cohérence de la base de données interne.
Argument:
--portlet [chain] : à utiliser pour appeler le service sur un unique portlet. Par défaut, la commande s'applique à tous les portlets du portail ayant une base de données interne.
odb_rebuild
Lance une renconstruction de la base de données interne.
Argument:
--portlet [chain] : à utiliser pour appeler le service sur un unique portlet. Par défaut, la commande s'applique à tous les portlets du portail ayant une base de données interne.
ping
Effectue une requête de ping d'un portlet du portail. Cette commande permet de tester l'URL, les logins et mots de passe.
Argument:
--portlet [chain] : à utiliser pour appeler le service sur un unique portlet. Par défaut, la commande s'applique à tous les portlets du portail.
print_conf
Cette commande permet d'afficher le contenu (simplifié avec les URLs uniquement ou complet) de la configuration chargée par l'exécutable. Elle permet de
de récupérer cette configuration pour la modifier (changement d'URL, ajout d'un portlet...)
Argument(s):
--full : à utiliser pour afficher la configuration complète (par défaut, elle ne contient que les URLs vers les portlets).
store_gc
Lance le garbage collector d'un store (stockage de documents d'un depot).
Argument:
--portlet [depot] : à utiliser pour appeler le service sur un unique portlet. Par défaut, la commande s'applique à tous les portlets du portail ayant un store.
Exemple de script bash de backup
#!/bin/bash
# Lancement du backup sur tous les portlets
scsuitestarter_6_3 backup_pre -c maconf.json
# TODO - ajouter ici mes actions de backup scriptées
# Cloture du mode backup sur tous les portlets
scsuitestarter_6_3 backup_post -c maconf.json
Remarque : Changement de posture des actions de backup
Les commandes backup_pre et backup_post sont plus complètes que celles existantes dans SCENARIbatch :
Action de contrôle des bases de données
Action de purge des fichiers stockés sur disque par un depot
...
Attention : Comment gérer plusieurs serveurs dans la même version ?
Pour changer les URLs d'appels, il est possible de demander à l'exécutable de produire un fichier de configuration personnalisable
scsuitestarter_6_3 print_conf -c maconf.json
Exemple de retour :
{
'portlets': {
'chain': {'url': 'https://suite-starter.mondomain.fr/~~chain'},
'depot': {'url': 'https://suite-starter.mondomain.fr/~~write'}
}
}
Ce fichier peut être édité (URL changés, login et mot de passe ajoutés) et appelé avec le paramètre -c de l'exécutable.
Une librairie Python pour créer ses propres scripts d'administration
Il s'agit du même package Python qui s'utilise directement depuis un script Python
Toutes les fonctions de l'exécutable sont réputées de niveau API.
Instanciation d'un objet ScPortal
import scsuitestarter_6_3.portal
# system_conf permet de charger les URLs système au lieu des URLs publique (False par défaut)
# overridden_conf_file permet de référencer un fichier de conf (None par défaut)
# override_props permet de surcharger la conf par défaut et celle du fichier passé en paramètre.
monserver= scsuitestarter_6_3.portal.new_portal(system_conf=False, overridden_conf_file="maconf.json", override_props={"user":"admin"})
Exemple de script de backup
import scsuitestarter_6_3.portal
monserver= scsuitestarter_6_3.portal.new_portal(system_conf=False, overridden_conf_file="maconf.json")
# Ping pour vérifier l'accès au serveur sans déclencher de backup
monserver.ping()
# Lancement du backup sur tous les portlets
monserver.backup_pre()
# TODO - ajouter ici mes actions de backup scriptées
# Cloture du mode backup sur tous les portlets
monserver.backup_post()
Une API pour scripter des appels à un serveur Scenari
De quoi parle-t-on ?
Une API complémentaire à l'exécutable
La plus stable et générique possible
Distribuée via pypi
Installation
pip install scenaripy-api
Exemples d'action
Créer un utilisateur ou groupe
Lui donner des permissions sur un serveur, un atelier, un espace
Faire une recherche dans un atelier
Télécharger ou uploader des items
Créer ou administrer des ateliers
Lancer une génération et télécharger son résultat
Envoyer des contenus sur un depot
...
Exemple : Création d'un groupe et d'un user et association de rôle à un atelier
import scsuitestarter_6_3.portal
import scenaripy_api
monserver= scsuitestarter_6_3.portal.new_portal(system_conf=False, overridden_conf_file="maconf.json")
#Creation d'un group
scenaripy_api.create_or_update_group(monserver, account="group1", roles=["main:reader"])
#Creation d'un user associé à ce group
scenaripy_api.create_or_update_user(monserver, account="monUser", first_name="Mon", last_name="User", groups=["group1"])
#Association d'un role à ce groupe sur un atelier
wsp = scenaripy_api.search_wsp_code(monserver, title="Mon atelier")
scenaripy_api.set_granted_roles(monserver, account="group1", wsp_code=wsp, granted_roles=["main:author"])
Exemple : Création d'un atelier
import scsuitestarter_6_3.portal
import scenaripy_api
monserver= scsuitestarter_6_3.portal.new_portal(system_conf=False, overridden_conf_file="maconf.json")
# Création ou mise à jour d'un atelier avec la dernière version d'Opale installée sur le serveur et l'extension Emeraude.
scenaripy_api.create_or_update_wsp(monserver, wsp_type_key="Opale", wsp_type_options=[{"wsp_type_key":"OpaleExtEmeraude"}], title="Mon atelier Opale", alias="opale")
# Création ou mise à jour d'un atelier avec la dernière version d'Opale 5 installée sur le serveur sans extension.
scenaripy_api.create_or_update_wsp(monserver, wsp_type_key="Opale", wsp_type_version="5", title="Mon atelier Opale", alias="opale")
# Création d'un atelier brouillon
scenaripy_api.create_or_update_wsp(monserver, wsp_type_key="Opale", alias="testDrf", wsp_drf_ref="opale", drf_title="Mon atelier brouillon")
# Création d'un atelier dérivé
scenaripy_api.create_or_update_wsp(monserver, wsp_type_key="Opale", alias="testDrv", wsp_drv_master="opale", drv_axis="fc")
# Création d'un second atelier dérivé dont le chemin de dérication passe par le premier avant d'aller sur le master
scenaripy_api.create_or_update_wsp(monserver, wsp_type_key="Opale", alias="testDrv2", wsp_drv_master="opale", drv_axis="alternance", drv_axis_path=["fc"])
Exemple : Recherche d'un item, génération et téléchargement d'une publication
import xml.etree.ElementTree as ET
import scsuitestarter_6_3.portal as portal
import scenaripy_api
server = portal.new_portal(system_conf=False, overridden_conf_file="conf.json")
# Namespace Scenari et d'Opale pour la serialisation
namespace = {
"sc": "http://www.utc.fr/ics/scenari/v3/core",
"sp": " http://www.utc.fr/ics/scenari/v3/primitive",
"op": "utc.fr:ics/opale3"
}
wsp_code = scenaripy_api.search_wsp_code(server, title_fragment="Correction")
# Récupération de l'item et transformation en un objet Python ElementTree
item = ET.fromstring(scenaripy_api.wsp_get_item(server, wsp_code=wsp_code, ref_uri="/Module_demo/_Module-LeThe.xml"))
# Recherche et édition du titre
title = item.find(".//op:title/sc:para", namespace)
title.text = "Décourir le thé - titre modifié par Python"
# Enregistrement des namespaces pour la serialisation de l'item.
for ns in namespace:
ET.register_namespace(ns, namespace[ns])
# Upload de l'item
scenaripy_api.wsp_set_item(server, wsp_code=wsp_code, ref_uri="/Module_demo/_Module-LeThe.xml", item=ET.tostring(item, "UTF-8"))
Documentation intégrée (docstring Python)
Documentation à venir sur scenari.software
Des questions ?