28 import os |
28 import os |
29 import sys |
29 import sys |
30 import traceback |
30 import traceback |
31 from time import time |
31 from time import time |
32 import _ctypes # pylint: disable=wrong-import-order |
32 import _ctypes # pylint: disable=wrong-import-order |
|
33 from six.moves import xrange |
33 from past.builtins import execfile |
34 from past.builtins import execfile |
34 import Pyro.core as pyro |
|
35 import six |
|
36 from six.moves import _thread, xrange |
|
37 import md5 |
35 import md5 |
38 from tempfile import mkstemp |
36 from tempfile import mkstemp |
39 import shutil |
37 import shutil |
40 from functools import wraps |
38 from functools import wraps, partial |
41 |
39 |
42 from runtime.typemapping import TypeTranslator |
40 from runtime.typemapping import TypeTranslator |
43 from runtime.loglevels import LogLevelsDefault, LogLevelsCount |
41 from runtime.loglevels import LogLevelsDefault, LogLevelsCount |
44 from runtime.Stunnel import getPSKID |
42 from runtime.Stunnel import getPSKID |
45 from runtime import PlcStatus |
43 from runtime import PlcStatus |
77 return func_wrapper |
75 return func_wrapper |
78 |
76 |
79 |
77 |
80 class PLCObject(object): |
78 class PLCObject(object): |
81 def __init__(self, WorkingDir, argv, statuschange, evaluator, pyruntimevars): |
79 def __init__(self, WorkingDir, argv, statuschange, evaluator, pyruntimevars): |
82 self.workingdir = WorkingDir # must exits already |
80 self.workingdir = WorkingDir # must exits already |
83 self.tmpdir = os.path.join(WorkingDir, 'tmp') |
81 self.tmpdir = os.path.join(WorkingDir, 'tmp') |
84 if os.path.exists(self.tmpdir): |
82 if os.path.exists(self.tmpdir): |
85 shutil.rmtree(self.tmpdir) |
83 shutil.rmtree(self.tmpdir) |
86 os.mkdir(self.tmpdir) |
84 os.mkdir(self.tmpdir) |
87 # FIXME : is argv of any use nowadays ? |
85 # FIXME : is argv of any use nowadays ? |
455 def GetPLCstatus(self): |
453 def GetPLCstatus(self): |
456 return self.PLCStatus, map(self.GetLogCount, xrange(LogLevelsCount)) |
454 return self.PLCStatus, map(self.GetLogCount, xrange(LogLevelsCount)) |
457 |
455 |
458 @RunInMain |
456 @RunInMain |
459 def GetPLCID(self): |
457 def GetPLCID(self): |
460 return getPSKID() |
458 return getPSKID(partial(self.LogMessage, 0)) |
461 |
459 |
462 def _init_blobs(self): |
460 def _init_blobs(self): |
463 self.blobs = {} |
461 self.blobs = {} |
464 if os.path.exists(self.tmpdir): |
462 if os.path.exists(self.tmpdir): |
465 shutil.rmtree(self.tmpdir) |
463 shutil.rmtree(self.tmpdir) |
466 os.mkdir(self.tmpdir) |
464 os.mkdir(self.tmpdir) |
467 |
465 |
468 @RunInMain |
466 @RunInMain |
469 def SeedBlob(self, seed): |
467 def SeedBlob(self, seed): |
470 blob = (mkstemp(dir=self.tmpdir) + (md5.new(),)) |
468 blob = (mkstemp(dir=self.tmpdir) + (md5.new(),)) |
471 fobj, path, md5sum = blob |
469 _fobj, _path, md5sum = blob |
472 md5sum.update(seed) |
470 md5sum.update(seed) |
473 newBlobID = md5sum.digest() |
471 newBlobID = md5sum.digest() |
474 self.blobs[newBlobID] = blob |
472 self.blobs[newBlobID] = blob |
475 return newBlobID |
473 return newBlobID |
476 |
474 |
479 blob = self.blobs.pop(blobID, None) |
477 blob = self.blobs.pop(blobID, None) |
480 |
478 |
481 if blob is None: |
479 if blob is None: |
482 return None |
480 return None |
483 |
481 |
484 fobj, path, md5sum = blob |
482 fobj, _path, md5sum = blob |
485 md5sum.update(data) |
483 md5sum.update(data) |
486 newBlobID = md5sum.digest() |
484 newBlobID = md5sum.digest() |
487 os.write(fobj,data) |
485 os.write(fobj, data) |
488 self.blobs[newBlobID] = blob |
486 self.blobs[newBlobID] = blob |
489 return newBlobID |
487 return newBlobID |
490 |
488 |
491 @RunInMain |
489 @RunInMain |
492 def PurgeBlobs(self): |
490 def PurgeBlobs(self): |
493 for fobj, path, md5sum in self.blobs: |
491 for fobj, _path, _md5sum in self.blobs: |
494 os.close(fobj) |
492 os.close(fobj) |
495 self._init_blobs() |
493 self._init_blobs() |
496 |
494 |
497 def _BlobAsFile(self, blobID, newpath): |
495 def _BlobAsFile(self, blobID, newpath): |
498 blob = self.blobs.pop(blobID, None) |
496 blob = self.blobs.pop(blobID, None) |
499 |
497 |
500 if blob is None: |
498 if blob is None: |
501 raise Exception(_("Missing data to create file: {}").format(newpath)) |
499 raise Exception(_("Missing data to create file: {}").format(newpath)) |
502 |
500 |
503 fobj, path, md5sum = blob |
501 fobj, path, _md5sum = blob |
504 os.close(fobj) |
502 os.close(fobj) |
505 shutil.move(path, newpath) |
503 shutil.move(path, newpath) |
506 |
504 |
507 @RunInMain |
505 @RunInMain |
508 def NewPLC(self, md5sum, plc_object, extrafiles): |
506 def NewPLC(self, md5sum, plc_object, extrafiles): |
509 if self.PLCStatus in [PlcStatus.Stopped, PlcStatus.Empty, PlcStatus.Broken]: |
507 if self.PLCStatus in [PlcStatus.Stopped, PlcStatus.Empty, PlcStatus.Broken]: |
510 NewFileName = md5sum + lib_ext |
508 NewFileName = md5sum + lib_ext |
511 extra_files_log = os.path.join(self.workingdir, "extra_files.txt") |
509 extra_files_log = os.path.join(self.workingdir, "extra_files.txt") |
606 self.TraceLock.release() |
604 self.TraceLock.release() |
607 return Traces |
605 return Traces |
608 |
606 |
609 @RunInMain |
607 @RunInMain |
610 def GetTraceVariables(self, DebugToken): |
608 def GetTraceVariables(self, DebugToken): |
611 if (DebugToken is not None and |
609 if (DebugToken is not None and DebugToken == self.DebugToken): |
612 DebugToken == self.DebugToken): |
|
613 return self.PLCStatus, self._TracesSwap() |
610 return self.PLCStatus, self._TracesSwap() |
614 return PlcStatus.Broken, [] |
611 return PlcStatus.Broken, [] |
615 |
612 |
616 def TraceThreadProc(self): |
613 def TraceThreadProc(self): |
617 """ |
614 """ |