Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
__author__ = 'Manuela Kuhn <marnuel.kuhn@desy.de>'
import time
import logging
import os
from stat import S_ISREG, ST_MTIME, ST_MODE
import helperScript
class RingBuffer:
targetDir = None
ringBuffer = []
maxRingBufferSize = None
log = None
def __init__(self, maxRingBufferSize, targetDir = None):
self.targetDir = targetDir
self.maxRingBufferSize = maxRingBufferSize
self.log = self.getLogger()
self.log.debug("Init")
# initialize ring buffer
# get all entries in the directory
if targetDir:
# TODO empty target dir -> ringBuffer = []
self.ringBuffer = (os.path.join(self.targetDir, fn) for fn in os.listdir(self.targetDir))
# get the corresponding stats
self.ringBuffer = ((os.stat(path), path) for path in self.ringBuffer)
# leave only regular files, insert modification date
self.ringBuffer = [[stat[ST_MTIME], path]
for stat, path in self.ringBuffer if S_ISREG(stat[ST_MODE])]
# sort the ring buffer in descending order (new to old files)
self.ringBuffer = sorted(self.ringBuffer, reverse=True)
self.log.debug("Init ring buffer with files in specified directory")
def getLogger(self):
logger = logging.getLogger("RingBuffer")
return logger
def __str__(self):
returnString = ""
if self.ringBuffer:
for i in self.ringBuffer[:-1]:
returnString += str(i) + "\n"
returnString += str(self.ringBuffer[-1])
return returnString
def getNewestFile(self):
# send first element in ring buffer to live viewer (the path of this file is the second entry)
if self.ringBuffer:
self.log.debug("Newest Event: " + str(self.ringBuffer[0][1]) )
return self.ringBuffer[0][1]
else:
self.log.debug("Newest Event: None")
return "None"
def add(self, filename, fileModTime):
# prepend file to ring buffer and restore order
self.ringBuffer[:0] = [[fileModTime, filename]]
self.ringBuffer = sorted(self.ringBuffer, reverse=True)
# if the maximal size is exceeded: remove the oldest files
if len(self.ringBuffer) > self.maxRingBufferSize:
for mod_time, path in self.ringBuffer[self.maxRingBufferSize:]:
self.log.debug("Remove file from ring buffer: " + str(path) )
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
os.remove(path)
self.ringBuffer.remove([mod_time, path])
if __name__ == "__main__":
logfile = "/space/projects/live-viewer/logs/RingBuffer.log"
targetDir = "/space/projects/live-viewer/data/zmq_target/"
#enable logging
helperScript.initLogging(logfile, True)
ringbuffer = RingBuffer(2, targetDir)
print "init"
print ringbuffer
# add a file
newFileName1 = targetDir + "file1.tif"
newFile = open(newFileName1, "w")
newFile.write("test")
newFile.close()
newFileModTime = os.stat(newFileName1).st_mtime
ringbuffer.add(newFileName1, newFileModTime)
print "\nadded"
print ringbuffer
time.sleep(1)
# add another file
newFileName2 = targetDir + "file2.tif"
newFile = open(newFileName2, "w")
newFile.write("test")
newFile.close()
newFileModTime = os.stat(newFileName2).st_mtime
ringbuffer.add(newFileName2, newFileModTime)
print "\nadded"
print ringbuffer
os.remove(newFileName1)
os.remove(newFileName2)