[Python] popen e netuse

Filadelfo Fiamma philosganga a gmail.com
Gio 26 Maggio 2011 12:01:38 CEST


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


Maggiori informazioni sulla lista Python