TiledViz
Loading...
Searching...
No Matches
TileServer.py
1#!python3
2# coding: utf-8
3
4import errno
5import threading, time
6import sys,os,re
7import weakref
8from subprocess import Popen as Popen
9import subprocess as subp
10import shlex
11from operator import itemgetter
12
13import argparse
14
15import traceback
16
17import socket
18
19sys.path.append(os.path.abspath('./connect'))
20from connect import sock
21IdTS=sock.PORTServer+1
22
23import logging
24
25#import code
26# code.interact(local=locals())
27
28DEBUG=False
29TRACE=False
30
31MaxWaitExecute=20
32waitsleep=0.5
33
34
35def parse_args(argv):
36 parser = argparse.ArgumentParser(
37 'TiledViz frontend server to dispatch orders on all tiles of each TileSets on its HPC machine.')
38 parser.add_argument('--debug', action='store_true',
39 help='Debug TileServer messages.',default=DEBUG)
40 parser.add_argument('--trace', action='store_true',
41 help='Debug TileServer with ipdb trace calls.',default=TRACE)
42 parser.add_argument('--idts', default=IdTS,
43 help='WARNING: Do not change this value only if you know what you are doing !! \n'\
44 'Default port for first TiledSet (default: localhost)')
45 parser.add_argument('--maxwaitexecute', default=MaxWaitExecute,
46 help='Number max of seconds waiting for a response for TileServer messages.')
47
48 args = parser.parse_args(argv[1:])
49 return args
50
51
52
53TSthreads={}
54
55# Tile Management
57 def __init__(self, TSserver, TileSetName, id, container, password, TileSetPort):
58 self.TSserver=TSserver
59 self.TileSetName=TileSetName
60 self.Id=id
61 self.ids=(container, password)
62 self.TileSetPort=TileSetPort
63 self.laststate=False
64 self.lastval=255
65 serverLogger.warning("New connection : serveur %s TS %s id %d properties %s ." % (str(self.TSserver),self.TileSetName,self.Id,str(self.ids)))
66
67 def remove(self):
68 serverLogger.warning(f"remove Tile {self.TSserver} {self.TileSetName} {self.Id} {self.ids} {self.TileSetPort} {self.laststate} {self.lastval}")
69 DelCOMMAND=f"nohup bash -c 'PID=$$; Displ=$(head -1 $HOME/.vnc/out_Client* | sed -e \"s&.*:\\([0-9]*\\)&:\\1&\"); '"+\
70 f"'locPORT=$(grep \"ssh -x.*{self.TileSetPort}\" $HOME/.vnc/out_Client* |head -1 |sed -e \"s&.* \\([0-9]*\\):localhost.*&\\1&\") ; '"+\
71 f"'pgrep -f $locPORT |grep -v $PID |xargs kill -9; '"+\
72 f"'pgrep -f \" $Displ \" |grep -v $PID |xargs kill -9; '"+\
73 f"'pgrep -f \"{self.Id}.*{self.TileSetPort}\" |grep -v $PID |xargs kill -9; sleep 1; '"+\
74 f"'rm -rf $HOME/.vnc/*; '"+\
75 f"''"
76 # f"'OUT=$HOME/.vnc/del_$(date +%F_%H-%M-%S); touch $OUT; echo $PID Remove Tile $Displ $locPORT >> $OUT ; '"+\
77 # f"'pgrep -fa $locPORT |grep -v $PID >> $OUT; echo 1 >> $OUT; pgrep -fa \" $Displ \" |grep -v $PID >> $OUT; echo 2 >> $OUT; pgrep -fa \"{self.Id}.*{self.TileSetPort}\" |grep -v $PID >> $OUT ; echo 3 >> $OUT; '"+\
78 # f"'ls -al $HOME/.vnc/* >> $OUT; echo ------ >> $OUT; '"+\
79 # f"'echo 1 >> $OUT; '"+\
80 # f"'echo 2 >> $OUT; '"+\
81 # f"'echo 3 >> $OUT; '"+\
82 # f"'echo 4 >> $OUT; '"+\
83 serverLogger.warning(f"del COMMAND {DelCOMMAND}")
84 self.execute(DelCOMMAND)
85
86 def get_laststate(self):
87 if (self.laststate):
88 return self.lastval
89 else:
90 return False
91
92 def execute(self,command):
93 self.laststate=False
94 ExecuteMsg="execute "+command
95 serverLogger.debug(f"in tile {self.TileSetName} {self.Id} command {ExecuteMsg}")
96 self.TSserver.send_client(self.Id,ExecuteMsg)
97 RET=self.TSserver.get_OK(self.Id)
98 serverLogger.debug(f"in tile {self.TileSetName} {self.Id} command return {RET}")
99 self.lastval=RET
100 self.laststate=True
101
102# TileSet management
103class TilesSet(threading.Thread):
104 _alive = []
105 def __new__(cls, TileSetName, Nb):
106 self = super().__new__(cls)
107 TilesSet._alive.append(self)
108 self.init(TileSetName, Nb)
109 return weakref.proxy(self)
110
111
112 def init(self, TileSetName, Nb):
113 threading.Thread.__init__(self)
114 self.thread = threading.Thread(target=self.run, args=(TileSetName,Nb,))
115 self.thread.start()
116 self.laststate=False
117 self.lastval=255
118
119 def remove(self):
120 serverLogger.warning(f"Remove TileSet {self.TileSetName}, thread {self.thread} and id {self.id}")
121 for tileconnection in self.ListClient:
122 serverLogger.warning(f"Remove tile {tileconnection[0]}")
123 tileconnection[0].remove()
124 del tileconnection
125 serverLogger.warning(f"Remove Thread {TSthreads[self.TileSetName]}")
126 del TSthreads[self.TileSetName]
127 #self.thread.stop()
128 self._alive.remove(self)
129
130 def removeTile(self,Id):
131 serverLogger.warning(f"Remove Tile {Id} in TileSet {self.TileSetName} ( thread {self.thread} and id {self.id} )")
132 i=0
133 for tileconnection in self.ListClient:
134 if(tileconnection[0].Id == Id):
135 serverLogger.warning(f"Remove tile {tileconnection[0]}")
136 tileconnection[0].remove()
137 del tileconnection
138 self.ListClient.pop(i)
139 else:
140 i=i+1
141
142 def run(self, TileSetName, Nb):
143 # Launch TileSet ??
144
145 self.TileSetName=TileSetName
146 self.Nb=Nb
147
148 self.ListClient=[]
149 self.ClientNotReady=True
150 self.TileJson=[]
151 self.TileSetPort=0
152 self.laststate=False
153
154 TSthreads[TileSetName]=self.thread
155
156 self.lock = threading.Lock()
157 global IdTS
158 self.lock.acquire()
159 IdTS=IdTS+1
160 self.id=IdTS-sock.PORTServer
161 self.lock.release()
162 # detect a free port here
163 s=socket.socket()
164 s.bind(("", 0))
165 self.TileSetPort=int(s.getsockname()[1])
166 s.close()
167
168 serverLogger.warning("for TileSet "+TileSetName
169 +" TSthreads is modified with thread "+str(self.thread)
170 +" and id "+str(self.id))
171 serverLogger.warning("Port "+str(self.TileSetPort)+" for TileSet "+TileSetName+".")
172 try:
174 TSconnect=self.TSconnect
175 except OSError as oserror:
176 logging.error("Error with connection to TileSet "+TileSetName+" and PORT "+str(self.TileSetPort)+" : "+str(oserror))
177 return False
178
179 count=0
180 while count < self.Nb:
181 id=count+1
182 serverLogger.warning( "TileSet "+self.TileSetName
183 +" with "+str(self.Nb)
184 +" tiles id "+str(id)
185 +" Listening to clients ...")
186 TSconnect.new_connect(id)
187
188 try:
189 while True:
190 data = TSconnect.recv(id)
191 if not data: break
192 # Send back Hello message
193 serverLogger.info("Hello from tile "+data)
194 TSconnect.send_client(id,data)
195
196 # Get id and password from tile
197 data = TSconnect.recv(id)
198 if not data: break
199 serverLogger.debug("msg password "+data)
200 (container, password) = data.split(':')
201
202 # Get back error for each send ?
203 thisTile=TileConnection(TSconnect, TileSetName, id, container, password, self.TileSetPort)
204 self.ListClient.append((thisTile, self, TileSetName, id, container, password))
205 # Get Tile properties + password !!
206 # thisTile.properties()
207 serverLogger.warning( "TileSet "+self.TileSetName
208 +" tile "+str(id)+" over "+str(self.Nb)
209 +" container %s password %s " % (str(container), str(password)))
210 break
211 except Exception as err:
212 serverLogger.error("Exception with list of tiles : "+str(err))
213 traceback.print_exc(file=sys.stderr)
214
215 # TODO : Timer to break after n sec for last tiles not started ?
216 # self.ListClient already contained started tiles.
217
218 count=count+1
219
220 serverLogger.warning("All socket opened for "+self.TileSetName+" : "+str(len(self.ListClient)))
221
222 # Sort clients by container IDs :
223 if ( self.Nb > 2 ):
224 self.ListClient=sorted(self.ListClient,key=itemgetter(4))
225
226 self.ClientNotReady=False
227
228 serverLogger.warning("All client sorted for %s : %d " % (self.TileSetName,len(self.ListClient)))
229
230 def wait_client(self,callfun,command):
231 count=0
232 while(self.ClientNotReady):
233 serverLogger.warning("%d wait for clients. call %s command %s " % (self.id,callfun,command))
234 time.sleep(waitsleep)
235 count=count+1
236 if (count > MaxWaitExecute):
237 serverLogger.error(self.TileSetName+" %d : Wait too much on command %s " % (self.id,command))
238 break
239
240 def execute_all(self,command):
241 serverLogger.warning(self.TileSetName+" : Command on all tiles : "+command)
242 self.wait_client("execute_all",command)
243
244 self.laststate=False
245 # if (len(self.ListClient) == 0):
246 # self.TSconnect.send_OK(self.id,-1)
247 # serverLogger.error("Error calling execute_all : no client yet.")
248 # return False
249
250 if (TRACE):
251 import ipdb; ipdb.set_trace()
252 for (client, TSserver, TSName, id, container, password) in self.ListClient:
253 client.execute(command)
254 outHandler.flush()
255 self.laststate=True
256
257 def get_laststate_execute_all(self):
258 serverLogger.warning(self.TileSetName+" %d : Get state on all tiles." % (self.id))
259 self.wait_client("get_laststate_execute_all","")
260
261 # if (len(self.ListClient) == 0):
262 # self.TSconnect.send_OK(self.id,-1)
263 # serverLogger.error("Error calling get_laststate_execute_all : no client yet.")
264 # return False
265
266 RET=0
267 if (self.laststate):
268 for (client, TSserver, TSName, id, container, password) in self.ListClient:
269 count=0
270 while True:
271 laststate=client.get_laststate()
272 if (type(laststate) == int):
273 RET=RET+laststate
274 break
275 else:
276 time.sleep(waitsleep)
277 count=count+1
278 serverLogger.debug(self.TileSetName+" : Wait for state on all tiles %d." % (count))
279 if (count > MaxWaitExecute):
280 serverLogger.error(self.TileSetName+" : No state on all tiles %d." % (count))
281 RET=-1
282 break
283 serverLogger.warning(self.TileSetName+" : State on all tiles : "+str(RET))
284 return RET
285 else:
286 return False
287
288 def execute_list(self,tilesId,command):
289 serverLogger.warning(self.TileSetName+" : Command on list "+str(tilesId)+" of tiles : "+command)
290 self.wait_client("execute_list",command)
291
292 self.laststate=False
293 # if (len(self.ListClient) == 0):
294 # self.TSconnect.send_OK(self.id,-1)
295 # serverLogger.error("Error calling execute_list : no client yet.")
296 # return False
297
298 if (TRACE):
299 import ipdb; ipdb.set_trace()
300 try:
301 for tileId in tilesId:
302 AllTileId=list(filter(lambda x:tileId in x, self.ListClient))
303 serverLogger.debug(self.TileSetName+" : execute on "+str(tileId)+" in client : "+str(AllTileId))
304 if (len(AllTileId) == 1):
305 (client, TSserv, TSName, id, container, password)=AllTileId[0]
306 client.execute(command)
307 else:
308 serverLogger.error("Error with list "+str(tileId)+" of tiles : "+str(AllTileId))
309 serverLogger.error("tileId %s AllTileId %s ListClient : %s " % (str(tileId),str(AllTileId),str(self.ListClient)))
310 self.laststate=True
311 except Exception as err:
312 self.TSconnect.send_OK(self.id,-9)
313 serverLogger.error("Exception with list of tiles : "+str(err))
314 outHandler.flush()
315
316
317 def get_laststate_execute_list(self,tilesId):
318 serverLogger.warning(self.TileSetName+" : Get state on list "+str(tilesId)+" of tiles.")
319 self.wait_client("get_laststate_execute_list","")
320
321 # if (len(self.ListClient) == 0):
322 # self.TSconnect.send_OK(self.id,-1)
323 # serverLogger.error("Error calling get_laststate_execute_list : no client yet.")
324 # return False
325
326 if (TRACE):
327 import ipdb; ipdb.set_trace()
328 RET=0
329 if (self.laststate):
330 for tileId in tilesId:
331 AllTileId=list(filter(lambda x:tileId in x, self.ListClient))
332 serverLogger.debug(self.TileSetName+" : laststate on "+str(tileId)+" in client : "+str(AllTileId))
333 if (len(AllTileId) == 1):
334 (client, TSserv, TSName, id, container, password)=AllTileId[0]
335 count=0
336 while True:
337 laststate=client.get_laststate()
338 if (type(laststate) == int):
339 RET=RET+laststate
340 break
341 else:
342 time.sleep(waitsleep)
343 count=count+1
344 serverLogger.debug(self.TileSetName+" : Wait for state on list "+str(tilesId)+" of tiles %d." % (count))
345 if (count > MaxWaitExecute):
346 serverLogger.error(self.TileSetName+" : No state on list "+str(tilesId)+" of tiles %d." % (count))
347 RET=-1
348 break
349 else:
350 return False
351 serverLogger.warning(self.TileSetName+" : State on list "+str(tilesId)+" of tiles : "+str(RET))
352 return RET
353 else:
354 return False
355
356
357# class for each ClientId instance (multiple client connections).
358class ClientConnect(threading.Thread):
359 _alive = []
360 def __new__(cls,id, Connect):
361 self = super().__new__(cls)
362 ClientConnect._alive.append(self)
363 self.init(id, Connect)
364 return weakref.proxy(self)
365
366 def init(self, id, Connect):
367 threading.Thread.__init__(self)
368 self.thread = threading.Thread(target=self.run, args=(id, Connect),)
369 self.thread.start()
370
371 def run(self, id, connect):
372 self.id=id
373 self.Connect=Connect
374 # One client can have many tilesets.
375 self.TileSets = {}
376
377 serverLogger.warning("Listen to connection socket to send commands to tiles")
378 while True:
379 serverLogger.debug("Wait for command in server run.")
380 data = self.Connect.recv(self.id)
381
382 if not data: break
383 CommandRecv=data
384 if (re.search(r'create TS',CommandRecv)):
385 p=re.compile(r'create TS=(\w*) Nb=([0-9]*)')
386 TSName=p.sub(r'\1',CommandRecv)
387 self.Nb=int(p.sub(r'\2',CommandRecv))
388 serverLogger.warning("Create TileSet "+TSName+" with "+str(self.Nb)+" tiles.")
389 TS = TilesSet(TSName,self.Nb)
390 self.TileSets[TSName]=TS
391 outHandler.flush()
392
393 # TODO : give password to connection after create TS
394
395 elif (re.search(r'remove TS',CommandRecv)):
396 p=re.compile(r'remove TS=(\w*)')
397 TSName=p.sub(r'\1',CommandRecv)
398 serverLogger.warning('Receive remove command for TileSet "'+TSName+'".')
399
400 serverLogger.warning(f"del TileSet {self.TileSets[TSName]} {self.id}")
401
402 self.TileSets[TSName].remove()
403 self.Connect.close(self.id)
404 #self.thread.stop()
405 self._alive.remove(self)
406 outHandler.flush()
407 return
408
409 elif (re.search(r'remove TTile',CommandRecv)):
410 p=re.compile(r'remove TTile=(\w*) Tiles=(\w*) ')
411 TSName=p.sub(r'\1',CommandRecv)
412 TileId=p.sub(r'\2',CommandRecv)
413 serverLogger.warning(f'Receive remove command for Tile {TileId} in Set {TSName}.')
414 self.TileSets[TSName].removeTile(Id)
415 outHandler.flush()
416
417
418 elif (re.search(r'execute all',CommandRecv)):
419 p=re.compile(r'execute all (.*)')
420 serverLogger.warning('Execute all TileSets command "'+CommandTS+'"')
421
422 for TheTS in self.TileSets:
423 CommandTS=p.sub(r'\1',CommandRecv)
424 serverLogger.debug('Execute all command on tileset '+TheTS)
425 TheTS.execute_all(CommandTS)
426
427 RET=0
428 for TheTS in self.TileSets:
429 count=0
430 while True:
431 laststate=TheTS.get_laststate_execute_all()
432 if (type(laststate) == int):
433 RET=RET+laststate
434 break
435 else:
436 time.sleep(waitsleep)
437 count=count+1
438 serverLogger.debug(str(TheTS)+" : Wait for state on list command "+CommandRecv+" %d." % (count))
439 if (count > MaxWaitExecute):
440 CommandTS=p.sub(r'\1',CommandRecv)
441 serverLogger.error(str(TheTS)+" : No state on list command "+CommandRecv+"\n"+
442 "command send "+CommandTS+" %d." % (count))
443 RET=-1
444 break
445 serverLogger.debug(str(TheTS)+" : Get state on list command "+CommandRecv+" %d." % (RET))
446 serverLogger.debug(str(TheTS)+" : Get Send OK for command "+CommandRecv+" %d." % (RET))
447 self.Connect.send_OK(self.id,RET)
448 outHandler.flush()
449
450 elif (re.search(r'execute TS',CommandRecv)):
451 p0=re.compile(r'execute TS=(\w*) (.*)')
452 TSName=p0.sub(r'\1',CommandRecv)
453 CommandTS=p0.sub(r'\2',CommandRecv)
454 p=re.compile(r"Tiles=[(\‍[]([0-9, ']*)[)\‍]] (.*)")
455
456 if (re.match(p,CommandTS)):
457 StrTiles=p.sub(r'\1',CommandTS)
458 # ListStrTiles=StrTiles.split(', ')
459 # serverLogger.debug('ListTiles '+str(ListStrTiles))
460 # ListTiles=list(map(int, ListStrTiles))
461 ListTiles=list(map(lambda x:x.replace("'",""), StrTiles.split(', ')))
462 serverLogger.warning('Execute command "'+CommandTS+'" on tileset '+TSName+' on list '+str(ListTiles))
463 CommandTile=p.sub(r'\2',CommandTS)
464 self.TileSets[TSName].execute_list(ListTiles,CommandTile)
465
466 serverLogger.debug('Get laststate on list '+str(ListTiles))
467 RET=0
468 count=0
469 while True:
470 laststate=self.TileSets[TSName].get_laststate_execute_list(ListTiles)
471 serverLogger.debug('laststate for '+TSName+' is '+str(laststate))
472 if (type(laststate) == int):
473 RET=RET+laststate
474 break
475 else:
476 time.sleep(waitsleep)
477 count=count+1
478 serverLogger.warning(TSName+" : Wait for state on list command "+CommandRecv+" %d." % (count))
479 if (count > MaxWaitExecute):
480 serverLogger.error(TSName+" : No state "+str(laststate)+" on list command "+CommandRecv+"\n"+
481 "CommandTS "+CommandTS+" StrTiles "+str(StrTiles)+" \n"+
482 " %d." % (count))
483 RET=-1
484 break
485 serverLogger.debug(TSName+" : Get state on list command "+CommandRecv+" %d." % (RET))
486 else:
487 serverLogger.warning('Execute all command "'+CommandTS+'" on tileset '+TSName)
488 try:
489 self.TileSets[TSName].execute_all(CommandTS)
490
491 RET=0
492 count=0
493 while True:
494 laststate=self.TileSets[TSName].get_laststate_execute_all()
495 serverLogger.debug('laststate for '+TSName+' is '+str(laststate))
496 if (type(laststate) == int):
497 RET=RET+laststate
498 break
499 else:
500 time.sleep(waitsleep)
501 count=count+1
502 serverLogger.debug(TSName+" : Wait for state on all command "+CommandRecv+" %d." % (count))
503 if (count > MaxWaitExecute):
504 serverLogger.error(TSName+" : No state on all command "+CommandRecv+"\n"+
505 "CommandTS "+CommandTS+"\n"+
506 " %d." % (count))
507 RET=-1
508 break
509 serverLogger.debug(TSName+" : Get state on all command "+CommandRecv+" %d." % (RET))
510 except KeyError as err:
511 serverLogger.error("KeyError exception "+str(err)+"\n for "+TSName+" tileset and command :\n"+CommandTS)
512 RET=255
513 continue
514 serverLogger.debug(TSName+" : Send OK for command "+CommandRecv+" %d." % (RET))
515 self.Connect.send_OK(self.id,RET)
516 outHandler.flush()
517
518 elif (re.search(r'launch TS',CommandRecv)):
519 p=re.compile(r'launch TS=(\w*) (.*)')
520 TSName=p.sub(r'\1',CommandRecv)
521 CommandTS=p.sub(r'\2',CommandRecv)
522 serverLogger.warning('Launch on tileset "'+TSName+'" and command "'+CommandTS+'"')
523
524 p=re.compile(r'([^ ]*) (.*)')
525 CommandPATH=p.sub(r'\1',CommandTS)
526 CommandEXE=p.sub(r'\2',CommandTS)
527
528 # Give the connection PORT to server
529 if (re.search(r'TileSetPort',CommandEXE)):
530 CommandEXE=CommandEXE.replace('TileSetPort',str(self.TileSets[TSName].TileSetPort))
531 serverLogger.warning('Change TileSetPort on tileset "'+TSName+'" and command "'+CommandEXE+'"')
532
533 # TEST command and path validity ??
534 serverLogger.info('Launch command "'+CommandEXE+'" with path "'+CommandPATH+'" on tileset '+TSName)
535 args='cd '+CommandPATH+'; bash -vxc '+shlex.quote(CommandEXE)
536 p=subp.Popen(args, shell=True,stdout=subp.PIPE,stderr=subp.PIPE)
537 output, errors = p.communicate()
538 #serverLogger.warning(output.decode('utf-8'))
539 if (len(errors) >0):
540 serverLogger.info("stderr : "+errors.decode('utf-8'))
541
542 self.Connect.send_OK(self.id,p.returncode)
543 outHandler.flush()
544
545 elif (re.search(r'putfile TS',CommandRecv)):
546 p=re.compile(r'putfile TS=(\w*) (.*)')
547 TSName=p.sub(r'\1',CommandRecv)
548 FileInfos=p.sub(r'\2',CommandRecv)
549
550 p=re.compile(r'([^ ]*) ([^ ]*) ([0-9]*) ([a-z0-9]*)')
551 CommandPath=p.sub(r'\1',FileInfos)
552 CommandFilename=p.sub(r'\2',FileInfos)
553 CommandSize=p.sub(r'\3',FileInfos)
554 CommandSha256=p.sub(r'\4',FileInfos)
555
556 serverLogger.warning('Put file for tileset "'+TSName+'" : '+CommandFilename)
557
558 serverLogger.info('Put file in path "'+CommandPath+' with filename '+CommandFilename+' and size '+CommandSize+' MD5sum : '+CommandSha256)
559 self.Connect.send_OK(self.id,0)
560
561 self.Connect.get_file(self.id,CommandPath,CommandFilename,int(CommandSize),CommandSha256)
562 outHandler.flush()
563
564 elif (re.search(r'askfile TS',CommandRecv)):
565 p=re.compile(r'askfile TS=(\w*) (.*)')
566 TSName=p.sub(r'\1',CommandRecv)
567 FileInfos=p.sub(r'\2',CommandRecv)
568
569 p=re.compile(r'([^ ]*) (.*)')
570 CommandPath=p.sub(r'\1',FileInfos)
571 CommandFilename=p.sub(r'\2',FileInfos)
572
573 serverLogger.warning('Ask for a file from server on tileset "%s" and file name "%s" in path "%s" ' %\
574 (TSName,CommandFilename,CommandPath))
575
576 (FileSize, FileSha256) = self.Connect.send_file(self.id,CommandPath,CommandFilename)
577 serverLogger.warning('File sent with size %d and sha256 %s ' % (FileSize,FileSha256))
578 outHandler.flush()
579
580 else:
581 serverLogger.error("*********** UNRECOGNIZED COMMAND FROM CLIENT "+str(self.Connect.clientinfos[self.id])+" *********** :")
582 serverLogger.error(CommandRecv)
583
584 def close(self):
585 self.Connect.close(self.id)
586
587
588if __name__ == '__main__':
589 args = parse_args(sys.argv)
590
591 DEBUG=args.debug
592 if (DEBUG):
593 logging.warning("TileServer with debug mode on.")
594 TRACE=args.trace
595 if (TRACE):
596 logging.warning("TileServer with trace mode on.")
597 IdTS=args.idts
598 MaxWaitExecute=args.maxwaitexecute
599
600 #logging.basicConfig(level=logging.WARNING)
601 serverLogger = logging.getLogger("Server")
602 logFormatter = logging.Formatter("\n%(asctime)s - Server - %(threadName)s - %(levelname)s: %(message)s ")
603 #serverLogger.setLevel(logging.ERROR)
604 if (DEBUG):
605 serverLogger.setLevel(logging.DEBUG)
606 else:
607 serverLogger.setLevel(logging.WARNING)
608 #serverLogger.setLevel(logging.INFO)
609 outHandler = logging.StreamHandler(sys.stdout)
610 outHandler.setFormatter(logFormatter)
611 serverLogger.addHandler(outHandler)
612
613 serverLogger.info ("Launch TiledViz server on "+os.getenv("HOSTNAME"))
614
615 Connect=sock.server(sock.PORTServer)
616
617 ClientId=0
618 Clients=[]
619
620 while True:
621 serverLogger.warning( "Listening to connection from TiledViz ...")
622 Connect.new_connect(ClientId)
623
624 while True:
625 data = Connect.recv(ClientId)
626 if not data: break
627 serverLogger.info("Hello from connection "+data)
628 serverLogger.warning("New client num "+str(ClientId))
629 # Send back Hello message
630 Connect.send_client(ClientId,data)
631 thisclient=ClientConnect(ClientId,Connect)
632 ClientId=ClientId+1
633 Clients.append(thisclient)
634 break
635
636
637 Connect.close_all()
init(self, id, Connect)
run(self, id, connect)
execute(self, command)
Definition TileServer.py:92
wait_client(self, callfun, command)
run(self, TileSetName, Nb)
init(self, TileSetName, Nb)