Annonce

Réduire
Aucune annonce.

Prototype de scanner de sites ftp (lecture de tout le root)

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Prototype de scanner de sites ftp (lecture de tout le root)

    Hello,

    Encore un exercice que je doit résoudre:

    - create a list of ftp sites
    - create a worker thread and queue witch can login to these sites
    and list the root directory and exit
    - use 5 threads for this job and 10 ftp sites
    Alors le premier essai n'est pas beau (ni le script , ni le résultat), mais il est plus ou moins fonctionnel, j'ai pris plusieurs sources en essayant d’interner tout ça a un de mes scripts.
    J’avoue que je doit faire quelques recherches supplémentaires pour tout comprendre ^^


    Soyez indulgent et ne tapez pas trop fort , c'est un premier test !!!


    Voilà le script:


    voila le script

    Code:
    import threading
    from Queue import Queue
    from ftplib import FTP
    
    ftp_sites=['ftp.x.org',
               'ftp4.FreeBSD.org',
               'ftp.ncsa.uiuc.edu',
               'ftp.mozilla.org',
               'ftp.crans.org',
               'ftp1.freebsd.org',
               'ftp.cica.indiana.edu',
               'ftp.ncsa.uiuc.edu',
               'ftp.ctr.columbia.edu',
               'ftp.univ-rennes1.frpub']
    
    
    
    def CFTP(host) :
        try:        
            # connect to FTP site
            ftp = FTP(host)
            print ftp.getwelcome()
            ftp.login()
            # send LIST command
            ftp.retrlines('LIST')
            print "\n"
            # retrieve files
            #ftp.retrbinary('RETR README', open('README', 'wb').write)        
            ftp.quit()
        except:
            print "\n"
            
    def threader():
        while True:
            worker = q.get()
            CFTP(worker)
            q.task_done()        
    
    
    
    q = Queue()
    
    for x in range(5):    
        t = threading.Thread(target=threader)
        t.daemon = True
        t.start()                                   
    
    for worker in ftp_sites:    
        q.put(worker)
    
    q.join()
    print "All tasks completed"
    Et son résultat :

    Code:
    220 (vsFTPd 2.3.5)
    220 This is ftp0.bme.freebsd.org - hosted at Bytemark.co.uk
    220 ProFTPD 1.3.1 Server (X.Org) [::ffff:18.7.25.161]
    220 ftp.ncsa.illinois.edu FTP Server (Apache/2.2.3 (CentOS) PHP/5.1.6 mod_ftp/0.9.6) ready.220-
    220-   ftp.mozilla.org / archive.mozilla.org - files are in /pub/mozilla.org
    220-
    220-   releases.mozilla.org now points to our CDN distribution network and no longer works for FTP traffic
    220 
    
    lrwxrwxrwx    1 0        0              10 Jun 14  2012 custom -> pub/custom
    lrwxrwxrwx    1 9865     9865           10 May 24  2012 debian -> pub/debian
    lrwxrwxrwx    1 9865     9865           20 May 27  2012 debian-backports -> pub/debian-backports
    lrwxrwxrwx    1 9865     9865           22 May 24  2012 debian-multimedia -> pub/debian-multimedia/
    lrwxrwxrwx    1 9865     9865           20 May 24  2012 debian-security -> pub/debian-security/
    lrwxrwxrwx    1 0        0              10 Apr 14  2014 events -> pub/events
    drwxrwsr-x   27 0        4            4096 Jan 27  2014 git
    drwx------    2 9865     9865        16384 Jun 08  2012 lost+found
    drwxr-xr-x   14 9865     9865         4096 Nov 26  2013 pub
    lrwxrwxrwx    1 9865     9865           11 May 24  2012 ubuntu -> pub/ubuntu/
    lrwxrwxrwx    1 0        0              12 Jun 14  2012 videolan -> pub/videolan
    -rw-r--r--    1 ftp      ftp          5430 Jul 19  2014 favicon.ico
    
    
    -rw-r--r--    1 ftp      ftp           655 Nov 24  2014 index.html
    drwxr-xr-x    3 ftp      ftp             3 Jul 19  2014 pub
    
    
    
    
    220 moss.cse.buffalo.edu FTP server (Version wu-2.6.2(1) Mon Aug 2 14:04:46 EDT 2010) ready.
    -rw-r--r--   2 ftp      ftp           479 Nov  6  2001 banner2
    lrwxrwxrwx   1 ftp      ftp             7 Oct  9  2005 bin -> usr/bin
    drwxr-xr-x  34 ftp      ftp          4096 Nov  6  2001 contrib
    d--x--x--x   2 ftp      ftp          4096 Aug  8  2001 dev
    drwxr-xr-x   2 ftp      ftp          4096 Oct 12  1998 digest
    d--x--x--x   3 ftp      ftp          4096 Aug  8  2001 etc
    -rw-r--r--   1 ftp      ftp          3075 Oct  7  1998 GettingBroadway
    -rw-r--r--   1 ftp      ftp          3075 Oct  7  1998 GettingR6.3
    -rw-r--r--   1 ftp      ftp          1847 Feb  1  1999 GettingR6.4
    -rw-r--r--   1 ftp      ftp          1378 Aug 24  2000 GettingR6.5.1
    -rw-r--r--   1 ftp      ftp          1229 Apr 24  2001 GettingR6.6
    -rw-r--r--   1 ftp      ftp           301 Dec 22  2005 GettingR6.7
    -rw-r--r--   1 ftp      ftp           396 Dec 22  2005 GettingR6.8
    -rw-r--r--   1 ftp      ftp           396 Dec 22  2005 GettingR6.9
    -rw-r--r--   1 ftp      ftp           396 Dec 22  2005 GettingR7.0
    -rw-r--r--   1 ftp      ftp           195 Dec 30  2004 MIRROR.README
    drwxrwxr-x  36 ftp      ftp          4096 Jun 30  2013 pub
    drwxr-xr-x  56 ftp      ftp         24576 May  4  2001 R5contrib
    drwxr-xr-x   2 ftp      ftp          4096 May  4  2001 rcsfaq
    -r--r--r--   1 ftp      ftp          1571 Dec 22  2005 README
    lrwxrwxrwx   1 ftp      ftp             6 Nov 27  2005 README.txt -> README
    d--x--x--x   5 ftp      ftp          4096 Aug  8  2001 usr
    -rw-r--r--   2 ftp      ftp           479 Nov  6  2001 welcome.msg
    220 ftp.ncsa.illinois.edu FTP Server (Apache/2.2.3 (CentOS) PHP/5.1.6 mod_ftp/0.9.6) ready.
    
    
    -rw-r--r--    1 ftp      ftp           178 Apr 25  2014 README
    drwxr-xr-x   41 ftp      ftp          4096 May 21 16:20 pub
    
    
    -rw-r--r--    1 12873    floppy        784 Aug 22  1994 .index
    -rw-r--r--    1 80       root          663 Jan  7  1995 .message
    -rw-r--r--    1 80       root        25819 Dec 29  1994 Brochure
    drwx------    2 80       ncsa         2048 Jun 16  1998 Cyberia
    drwxr-xr-x    2 12873    root         2048 Aug 22  1994 DTM
    drwxrwxrwx    4 root     root         2048 Dec  4  2003 Director
    drwxr-xr-x   13 14453    root         2048 Aug 22  1994 Documentation
    drwxr-xr-x    9 root     root         2048 Feb  5  1997 Education
    drwxrwxrwx    2 root     root         2048 Apr  9  1996 FigLeaf
    drwxr-xr-x   13 19099    root         2048 Aug 22  1994 GlobalModels
    drwxr-xr-x    8 12873    root         2048 May 17  1996 Mac
    drwxr-xr-x   10 12873    root         2048 Feb 15  2002 Mosaic
    drwxr-xr-x    5 12873    root         2048 Jan  5  1995 PC
    -rw-r--r--    1 80       root        16557 Jan  3  1995 README
    -rw-r--r--    1 12873    root         1933 Jan 12  1995 README.FIRST
    drwxr-xr-x    5 12873    root         2048 Feb 15  2002 SGI
    drwxr-xr-x    4 12873    root         2048 Dec 20  1994 Telnet
    drwxr-xr-x    7 12873    root         2048 Aug 24  1994 Unix
    drwxrwxrwx   12 root     root         2048 Jan 30  2004 VR
    drwxr-xr-x   24 12873    root         2048 May 31  1997 Visualization
    drwxrwxrwx    2 root     root         2048 May 20  1996 Vosaic
    drwxr-xr-x    6 12873    root         2048 May 16  1997 Web
    drwxrwxrwx   24 root     root         2048 Sep 22  2006 aces
    drwxr-xr-x   10 12873    root         2048 Aug 22  1994 aff
    drwxrwxrwx    2 root     root         2048 Jul 24  2002 aips
    drwxrwxrwx   12 root     root        43008 Jun  6 22:11 alg
    drwxrwxrwx    4 root     root         2048 Mar 17  2003 benchmarks
    dr-xrwxrwx    2 root     root         2048 Apr 21  2006 bin
    drw-r--r--    2 15332    wheel        2048 Jan 27  1999 chemistry
    drwxrwxrwx   68 root     root         4096 Apr 12  2007 cosmic
    drwx------    3 80       ncsa         2048 May 24  2002 dbalsara
    drwx------    2 80       games        2048 Dec 23  1997 emerge
    drwxr-xr-x    3 80       root         2048 Jun 27  2006 etc
    drwxr-xr-x    4 80       sys          2048 May 12  2009 incoming
     
    drwx------    3 80       games        2048 Aug 25  1997 javatotal 10
    
    
    drwx------    2 80       games        2048 Jul 22  1997 jouledrwxrwxr-x  2 0      5    512 Apr  2  2014 .snap
    
    drwx------    7 80       ncsa         2048 Jun  5  2000 lcadrwxr-xr-x  2 0      0    512 Aug  1  2008 bin
    
    drwxrwxrwx    2 root     root         2048 Nov  9  2001 libdrwxr-xr-x  4 89987  546  512 Apr  4  2014 mirror
    
    drwxrwxrwx   16 root     root         2048 Sep 25  2003 mediadrwxrwxr-x  2 89987  546  512 Jun 14  2009 pub
    
    drwxr-xr-x   14 12873    root         2048 Nov 21  2001 miscdrwxr-xr-x  3 0      0    512 Dec  9  2014 users
    
    drwxrwxrwx   21 root     root         2048 Mar 16  2001 ncsapubs
    drwxrwxrwx   14 root     root         2048 Oct  3  2007 netdev
    drwxrwxr-x   31 12984    wheel        2048 Mar 19 10:51 outgoing
     drwxr-xr-x    4 12873    root         2048 Dec 21  1999 sc22wg5
    
    
    drwx------    2 nobody   games        2048 Mar 15  2007 security
    drwxr-xr-x    2 root     root         2048 Dec 22  1999 x3j3
    
    
    
    
    -rw-r--r--    1 12873    floppy        784 Aug 22  1994 .index
    -rw-r--r--    1 80       root          663 Jan  7  1995 .message
    -rw-r--r--    1 80       root        25819 Dec 29  1994 Brochure
    drwx------    2 80       ncsa         2048 Jun 16  1998 Cyberia
    drwxr-xr-x    2 12873    root         2048 Aug 22  1994 DTM
    drwxrwxrwx    4 root     root         2048 Dec  4  2003 Director
    drwxr-xr-x   13 14453    root         2048 Aug 22  1994 Documentation
    drwxr-xr-x    9 root     root         2048 Feb  5  1997 Education
    drwxrwxrwx    2 root     root         2048 Apr  9  1996 FigLeaf
    drwxr-xr-x   13 19099    root         2048 Aug 22  1994 GlobalModels
    drwxr-xr-x    8 12873    root         2048 May 17  1996 Mac
    drwxr-xr-x   10 12873    root         2048 Feb 15  2002 Mosaic
    drwxr-xr-x    5 12873    root         2048 Jan  5  1995 PC
    -rw-r--r--    1 80       root        16557 Jan  3  1995 README
    -rw-r--r--    1 12873    root         1933 Jan 12  1995 README.FIRST
    drwxr-xr-x    5 12873    root         2048 Feb 15  2002 SGI
    drwxr-xr-x    4 12873    root         2048 Dec 20  1994 Telnet
    drwxr-xr-x    7 12873    root         2048 Aug 24  1994 Unix
    drwxrwxrwx   12 root     root         2048 Jan 30  2004 VR
    drwxr-xr-x   24 12873    root         2048 May 31  1997 Visualization
    drwxrwxrwx    2 root     root         2048 May 20  1996 Vosaic
    drwxr-xr-x    6 12873    root         2048 May 16  1997 Web
    drwxrwxrwx   24 root     root         2048 Sep 22  2006 aces
    drwxr-xr-x   10 12873    root         2048 Aug 22  1994 aff
    drwxrwxrwx    2 root     root         2048 Jul 24  2002 aips
    drwxrwxrwx   12 root     root        43008 Jun  6 22:11 alg
    drwxrwxrwx    4 root     root         2048 Mar 17  2003 benchmarks
    dr-xrwxrwx    2 root     root         2048 Apr 21  2006 bin
    drw-r--r--    2 15332    wheel        2048 Jan 27  1999 chemistry
    drwxrwxrwx   68 root     root         4096 Apr 12  2007 cosmic
    drwx------    3 80       ncsa         2048 May 24  2002 dbalsara
    drwx------    2 80       games        2048 Dec 23  1997 emerge
    drwxr-xr-x    3 80       root         2048 Jun 27  2006 etc
    drwxr-xr-x    4 80       sys          2048 May 12  2009 incoming
    drwx------    3 80       games        2048 Aug 25  1997 java
    drwx------    2 80       games        2048 Jul 22  1997 joule
    drwx------    7 80       ncsa         2048 Jun  5  2000 lca
    drwxrwxrwx    2 root     root         2048 Nov  9  2001 lib
    drwxrwxrwx   16 root     root         2048 Sep 25  2003 media
    drwxr-xr-x   14 12873    root         2048 Nov 21  2001 misc
    drwxrwxrwx   21 root     root         2048 Mar 16  2001 ncsapubs
    drwxrwxrwx   14 root     root         2048 Oct  3  2007 netdev
    drwxrwxr-x   31 12984    wheel        2048 Mar 19 10:51 outgoing
    drwxr-xr-x    4 12873    root         2048 Dec 21  1999 sc22wg5
    drwx------    2 nobody   games        2048 Mar 15  2007 security
    drwxr-xr-x    2 root     root         2048 Dec 22  1999 x3j3
    
    
    All tasks completed
    Dernière modification par _47, 28 juillet 2015, 21h43. Motif: Petites corrections

  • #2
    -use 5 threads for this job and 10 ftp sites
    J'ai des doutes sur le respect de cette consigne.

    2 sites FTP à visiter par thread, c'est ça ?

    Bizarre je ne vois pas la séparation des threads et des sites FTP...

    Commentaire


    • #3
      voila la réponse de mon formateur ......

      j'ai copie colle la réponse a l'exercice que mon formateur a mis en ligne..
      après pour moi ça reste une source sur laquelle bosser comme n'importe quelle autre source que j'utilise.

      vais encore bosser dessus ( comme ce que j'ai fait pour le scanner de ports)
      jusqu’à ce que je soit content ( et je suis loin de l’être ^^ )

      je pense que d'ici une 30 aine de versions ça pourrait peut être le faire.

      Code:
      #!/usr/bin/env python
      
      import threading
      import Queue
      import time
      from ftplib import FTP
      
       
      ftpHostList = [ 'ftp.x.org', 'ftp4.FreeBSD.org', 'ftp.ncsa.uiuc.edu', 'ftp.mozilla.org', 'ftp.crans.org' ]
      
      class WorkerThread(threading.Thread) :
      
      	def __init__(self, queue, tid) :
      		threading.Thread.__init__(self)
      		self.queue = queue
      		self.tid = tid		
      
      	def run(self) :
      		while True :
      			host = None 
      
      			try :
      				host = self.queue.get(timeout=1)
      
      			except 	Queue.Empty :				
      				return
      			
      			# login to ftp host anonymously and list the dirs 
      			try :
      				conn = FTP(host)
      				conn.login()
      				print 'Host: ' +host
      				print conn.retrlines('LIST')
      			except :
      				print "Error in listing " +host
      				raise 
      
      			self.queue.task_done()
      
      
      queue = Queue.Queue()
      
      threads = []
      for i in range(1, 10) :	
      	worker = WorkerThread(queue, i) 
      	worker.setDaemon(True)
      	worker.start()
      	threads.append(worker)
      	
      	
      for host in ftpHostList :
      	queue.put(host)
      
      queue.join()
      
      # wait for all threads to exit 
      
      for item in threads :
      	item.join()
      
      print "Scanning Complete!"
      et son resultat:

      Code:
      Host: ftp.crans.org
      Host: ftp4.FreeBSD.org
      lrwxrwxrwx    1 0        0              10 Jun 14  2012 custom -> pub/custom
      lrwxrwxrwx    1 9865     9865           10 May 24  2012 debian -> pub/debian
      lrwxrwxrwx    1 9865     9865           20 May 27  2012 debian-backports -> pub/debian-backports
      lrwxrwxrwx    1 9865     9865           22 May 24  2012 debian-multimedia -> pub/debian-multimedia/
      lrwxrwxrwx    1 9865     9865           20 May 24  2012 debian-security -> pub/debian-security/
      lrwxrwxrwx    1 0        0              10 Apr 14  2014 events -> pub/events
      drwxrwsr-x   27 0        4            4096 Jan 27  2014 git
      drwx------    2 9865     9865        16384 Jun 08  2012 lost+found
      drwxr-xr-x   14 9865     9865         4096 Nov 26  2013 pub
      lrwxrwxrwx    1 9865     9865           11 May 24  2012 ubuntu -> pub/ubuntu/
      lrwxrwxrwx    1 0        0              12 Jun 14  2012 videolan -> pub/videolan
      226 Directory send OK.
      -rw-r--r--    1 ftp      ftp          5430 Jul 19  2014 favicon.ico
      -rw-r--r--    1 ftp      ftp           655 Nov 24  2014 index.html
      drwxr-xr-x    3 ftp      ftp             3 Jul 19  2014 pub
      226 Directory send OK.
      Host: ftp.ncsa.uiuc.edu
      Host: ftp.mozilla.org
      -rw-r--r--    1 ftp      ftp           178 Apr 25  2014 README
      drwxr-xr-x   41 ftp      ftp          4096 May 21 16:20 pub
      226 Directory send OK.
      -rw-r--r--    1 12873    floppy        784 Aug 22  1994 .index
      -rw-r--r--    1 80       root          663 Jan  7  1995 .message
      -rw-r--r--    1 80       root        25819 Dec 29  1994 Brochure
      drwx------    2 80       ncsa         2048 Jun 16  1998 Cyberia
      drwxr-xr-x    2 12873    root         2048 Aug 22  1994 DTM
      drwxrwxrwx    4 root     root         2048 Dec  4  2003 Director
      drwxr-xr-x   13 14453    root         2048 Aug 22  1994 Documentation
      drwxr-xr-x    9 root     root         2048 Feb  5  1997 Education
      drwxrwxrwx    2 root     root         2048 Apr  9  1996 FigLeaf
      drwxr-xr-x   13 19099    root         2048 Aug 22  1994 GlobalModels
      drwxr-xr-x    8 12873    root         2048 May 17  1996 Mac
      drwxr-xr-x   10 12873    root         2048 Feb 15  2002 Mosaic
      drwxr-xr-x    5 12873    root         2048 Jan  5  1995 PC
      -rw-r--r--    1 80       root        16557 Jan  3  1995 README
      -rw-r--r--    1 12873    root         1933 Jan 12  1995 README.FIRST
      drwxr-xr-x    5 12873    root         2048 Feb 15  2002 SGI
      drwxr-xr-x    4 12873    root         2048 Dec 20  1994 Telnet
      drwxr-xr-x    7 12873    root         2048 Aug 24  1994 Unix
      drwxrwxrwx   12 root     root         2048 Jan 30  2004 VR
      drwxr-xr-x   24 12873    root         2048 May 31  1997 Visualization
      drwxrwxrwx    2 root     root         2048 May 20  1996 Vosaic
      drwxr-xr-x    6 12873    root         2048 May 16  1997 Web
      drwxrwxrwx   24 root     root         2048 Sep 22  2006 aces
      drwxr-xr-x   10 12873    root         2048 Aug 22  1994 aff
      drwxrwxrwx    2 root     root         2048 Jul 24  2002 aips
      drwxrwxrwx   12 root     root        43008 Jun  6 22:11 alg
      drwxrwxrwx    4 root     root         2048 Mar 17  2003 benchmarks
      dr-xrwxrwx    2 root     root         2048 Apr 21  2006 bin
      drw-r--r--    2 15332    wheel        2048 Jan 27  1999 chemistry
      drwxrwxrwx   68 root     root         4096 Apr 12  2007 cosmic
      drwx------    3 80       ncsa         2048 May 24  2002 dbalsara
      drwx------    2 80       games        2048 Dec 23  1997 emerge
      drwxr-xr-x    3 80       root         2048 Jun 27  2006 etc
      drwxr-xr-x    4 80       sys          2048 May 12  2009 incoming
      drwx------    3 80       games        2048 Aug 25  1997 java
      drwx------    2 80       games        2048 Jul 22  1997 joule
      drwx------    7 80       ncsa         2048 Jun  5  2000 lca
      drwxrwxrwx    2 root     root         2048 Nov  9  2001 lib
      drwxrwxrwx   16 root     root         2048 Sep 25  2003 media
      drwxr-xr-x   14 12873    root         2048 Nov 21  2001 misc
      drwxrwxrwx   21 root     root         2048 Mar 16  2001 ncsapubs
      drwxrwxrwx   14 root     root         2048 Oct  3  2007 netdev
      drwxrwxr-x   31 12984    wheel        2048 Mar 19 10:51 outgoing
      drwxr-xr-x    4 12873    root         2048 Dec 21  1999 sc22wg5
      drwx------    2 nobody   games        2048 Mar 15  2007 security
      drwxr-xr-x    2 root     root         2048 Dec 22  1999 x3j3
      226 Transfer complete.
      Host: ftp.x.org
      -rw-r--r--   2 ftp      ftp           479 Nov  6  2001 banner2
      lrwxrwxrwx   1 ftp      ftp             7 Oct  9  2005 bin -> usr/bin
      drwxr-xr-x  34 ftp      ftp          4096 Nov  6  2001 contrib
      d--x--x--x   2 ftp      ftp          4096 Aug  8  2001 dev
      drwxr-xr-x   2 ftp      ftp          4096 Oct 12  1998 digest
      d--x--x--x   3 ftp      ftp          4096 Aug  8  2001 etc
      -rw-r--r--   1 ftp      ftp          3075 Oct  7  1998 GettingBroadway
      -rw-r--r--   1 ftp      ftp          3075 Oct  7  1998 GettingR6.3
      -rw-r--r--   1 ftp      ftp          1847 Feb  1  1999 GettingR6.4
      -rw-r--r--   1 ftp      ftp          1378 Aug 24  2000 GettingR6.5.1
      -rw-r--r--   1 ftp      ftp          1229 Apr 24  2001 GettingR6.6
      -rw-r--r--   1 ftp      ftp           301 Dec 22  2005 GettingR6.7
      -rw-r--r--   1 ftp      ftp           396 Dec 22  2005 GettingR6.8
      -rw-r--r--   1 ftp      ftp           396 Dec 22  2005 GettingR6.9
      -rw-r--r--   1 ftp      ftp           396 Dec 22  2005 GettingR7.0
      -rw-r--r--   1 ftp      ftp           195 Dec 30  2004 MIRROR.README
      drwxrwxr-x  36 ftp      ftp          4096 Jun 30  2013 pub
      drwxr-xr-x  56 ftp      ftp         24576 May  4  2001 R5contrib
      drwxr-xr-x   2 ftp      ftp          4096 May  4  2001 rcsfaq
      -r--r--r--   1 ftp      ftp          1571 Dec 22  2005 README
      lrwxrwxrwx   1 ftp      ftp             6 Nov 27  2005 README.txt -> README
      d--x--x--x   5 ftp      ftp          4096 Aug  8  2001 usr
      -rw-r--r--   2 ftp      ftp           479 Nov  6  2001 welcome.msg
      226 Transfer complete
      Scanning Complete!
      ps: après leur avoir écris , l'exercice n'est PAS finit , en fait il nous demande a la fin de la vidéo d'utiliser LOCK
      Dernière modification par blend, 28 juillet 2015, 10h02.

      Commentaire


      • #4
        Eh bien déjà

        1) Est-ce que tu as vu les classes ?
        2) Est-ce que tu as vu en POO la notion d'héritage ?
        3) Sais-tu pourquoi on surcharge la méthode run ?

        Voilà je pense que ça fait un peu trop de choses nouvelles à apprendre d'un seul coup...

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

        Comme j'ai compris ça, mais j'ai très peu de notions dans les threads et le module Queue (que je ne connais d'ailleurs pas du tout).
        Le principe serait de créer un thread prenant en paramètre deux sites FTP à l'aide d'une fonction, puis de l'ajouter dans un objet queue afin de les laisser être gérés par task_done à la fin de la création de tout tes threads.

        Ce qui veut dire que ta queue comporte 5 threads dont leur objectif (aux threads) serait de se connecter à leurs deux sites FTP.

        Je ne sais pas pour toi, mais ce code qui pourtant n'est pas long ne me donne pas une idée de l'intérêt de l'objet queue.

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

        En plus si je ne me trompe pas, il créé 10 threads, ce qui me semble inadapté par rapport à l'énoncé...

        use 5 threads for this job and 10 ftp sites

        Code:
        for i in range(1, 10) :	
        	worker = WorkerThread(queue, i) 
        	worker.setDaemon(True)
        	worker.start()
        	threads.append(worker)
        Bref je t'avouerais que je me sens un peu perdu par rapport à cette notion de thread + queue.

        Si lui comprend, il pourra sans doute t'expliquer, mais ça sent le mec qui a copier coller du code pour résoudre son exercice, qu'en penses-tu ?

        Commentaire


        • #5
          Salut Fred,

          oui effectivement j'ai déjà vu ces différents points dans d'autres cours et exercices (même si je ne les utilise que si vraiment je n'ai pas le choix)

          Non je ne pense pas qu'il ait fait de copie colle , vu que c'est le formateur.
          la en fait il a utilise en partie un ancien script d'un scanner , qu'il a modifie
          pour faire ce scanner ftp.

          je mets deux liens pour les vidéos des exercices du scanner de port et du scanner ftp:

          http://www.megafileupload.com/dfV1/ftp-scanner.m4v
          http://www.megafileupload.com/dfVC/t...er-threads.m4v

          et les videos des petits cours sur les threads / queue
          http://www.megafileupload.com/dfW2/04.m4v
          http://www.megafileupload.com/dfWA/05.m4v


          moi aussi j'ai du mal avec le threading/queue et le lock pour ça je préfère le module multiprocessing/pool qui me parait plus simple et moins bloquant (enfin pour l'instant je l'ai utilise deux fois..) , mais pour certains exercices je suis oblige de m'y mettre (comme pour le scanner de ports ou j'ai du y passer aussi...), par contre j'ai regarde les énoncés des prochain exercices ou il demande de ne plus utiliser threding/queue/lock et de justement de les remplacer par pool

          je suppose qu'il fait çà pour qu'on ait une idée du threading
          Dernière modification par blend, 28 juillet 2015, 11h36.

          Commentaire


          • #6
            Tu ne réponds à aucune de mes questions, donc difficile pour moi de t'aider...

            Aussi que penses-tu du principe que j'explique plus haut concernant les threads + queue ?

            Et que penses-tu de ma dernière remarque concernant les 10 threads et son énoncé ?

            Commentaire


            • #7
              Comme j'ai compris ça, mais j'ai très peu de notions dans les threads et le module Queue (que je ne connais d'ailleurs pas du tout).
              Le principe serait de créer un thread prenant en paramètre deux sites FTP à l'aide d'une fonction, puis de l'ajouter dans un objet queue afin de les laisser être gérés par task_done à la fin de la création de tout tes threads.

              Ce qui veut dire que ta queue comporte 5 threads dont leur objectif (aux threads) serait de se connecter à leurs deux sites FTP.
              oui c’est ça Fred , 10 sites ftp avec 5 threads après faut ajouter un lock dessus pour y mettre de 'ordre et ne pas que l'affichage soit mélangé.

              une bonne idée pour moi serait de me faire des petits exercices simples pour que je comprenne mieux tout ça

              Et que penses-tu de ma dernière remarque concernant les 10 threads et son énoncé ?
              effectivement vivek n'as pas fait ce qu'il avait demande dans l’énoncé (vais lui faire un petit mail , juste pour lui signaler ^^ )

              ps: si j'ai bien compris le threading / queue n'est pas FIFO ? pour ça il voudrait qu'on ajoute le lock ?
              Dernière modification par blend, 28 juillet 2015, 11h36.

              Commentaire


              • #8
                si j'ai bien compris le threading / queue n'est pas FIFO ?
                Ce n'est pas ce que j'ai compris. En ce qui me concerne une Queue FIFO, c'est empiler les éléments dans une file de façon à que le dernier élément ajouté soit mis à la fin de la file d'attente. Pour LIFO, ça serait au début de la file d'attente.

                pour ça il voudrait qu'on ajoute le lock ?
                Qu'est-ce qu'un verrou ? Son intérêt ?

                Commentaire


                • #9
                  Pour le FIFO , comme dit j'ai du me tromper (ou mal exprimé )


                  le lock (que je n'ai jamais utilise suis oblige de trouver quelques tutos (ou/et revoir mes cours aussi ..): (copie du SDZ)

                  Les locks à la rescousse

                  Il existe plusieurs moyens de « synchroniser » nos threads, c'est-à-dire de faire en sorte qu'une partie du code ne s'exécute que si personne n'utilise la ressource partagée. Le mécanisme de synchronisation le plus simple est le lock (verrou en anglais).

                  C'est un objet proposé par threading qui est extrêmement simple à utiliser : au début de nos instructions qui utilisent notre ressource partagée, on dit au lock de bloquer pour les autres threads. Si un autre thread veut faire appel à cette ressource, il doit patienter jusqu'à ce qu'elle soit libérée.

                  Il existe plusieurs mécanismes de programmation parallèle, dont les threads proposés dans le module threading de la bibliothèque standard ;

                  Créer un thread se fait en redéfinissant une classe héritée de threading.Thread et en appelant sa méthode start ;

                  On peut utiliser les locks pour synchroniser nos threads et faire en sorte que certaines parties de notre code s'exécutent bien à la suite des autres.
                  et une autre copie de http://python.jpvweb.com/mesrecettes...id=thread_lock



                  Dans l'exemple ci-dessous, on a un thread qui incrémente une variable globale, et un autre thread qui la décrémente. Quand les 2 threads ont terminé, la variable doit être nulle. Ce n'est pas le cas si on n'a pas fait de synchronisation, parce que les threads ont pu intervenir en même temps sur la variable, ce qui entraine un résultat aléatoire.

                  On créé un verrou en instanciant la classe Lock() de threading:
                  Code:
                  verrou = threading.Lock()
                  Quand l'un des threads veut modifier la variable globale, il demande l'autorisation par:
                  Code:
                  verrou.acquire()
                  ce qui le bloque jusqu'à ce que l'autre thread ait terminé son opération.

                  Quand il a obtenu l'autorisation (=l'autre thread a relâché le verrou), il modifie la variable globale et relâche le verrou par:
                  Code:
                  verrou.release()
                  Ce qui permettra à l'autre thread d'accéder à la variable.

                  En fait, c'est le programmeur qui a décidé que le verrou “verrou” est affecté à l'utilisation de la variable globale x. Il n'y a pas d'autre liaison fonctionnelle entre le verrou “verrou” et les threads
                  .

                  Voilà le code:

                  Code:
                  #!/usr/bin/python
                  # -*- coding: utf-8 -*-
                   
                  # inspiré de http://wikipython.flibuste.net/moin.py/QuestionsGenerales
                   
                  import threading
                  import sys
                   
                  x = 0
                  n = 1000
                   
                  def fnadd() :
                      global x,verrou
                      for i in xrange(n) :
                          verrou.acquire()
                          x += 1
                          verrou.release()
                   
                  def fnsub() :
                      global x,verrou
                      for i in xrange(n) :
                          verrou.acquire()
                          x -= 1
                          verrou.release()
                   
                  verrou = threading.Lock()
                  t1=threading.Thread(target=fnadd)
                  t2=threading.Thread(target=fnsub)
                  t1.start()
                  t2.start()
                  t1.join()
                  t2.join()
                  print "Valeur finale de la variable x = ", x
                  Ce qui est intéressant dans ce mécanisme de verrou, c'est qu'on voit bien que cela permettra de construire des objets de communication plus complexes comme une pile, une file d'attente ou même comme un “tableau blanc”, dans lequel chaque thread peut envoyer des messages aux autres, et chaque thread peut en prendre connaissance et agir en conséquence.

                  C'est la voie royale pour des simulations d'ateliers industriels, ou de processus vivants, ou même pour des procédés de calculs répartis sur plusieurs ordinateurs avec régulation de charge (load balancing), etc…
                  Dernière modification par blend, 28 juillet 2015, 12h20.

                  Commentaire


                  • #10
                    Bonjour, me revoilà avec mon code...

                    J'ai dû pas mal étudier le phénomène Queue + Threading, c'est vraiment pas ma tasse de thé, et comme le dit si bien notre ami Martelli (écrivain sur le langage Python), nous utilisons ce type de phénomène que dans 10% des applications et encore.

                    Pour cela j'ai utilisé la documentation officielle, avec un code exemple où j'ai très bien compris l'intérêt...

                    Code:
                    def worker():
                        while True:
                            item = q.get()
                            do_work(item)
                            q.task_done()
                    
                    q = Queue()
                    for i in range(num_worker_threads):
                         t = Thread(target=worker)
                         t.daemon = True
                         t.start()
                    
                    for item in source():
                        q.put(item)
                    
                    q.join()       # block until all tasks are done
                    C'est de là que tout est parti !!!

                    Voici mon code

                    Code:
                    from ftplib import FTP
                    from threading import Thread
                    from queue import Queue
                    
                    def connect(ftp1, ftp2):
                        for ftp in (ftp1, ftp2):
                            try:
                                myFTP = FTP(ftp)
                                if myFTP.login(): # Si le login s'est bien passé
                                    yield myFTP.retrlines('LIST') # on récupère la liste des répertoires et fichiers
                            except:
                                yield '' # Sinon on ne retourne rien
                    
                    def worker():
                        while True:
                            f1, f2 = queue.get() # prend les sites ftp dans le groupe se trouvant dans la file d'attente
                            r1, r2 = connect(f1, f2) # prend les résultats de chaque connexion
                            if r1: # Si différent de ''
                                print(r1) # on affiche r1
                            elif r2: # idem r1
                                print(r2)
                            queue.task_done() # Le travail sur ces sites FTP (f1 et f2) est terminé
                    
                    ftp_sites=['ftp.x.org',
                               'ftp4.FreeBSD.org',
                               'ftp.ncsa.uiuc.edu',
                               'ftp.mozilla.org',
                               'ftp.crans.org',
                               'ftp1.freebsd.org',
                               'ftp.cica.indiana.edu',
                               'ftp.ncsa.uiuc.edu',
                               'ftp.ctr.columbia.edu',
                               'ftp.univ-rennes1.frpub']
                               
                    index = [ftp_sites.index(ftp) for ftp in ftp_sites[::2]]
                    ftp_list = [ftp_sites[i:i+2] for i in index] # découpage des ftp 2 par 2 (5 threads)
                    
                    queue = Queue()
                        
                    for i in range(len(ftp_list)):
                        t = Thread(target=worker) # pas besoin de surclasser la classe Thread
                        t.daemon = True
                        t.start()
                    
                    for ftp1, ftp2 in ftp_list:
                        queue.put((ftp1, ftp2)) # insères les FTP par groupe de 2 dans la file d'attente
                        
                    queue.join()
                    
                    print("All tasks completed")
                    Bonne continuation...

                    EDIT: Version plus propre

                    Code:
                    from ftplib import FTP
                    from threading import Thread
                    from queue import Queue
                    
                    def connect(ftp1, ftp2):
                        for ftp in (ftp1, ftp2):
                            try:
                                myFTP = FTP(ftp)
                                if myFTP.login(): # Si le login s'est bien passé
                                    print(myFTP.retrlines('LIST')) # on récupère la liste des répertoires et fichiers
                            except:
                                pass # Sinon on ne retourne rien
                    
                    def worker():
                        while True:
                            f1, f2 = queue.get() # prend les sites ftp dans le groupe se trouvant dans la file d'attente
                            connect(f1, f2) # prend les résultats de chaque connexion
                            queue.task_done() # Le travail sur ces sites FTP (f1 et f2) est terminé
                    
                    ftp_sites=['ftp.x.org',
                               'ftp4.FreeBSD.org',
                               'ftp.ncsa.uiuc.edu',
                               'ftp.mozilla.org',
                               'ftp.crans.org',
                               'ftp1.freebsd.org',
                               'ftp.cica.indiana.edu',
                               'ftp.ncsa.uiuc.edu',
                               'ftp.ctr.columbia.edu',
                               'ftp.univ-rennes1.frpub']
                               
                    index = [ftp_sites.index(ftp) for ftp in ftp_sites[::2]]
                    ftp_list = [ftp_sites[i:i+2] for i in index] # découpage des ftp 2 par 2 (5 threads)
                    
                    queue = Queue()
                        
                    for i in range(len(ftp_list)):
                        t = Thread(target=worker) # pas besoin de surclasser la classe Thread
                        t.daemon = True
                        t.start()
                    
                    for ftp1, ftp2 in ftp_list:
                        queue.put((ftp1, ftp2)) # insères les FTP par groupe de 2 dans la file d'attente
                        
                    queue.join()
                    
                    print("All tasks completed")
                    Dernière modification par fred, 29 juillet 2015, 14h14.

                    Commentaire


                    • #11
                      Cette fois j'ai retravaillé mon script pour que l'affichage a la sortie du scanner FTP soit dans le même ordre que la liste des serveurs, comme me l'a demandé Vivek Ramachandran mon formateur. j'ai donc comme prévu ajouté un système de lock()


                      Voici ma version de ce scanner de sites FTP, avec threading/queue/lock:
                      Code:
                      from threading import *
                      from Queue import Queue
                      from ftplib import FTP
                      
                      lock=Lock()
                      q = Queue()
                      
                      ftp_sites=['ftp.x.org',
                                 'ftp4.FreeBSD.org',
                                 'ftp.ncsa.uiuc.edu',
                                 'ftp.mozilla.org',
                                 'ftp.crans.org',
                                 'ftp1.freebsd.org'
                                 ]
                      
                      print "--- FTP SCANNER -
                      for elements in ftp_sites:
                          print elements,
                      print "\n"
                      
                      def CFTP(host) :    
                          lock.acquire()
                          # connect to FTP site
                          ftp = FTP(host)
                          print ftp.getwelcome()
                          ftp.login()
                          # send LIST command
                          ftp.retrlines('LIST')
                          print "\n"
                          # retrieve files
                          #ftp.retrbinary('RETR README', open('README', 'wb').write)
                          ftp.quit()
                          lock.release()
                      
                      def threader():
                          while True:
                              worker = q.get()
                              CFTP(worker)
                              q.task_done()       
                      
                      
                      for x in range(6):   
                          t = Thread(target=threader)
                          t.daemon = True
                          t.start()                                  
                      
                      for worker in ftp_sites:    
                          q.put(worker)
                      
                      q.join()
                      print "All tasks completed"
                      Et voici son résultat:
                      Code:
                      --- FTP SCANNER ---
                      ftp.x.org ftp4.FreeBSD.org ftp.ncsa.uiuc.edu ftp.mozilla.org ftp.crans.org ftp1.freebsd.org 
                      
                      220 ProFTPD 1.3.1 Server (X.Org) [::ffff:18.7.25.161]
                      -rw-r--r--   2 ftp      ftp           479 Nov  6  2001 banner2
                      lrwxrwxrwx   1 ftp      ftp             7 Oct  9  2005 bin -> usr/bin
                      drwxr-xr-x  34 ftp      ftp          4096 Nov  6  2001 contrib
                      d--x--x--x   2 ftp      ftp          4096 Aug  8  2001 dev
                      drwxr-xr-x   2 ftp      ftp          4096 Oct 12  1998 digest
                      d--x--x--x   3 ftp      ftp          4096 Aug  8  2001 etc
                      -rw-r--r--   1 ftp      ftp          3075 Oct  7  1998 GettingBroadway
                      -rw-r--r--   1 ftp      ftp          3075 Oct  7  1998 GettingR6.3
                      -rw-r--r--   1 ftp      ftp          1847 Feb  1  1999 GettingR6.4
                      -rw-r--r--   1 ftp      ftp          1378 Aug 24  2000 GettingR6.5.1
                      -rw-r--r--   1 ftp      ftp          1229 Apr 24  2001 GettingR6.6
                      -rw-r--r--   1 ftp      ftp           301 Dec 22  2005 GettingR6.7
                      -rw-r--r--   1 ftp      ftp           396 Dec 22  2005 GettingR6.8
                      -rw-r--r--   1 ftp      ftp           396 Dec 22  2005 GettingR6.9
                      -rw-r--r--   1 ftp      ftp           396 Dec 22  2005 GettingR7.0
                      -rw-r--r--   1 ftp      ftp           195 Dec 30  2004 MIRROR.README
                      drwxrwxr-x  36 ftp      ftp          4096 Jun 30  2013 pub
                      drwxr-xr-x  56 ftp      ftp         24576 May  4  2001 R5contrib
                      drwxr-xr-x   2 ftp      ftp          4096 May  4  2001 rcsfaq
                      -r--r--r--   1 ftp      ftp          1571 Dec 22  2005 README
                      lrwxrwxrwx   1 ftp      ftp             6 Nov 27  2005 README.txt -> README
                      d--x--x--x   5 ftp      ftp          4096 Aug  8  2001 usr
                      -rw-r--r--   2 ftp      ftp           479 Nov  6  2001 welcome.msg
                      
                      
                      220 This is ftp0.bme.freebsd.org - hosted at Bytemark.co.uk
                      -rw-r--r--    1 ftp      ftp          5430 Jul 19  2014 favicon.ico
                      -rw-r--r--    1 ftp      ftp           655 Nov 24  2014 index.html
                      drwxr-xr-x    3 ftp      ftp             3 Jul 19  2014 pub
                      
                      
                      220 ftp.ncsa.illinois.edu FTP Server (Apache/2.2.3 (CentOS) PHP/5.1.6 mod_ftp/0.9.6) ready.
                      -rw-r--r--    1 12873    floppy        784 Aug 22  1994 .index
                      -rw-r--r--    1 80       root          663 Jan  7  1995 .message
                      -rw-r--r--    1 80       root        25819 Dec 29  1994 Brochure
                      drwx------    2 80       ncsa         2048 Jun 16  1998 Cyberia
                      drwxr-xr-x    2 12873    root         2048 Aug 22  1994 DTM
                      drwxrwxrwx    4 root     root         2048 Dec  4  2003 Director
                      drwxr-xr-x   13 14453    root         2048 Aug 22  1994 Documentation
                      drwxr-xr-x    9 root     root         2048 Feb  5  1997 Education
                      drwxrwxrwx    2 root     root         2048 Apr  9  1996 FigLeaf
                      drwxr-xr-x   13 19099    root         2048 Aug 22  1994 GlobalModels
                      drwxr-xr-x    8 12873    root         2048 May 17  1996 Mac
                      drwxr-xr-x   10 12873    root         2048 Feb 15  2002 Mosaic
                      drwxr-xr-x    5 12873    root         2048 Jan  5  1995 PC
                      -rw-r--r--    1 80       root        16557 Jan  3  1995 README
                      -rw-r--r--    1 12873    root         1933 Jan 12  1995 README.FIRST
                      drwxr-xr-x    5 12873    root         2048 Feb 15  2002 SGI
                      drwxr-xr-x    4 12873    root         2048 Dec 20  1994 Telnet
                      drwxr-xr-x    7 12873    root         2048 Aug 24  1994 Unix
                      drwxrwxrwx   12 root     root         2048 Jan 30  2004 VR
                      drwxr-xr-x   24 12873    root         2048 May 31  1997 Visualization
                      drwxrwxrwx    2 root     root         2048 May 20  1996 Vosaic
                      drwxr-xr-x    6 12873    root         2048 May 16  1997 Web
                      drwxrwxrwx   24 root     root         2048 Sep 22  2006 aces
                      drwxr-xr-x   10 12873    root         2048 Aug 22  1994 aff
                      drwxrwxrwx    2 root     root         2048 Jul 24  2002 aips
                      drwxrwxrwx   12 root     root        43008 Jun  6 22:11 alg
                      drwxrwxrwx    4 root     root         2048 Mar 17  2003 benchmarks
                      dr-xrwxrwx    2 root     root         2048 Apr 21  2006 bin
                      drw-r--r--    2 15332    wheel        2048 Jan 27  1999 chemistry
                      drwxrwxrwx   68 root     root         4096 Apr 12  2007 cosmic
                      drwx------    3 80       ncsa         2048 May 24  2002 dbalsara
                      drwx------    2 80       games        2048 Dec 23  1997 emerge
                      drwxr-xr-x    3 80       root         2048 Jun 27  2006 etc
                      drwxr-xr-x    4 80       sys          2048 May 12  2009 incoming
                      drwx------    3 80       games        2048 Aug 25  1997 java
                      drwx------    2 80       games        2048 Jul 22  1997 joule
                      drwx------    7 80       ncsa         2048 Jun  5  2000 lca
                      drwxrwxrwx    2 root     root         2048 Nov  9  2001 lib
                      drwxrwxrwx   16 root     root         2048 Sep 25  2003 media
                      drwxr-xr-x   14 12873    root         2048 Nov 21  2001 misc
                      drwxrwxrwx   21 root     root         2048 Mar 16  2001 ncsapubs
                      drwxrwxrwx   14 root     root         2048 Oct  3  2007 netdev
                      drwxrwxr-x   31 12984    wheel        2048 Mar 19 10:51 outgoing
                      drwxr-xr-x    4 12873    root         2048 Dec 21  1999 sc22wg5
                      drwx------    2 nobody   games        2048 Mar 15  2007 security
                      drwxr-xr-x    2 root     root         2048 Dec 22  1999 x3j3
                      
                      
                      220-
                      220-   ftp.mozilla.org / archive.mozilla.org - files are in /pub/mozilla.org
                      220-
                      220-   releases.mozilla.org now points to our CDN distribution network and no longer works for FTP traffic
                      220 
                      -rw-r--r--    1 ftp      ftp           178 Apr 25  2014 README
                      drwxr-xr-x   41 ftp      ftp          4096 May 21 16:20 pub
                      
                      
                      220 (vsFTPd 2.3.5)
                      lrwxrwxrwx    1 0        0              10 Jun 14  2012 custom -> pub/custom
                      lrwxrwxrwx    1 9865     9865           10 May 24  2012 debian -> pub/debian
                      lrwxrwxrwx    1 9865     9865           20 May 27  2012 debian-backports -> pub/debian-backports
                      lrwxrwxrwx    1 9865     9865           22 May 24  2012 debian-multimedia -> pub/debian-multimedia/
                      lrwxrwxrwx    1 9865     9865           20 May 24  2012 debian-security -> pub/debian-security/
                      lrwxrwxrwx    1 0        0              10 Apr 14  2014 events -> pub/events
                      drwxrwsr-x   27 0        4            4096 Jan 27  2014 git
                      drwx------    2 9865     9865        16384 Jun 08  2012 lost+found
                      drwxr-xr-x   14 9865     9865         4096 Nov 26  2013 pub
                      lrwxrwxrwx    1 9865     9865           11 May 24  2012 ubuntu -> pub/ubuntu/
                      lrwxrwxrwx    1 0        0              12 Jun 14  2012 videolan -> pub/videolan
                      
                      
                      220 moss.cse.buffalo.edu FTP server (Version wu-2.6.2(1) Mon Aug 2 14:04:46 EDT 2010) ready.
                      total 10
                      drwxrwxr-x  2 0      5    512 Apr  2  2014 .snap
                      drwxr-xr-x  2 0      0    512 Aug  1  2008 bin
                      drwxr-xr-x  4 89987  546  512 Apr  4  2014 mirror
                      drwxrwxr-x  2 89987  546  512 Jun 14  2009 pub
                      drwxr-xr-x  3 0      0    512 Dec  9  2014 users
                      
                      
                      All tasks completed
                      Dernière modification par blend, 30 juillet 2015, 08h26.

                      Commentaire

                      Chargement...
                      X