IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Création d'un système de plugins en python [Python 3.X]


Sujet :

Python

  1. #1
    Membre averti Avatar de shell13010
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2008
    Messages : 281
    Points : 314
    Points
    314
    Par défaut Création d'un système de plugins en python
    Bonjour tout le monde,

    J'ai pour projet de créer un système de plugins pour une simple application, mais les exemples,tutoriel "reprenez moi si je me trompe" en python sur se type de structure ne cours pas les rues?

    Auriez-vous des exemples, Livres ou autre qui traite se sujet? , car j'ai trouver un très bon article Création d'un système de plugins en java mais malheureusement il est en java.
    "Quelle prétention de prétendre que l'informatique est récente: Adam et Eve avaient déjà un Apple!"

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 235
    Points : 36 684
    Points
    36 684
    Par défaut
    Salut,

    Citation Envoyé par shell13010 Voir le message
    J'ai pour projet de créer un système de plugins pour une simple application, mais les exemples,tutoriel "reprenez moi si je me trompe" en python sur se type de structure ne cours pas les rues?
    Réaliser un système de pluggins avec Python est si simple qu'une recherche avec votre moteur favoris sur les mots clés "python pluggins" devrait vous donner l'embarras du choix.
    Pourquoi n'y trouvez vous pas votre bonheur?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti Avatar de shell13010
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2008
    Messages : 281
    Points : 314
    Points
    314
    Par défaut
    Salut wiztricks,

    Merci du retour,

    le soucis c'est que j'aurais aimer analysé une structure de base d'un système de plugins avec la gestion des données pour sécurisé l'application principal.

    j'ai trouver quelque exemple intéressant, mais je ne comprend pas comment on peux gérer les données d'un plugins et vérifié qu'il ne fasse pas n'importe quoi,

    étant donner que c'est la première fois que je souhaite créer un système de se type, il y a des points que je chercher a approfondir.
    "Quelle prétention de prétendre que l'informatique est récente: Adam et Eve avaient déjà un Apple!"

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 235
    Points : 36 684
    Points
    36 684
    Par défaut
    Salut,

    Citation Envoyé par shell13010 Voir le message
    mais je ne comprend pas comment on peux gérer les données d'un plugins et vérifié qu'il ne fasse pas n'importe quoi
    Je ne comprend pas ce que vous entendez par "gérer les données d'un plugins". Un exemple peut être?
    Pour le reste, a partir du moment ou un "plugins" peut être écrit pas un utilisateur lambda, il peut faire n'importe quoi.
    Comme "n'importe quoi" est assez ouvert, il faut préciser ce que vous ne voulez pas et évaluer les contre-mesures à mettre en face.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti Avatar de shell13010
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2008
    Messages : 281
    Points : 314
    Points
    314
    Par défaut
    Salut,

    Voilà une image tirer d'un article d'une structure complète d'un système de plugins en java (encore):

    Nom : runPlugins.jpg
Affichages : 499
Taille : 17,2 Ko

    Lien de l'article : http://www.javaranch.com/journal/200607/Plugins.html

    la plupart des articles et exemple que j'ai lus c'est dernier jours ne traite pas se sujet(securité), voilà en résumer le schéma d'un système de plugins en python d'après mes recherches:

    Nom : Sans titre-2.jpg
Affichages : 485
Taille : 40,0 Ko

    J'aimerais savoir comment je pourrais produire un système similaire en python comme cité plus haut, mais bizarrement j'ai trouver aucun exemple concret ou la plupart des tutoriels sur se sujet ne parle jamais de sécurité avec python

    Ou peut-être que je suis complétement dans le flou et que je suis partie dans un délire bizarre?
    "Quelle prétention de prétendre que l'informatique est récente: Adam et Eve avaient déjà un Apple!"

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il est vrai qu'on a du mal à trouver des principes généraux sur les plugins en Python. En tout cas, même si on trouve des sites qui en parle, le mot "plugin" n'existe pas dans la doc officielle.

    Mais c'est un sujet intéressant! Voilà quelques idées.

    Qu'est-ce c'est qu'un plugin? C'est un module réalisé après coup et (éventuellement) par quelqu'un d'autre, qu'on ajoute si nécessaire à un programme pour lui donner des fonctionnalités supplémentaires.

    Il faut, bien entendu:
    1- que le programme ait été conçu dès l'origine pour recevoir de tels plugins
    2- que les plugins ajoutés soient construits en respectant des spécifications précises pour pouvoir être intégrés dans le programme.

    Prenons un exemple simplifié: on va faire une calculatrice à laquelle on va pouvoir ajouter sous forme de plugins des fonctions supplémentaires.

    On va considérer que tous les plugins se trouvent dans le répertoire "plugins". Ainsi, l'installation d'un nouveau plugin consistera tout simplement à le recopier dans le répertoire "plugins".

    Voilà un plugin appelé "arithmetique.py" dans lequel on va placer 2 fonctions: fact(n) = factorielle de n, et rack(n, k=2) = racine kième entière de n. On met ce fichier dans le répertoire "plugins".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 3
     
    __all__ = ["fact", "rack"] # <== on place ici toutes les fonctions conçues pour être importées
     
    #############################################################################
    def fact(n):
        """fact(n): calcule la factorielle de n (entier >= 0)"""
        x = 1
        for i in range(2, n + 1):
            x *= i
        return x
     
    #############################################################################
    def rack(n, k=2):
        """Racine kième entière d'un nb entier n
           (généralisation de la méthode de Heron d'Alexandrie)
           génère une exception si n<0 et k paire
        """
        # traitement des nb négatifs ou nuls
        if n < 1:
            if n == 0:
                return 0
            if k % 2 == 0:
                raise ValueError("Erreur: racine kième (k paire) d'un nombre négatif ")
            signe, n = -1, -n
        else:
            signe = 1
        # calcul d'une valeur approchée de la racine (important pour les grands nombres)
        rac1, p = 1, 1
        while p <= n:
            rac1 <<= 1
            p <<= k
        rac1 >>= 1
        # calcul de la racine en partant de la racine approchée r1
        km1 = k - 1
        while True:
            rac2 = (km1 * rac1 + n // rac1 ** km1) // k
            if rac2 == rac1:
                return signe * rac2
            rac1 = rac2
    Voilà maintenant la calculatrice: au lancement, elle va chercher les fichiers python du sous-répertoire plugins, et va les importer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 3
     
    import sys, os
    import glob
    from math import *
     
    #############################################################################
    def calculatrice():
        """boucle "read-eval-print" de la calculatrice"""
        while True:
            expression = input("=>").strip()
            if expression == "":
                continue
            if expression.upper() == "QUIT":
                break
            try:
                valeur = eval(expression)
            except Exception as msgerr:
                valeur = msgerr
            print(valeur)
     
    #############################################################################
    if __name__ == '__main__':
     
        # répertoire de la calculatrice
        repprog = os.path.dirname(os.path.abspath(__file__))
        # répertoire des plugins
        repplugins = os.path.join(repprog, "plugins")
        # liste des fichiers python du répertoire plugins
        listeplugins = glob.glob(os.path.join(repplugins, "*.py"))
     
        # importation des plugins
        for plugin in listeplugins:
            nommodule = os.path.splitext(os.path.split(plugin)[1])[0]
            if nommodule == "__init__":
                continue
            print("Importation du module:", nommodule)
            # importation (désolé: il faudra trouver mieux!!!)
            exec("from %s import *" % ("plugins." + nommodule,))
        print()
     
        # lancement de la calculatrice
        calculatrice()
     
        print("Fin")
    Et voilà!

    Quand on lance la calculatrice, elle trouve et importe les plugins trouvés, et lance la boucle "read-eval-print" de la calculatrice. Voilà un exemple d'utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Importation du module: arithmetique
     
    =>2+3
    5
    =>sin(0.5)
    0.479425538604203
    =>fact(50)
    30414093201713378043612608166064768844377641568960512000000000000
    =>rack(2*10**100)
    141421356237309504880168872420969807856967187537694
    =>quit
    Fin
    Il s'agit, bien entendu, d'un exemple simplifié: il faudrait prendre en compte les erreurs possibles, ainsi que la sécurité: il ne faudrait pas qu'un plugin défectueux (ou pirate) conduise à des fuites d'informations ou à des dégâts.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 235
    Points : 36 684
    Points
    36 684
    Par défaut
    Salut,

    La "Java VM" a la possibilité de remplacer l'environnement d'exploitation qui est dessous.
    Vous avez la possibilité de partager une JVM par plusieurs applications (via des serveurs d'application Java comme JBoss).
    L'environnement Java doit donc offrir les outils qui permettent de gérer cela et offrir aux développeurs les API Java ad hoc.

    Python n'a pas cette ambition!
    La sécurité d'accès reste celle héritée de l'OS et est accessible via des modules spécifiques qui masquent (ou pas) les différences.
    Chaque application Python tourne dans sa propre VM Python et l’étanchéité (la sécurité) entre les différentes applications est héritée de l'environnement d'exploitation.

    Il n'y a donc pas d'équivalent à java.lang.SecurityManager et ses fichiers "policy" associés.
    Mais ce genre de "features" n'existe pas en C/C++ sans nous empêcher d'écrire des "plugins".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre averti Avatar de shell13010
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2008
    Messages : 281
    Points : 314
    Points
    314
    Par défaut
    Salut,

    Merci pour vos retours,

    Citation Envoyé par tyrtamos Voir le message
    Il est vrai qu'on a du mal à trouver des principes généraux sur les plugins en Python. En tout cas, même si on trouve des sites qui en parle, le mot "plugin" n'existe pas dans la doc officielle.
    Exactement, Python étant une grande communauté, je ne penser pas du tout trouver aussi peu d'information sur les plugins et j'ai trouver ton exemple intéressant donc merci.

    Citation Envoyé par wiztricks;
    La sécurité d'accès reste celle héritée de l'OS et est accessible via des modules spécifiques qui masquent (ou pas) les différences.
    Chaque application Python tourne dans sa propre VM Python et l’étanchéité (la sécurité) entre les différentes applications est héritée de l'environnement d'exploitation.
    Je comprend mieux et je t'en remerci, mais imaginons un système de plugins de base:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import os
    import sys
     
    path = "plugins/"
    plugins = {}
     
    # Charger plugins
    sys.path.insert(0, path)
    for f in os.listdir(path):
        fname, ext = os.path.splitext(f)
        if ext == '.py':
            mod = __import__(fname)
            plugins[fname] = mod.Plugin()
    sys.path.pop(0)
     
    for plugin in plugins.values():
        plugin.run()

    Supposons qu'un utilisateur malveillant et créer un plugins qui execute bien sa fonction mais il voudrait exploiter des informations "sensible" qui pourrait être uploader dans un server tiers..

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import pwd,os
     
    class Plugin:
     
        def __init__(self):
            print "Un simple test"
     
        def run(self):
               #[Code de sa fonction principal...]
        	user_info = pwd.getpwnam(pwd.getpwuid(os.getuid())[0]) #récupère le nom de l'utilisateur actuel
    	print 'UID/GID 	:', user_info.pw_uid, '/', user_info.pw_gid  #récupère l'uid et group id
    	print 'Dossier Principal:', user_info.pw_dir                          #récupère le Dossier de l'utilisateur HOME
    	print 'Shell   	:', user_info.pw_shell
               #[upload vers server tiers....]

    Içi le plugins affiche juste les info de l'utilisateur contenu dans le /etc/passwd mais on aurait bien pu accéder a des fichiers plus bavard.

    Comment vous gérerez ça?

    Je penser a controler le plugins en refusant d'importer des modules spécifiques? je pense que c'est une mauvaise idée car sa limiterais le dev de plugins non?

    J'aimerais avoir votre avis la dessus.

    Citation Envoyé par tyrtamos Voir le message
    ainsi que la sécurité: il ne faudrait pas qu'un plugin défectueux (ou pirate) conduise à des fuites d'informations ou à des dégâts.
    Même si sa rejoins se que j'ai écrit ci-dessus, c'est exactement se que je cherche a savoir mais Comment feriez vous?
    "Quelle prétention de prétendre que l'informatique est récente: Adam et Eve avaient déjà un Apple!"

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 235
    Points : 36 684
    Points
    36 684
    Par défaut
    Salut,

    Citation Envoyé par shell13010 Voir le message
    Comment vous gérerez ça?
    Python n'est qu'un langage de script.
    Impossible d'empêcher un utilisateur malveillant de faire ce qu'il veut surtout via des plugins.
    Si vous voulez une sécurité forte et dormir tranquille, vous utiliserez un langage qui permet de "protéger" structures/classes/...

    more...
    La plupart des OS implémentent une fonctionnalité de "personna".
    Cela permet d'avoir une application "privilégiée" qui permettra à certains bouts de code (ex: les plugins) d'accéder aux ressources via un utilisateur lambda sans privilèges ou de tester si "lambda" à le droit de...
    Ces API sont "OS specifics". Elles sont requises pour obtenir une classification de sécurité intéressante et rendre l'OS utilisable dans des environnements "secure".

    C'est grâce à ce genre de fonctionnalités apportés par l'environnement d'exploitation qu'un pluggins écrit en C/C++ pourra offrir une sécurité raisonnable vis à vis des malveillants.
    Rien n'interdit d'utiliser ces fonctionnalités "système" depuis Python, mais si vous en avez vraiment besoin, impossible d'utiliser Python dans ce contexte sinon sur les "bords" et... il va falloir transpirer pour montrer que çà reste "safe".
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre averti Avatar de shell13010
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2008
    Messages : 281
    Points : 314
    Points
    314
    Par défaut
    Salut,

    Ok, je comprend maintenant. Je vais quand même me renseigner sur les explications que vous m'avais fournis pour éguiser ma curiosité.

    en tout cas je pense avoir tout les données nécessaires pour créer un système de plugins maintenant, donc je vous remerci pour les informations que vous avez partager.
    "Quelle prétention de prétendre que l'informatique est récente: Adam et Eve avaient déjà un Apple!"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. création d'un système de plugin
    Par st20085 dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 06/02/2007, 00h37
  2. Réponses: 10
    Dernier message: 29/01/2007, 18h01
  3. [HashTable] Création d'un système de cache : Perte de données
    Par Resyek dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 20/11/2006, 19h29
  4. Création des tables système
    Par tarik75 dans le forum Oracle
    Réponses: 7
    Dernier message: 17/08/2006, 18h02
  5. Ajout d'une commande système à un plugin ?
    Par kafifi dans le forum C++
    Réponses: 11
    Dernier message: 15/07/2006, 18h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo