Vous êtes ici : Accueil / Forums & ML / Forums Python / Forum général Python / fichiers interdits base anydbm...help !

fichiers interdits base anydbm...help !

Remonter à Forum général Python
  • fichiers interdits base anydbm...help !

    Envoyé par ph_biohazard le 26 Janvier 2007 à 11:39
    Bonjour a tous,

    Je suis debutant en Python, mais je persevere :)

    Il s agit d'une base de fichiers interdits dans ma boite. j'ai un directory ou se trouvent ces fichiers interdits.
    L'idee, je parse ce rep, j'enregistre les noms dans une database, et j'utilise un script d'analyse avec mon fichier de base ou mes fichiers interdits sont references.

    Je cherche donc a mettre dans une base de donnees le contenu d'un repertoire, en fait tous les noms des fichiers, pour ensuite questionner la presence de nom particulier dans cette base.

    Je pense, apres avoir vu les possibilites de pickle et de Shelve, que anydbm serait la plus adapter car il semble que l'instruction .haskey est interessante.

    Voici mon code, mais je ne m'en sorts pas.

    Si quelqu'un a une autre proposition de script je suis egalement preneur, histoire de m'y reference!

    Qd cela fonctionne, je me retrouve dans la base avec le dernier objet.

    Regardez avec la fonction

    import os, os.path, string, anydbm

    def listRep ( args, dirname, filenames ):
    os.chdir(dirname)
    print 'Analyse du Dossier : ',dirname
    for filename in filenames:
    file = anydbm.open('c:/dbm.dir' , 'c')
    typeF = os.listdir('c:/datas')
    print "Integrite du fichier : " , filename , 'est reporte en : ' , typeF
    file['fichierInterdit'] = typeF
    print "Structure database : " , file['fichierInterdit']
    file.close()
    os.path.walk('c:/Temp/', listRep, None )
    print 'Nouveau fichier de base uptodate en anyDBM....'

    1ere question :
    Pourquoi c'est toujours le dernier fichier du dir qui est dans enregistrer dans la database. En fait je me retrouve avec qu'un et un seul enregistrement dans la database.

    2eme question :
    Une fois que la database est creee avec tous les enregistrements de mes fichiers, comment puis-je rappeler une des valeurs dans la database pour faire une comparaison avec un repertoire existant? est que la commande haskey peut etre utilisee dans ce cas?

    Merci pour vos propositions et votre aide
    Marc
    • Re: fichiers interdits base anydbm...help !

      Envoyé par jpcw2002 le 29 Janvier 2007 à 08:20
      Salut,
      effectivement une erreur s'est glissée dans mon code suite à l'interprétation du forum :
      Il n'aime pas les variables entre crochets, qu'il confond avec une balise :(. j'ai donc rajouté des espaces autour de [ name ]et db[ f ]pour qu'il soient apparents.

      def files(arg, dirname, names):
      for name in names:
      db[ name ]=dirname

      Donc pour rester coler à l'exemple que j'ai mis plus haut :
      #on fait son petit test avec has_key()
      for f in a_verifier:
      if db.has_key(f):
      print f,' est ici : ',db[ f ]

      te donnera bien la chose suivante :

      >>>
      file1 est ici : path/to/dossier_interdit
      file11 est ici : path/to/dossier_interdit/folder1
      file22 est ici : path/to/dossier_interdit/folder2

      @++
      • Re: fichiers interdits base anydbm...help !

        Envoyé par ph_biohazard le 31 Janvier 2007 à 14:48
        Salut Jpcw2002,

        Merci pour ton code, cela fonctionne, je l'ai adapté pour mon besoin.

        Je suis desole, j'ai du mal avec Shelve :(
        Je ne m'en sorts pas.

        Maintenant, je souhaiterai rentrer une key md5 dans une database; soit j'ai des erreurs de droits sur un repertoire, soit dans ma base je me retouve avec les noms des fichiers, mais pas ma clef md5.

        En fait, je souhaite browzer un repertoire et ne rentrer que la clef md5 dans la database sans rien d'autre.
        le print fonctionne bien sur clefHash, mais dans la database, je n'ai que les fichiers du directory.

        Qu'en penses tu, voici mon code :

        import os, os.path, md5, shelve

        debut = "c:"
        repertoires = ['\\temp']

        while len(repertoires)>0:
        repertoire = repertoires.pop()
        for nom in os.listdir(repertoire):
        chemin = os.path.join(repertoire,nom)
        db=shelve.open("c:/a00001.dbl")
        if os.path.isfile(chemin):
        fichier = open(chemin, 'rb').read()
        clefHash = md5.new(fichier).hexdigest()
        db=shelve.open("c:/a00001.dbl,writeback=True")
        db.close()
        print clefHash

        merci pour ton aide
        Amities
        Marc
    • Re: fichiers interdits base anydbm...help !

      Envoyé par jpcw2002 le 1 Février 2007 à 11:19
      A aucun moment dans ton code tu n'ajoutes clefHash dans ta db, c'est donc normal que tu ne la retrouve pas !
      db[ fichier ]=clefhash

      shelve te permet de stocker dans un dictionnaire tes objets, afin d'assurer leur persistence au dela de l'exécution du programme.
      Dans ce dictionnaire tu y mets ce que tu veux, des string, des listes, tuples, des dictionnaires, etc.

      Voici la même chose avec ce que je t'ai donné plus haut :

      import shelve
      import os.path
      import md5


      a_verifier=['file1','toto','file11','tata','file22']
      forbidden="path/to/dossier_interdit"

      def files(arg, dirname, names):
      for name in names:
      clefHash = md5.new(name).hexdigest()
      db[ name ]={'dir':dirname,'md5':clefHash}

      #on crée la db
      db=shelve.open("forbidden.db")
      #on remplit la db
      os.path.walk(forbidden, files, None)

      #on fait son petit test avec has_key()
      for f in a_verifier:
      if db.has_key(f):
      print f,'clef md5 :',db[ f ]['md5']
      db.close()

      Affiche :

      >>>
      file1 clef md5 : 826e8142e6baabe8af779f5f490cf5f5
      file11 clef md5 : 11312150a2d0a1e10fd7aeabc86a402f
      file22 clef md5 : 3203e0ee611a1aa8f4a23677783a41d3
      • Re: fichiers interdits base anydbm...help !

        Envoyé par ph_biohazard le 2 Février 2007 à 14:01
        Bonjour Jpcw2002,

        Merci pour ton aide, effectivement j'avais oublie de declarer db !

        Par contre, j'ai des repertoires, je n'arrive pas a voir pourquoi, car je suis sur xp et administrateur, certains repertoires sont impossible a checker, il me met IOError: [Errno 13] Permission denied

        Par contre des repertoires comme Temp, ou windows pas de pb. J'ai essaye sur une autre becanne en faisant un copier/coller de ces repertoires, meme probleme.

        Une idee?

        Sinon, je suis en train de recreer mon arborescence manuellement, a priori, ca a l'air de fonctionner qd je cree les rep manuellement !

        Encore merci pour toutes tes explications,

        Amities
        Marc
        • Re: fichiers interdits base anydbm...help !

          Envoyé par ph_biohazard le 3 Février 2007 à 23:03
          Bonjour Jpcw2002,

          J'ai une petite question a te poser.
          Je suis en train de regarder le module Tk, et je ne trouve pas d'exemples pour mon besoin.

          Tu sais dans ton script, tu fais afficher le resultat avec le nom des fichiers et directory avec ce code :

          ------------
          code:

          #on fait son petit test avec has_key()
          for f in a_verifier:
          if db.has_key(f):
          print f,' est ici : ',db[f ]
          >>>
          Resultat:

          file1 est ici : path/to/dossier_interdit
          file11 est ici : path/to/dossier_interdit/folder1

          -----------------

          La question est comment injecter cet affichage (print f,' est ici : ',db[f ]) dans une fenetre Tk avec barre d'ascenseur pour avoir l'historique?

          Je te remercie pour ton aide

          Amities
          Marc
    • Re: fichiers interdits base anydbm...help !

      Envoyé par jpcw2002 le 5 Février 2007 à 12:23
      je ne connais pas Tkinter, je me sers de Python, pour Zope et quelques scripts d'administration système, en complément de csh.

      Ceci dit, je viens de m'amuser a faire un petit prog qui devrait répondre à ta question.

      Il est toujours basé sur les exemples du dessus.
      La fenêtre affiche les résultats de la vérification comme tu le désires dans une textbox avec scrollbar.
      le code
      @++
      • Re: fichiers interdits base anydbm...help !

        Envoyé par ph_biohazard le 7 Février 2007 à 00:28
        Super merci Jpcw2002 pour ton aide ca m'a mis sur la piste.

        Amities
        Marc
    • Re: fichiers interdits base anydbm...help !

      Envoyé par jpcw2002 le 26 Janvier 2007 à 16:40
      Ton code n'est pas lisible, donc utilise la balise "code" pour tes prochains messages :)

      Sinon je n'ai pas forcément tout compris mais voici un bout de code qui devrait t'aider.
      Supposons que ton répertoire interdit contienne les fichiers suivants :
      file1
      file2
      folder1/
      file11
      foldr2/
      file22
      Tu veux stocker les noms de fichiers dans une db "forbidden.db" en utilisant shelve pour pouvoir vérifier ensuiter que tel élément de ta liste a_verifier est un fichier interdit par exemple

      import shelve
      import os.path

      a_verifier=['file1','toto','file11','tata','file22']
      forbidden="path/to/dossier_interdit"

      def files(arg, dirname, names):
      for name in names:
      db[name]=dirname

      #on crée la db
      db=shelve.open("forbidden.db")
      #on remplit la db
      os.path.walk(forbidden, files, None)

      #on fait son petit test avec has_key()
      for f in a_verifier:
      print db.has_key(f)
      db.close()

      >>>
      1
      0
      1
      0
      1
      • Re: fichiers interdits base anydbm...help !

        Envoyé par ph_biohazard le 28 Janvier 2007 à 16:44
        Bonjour JPCW2002,

        J'ai teste ton code, et j'ai le meme probleme qu'avec mon script.
        La database ne contient qu'un seul enregistrement!
        et le resultat est:
        0
        0
        0
        0

        En fait, j'ai un directory qui contient des fichiers que j'ajoute au fur et a mesure car ils sont references comme interdits.

        Le but est que je rentre dans une database tous les noms des fichiers de ce repertoire qui peut contenir des sous repertoires.
        Mon dictionnaire est en fait le contenu de cette database.
        Ensuite, je lance un autre script detecteur qui lit cette database, et qui me dit par exemple 1SETUP.EXE est present dans le repertoire c:/XXX ou d:/program files/jeux/monjeux/ et est interdit.

        Donc effectivement, j'ai teste avec anydbm, pickle et shelve sans succes....a chaque fois je retrouve dans cette data uniquement le dernier fichier detecte du repertoire interdit...la je ne comprends pas, car avec ton exemple j'ai le meme pb.

        Pour info, je redonne mon code plus structurer, mais il ne fonctionne pas

        -------------------------
        import os, os.path, string, anydbm

        def listRep ( args, dirname, filenames ):
        os.chdir(dirname)

        print 'Analyse du Dossier : ',dirname

        for filename in filenames:
        file = anydbm.open('c:/dbm.dir' , 'c')
        typeF = os.listdir('c:/datas')
        print "Integrite du fichier : " , filename , 'est reporte en : ' , typeF
        file['fichierInterdit'] = typeF
        print "Structure database : " , file['fichierInterdit']
        file.close()

        #os.path.walk('c:/Temp', listRep, None )

        print 'Nouveau fichier de Pattern uptodate en anyDBM....'

        ---------------------

        merci pour ton aide
        Comment je peux faire pour avoir tous mes enregistrements et les recuperer ?


        ----

        PS : Merci egalement a Pacificator, mais ton script me cree des fichiers dans un directory, en les declarant eux memes comme interdits.
        Par contre, je te remercie car il y a des choses que tu m'as fait decouvrir et que je reutiliserai :)

        Amities a tous
        Marc
    • Re: fichiers interdits base anydbm...help !

      Envoyé par pacificator le 26 Janvier 2007 à 16:40
      salut,

      ton code n'est pas très lisible, il manque les balises de code.

      Je te propose ce code:
      import os

      def ajouterContenuRepertoire(repertoire, fichiers_interdits =
      "C:\\fichiers_interdits.txt"):
      if os.path.isdir(repertoire):
      try:
      open(fichiers_interdits, 'a+').write("\n".
      join(os.listdir(repertoire)))
      except:
      return False
      return True
      return False

      def estInterdit(fichier, fichiers_interdit = "C:\\fichiers_interdits.txt"):
      return fichier in open(fichiers_interdit).read().split('\n')


      def creerRepTest(rep = 'test'):
      if not os.path.isdir(rep):
      os.mkdir(rep)
      for i in range(120):
      open(os.path.join(rep, 'fichier_%s.txt' %
      str(i).rjust(3, '0')), 'w').write(
      "\n".join(['ligne numero %s' % str(f).rjust(3, '0')
      for f in range(5)]))

      if __name__ == '__main__':

      creerRepTest('C:\\test')
      ajouterContenuRepertoire('C:\\test', 'interdits.txt')
      print "fichier_inconnu interdit?\t%s" % \
      str(estInterdit('fichier_inconnu', 'interdits.txt'))
      print "fichier_020.txt interdit?\t%s" % \
      str(estInterdit('fichier_020.txt', 'interdits.txt'))


      à adapter au besoin.
Rendu par Ploneboard