source: salt-server/trunk/fuentes/sltsrv.py @ 473

Last change on this file since 473 was 473, checked in by daduve, 3 years ago

Adding files

  • Property svn:executable set to *
File size: 32.5 KB
Line 
1#!/usr/bin/python
2# -*- coding: latin-1 -*-
3
4#
5# Formas de llamar a sltsrv desde la línea de comandos
6#
7# sltsrv [-pcPath] [-dxxx] [-exxx] [-xppath]:
8#                  -p: cPath==directorio donde están las bases de datos
9#                  -d: prints informativos (stdout)
10#                  -dfich: prints informativos a fichero fich
11#                  -e: prints errores (stderr)
12#                  -efich: prints errores a fichero fich
13#                  -xppath: ppath es una lista a añadir a pythonpath==[path1,path2,...]
14import sys
15import os
16
17sys.path.extend(["/usr/lib","/usr/share/salt-server","/usr/share/salt-server/py"]) 
18
19_esfr=None
20_esprod=None
21for _arg in sys.argv:
22  if _arg[0:2]=="-x":
23    _ppath=eval(_arg[2:])
24    for _pp in _ppath:
25      sys.path.append(os.path.abspath(_pp))
26  elif _arg[0:5]=="-frno":
27    _esfr=False
28  elif _arg[0:5]=="-frsi":
29    _esfr=True
30  elif _arg[0:8]=="-fprodno":
31    _esprod=False
32   
33import time
34import socket
35import threading
36import bsddb
37import pickle
38import stat
39
40import sltgl
41import sltgen
42import sltslt
43import sltsalt
44import slttrad
45import sltcorr
46import sltloc
47import slttrad2
48import slttradi
49import slttrad2i
50import sltutil
51import vbfunctions
52
53#Constantes que identifican la versión
54sltversion="4.1.49"
55#sltdate=time.localtime(os.path.getctime(os.path.abspath(__file__)))
56
57#Constante que indica si se trata de una versión de producción (True) o debug (False)
58esprod=True
59if _esprod!=None:
60  esprod=_esprod
61if not esprod:
62  sltgl.dbg=True
63  #sltgl.es_srv_a=False
64  #sltgl.es_popen=False
65
66#Constante que indica si hay que realizar la pasada de traducción por frases
67esfr=True
68if _esfr!=None:
69  esfr=_esfr
70
71#Constantes que definen la estructura de cada elemento de colTx
72tx_paltext=0
73tx_nordori=1
74tx_carfinpal=2
75tx_italica=3
76tx_italicaori=4
77class infopal:
78  def __init__(self):
79    self.paltext = vbfunctions.String()
80    self.paldic = vbfunctions.String()
81    self.pre = vbfunctions.String()
82    self.sepsil = vbfunctions.Integer()
83    self.pal1 = vbfunctions.String()
84    self.pal2 = vbfunctions.String()
85    self.tipopost = vbfunctions.Integer()
86    self.post = vbfunctions.String()
87    self.xi = vbfunctions.Integer()
88    self.tipoletra = vbfunctions.Integer()
89    self.signopunt = vbfunctions.Integer()
90    self.postsignopunt = vbfunctions.Integer()
91    self.carfinpal = vbfunctions.String()
92    self.italica = vbfunctions.Integer()
93    self.italicaori = vbfunctions.Integer()
94    self.palori = vbfunctions.String()
95    self.nordori = vbfunctions.Long()
96    self.ipaldu = vbfunctions.Long()
97
98def ini():
99  global Trad,Corr,Trad2i,VerModalidad_,OpConfigCargar
100  Trad=slttrad.Trad
101  Corr=sltcorr.Corr
102  Trad2i=slttrad2i.Trad2i
103  VerModalidad_=sltslt.VerModalidad_
104  OpConfigCargar=sltslt.OpConfigCargar
105  global RSet,ByRef,InStr,Trim
106  RSet=sltgen.RSet
107  ByRef=sltgen.ByRef
108  InStr=sltgen.InStr
109  Trim=sltgen.Trim
110  global AbrirBd,BdClone,CerrarBd,PalTextIni,DamePalabra,Palabra,NumEnLista,MsgPrint
111  AbrirBd=sltgen.AbrirBd
112  BdClone=sltgen.BdClone
113  CerrarBd=sltgen.CerrarBd
114  PalTextIni=sltgen.PalTextIni
115  DamePalabra=sltgen.DamePalabra
116  Palabra=sltgen.Palabra
117  NumEnLista=sltgen.NumEnLista
118  MsgPrint=sltgen.MsgPrint
119  #global infopal
120  #infopal=sltsalt.sltsalt.infopal
121
122def Unpicklar(datos):
123  #Obtener la estructura de datos según el comando
124  #La función devuelve el comando como una tupla (comando,subcomandos)
125  #.. y también actualiza variables globales
126  com,masdatos=eval(datos)
127  if com=='trad' or com=='tradi' or com=='corr' or com=='rev' or com=='revi':
128    lsTx,sltgl.lspals.colPalDu=masdatos
129    sltgl.lspals.colTx=[]
130    for tx in lsTx:
131      paltx=infopal()
132      paltx.paltext=tx[tx_paltext]
133      paltx.palori=tx[tx_paltext]
134      paltx.nordori=tx[tx_nordori]
135      paltx.carfinpal=tx[tx_carfinpal]
136      paltx.italica=tx[tx_italica]
137      paltx.italicaori=tx[tx_italicaori]
138      sltgl.lspals.InfCompl(paltx)
139      sltgl.lspals.colTx.append(paltx)
140    return (com,None)
141  elif com=='txtrad' or com=='txtradi' or com=='txcorr':
142    txt,sltgl.lspals.colPalDu=masdatos
143    sltgl.lspals.colTx=[]
144    lsTx=TxtaLista(txt)
145    for tx in lsTx:
146      paltx=infopal()
147      paltx.paltext=tx[tx_paltext]
148      paltx.palori=tx[tx_paltext]
149      paltx.nordori=tx[tx_nordori]
150      paltx.carfinpal=tx[tx_carfinpal]
151      paltx.italica=tx[tx_italica]
152      paltx.italicaori=tx[tx_italicaori]
153      sltgl.lspals.InfCompl(paltx)
154      sltgl.lspals.colTx.append(paltx)
155    return (com,None)
156  else:
157    return (com,masdatos)
158
159def Unpicklar1(datos):
160  #Unpiclar la información recibida
161  #Entrada: datos: Cadena recibida
162  #Retorno: (comando,masdatos) masdatos es el resto de la información según sea el comando
163  return eval(datos)
164
165def Unpicklar2(com,masdatos):
166  #Unpiclar la información recibida
167  #Entrada: com: Comando recibido
168  #         masdatos: (colTx,colPalDu) es el resto de la información que
169  #                   hay que guardar en variables globales (en el caso de comandos tipo trad)
170  sltgl.lspals.ipa=0
171  if com=='trad' or com=='tradi' or com=='corr' or com=='rev' or com=='revi':
172    lsTx,sltgl.lspals.colPalDu=masdatos
173    sltgl.lspals.colTx=[]
174    for tx in lsTx:
175      paltx=infopal()
176      paltx.paltext=tx[tx_paltext]
177      paltx.palori=tx[tx_paltext]
178      paltx.nordori=tx[tx_nordori]
179      paltx.carfinpal=tx[tx_carfinpal]
180      paltx.italica=tx[tx_italica]
181      paltx.italicaori=tx[tx_italicaori]
182      sltgl.lspals.InfCompl(paltx)
183      sltgl.lspals.colTx.append(paltx)
184  elif com=='txtrad' or com=='txtradi' or com=='txcorr':
185    txt,sltgl.lspals.colPalDu=masdatos
186    sltgl.lspals.colTx=[]
187    lsTx=TxtaLista(txt)
188    for tx in lsTx:
189      paltx=infopal()
190      paltx.paltext=tx[tx_paltext]
191      paltx.palori=tx[tx_paltext]
192      paltx.nordori=tx[tx_nordori]
193      paltx.carfinpal=tx[tx_carfinpal]
194      paltx.italica=tx[tx_italica]
195      paltx.italicaori=tx[tx_italicaori]
196      sltgl.lspals.InfCompl(paltx)
197      sltgl.lspals.colTx.append(paltx)
198 
199def Picklar(com,masdatos):
200  #Componer según comando
201  if com=='trad' or com=='tradi' or com=='corr' or com=='rev' or com=='revi' or com=='void':
202    #Afinar palabras dudosas
203    for m in sltgl.lspals.colPalDu.keys():
204      i=m
205      if i>len(sltgl.lspals.colTx)-1:
206        i=len(sltgl.lspals.colTx)-1
207      #if sltgl.lspals.colPalDu[m]['Clave']!=sltgl.lspals.colTx[i].paldic:
208      if sltgl.lspals.colPalDu[m]['Clave']!=sltgl.lspals.colTx[i].paltext:
209        #Hay que afinar
210        n=sltgl.lspals.colPalDu[m]['Clave'].count(' ')+1
211        k=-1
212        for j in range(-2,2):
213          if i+j>=0 and i+j+n-1<len(sltgl.lspals.colTx):
214            pal=paldic=""
215            for jj in range(n):
216              pal=pal+" "+sltgl.lspals.colTx[i+j+jj].paltext
217              paldic=paldic+" "+sltgl.lspals.colTx[i+j+jj].paldic
218            pal=pal.strip()
219            paldic=paldic.strip()
220            if sltgl.lspals.colPalDu[m]['Clave']==pal or sltgl.lspals.colPalDu[m]['Clave']==paldic:
221              k=i+j
222              break
223        if k>-1 and k!=m:
224          #Se ha encontrado una palabra que coincide
225          sltgl.lspals.colPalDu[k]=sltgl.lspals.colPalDu[m]
226          sltgl.lspals.colPalDu[k]['pos']=k
227          del sltgl.lspals.colPalDu[m]
228        elif k==-1:
229          #No se ha encontrado una palabra que coincida
230          del sltgl.lspals.colPalDu[m]
231
232    #Componer lista de palabras
233    lsTx=[]
234    for paltx in sltgl.lspals.colTx:
235      tx=(paltx.paltext,paltx.nordori,paltx.carfinpal,paltx.italica,paltx.italicaori)
236      lsTx.append(tx)
237    datos=str((com,(lsTx,sltgl.lspals.colPalDu)))
238  elif com=='txtrad' or com=='txtradi' or com=='txcorr':
239    for m in sltgl.lspals.colPalDu.keys():
240      newkey=sltgl.lspals.colPalDu[m]['Clave']+"_("+str(m)+")"
241      sltgl.lspals.colPalDu[newkey]=sltgl.lspals.colPalDu[m]
242      del sltgl.lspals.colPalDu[m]
243   
244    #Componer lista de palabras
245    lsTx=[]
246    for paltx in sltgl.lspals.colTx:
247      tx=(paltx.paltext,paltx.nordori,paltx.carfinpal,paltx.italica,paltx.italicaori)
248      lsTx.append(tx)
249    txt=ListaaTxt(lsTx)
250    datos=str((com,(txt,sltgl.lspals.colPalDu)))
251  else:
252    datos=str((com,masdatos))
253  return datos
254
255def Picklar1(com,masdatos):
256  #Obtener la cadena de respuesta
257  #Entrada: com: comando
258  #         masdatos: información adicional
259  #Retorno: Cadena de respuesta
260  return str((com,masdatos))
261
262def Picklar2(com):
263  #Obtener información adicional a partir de las variables globales en caso de comandos tipo trad
264  #Entrada: com: Comando
265  #Retorno: (colTx,colPalDu) a partir de información en memoria
266  if com=='trad' or com=='tradi' or com=='corr' or com=='rev' or com=='revi' or com=='void':
267    #Afinar palabras dudosas
268    for m in sltgl.lspals.colPalDu.keys():
269      i=m
270      if i>len(sltgl.lspals.colTx)-1:
271        i=len(sltgl.lspals.colTx)-1
272      #if sltgl.lspals.colPalDu[m]['Clave']!=sltgl.lspals.colTx[i].paldic:
273      if sltgl.lspals.colPalDu[m]['Clave']!=sltgl.lspals.colTx[i].paltext:
274        #Hay que afinar
275        n=sltgl.lspals.colPalDu[m]['Clave'].count(' ')+1
276        k=-1
277        for j in range(-2,2):
278          if i+j>=0 and i+j+n-1<len(sltgl.lspals.colTx):
279            pal=paldic=""
280            for jj in range(n):
281              pal=pal+" "+sltgl.lspals.colTx[i+j+jj].paltext
282              paldic=paldic+" "+sltgl.lspals.colTx[i+j+jj].paldic
283            pal=pal.strip()
284            paldic=paldic.strip()
285            if sltgl.lspals.colPalDu[m]['Clave']==pal or sltgl.lspals.colPalDu[m]['Clave']==paldic:
286              k=i+j
287              break
288        if k>-1 and k!=m:
289          #Se ha encontrado una palabra que coincide
290          sltgl.lspals.colPalDu[k]=sltgl.lspals.colPalDu[m]
291          sltgl.lspals.colPalDu[k]['pos']=k
292          del sltgl.lspals.colPalDu[m]
293        elif k==-1:
294          #No se ha encontrado una palabra que coincida
295          del sltgl.lspals.colPalDu[m]
296
297    #Componer lista de palabras
298    lsTx=[]
299    for paltx in sltgl.lspals.colTx:
300      tx=(paltx.paltext,paltx.nordori,paltx.carfinpal,paltx.italica,paltx.italicaori)
301      lsTx.append(tx)
302    return (lsTx,sltgl.lspals.colPalDu)
303  elif com=='txtrad' or com=='txtradi' or com=='txcorr':
304    for m in sltgl.lspals.colPalDu.keys():
305      newkey=sltgl.lspals.colPalDu[m]['Clave']+"_("+str(m)+")"
306      sltgl.lspals.colPalDu[newkey]=sltgl.lspals.colPalDu[m]
307      del sltgl.lspals.colPalDu[m]
308   
309    #Componer lista de palabras
310    lsTx=[]
311    for paltx in sltgl.lspals.colTx:
312      tx=(paltx.paltext,paltx.nordori,paltx.carfinpal,paltx.italica,paltx.italicaori)
313      lsTx.append(tx)
314    txt=ListaaTxt(lsTx)
315    return (txt,sltgl.lspals.colPalDu)
316 
317def TxtaLista(txt):
318  #Obtener lista de palabras a partir de un texto
319  #Entrada: Texto a pasar a lista
320  #Retorno: Lista de palabras del texto
321  colTx=[]
322  lspals=txt.split()
323  i=0
324  for pal in lspals:
325    if ",;:.?!".find(pal[-1])>-1:
326      p1=pal[0:-1]
327      s=pal[-1]
328      p2=s
329    elif "¿¡".find(pal[0])>-1:
330      p1=pal[0]
331      s=pal[0]
332      p2=pal[1:]
333    else:
334      p1=pal
335      s=" "
336      p2=""
337    txpal=(p1,i,s,0,0)
338    colTx.append(txpal)
339    i=i+1
340    if p2!="":
341      txpal=(p2,i," ",0,0)
342      colTx.append(txpal)
343      i=i+1
344  return colTx
345
346def ListaaTxt(colTx):
347  #Convertir lista de palabras a texto
348  #Entrada: colTx: Lista de palabras
349  #Retorno: texto correspondiente a colTx
350  txt=""
351  for e in colTx:
352    if txt!="" and e[0]!="." and e[0]!="," and e[0]!=";" and e[0]!=":" and e[0]!="?" and e[0]!="!":
353      txt=txt+" "
354    txt=txt+e[0]
355  return txt
356 
357def Escuchar():
358  #Crear socket y escuchar peticiones
359  #Mensajes: (comando,lspals,ls_paldu)
360  #tf=0
361  ds=None
362  sck=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
363  sck.bind(('',sltgl.port_mio))
364  sck.listen(1)
365  while True:
366    try:
367      if sltgl.dbg:
368        print sltgl.port_mio,"esperant conexió"
369      con,adr=sck.accept()
370      if sltgl.dbg:
371        print sltgl.port_mio,"conectat:",con,adr
372      if sltgl.es_srv_a and esprod:
373        if sltgl.es_popen:
374          if esprod:
375            t=threading.Thread(target=Pasarelap,args=(con,adr))
376            t.start()
377          else:
378            Pasarelap(con,adr)
379        else:
380          if esprod:
381            t=threading.Thread(target=Pasarela,args=(con,adr))
382            t.start()
383          else:
384            Pasarela(con,adr)       
385      else:
386        if esprod:
387          t=threading.Thread(target=Pasarelai,args=(con,adr))
388          t.start()
389        else:
390          Pasarelai(con,adr)
391      #tff=time.clock()
392      if sltgl.dbg:
393        print sltgl.port_mio,"desconectat" #,". Total(sec):",tff-tii
394    except:
395      sck.close()
396      if sltgl.dbg:
397        print sltgl.port_mio,"Error:",sys.exc_info()[0]
398      raise
399
400def Escucharp():
401  #Escuchar peticiones desde pipe
402  #Mensajes: (comando,lspals,ls_paldu)
403  #tf=0
404  while True:
405    ds=None
406    datos=Procesar(datos=sys.stdin.readline().rstrip('\n'))
407    sys.stdout.write(datos+'\n')
408    sys.stdout.flush()
409  sys.exit()
410
411def Procesar(datos):
412  #Procesar comandos recibidos
413  #Entrada: datos: cadena de comandos recibida
414  #Retorno: cadena de comandos procesada
415  #tii=time.clock()
416  yo=threading.currentThread().getName()+">"
417  ds=None
418  while True:
419    if not datos:
420      if sltgl.dbg:
421        print yo,"sense dades"
422      break
423    #comando,sltgl.lspals.colTx,sltgl.lspals.colPalDu=cPickle.loads(datos)
424    comando,masdatos=Unpicklar1(datos)
425    sltgl._t={9:0,0:0,1:0,2:0,3:0,4:0}
426    ti=time.clock()
427    if sltgl.dbg:
428      print "--------"+yo+"petició: --------"
429      print comando,len(datos),datos #," te:",ti-tf," ve:",(len(sltgl.lspals.colTx))/(ti-tf)
430    sltgl.lspals.ipa=0
431    sltgl.papalerr=""
432    #tii=time.clock()
433    if comando=="trad" or comando=="tradi" or comando=="txtrad" or comando=="txtradi":
434      #Trad directa o inversa
435      if comando=="tradi" or comando=="txtradi":
436        dtr=sltgl.dtrvalcas
437      else:
438        dtr=sltgl.dtrcasval
439             
440      ##A los elementos de colTx no se les ha pasaado InfCompl()
441      #for paltx in sltgl.lspals.colTx:
442        #sltgl.lspals.InfCompl(paltx)
443             
444      #Traducir del castellano al valenciano
445      BdClone(dtr)
446      sltgl.ctvnivel=sltgl.CTV_QUALITAT
447      sltgl.npaldesco=0
448      if esfr:
449        fr.BdClone(dtr)
450        fr.comactual=comando #Guardar comando recibido
451        masdatos=fr.Traduce(dtr,masdatos[0])
452      else:
453        sltgl.lspals.Unpicklar2(comando,masdatos)
454        Trad()
455        masdatos=sltgl.lspals.Picklar2(comando)
456     
457      #Ver es frase o párrafo en idioma <> origen
458      #npaltot=len(sltgl.lspals.colTx)
459      npaltot=len(masdatos[0])
460      if npaltot==0:
461        npaltot=1
462      if sltgl.npaldesco*100/npaltot>sltgl.void_percent and npaltot>sltgl.void_npalmin:
463        comando="void"
464    elif comando=="corr" or comando=="txcorr":
465      Unpicklar2(comando,masdatos)
466      #Corrección
467      dtr=sltgl.dtrcasval
468             
469      ##A los elementos de colTx no se les ha pasaado InfCompl()
470      #for paltx in sltgl.lspals.colTx:
471        #sltgl.lspals.InfCompl(paltx)
472             
473      #Corregir valenciano
474      BdClone(dtr)
475      sltgl.ctvnivel=sltgl.CTV_QUALITAT
476      Corr()
477      masdatos=Picklar2(comando)
478    elif comando=="rev" or comando=="revi":
479      Unpicklar2(comando,masdatos)
480      #Trad directa o inversa
481      if comando=="revi":
482        dtr=sltgl.dtrvalcas
483      else:
484        dtr=sltgl.dtrcasval
485             
486      ##A los elementos de colTx no se les ha pasaado InfCompl()
487      #for paltx in sltgl.lspals.colTx:
488        #sltgl.lspals.InfCompl(paltx)
489             
490      #Revisar
491      BdClone(dtr)
492      sltgl.enrevisio=True
493      _optma=sltgl.optma
494      sltgl.optma=False
495      if comando=="revi":
496        Trad2i()
497      else:
498        Corr()
499      sltgl.optma=_optma
500      sltgl.enrevisio=False
501      masdatos=Picklar2(comando)
502    elif comando == "void":
503      pass
504    elif comando == "verbs":
505      inf,cv,lsvbs=masdatos
506      if lsvbs!=[]:
507        sltutil.tmpVerbs(lsvbs)
508      lsvbs=sltutil.Verb(inf,cv)
509      masdatos=(inf,cv,lsvbs)
510    elif comando == "dicsalt":
511      lema,tl,tmp=masdatos
512      sltutil.tmpDicSalt(tmp)
513      if not isinstance(ds,sltutil.DicSalt):
514        ds=sltutil.DicSalt()
515      if lema=="_lista":
516        tmp=ds.Lista(tl)
517        # Patch for Sovietic Solution
518        import shutil
519        old_file_dicsalt="/usr/share/salt-old-files/tmpdsa"
520        shutil.copyfile(old_file_dicsalt,tmp)
521      else:
522        tmp=ds.Seek(lema)
523      masdatos=(lema,tl,tmp)
524    elif comando == "dicbil":
525      lema,tl,tmp=masdatos
526      sltutil.tmpDicBil(tmp)
527      if not isinstance(ds,sltutil.DicBil):
528        ds=sltutil.DicBil()
529      if lema=="_lista":
530        tmp=ds.Lista(tl)
531        # Patch for Sovietic Solution
532        import shutil
533        old_file_dicsalt="/usr/share/salt-old-files/tmpdsb"
534        shutil.copyfile(old_file_dicsalt,tmp)
535      else:
536        tmp=ds.Seek(lema,tl)
537      masdatos=(lema,tl,tmp)
538    elif comando == "cfgload":
539      #Obtener fichero de configuración del servidor
540      masdatos=sltslt.ConfigLoad()
541    elif comando == "cfgsave":
542      #Guardar información de configuración
543      sltslt.ConfigSave(masdatos)
544      #Cargar en memoria
545      sltslt.OpConfigCargar()
546      masdatos=""
547    elif comando == "vers":
548      masdatos="Salt "+sltversion+" "+str(sltDate())+" "+str(esprod)+" "+str(esfr)
549    elif comando == "credits":
550      masdatos=sltslt.Credits()
551    elif comando == "eixir":
552      sys.exit(0)
553           
554    #Respuesta
555    #datos=cPickle.dumps((comando,sltgl.lspals.colTx,sltgl.lspals.colPalDu))
556    datos=Picklar1(comando,masdatos)
557    tf=time.clock()
558    if sltgl.dbg:
559      if tf==ti:
560        tf=ti+0.000001
561      print "-------"+yo+"resposta: --------"
562      print comando,len(datos),len(sltgl.locpals),len(sltgl.colval),datos," tr:",tf-ti," v:",(len(sltgl.lspals.colTx))/(tf-ti) #,sltgl._t,len(sltgl.locpals),len(sltgl.colval)
563      _npfr,_npstd=fr.npalfr,fr.npalstd
564      _nptot=_npfr+_npstd
565      if _nptot>0:
566        print "** Frases: %.2f %% ; Standard: %.2f %%" %(_npfr*100/_nptot,_npstd*100/_nptot)
567    return datos
568 
569def Procesar_copia(datos):
570  #Procesar comandos recibidos
571  #Entrada: datos: cadena de comandos recibida
572  #Retorno: cadena de comandos procesada
573  #tii=time.clock()
574  yo=threading.currentThread().getName()+">"
575  ds=None
576  while True:
577    if not datos:
578      if sltgl.dbg:
579        print yo,"sense dades"
580      break
581    #comando,sltgl.lspals.colTx,sltgl.lspals.colPalDu=cPickle.loads(datos)
582    comando,masdatos=Unpicklar(datos)
583    sltgl._t={9:0,0:0,1:0,2:0,3:0,4:0}
584    ti=time.clock()
585    if sltgl.dbg:
586      print "--------"+yo+"petició: --------"
587      print comando,len(datos),datos #," te:",ti-tf," ve:",(len(sltgl.lspals.colTx))/(ti-tf)
588    sltgl.lspals.ipa=0
589    sltgl.papalerr=""
590    #tii=time.clock()
591    if comando=="trad" or comando=="tradi" or comando=="txtrad" or comando=="txtradi":
592      #Trad directa o inversa
593      if comando=="tradi" or comando=="txtradi":
594        dtr=sltgl.dtrvalcas
595      else:
596        dtr=sltgl.dtrcasval
597             
598      ##A los elementos de colTx no se les ha pasaado InfCompl()
599      #for paltx in sltgl.lspals.colTx:
600        #sltgl.lspals.InfCompl(paltx)
601             
602      #Traducir del castellano al valenciano
603      BdClone(dtr)
604      sltgl.ctvnivel=sltgl.CTV_QUALITAT
605      sltgl.npaldesco=0
606      Trad()
607     
608      #Ver es frase o párrafo en idioma <> origen
609      npaltot=len(sltgl.lspals.colTx)
610      if npaltot==0:
611        npaltot=1
612      if sltgl.npaldesco*100/npaltot>sltgl.void_percent and npaltot>sltgl.void_npalmin:
613        comando="void"
614    elif comando=="corr" or comando=="txcorr":
615      #Corrección
616      dtr=sltgl.dtrcasval
617             
618      ##A los elementos de colTx no se les ha pasaado InfCompl()
619      #for paltx in sltgl.lspals.colTx:
620        #sltgl.lspals.InfCompl(paltx)
621             
622      #Corregir valenciano
623      BdClone(dtr)
624      sltgl.ctvnivel=sltgl.CTV_QUALITAT
625      Corr()
626    elif comando=="rev" or comando=="revi":
627      #Trad directa o inversa
628      if comando=="revi":
629        dtr=sltgl.dtrvalcas
630      else:
631        dtr=sltgl.dtrcasval
632             
633      ##A los elementos de colTx no se les ha pasaado InfCompl()
634      #for paltx in sltgl.lspals.colTx:
635        #sltgl.lspals.InfCompl(paltx)
636             
637      #Revisar
638      BdClone(dtr)
639      sltgl.enrevisio=True
640      _optma=sltgl.optma
641      sltgl.optma=False
642      if comando=="revi":
643        Trad2i()
644      else:
645        Corr()
646      sltgl.optma=_optma
647      sltgl.enrevisio=False
648    elif comando == "void":
649      pass
650    elif comando == "verbs":
651      inf,cv,lsvbs=masdatos
652      if lsvbs!=[]:
653        sltutil.tmpVerbs(lsvbs)
654      lsvbs=sltutil.Verb(inf,cv)
655      masdatos=(inf,cv,lsvbs)
656    elif comando == "dicsalt":
657      lema,tl,tmp=masdatos
658      sltutil.tmpDicSalt(tmp)
659      if not isinstance(ds,sltutil.DicSalt):
660        ds=sltutil.DicSalt()
661      if lema=="_lista":
662        tmp=ds.Lista(tl)
663      else:
664        tmp=ds.Seek(lema)
665      masdatos=(lema,tl,tmp)
666    elif comando == "dicbil":
667      lema,tl,tmp=masdatos
668      sltutil.tmpDicBil(tmp)
669      if not isinstance(ds,sltutil.DicBil):
670        ds=sltutil.DicBil()
671      if lema=="_lista":
672        tmp=ds.Lista(tl)
673      else:
674        tmp=ds.Seek(lema,tl)
675      masdatos=(lema,tl,tmp)
676    elif comando == "cfgload":
677      #Obtener fichero de configuración del servidor
678      masdatos=sltslt.ConfigLoad()
679    elif comando == "cfgsave":
680      #Guardar información de configuración
681      sltslt.ConfigSave(masdatos)
682      #Cargar en memoria
683      sltslt.OpConfigCargar()
684      masdatos=""
685    elif comando == "vers":
686      masdatos="Salt "+sltversion+" "+str(sltDate())+" "+str(esprod)+" "+str(esfr)
687    elif comando == "credits":
688      masdatos=sltslt.Credits()
689    elif comando == "eixir":
690      sys.exit(0)
691           
692    #Respuesta
693    #datos=cPickle.dumps((comando,sltgl.lspals.colTx,sltgl.lspals.colPalDu))
694    datos=Picklar(comando,masdatos)
695    tf=time.clock()
696    if sltgl.dbg:
697      if tf==ti:
698        tf=ti+0.000001
699      print "-------"+yo+"resposta: --------"
700      print comando,len(datos),len(sltgl.locpals),len(sltgl.colval),datos," tr:",tf-ti," v:",(len(sltgl.lspals.colTx))/(tf-ti) #,sltgl._t,len(sltgl.locpals),len(sltgl.colval)
701    return datos
702
703def sltDate():
704  #Fecha de la aplicación
705  ultfecha=fecha=None
706  if os.path.exists(os.path.abspath(sltgl.miPath+"/sltsrv.exe")):
707    return time.localtime(os.stat(os.path.abspath(sltgl.miPath+"/sltsrv.exe"))[8])
708  elif os.path.exists(os.path.abspath(sltgl.miPath+"/sltsrv.py")):
709    return time.localtime(os.stat(os.path.abspath(sltgl.miPath+"/sltsrv.py"))[8])
710  else:
711    for dp,dns,fns in os.walk(os.path.abspath(sltgl.miPath)):
712      for fn in fns:
713        if fn[-4:]==".pyc" or fn[-3:]==".py":
714          fecha=time.localtime(os.stat(os.path.abspath(dp+"/"+fn))[8])
715          if ultfecha==None:
716            ultfecha=fecha
717          elif fecha > ultfecha:
718            ultfecha=fecha
719      break
720    return fecha
721
722def DameServer():
723  #Obtener el primer servidor libre de la lista
724  #Retorno: sck: Socket del servidor
725  sck=None
726  yo=threading.currentThread().getName()
727  port=0
728  sltgl.lck.acquire()
729  if sltgl.dbg:
730    print sltgl.port_mio,"server?",sltgl.port_lst
731  LimpiaServer()
732  for  srv in sltgl.port_lst:
733    if srv[0]:
734      #Esta libre
735      port=srv[1]
736      srv[0]=False
737      srv[2]=yo
738      break
739   
740  if port==0:
741    #No quedan servidores: añadir otro
742    if len(sltgl.port_lst)>0:
743      port=srv[1]+1
744    else:
745      port=sltgl.port_ini
746    #Antes de añadirlo comprobar si ya esta escuchando
747    sck=Conectar(port)
748    if sck==None:
749      #No escucha: iniciar server
750      sltsrvexe=sys.executable
751      sltsrvargs=sys.argv
752      if sltsrvargs[0]!=sltsrvexe:
753        sltsrvargs=[sltsrvexe]+sltsrvargs
754      sltsrvargs.append("-n"+repr(port))
755      if sltgl.esLinux:
756        modo=os.P_NOWAIT
757      else:
758        modo=os.P_DETACH
759      #sltsrvargs.append("-t") #añadir para trace en disco
760      os.spawnve(modo,sltsrvexe,sltsrvargs,os.environ)
761      #str=argsAString(sltsrvargs)
762      #w=os.popen(str,"w")
763      #w=os.popen("c:\salt4\sltsrv_n -n"+repr(port))
764   
765    #Añadir a la lista
766    sltgl.port_lst.append([False,port,yo])
767   
768  if sltgl.dbg:
769    print sltgl.port_mio,"server:",sltgl.port_lst
770   
771  sltgl.lck.release()
772 
773  #Obtener socket
774  sck=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
775  while sck.connect_ex(('localhost',port)) !=0:
776    time.sleep(0.1)
777 
778  return sck
779
780def DameServerp():
781  #Obtener el primer servidor libre de la lista
782  #Retorno: w,r: File objects para escribir y leer
783  w,r=None,None # TODO
784  yo=threading.currentThread().getName()
785  #1. Buscar uno libre
786  sltgl.lck.acquire()
787  for srv in srv_lst:
788    if srv[_srvlibre]:
789      srv[_srvlibre]=False
790      srv[_srvowner]=yo
791      w=srv[_srvw]
792      r=srv[_srvr]
793      sltgl.lck.release()
794      return w,r
795
796  #2. Si no hay libres iniciar otro
797  sltsrvexe=sys.executable
798  sltsrvargs=sys.argv
799  if sltsrvargs[0]!=sltsrvexe:
800    sltsrvargs=[sltsrvexe]+sltsrvargs
801  sltsrvargs.append("-s")
802  sltsrvcmd=""
803  for arg in sltsrvargs:
804    _arg=arg
805    if _arg.find(" ")!=-1:
806      _arg='"'+_arg+'"'
807    sltsrvcmd=sltsrvcmd+" "+_arg
808  sltsrvcmd=sltsrvcmd.strip()
809  w,r=os.popen4(sltsrvcmd)
810
811  srv_lst.append([False,yo,w,r,time.clock()])
812  sltgl.lck.release()
813  return w,r
814   
815def Conectar(port):
816  #Conectar con socket pot port
817  #Retorno: sck=socket
818  try:
819    sck=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
820    sck.connect(('localhost',port))
821  except:
822    sck=None
823 
824  return sck
825
826def LimpiaServer():
827  #Liberar servers que no se usen
828  _tmax=10 #Minutos sin uso para cerrar
829  if sltgl._ini.Existe("sltsrv","tclose"):
830    _tmax=sltgl._ini("sltsrv","tclose")
831  while True:
832    time.sleep(_tmax*60)
833    sltgl.lck.acquire()
834    tactual=time.clock()
835    for srv in srv_lst:
836      if srv[_srvlibre]:
837        #Server libre ...
838        if tactual-srv[_srvultuso]>_tmax*60:
839          #... sin uso más de _tmax
840          if sltgl.dbg:
841            print "Closing",srv
842          srv[_srvw].close()
843          srv[_srvr].close()
844          srv_lst.remove(srv)
845   
846    if sltgl.dbg:
847      print "Servers",srv_lst
848     
849    sltgl.lck.release()     
850 
851def Pasarela(con,adr):
852  #Pasar la petición a otro server
853  #1. Obtener server
854  sck=DameServer()
855  n=5
856  while sck==None:
857    time.sleep(0.1)
858    sck=DameServer()
859    n=n-1
860    if n<=0:
861      ReleaseServer()
862      con.close()
863      return
864 
865  #2.Pasar peticiones al otro server
866  yo=threading.currentThread().getName()+">"
867  ds=None
868  while True:
869    if sltgl.dbg:
870      print sltgl.port_mio,yo+"esperant petició"
871    datos=con.recv(128000)
872    if not datos:
873      if sltgl.dbg:
874        print sltgl.port_mio,yo+"sense dades"
875      break
876    if sltgl.dbg:
877      print sltgl.port_mio,"--------"+yo+"petició: --------"
878      print sltgl.port_mio,datos
879   
880    if datos!="info":
881      #Pasar a subserver
882      sck.send(datos)
883      datos=sck.recv(128000)
884    else:
885      #Contestar
886      datos=repr([sltgl.port_mio,yo,sltgl.port_lst])
887   
888    #Contestar a cliente
889    con.send(datos)
890    if sltgl.dbg:
891      print sltgl.port_mio,"-------"+yo+"resposta: --------"
892      print sltgl.port_mio,datos
893  con.close()
894
895  #3. Liberar server
896  ReleaseServer()
897  sck.close()
898
899def Pasarelap(con,adr):
900  #Pasar la petición a otro server (a través de popen)
901  #1. Obtener server
902  w,r=DameServerp()
903  #print threading.currentThread().getName(),w,r
904 
905  #2.Pasar peticiones al otro server
906  try:
907    yo=threading.currentThread().getName()+">"
908    ds=None
909    while True:
910      if sltgl.dbg:
911        print sltgl.port_mio,yo+"esperant petició"
912      #print "recibiendo..."
913      datos=con.recv(128000)
914      #print "recibido"
915      if not datos:
916        if sltgl.dbg:
917          print sltgl.port_mio,yo+"sense dades"
918        break
919      if sltgl.dbg:
920        print sltgl.port_mio,"--------"+yo+"petició: --------"
921        print sltgl.port_mio,datos
922     
923      if datos!="info":
924        #Pasar a subserver
925        w.write(datos+'\n')
926        w.flush()
927        datos=r.readline().rstrip('\n')
928      else:
929        #Contestar
930        datos=repr([sltgl.port_mio,yo,sltgl.port_lst])
931     
932      #Contestar a cliente
933      con.send(datos)
934      if sltgl.dbg:
935        print sltgl.port_mio,"-------"+yo+"resposta: --------"
936        print sltgl.port_mio,datos
937 
938  except:
939    pass
940  con.close()
941  #w.close()
942  #r.close()
943  ReleaseServerp()
944
945def Pasarelai(con,adr):
946  #Simulación de pasarela para resolver las peticiones internamente (en el mismo programa)
947  #Esta función se necesita para poder seguir el programa (dedug)
948  try:
949    yo=threading.currentThread().getName()+">"
950    ds=None
951    while True:
952      if sltgl.dbg:
953        print sltgl.port_mio,yo+"esperant petició"
954      #print "recibiendo..."
955      datos=con.recv(128000)
956      #print "recibido"
957      if not datos:
958        if sltgl.dbg:
959          print sltgl.port_mio,yo+"sense dades"
960        break
961      if sltgl.dbg:
962        print sltgl.port_mio,"--------"+yo+"petició: --------"
963        print sltgl.port_mio,datos
964     
965      if datos!="info":
966        #Resolver petición
967        datos=Procesar(datos)
968      else:
969       #Contestar
970       datos=repr([sltgl.port_mio,yo,sltgl.port_lst])
971     
972      #Contestar a cliente
973      con.send(datos)
974      if sltgl.dbg:
975        print sltgl.port_mio,"-------"+yo+"resposta: --------"
976        print sltgl.port_mio,datos
977 
978  except:
979    pass
980  con.close()
981 
982def Pasarelaw(datos):
983  #Pasar la petición a otro server (a través de popen)
984  #Esta función se usa para web service
985  #Entrada: datos: Datos a enviar al subserver
986  #Retorno: Respuesta para el cliente
987  #1. Obtener server
988  yo=threading.currentThread().getName()+">"
989  t1=time.clock()
990  w,r=DameServerp()
991  t2=time.clock()
992  if sltgl.dbg:
993    print "popen:",t2-t1
994    print yo,"------- petició: --------"
995    print datos
996  #print threading.currentThread().getName(),w,r
997 
998  #2.Pasar peticiones al otro server
999  try:
1000    ds=None
1001    if datos!="info":
1002      #Pasar a subserver
1003      w.write(datos+'\n')
1004      w.flush()
1005      datos=r.readline().rstrip('\n')
1006    else:
1007      #Contestar
1008      datos=repr([yo,srv_lst])
1009     
1010  except:
1011    pass
1012  t3=time.clock()
1013  if sltgl.dbg:
1014    print "Total pasarela:",t3-t1
1015 
1016  #ReleaseServerp()
1017  #w.close()
1018  #r.close()
1019 
1020  #Contestar a cliente
1021  if sltgl.dbg:
1022    print yo,"------- resposta: --------"
1023    print datos
1024  return datos
1025
1026def Recv(con=None):
1027  #Recibir un mensaje de pipe o socket
1028  try:
1029    if con==None:
1030      #pipe
1031      datos=sys.stdin.readline().rstrip('\n')
1032    else:
1033      #socket
1034      datos=con.recv(128000)
1035    return datos
1036  except:
1037    return False
1038
1039def Send(datos,con=None):
1040  #enviar mensaje por pipe o socket
1041  if con==None:
1042    #pipe
1043    sys.stdout.write(datos+'\n')
1044    sys.stdout.flush()
1045  else:
1046    #socket
1047    con.send(datos)
1048
1049def Close(con=None):
1050  if con!=None:
1051    con.close()
1052   
1053def ReleaseServerp():
1054  #Liberar server actual
1055  yo=threading.currentThread().getName()
1056  sltgl.lck.acquire()
1057  for srv in srv_lst:
1058    if srv[_srvowner]==yo:
1059      if sltgl.dbg:
1060        print yo,"rel server:",srv
1061      srv[_srvlibre]=True
1062      srv[_srvowner]=None
1063      srv[_srvultuso]=time.clock()
1064      break
1065  sltgl.lck.release()
1066
1067def argsAString(args):
1068  #Pasar argumentos tipo spawn a string tipo linea de comandos
1069  ret=""
1070  for arg in args:
1071    ret=ret+arg+" "
1072  ret=ret.strip()
1073  return ret
1074
1075# ---------------------------------------------------------
1076# Inicio del programa
1077# ---------------------------------------------------------
1078
1079# Iniciar acceso a funciones
1080ini()
1081
1082#Inicio del programa
1083if sltgl.dbg:
1084  print "**",sys.executable, sys.argv
1085  print threading.currentThread().getName(),"Salt", sltversion, sltDate(), esprod, esfr
1086 
1087#Iniciar acceso a funciones
1088ini()
1089slttrad.ini()
1090sltsalt.ini()
1091sltgen.ini()
1092sltgl.ini()
1093sltloc.ini()
1094sltcorr.ini()
1095slttrad2.ini()
1096slttradi.ini()
1097slttrad2i.ini()
1098
1099#Modalidad de trabajo
1100VerModalidad_()
1101
1102#Abrir las tablas más usuales de la base de datos
1103AbrirBd()
1104
1105#Por defecto castella > valencià
1106BdClone(sltgl.dtrcasval)
1107
1108#Obtener las opciones de configuración
1109OpConfigCargar()
1110
1111#Actualizamos modalidad por si ha habido cambios en OpConfigCargar
1112VerModalidad_()
1113
1114#Marcas devueltas por TEXT.BAS en PalText() !!!!
1115sltgl.marcaapo = chr(19)
1116sltgl.marcaapogui = chr(20)
1117sltgl.marcagui = chr(21)
1118sltgl.marcaxi = chr(22)
1119
1120#Inicializar arrays
1121sltgl.lspals=sltsalt.sltsalt()
1122sltgl.lspals.colPalDu = {}
1123
1124#Borrar diccionario temporal
1125r=RSet(sltgl.bd_temporal_VeuTemporal)
1126r.Clear()
1127r.Close()
1128
1129#Borrar diccionario temporal (traductor)
1130r=RSet(sltgl.bd_temporaltrad_VeuOri)
1131r.Clear()
1132r.Close()
1133
1134#Acceso a frases
1135import sltfr
1136fr=sltfr.Frases()
1137fr.AbrirBd()
1138
1139sltgl.lck=threading.Lock()
1140
1141#Atención: activar psyco en producción
1142if esprod:
1143  try:
1144    import psyco
1145    if sltgl.es_srv_a:
1146      psyco.bind(Escuchar,300)
1147    else:
1148      psyco.bind(Escucharp,300)
1149  except:
1150    pass
1151
1152if sltgl.es_srv_a:
1153  #Acceso a subservers (popen)
1154  srv_lst=[] #Lista de servidores
1155  _srvlibre=0 #Servidor libre Si/No
1156  _srvowner=1 #Nombre del thread que lo está usando
1157  _srvw=2 #pipe de escritura
1158  _srvr=3 #pipe de lectura
1159  _srvultuso=4 #Hora de último uso
1160 
1161  #Thread para cancelar subservers
1162  solouno=True
1163  if esprod and solouno:
1164    solouno=False
1165    tLimpiaServer=threading.Thread(target=LimpiaServer,args=())
1166    tLimpiaServer.start()
1167 
1168  Escuchar()
1169else:
1170  Escucharp()
1171
Note: See TracBrowser for help on using the repository browser.