##// END OF EJS Templates
merge voltage ftp
José Chávez -
r1037:2fe9a199ea60
parent child
Show More
@@ -1,824 +1,737
1 '''
1 '''
2 Created on Jul 2, 2014
2 Created on Jul 2, 2014
3
3
4 @author: roj-idl71
4 @author: roj-idl71
5 '''
5 '''
6
6
7 import numpy
7 import numpy
8
8
9 from jroIO_base import LOCALTIME, JRODataReader, JRODataWriter
9 from jroIO_base import LOCALTIME, JRODataReader, JRODataWriter
10 from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation
10 from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation
11 from schainpy.model.data.jroheaderIO import PROCFLAG, BasicHeader, SystemHeader, RadarControllerHeader, ProcessingHeader
11 from schainpy.model.data.jroheaderIO import PROCFLAG, BasicHeader, SystemHeader, RadarControllerHeader, ProcessingHeader
12 from schainpy.model.data.jrodata import Voltage
12 from schainpy.model.data.jrodata import Voltage
13 import zmq
13 import zmq
14 import tempfile
14 import tempfile
15 from StringIO import StringIO
15 from StringIO import StringIO
16 # from _sha import blocksize
16 # from _sha import blocksize
17
17
18 class VoltageReader(JRODataReader, ProcessingUnit):
18 class VoltageReader(JRODataReader, ProcessingUnit):
19 """
19 """
20 Esta clase permite leer datos de voltage desde archivos en formato rawdata (.r). La lectura
20 Esta clase permite leer datos de voltage desde archivos en formato rawdata (.r). La lectura
21 de los datos siempre se realiza por bloques. Los datos leidos (array de 3 dimensiones:
21 de los datos siempre se realiza por bloques. Los datos leidos (array de 3 dimensiones:
22 perfiles*alturas*canales) son almacenados en la variable "buffer".
22 perfiles*alturas*canales) son almacenados en la variable "buffer".
23
23
24 perfiles * alturas * canales
24 perfiles * alturas * canales
25
25
26 Esta clase contiene instancias (objetos) de las clases BasicHeader, SystemHeader,
26 Esta clase contiene instancias (objetos) de las clases BasicHeader, SystemHeader,
27 RadarControllerHeader y Voltage. Los tres primeros se usan para almacenar informacion de la
27 RadarControllerHeader y Voltage. Los tres primeros se usan para almacenar informacion de la
28 cabecera de datos (metadata), y el cuarto (Voltage) para obtener y almacenar un perfil de
28 cabecera de datos (metadata), y el cuarto (Voltage) para obtener y almacenar un perfil de
29 datos desde el "buffer" cada vez que se ejecute el metodo "getData".
29 datos desde el "buffer" cada vez que se ejecute el metodo "getData".
30
30
31 Example:
31 Example:
32
32
33 dpath = "/home/myuser/data"
33 dpath = "/home/myuser/data"
34
34
35 startTime = datetime.datetime(2010,1,20,0,0,0,0,0,0)
35 startTime = datetime.datetime(2010,1,20,0,0,0,0,0,0)
36
36
37 endTime = datetime.datetime(2010,1,21,23,59,59,0,0,0)
37 endTime = datetime.datetime(2010,1,21,23,59,59,0,0,0)
38
38
39 readerObj = VoltageReader()
39 readerObj = VoltageReader()
40
40
41 readerObj.setup(dpath, startTime, endTime)
41 readerObj.setup(dpath, startTime, endTime)
42
42
43 while(True):
43 while(True):
44
44
45 #to get one profile
45 #to get one profile
46 profile = readerObj.getData()
46 profile = readerObj.getData()
47
47
48 #print the profile
48 #print the profile
49 print profile
49 print profile
50
50
51 #If you want to see all datablock
51 #If you want to see all datablock
52 print readerObj.datablock
52 print readerObj.datablock
53
53
54 if readerObj.flagNoMoreFiles:
54 if readerObj.flagNoMoreFiles:
55 break
55 break
56
56
57 """
57 """
58
58
59 ext = ".r"
59 ext = ".r"
60
60
61 optchar = "D"
61 optchar = "D"
62 dataOut = None
62 dataOut = None
63
63
64 def __init__(self, **kwargs):
64 def __init__(self, **kwargs):
65 """
65 """
66 Inicializador de la clase VoltageReader para la lectura de datos de voltage.
66 Inicializador de la clase VoltageReader para la lectura de datos de voltage.
67
67
68 Input:
68 Input:
69 dataOut : Objeto de la clase Voltage. Este objeto sera utilizado para
69 dataOut : Objeto de la clase Voltage. Este objeto sera utilizado para
70 almacenar un perfil de datos cada vez que se haga un requerimiento
70 almacenar un perfil de datos cada vez que se haga un requerimiento
71 (getData). El perfil sera obtenido a partir del buffer de datos,
71 (getData). El perfil sera obtenido a partir del buffer de datos,
72 si el buffer esta vacio se hara un nuevo proceso de lectura de un
72 si el buffer esta vacio se hara un nuevo proceso de lectura de un
73 bloque de datos.
73 bloque de datos.
74 Si este parametro no es pasado se creara uno internamente.
74 Si este parametro no es pasado se creara uno internamente.
75
75
76 Variables afectadas:
76 Variables afectadas:
77 self.dataOut
77 self.dataOut
78
78
79 Return:
79 Return:
80 None
80 None
81 """
81 """
82
82
83 ProcessingUnit.__init__(self, **kwargs)
83 ProcessingUnit.__init__(self, **kwargs)
84
84
85 self.isConfig = False
85 self.isConfig = False
86
86
87 self.datablock = None
87 self.datablock = None
88
88
89 self.utc = 0
89 self.utc = 0
90
90
91 self.ext = ".r"
91 self.ext = ".r"
92
92
93 self.optchar = "D"
93 self.optchar = "D"
94
94
95 self.basicHeaderObj = BasicHeader(LOCALTIME)
95 self.basicHeaderObj = BasicHeader(LOCALTIME)
96
96
97 self.systemHeaderObj = SystemHeader()
97 self.systemHeaderObj = SystemHeader()
98
98
99 self.radarControllerHeaderObj = RadarControllerHeader()
99 self.radarControllerHeaderObj = RadarControllerHeader()
100
100
101 self.processingHeaderObj = ProcessingHeader()
101 self.processingHeaderObj = ProcessingHeader()
102
102
103 self.online = 0
103 self.online = 0
104
104
105 self.fp = None
105 self.fp = None
106
106
107 self.idFile = None
107 self.idFile = None
108
108
109 self.dtype = None
109 self.dtype = None
110
110
111 self.fileSizeByHeader = None
111 self.fileSizeByHeader = None
112
112
113 self.filenameList = []
113 self.filenameList = []
114
114
115 self.filename = None
115 self.filename = None
116
116
117 self.fileSize = None
117 self.fileSize = None
118
118
119 self.firstHeaderSize = 0
119 self.firstHeaderSize = 0
120
120
121 self.basicHeaderSize = 24
121 self.basicHeaderSize = 24
122
122
123 self.pathList = []
123 self.pathList = []
124
124
125 self.filenameList = []
125 self.filenameList = []
126
126
127 self.lastUTTime = 0
127 self.lastUTTime = 0
128
128
129 self.maxTimeStep = 30
129 self.maxTimeStep = 30
130
130
131 self.flagNoMoreFiles = 0
131 self.flagNoMoreFiles = 0
132
132
133 self.set = 0
133 self.set = 0
134
134
135 self.path = None
135 self.path = None
136
136
137 self.profileIndex = 2**32-1
137 self.profileIndex = 2**32-1
138
138
139 self.delay = 3 #seconds
139 self.delay = 3 #seconds
140
140
141 self.nTries = 3 #quantity tries
141 self.nTries = 3 #quantity tries
142
142
143 self.nFiles = 3 #number of files for searching
143 self.nFiles = 3 #number of files for searching
144
144
145 self.nReadBlocks = 0
145 self.nReadBlocks = 0
146
146
147 self.flagIsNewFile = 1
147 self.flagIsNewFile = 1
148
148
149 self.__isFirstTimeOnline = 1
149 self.__isFirstTimeOnline = 1
150
150
151 # self.ippSeconds = 0
151 # self.ippSeconds = 0
152
152
153 self.flagDiscontinuousBlock = 0
153 self.flagDiscontinuousBlock = 0
154
154
155 self.flagIsNewBlock = 0
155 self.flagIsNewBlock = 0
156
156
157 self.nTotalBlocks = 0
157 self.nTotalBlocks = 0
158
158
159 self.blocksize = 0
159 self.blocksize = 0
160
160
161 self.dataOut = self.createObjByDefault()
161 self.dataOut = self.createObjByDefault()
162
162
163 self.nTxs = 1
163 self.nTxs = 1
164
164
165 self.txIndex = 0
165 self.txIndex = 0
166
166
167 def createObjByDefault(self):
167 def createObjByDefault(self):
168
168
169 dataObj = Voltage()
169 dataObj = Voltage()
170
170
171 return dataObj
171 return dataObj
172
172
173 def __hasNotDataInBuffer(self):
173 def __hasNotDataInBuffer(self):
174
174
175 if self.profileIndex >= self.processingHeaderObj.profilesPerBlock*self.nTxs:
175 if self.profileIndex >= self.processingHeaderObj.profilesPerBlock*self.nTxs:
176 return 1
176 return 1
177
177
178 return 0
178 return 0
179
179
180
180
181 def getBlockDimension(self):
181 def getBlockDimension(self):
182 """
182 """
183 <<<<<<< HEAD
184 Obtiene la cantidad de puntos a leer por cada bloque de datos
185
186 Affected:
187 self.blocksize
188 =======
189 Obtiene la cantidad de puntos a leer por cada bloque de datos
183 Obtiene la cantidad de puntos a leer por cada bloque de datos
190
184
191 Affected:
185 Affected:
192 self.blocksize
186 self.blocksize
193 >>>>>>> online_data_hour
194
187
195 Return:
188 Return:
196 None
189 None
197 """
190 """
198 pts2read = self.processingHeaderObj.profilesPerBlock * self.processingHeaderObj.nHeights * self.systemHeaderObj.nChannels
191 pts2read = self.processingHeaderObj.profilesPerBlock * self.processingHeaderObj.nHeights * self.systemHeaderObj.nChannels
199 self.blocksize = pts2read
192 self.blocksize = pts2read
200
193
201
194
202
195
203 def readBlock(self):
196 def readBlock(self):
204 """
197 """
205 <<<<<<< HEAD
206 readBlock lee el bloque de datos desde la posicion actual del puntero del archivo
207 (self.fp) y actualiza todos los parametros relacionados al bloque de datos
208 (metadata + data). La data leida es almacenada en el buffer y el contador del buffer
209 es seteado a 0
210
211 Inputs:
212 None
213
214 Return:
215 None
216
217 Affected:
218 self.profileIndex
219 self.datablock
220 self.flagIsNewFile
221 self.flagIsNewBlock
222 self.nTotalBlocks
223
224 Exceptions:
225 Si un bloque leido no es un bloque valido
226 =======
227 readBlock lee el bloque de datos desde la posicion actual del puntero del archivo
198 readBlock lee el bloque de datos desde la posicion actual del puntero del archivo
228 (self.fp) y actualiza todos los parametros relacionados al bloque de datos
199 (self.fp) y actualiza todos los parametros relacionados al bloque de datos
229 (metadata + data). La data leida es almacenada en el buffer y el contador del buffer
200 (metadata + data). La data leida es almacenada en el buffer y el contador del buffer
230 es seteado a 0
201 es seteado a 0
231
202
232 Inputs:
203 Inputs:
233 None
204 None
234
205
235 Return:
206 Return:
236 None
207 None
237
208
238 Affected:
209 Affected:
239 self.profileIndex
210 self.profileIndex
240 self.datablock
211 self.datablock
241 self.flagIsNewFile
212 self.flagIsNewFile
242 self.flagIsNewBlock
213 self.flagIsNewBlock
243 self.nTotalBlocks
214 self.nTotalBlocks
244
215
245 Exceptions:
216 Exceptions:
246 Si un bloque leido no es un bloque valido
217 Si un bloque leido no es un bloque valido
247 >>>>>>> online_data_hour
248 """
218 """
249
219
250 # if self.server is not None:
220 # if self.server is not None:
251 # self.zBlock = self.receiver.recv()
221 # self.zBlock = self.receiver.recv()
252 # self.zHeader = self.zBlock[:24]
222 # self.zHeader = self.zBlock[:24]
253 # self.zDataBlock = self.zBlock[24:]
223 # self.zDataBlock = self.zBlock[24:]
254 # junk = numpy.fromstring(self.zDataBlock, numpy.dtype([('real','<i4'),('imag','<i4')]))
224 # junk = numpy.fromstring(self.zDataBlock, numpy.dtype([('real','<i4'),('imag','<i4')]))
255 # self.processingHeaderObj.profilesPerBlock = 240
225 # self.processingHeaderObj.profilesPerBlock = 240
256 # self.processingHeaderObj.nHeights = 248
226 # self.processingHeaderObj.nHeights = 248
257 # self.systemHeaderObj.nChannels
227 # self.systemHeaderObj.nChannels
258 # else:
228 # else:
259 current_pointer_location = self.fp.tell()
229 current_pointer_location = self.fp.tell()
260 junk = numpy.fromfile( self.fp, self.dtype, self.blocksize )
230 junk = numpy.fromfile( self.fp, self.dtype, self.blocksize )
261
231
262 try:
232 try:
263 junk = junk.reshape( (self.processingHeaderObj.profilesPerBlock, self.processingHeaderObj.nHeights, self.systemHeaderObj.nChannels) )
233 junk = junk.reshape( (self.processingHeaderObj.profilesPerBlock, self.processingHeaderObj.nHeights, self.systemHeaderObj.nChannels) )
264 except:
234 except:
265 #print "The read block (%3d) has not enough data" %self.nReadBlocks
235 #print "The read block (%3d) has not enough data" %self.nReadBlocks
266
236
267 if self.waitDataBlock(pointer_location=current_pointer_location):
237 if self.waitDataBlock(pointer_location=current_pointer_location):
268 junk = numpy.fromfile( self.fp, self.dtype, self.blocksize )
238 junk = numpy.fromfile( self.fp, self.dtype, self.blocksize )
269 junk = junk.reshape( (self.processingHeaderObj.profilesPerBlock, self.processingHeaderObj.nHeights, self.systemHeaderObj.nChannels) )
239 junk = junk.reshape( (self.processingHeaderObj.profilesPerBlock, self.processingHeaderObj.nHeights, self.systemHeaderObj.nChannels) )
270 # return 0
240 # return 0
271
241
272 #Dimensions : nChannels, nProfiles, nSamples
242 #Dimensions : nChannels, nProfiles, nSamples
273
243
274 junk = numpy.transpose(junk, (2,0,1))
244 junk = numpy.transpose(junk, (2,0,1))
275 self.datablock = junk['real'] + junk['imag']*1j
245 self.datablock = junk['real'] + junk['imag']*1j
276
246
277 self.profileIndex = 0
247 self.profileIndex = 0
278
248
279 self.flagIsNewFile = 0
249 self.flagIsNewFile = 0
280 self.flagIsNewBlock = 1
250 self.flagIsNewBlock = 1
281
251
282 self.nTotalBlocks += 1
252 self.nTotalBlocks += 1
283 self.nReadBlocks += 1
253 self.nReadBlocks += 1
284
254
285 return 1
255 return 1
286
256
287 def getFirstHeader(self):
257 def getFirstHeader(self):
288
258
289 self.getBasicHeader()
259 self.getBasicHeader()
290
260
291 self.dataOut.systemHeaderObj = self.systemHeaderObj.copy()
261 self.dataOut.systemHeaderObj = self.systemHeaderObj.copy()
292
262
293 self.dataOut.radarControllerHeaderObj = self.radarControllerHeaderObj.copy()
263 self.dataOut.radarControllerHeaderObj = self.radarControllerHeaderObj.copy()
294
264
295 if self.nTxs > 1:
265 if self.nTxs > 1:
296 self.dataOut.radarControllerHeaderObj.ippSeconds = self.radarControllerHeaderObj.ippSeconds/self.nTxs
266 self.dataOut.radarControllerHeaderObj.ippSeconds = self.radarControllerHeaderObj.ippSeconds/self.nTxs
297
267
298 #Time interval and code are propierties of dataOut. Its value depends of radarControllerHeaderObj.
268 #Time interval and code are propierties of dataOut. Its value depends of radarControllerHeaderObj.
299
269
300 # self.dataOut.timeInterval = self.radarControllerHeaderObj.ippSeconds * self.processingHeaderObj.nCohInt
270 # self.dataOut.timeInterval = self.radarControllerHeaderObj.ippSeconds * self.processingHeaderObj.nCohInt
301 #
271 #
302 # if self.radarControllerHeaderObj.code is not None:
272 # if self.radarControllerHeaderObj.code is not None:
303 #
273 #
304 # self.dataOut.nCode = self.radarControllerHeaderObj.nCode
274 # self.dataOut.nCode = self.radarControllerHeaderObj.nCode
305 #
275 #
306 # self.dataOut.nBaud = self.radarControllerHeaderObj.nBaud
276 # self.dataOut.nBaud = self.radarControllerHeaderObj.nBaud
307 #
277 #
308 # self.dataOut.code = self.radarControllerHeaderObj.code
278 # self.dataOut.code = self.radarControllerHeaderObj.code
309
279
310 self.dataOut.dtype = self.dtype
280 self.dataOut.dtype = self.dtype
311
281
312 self.dataOut.nProfiles = self.processingHeaderObj.profilesPerBlock
282 self.dataOut.nProfiles = self.processingHeaderObj.profilesPerBlock
313
283
314 self.dataOut.heightList = numpy.arange(self.processingHeaderObj.nHeights) *self.processingHeaderObj.deltaHeight + self.processingHeaderObj.firstHeight
284 self.dataOut.heightList = numpy.arange(self.processingHeaderObj.nHeights) *self.processingHeaderObj.deltaHeight + self.processingHeaderObj.firstHeight
315
285
316 self.dataOut.channelList = range(self.systemHeaderObj.nChannels)
286 self.dataOut.channelList = range(self.systemHeaderObj.nChannels)
317
287
318 self.dataOut.nCohInt = self.processingHeaderObj.nCohInt
288 self.dataOut.nCohInt = self.processingHeaderObj.nCohInt
319
289
320 self.dataOut.flagDecodeData = self.processingHeaderObj.flag_decode #asumo q la data no esta decodificada
290 self.dataOut.flagDecodeData = self.processingHeaderObj.flag_decode #asumo q la data no esta decodificada
321
291
322 self.dataOut.flagDeflipData = self.processingHeaderObj.flag_deflip #asumo q la data no esta sin flip
292 self.dataOut.flagDeflipData = self.processingHeaderObj.flag_deflip #asumo q la data no esta sin flip
323
293
324 self.dataOut.flagShiftFFT = self.processingHeaderObj.shif_fft
294 self.dataOut.flagShiftFFT = self.processingHeaderObj.shif_fft
325
295
326 def reshapeData(self):
296 def reshapeData(self):
327
297
328 if self.nTxs < 0:
298 if self.nTxs < 0:
329 return
299 return
330
300
331 if self.nTxs == 1:
301 if self.nTxs == 1:
332 return
302 return
333
303
334 if self.nTxs < 1 and self.processingHeaderObj.profilesPerBlock % (1./self.nTxs) != 0:
304 if self.nTxs < 1 and self.processingHeaderObj.profilesPerBlock % (1./self.nTxs) != 0:
335 raise ValueError, "1./nTxs (=%f), should be a multiple of nProfiles (=%d)" %(1./self.nTxs, self.processingHeaderObj.profilesPerBlock)
305 raise ValueError, "1./nTxs (=%f), should be a multiple of nProfiles (=%d)" %(1./self.nTxs, self.processingHeaderObj.profilesPerBlock)
336
306
337 if self.nTxs > 1 and self.processingHeaderObj.nHeights % self.nTxs != 0:
307 if self.nTxs > 1 and self.processingHeaderObj.nHeights % self.nTxs != 0:
338 raise ValueError, "nTxs (=%d), should be a multiple of nHeights (=%d)" %(self.nTxs, self.processingHeaderObj.nHeights)
308 raise ValueError, "nTxs (=%d), should be a multiple of nHeights (=%d)" %(self.nTxs, self.processingHeaderObj.nHeights)
339
309
340 self.datablock = self.datablock.reshape((self.systemHeaderObj.nChannels, self.processingHeaderObj.profilesPerBlock*self.nTxs, self.processingHeaderObj.nHeights/self.nTxs))
310 self.datablock = self.datablock.reshape((self.systemHeaderObj.nChannels, self.processingHeaderObj.profilesPerBlock*self.nTxs, self.processingHeaderObj.nHeights/self.nTxs))
341
311
342 self.dataOut.nProfiles = self.processingHeaderObj.profilesPerBlock*self.nTxs
312 self.dataOut.nProfiles = self.processingHeaderObj.profilesPerBlock*self.nTxs
343 self.dataOut.heightList = numpy.arange(self.processingHeaderObj.nHeights/self.nTxs) *self.processingHeaderObj.deltaHeight + self.processingHeaderObj.firstHeight
313 self.dataOut.heightList = numpy.arange(self.processingHeaderObj.nHeights/self.nTxs) *self.processingHeaderObj.deltaHeight + self.processingHeaderObj.firstHeight
344 self.dataOut.radarControllerHeaderObj.ippSeconds = self.radarControllerHeaderObj.ippSeconds/self.nTxs
314 self.dataOut.radarControllerHeaderObj.ippSeconds = self.radarControllerHeaderObj.ippSeconds/self.nTxs
345
315
346 return
316 return
347
317
348 def readFirstHeaderFromServer(self):
318 def readFirstHeaderFromServer(self):
349
319
350 self.getFirstHeader()
320 self.getFirstHeader()
351
321
352 self.firstHeaderSize = self.basicHeaderObj.size
322 self.firstHeaderSize = self.basicHeaderObj.size
353
323
354 datatype = int(numpy.log2((self.processingHeaderObj.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
324 datatype = int(numpy.log2((self.processingHeaderObj.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR))
355 if datatype == 0:
325 if datatype == 0:
356 datatype_str = numpy.dtype([('real','<i1'),('imag','<i1')])
326 datatype_str = numpy.dtype([('real','<i1'),('imag','<i1')])
357 elif datatype == 1:
327 elif datatype == 1:
358 datatype_str = numpy.dtype([('real','<i2'),('imag','<i2')])
328 datatype_str = numpy.dtype([('real','<i2'),('imag','<i2')])
359 elif datatype == 2:
329 elif datatype == 2:
360 datatype_str = numpy.dtype([('real','<i4'),('imag','<i4')])
330 datatype_str = numpy.dtype([('real','<i4'),('imag','<i4')])
361 elif datatype == 3:
331 elif datatype == 3:
362 datatype_str = numpy.dtype([('real','<i8'),('imag','<i8')])
332 datatype_str = numpy.dtype([('real','<i8'),('imag','<i8')])
363 elif datatype == 4:
333 elif datatype == 4:
364 datatype_str = numpy.dtype([('real','<f4'),('imag','<f4')])
334 datatype_str = numpy.dtype([('real','<f4'),('imag','<f4')])
365 elif datatype == 5:
335 elif datatype == 5:
366 datatype_str = numpy.dtype([('real','<f8'),('imag','<f8')])
336 datatype_str = numpy.dtype([('real','<f8'),('imag','<f8')])
367 else:
337 else:
368 raise ValueError, 'Data type was not defined'
338 raise ValueError, 'Data type was not defined'
369
339
370 self.dtype = datatype_str
340 self.dtype = datatype_str
371 #self.ippSeconds = 2 * 1000 * self.radarControllerHeaderObj.ipp / self.c
341 #self.ippSeconds = 2 * 1000 * self.radarControllerHeaderObj.ipp / self.c
372 self.fileSizeByHeader = self.processingHeaderObj.dataBlocksPerFile * self.processingHeaderObj.blockSize + self.firstHeaderSize + self.basicHeaderSize*(self.processingHeaderObj.dataBlocksPerFile - 1)
342 self.fileSizeByHeader = self.processingHeaderObj.dataBlocksPerFile * self.processingHeaderObj.blockSize + self.firstHeaderSize + self.basicHeaderSize*(self.processingHeaderObj.dataBlocksPerFile - 1)
373 # self.dataOut.channelList = numpy.arange(self.systemHeaderObj.numChannels)
343 # self.dataOut.channelList = numpy.arange(self.systemHeaderObj.numChannels)
374 # self.dataOut.channelIndexList = numpy.arange(self.systemHeaderObj.numChannels)
344 # self.dataOut.channelIndexList = numpy.arange(self.systemHeaderObj.numChannels)
375 self.getBlockDimension()
345 self.getBlockDimension()
376
346
377
347
378 def getFromServer(self):
348 def getFromServer(self):
379 self.flagDiscontinuousBlock = 0
349 self.flagDiscontinuousBlock = 0
380 self.profileIndex = 0
350 self.profileIndex = 0
381 self.flagIsNewBlock = 1
351 self.flagIsNewBlock = 1
382 self.dataOut.flagNoData = False
352 self.dataOut.flagNoData = False
383 self.nTotalBlocks += 1
353 self.nTotalBlocks += 1
384 self.nReadBlocks += 1
354 self.nReadBlocks += 1
385 self.blockPointer = 0
355 self.blockPointer = 0
386
356
387 block = self.receiver.recv()
357 block = self.receiver.recv()
388
358
389 self.basicHeaderObj.read(block[self.blockPointer:])
359 self.basicHeaderObj.read(block[self.blockPointer:])
390 self.blockPointer += self.basicHeaderObj.length
360 self.blockPointer += self.basicHeaderObj.length
391 self.systemHeaderObj.read(block[self.blockPointer:])
361 self.systemHeaderObj.read(block[self.blockPointer:])
392 self.blockPointer += self.systemHeaderObj.length
362 self.blockPointer += self.systemHeaderObj.length
393 self.radarControllerHeaderObj.read(block[self.blockPointer:])
363 self.radarControllerHeaderObj.read(block[self.blockPointer:])
394 self.blockPointer += self.radarControllerHeaderObj.length
364 self.blockPointer += self.radarControllerHeaderObj.length
395 self.processingHeaderObj.read(block[self.blockPointer:])
365 self.processingHeaderObj.read(block[self.blockPointer:])
396 self.blockPointer += self.processingHeaderObj.length
366 self.blockPointer += self.processingHeaderObj.length
397 self.readFirstHeaderFromServer()
367 self.readFirstHeaderFromServer()
398
368
399 timestamp = self.basicHeaderObj.get_datatime()
369 timestamp = self.basicHeaderObj.get_datatime()
400 print '[Reading] - Block {} - {}'.format(self.nTotalBlocks, timestamp)
370 print '[Reading] - Block {} - {}'.format(self.nTotalBlocks, timestamp)
401 current_pointer_location = self.blockPointer
371 current_pointer_location = self.blockPointer
402 junk = numpy.fromstring( block[self.blockPointer:], self.dtype, self.blocksize )
372 junk = numpy.fromstring( block[self.blockPointer:], self.dtype, self.blocksize )
403
373
404 try:
374 try:
405 junk = junk.reshape( (self.processingHeaderObj.profilesPerBlock, self.processingHeaderObj.nHeights, self.systemHeaderObj.nChannels) )
375 junk = junk.reshape( (self.processingHeaderObj.profilesPerBlock, self.processingHeaderObj.nHeights, self.systemHeaderObj.nChannels) )
406 except:
376 except:
407 #print "The read block (%3d) has not enough data" %self.nReadBlocks
377 #print "The read block (%3d) has not enough data" %self.nReadBlocks
408 if self.waitDataBlock(pointer_location=current_pointer_location):
378 if self.waitDataBlock(pointer_location=current_pointer_location):
409 junk = numpy.fromstring( block[self.blockPointer:], self.dtype, self.blocksize )
379 junk = numpy.fromstring( block[self.blockPointer:], self.dtype, self.blocksize )
410 junk = junk.reshape( (self.processingHeaderObj.profilesPerBlock, self.processingHeaderObj.nHeights, self.systemHeaderObj.nChannels) )
380 junk = junk.reshape( (self.processingHeaderObj.profilesPerBlock, self.processingHeaderObj.nHeights, self.systemHeaderObj.nChannels) )
411 # return 0
381 # return 0
412
382
413 #Dimensions : nChannels, nProfiles, nSamples
383 #Dimensions : nChannels, nProfiles, nSamples
414
384
415 junk = numpy.transpose(junk, (2,0,1))
385 junk = numpy.transpose(junk, (2,0,1))
416 self.datablock = junk['real'] + junk['imag'] * 1j
386 self.datablock = junk['real'] + junk['imag'] * 1j
417 self.profileIndex = 0
387 self.profileIndex = 0
418 if self.selBlocksize == None: self.selBlocksize = self.dataOut.nProfiles
388 if self.selBlocksize == None: self.selBlocksize = self.dataOut.nProfiles
419 if self.selBlocktime != None:
389 if self.selBlocktime != None:
420 if self.dataOut.nCohInt is not None:
390 if self.dataOut.nCohInt is not None:
421 nCohInt = self.dataOut.nCohInt
391 nCohInt = self.dataOut.nCohInt
422 else:
392 else:
423 nCohInt = 1
393 nCohInt = 1
424 self.selBlocksize = int(self.dataOut.nProfiles*round(self.selBlocktime/(nCohInt*self.dataOut.ippSeconds*self.dataOut.nProfiles)))
394 self.selBlocksize = int(self.dataOut.nProfiles*round(self.selBlocktime/(nCohInt*self.dataOut.ippSeconds*self.dataOut.nProfiles)))
425 self.dataOut.data = self.datablock[:,self.profileIndex:self.profileIndex+self.selBlocksize,:]
395 self.dataOut.data = self.datablock[:,self.profileIndex:self.profileIndex+self.selBlocksize,:]
426 datasize = self.dataOut.data.shape[1]
396 datasize = self.dataOut.data.shape[1]
427 if datasize < self.selBlocksize:
397 if datasize < self.selBlocksize:
428 buffer = numpy.zeros((self.dataOut.data.shape[0], self.selBlocksize, self.dataOut.data.shape[2]), dtype = 'complex')
398 buffer = numpy.zeros((self.dataOut.data.shape[0], self.selBlocksize, self.dataOut.data.shape[2]), dtype = 'complex')
429 buffer[:,:datasize,:] = self.dataOut.data
399 buffer[:,:datasize,:] = self.dataOut.data
430 self.dataOut.data = buffer
400 self.dataOut.data = buffer
431 self.profileIndex = blockIndex
401 self.profileIndex = blockIndex
432
402
433 self.dataOut.flagDataAsBlock = True
403 self.dataOut.flagDataAsBlock = True
434 self.flagIsNewBlock = 1
404 self.flagIsNewBlock = 1
435 self.dataOut.realtime = self.online
405 self.dataOut.realtime = self.online
436
406
437 return self.dataOut.data
407 return self.dataOut.data
438
408
439 def getData(self):
409 def getData(self):
440 """
410 """
441 <<<<<<< HEAD
442 getData obtiene una unidad de datos del buffer de lectura, un perfil, y la copia al objeto self.dataOut
443 del tipo "Voltage" con todos los parametros asociados a este (metadata). cuando no hay datos
444 en el buffer de lectura es necesario hacer una nueva lectura de los bloques de datos usando
445 "readNextBlock"
446
447 Ademas incrementa el contador del buffer "self.profileIndex" en 1.
448
449 Return:
450
451 Si el flag self.getByBlock ha sido seteado el bloque completo es copiado a self.dataOut y el self.profileIndex
452 es igual al total de perfiles leidos desde el archivo.
453
454 Si self.getByBlock == False:
455
456 self.dataOut.data = buffer[:, thisProfile, :]
457
458 shape = [nChannels, nHeis]
459
460 Si self.getByBlock == True:
461
462 self.dataOut.data = buffer[:, :, :]
463
464 shape = [nChannels, nProfiles, nHeis]
465
466 Variables afectadas:
467 self.dataOut
468 self.profileIndex
469
470 Affected:
471 self.dataOut
472 self.profileIndex
473 self.flagDiscontinuousBlock
474 self.flagIsNewBlock
475 =======
476 getData obtiene una unidad de datos del buffer de lectura, un perfil, y la copia al objeto self.dataOut
411 getData obtiene una unidad de datos del buffer de lectura, un perfil, y la copia al objeto self.dataOut
477 del tipo "Voltage" con todos los parametros asociados a este (metadata). cuando no hay datos
412 del tipo "Voltage" con todos los parametros asociados a este (metadata). cuando no hay datos
478 en el buffer de lectura es necesario hacer una nueva lectura de los bloques de datos usando
413 en el buffer de lectura es necesario hacer una nueva lectura de los bloques de datos usando
479 "readNextBlock"
414 "readNextBlock"
480
415
481 Ademas incrementa el contador del buffer "self.profileIndex" en 1.
416 Ademas incrementa el contador del buffer "self.profileIndex" en 1.
482
417
483 Return:
418 Return:
484
419
485 Si el flag self.getByBlock ha sido seteado el bloque completo es copiado a self.dataOut y el self.profileIndex
420 Si el flag self.getByBlock ha sido seteado el bloque completo es copiado a self.dataOut y el self.profileIndex
486 es igual al total de perfiles leidos desde el archivo.
421 es igual al total de perfiles leidos desde el archivo.
487
422
488 Si self.getByBlock == False:
423 Si self.getByBlock == False:
489
424
490 self.dataOut.data = buffer[:, thisProfile, :]
425 self.dataOut.data = buffer[:, thisProfile, :]
491
426
492 shape = [nChannels, nHeis]
427 shape = [nChannels, nHeis]
493
428
494 Si self.getByBlock == True:
429 Si self.getByBlock == True:
495
430
496 self.dataOut.data = buffer[:, :, :]
431 self.dataOut.data = buffer[:, :, :]
497
432
498 shape = [nChannels, nProfiles, nHeis]
433 shape = [nChannels, nProfiles, nHeis]
499
434
500 Variables afectadas:
435 Variables afectadas:
501 self.dataOut
436 self.dataOut
502 self.profileIndex
437 self.profileIndex
503
438
504 Affected:
439 Affected:
505 self.dataOut
440 self.dataOut
506 self.profileIndex
441 self.profileIndex
507 self.flagDiscontinuousBlock
442 self.flagDiscontinuousBlock
508 self.flagIsNewBlock
443 self.flagIsNewBlock
509 >>>>>>> online_data_hour
510 """
444 """
511 if self.flagNoMoreFiles:
445 if self.flagNoMoreFiles:
512 self.dataOut.flagNoData = True
446 self.dataOut.flagNoData = True
513 print 'Process finished'
447 print 'Process finished'
514 return 0
448 return 0
515 self.flagDiscontinuousBlock = 0
449 self.flagDiscontinuousBlock = 0
516 self.flagIsNewBlock = 0
450 self.flagIsNewBlock = 0
517 if self.__hasNotDataInBuffer():
451 if self.__hasNotDataInBuffer():
518 if not( self.readNextBlock() ):
452 if not( self.readNextBlock() ):
519 return 0
453 return 0
520
454
521 self.getFirstHeader()
455 self.getFirstHeader()
522
456
523 self.reshapeData()
457 self.reshapeData()
524 if self.datablock is None:
458 if self.datablock is None:
525 self.dataOut.flagNoData = True
459 self.dataOut.flagNoData = True
526 return 0
460 return 0
527
461
528 if not self.getByBlock:
462 if not self.getByBlock:
529
463
530 """
464 """
531 <<<<<<< HEAD
532 Return profile by profile
533
534 If nTxs > 1 then one profile is divided by nTxs and number of total
535 blocks is increased by nTxs (nProfiles *= nTxs)
536 =======
537 Return profile by profile
465 Return profile by profile
538
466
539 If nTxs > 1 then one profile is divided by nTxs and number of total
467 If nTxs > 1 then one profile is divided by nTxs and number of total
540 blocks is increased by nTxs (nProfiles *= nTxs)
468 blocks is increased by nTxs (nProfiles *= nTxs)
541 >>>>>>> online_data_hour
542 """
469 """
543 self.dataOut.flagDataAsBlock = False
470 self.dataOut.flagDataAsBlock = False
544 self.dataOut.data = self.datablock[:,self.profileIndex,:]
471 self.dataOut.data = self.datablock[:,self.profileIndex,:]
545 self.dataOut.profileIndex = self.profileIndex
472 self.dataOut.profileIndex = self.profileIndex
546
473
547 self.profileIndex += 1
474 self.profileIndex += 1
548 <<<<<<< HEAD
549
550 # elif self.selBlocksize==None or self.selBlocksize==self.dataOut.nProfiles:
551 # """
552 # Return all block
553 # """
554 # self.dataOut.flagDataAsBlock = True
555 # self.dataOut.data = self.datablock
556 # self.dataOut.profileIndex = self.dataOut.nProfiles - 1
557 #
558 # self.profileIndex = self.dataOut.nProfiles
559
560 =======
561
475
562 # elif self.selBlocksize==None or self.selBlocksize==self.dataOut.nProfiles:
476 # elif self.selBlocksize==None or self.selBlocksize==self.dataOut.nProfiles:
563 # """
477 # """
564 # Return all block
478 # Return all block
565 # """
479 # """
566 # self.dataOut.flagDataAsBlock = True
480 # self.dataOut.flagDataAsBlock = True
567 # self.dataOut.data = self.datablock
481 # self.dataOut.data = self.datablock
568 # self.dataOut.profileIndex = self.dataOut.nProfiles - 1
482 # self.dataOut.profileIndex = self.dataOut.nProfiles - 1
569 #
483 #
570 # self.profileIndex = self.dataOut.nProfiles
484 # self.profileIndex = self.dataOut.nProfiles
571
485
572 >>>>>>> online_data_hour
573 else:
486 else:
574 """
487 """
575 Return a block
488 Return a block
576 """
489 """
577 if self.selBlocksize == None: self.selBlocksize = self.dataOut.nProfiles
490 if self.selBlocksize == None: self.selBlocksize = self.dataOut.nProfiles
578 if self.selBlocktime != None:
491 if self.selBlocktime != None:
579 if self.dataOut.nCohInt is not None:
492 if self.dataOut.nCohInt is not None:
580 nCohInt = self.dataOut.nCohInt
493 nCohInt = self.dataOut.nCohInt
581 else:
494 else:
582 nCohInt = 1
495 nCohInt = 1
583 self.selBlocksize = int(self.dataOut.nProfiles*round(self.selBlocktime/(nCohInt*self.dataOut.ippSeconds*self.dataOut.nProfiles)))
496 self.selBlocksize = int(self.dataOut.nProfiles*round(self.selBlocktime/(nCohInt*self.dataOut.ippSeconds*self.dataOut.nProfiles)))
584
497
585 self.dataOut.data = self.datablock[:,self.profileIndex:self.profileIndex+self.selBlocksize,:]
498 self.dataOut.data = self.datablock[:,self.profileIndex:self.profileIndex+self.selBlocksize,:]
586 self.profileIndex += self.selBlocksize
499 self.profileIndex += self.selBlocksize
587 datasize = self.dataOut.data.shape[1]
500 datasize = self.dataOut.data.shape[1]
588
501
589 if datasize < self.selBlocksize:
502 if datasize < self.selBlocksize:
590 buffer = numpy.zeros((self.dataOut.data.shape[0],self.selBlocksize,self.dataOut.data.shape[2]), dtype = 'complex')
503 buffer = numpy.zeros((self.dataOut.data.shape[0],self.selBlocksize,self.dataOut.data.shape[2]), dtype = 'complex')
591 buffer[:,:datasize,:] = self.dataOut.data
504 buffer[:,:datasize,:] = self.dataOut.data
592
505
593 while datasize < self.selBlocksize: #Not enough profiles to fill the block
506 while datasize < self.selBlocksize: #Not enough profiles to fill the block
594 if not( self.readNextBlock() ):
507 if not( self.readNextBlock() ):
595 return 0
508 return 0
596 self.getFirstHeader()
509 self.getFirstHeader()
597 self.reshapeData()
510 self.reshapeData()
598 if self.datablock is None:
511 if self.datablock is None:
599 self.dataOut.flagNoData = True
512 self.dataOut.flagNoData = True
600 return 0
513 return 0
601 #stack data
514 #stack data
602 blockIndex = self.selBlocksize - datasize
515 blockIndex = self.selBlocksize - datasize
603 datablock1 = self.datablock[:,:blockIndex,:]
516 datablock1 = self.datablock[:,:blockIndex,:]
604
517
605 buffer[:,datasize:datasize+datablock1.shape[1],:] = datablock1
518 buffer[:,datasize:datasize+datablock1.shape[1],:] = datablock1
606 datasize += datablock1.shape[1]
519 datasize += datablock1.shape[1]
607
520
608 self.dataOut.data = buffer
521 self.dataOut.data = buffer
609 self.profileIndex = blockIndex
522 self.profileIndex = blockIndex
610
523
611 self.dataOut.flagDataAsBlock = True
524 self.dataOut.flagDataAsBlock = True
612 self.dataOut.nProfiles = self.dataOut.data.shape[1]
525 self.dataOut.nProfiles = self.dataOut.data.shape[1]
613
526
614 self.dataOut.flagNoData = False
527 self.dataOut.flagNoData = False
615
528
616 self.getBasicHeader()
529 self.getBasicHeader()
617
530
618 self.dataOut.realtime = self.online
531 self.dataOut.realtime = self.online
619
532
620 return self.dataOut.data
533 return self.dataOut.data
621
534
622 class VoltageWriter(JRODataWriter, Operation):
535 class VoltageWriter(JRODataWriter, Operation):
623 """
536 """
624 Esta clase permite escribir datos de voltajes a archivos procesados (.r). La escritura
537 Esta clase permite escribir datos de voltajes a archivos procesados (.r). La escritura
625 de los datos siempre se realiza por bloques.
538 de los datos siempre se realiza por bloques.
626 """
539 """
627
540
628 ext = ".r"
541 ext = ".r"
629
542
630 optchar = "D"
543 optchar = "D"
631
544
632 shapeBuffer = None
545 shapeBuffer = None
633
546
634
547
635 def __init__(self, **kwargs):
548 def __init__(self, **kwargs):
636 """
549 """
637 Inicializador de la clase VoltageWriter para la escritura de datos de espectros.
550 Inicializador de la clase VoltageWriter para la escritura de datos de espectros.
638
551
639 Affected:
552 Affected:
640 self.dataOut
553 self.dataOut
641
554
642 Return: None
555 Return: None
643 """
556 """
644 Operation.__init__(self, **kwargs)
557 Operation.__init__(self, **kwargs)
645
558
646 self.nTotalBlocks = 0
559 self.nTotalBlocks = 0
647
560
648 self.profileIndex = 0
561 self.profileIndex = 0
649
562
650 self.isConfig = False
563 self.isConfig = False
651
564
652 self.fp = None
565 self.fp = None
653
566
654 self.flagIsNewFile = 1
567 self.flagIsNewFile = 1
655
568
656 self.blockIndex = 0
569 self.blockIndex = 0
657
570
658 self.flagIsNewBlock = 0
571 self.flagIsNewBlock = 0
659
572
660 self.setFile = None
573 self.setFile = None
661
574
662 self.dtype = None
575 self.dtype = None
663
576
664 self.path = None
577 self.path = None
665
578
666 self.filename = None
579 self.filename = None
667
580
668 self.basicHeaderObj = BasicHeader(LOCALTIME)
581 self.basicHeaderObj = BasicHeader(LOCALTIME)
669
582
670 self.systemHeaderObj = SystemHeader()
583 self.systemHeaderObj = SystemHeader()
671
584
672 self.radarControllerHeaderObj = RadarControllerHeader()
585 self.radarControllerHeaderObj = RadarControllerHeader()
673
586
674 self.processingHeaderObj = ProcessingHeader()
587 self.processingHeaderObj = ProcessingHeader()
675
588
676 def hasAllDataInBuffer(self):
589 def hasAllDataInBuffer(self):
677 if self.profileIndex >= self.processingHeaderObj.profilesPerBlock:
590 if self.profileIndex >= self.processingHeaderObj.profilesPerBlock:
678 return 1
591 return 1
679 return 0
592 return 0
680
593
681
594
682 def setBlockDimension(self):
595 def setBlockDimension(self):
683 """
596 """
684 Obtiene las formas dimensionales del los subbloques de datos que componen un bloque
597 Obtiene las formas dimensionales del los subbloques de datos que componen un bloque
685
598
686 Affected:
599 Affected:
687 self.shape_spc_Buffer
600 self.shape_spc_Buffer
688 self.shape_cspc_Buffer
601 self.shape_cspc_Buffer
689 self.shape_dc_Buffer
602 self.shape_dc_Buffer
690
603
691 Return: None
604 Return: None
692 """
605 """
693 self.shapeBuffer = (self.processingHeaderObj.profilesPerBlock,
606 self.shapeBuffer = (self.processingHeaderObj.profilesPerBlock,
694 self.processingHeaderObj.nHeights,
607 self.processingHeaderObj.nHeights,
695 self.systemHeaderObj.nChannels)
608 self.systemHeaderObj.nChannels)
696
609
697 self.datablock = numpy.zeros((self.systemHeaderObj.nChannels,
610 self.datablock = numpy.zeros((self.systemHeaderObj.nChannels,
698 self.processingHeaderObj.profilesPerBlock,
611 self.processingHeaderObj.profilesPerBlock,
699 self.processingHeaderObj.nHeights),
612 self.processingHeaderObj.nHeights),
700 dtype=numpy.dtype('complex64'))
613 dtype=numpy.dtype('complex64'))
701
614
702 def writeBlock(self):
615 def writeBlock(self):
703 """
616 """
704 Escribe el buffer en el file designado
617 Escribe el buffer en el file designado
705
618
706 Affected:
619 Affected:
707 self.profileIndex
620 self.profileIndex
708 self.flagIsNewFile
621 self.flagIsNewFile
709 self.flagIsNewBlock
622 self.flagIsNewBlock
710 self.nTotalBlocks
623 self.nTotalBlocks
711 self.blockIndex
624 self.blockIndex
712
625
713 Return: None
626 Return: None
714 """
627 """
715 data = numpy.zeros( self.shapeBuffer, self.dtype )
628 data = numpy.zeros( self.shapeBuffer, self.dtype )
716
629
717 junk = numpy.transpose(self.datablock, (1,2,0))
630 junk = numpy.transpose(self.datablock, (1,2,0))
718
631
719 data['real'] = junk.real
632 data['real'] = junk.real
720 data['imag'] = junk.imag
633 data['imag'] = junk.imag
721
634
722 data = data.reshape( (-1) )
635 data = data.reshape( (-1) )
723
636
724 data.tofile( self.fp )
637 data.tofile( self.fp )
725
638
726 self.datablock.fill(0)
639 self.datablock.fill(0)
727
640
728 self.profileIndex = 0
641 self.profileIndex = 0
729 self.flagIsNewFile = 0
642 self.flagIsNewFile = 0
730 self.flagIsNewBlock = 1
643 self.flagIsNewBlock = 1
731
644
732 self.blockIndex += 1
645 self.blockIndex += 1
733 self.nTotalBlocks += 1
646 self.nTotalBlocks += 1
734
647
735 # print "[Writing] Block = %04d" %self.blockIndex
648 # print "[Writing] Block = %04d" %self.blockIndex
736
649
737 def putData(self):
650 def putData(self):
738 """
651 """
739 Setea un bloque de datos y luego los escribe en un file
652 Setea un bloque de datos y luego los escribe en un file
740
653
741 Affected:
654 Affected:
742 self.flagIsNewBlock
655 self.flagIsNewBlock
743 self.profileIndex
656 self.profileIndex
744
657
745 Return:
658 Return:
746 0 : Si no hay data o no hay mas files que puedan escribirse
659 0 : Si no hay data o no hay mas files que puedan escribirse
747 1 : Si se escribio la data de un bloque en un file
660 1 : Si se escribio la data de un bloque en un file
748 """
661 """
749 if self.dataOut.flagNoData:
662 if self.dataOut.flagNoData:
750 return 0
663 return 0
751
664
752 self.flagIsNewBlock = 0
665 self.flagIsNewBlock = 0
753
666
754 if self.dataOut.flagDiscontinuousBlock:
667 if self.dataOut.flagDiscontinuousBlock:
755 self.datablock.fill(0)
668 self.datablock.fill(0)
756 self.profileIndex = 0
669 self.profileIndex = 0
757 self.setNextFile()
670 self.setNextFile()
758
671
759 if self.profileIndex == 0:
672 if self.profileIndex == 0:
760 self.setBasicHeader()
673 self.setBasicHeader()
761
674
762 self.datablock[:,self.profileIndex,:] = self.dataOut.data
675 self.datablock[:,self.profileIndex,:] = self.dataOut.data
763
676
764 self.profileIndex += 1
677 self.profileIndex += 1
765
678
766 if self.hasAllDataInBuffer():
679 if self.hasAllDataInBuffer():
767 #if self.flagIsNewFile:
680 #if self.flagIsNewFile:
768 self.writeNextBlock()
681 self.writeNextBlock()
769 # self.setFirstHeader()
682 # self.setFirstHeader()
770
683
771 return 1
684 return 1
772
685
773 def __getBlockSize(self):
686 def __getBlockSize(self):
774 '''
687 '''
775 Este metodos determina el cantidad de bytes para un bloque de datos de tipo Voltage
688 Este metodos determina el cantidad de bytes para un bloque de datos de tipo Voltage
776 '''
689 '''
777
690
778 dtype_width = self.getDtypeWidth()
691 dtype_width = self.getDtypeWidth()
779
692
780 blocksize = int(self.dataOut.nHeights * self.dataOut.nChannels * self.profilesPerBlock * dtype_width * 2)
693 blocksize = int(self.dataOut.nHeights * self.dataOut.nChannels * self.profilesPerBlock * dtype_width * 2)
781
694
782 return blocksize
695 return blocksize
783
696
784 def setFirstHeader(self):
697 def setFirstHeader(self):
785
698
786 """
699 """
787 Obtiene una copia del First Header
700 Obtiene una copia del First Header
788
701
789 Affected:
702 Affected:
790 self.systemHeaderObj
703 self.systemHeaderObj
791 self.radarControllerHeaderObj
704 self.radarControllerHeaderObj
792 self.dtype
705 self.dtype
793
706
794 Return:
707 Return:
795 None
708 None
796 """
709 """
797
710
798 self.systemHeaderObj = self.dataOut.systemHeaderObj.copy()
711 self.systemHeaderObj = self.dataOut.systemHeaderObj.copy()
799 self.systemHeaderObj.nChannels = self.dataOut.nChannels
712 self.systemHeaderObj.nChannels = self.dataOut.nChannels
800 self.radarControllerHeaderObj = self.dataOut.radarControllerHeaderObj.copy()
713 self.radarControllerHeaderObj = self.dataOut.radarControllerHeaderObj.copy()
801
714
802 self.processingHeaderObj.dtype = 0 # Voltage
715 self.processingHeaderObj.dtype = 0 # Voltage
803 self.processingHeaderObj.blockSize = self.__getBlockSize()
716 self.processingHeaderObj.blockSize = self.__getBlockSize()
804 self.processingHeaderObj.profilesPerBlock = self.profilesPerBlock
717 self.processingHeaderObj.profilesPerBlock = self.profilesPerBlock
805 self.processingHeaderObj.dataBlocksPerFile = self.blocksPerFile
718 self.processingHeaderObj.dataBlocksPerFile = self.blocksPerFile
806 self.processingHeaderObj.nWindows = 1 #podria ser 1 o self.dataOut.processingHeaderObj.nWindows
719 self.processingHeaderObj.nWindows = 1 #podria ser 1 o self.dataOut.processingHeaderObj.nWindows
807 self.processingHeaderObj.nCohInt = self.dataOut.nCohInt
720 self.processingHeaderObj.nCohInt = self.dataOut.nCohInt
808 self.processingHeaderObj.nIncohInt = 1 # Cuando la data de origen es de tipo Voltage
721 self.processingHeaderObj.nIncohInt = 1 # Cuando la data de origen es de tipo Voltage
809 self.processingHeaderObj.totalSpectra = 0 # Cuando la data de origen es de tipo Voltage
722 self.processingHeaderObj.totalSpectra = 0 # Cuando la data de origen es de tipo Voltage
810
723
811 if self.dataOut.code is not None:
724 if self.dataOut.code is not None:
812 self.processingHeaderObj.code = self.dataOut.code
725 self.processingHeaderObj.code = self.dataOut.code
813 self.processingHeaderObj.nCode = self.dataOut.nCode
726 self.processingHeaderObj.nCode = self.dataOut.nCode
814 self.processingHeaderObj.nBaud = self.dataOut.nBaud
727 self.processingHeaderObj.nBaud = self.dataOut.nBaud
815
728
816 if self.processingHeaderObj.nWindows != 0:
729 if self.processingHeaderObj.nWindows != 0:
817 self.processingHeaderObj.firstHeight = self.dataOut.heightList[0]
730 self.processingHeaderObj.firstHeight = self.dataOut.heightList[0]
818 self.processingHeaderObj.deltaHeight = self.dataOut.heightList[1] - self.dataOut.heightList[0]
731 self.processingHeaderObj.deltaHeight = self.dataOut.heightList[1] - self.dataOut.heightList[0]
819 self.processingHeaderObj.nHeights = self.dataOut.nHeights
732 self.processingHeaderObj.nHeights = self.dataOut.nHeights
820 self.processingHeaderObj.samplesWin = self.dataOut.nHeights
733 self.processingHeaderObj.samplesWin = self.dataOut.nHeights
821
734
822 self.processingHeaderObj.processFlags = self.getProcessFlags()
735 self.processingHeaderObj.processFlags = self.getProcessFlags()
823
736
824 self.setBasicHeader()
737 self.setBasicHeader()
@@ -1,1021 +1,1008
1 '''
1 '''
2 @author: Daniel Suarez
2 @author: Daniel Suarez
3 '''
3 '''
4 import os
4 import os
5 import glob
5 import glob
6 import ftplib
6 import ftplib
7
7
8 try:
8 try:
9 import paramiko
9 import paramiko
10 import scp
10 import scp
11 except:
11 except:
12 print "You should install paramiko and scp libraries \nif you want to use SSH protocol to upload files to the server"
12 print "You should install paramiko and scp libraries \nif you want to use SSH protocol to upload files to the server"
13
13
14 import time
14 import time
15
15
16 import threading
16 import threading
17 Thread = threading.Thread
17 Thread = threading.Thread
18
18
19 # try:
19 # try:
20 # from gevent import sleep
20 # from gevent import sleep
21 # except:
21 # except:
22 from time import sleep
22 from time import sleep
23
23
24 from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation
24 from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation
25
25
26 class Remote(Thread):
26 class Remote(Thread):
27 """
27 """
28 Remote is a parent class used to define the behaviour of FTP and SSH class. These clases are
28 Remote is a parent class used to define the behaviour of FTP and SSH class. These clases are
29 used to upload or download files remotely.
29 used to upload or download files remotely.
30
30
31 Non-standard Python modules used:
31 Non-standard Python modules used:
32 None
32 None
33
33
34 Written by:
34 Written by:
35 "Miguel Urco":mailto:miguel.urco@jro.igp.gob.pe Jun. 03, 2015
35 "Miguel Urco":mailto:miguel.urco@jro.igp.gob.pe Jun. 03, 2015
36 """
36 """
37
37
38 server = None
38 server = None
39 username = None
39 username = None
40 password = None
40 password = None
41 remotefolder = None
41 remotefolder = None
42
42
43 period = 60
43 period = 60
44 fileList = []
44 fileList = []
45 bussy = False
45 bussy = False
46
46
47 def __init__(self, server, username, password, remotefolder, period=60):
47 def __init__(self, server, username, password, remotefolder, period=60):
48
48
49 Thread.__init__(self)
49 Thread.__init__(self)
50
50
51 self.setDaemon(True)
51 self.setDaemon(True)
52
52
53 self.status = 0
53 self.status = 0
54
54
55 self.__server = server
55 self.__server = server
56 self.__username = username
56 self.__username = username
57 self.__password = password
57 self.__password = password
58 self.__remotefolder = remotefolder
58 self.__remotefolder = remotefolder
59
59
60 self.period = period
60 self.period = period
61
61
62 self.fileList = []
62 self.fileList = []
63 self.bussy = False
63 self.bussy = False
64
64
65 self.stopFlag = False
65 self.stopFlag = False
66
66
67 print "[Remote Server] Opening server: %s" %self.__server
67 print "[Remote Server] Opening server: %s" %self.__server
68 if self.open(self.__server, self.__username, self.__password, self.__remotefolder):
68 if self.open(self.__server, self.__username, self.__password, self.__remotefolder):
69 print "[Remote Server] %s server was opened successfully" %self.__server
69 print "[Remote Server] %s server was opened successfully" %self.__server
70
70
71 self.close()
71 self.close()
72
72
73 self.mutex = threading.Lock()
73 self.mutex = threading.Lock()
74
74
75 def stop(self):
75 def stop(self):
76
76
77 self.stopFlag = True
77 self.stopFlag = True
78 self.join(10)
78 self.join(10)
79
79
80 def open(self):
80 def open(self):
81 """
81 """
82 Connect to server and create a connection class (FTP or SSH) to remote server.
82 Connect to server and create a connection class (FTP or SSH) to remote server.
83 """
83 """
84 raise NotImplementedError, "Implement this method in child class"
84 raise NotImplementedError, "Implement this method in child class"
85
85
86 def close(self):
86 def close(self):
87 """
87 """
88 Close connection to server
88 Close connection to server
89 """
89 """
90 raise NotImplementedError, "Implement this method in child class"
90 raise NotImplementedError, "Implement this method in child class"
91
91
92 def mkdir(self, remotefolder):
92 def mkdir(self, remotefolder):
93 """
93 """
94 Create a folder remotely
94 Create a folder remotely
95 """
95 """
96 raise NotImplementedError, "Implement this method in child class"
96 raise NotImplementedError, "Implement this method in child class"
97
97
98 def cd(self, remotefolder):
98 def cd(self, remotefolder):
99 """
99 """
100 Change working directory in remote server
100 Change working directory in remote server
101 """
101 """
102 raise NotImplementedError, "Implement this method in child class"
102 raise NotImplementedError, "Implement this method in child class"
103
103
104 def download(self, filename, localfolder=None):
104 def download(self, filename, localfolder=None):
105 """
105 """
106 Download a file from server to local host
106 Download a file from server to local host
107 """
107 """
108 raise NotImplementedError, "Implement this method in child class"
108 raise NotImplementedError, "Implement this method in child class"
109
109
110 def sendFile(self, fullfilename):
110 def sendFile(self, fullfilename):
111 """
111 """
112 sendFile method is used to upload a local file to the current directory in remote server
112 sendFile method is used to upload a local file to the current directory in remote server
113
113
114 Inputs:
114 Inputs:
115 fullfilename - full path name of local file to store in remote directory
115 fullfilename - full path name of local file to store in remote directory
116
116
117 Returns:
117 Returns:
118 0 in error case else 1
118 0 in error case else 1
119 """
119 """
120 raise NotImplementedError, "Implement this method in child class"
120 raise NotImplementedError, "Implement this method in child class"
121
121
122 def upload(self, fullfilename, remotefolder=None):
122 def upload(self, fullfilename, remotefolder=None):
123 """
123 """
124 upload method is used to upload a local file to remote directory. This method changes
124 upload method is used to upload a local file to remote directory. This method changes
125 working directory before sending a file.
125 working directory before sending a file.
126
126
127 Inputs:
127 Inputs:
128 fullfilename - full path name of local file to store in remote directory
128 fullfilename - full path name of local file to store in remote directory
129
129
130 remotefolder - remote directory
130 remotefolder - remote directory
131
131
132 Returns:
132 Returns:
133 0 in error case else 1
133 0 in error case else 1
134 """
134 """
135 print "[Remote Server] Uploading %s to %s:%s" %(fullfilename, self.server, self.remotefolder)
135 print "[Remote Server] Uploading %s to %s:%s" %(fullfilename, self.server, self.remotefolder)
136
136
137 if not self.status:
137 if not self.status:
138 return 0
138 return 0
139
139
140 if remotefolder == None:
140 if remotefolder == None:
141 remotefolder = self.remotefolder
141 remotefolder = self.remotefolder
142
142
143 if not self.cd(remotefolder):
143 if not self.cd(remotefolder):
144 return 0
144 return 0
145
145
146 if not self.sendFile(fullfilename):
146 if not self.sendFile(fullfilename):
147 print "[Remote Server] Error uploading file %s" %fullfilename
147 print "[Remote Server] Error uploading file %s" %fullfilename
148 return 0
148 return 0
149
149
150 print "[Remote Server] upload finished successfully"
150 print "[Remote Server] upload finished successfully"
151
151
152 return 1
152 return 1
153
153
154 def delete(self, filename):
154 def delete(self, filename):
155 """
155 """
156 Remove a file from remote server
156 Remove a file from remote server
157 """
157 """
158 pass
158 pass
159
159
160 def updateFileList(self, fileList):
160 def updateFileList(self, fileList):
161 """
161 """
162 Remove a file from remote server
162 Remove a file from remote server
163 """
163 """
164
164
165 if fileList == self.fileList:
165 if fileList == self.fileList:
166 return 0
166 return 0
167
167
168 self.mutex.acquire()
168 self.mutex.acquire()
169 <<<<<<< HEAD
170 # init = time.time()
169 # init = time.time()
171 #
170 #
172 # while(self.bussy):
171 # while(self.bussy):
173 # sleep(0.1)
172 # sleep(0.1)
174 # if time.time() - init > 2*self.period:
173 # if time.time() - init > 2*self.period:
175 # return 0
174 # return 0
176 =======
177 # init = time.time()
178 #
179 # while(self.bussy):
180 # sleep(0.1)
181 # if time.time() - init > 2*self.period:
182 # return 0
183 >>>>>>> online_data_hour
184
175
185 self.fileList = fileList
176 self.fileList = fileList
186 self.mutex.release()
177 self.mutex.release()
187 return 1
178 return 1
188
179
189 def run(self):
180 def run(self):
190
181
191 if not self.status:
182 if not self.status:
192 print "Finishing FTP service"
183 print "Finishing FTP service"
193 return
184 return
194
185
195 if not self.cd(self.remotefolder):
186 if not self.cd(self.remotefolder):
196 raise ValueError, "Could not access to the new remote directory: %s" %self.remotefolder
187 raise ValueError, "Could not access to the new remote directory: %s" %self.remotefolder
197
188
198 while True:
189 while True:
199
190
200 for i in range(self.period):
191 for i in range(self.period):
201 if self.stopFlag:
192 if self.stopFlag:
202 break
193 break
203 sleep(1)
194 sleep(1)
204
195
205 if self.stopFlag:
196 if self.stopFlag:
206 break
197 break
207
198
208 <<<<<<< HEAD
209 # self.bussy = True
199 # self.bussy = True
210 =======
211 # self.bussy = True
212 >>>>>>> online_data_hour
213 self.mutex.acquire()
200 self.mutex.acquire()
214
201
215 print "[Remote Server] Opening %s" %self.__server
202 print "[Remote Server] Opening %s" %self.__server
216 if not self.open(self.__server, self.__username, self.__password, self.__remotefolder):
203 if not self.open(self.__server, self.__username, self.__password, self.__remotefolder):
217 self.mutex.release()
204 self.mutex.release()
218 continue
205 continue
219
206
220 for thisFile in self.fileList:
207 for thisFile in self.fileList:
221 self.upload(thisFile, self.remotefolder)
208 self.upload(thisFile, self.remotefolder)
222
209
223 print "[Remote Server] Closing %s" %self.__server
210 print "[Remote Server] Closing %s" %self.__server
224 self.close()
211 self.close()
225
212
226 self.mutex.release()
213 self.mutex.release()
227 # self.bussy = False
214 # self.bussy = False
228
215
229 print "[Remote Server] Thread stopped successfully"
216 print "[Remote Server] Thread stopped successfully"
230
217
231 class FTPClient(Remote):
218 class FTPClient(Remote):
232
219
233 __ftpClientObj = None
220 __ftpClientObj = None
234
221
235 def __init__(self, server, username, password, remotefolder, period=60):
222 def __init__(self, server, username, password, remotefolder, period=60):
236 """
223 """
237 """
224 """
238 Remote.__init__(self, server, username, password, remotefolder, period)
225 Remote.__init__(self, server, username, password, remotefolder, period)
239
226
240 def open(self, server, username, password, remotefolder):
227 def open(self, server, username, password, remotefolder):
241
228
242 """
229 """
243 This method is used to set FTP parameters and establish a connection to remote server
230 This method is used to set FTP parameters and establish a connection to remote server
244
231
245 Inputs:
232 Inputs:
246 server - remote server IP Address
233 server - remote server IP Address
247
234
248 username - remote server Username
235 username - remote server Username
249
236
250 password - remote server password
237 password - remote server password
251
238
252 remotefolder - remote server current working directory
239 remotefolder - remote server current working directory
253
240
254 Return:
241 Return:
255 Boolean - Returns 1 if a connection has been established, 0 otherwise
242 Boolean - Returns 1 if a connection has been established, 0 otherwise
256
243
257 Affects:
244 Affects:
258 self.status - in case of error or fail connection this parameter is set to 0 else 1
245 self.status - in case of error or fail connection this parameter is set to 0 else 1
259
246
260 """
247 """
261
248
262 if server == None:
249 if server == None:
263 raise ValueError, "FTP server should be defined"
250 raise ValueError, "FTP server should be defined"
264
251
265 if username == None:
252 if username == None:
266 raise ValueError, "FTP username should be defined"
253 raise ValueError, "FTP username should be defined"
267
254
268 if password == None:
255 if password == None:
269 raise ValueError, "FTP password should be defined"
256 raise ValueError, "FTP password should be defined"
270
257
271 if remotefolder == None:
258 if remotefolder == None:
272 raise ValueError, "FTP remote folder should be defined"
259 raise ValueError, "FTP remote folder should be defined"
273
260
274 try:
261 try:
275 ftpClientObj = ftplib.FTP(server)
262 ftpClientObj = ftplib.FTP(server)
276 except ftplib.all_errors, e:
263 except ftplib.all_errors, e:
277 print "[FTP Server]: FTP server connection fail: %s" %server
264 print "[FTP Server]: FTP server connection fail: %s" %server
278 print "[FTP Server]:", e
265 print "[FTP Server]:", e
279 self.status = 0
266 self.status = 0
280 return 0
267 return 0
281
268
282 try:
269 try:
283 ftpClientObj.login(username, password)
270 ftpClientObj.login(username, password)
284 except ftplib.all_errors:
271 except ftplib.all_errors:
285 print "[FTP Server]: FTP username or password are incorrect"
272 print "[FTP Server]: FTP username or password are incorrect"
286 self.status = 0
273 self.status = 0
287 return 0
274 return 0
288
275
289 if remotefolder == None:
276 if remotefolder == None:
290 remotefolder = ftpClientObj.pwd()
277 remotefolder = ftpClientObj.pwd()
291 else:
278 else:
292 try:
279 try:
293 ftpClientObj.cwd(remotefolder)
280 ftpClientObj.cwd(remotefolder)
294 except ftplib.all_errors:
281 except ftplib.all_errors:
295 print "[FTP Server]: FTP remote folder is invalid: %s" %remotefolder
282 print "[FTP Server]: FTP remote folder is invalid: %s" %remotefolder
296 remotefolder = ftpClientObj.pwd()
283 remotefolder = ftpClientObj.pwd()
297
284
298 self.server = server
285 self.server = server
299 self.username = username
286 self.username = username
300 self.password = password
287 self.password = password
301 self.remotefolder = remotefolder
288 self.remotefolder = remotefolder
302 self.__ftpClientObj = ftpClientObj
289 self.__ftpClientObj = ftpClientObj
303 self.status = 1
290 self.status = 1
304
291
305 return 1
292 return 1
306
293
307 def close(self):
294 def close(self):
308 """
295 """
309 Close connection to remote server
296 Close connection to remote server
310 """
297 """
311 if not self.status:
298 if not self.status:
312 return 0
299 return 0
313
300
314 self.__ftpClientObj.close()
301 self.__ftpClientObj.close()
315
302
316 def mkdir(self, remotefolder):
303 def mkdir(self, remotefolder):
317 """
304 """
318 mkdir is used to make a new directory in remote server
305 mkdir is used to make a new directory in remote server
319
306
320 Input:
307 Input:
321 remotefolder - directory name
308 remotefolder - directory name
322
309
323 Return:
310 Return:
324 0 in error case else 1
311 0 in error case else 1
325 """
312 """
326 if not self.status:
313 if not self.status:
327 return 0
314 return 0
328
315
329 try:
316 try:
330 self.__ftpClientObj.mkd(dirname)
317 self.__ftpClientObj.mkd(dirname)
331 except ftplib.all_errors:
318 except ftplib.all_errors:
332 print "[FTP Server]: Error creating remote folder: %s" %remotefolder
319 print "[FTP Server]: Error creating remote folder: %s" %remotefolder
333 return 0
320 return 0
334
321
335 return 1
322 return 1
336
323
337 def cd(self, remotefolder):
324 def cd(self, remotefolder):
338 """
325 """
339 cd is used to change remote working directory on server
326 cd is used to change remote working directory on server
340
327
341 Input:
328 Input:
342 remotefolder - current working directory
329 remotefolder - current working directory
343
330
344 Affects:
331 Affects:
345 self.remotefolder
332 self.remotefolder
346
333
347 Return:
334 Return:
348 0 in case of error else 1
335 0 in case of error else 1
349 """
336 """
350 if not self.status:
337 if not self.status:
351 return 0
338 return 0
352
339
353 if remotefolder == self.remotefolder:
340 if remotefolder == self.remotefolder:
354 return 1
341 return 1
355
342
356 try:
343 try:
357 self.__ftpClientObj.cwd(remotefolder)
344 self.__ftpClientObj.cwd(remotefolder)
358 except ftplib.all_errors:
345 except ftplib.all_errors:
359 print '[FTP Server]: Error changing to %s' %remotefolder
346 print '[FTP Server]: Error changing to %s' %remotefolder
360 print '[FTP Server]: Trying to create remote folder'
347 print '[FTP Server]: Trying to create remote folder'
361
348
362 if not self.mkdir(remotefolder):
349 if not self.mkdir(remotefolder):
363 print '[FTP Server]: Remote folder could not be created'
350 print '[FTP Server]: Remote folder could not be created'
364 return 0
351 return 0
365
352
366 try:
353 try:
367 self.__ftpClientObj.cwd(remotefolder)
354 self.__ftpClientObj.cwd(remotefolder)
368 except ftplib.all_errors:
355 except ftplib.all_errors:
369 return 0
356 return 0
370
357
371 self.remotefolder = remotefolder
358 self.remotefolder = remotefolder
372
359
373 return 1
360 return 1
374
361
375 def sendFile(self, fullfilename):
362 def sendFile(self, fullfilename):
376
363
377 if not self.status:
364 if not self.status:
378 return 0
365 return 0
379
366
380 fp = open(fullfilename, 'rb')
367 fp = open(fullfilename, 'rb')
381
368
382 filename = os.path.basename(fullfilename)
369 filename = os.path.basename(fullfilename)
383
370
384 command = "STOR %s" %filename
371 command = "STOR %s" %filename
385
372
386 try:
373 try:
387 self.__ftpClientObj.storbinary(command, fp)
374 self.__ftpClientObj.storbinary(command, fp)
388 except ftplib.all_errors, e:
375 except ftplib.all_errors, e:
389 print "[FTP Server]:", e
376 print "[FTP Server]:", e
390 return 0
377 return 0
391
378
392 try:
379 try:
393 self.__ftpClientObj.sendcmd('SITE CHMOD 755 ' + filename)
380 self.__ftpClientObj.sendcmd('SITE CHMOD 755 ' + filename)
394 except ftplib.all_errors, e:
381 except ftplib.all_errors, e:
395 print "[FTP Server]:", e
382 print "[FTP Server]:", e
396
383
397 fp.close()
384 fp.close()
398
385
399 return 1
386 return 1
400
387
401 class SSHClient(Remote):
388 class SSHClient(Remote):
402
389
403 __sshClientObj = None
390 __sshClientObj = None
404 __scpClientObj = None
391 __scpClientObj = None
405
392
406 def __init__(self, server, username, password, remotefolder, period=60):
393 def __init__(self, server, username, password, remotefolder, period=60):
407 """
394 """
408 """
395 """
409 Remote.__init__(self, server, username, password, remotefolder, period)
396 Remote.__init__(self, server, username, password, remotefolder, period)
410
397
411 def open(self, server, username, password, remotefolder, port=22):
398 def open(self, server, username, password, remotefolder, port=22):
412
399
413 """
400 """
414 This method is used to set SSH parameters and establish a connection to a remote server
401 This method is used to set SSH parameters and establish a connection to a remote server
415
402
416 Inputs:
403 Inputs:
417 server - remote server IP Address
404 server - remote server IP Address
418
405
419 username - remote server Username
406 username - remote server Username
420
407
421 password - remote server password
408 password - remote server password
422
409
423 remotefolder - remote server current working directory
410 remotefolder - remote server current working directory
424
411
425 Return: void
412 Return: void
426
413
427 Affects:
414 Affects:
428 self.status - in case of error or fail connection this parameter is set to 0 else 1
415 self.status - in case of error or fail connection this parameter is set to 0 else 1
429
416
430 """
417 """
431 import socket
418 import socket
432
419
433 if server == None:
420 if server == None:
434 raise ValueError, "SSH server should be defined"
421 raise ValueError, "SSH server should be defined"
435
422
436 if username == None:
423 if username == None:
437 raise ValueError, "SSH username should be defined"
424 raise ValueError, "SSH username should be defined"
438
425
439 if password == None:
426 if password == None:
440 raise ValueError, "SSH password should be defined"
427 raise ValueError, "SSH password should be defined"
441
428
442 if remotefolder == None:
429 if remotefolder == None:
443 raise ValueError, "SSH remote folder should be defined"
430 raise ValueError, "SSH remote folder should be defined"
444
431
445 sshClientObj = paramiko.SSHClient()
432 sshClientObj = paramiko.SSHClient()
446
433
447 sshClientObj.load_system_host_keys()
434 sshClientObj.load_system_host_keys()
448 sshClientObj.set_missing_host_key_policy(paramiko.WarningPolicy())
435 sshClientObj.set_missing_host_key_policy(paramiko.WarningPolicy())
449
436
450 self.status = 0
437 self.status = 0
451 try:
438 try:
452 sshClientObj.connect(server, username=username, password=password, port=port)
439 sshClientObj.connect(server, username=username, password=password, port=port)
453 except paramiko.AuthenticationException, e:
440 except paramiko.AuthenticationException, e:
454 # print "SSH username or password are incorrect: %s"
441 # print "SSH username or password are incorrect: %s"
455 print "[SSH Server]:", e
442 print "[SSH Server]:", e
456 return 0
443 return 0
457 except SSHException, e:
444 except SSHException, e:
458 print "[SSH Server]:", e
445 print "[SSH Server]:", e
459 return 0
446 return 0
460 except socket.error:
447 except socket.error:
461 self.status = 0
448 self.status = 0
462 print "[SSH Server]:", e
449 print "[SSH Server]:", e
463 return 0
450 return 0
464
451
465 self.status = 1
452 self.status = 1
466 scpClientObj = scp.SCPClient(sshClientObj.get_transport(), socket_timeout=30)
453 scpClientObj = scp.SCPClient(sshClientObj.get_transport(), socket_timeout=30)
467
454
468 if remotefolder == None:
455 if remotefolder == None:
469 remotefolder = self.pwd()
456 remotefolder = self.pwd()
470
457
471 self.server = server
458 self.server = server
472 self.username = username
459 self.username = username
473 self.password = password
460 self.password = password
474 self.__sshClientObj = sshClientObj
461 self.__sshClientObj = sshClientObj
475 self.__scpClientObj = scpClientObj
462 self.__scpClientObj = scpClientObj
476 self.status = 1
463 self.status = 1
477
464
478 if not self.cd(remotefolder):
465 if not self.cd(remotefolder):
479 raise ValueError, "[SSH Server]: Could not access to remote folder: %s" %remotefolder
466 raise ValueError, "[SSH Server]: Could not access to remote folder: %s" %remotefolder
480 return 0
467 return 0
481
468
482 self.remotefolder = remotefolder
469 self.remotefolder = remotefolder
483
470
484 return 1
471 return 1
485
472
486 def close(self):
473 def close(self):
487 """
474 """
488 Close connection to remote server
475 Close connection to remote server
489 """
476 """
490 if not self.status:
477 if not self.status:
491 return 0
478 return 0
492
479
493 self.__scpClientObj.close()
480 self.__scpClientObj.close()
494 self.__sshClientObj.close()
481 self.__sshClientObj.close()
495
482
496 def __execute(self, command):
483 def __execute(self, command):
497 """
484 """
498 __execute a command on remote server
485 __execute a command on remote server
499
486
500 Input:
487 Input:
501 command - Exmaple 'ls -l'
488 command - Exmaple 'ls -l'
502
489
503 Return:
490 Return:
504 0 in error case else 1
491 0 in error case else 1
505 """
492 """
506 if not self.status:
493 if not self.status:
507 return 0
494 return 0
508
495
509 stdin, stdout, stderr = self.__sshClientObj.exec_command(command)
496 stdin, stdout, stderr = self.__sshClientObj.exec_command(command)
510
497
511 result = stderr.readlines()
498 result = stderr.readlines()
512 if len(result) > 1:
499 if len(result) > 1:
513 return 0
500 return 0
514
501
515 result = stdout.readlines()
502 result = stdout.readlines()
516 if len(result) > 1:
503 if len(result) > 1:
517 return result[0][:-1]
504 return result[0][:-1]
518
505
519 return 1
506 return 1
520
507
521 def mkdir(self, remotefolder):
508 def mkdir(self, remotefolder):
522 """
509 """
523 mkdir is used to make a new directory in remote server
510 mkdir is used to make a new directory in remote server
524
511
525 Input:
512 Input:
526 remotefolder - directory name
513 remotefolder - directory name
527
514
528 Return:
515 Return:
529 0 in error case else 1
516 0 in error case else 1
530 """
517 """
531
518
532 command = 'mkdir %s' %remotefolder
519 command = 'mkdir %s' %remotefolder
533
520
534 return self.__execute(command)
521 return self.__execute(command)
535
522
536 def pwd(self):
523 def pwd(self):
537
524
538 command = 'pwd'
525 command = 'pwd'
539
526
540 return self.__execute(command)
527 return self.__execute(command)
541
528
542 def cd(self, remotefolder):
529 def cd(self, remotefolder):
543 """
530 """
544 cd is used to change remote working directory on server
531 cd is used to change remote working directory on server
545
532
546 Input:
533 Input:
547 remotefolder - current working directory
534 remotefolder - current working directory
548
535
549 Affects:
536 Affects:
550 self.remotefolder
537 self.remotefolder
551
538
552 Return:
539 Return:
553 0 in case of error else 1
540 0 in case of error else 1
554 """
541 """
555 if not self.status:
542 if not self.status:
556 return 0
543 return 0
557
544
558 if remotefolder == self.remotefolder:
545 if remotefolder == self.remotefolder:
559 return 1
546 return 1
560
547
561 chk_command = "cd %s; pwd" %remotefolder
548 chk_command = "cd %s; pwd" %remotefolder
562 mkdir_command = "mkdir %s" %remotefolder
549 mkdir_command = "mkdir %s" %remotefolder
563
550
564 if not self.__execute(chk_command):
551 if not self.__execute(chk_command):
565 if not self.__execute(mkdir_command):
552 if not self.__execute(mkdir_command):
566 self.remotefolder = None
553 self.remotefolder = None
567 return 0
554 return 0
568
555
569 self.remotefolder = remotefolder
556 self.remotefolder = remotefolder
570
557
571 return 1
558 return 1
572
559
573 def sendFile(self, fullfilename):
560 def sendFile(self, fullfilename):
574
561
575 if not self.status:
562 if not self.status:
576 return 0
563 return 0
577
564
578 try:
565 try:
579 self.__scpClientObj.put(fullfilename, remote_path=self.remotefolder)
566 self.__scpClientObj.put(fullfilename, remote_path=self.remotefolder)
580 except scp.ScpError, e:
567 except scp.ScpError, e:
581 print "[SSH Server]", str(e)
568 print "[SSH Server]", str(e)
582 return 0
569 return 0
583
570
584 remotefile = os.path.join(self.remotefolder, os.path.split(fullfilename)[-1])
571 remotefile = os.path.join(self.remotefolder, os.path.split(fullfilename)[-1])
585 command = 'chmod 775 %s' %remotefile
572 command = 'chmod 775 %s' %remotefile
586
573
587 return self.__execute(command)
574 return self.__execute(command)
588
575
589 class SendToServer(ProcessingUnit):
576 class SendToServer(ProcessingUnit):
590
577
591 def __init__(self, **kwargs):
578 def __init__(self, **kwargs):
592
579
593 ProcessingUnit.__init__(self, **kwargs)
580 ProcessingUnit.__init__(self, **kwargs)
594
581
595 self.isConfig = False
582 self.isConfig = False
596 self.clientObj = None
583 self.clientObj = None
597
584
598 def setup(self, server, username, password, remotefolder, localfolder, ext='.png', period=60, protocol='ftp', **kwargs):
585 def setup(self, server, username, password, remotefolder, localfolder, ext='.png', period=60, protocol='ftp', **kwargs):
599
586
600 self.clientObj = None
587 self.clientObj = None
601 self.localfolder = localfolder
588 self.localfolder = localfolder
602 self.ext = ext
589 self.ext = ext
603 self.period = period
590 self.period = period
604
591
605 if str.lower(protocol) == 'ftp':
592 if str.lower(protocol) == 'ftp':
606 self.clientObj = FTPClient(server, username, password, remotefolder, period)
593 self.clientObj = FTPClient(server, username, password, remotefolder, period)
607
594
608 if str.lower(protocol) == 'ssh':
595 if str.lower(protocol) == 'ssh':
609 self.clientObj = SSHClient(server, username, password, remotefolder, period)
596 self.clientObj = SSHClient(server, username, password, remotefolder, period)
610
597
611 if not self.clientObj:
598 if not self.clientObj:
612 raise ValueError, "%s has been chosen as remote access protocol but it is not valid" %protocol
599 raise ValueError, "%s has been chosen as remote access protocol but it is not valid" %protocol
613
600
614 self.clientObj.start()
601 self.clientObj.start()
615
602
616 def findFiles(self):
603 def findFiles(self):
617
604
618 if not type(self.localfolder) == list:
605 if not type(self.localfolder) == list:
619 folderList = [self.localfolder]
606 folderList = [self.localfolder]
620 else:
607 else:
621 folderList = self.localfolder
608 folderList = self.localfolder
622
609
623 #Remove duplicate items
610 #Remove duplicate items
624 folderList = list(set(folderList))
611 folderList = list(set(folderList))
625
612
626 fullfilenameList = []
613 fullfilenameList = []
627
614
628 for thisFolder in folderList:
615 for thisFolder in folderList:
629
616
630 print "[Remote Server]: Searching files on %s" %thisFolder
617 print "[Remote Server]: Searching files on %s" %thisFolder
631
618
632 filenameList = glob.glob1(thisFolder, '*%s' %self.ext)
619 filenameList = glob.glob1(thisFolder, '*%s' %self.ext)
633
620
634 if len(filenameList) < 1:
621 if len(filenameList) < 1:
635
622
636 continue
623 continue
637
624
638 for thisFile in filenameList:
625 for thisFile in filenameList:
639 fullfilename = os.path.join(thisFolder, thisFile)
626 fullfilename = os.path.join(thisFolder, thisFile)
640
627
641 if fullfilename in fullfilenameList:
628 if fullfilename in fullfilenameList:
642 continue
629 continue
643
630
644 #Only files modified in the last 30 minutes are considered
631 #Only files modified in the last 30 minutes are considered
645 if os.path.getmtime(fullfilename) < time.time() - 30*60:
632 if os.path.getmtime(fullfilename) < time.time() - 30*60:
646 continue
633 continue
647
634
648 fullfilenameList.append(fullfilename)
635 fullfilenameList.append(fullfilename)
649
636
650 return fullfilenameList
637 return fullfilenameList
651
638
652 def run(self, **kwargs):
639 def run(self, **kwargs):
653 if not self.isConfig:
640 if not self.isConfig:
654 self.init = time.time()
641 self.init = time.time()
655 self.setup(**kwargs)
642 self.setup(**kwargs)
656 self.isConfig = True
643 self.isConfig = True
657
644
658 if not self.clientObj.is_alive():
645 if not self.clientObj.is_alive():
659 print "[Remote Server]: Restarting connection "
646 print "[Remote Server]: Restarting connection "
660 self.setup(**kwargs)
647 self.setup(**kwargs)
661
648
662 if time.time() - self.init >= self.period:
649 if time.time() - self.init >= self.period:
663 fullfilenameList = self.findFiles()
650 fullfilenameList = self.findFiles()
664
651
665 if self.clientObj.updateFileList(fullfilenameList):
652 if self.clientObj.updateFileList(fullfilenameList):
666 print "[Remote Server]: Sending the next files ", str(fullfilenameList)
653 print "[Remote Server]: Sending the next files ", str(fullfilenameList)
667 self.init = time.time()
654 self.init = time.time()
668
655
669 def close(self):
656 def close(self):
670 print "[Remote Server] Stopping thread"
657 print "[Remote Server] Stopping thread"
671 self.clientObj.stop()
658 self.clientObj.stop()
672
659
673
660
674 class FTP(object):
661 class FTP(object):
675 """
662 """
676 Ftp is a public class used to define custom File Transfer Protocol from "ftplib" python module
663 Ftp is a public class used to define custom File Transfer Protocol from "ftplib" python module
677
664
678 Non-standard Python modules used: None
665 Non-standard Python modules used: None
679
666
680 Written by "Daniel Suarez":mailto:daniel.suarez@jro.igp.gob.pe Oct. 26, 2010
667 Written by "Daniel Suarez":mailto:daniel.suarez@jro.igp.gob.pe Oct. 26, 2010
681 """
668 """
682
669
683 def __init__(self,server = None, username=None, password=None, remotefolder=None):
670 def __init__(self,server = None, username=None, password=None, remotefolder=None):
684 """
671 """
685 This method is used to setting parameters for FTP and establishing connection to remote server
672 This method is used to setting parameters for FTP and establishing connection to remote server
686
673
687 Inputs:
674 Inputs:
688 server - remote server IP Address
675 server - remote server IP Address
689
676
690 username - remote server Username
677 username - remote server Username
691
678
692 password - remote server password
679 password - remote server password
693
680
694 remotefolder - remote server current working directory
681 remotefolder - remote server current working directory
695
682
696 Return: void
683 Return: void
697
684
698 Affects:
685 Affects:
699 self.status - in Error Case or Connection Failed this parameter is set to 1 else 0
686 self.status - in Error Case or Connection Failed this parameter is set to 1 else 0
700
687
701 self.folderList - sub-folder list of remote folder
688 self.folderList - sub-folder list of remote folder
702
689
703 self.fileList - file list of remote folder
690 self.fileList - file list of remote folder
704
691
705
692
706 """
693 """
707
694
708 if ((server == None) and (username==None) and (password==None) and (remotefolder==None)):
695 if ((server == None) and (username==None) and (password==None) and (remotefolder==None)):
709 server, username, password, remotefolder = self.parmsByDefault()
696 server, username, password, remotefolder = self.parmsByDefault()
710
697
711 self.server = server
698 self.server = server
712 self.username = username
699 self.username = username
713 self.password = password
700 self.password = password
714 self.remotefolder = remotefolder
701 self.remotefolder = remotefolder
715 self.file = None
702 self.file = None
716 self.ftp = None
703 self.ftp = None
717 self.status = 0
704 self.status = 0
718
705
719 try:
706 try:
720 self.ftp = ftplib.FTP(self.server)
707 self.ftp = ftplib.FTP(self.server)
721 self.ftp.login(self.username,self.password)
708 self.ftp.login(self.username,self.password)
722 self.ftp.cwd(self.remotefolder)
709 self.ftp.cwd(self.remotefolder)
723 # print 'Connect to FTP Server: Successfully'
710 # print 'Connect to FTP Server: Successfully'
724
711
725 except ftplib.all_errors:
712 except ftplib.all_errors:
726 print 'Error FTP Service'
713 print 'Error FTP Service'
727 self.status = 1
714 self.status = 1
728 return
715 return
729
716
730
717
731
718
732 self.dirList = []
719 self.dirList = []
733
720
734 try:
721 try:
735 self.dirList = self.ftp.nlst()
722 self.dirList = self.ftp.nlst()
736
723
737 except ftplib.error_perm, resp:
724 except ftplib.error_perm, resp:
738 if str(resp) == "550 No files found":
725 if str(resp) == "550 No files found":
739 print "no files in this directory"
726 print "no files in this directory"
740 self.status = 1
727 self.status = 1
741 return
728 return
742
729
743 except ftplib.all_errors:
730 except ftplib.all_errors:
744 print 'Error Displaying Dir-Files'
731 print 'Error Displaying Dir-Files'
745 self.status = 1
732 self.status = 1
746 return
733 return
747
734
748 self.fileList = []
735 self.fileList = []
749 self.folderList = []
736 self.folderList = []
750 #only for test
737 #only for test
751 for f in self.dirList:
738 for f in self.dirList:
752 name, ext = os.path.splitext(f)
739 name, ext = os.path.splitext(f)
753 if ext != '':
740 if ext != '':
754 self.fileList.append(f)
741 self.fileList.append(f)
755 # print 'filename: %s - size: %d'%(f,self.ftp.size(f))
742 # print 'filename: %s - size: %d'%(f,self.ftp.size(f))
756
743
757 def parmsByDefault(self):
744 def parmsByDefault(self):
758 server = 'jro-app.igp.gob.pe'
745 server = 'jro-app.igp.gob.pe'
759 username = 'wmaster'
746 username = 'wmaster'
760 password = 'mst2010vhf'
747 password = 'mst2010vhf'
761 remotefolder = '/home/wmaster/graficos'
748 remotefolder = '/home/wmaster/graficos'
762
749
763 return server, username, password, remotefolder
750 return server, username, password, remotefolder
764
751
765
752
766 def mkd(self,dirname):
753 def mkd(self,dirname):
767 """
754 """
768 mkd is used to make directory in remote server
755 mkd is used to make directory in remote server
769
756
770 Input:
757 Input:
771 dirname - directory name
758 dirname - directory name
772
759
773 Return:
760 Return:
774 1 in error case else 0
761 1 in error case else 0
775 """
762 """
776 try:
763 try:
777 self.ftp.mkd(dirname)
764 self.ftp.mkd(dirname)
778 except:
765 except:
779 print 'Error creating remote folder:%s'%dirname
766 print 'Error creating remote folder:%s'%dirname
780 return 1
767 return 1
781
768
782 return 0
769 return 0
783
770
784
771
785 def delete(self,filename):
772 def delete(self,filename):
786 """
773 """
787 delete is used to delete file in current working directory of remote server
774 delete is used to delete file in current working directory of remote server
788
775
789 Input:
776 Input:
790 filename - filename to delete in remote folder
777 filename - filename to delete in remote folder
791
778
792 Return:
779 Return:
793 1 in error case else 0
780 1 in error case else 0
794 """
781 """
795
782
796 try:
783 try:
797 self.ftp.delete(filename)
784 self.ftp.delete(filename)
798 except:
785 except:
799 print 'Error deleting remote file:%s'%filename
786 print 'Error deleting remote file:%s'%filename
800 return 1
787 return 1
801
788
802 return 0
789 return 0
803
790
804 def download(self,filename,localfolder):
791 def download(self,filename,localfolder):
805 """
792 """
806 download is used to downloading file from remote folder into local folder
793 download is used to downloading file from remote folder into local folder
807
794
808 Inputs:
795 Inputs:
809 filename - filename to donwload
796 filename - filename to donwload
810
797
811 localfolder - directory local to store filename
798 localfolder - directory local to store filename
812
799
813 Returns:
800 Returns:
814 self.status - 1 in error case else 0
801 self.status - 1 in error case else 0
815 """
802 """
816
803
817 self.status = 0
804 self.status = 0
818
805
819
806
820 if not(filename in self.fileList):
807 if not(filename in self.fileList):
821 print 'filename:%s not exists'%filename
808 print 'filename:%s not exists'%filename
822 self.status = 1
809 self.status = 1
823 return self.status
810 return self.status
824
811
825 newfilename = os.path.join(localfolder,filename)
812 newfilename = os.path.join(localfolder,filename)
826
813
827 self.file = open(newfilename, 'wb')
814 self.file = open(newfilename, 'wb')
828
815
829 try:
816 try:
830 print 'Download: ' + filename
817 print 'Download: ' + filename
831 self.ftp.retrbinary('RETR ' + filename, self.__handleDownload)
818 self.ftp.retrbinary('RETR ' + filename, self.__handleDownload)
832 print 'Download Complete'
819 print 'Download Complete'
833 except ftplib.all_errors:
820 except ftplib.all_errors:
834 print 'Error Downloading ' + filename
821 print 'Error Downloading ' + filename
835 self.status = 1
822 self.status = 1
836 return self.status
823 return self.status
837
824
838 self.file.close()
825 self.file.close()
839
826
840 return self.status
827 return self.status
841
828
842
829
843 def __handleDownload(self,block):
830 def __handleDownload(self,block):
844 """
831 """
845 __handleDownload is used to handle writing file
832 __handleDownload is used to handle writing file
846 """
833 """
847 self.file.write(block)
834 self.file.write(block)
848
835
849
836
850 def upload(self,filename,remotefolder=None):
837 def upload(self,filename,remotefolder=None):
851 """
838 """
852 upload is used to uploading local file to remote directory
839 upload is used to uploading local file to remote directory
853
840
854 Inputs:
841 Inputs:
855 filename - full path name of local file to store in remote directory
842 filename - full path name of local file to store in remote directory
856
843
857 remotefolder - remote directory
844 remotefolder - remote directory
858
845
859 Returns:
846 Returns:
860 self.status - 1 in error case else 0
847 self.status - 1 in error case else 0
861 """
848 """
862
849
863 if remotefolder == None:
850 if remotefolder == None:
864 remotefolder = self.remotefolder
851 remotefolder = self.remotefolder
865
852
866 self.status = 0
853 self.status = 0
867
854
868 try:
855 try:
869 self.ftp.cwd(remotefolder)
856 self.ftp.cwd(remotefolder)
870
857
871 self.file = open(filename, 'rb')
858 self.file = open(filename, 'rb')
872
859
873 (head, tail) = os.path.split(filename)
860 (head, tail) = os.path.split(filename)
874
861
875 command = "STOR " + tail
862 command = "STOR " + tail
876
863
877 print 'Uploading: ' + tail
864 print 'Uploading: ' + tail
878 self.ftp.storbinary(command, self.file)
865 self.ftp.storbinary(command, self.file)
879 print 'Upload Completed'
866 print 'Upload Completed'
880
867
881 except ftplib.all_errors:
868 except ftplib.all_errors:
882 print 'Error Uploading ' + tail
869 print 'Error Uploading ' + tail
883 self.status = 1
870 self.status = 1
884 return self.status
871 return self.status
885
872
886 self.file.close()
873 self.file.close()
887
874
888 #back to initial directory in __init__()
875 #back to initial directory in __init__()
889 self.ftp.cwd(self.remotefolder)
876 self.ftp.cwd(self.remotefolder)
890
877
891 return self.status
878 return self.status
892
879
893
880
894 def dir(self,remotefolder):
881 def dir(self,remotefolder):
895 """
882 """
896 dir is used to change working directory of remote server and get folder and file list
883 dir is used to change working directory of remote server and get folder and file list
897
884
898 Input:
885 Input:
899 remotefolder - current working directory
886 remotefolder - current working directory
900
887
901 Affects:
888 Affects:
902 self.fileList - file list of working directory
889 self.fileList - file list of working directory
903
890
904 Return:
891 Return:
905 infoList - list with filenames and size of file in bytes
892 infoList - list with filenames and size of file in bytes
906
893
907 self.folderList - folder list
894 self.folderList - folder list
908 """
895 """
909
896
910 self.remotefolder = remotefolder
897 self.remotefolder = remotefolder
911 print 'Change to ' + self.remotefolder
898 print 'Change to ' + self.remotefolder
912 try:
899 try:
913 self.ftp.cwd(remotefolder)
900 self.ftp.cwd(remotefolder)
914 except ftplib.all_errors:
901 except ftplib.all_errors:
915 print 'Error Change to ' + self.remotefolder
902 print 'Error Change to ' + self.remotefolder
916 infoList = None
903 infoList = None
917 self.folderList = None
904 self.folderList = None
918 return infoList,self.folderList
905 return infoList,self.folderList
919
906
920 self.dirList = []
907 self.dirList = []
921
908
922 try:
909 try:
923 self.dirList = self.ftp.nlst()
910 self.dirList = self.ftp.nlst()
924
911
925 except ftplib.error_perm, resp:
912 except ftplib.error_perm, resp:
926 if str(resp) == "550 No files found":
913 if str(resp) == "550 No files found":
927 print "no files in this directory"
914 print "no files in this directory"
928 infoList = None
915 infoList = None
929 self.folderList = None
916 self.folderList = None
930 return infoList,self.folderList
917 return infoList,self.folderList
931 except ftplib.all_errors:
918 except ftplib.all_errors:
932 print 'Error Displaying Dir-Files'
919 print 'Error Displaying Dir-Files'
933 infoList = None
920 infoList = None
934 self.folderList = None
921 self.folderList = None
935 return infoList,self.folderList
922 return infoList,self.folderList
936
923
937 infoList = []
924 infoList = []
938 self.fileList = []
925 self.fileList = []
939 self.folderList = []
926 self.folderList = []
940 for f in self.dirList:
927 for f in self.dirList:
941 name,ext = os.path.splitext(f)
928 name,ext = os.path.splitext(f)
942 if ext != '':
929 if ext != '':
943 self.fileList.append(f)
930 self.fileList.append(f)
944 value = (f,self.ftp.size(f))
931 value = (f,self.ftp.size(f))
945 infoList.append(value)
932 infoList.append(value)
946
933
947 if ext == '':
934 if ext == '':
948 self.folderList.append(f)
935 self.folderList.append(f)
949
936
950 return infoList,self.folderList
937 return infoList,self.folderList
951
938
952
939
953 def close(self):
940 def close(self):
954 """
941 """
955 close is used to close and end FTP connection
942 close is used to close and end FTP connection
956
943
957 Inputs: None
944 Inputs: None
958
945
959 Return: void
946 Return: void
960
947
961 """
948 """
962 self.ftp.close()
949 self.ftp.close()
963
950
964 class SendByFTP(Operation):
951 class SendByFTP(Operation):
965
952
966 def __init__(self, **kwargs):
953 def __init__(self, **kwargs):
967 Operation.__init__(self, **kwargs)
954 Operation.__init__(self, **kwargs)
968 self.status = 1
955 self.status = 1
969 self.counter = 0
956 self.counter = 0
970
957
971 def error_print(self, ValueError):
958 def error_print(self, ValueError):
972
959
973 print ValueError, 'Error FTP'
960 print ValueError, 'Error FTP'
974 print "don't worry the program is running..."
961 print "don't worry the program is running..."
975
962
976 def worker_ftp(self, server, username, password, remotefolder, filenameList):
963 def worker_ftp(self, server, username, password, remotefolder, filenameList):
977
964
978 self.ftpClientObj = FTP(server, username, password, remotefolder)
965 self.ftpClientObj = FTP(server, username, password, remotefolder)
979 for filename in filenameList:
966 for filename in filenameList:
980 self.ftpClientObj.upload(filename)
967 self.ftpClientObj.upload(filename)
981 self.ftpClientObj.close()
968 self.ftpClientObj.close()
982
969
983 def ftp_thread(self, server, username, password, remotefolder):
970 def ftp_thread(self, server, username, password, remotefolder):
984 if not(self.status):
971 if not(self.status):
985 return
972 return
986
973
987 import multiprocessing
974 import multiprocessing
988
975
989 p = multiprocessing.Process(target=self.worker_ftp, args=(server, username, password, remotefolder, self.filenameList,))
976 p = multiprocessing.Process(target=self.worker_ftp, args=(server, username, password, remotefolder, self.filenameList,))
990 p.start()
977 p.start()
991
978
992 p.join(3)
979 p.join(3)
993
980
994 if p.is_alive():
981 if p.is_alive():
995 p.terminate()
982 p.terminate()
996 p.join()
983 p.join()
997 print 'killing ftp process...'
984 print 'killing ftp process...'
998 self.status = 0
985 self.status = 0
999 return
986 return
1000
987
1001 self.status = 1
988 self.status = 1
1002 return
989 return
1003
990
1004 def filterByExt(self, ext, localfolder):
991 def filterByExt(self, ext, localfolder):
1005 fnameList = glob.glob1(localfolder,ext)
992 fnameList = glob.glob1(localfolder,ext)
1006 self.filenameList = [os.path.join(localfolder,x) for x in fnameList]
993 self.filenameList = [os.path.join(localfolder,x) for x in fnameList]
1007
994
1008 if len(self.filenameList) == 0:
995 if len(self.filenameList) == 0:
1009 self.status = 0
996 self.status = 0
1010
997
1011 def run(self, dataOut, ext, localfolder, remotefolder, server, username, password, period=1):
998 def run(self, dataOut, ext, localfolder, remotefolder, server, username, password, period=1):
1012
999
1013 self.counter += 1
1000 self.counter += 1
1014 if self.counter >= period:
1001 if self.counter >= period:
1015 self.filterByExt(ext, localfolder)
1002 self.filterByExt(ext, localfolder)
1016
1003
1017 self.ftp_thread(server, username, password, remotefolder)
1004 self.ftp_thread(server, username, password, remotefolder)
1018
1005
1019 self.counter = 0
1006 self.counter = 0
1020
1007
1021 self.status = 1
1008 self.status = 1
General Comments 0
You need to be logged in to leave comments. Login now