runtime/PLCObject.py
changeset 2492 7dd551ac2fa0
parent 2487 6a4f9a061994
child 2537 eb4a4cc41914
equal deleted inserted replaced
2491:362039519454 2492:7dd551ac2fa0
    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         """