##// END OF EJS Templates
***
ralonso -
r38:39
parent child
Show More
@@ -1,514 +1,512
1 1 # -*- coding: utf-8 -*-
2 2
3 3 """
4 4 Module implementing MainWindow.
5 5 """
6 6
7 7 from PyQt4.QtGui import QMainWindow
8 8 from PyQt4.QtCore import pyqtSignature
9 9 from Ui_MainWindow import Ui_MainWindow
10 10 from PyQt4 import QtGui
11 11 from subprocess import *
12 12 import sys
13 13 import os
14 14 import subprocess
15 15 import commands
16 16
17 17 class MainWindow(QMainWindow, Ui_MainWindow):
18 18 """
19 19 Class documentation goes here.
20 20 """
21 21
22 22 def __init__(self, parent = None):
23 23 QMainWindow.__init__(self, parent)
24 24 self.setupUi(self)
25 25 self.setupUi2()
26 26
27 27 #redirige salida estandar
28 28 sys.stdout = self
29 29
30 30
31 31 def setupUi2(self):
32 32 """
33 33 Se usa para inicializar ciertos parametros para pruebas
34 34 """
35 35 self.txtDpath.setText('/home/ricardoar/optional/STORAGE/Data/RAW_EXP/JASMET/')
36 36 self.txtRpath.setText('/home/ricardoar/optional/STORAGE/prueba1_jro_backup_manager/')
37 37 self.txtElabel.setText('JASMET')
38 38 self.statusDpath = True
39 39 self.statusRpath = True
40 40 self.var_n_files=0
41 41 # self.statusDpath = False
42 42 # self.statusRpath = False
43 43
44 44
45 45 #
46 46 #Deteccion de los dispositvos de grabacion
47 47 #
48 48 #var_cmd="wodim --devices | grep /dev/ | awk -F\' '{print $2}'" #Funciona en consola pero no en python ΒΏ?
49 49 var_cmd="wodim --devices | grep /dev/ | awk '{print $2}' | awk -F= '{print $2}'"
50 50 var_output = commands.getstatusoutput(var_cmd)
51 51 if var_output[0] != 0:
52 52 self.txtInfo.setText("No se pudo encontrar los dispositivos de grabacion, output_error:" + str(var_output))
53 53 else:
54 54 self.txtInfo.append("dispositivos encontrados")
55 55 var_devices = var_output[1].split('\n')
56 56
57 57 var_tmp=[]
58 58 for i in range(0, 4):
59 59 if i < len(var_devices):
60 60 var_len = len(var_devices[i])
61 61 var_tmp.append(var_devices[i][1:var_len - 1])
62 62 else:
63 63 var_tmp.append('')
64 64
65 65 #Se escriben los dispostivos correspodientes, si existen
66 66 self.txtDeviceA.setText(str(var_tmp[0]))
67 67 self.txtDeviceB.setText(str(var_tmp[1]))
68 68 self.txtDeviceC.setText(str(var_tmp[2]))
69 69 self.txtDeviceD.setText(str(var_tmp[3]))
70 70 #Se desactivan los que no existen
71 71 if len(var_tmp[0]) == 0 :
72 72 self.chkDevA.setChecked(False)
73 73 self.chkDevA.setEnabled(False)
74 74 if len(var_tmp[1]) == 0 :
75 75 self.chkDevB.setChecked(False)
76 76 self.chkDevB.setEnabled(False)
77 77 if len(var_tmp[2]) == 0 :
78 78 self.chkDevC.setChecked(False)
79 79 self.chkDevC.setEnabled(False)
80 80 if len(var_tmp[3]) == 0 :
81 81 self.chkDevD.setChecked(False)
82 82 self.chkDevD.setEnabled(False)
83 83
84 84
85 85 def write(self, txt):
86 86 """
87 87 Escribe la salida estandar eb txtInfo
88 88 """
89 89 self.txtInfo.append(str(txt))
90 90
91 91
92 92 @pyqtSignature("")
93 93 def on_btnDpath_clicked(self):
94 94 """
95 95 Permite seleccionar graficamente el direcorio de los datos a grabar
96 96 """
97 97 var_Dpath= QtGui.QFileDialog.getExistingDirectory(self, 'Open Directory', './', QtGui.QFileDialog.ShowDirsOnly)
98 98 self.txtDpath.setText(var_Dpath)
99 99
100 100 #llamada a funcion
101 101 self.on_txtDpath_editingFinished()
102 102
103 103
104 104 @pyqtSignature("")
105 105 def on_btnRpath_clicked(self):
106 106 """
107 107 Permite seleccionar graficamente el direcorio del proyecto
108 108 """
109 109 var_Rpath = QtGui.QFileDialog.getExistingDirectory(self, 'Open Directory', './', QtGui.QFileDialog.ShowDirsOnly)
110 110 self.txtRpath.setText(var_Rpath)
111 111
112 112 #llamada a funcion
113 113 self.on_txtRpath_editingFinished()
114 114
115 115
116 116 @pyqtSignature("")
117 117 def on_txtDpath_editingFinished(self):
118 118 """
119 119 Permite buscar los archivos de extension seleccionada en la ruta de de datos
120 120 y cargar los valores para el rango de tiempo a ser grabado
121 121 """
122 122
123 123 #Usando el modulo "subprocess", eric4 pide seleccion del tipo de subproceso (padre o hijo)
124 124 #por ello se prefiere usar el modulo "commands"
125 125 #p1= Popen(['find', var_Dpath, '-name', '*.r'], stdout=PIPE)
126 126 #p2= Popen(['awk', '-F/', '{print substr($NF,2,7)}'], stdin=p1.stdout, stdout=PIPE)
127 127 #output_p2= p2.communicate()[0]
128 128 #self.txtInfo.setText(output_p2)
129 129
130 130 #Se carga la variable con la ruta de datos
131 131 var_Dpath=self.txtDpath.text()
132 132
133 133 #Se verifica que la ruta exista y sea un directorio
134 134 var_cmd="test -d "+str(var_Dpath)
135 135 var_output=commands.getstatusoutput(var_cmd)[0]
136 136 if var_output != 0:
137 137 self.statusDpath = False
138 138 self.txtInfo.setText("Ruta no valida, output_error:" + str(var_output))
139 139 return
140 140 else:
141 141 self.statusDpath = True
142 142 self.txtInfo.append("Ruta valida, sin error:" + str(var_Dpath))
143 143
144 144 #Se buscan los archivos del tipo especificado
145 145 var_Dtype=self.txtDtype.text()
146 146 var_cmd="find " + str(var_Dpath) + " -name *."+ str(var_Dtype) +" | awk -F/ '{print substr($NF,2,7)}' | sort| uniq"
147 147 output_p2=commands.getstatusoutput(var_cmd)[1]
148 148
149 149 #Se cargan las listas para seleccionar StartDay y StopDay (QComboBox)
150 150 self.var_list=[]
151 151 for i in range(0, (len(output_p2)+1)/8):
152 152 self.var_list.append(output_p2[8*i:8*(i+1)-1])
153 153
154 154 self.lstStartDay.clear()
155 155 self.lstStopDay.clear()
156 156
157 157 for i in self.var_list:
158 158 self.lstStartDay.addItem(i)
159 159 self.lstStopDay.addItem(i)
160 160
161 161 self.lstStopDay.setCurrentIndex(self.lstStartDay.count()-1)
162 162
163 163
164 164 @pyqtSignature("")
165 165 def on_txtRpath_editingFinished(self):
166 166 """
167 167 Valida la ruta del proyecto
168 168 """
169 169 #Se carga la variable con la ruta del proyecto
170 170 var_Rpath=self.txtRpath.text()
171 171
172 172 #Se verifica que la ruta exista y sea un directorio
173 173 var_cmd="test -d "+str(var_Rpath)
174 174 var_output=commands.getstatusoutput(var_cmd)[0]
175 175 if var_output != 0:
176 176 self.statusRpath = False
177 177 self.txtInfo.append("Ruta no valida, output_error:" + str(var_output))
178 178 return
179 179 else:
180 180 self.statusRpath = True
181 181 self.txtInfo.append("Ruta valida, sin error:" + str(var_Rpath))
182 182
183 183
184 184 @pyqtSignature("int")
185 185 def on_lstDtype_activated(self, index):
186 186 """
187 187 Permite elegir entre los tipos de archivos
188 188 """
189 189 if index == 0:
190 190 var_type='r'
191 191 elif index == 1:
192 192 var_type='pdata'
193 193 elif index == 2:
194 194 var_type='sswma'
195 195
196 196 if index != 3:
197 197 self.txtDtype.setText(var_type)
198 198 self.txtDtype.setReadOnly(True)
199 199 self.on_txtDpath_editingFinished()
200 200 else:
201 201 self.txtDtype.setText('')
202 202 self.txtDtype.setReadOnly(False)
203 203
204 204
205 205 @pyqtSignature("")
206 206 def on_txtDtype_editingFinished(self):
207 207 """
208 208 Se activa cuando el tipo de archivo es ingresado manualmente
209 209 """
210 210 #llamada a funcion
211 211 self.on_txtDpath_editingFinished()
212 212
213 213
214 214 @pyqtSignature("int") #CLOSED
215 215 def on_lstStartDay_activated(self, index):
216 216 """
217 217 Cambia la lista de opciones en lstStopDay
218 218 """
219 219 var_StopDay_index=self.lstStopDay.count() - self.lstStopDay.currentIndex()
220 220 self.lstStopDay.clear()
221 221
222 222 for i in self.var_list[index:]:
223 223 self.lstStopDay.addItem(i)
224 224
225 225 self.lstStopDay.setCurrentIndex(self.lstStopDay.count() - var_StopDay_index)
226 226
227 227
228 228 @pyqtSignature("int") #CLOSED
229 229 def on_lstStopDay_activated(self, index):
230 230 """
231 231 Cambia la lista de opciones en lstStartDay
232 232 """
233 233 var_StartDay_index=self.lstStartDay.currentIndex()
234 234 var_end_index = self.lstStopDay.count() - index
235 235 self.lstStartDay.clear()
236 236
237 237 for i in self.var_list[:len(self.var_list) - var_end_index + 1]:
238 238 self.lstStartDay.addItem(i)
239 239
240 240 self.lstStartDay.setCurrentIndex(var_StartDay_index)
241 241
242 242
243 243 @pyqtSignature("int") #CLOSED
244 244 def on_lstDcapacity_activated(self, index):
245 245 """
246 246 Permite elegir el tamaΓ±o del disco
247 247 """
248 248 if index == 0:
249 249 var_size=25.0
250 250 elif index == 1:
251 251 var_size=8.5
252 252 elif index == 2:
253 253 var_size=4.7
254 254 elif index == 3:
255 255 var_size=0.7
256 256
257 257 if index != 4:
258 258 self.txtDcapacity.setText(str(var_size*10**9/1024**2))
259 259 self.txtDcapacity.setReadOnly(True)
260 260 else:
261 261 self.txtDcapacity.setText('')
262 262 self.txtDcapacity.setReadOnly(False)
263 263
264 264
265 265 @pyqtSignature("")
266 266 def on_btnGbkp_clicked(self):
267 267 """
268 268 Cuando se presiona el boton btnGbkp
269 269 """
270 270
271 271 #Verifica que las rutas sean validas
272 272 if self.statusDpath == False or self.statusRpath == False:
273 273 if self.statusDpath == False:
274 274 self.txtInfo.append("Ruta de datos no valida")
275 275 if self.statusRpath == False:
276 276 self.txtInfo.append("Ruta de proyecto no valida")
277 277 return
278 278
279 279 #Crea las carpetas en la ruta del proyecto y verifica que se crearon correctamente
280 280 var_Rpath=self.txtRpath.text()
281 281 var_dirs='/{gpath,iso,ppath}'
282 282 var_cmd="mkdir -p "+str(var_Rpath)+str(var_dirs)
283 283 var_output=commands.getstatusoutput(var_cmd)[0]
284 284 if var_output != 0:
285 285 self.txtInfo.append("No se pudieron crear los directorios, output_error:" + str(var_output))
286 286 return
287 287 else:
288 288 self.txtInfo.append('Carpetas creadas correctamente')
289 289
290 290 #Cargando variables con los parametros
291 291 var_Dpath=self.txtDpath.text()
292 292 var_Rpath=self.txtRpath.text()
293 293 var_Rpath_ppath=var_Rpath+"/ppath" #Ruta de los archivos a grabar
294 294 var_sublist=[]
295 295 for i in self.var_list[self.lstStartDay.currentIndex():self.lstStartDay.currentIndex() + self.lstStopDay.currentIndex()+1]:
296 296 var_sublist.append(i)
297 297 if len(var_sublist) == 0:
298 298 self.txtInfo.append("No existen archivos encontrados")
299 299 return
300 300 #self.txtInfo.append('elementos: '+str(len(var_sublist)))
301 301
302 302
303 303 var_Dtype=self.txtDtype.text()
304 304 var_Dcapacity=float(self.txtDcapacity.text())*1024 #tamaΓ±o en KB
305 305
306 306 #Busca los archivos con los parametros de busqueda
307 307 var_files_list=[]
308 308 for var_doy in var_sublist:
309 309 var_cmd="find " + str(var_Dpath) + " -name ?"+var_doy+"???."+ str(var_Dtype) + " |sort"
310 310 var_output=commands.getstatusoutput(var_cmd)[1]
311 311 for var_file in var_output.split():
312 312 var_files_list.append(var_file) #Almacena cada archivo en la lista
313 313
314 314 #
315 315 #Genera la lista de archivos .dat que contienen los archivos a grabar en cada DVD
316 316 #
317 317 var_n=0 #Numero del DVD actual
318 318 var_tmp=0 #Se usa para acumulanr el tamaΓ±o de los archivos de la lista
319 319 var_files_list_2=[] #Se usa para almacenar la lista de archivos agrbar en cada DVD
320 320
321 321 for i in var_files_list: #Se asignan en i los archivos de la lista
322 322 var_size_i=os.path.getsize(i)/1024+1 #tamaΓ±o en KB del archivo de la lista, se suma 1 KB para evitar problemas al momento de sumar
323 323 var_tmp += var_size_i #Se acumulan el tamaΓ±o de los archivos de la lista
324 324
325 325 #Si el tamaΓ±o acumulado es mayor que el de el DVD
326 326 if var_tmp > var_Dcapacity:
327 327 var_tmp -= var_size_i #se quita el tamaΓ±o sumado para mostrar el tamaΓ±o real
328 328 #se agregan los ceros necesarios
329 329 if len(str(var_n)) < 4:
330 330 var_n2=""
331 331 for k in range(0, 4-len(str(var_n))):
332 332 var_n2 = var_n2+"0"
333 333 #se crea un archivo con numeral en el sufijo y extension .dat
334 334 var_file = open(var_Rpath_ppath+"/"+self.txtElabel.text()+"_"+str(var_n2)+str(var_n)+".dat","w")
335 335 #Se aΓ±ade la lista de archivos a grabar en el DVD al archivo .dat
336 336 for line in var_files_list_2:
337 337 var_tmp_path=(line.split(var_Dpath)[1]).split('/')
338 338 var_tmp_path2="/"
339 339 for l in range(0, len(var_tmp_path)-1):
340 340 var_tmp_path2=var_tmp_path2+str(var_tmp_path[l])+"/"
341 341 var_file.write(var_tmp_path2+'=')
342 342 var_file.write(line+'\n')
343 343 var_file.close()
344 344
345 345 var_tmp = var_size_i #Se asigna a la variable el tamaΓ±o del archivo actual
346 346 var_files_list_2=[] #Se reinicia la lista
347 347 var_n += 1
348 348 var_files_list_2.append(i)
349 349
350 350 #se agregan los ceros necesarios
351 351 if len(str(var_n)) < 4:
352 352 var_n2=""
353 353 for k in range(0, 4-len(str(var_n))):
354 354 var_n2 = var_n2+"0"
355 355 #se crea un archivo con numeral en el sufijo y extension .dat
356 356 var_file = open(var_Rpath_ppath+"/"+self.txtElabel.text()+"_"+str(var_n2)+str(var_n)+".dat","w")
357 357 #Se aΓ±ade la lista de archivos a grabar en el DVD al archivo .dat
358 358 for line in var_files_list_2:
359 359 var_tmp_path=(line.split(var_Dpath)[1]).split('/')
360 360 var_tmp_path2="/"
361 361 for l in range(0, len(var_tmp_path)-1):
362 362 var_tmp_path2=var_tmp_path2+str(var_tmp_path[l])+"/"
363 363 var_file.write(var_tmp_path2+'=')
364 364 var_file.write(line+'\n')
365 365 var_file.close()
366 366
367 367 #
368 368 #Genera los archivos .print con los cuales se creara los postscript
369 369 #
370 370 self.var_n_files = var_n # Numero del ultimo archivo .dat creado
371 371 var_n = 0 # Se reinicia a cero y se usa para poder acceder a cada una de los archivos
372 372
373 373 # Se leen todos los archivos .dat creados para crear las etiquetas en los archivos .ps
374 374 for var_n in range(0, self.var_n_files+1):
375 375 print var_n
376 376
377 377 #se agregan los ceros necesarios
378 378 if len(str(var_n)) < 4:
379 379 var_n2=""
380 380 for k in range(0, 4-len(str(var_n))):
381 381 var_n2 = var_n2+"0"
382 382 #se abren los archivos .dat en modo lectura
383 383 var_file = open(var_Rpath_ppath+"/"+self.txtElabel.text()+"_"+str(var_n2)+str(var_n)+".dat","r")
384 384 lines=var_file.readlines() # Se lee las lineas en el archivo y se almacenan en la lista
385 385
386 386 # Se crea el archivo .print
387 387 var_file_print = open(var_Rpath_ppath+"/"+self.txtElabel.text()+"_"+str(var_n2)+str(var_n)+".print","w")
388 388 var_file_print.write(self.txtElabel.text()+" "+str(var_n2)+str(var_n)+"/"+str(self.var_n_files)+"\n")
389 389 var_file_print.write("Year Doy Folder Set Time range\n")
390 390
391 391 #Se crean los archivos .print con los cuales se crearan los archivos .ps
392 392 var_first_folder = lines[0].split('=')[0]
393 393 var_first_file = (lines[0].split('=')[1])[:-1]
394 394 var_date_first_file=commands.getstatusoutput("date -r "+var_first_file+" +'%T'")[1]
395 395
396 396 for j in range(1, len(lines)-1):
397 397 var_tmp_folder = lines[j].split('=')[0]
398 398 var_tmp_file = (lines[j].split('=')[1])[:-1]
399 399
400 400 # Si el subfolder superior o la fecha del archivo cambia se genera una nueva linea
401 401 if (var_tmp_folder != var_first_folder) or (var_tmp_file[0:-5] != var_first_file[0:-5]):
402 402
403 403 var_last_file = (lines[j-1].split('=')[1])[:-1]
404 404 var_date_last_file=commands.getstatusoutput("date -r "+var_last_file+" +'%T'")[1]
405 405 # Si el archivo se grabara directamente en la / del DVD y no en un /directorio/
406 406 # se usa la etiqueta para indicar la parte de la etiqueta donde va el subdirectorio
407 407 if var_first_folder == '/':
408 408 var_folder = self.txtElabel.text()
409 409 else:
410 410 var_folder = var_first_folder.split('/')[1]
411 411
412 412 var_file_print.write(var_first_file[-12:-8]+" "+var_first_file[-8:-5]+" "+var_folder +" "+var_first_file[-5:-2]+" "
413 413 +var_last_file[-5:-2]+" "+var_date_first_file+" "+var_date_last_file+"\n")
414 414
415 415 var_first_folder = lines[j].split('=')[0]
416 416 var_first_file = (lines[j].split('=')[1])[:-1]
417 417 var_date_first_file=commands.getstatusoutput("date -r "+var_first_file+" +'%T'")[1]
418 418
419 419 var_last_file = (lines[-1].split('=')[1])[:-1]
420 420 var_date_last_file=commands.getstatusoutput("date -r "+var_last_file+" +'%T'")[1]
421 421
422 422 if var_first_folder == '/':
423 423 var_folder = self.txtElabel.text()
424 424 else:
425 425 var_folder = var_first_folder.split('/')[1]
426 426
427 427 var_file_print.write(var_first_file[-12:-8]+" "+var_first_file[-8:-5]+" "+var_folder +" "+var_first_file[-5:-2]+" "
428 428 +var_last_file[-5:-2]+" "+var_date_first_file+" "+var_date_last_file+"\n")
429 429
430 430 var_file.close()
431 431 var_file_print.close()
432 432
433 433
434 434 #Se deshabilita el Tab Parameters y el boton btnGbkp
435 435 self.tabParameters.setEnabled(False)
436 436 self.btnGbkp.setEnabled(False)
437 437
438 438
439 439 @pyqtSignature("")
440 440 def on_btnStartburn_clicked(self):
441 441 """
442 Slot documentation goes here.
442 Se inicia el proceso de grabacion
443 443 """
444 444 sys.stdout = self
445 445 #sys.stderr = self
446 446 print "stdout_!!!"
447 447
448 448 #Inicializando variables
449 449 var_Rpath=self.txtRpath.text()
450 450 var_Rpath_ppath=var_Rpath+"/ppath"
451 451 var_Rpath_iso=var_Rpath+"/iso"
452 452 var_label=self.txtElabel.text()
453 453
454
455
456 454 # Se leen todos los archivos .dat creados para crear las etiquetas en los archivos .ps
457 455 for var_n in range(0, self.var_n_files+1):
458 456 print var_n
459 457
460 458 #se agregan los ceros necesarios
461 459 if len(str(var_n)) < 4:
462 460 var_n2=""
463 461 for k in range(0, 4-len(str(var_n))):
464 462 var_n2 = var_n2+"0"
465 463
466 464 file_iso=var_Rpath_iso+"/"+var_n2+str(var_n)+".iso"
467 465 file_dat=var_Rpath_ppath+"/"+self.txtElabel.text()+"_"+str(var_n2)+str(var_n)+".dat"
468 466
469 467 var_cmd = 'genisoimage -hide-joliet-trans-tbl -joliet-long -r '
470 468 var_cmd += ' -A '+var_label+' -V '+var_label
471 469 var_cmd += ' -graft-points -path-list '+ file_dat+' -o '+file_iso
472 470 self.txtInfo.append(var_cmd)
473 471
474 472 var_output=commands.getstatusoutput(str(var_cmd))[0]
475 473 self.txtInfo.append(str(var_output))
476 474
477 475 #os.system(str(var_cmd))
478 476 #p = subprocess.Popen(str('ls /'), shell=True, stdout=self)
479 477 #os.waitpid(p.pid, 0)
480 478 ####self.txtInfo.append(str(p.pid))
481 479
482 480
483 481
484 482 @pyqtSignature("")
485 483 def on_btnRestart_clicked(self):
486 484 """
487 485 Slot documentation goes here.
488 486 """
489 487 self.tabParameters.setEnabled(True)
490 488 self.btnGbkp.setEnabled(True)
491 489
492 490 @pyqtSignature("")
493 491 def on_btnTdevA_clicked(self):
494 492 var_dev = str(self.txtDeviceA.text())
495 493 var_cmd = 'eject ' + var_dev + '; eject -t ' + var_dev
496 494 commands.getstatusoutput(var_cmd)
497 495
498 496 @pyqtSignature("")
499 497 def on_btnTdevB_clicked(self):
500 498 var_dev = str(self.txtDeviceB.text())
501 499 var_cmd = 'eject ' + var_dev + '; eject -t ' + var_dev
502 500 commands.getstatusoutput(var_cmd)
503 501
504 502 @pyqtSignature("")
505 503 def on_btnTdevC_clicked(self):
506 504 var_dev = str(self.txtDeviceC.text())
507 505 var_cmd = 'eject ' + var_dev + '; eject -t ' + var_dev
508 506 commands.getstatusoutput(var_cmd)
509 507
510 508 @pyqtSignature("")
511 509 def on_btnTdevD_clicked(self):
512 510 var_dev = str(self.txtDeviceD.text())
513 511 var_cmd = 'eject ' + var_dev + '; eject -t ' + var_dev
514 512 commands.getstatusoutput(var_cmd)
General Comments 0
You need to be logged in to leave comments. Login now