[Python] popen e netuse

Giampaolo Rodolà g.rodola a gmail.com
Lun 6 Giu 2011 11:43:22 CEST


Non so di preciso cosa faccia net use ma se conosci il PID del
processo che ti aspetti che apra la connessione puoi utilizzare psutil
[1] per verificare che la connessione su un dato indirizzo:porta sia
attiva e in stato "established".
Esempio:

 >>> import os, socket, psutil
 >>> thisproc = psutil.Process(os.getpid())
 >>> thisproc.get_connections()
 []
 >>> sock = socket.create_connection(('google.it', 80))
 >>> thisproc.get_connections()
 [connection(fd=3, family=2, type=1, local_address=('10.0.0.1',
44467), remote_address=('74.125.39.104', 80), status='ESTABLISHED')]
 >>>

[1] http://code.google.com/p/psutil/

Saluti,

--- Giampaolo
http://code.google.com/p/pyftpdlib/
http://code.google.com/p/psutil/



2011/5/26 Filadelfo Fiamma <philosganga a gmail.com>:
> Ciao a tutti,
>
> ho uno script Python che apre la connessione, sotto Winzozz, ad una
> cartella remota. Vado a sfruttare il comando di sistema net use per
> verificare lo stato della connessione, eventualmente rimuoverla e
> aggiungerla.
> Il problema che vi espongo nasce nel momento in cui lo stato della
> connessione passa da OK a DISCONNECTED, prima di addentrarmi nel
> problema vi mostro la sequenza dei comandi che vengono lanciati:
>
>
> #cmd = 'net use path_remoto password /USER: user /'
> #cmd = 'net use path_remoto password /DELETE'
> #cmd = 'net use'
>
> #Apre la popen
> def checkRemoteConnection(self,cmd):
>        f = None
>        try:
>            f = os.popen(cmd)
>        except Exception:
>            print 'Problem in popen'
>            self.writeLog('Problem in popen\n')
>            return False
>        else:
>            self._file_popen = f
>            return True
>
>
> #Interpreta il contenuto della popen, esaminando lo status
> def interpreter(self,fp,type='r'):
>        l = fp.readlines()
>        if(type == 'r'):
>            for i in range(len(l)):
>                if(len(l[i])>1):
>                    self.writeLog('interpreter: reading popen.. '+str(l[i])+'\n')
>                    if(str(l[i]).find(str(self.__remote_path))!=-1):
>                        if(str(l[i]).find('OK')!=-1):
>                            return True
>            return False
>        else:
>            for i in range(len(l)):
>                self.writeLog('interpreter: reading popen.. '+str(l[i])+'\n')
>            return True
>
>
> #Controlla i due metodi soprastanti
> def isConnected(self, cmd, type = 'r'):
>        if not self.checkRemoteConnection(cmd):
>            return False
>
>        if(self._file_popen!=None):
>
>            self.writeLog('isConnected: Popen result is None\n')
>            return False
>        else:
>            ret =self.interpreter(self._file_popen,type)
>
>            if(self._file_popen!=None):
>                try:
>                    self._file_popen.close()
>                except Exception:
>                    print 'fp.close() : exception in close popen()'
>
>            if(ret):
>                return True
>            else:
>                return False
>
>
> Ho inoltre tre metodi (test(),submit(),delete()), che ometto, che non
> fanno altro che scrivere opportunamente la stringa cmd.
>
> if __name__ == '__main__':
>
>    net = NetUse(user,pwd,remotepath)
>
>    if(len(sys.argv)>1):
>        if(len(sys.argv)==2):
>            if(sys.argv[1]=='delete'):
>                if(net.test()):
>                    if(net.delete()):
>                        print 'Connessione remota rimossa'
>                    else:
>                        print 'Impossibile rimuovere connessione remota'
>    else:
>        if(not net.test()):
>            print 'Not connected'
>            if(not net.submit()):
>                print 'Error in connection'
>            else:
>                if(not net.test()):
>                    print 'Error in connection..try again'
>                    net.delete()
>                    time.sleep(2)
>                    net.submit()
>                    if(not net.test()):
>                        print 'Error in connection..'
>                    else:
>                        print 'Successfully Connected'
>                else:
>                    print 'Successfully Connected'
>        else:
>            print 'Already Connected'
>
>
> Questo script, in caso di stato della connessione DISCONNECTED, mi
> restituusce un'eccezione su self._file_popen.close() (Metodo
> isConnected)
> Sapreste indicarmi se opero in modo sbagliato o se invece questa
> particolare situazione (STATUS DISCONNECTED) può essere gestita in
> modo differente ed indolore? Sottolineo che questo problema non lo
> riscontro su ogni macchina in cui viene eseguito, ma solo su alcune,
> senza apparente motivo.
>
> Vi ringrazio moltissimo
> Ciao e buona giornata
>
> FF
> _______________________________________________
> Python mailing list
> Python a lists.python.it
> http://lists.python.it/mailman/listinfo/python
>


Maggiori informazioni sulla lista Python