##// END OF EJS Templates
this fixes bug #1074 and bug #1101
José Chávez -
r1011:6db081ca94fe
parent child
Show More
@@ -0,0 +1,69
1 {
2 "configurations": [
3 {
4 "name": "Mac",
5 "includePath": [
6 "/usr/include",
7 "/usr/local/include",
8 "${workspaceRoot}"
9 ],
10 "defines": [],
11 "intelliSenseMode": "clang-x64",
12 "browse": {
13 "path": [
14 "/usr/include",
15 "/usr/local/include",
16 "${workspaceRoot}"
17 ],
18 "limitSymbolsToIncludedHeaders": true,
19 "databaseFilename": ""
20 }
21 },
22 {
23 "name": "Linux",
24 "includePath": [
25 "/usr/include/c++/4.8.4",
26 "/usr/include/x86_64-linux-gnu/c++/4.8",
27 "/usr/local/include",
28 "/usr/include",
29 "/usr/include/x86_64-linux-gnu",
30 "${workspaceRoot}"
31 ],
32 "defines": [],
33 "intelliSenseMode": "clang-x64",
34 "browse": {
35 "path": [
36 "/usr/include/c++/4.8.4",
37 "/usr/include/x86_64-linux-gnu/c++/4.8",
38 "/usr/local/include",
39 "/usr/include",
40 "/usr/include/x86_64-linux-gnu",
41 "${workspaceRoot}"
42 ],
43 "limitSymbolsToIncludedHeaders": true,
44 "databaseFilename": ""
45 }
46 },
47 {
48 "name": "Win32",
49 "includePath": [
50 "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/include",
51 "${workspaceRoot}"
52 ],
53 "defines": [
54 "_DEBUG",
55 "UNICODE"
56 ],
57 "intelliSenseMode": "msvc-x64",
58 "browse": {
59 "path": [
60 "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/include/*",
61 "${workspaceRoot}"
62 ],
63 "limitSymbolsToIncludedHeaders": true,
64 "databaseFilename": ""
65 }
66 }
67 ],
68 "version": 2
69 } No newline at end of file
@@ -0,0 +1,7
1 {
2 "files.associations": {
3 "arrayobject.h": "c",
4 "ndarrayobject.h": "c",
5 "complex": "c"
6 }
7 } No newline at end of file
@@ -1,13 +1,108
1 .project
1 # Byte-compiled / optimized / DLL files
2 .pydevproject
2 __pycache__/
3 build/
3 *.py[cod]
4 *.pyc
4 *$py.class
5
6 # C extensions
5 *.so
7 *.so
8
9 # Distribution / packaging
10 .Python
11 env/
12 build/
13 develop-eggs/
14 dist/
15 downloads/
16 eggs/
17 .eggs/
18 lib/
19 lib64/
20 parts/
21 sdist/
22 var/
23 wheels/
6 *.egg-info/
24 *.egg-info/
25 .installed.cfg
26 *.egg
27
28 # PyInstaller
29 # Usually these files are written by a python script from a template
30 # before PyInstaller builds the exe, so as to inject date/other infos into it.
31 *.manifest
32 *.spec
33
34 # Installer logs
35 pip-log.txt
36 pip-delete-this-directory.txt
37
38 # Unit test / coverage reports
39 htmlcov/
40 .tox/
41 .coverage
42 .coverage.*
43 .cache
44 nosetests.xml
45 coverage.xml
46 *,cover
47 .hypothesis/
48
49 # Translations
50 *.mo
51 *.pot
52
53 # Django stuff:
54 *.log
55 local_settings.py
56
57 # Flask stuff:
58 instance/
59 .webassets-cache
60
61 # Scrapy stuff:
62 .scrapy
63
64 # Sphinx documentation
65 docs/_build/
66
67 # PyBuilder
68 target/
69
70 # Jupyter Notebook
71 .ipynb_checkpoints
72
73 # pyenv
74 .python-version
75
76 # celery beat schedule file
77 celerybeat-schedule
78
79 # SageMath parsed files
80 *.sage.py
81
82 # dotenv
83 .env
84
85 # virtualenv
86 .venv
87 venv/
88 ENV/
89
90 # Spyder project settings
91 .spyderproject
92 .spyproject
93
94 # Rope project settings
95 .ropeproject
96
97 # mkdocs documentation
98 /site
7
99
8 # eclipse
100 # eclipse
9 .project
101 .project
10 .pydevproject
102 .pydevproject
103 .svn/
104 *.png
105 *.pyc
106 schainpy/scripts
11
107
12 # vscode
108 schaingui/node_modules No newline at end of file
13 .vscode No newline at end of file
@@ -1,1294 +1,1294
1 '''
1 '''
2 Created on September , 2012
2 Created on September , 2012
3 @author:
3 @author:
4 '''
4 '''
5
5
6 import sys
6 import sys
7 import ast
7 import ast
8 import datetime
8 import datetime
9 import traceback
9 import traceback
10 import schainpy
10 import schainpy
11 import schainpy.admin
11 import schainpy.admin
12
12
13 from xml.etree.ElementTree import ElementTree, Element, SubElement, tostring
13 from xml.etree.ElementTree import ElementTree, Element, SubElement, tostring
14 from xml.dom import minidom
14 from xml.dom import minidom
15
15
16 from schainpy.model import *
16 from schainpy.model import *
17 from time import sleep
17 from time import sleep
18
18
19 def prettify(elem):
19 def prettify(elem):
20 """Return a pretty-printed XML string for the Element.
20 """Return a pretty-printed XML string for the Element.
21 """
21 """
22 rough_string = tostring(elem, 'utf-8')
22 rough_string = tostring(elem, 'utf-8')
23 reparsed = minidom.parseString(rough_string)
23 reparsed = minidom.parseString(rough_string)
24 return reparsed.toprettyxml(indent=" ")
24 return reparsed.toprettyxml(indent=" ")
25
25
26 class ParameterConf():
26 class ParameterConf():
27
27
28 id = None
28 id = None
29 name = None
29 name = None
30 value = None
30 value = None
31 format = None
31 format = None
32
32
33 __formated_value = None
33 __formated_value = None
34
34
35 ELEMENTNAME = 'Parameter'
35 ELEMENTNAME = 'Parameter'
36
36
37 def __init__(self):
37 def __init__(self):
38
38
39 self.format = 'str'
39 self.format = 'str'
40
40
41 def getElementName(self):
41 def getElementName(self):
42
42
43 return self.ELEMENTNAME
43 return self.ELEMENTNAME
44
44
45 def getValue(self):
45 def getValue(self):
46
46
47 value = self.value
47 value = self.value
48 format = self.format
48 format = self.format
49
49
50 if self.__formated_value != None:
50 if self.__formated_value != None:
51
51
52 return self.__formated_value
52 return self.__formated_value
53
53
54 if format == 'str':
54 if format == 'str':
55 self.__formated_value = str(value)
55 self.__formated_value = str(value)
56 return self.__formated_value
56 return self.__formated_value
57
57
58 if value == '':
58 if value == '':
59 raise ValueError, "%s: This parameter value is empty" %self.name
59 raise ValueError, "%s: This parameter value is empty" %self.name
60
60
61 if format == 'list':
61 if format == 'list':
62 strList = value.split(',')
62 strList = value.split(',')
63
63
64 self.__formated_value = strList
64 self.__formated_value = strList
65
65
66 return self.__formated_value
66 return self.__formated_value
67
67
68 if format == 'intlist':
68 if format == 'intlist':
69 """
69 """
70 Example:
70 Example:
71 value = (0,1,2)
71 value = (0,1,2)
72 """
72 """
73
73
74 new_value = ast.literal_eval(value)
74 new_value = ast.literal_eval(value)
75
75
76 if type(new_value) not in (tuple, list):
76 if type(new_value) not in (tuple, list):
77 new_value = [int(new_value)]
77 new_value = [int(new_value)]
78
78
79 self.__formated_value = new_value
79 self.__formated_value = new_value
80
80
81 return self.__formated_value
81 return self.__formated_value
82
82
83 if format == 'floatlist':
83 if format == 'floatlist':
84 """
84 """
85 Example:
85 Example:
86 value = (0.5, 1.4, 2.7)
86 value = (0.5, 1.4, 2.7)
87 """
87 """
88
88
89 new_value = ast.literal_eval(value)
89 new_value = ast.literal_eval(value)
90
90
91 if type(new_value) not in (tuple, list):
91 if type(new_value) not in (tuple, list):
92 new_value = [float(new_value)]
92 new_value = [float(new_value)]
93
93
94 self.__formated_value = new_value
94 self.__formated_value = new_value
95
95
96 return self.__formated_value
96 return self.__formated_value
97
97
98 if format == 'date':
98 if format == 'date':
99 strList = value.split('/')
99 strList = value.split('/')
100 intList = [int(x) for x in strList]
100 intList = [int(x) for x in strList]
101 date = datetime.date(intList[0], intList[1], intList[2])
101 date = datetime.date(intList[0], intList[1], intList[2])
102
102
103 self.__formated_value = date
103 self.__formated_value = date
104
104
105 return self.__formated_value
105 return self.__formated_value
106
106
107 if format == 'time':
107 if format == 'time':
108 strList = value.split(':')
108 strList = value.split(':')
109 intList = [int(x) for x in strList]
109 intList = [int(x) for x in strList]
110 time = datetime.time(intList[0], intList[1], intList[2])
110 time = datetime.time(intList[0], intList[1], intList[2])
111
111
112 self.__formated_value = time
112 self.__formated_value = time
113
113
114 return self.__formated_value
114 return self.__formated_value
115
115
116 if format == 'pairslist':
116 if format == 'pairslist':
117 """
117 """
118 Example:
118 Example:
119 value = (0,1),(1,2)
119 value = (0,1),(1,2)
120 """
120 """
121
121
122 new_value = ast.literal_eval(value)
122 new_value = ast.literal_eval(value)
123
123
124 if type(new_value) not in (tuple, list):
124 if type(new_value) not in (tuple, list):
125 raise ValueError, "%s has to be a tuple or list of pairs" %value
125 raise ValueError, "%s has to be a tuple or list of pairs" %value
126
126
127 if type(new_value[0]) not in (tuple, list):
127 if type(new_value[0]) not in (tuple, list):
128 if len(new_value) != 2:
128 if len(new_value) != 2:
129 raise ValueError, "%s has to be a tuple or list of pairs" %value
129 raise ValueError, "%s has to be a tuple or list of pairs" %value
130 new_value = [new_value]
130 new_value = [new_value]
131
131
132 for thisPair in new_value:
132 for thisPair in new_value:
133 if len(thisPair) != 2:
133 if len(thisPair) != 2:
134 raise ValueError, "%s has to be a tuple or list of pairs" %value
134 raise ValueError, "%s has to be a tuple or list of pairs" %value
135
135
136 self.__formated_value = new_value
136 self.__formated_value = new_value
137
137
138 return self.__formated_value
138 return self.__formated_value
139
139
140 if format == 'multilist':
140 if format == 'multilist':
141 """
141 """
142 Example:
142 Example:
143 value = (0,1,2),(3,4,5)
143 value = (0,1,2),(3,4,5)
144 """
144 """
145 multiList = ast.literal_eval(value)
145 multiList = ast.literal_eval(value)
146
146
147 if type(multiList[0]) == int:
147 if type(multiList[0]) == int:
148 multiList = ast.literal_eval("(" + value + ")")
148 multiList = ast.literal_eval("(" + value + ")")
149
149
150 self.__formated_value = multiList
150 self.__formated_value = multiList
151
151
152 return self.__formated_value
152 return self.__formated_value
153
153
154 if format == 'bool':
154 if format == 'bool':
155 value = int(value)
155 value = int(value)
156
156
157 if format == 'int':
157 if format == 'int':
158 value = float(value)
158 value = float(value)
159
159
160 format_func = eval(format)
160 format_func = eval(format)
161
161
162 self.__formated_value = format_func(value)
162 self.__formated_value = format_func(value)
163
163
164 return self.__formated_value
164 return self.__formated_value
165
165
166 def updateId(self, new_id):
166 def updateId(self, new_id):
167
167
168 self.id = str(new_id)
168 self.id = str(new_id)
169
169
170 def setup(self, id, name, value, format='str'):
170 def setup(self, id, name, value, format='str'):
171
171
172 self.id = str(id)
172 self.id = str(id)
173 self.name = name
173 self.name = name
174 self.value = str(value)
174 self.value = str(value)
175 self.format = str.lower(format)
175 self.format = str.lower(format)
176
176
177 self.getValue()
177 self.getValue()
178
178
179 return 1
179 return 1
180
180
181 def update(self, name, value, format='str'):
181 def update(self, name, value, format='str'):
182
182
183 self.name = name
183 self.name = name
184 self.value = str(value)
184 self.value = str(value)
185 self.format = format
185 self.format = format
186
186
187 def makeXml(self, opElement):
187 def makeXml(self, opElement):
188
188
189 parmElement = SubElement(opElement, self.ELEMENTNAME)
189 parmElement = SubElement(opElement, self.ELEMENTNAME)
190 parmElement.set('id', str(self.id))
190 parmElement.set('id', str(self.id))
191 parmElement.set('name', self.name)
191 parmElement.set('name', self.name)
192 parmElement.set('value', self.value)
192 parmElement.set('value', self.value)
193 parmElement.set('format', self.format)
193 parmElement.set('format', self.format)
194
194
195 def readXml(self, parmElement):
195 def readXml(self, parmElement):
196
196
197 self.id = parmElement.get('id')
197 self.id = parmElement.get('id')
198 self.name = parmElement.get('name')
198 self.name = parmElement.get('name')
199 self.value = parmElement.get('value')
199 self.value = parmElement.get('value')
200 self.format = str.lower(parmElement.get('format'))
200 self.format = str.lower(parmElement.get('format'))
201
201
202 #Compatible with old signal chain version
202 #Compatible with old signal chain version
203 if self.format == 'int' and self.name == 'idfigure':
203 if self.format == 'int' and self.name == 'idfigure':
204 self.name = 'id'
204 self.name = 'id'
205
205
206 def printattr(self):
206 def printattr(self):
207
207
208 print "Parameter[%s]: name = %s, value = %s, format = %s" %(self.id, self.name, self.value, self.format)
208 print "Parameter[%s]: name = %s, value = %s, format = %s" %(self.id, self.name, self.value, self.format)
209
209
210 class OperationConf():
210 class OperationConf():
211
211
212 id = None
212 id = None
213 name = None
213 name = None
214 priority = None
214 priority = None
215 type = None
215 type = None
216
216
217 parmConfObjList = []
217 parmConfObjList = []
218
218
219 ELEMENTNAME = 'Operation'
219 ELEMENTNAME = 'Operation'
220
220
221 def __init__(self):
221 def __init__(self):
222
222
223 self.id = '0'
223 self.id = '0'
224 self.name = None
224 self.name = None
225 self.priority = None
225 self.priority = None
226 self.type = 'self'
226 self.type = 'self'
227
227
228
228
229 def __getNewId(self):
229 def __getNewId(self):
230
230
231 return int(self.id)*10 + len(self.parmConfObjList) + 1
231 return int(self.id)*10 + len(self.parmConfObjList) + 1
232
232
233 def updateId(self, new_id):
233 def updateId(self, new_id):
234
234
235 self.id = str(new_id)
235 self.id = str(new_id)
236
236
237 n = 1
237 n = 1
238 for parmObj in self.parmConfObjList:
238 for parmObj in self.parmConfObjList:
239
239
240 idParm = str(int(new_id)*10 + n)
240 idParm = str(int(new_id)*10 + n)
241 parmObj.updateId(idParm)
241 parmObj.updateId(idParm)
242
242
243 n += 1
243 n += 1
244
244
245 def getElementName(self):
245 def getElementName(self):
246
246
247 return self.ELEMENTNAME
247 return self.ELEMENTNAME
248
248
249 def getParameterObjList(self):
249 def getParameterObjList(self):
250
250
251 return self.parmConfObjList
251 return self.parmConfObjList
252
252
253 def getParameterObj(self, parameterName):
253 def getParameterObj(self, parameterName):
254
254
255 for parmConfObj in self.parmConfObjList:
255 for parmConfObj in self.parmConfObjList:
256
256
257 if parmConfObj.name != parameterName:
257 if parmConfObj.name != parameterName:
258 continue
258 continue
259
259
260 return parmConfObj
260 return parmConfObj
261
261
262 return None
262 return None
263
263
264 def getParameterObjfromValue(self, parameterValue):
264 def getParameterObjfromValue(self, parameterValue):
265
265
266 for parmConfObj in self.parmConfObjList:
266 for parmConfObj in self.parmConfObjList:
267
267
268 if parmConfObj.getValue() != parameterValue:
268 if parmConfObj.getValue() != parameterValue:
269 continue
269 continue
270
270
271 return parmConfObj.getValue()
271 return parmConfObj.getValue()
272
272
273 return None
273 return None
274
274
275 def getParameterValue(self, parameterName):
275 def getParameterValue(self, parameterName):
276
276
277 parameterObj = self.getParameterObj(parameterName)
277 parameterObj = self.getParameterObj(parameterName)
278
278
279 # if not parameterObj:
279 # if not parameterObj:
280 # return None
280 # return None
281
281
282 value = parameterObj.getValue()
282 value = parameterObj.getValue()
283
283
284 return value
284 return value
285
285
286 def setup(self, id, name, priority, type):
286 def setup(self, id, name, priority, type):
287
287
288 self.id = str(id)
288 self.id = str(id)
289 self.name = name
289 self.name = name
290 self.type = type
290 self.type = type
291 self.priority = priority
291 self.priority = priority
292
292
293 self.parmConfObjList = []
293 self.parmConfObjList = []
294
294
295 def removeParameters(self):
295 def removeParameters(self):
296
296
297 for obj in self.parmConfObjList:
297 for obj in self.parmConfObjList:
298 del obj
298 del obj
299
299
300 self.parmConfObjList = []
300 self.parmConfObjList = []
301
301
302 def addParameter(self, name, value, format='str'):
302 def addParameter(self, name, value, format='str'):
303
303
304 id = self.__getNewId()
304 id = self.__getNewId()
305
305
306 parmConfObj = ParameterConf()
306 parmConfObj = ParameterConf()
307 if not parmConfObj.setup(id, name, value, format):
307 if not parmConfObj.setup(id, name, value, format):
308 return None
308 return None
309
309
310 self.parmConfObjList.append(parmConfObj)
310 self.parmConfObjList.append(parmConfObj)
311
311
312 return parmConfObj
312 return parmConfObj
313
313
314 def changeParameter(self, name, value, format='str'):
314 def changeParameter(self, name, value, format='str'):
315
315
316 parmConfObj = self.getParameterObj(name)
316 parmConfObj = self.getParameterObj(name)
317 parmConfObj.update(name, value, format)
317 parmConfObj.update(name, value, format)
318
318
319 return parmConfObj
319 return parmConfObj
320
320
321 def makeXml(self, procUnitElement):
321 def makeXml(self, procUnitElement):
322
322
323 opElement = SubElement(procUnitElement, self.ELEMENTNAME)
323 opElement = SubElement(procUnitElement, self.ELEMENTNAME)
324 opElement.set('id', str(self.id))
324 opElement.set('id', str(self.id))
325 opElement.set('name', self.name)
325 opElement.set('name', self.name)
326 opElement.set('type', self.type)
326 opElement.set('type', self.type)
327 opElement.set('priority', str(self.priority))
327 opElement.set('priority', str(self.priority))
328
328
329 for parmConfObj in self.parmConfObjList:
329 for parmConfObj in self.parmConfObjList:
330 parmConfObj.makeXml(opElement)
330 parmConfObj.makeXml(opElement)
331
331
332 def readXml(self, opElement):
332 def readXml(self, opElement):
333
333
334 self.id = opElement.get('id')
334 self.id = opElement.get('id')
335 self.name = opElement.get('name')
335 self.name = opElement.get('name')
336 self.type = opElement.get('type')
336 self.type = opElement.get('type')
337 self.priority = opElement.get('priority')
337 self.priority = opElement.get('priority')
338
338
339 #Compatible with old signal chain version
339 #Compatible with old signal chain version
340 #Use of 'run' method instead 'init'
340 #Use of 'run' method instead 'init'
341 if self.type == 'self' and self.name == 'init':
341 if self.type == 'self' and self.name == 'init':
342 self.name = 'run'
342 self.name = 'run'
343
343
344 self.parmConfObjList = []
344 self.parmConfObjList = []
345
345
346 parmElementList = opElement.iter(ParameterConf().getElementName())
346 parmElementList = opElement.iter(ParameterConf().getElementName())
347
347
348 for parmElement in parmElementList:
348 for parmElement in parmElementList:
349 parmConfObj = ParameterConf()
349 parmConfObj = ParameterConf()
350 parmConfObj.readXml(parmElement)
350 parmConfObj.readXml(parmElement)
351
351
352 #Compatible with old signal chain version
352 #Compatible with old signal chain version
353 #If an 'plot' OPERATION is found, changes name operation by the value of its type PARAMETER
353 #If an 'plot' OPERATION is found, changes name operation by the value of its type PARAMETER
354 if self.type != 'self' and self.name == 'Plot':
354 if self.type != 'self' and self.name == 'Plot':
355 if parmConfObj.format == 'str' and parmConfObj.name == 'type':
355 if parmConfObj.format == 'str' and parmConfObj.name == 'type':
356 self.name = parmConfObj.value
356 self.name = parmConfObj.value
357 continue
357 continue
358
358
359 self.parmConfObjList.append(parmConfObj)
359 self.parmConfObjList.append(parmConfObj)
360
360
361 def printattr(self):
361 def printattr(self):
362
362
363 print "%s[%s]: name = %s, type = %s, priority = %s" %(self.ELEMENTNAME,
363 print "%s[%s]: name = %s, type = %s, priority = %s" %(self.ELEMENTNAME,
364 self.id,
364 self.id,
365 self.name,
365 self.name,
366 self.type,
366 self.type,
367 self.priority)
367 self.priority)
368
368
369 for parmConfObj in self.parmConfObjList:
369 for parmConfObj in self.parmConfObjList:
370 parmConfObj.printattr()
370 parmConfObj.printattr()
371
371
372 def createObject(self, plotter_queue=None):
372 def createObject(self, plotter_queue=None):
373
373
374 if self.type == 'self':
374 if self.type == 'self':
375 raise ValueError, "This operation type cannot be created"
375 raise ValueError, "This operation type cannot be created"
376
376
377 if self.type == 'plotter':
377 if self.type == 'plotter':
378 #Plotter(plotter_name)
378 #Plotter(plotter_name)
379 if not plotter_queue:
379 if not plotter_queue:
380 raise ValueError, "plotter_queue is not defined. Use:\nmyProject = Project()\nmyProject.setPlotterQueue(plotter_queue)"
380 raise ValueError, "plotter_queue is not defined. Use:\nmyProject = Project()\nmyProject.setPlotterQueue(plotter_queue)"
381
381
382 opObj = Plotter(self.name, plotter_queue)
382 opObj = Plotter(self.name, plotter_queue)
383
383
384 if self.type == 'external' or self.type == 'other':
384 if self.type == 'external' or self.type == 'other':
385 className = eval(self.name)
385 className = eval(self.name)
386 opObj = className()
386 opObj = className()
387
387
388 return opObj
388 return opObj
389
389
390 class ProcUnitConf():
390 class ProcUnitConf():
391
391
392 id = None
392 id = None
393 name = None
393 name = None
394 datatype = None
394 datatype = None
395 inputId = None
395 inputId = None
396 parentId = None
396 parentId = None
397
397
398 opConfObjList = []
398 opConfObjList = []
399
399
400 procUnitObj = None
400 procUnitObj = None
401 opObjList = []
401 opObjList = []
402
402
403 ELEMENTNAME = 'ProcUnit'
403 ELEMENTNAME = 'ProcUnit'
404
404
405 def __init__(self):
405 def __init__(self):
406
406
407 self.id = None
407 self.id = None
408 self.datatype = None
408 self.datatype = None
409 self.name = None
409 self.name = None
410 self.inputId = None
410 self.inputId = None
411
411
412 self.opConfObjList = []
412 self.opConfObjList = []
413
413
414 self.procUnitObj = None
414 self.procUnitObj = None
415 self.opObjDict = {}
415 self.opObjDict = {}
416
416
417 def __getPriority(self):
417 def __getPriority(self):
418
418
419 return len(self.opConfObjList)+1
419 return len(self.opConfObjList)+1
420
420
421 def __getNewId(self):
421 def __getNewId(self):
422
422
423 return int(self.id)*10 + len(self.opConfObjList) + 1
423 return int(self.id)*10 + len(self.opConfObjList) + 1
424
424
425 def getElementName(self):
425 def getElementName(self):
426
426
427 return self.ELEMENTNAME
427 return self.ELEMENTNAME
428
428
429 def getId(self):
429 def getId(self):
430
430
431 return self.id
431 return self.id
432
432
433 def updateId(self, new_id, parentId=parentId):
433 def updateId(self, new_id, parentId=parentId):
434
434
435
435
436 new_id = int(parentId)*10 + (int(self.id) % 10)
436 new_id = int(parentId)*10 + (int(self.id) % 10)
437 new_inputId = int(parentId)*10 + (int(self.inputId) % 10)
437 new_inputId = int(parentId)*10 + (int(self.inputId) % 10)
438
438
439 #If this proc unit has not inputs
439 #If this proc unit has not inputs
440 if self.inputId == '0':
440 if self.inputId == '0':
441 new_inputId = 0
441 new_inputId = 0
442
442
443 n = 1
443 n = 1
444 for opConfObj in self.opConfObjList:
444 for opConfObj in self.opConfObjList:
445
445
446 idOp = str(int(new_id)*10 + n)
446 idOp = str(int(new_id)*10 + n)
447 opConfObj.updateId(idOp)
447 opConfObj.updateId(idOp)
448
448
449 n += 1
449 n += 1
450
450
451 self.parentId = str(parentId)
451 self.parentId = str(parentId)
452 self.id = str(new_id)
452 self.id = str(new_id)
453 self.inputId = str(new_inputId)
453 self.inputId = str(new_inputId)
454
454
455
455
456 def getInputId(self):
456 def getInputId(self):
457
457
458 return self.inputId
458 return self.inputId
459
459
460 def getOperationObjList(self):
460 def getOperationObjList(self):
461
461
462 return self.opConfObjList
462 return self.opConfObjList
463
463
464 def getOperationObj(self, name=None):
464 def getOperationObj(self, name=None):
465
465
466 for opConfObj in self.opConfObjList:
466 for opConfObj in self.opConfObjList:
467
467
468 if opConfObj.name != name:
468 if opConfObj.name != name:
469 continue
469 continue
470
470
471 return opConfObj
471 return opConfObj
472
472
473 return None
473 return None
474
474
475 def getOpObjfromParamValue(self, value=None):
475 def getOpObjfromParamValue(self, value=None):
476
476
477 for opConfObj in self.opConfObjList:
477 for opConfObj in self.opConfObjList:
478 if opConfObj.getParameterObjfromValue(parameterValue=value) != value:
478 if opConfObj.getParameterObjfromValue(parameterValue=value) != value:
479 continue
479 continue
480 return opConfObj
480 return opConfObj
481 return None
481 return None
482
482
483 def getProcUnitObj(self):
483 def getProcUnitObj(self):
484
484
485 return self.procUnitObj
485 return self.procUnitObj
486
486
487 def setup(self, id, name, datatype, inputId, parentId=None):
487 def setup(self, id, name, datatype, inputId, parentId=None):
488
488
489 #Compatible with old signal chain version
489 #Compatible with old signal chain version
490 if datatype==None and name==None:
490 if datatype==None and name==None:
491 raise ValueError, "datatype or name should be defined"
491 raise ValueError, "datatype or name should be defined"
492
492
493 if name==None:
493 if name==None:
494 if 'Proc' in datatype:
494 if 'Proc' in datatype:
495 name = datatype
495 name = datatype
496 else:
496 else:
497 name = '%sProc' %(datatype)
497 name = '%sProc' %(datatype)
498
498
499 if datatype==None:
499 if datatype==None:
500 datatype = name.replace('Proc','')
500 datatype = name.replace('Proc','')
501
501
502 self.id = str(id)
502 self.id = str(id)
503 self.name = name
503 self.name = name
504 self.datatype = datatype
504 self.datatype = datatype
505 self.inputId = inputId
505 self.inputId = inputId
506 self.parentId = parentId
506 self.parentId = parentId
507
507
508 self.opConfObjList = []
508 self.opConfObjList = []
509
509
510 self.addOperation(name='run', optype='self')
510 self.addOperation(name='run', optype='self')
511
511
512 def removeOperations(self):
512 def removeOperations(self):
513
513
514 for obj in self.opConfObjList:
514 for obj in self.opConfObjList:
515 del obj
515 del obj
516
516
517 self.opConfObjList = []
517 self.opConfObjList = []
518 self.addOperation(name='run')
518 self.addOperation(name='run')
519
519
520 def addParameter(self, **kwargs):
520 def addParameter(self, **kwargs):
521 '''
521 '''
522 Add parameters to "run" operation
522 Add parameters to "run" operation
523 '''
523 '''
524 opObj = self.opConfObjList[0]
524 opObj = self.opConfObjList[0]
525
525
526 opObj.addParameter(**kwargs)
526 opObj.addParameter(**kwargs)
527
527
528 return opObj
528 return opObj
529
529
530 def addOperation(self, name, optype='self'):
530 def addOperation(self, name, optype='self'):
531
531
532 id = self.__getNewId()
532 id = self.__getNewId()
533 priority = self.__getPriority()
533 priority = self.__getPriority()
534
534
535 opConfObj = OperationConf()
535 opConfObj = OperationConf()
536 opConfObj.setup(id, name=name, priority=priority, type=optype)
536 opConfObj.setup(id, name=name, priority=priority, type=optype)
537
537
538 self.opConfObjList.append(opConfObj)
538 self.opConfObjList.append(opConfObj)
539
539
540 return opConfObj
540 return opConfObj
541
541
542 def makeXml(self, projectElement):
542 def makeXml(self, projectElement):
543
543
544 procUnitElement = SubElement(projectElement, self.ELEMENTNAME)
544 procUnitElement = SubElement(projectElement, self.ELEMENTNAME)
545 procUnitElement.set('id', str(self.id))
545 procUnitElement.set('id', str(self.id))
546 procUnitElement.set('name', self.name)
546 procUnitElement.set('name', self.name)
547 procUnitElement.set('datatype', self.datatype)
547 procUnitElement.set('datatype', self.datatype)
548 procUnitElement.set('inputId', str(self.inputId))
548 procUnitElement.set('inputId', str(self.inputId))
549
549
550 for opConfObj in self.opConfObjList:
550 for opConfObj in self.opConfObjList:
551 opConfObj.makeXml(procUnitElement)
551 opConfObj.makeXml(procUnitElement)
552
552
553 def readXml(self, upElement):
553 def readXml(self, upElement):
554
554
555 self.id = upElement.get('id')
555 self.id = upElement.get('id')
556 self.name = upElement.get('name')
556 self.name = upElement.get('name')
557 self.datatype = upElement.get('datatype')
557 self.datatype = upElement.get('datatype')
558 self.inputId = upElement.get('inputId')
558 self.inputId = upElement.get('inputId')
559
559
560 if self.ELEMENTNAME == "ReadUnit":
560 if self.ELEMENTNAME == "ReadUnit":
561 self.datatype = self.datatype.replace("Reader", "")
561 self.datatype = self.datatype.replace("Reader", "")
562
562
563 if self.ELEMENTNAME == "ProcUnit":
563 if self.ELEMENTNAME == "ProcUnit":
564 self.datatype = self.datatype.replace("Proc", "")
564 self.datatype = self.datatype.replace("Proc", "")
565
565
566 if self.inputId == 'None':
566 if self.inputId == 'None':
567 self.inputId = '0'
567 self.inputId = '0'
568
568
569 self.opConfObjList = []
569 self.opConfObjList = []
570
570
571 opElementList = upElement.iter(OperationConf().getElementName())
571 opElementList = upElement.iter(OperationConf().getElementName())
572
572
573 for opElement in opElementList:
573 for opElement in opElementList:
574 opConfObj = OperationConf()
574 opConfObj = OperationConf()
575 opConfObj.readXml(opElement)
575 opConfObj.readXml(opElement)
576 self.opConfObjList.append(opConfObj)
576 self.opConfObjList.append(opConfObj)
577
577
578 def printattr(self):
578 def printattr(self):
579
579
580 print "%s[%s]: name = %s, datatype = %s, inputId = %s" %(self.ELEMENTNAME,
580 print "%s[%s]: name = %s, datatype = %s, inputId = %s" %(self.ELEMENTNAME,
581 self.id,
581 self.id,
582 self.name,
582 self.name,
583 self.datatype,
583 self.datatype,
584 self.inputId)
584 self.inputId)
585
585
586 for opConfObj in self.opConfObjList:
586 for opConfObj in self.opConfObjList:
587 opConfObj.printattr()
587 opConfObj.printattr()
588
588
589 def createObjects(self, plotter_queue=None):
589 def createObjects(self, plotter_queue=None):
590
590
591 className = eval(self.name)
591 className = eval(self.name)
592 procUnitObj = className()
592 procUnitObj = className()
593
593
594 for opConfObj in self.opConfObjList:
594 for opConfObj in self.opConfObjList:
595
595
596 if opConfObj.type == 'self':
596 if opConfObj.type == 'self':
597 continue
597 continue
598
598
599 opObj = opConfObj.createObject(plotter_queue)
599 opObj = opConfObj.createObject(plotter_queue)
600
600
601 self.opObjDict[opConfObj.id] = opObj
601 self.opObjDict[opConfObj.id] = opObj
602 procUnitObj.addOperation(opObj, opConfObj.id)
602 procUnitObj.addOperation(opObj, opConfObj.id)
603
603
604 self.procUnitObj = procUnitObj
604 self.procUnitObj = procUnitObj
605
605
606 return procUnitObj
606 return procUnitObj
607
607
608 def run(self):
608 def run(self):
609
609
610 is_ok = False
610 is_ok = False
611
611
612 for opConfObj in self.opConfObjList:
612 for opConfObj in self.opConfObjList:
613
613
614 kwargs = {}
614 kwargs = {}
615 for parmConfObj in opConfObj.getParameterObjList():
615 for parmConfObj in opConfObj.getParameterObjList():
616 if opConfObj.name == 'run' and parmConfObj.name == 'datatype':
616 if opConfObj.name == 'run' and parmConfObj.name == 'datatype':
617 continue
617 continue
618
618
619 kwargs[parmConfObj.name] = parmConfObj.getValue()
619 kwargs[parmConfObj.name] = parmConfObj.getValue()
620
620
621 #ini = time.time()
621 #ini = time.time()
622
622
623 #print "\tRunning the '%s' operation with %s" %(opConfObj.name, opConfObj.id)
623 #print "\tRunning the '%s' operation with %s" %(opConfObj.name, opConfObj.id)
624 sts = self.procUnitObj.call(opType = opConfObj.type,
624 sts = self.procUnitObj.call(opType = opConfObj.type,
625 opName = opConfObj.name,
625 opName = opConfObj.name,
626 opId = opConfObj.id,
626 opId = opConfObj.id,
627 **kwargs)
627 **kwargs)
628
629 # total_time = time.time() - ini
630 #
631 # if total_time > 0.002:
632 # print "%s::%s took %f seconds" %(self.name, opConfObj.name, total_time)
633
628
629 # total_time = time.time() - ini
630 #
631 # if total_time > 0.002:
632 # print "%s::%s took %f seconds" %(self.name, opConfObj.name, total_time)
633
634 is_ok = is_ok or sts
634 is_ok = is_ok or sts
635
635
636 return is_ok
636 return is_ok
637
637
638 def close(self):
638 def close(self):
639
639
640 for opConfObj in self.opConfObjList:
640 for opConfObj in self.opConfObjList:
641 if opConfObj.type == 'self':
641 if opConfObj.type == 'self':
642 continue
642 continue
643
643
644 opObj = self.procUnitObj.getOperationObj(opConfObj.id)
644 opObj = self.procUnitObj.getOperationObj(opConfObj.id)
645 opObj.close()
645 opObj.close()
646
646
647 self.procUnitObj.close()
647 self.procUnitObj.close()
648
648
649 return
649 return
650
650
651 class ReadUnitConf(ProcUnitConf):
651 class ReadUnitConf(ProcUnitConf):
652
652
653 path = None
653 path = None
654 startDate = None
654 startDate = None
655 endDate = None
655 endDate = None
656 startTime = None
656 startTime = None
657 endTime = None
657 endTime = None
658
658
659 ELEMENTNAME = 'ReadUnit'
659 ELEMENTNAME = 'ReadUnit'
660
660
661 def __init__(self):
661 def __init__(self):
662
662
663 self.id = None
663 self.id = None
664 self.datatype = None
664 self.datatype = None
665 self.name = None
665 self.name = None
666 self.inputId = None
666 self.inputId = None
667
667
668 self.parentId = None
668 self.parentId = None
669
669
670 self.opConfObjList = []
670 self.opConfObjList = []
671 self.opObjList = []
671 self.opObjList = []
672
672
673 def getElementName(self):
673 def getElementName(self):
674
674
675 return self.ELEMENTNAME
675 return self.ELEMENTNAME
676
676
677 def setup(self, id, name, datatype, path, startDate="", endDate="", startTime="", endTime="", parentId=None, **kwargs):
677 def setup(self, id, name, datatype, path, startDate="", endDate="", startTime="", endTime="", parentId=None, **kwargs):
678
678
679 #Compatible with old signal chain version
679 #Compatible with old signal chain version
680 if datatype==None and name==None:
680 if datatype==None and name==None:
681 raise ValueError, "datatype or name should be defined"
681 raise ValueError, "datatype or name should be defined"
682
682
683 if name==None:
683 if name==None:
684 if 'Reader' in datatype:
684 if 'Reader' in datatype:
685 name = datatype
685 name = datatype
686 else:
686 else:
687 name = '%sReader' %(datatype)
687 name = '%sReader' %(datatype)
688
688
689 if datatype==None:
689 if datatype==None:
690 datatype = name.replace('Reader','')
690 datatype = name.replace('Reader','')
691
691
692 self.id = id
692 self.id = id
693 self.name = name
693 self.name = name
694 self.datatype = datatype
694 self.datatype = datatype
695
695
696 self.path = os.path.abspath(path)
696 self.path = os.path.abspath(path)
697 self.startDate = startDate
697 self.startDate = startDate
698 self.endDate = endDate
698 self.endDate = endDate
699 self.startTime = startTime
699 self.startTime = startTime
700 self.endTime = endTime
700 self.endTime = endTime
701
701
702 self.inputId = '0'
702 self.inputId = '0'
703 self.parentId = parentId
703 self.parentId = parentId
704
704
705 self.addRunOperation(**kwargs)
705 self.addRunOperation(**kwargs)
706
706
707 def update(self, datatype, path, startDate, endDate, startTime, endTime, parentId=None, name=None, **kwargs):
707 def update(self, datatype, path, startDate, endDate, startTime, endTime, parentId=None, name=None, **kwargs):
708
708
709 #Compatible with old signal chain version
709 #Compatible with old signal chain version
710 if datatype==None and name==None:
710 if datatype==None and name==None:
711 raise ValueError, "datatype or name should be defined"
711 raise ValueError, "datatype or name should be defined"
712
712
713 if name==None:
713 if name==None:
714 if 'Reader' in datatype:
714 if 'Reader' in datatype:
715 name = datatype
715 name = datatype
716 else:
716 else:
717 name = '%sReader' %(datatype)
717 name = '%sReader' %(datatype)
718
718
719 if datatype==None:
719 if datatype==None:
720 datatype = name.replace('Reader','')
720 datatype = name.replace('Reader','')
721
721
722 self.datatype = datatype
722 self.datatype = datatype
723 self.name = name
723 self.name = name
724 self.path = path
724 self.path = path
725 self.startDate = startDate
725 self.startDate = startDate
726 self.endDate = endDate
726 self.endDate = endDate
727 self.startTime = startTime
727 self.startTime = startTime
728 self.endTime = endTime
728 self.endTime = endTime
729
729
730 self.inputId = '0'
730 self.inputId = '0'
731 self.parentId = parentId
731 self.parentId = parentId
732
732
733 self.updateRunOperation(**kwargs)
733 self.updateRunOperation(**kwargs)
734
734
735 def removeOperations(self):
735 def removeOperations(self):
736
736
737 for obj in self.opConfObjList:
737 for obj in self.opConfObjList:
738 del obj
738 del obj
739
739
740 self.opConfObjList = []
740 self.opConfObjList = []
741
741
742 def addRunOperation(self, **kwargs):
742 def addRunOperation(self, **kwargs):
743
743
744 opObj = self.addOperation(name = 'run', optype = 'self')
744 opObj = self.addOperation(name = 'run', optype = 'self')
745
745
746 opObj.addParameter(name='datatype' , value=self.datatype, format='str')
746 opObj.addParameter(name='datatype' , value=self.datatype, format='str')
747 opObj.addParameter(name='path' , value=self.path, format='str')
747 opObj.addParameter(name='path' , value=self.path, format='str')
748 opObj.addParameter(name='startDate' , value=self.startDate, format='date')
748 opObj.addParameter(name='startDate' , value=self.startDate, format='date')
749 opObj.addParameter(name='endDate' , value=self.endDate, format='date')
749 opObj.addParameter(name='endDate' , value=self.endDate, format='date')
750 opObj.addParameter(name='startTime' , value=self.startTime, format='time')
750 opObj.addParameter(name='startTime' , value=self.startTime, format='time')
751 opObj.addParameter(name='endTime' , value=self.endTime, format='time')
751 opObj.addParameter(name='endTime' , value=self.endTime, format='time')
752
752
753 for key, value in kwargs.items():
753 for key, value in kwargs.items():
754 opObj.addParameter(name=key, value=value, format=type(value).__name__)
754 opObj.addParameter(name=key, value=value, format=type(value).__name__)
755
755
756 return opObj
756 return opObj
757
757
758 def updateRunOperation(self, **kwargs):
758 def updateRunOperation(self, **kwargs):
759
759
760 opObj = self.getOperationObj(name = 'run')
760 opObj = self.getOperationObj(name = 'run')
761 opObj.removeParameters()
761 opObj.removeParameters()
762
762
763 opObj.addParameter(name='datatype' , value=self.datatype, format='str')
763 opObj.addParameter(name='datatype' , value=self.datatype, format='str')
764 opObj.addParameter(name='path' , value=self.path, format='str')
764 opObj.addParameter(name='path' , value=self.path, format='str')
765 opObj.addParameter(name='startDate' , value=self.startDate, format='date')
765 opObj.addParameter(name='startDate' , value=self.startDate, format='date')
766 opObj.addParameter(name='endDate' , value=self.endDate, format='date')
766 opObj.addParameter(name='endDate' , value=self.endDate, format='date')
767 opObj.addParameter(name='startTime' , value=self.startTime, format='time')
767 opObj.addParameter(name='startTime' , value=self.startTime, format='time')
768 opObj.addParameter(name='endTime' , value=self.endTime, format='time')
768 opObj.addParameter(name='endTime' , value=self.endTime, format='time')
769
769
770 for key, value in kwargs.items():
770 for key, value in kwargs.items():
771 opObj.addParameter(name=key, value=value, format=type(value).__name__)
771 opObj.addParameter(name=key, value=value, format=type(value).__name__)
772
772
773 return opObj
773 return opObj
774
774
775 # def makeXml(self, projectElement):
775 # def makeXml(self, projectElement):
776 #
776 #
777 # procUnitElement = SubElement(projectElement, self.ELEMENTNAME)
777 # procUnitElement = SubElement(projectElement, self.ELEMENTNAME)
778 # procUnitElement.set('id', str(self.id))
778 # procUnitElement.set('id', str(self.id))
779 # procUnitElement.set('name', self.name)
779 # procUnitElement.set('name', self.name)
780 # procUnitElement.set('datatype', self.datatype)
780 # procUnitElement.set('datatype', self.datatype)
781 # procUnitElement.set('inputId', str(self.inputId))
781 # procUnitElement.set('inputId', str(self.inputId))
782 #
782 #
783 # for opConfObj in self.opConfObjList:
783 # for opConfObj in self.opConfObjList:
784 # opConfObj.makeXml(procUnitElement)
784 # opConfObj.makeXml(procUnitElement)
785
785
786 def readXml(self, upElement):
786 def readXml(self, upElement):
787
787
788 self.id = upElement.get('id')
788 self.id = upElement.get('id')
789 self.name = upElement.get('name')
789 self.name = upElement.get('name')
790 self.datatype = upElement.get('datatype')
790 self.datatype = upElement.get('datatype')
791 self.inputId = upElement.get('inputId')
791 self.inputId = upElement.get('inputId')
792
792
793 if self.ELEMENTNAME == "ReadUnit":
793 if self.ELEMENTNAME == "ReadUnit":
794 self.datatype = self.datatype.replace("Reader", "")
794 self.datatype = self.datatype.replace("Reader", "")
795
795
796 if self.inputId == 'None':
796 if self.inputId == 'None':
797 self.inputId = '0'
797 self.inputId = '0'
798
798
799 self.opConfObjList = []
799 self.opConfObjList = []
800
800
801 opElementList = upElement.iter(OperationConf().getElementName())
801 opElementList = upElement.iter(OperationConf().getElementName())
802
802
803 for opElement in opElementList:
803 for opElement in opElementList:
804 opConfObj = OperationConf()
804 opConfObj = OperationConf()
805 opConfObj.readXml(opElement)
805 opConfObj.readXml(opElement)
806 self.opConfObjList.append(opConfObj)
806 self.opConfObjList.append(opConfObj)
807
807
808 if opConfObj.name == 'run':
808 if opConfObj.name == 'run':
809 self.path = opConfObj.getParameterValue('path')
809 self.path = opConfObj.getParameterValue('path')
810 self.startDate = opConfObj.getParameterValue('startDate')
810 self.startDate = opConfObj.getParameterValue('startDate')
811 self.endDate = opConfObj.getParameterValue('endDate')
811 self.endDate = opConfObj.getParameterValue('endDate')
812 self.startTime = opConfObj.getParameterValue('startTime')
812 self.startTime = opConfObj.getParameterValue('startTime')
813 self.endTime = opConfObj.getParameterValue('endTime')
813 self.endTime = opConfObj.getParameterValue('endTime')
814
814
815 class Project():
815 class Project():
816
816
817 id = None
817 id = None
818 name = None
818 name = None
819 description = None
819 description = None
820 filename = None
820 filename = None
821
821
822 procUnitConfObjDict = None
822 procUnitConfObjDict = None
823
823
824 ELEMENTNAME = 'Project'
824 ELEMENTNAME = 'Project'
825
825
826 plotterQueue = None
826 plotterQueue = None
827
827
828 def __init__(self, plotter_queue=None):
828 def __init__(self, plotter_queue=None):
829
829
830 self.id = None
830 self.id = None
831 self.name = None
831 self.name = None
832 self.description = None
832 self.description = None
833
833
834 self.plotterQueue = plotter_queue
834 self.plotterQueue = plotter_queue
835
835
836 self.procUnitConfObjDict = {}
836 self.procUnitConfObjDict = {}
837
837
838 def __getNewId(self):
838 def __getNewId(self):
839
839
840 idList = self.procUnitConfObjDict.keys()
840 idList = self.procUnitConfObjDict.keys()
841
841
842 id = int(self.id)*10
842 id = int(self.id)*10
843
843
844 while True:
844 while True:
845 id += 1
845 id += 1
846
846
847 if str(id) in idList:
847 if str(id) in idList:
848 continue
848 continue
849
849
850 break
850 break
851
851
852 return str(id)
852 return str(id)
853
853
854 def getElementName(self):
854 def getElementName(self):
855
855
856 return self.ELEMENTNAME
856 return self.ELEMENTNAME
857
857
858 def getId(self):
858 def getId(self):
859
859
860 return self.id
860 return self.id
861
861
862 def updateId(self, new_id):
862 def updateId(self, new_id):
863
863
864 self.id = str(new_id)
864 self.id = str(new_id)
865
865
866 keyList = self.procUnitConfObjDict.keys()
866 keyList = self.procUnitConfObjDict.keys()
867 keyList.sort()
867 keyList.sort()
868
868
869 n = 1
869 n = 1
870 newProcUnitConfObjDict = {}
870 newProcUnitConfObjDict = {}
871
871
872 for procKey in keyList:
872 for procKey in keyList:
873
873
874 procUnitConfObj = self.procUnitConfObjDict[procKey]
874 procUnitConfObj = self.procUnitConfObjDict[procKey]
875 idProcUnit = str(int(self.id)*10 + n)
875 idProcUnit = str(int(self.id)*10 + n)
876 procUnitConfObj.updateId(idProcUnit, parentId = self.id)
876 procUnitConfObj.updateId(idProcUnit, parentId = self.id)
877
877
878 newProcUnitConfObjDict[idProcUnit] = procUnitConfObj
878 newProcUnitConfObjDict[idProcUnit] = procUnitConfObj
879 n += 1
879 n += 1
880
880
881 self.procUnitConfObjDict = newProcUnitConfObjDict
881 self.procUnitConfObjDict = newProcUnitConfObjDict
882
882
883 def setup(self, id, name, description):
883 def setup(self, id, name, description):
884
884
885 self.id = str(id)
885 self.id = str(id)
886 self.name = name
886 self.name = name
887 self.description = description
887 self.description = description
888
888
889 def update(self, name, description):
889 def update(self, name, description):
890
890
891 self.name = name
891 self.name = name
892 self.description = description
892 self.description = description
893
893
894 def addReadUnit(self, id=None, datatype=None, name=None, **kwargs):
894 def addReadUnit(self, id=None, datatype=None, name=None, **kwargs):
895
895
896 if id is None:
896 if id is None:
897 idReadUnit = self.__getNewId()
897 idReadUnit = self.__getNewId()
898 else:
898 else:
899 idReadUnit = str(id)
899 idReadUnit = str(id)
900
900
901 readUnitConfObj = ReadUnitConf()
901 readUnitConfObj = ReadUnitConf()
902 readUnitConfObj.setup(idReadUnit, name, datatype, parentId=self.id, **kwargs)
902 readUnitConfObj.setup(idReadUnit, name, datatype, parentId=self.id, **kwargs)
903
903
904 self.procUnitConfObjDict[readUnitConfObj.getId()] = readUnitConfObj
904 self.procUnitConfObjDict[readUnitConfObj.getId()] = readUnitConfObj
905
905
906 return readUnitConfObj
906 return readUnitConfObj
907
907
908 def addProcUnit(self, inputId='0', datatype=None, name=None):
908 def addProcUnit(self, inputId='0', datatype=None, name=None):
909
909
910 idProcUnit = self.__getNewId()
910 idProcUnit = self.__getNewId()
911
911
912 procUnitConfObj = ProcUnitConf()
912 procUnitConfObj = ProcUnitConf()
913 procUnitConfObj.setup(idProcUnit, name, datatype, inputId, parentId=self.id)
913 procUnitConfObj.setup(idProcUnit, name, datatype, inputId, parentId=self.id)
914
914
915 self.procUnitConfObjDict[procUnitConfObj.getId()] = procUnitConfObj
915 self.procUnitConfObjDict[procUnitConfObj.getId()] = procUnitConfObj
916
916
917 return procUnitConfObj
917 return procUnitConfObj
918
918
919 def removeProcUnit(self, id):
919 def removeProcUnit(self, id):
920
920
921 if id in self.procUnitConfObjDict.keys():
921 if id in self.procUnitConfObjDict.keys():
922 self.procUnitConfObjDict.pop(id)
922 self.procUnitConfObjDict.pop(id)
923
923
924 def getReadUnitId(self):
924 def getReadUnitId(self):
925
925
926 readUnitConfObj = self.getReadUnitObj()
926 readUnitConfObj = self.getReadUnitObj()
927
927
928 return readUnitConfObj.id
928 return readUnitConfObj.id
929
929
930 def getReadUnitObj(self):
930 def getReadUnitObj(self):
931
931
932 for obj in self.procUnitConfObjDict.values():
932 for obj in self.procUnitConfObjDict.values():
933 if obj.getElementName() == "ReadUnit":
933 if obj.getElementName() == "ReadUnit":
934 return obj
934 return obj
935
935
936 return None
936 return None
937
937
938 def getProcUnitObj(self, id=None, name=None):
938 def getProcUnitObj(self, id=None, name=None):
939
939
940 if id != None:
940 if id != None:
941 return self.procUnitConfObjDict[id]
941 return self.procUnitConfObjDict[id]
942
942
943 if name != None:
943 if name != None:
944 return self.getProcUnitObjByName(name)
944 return self.getProcUnitObjByName(name)
945
945
946 return None
946 return None
947
947
948 def getProcUnitObjByName(self, name):
948 def getProcUnitObjByName(self, name):
949
949
950 for obj in self.procUnitConfObjDict.values():
950 for obj in self.procUnitConfObjDict.values():
951 if obj.name == name:
951 if obj.name == name:
952 return obj
952 return obj
953
953
954 return None
954 return None
955
955
956 def procUnitItems(self):
956 def procUnitItems(self):
957
957
958 return self.procUnitConfObjDict.items()
958 return self.procUnitConfObjDict.items()
959
959
960 def makeXml(self):
960 def makeXml(self):
961
961
962 projectElement = Element('Project')
962 projectElement = Element('Project')
963 projectElement.set('id', str(self.id))
963 projectElement.set('id', str(self.id))
964 projectElement.set('name', self.name)
964 projectElement.set('name', self.name)
965 projectElement.set('description', self.description)
965 projectElement.set('description', self.description)
966
966
967 for procUnitConfObj in self.procUnitConfObjDict.values():
967 for procUnitConfObj in self.procUnitConfObjDict.values():
968 procUnitConfObj.makeXml(projectElement)
968 procUnitConfObj.makeXml(projectElement)
969
969
970 self.projectElement = projectElement
970 self.projectElement = projectElement
971
971
972 def writeXml(self, filename=None):
972 def writeXml(self, filename=None):
973
973
974 if filename == None:
974 if filename == None:
975 if self.filename:
975 if self.filename:
976 filename = self.filename
976 filename = self.filename
977 else:
977 else:
978 filename = "schain.xml"
978 filename = "schain.xml"
979
979
980 if not filename:
980 if not filename:
981 print "filename has not been defined. Use setFilename(filename) for do it."
981 print "filename has not been defined. Use setFilename(filename) for do it."
982 return 0
982 return 0
983
983
984 abs_file = os.path.abspath(filename)
984 abs_file = os.path.abspath(filename)
985
985
986 if not os.access(os.path.dirname(abs_file), os.W_OK):
986 if not os.access(os.path.dirname(abs_file), os.W_OK):
987 print "No write permission on %s" %os.path.dirname(abs_file)
987 print "No write permission on %s" %os.path.dirname(abs_file)
988 return 0
988 return 0
989
989
990 if os.path.isfile(abs_file) and not(os.access(abs_file, os.W_OK)):
990 if os.path.isfile(abs_file) and not(os.access(abs_file, os.W_OK)):
991 print "File %s already exists and it could not be overwriten" %abs_file
991 print "File %s already exists and it could not be overwriten" %abs_file
992 return 0
992 return 0
993
993
994 self.makeXml()
994 self.makeXml()
995
995
996 ElementTree(self.projectElement).write(abs_file, method='xml')
996 ElementTree(self.projectElement).write(abs_file, method='xml')
997
997
998 self.filename = abs_file
998 self.filename = abs_file
999
999
1000 return 1
1000 return 1
1001
1001
1002 def readXml(self, filename = None):
1002 def readXml(self, filename = None):
1003
1003
1004 if not filename:
1004 if not filename:
1005 print "filename is not defined"
1005 print "filename is not defined"
1006 return 0
1006 return 0
1007
1007
1008 abs_file = os.path.abspath(filename)
1008 abs_file = os.path.abspath(filename)
1009
1009
1010 if not os.path.isfile(abs_file):
1010 if not os.path.isfile(abs_file):
1011 print "%s file does not exist" %abs_file
1011 print "%s file does not exist" %abs_file
1012 return 0
1012 return 0
1013
1013
1014 self.projectElement = None
1014 self.projectElement = None
1015 self.procUnitConfObjDict = {}
1015 self.procUnitConfObjDict = {}
1016
1016
1017 try:
1017 try:
1018 self.projectElement = ElementTree().parse(abs_file)
1018 self.projectElement = ElementTree().parse(abs_file)
1019 except:
1019 except:
1020 print "Error reading %s, verify file format" %filename
1020 print "Error reading %s, verify file format" %filename
1021 return 0
1021 return 0
1022
1022
1023 self.project = self.projectElement.tag
1023 self.project = self.projectElement.tag
1024
1024
1025 self.id = self.projectElement.get('id')
1025 self.id = self.projectElement.get('id')
1026 self.name = self.projectElement.get('name')
1026 self.name = self.projectElement.get('name')
1027 self.description = self.projectElement.get('description')
1027 self.description = self.projectElement.get('description')
1028
1028
1029 readUnitElementList = self.projectElement.iter(ReadUnitConf().getElementName())
1029 readUnitElementList = self.projectElement.iter(ReadUnitConf().getElementName())
1030
1030
1031 for readUnitElement in readUnitElementList:
1031 for readUnitElement in readUnitElementList:
1032 readUnitConfObj = ReadUnitConf()
1032 readUnitConfObj = ReadUnitConf()
1033 readUnitConfObj.readXml(readUnitElement)
1033 readUnitConfObj.readXml(readUnitElement)
1034
1034
1035 if readUnitConfObj.parentId == None:
1035 if readUnitConfObj.parentId == None:
1036 readUnitConfObj.parentId = self.id
1036 readUnitConfObj.parentId = self.id
1037
1037
1038 self.procUnitConfObjDict[readUnitConfObj.getId()] = readUnitConfObj
1038 self.procUnitConfObjDict[readUnitConfObj.getId()] = readUnitConfObj
1039
1039
1040 procUnitElementList = self.projectElement.iter(ProcUnitConf().getElementName())
1040 procUnitElementList = self.projectElement.iter(ProcUnitConf().getElementName())
1041
1041
1042 for procUnitElement in procUnitElementList:
1042 for procUnitElement in procUnitElementList:
1043 procUnitConfObj = ProcUnitConf()
1043 procUnitConfObj = ProcUnitConf()
1044 procUnitConfObj.readXml(procUnitElement)
1044 procUnitConfObj.readXml(procUnitElement)
1045
1045
1046 if procUnitConfObj.parentId == None:
1046 if procUnitConfObj.parentId == None:
1047 procUnitConfObj.parentId = self.id
1047 procUnitConfObj.parentId = self.id
1048
1048
1049 self.procUnitConfObjDict[procUnitConfObj.getId()] = procUnitConfObj
1049 self.procUnitConfObjDict[procUnitConfObj.getId()] = procUnitConfObj
1050
1050
1051 self.filename = abs_file
1051 self.filename = abs_file
1052
1052
1053 return 1
1053 return 1
1054
1054
1055 def printattr(self):
1055 def printattr(self):
1056
1056
1057 print "Project[%s]: name = %s, description = %s" %(self.id,
1057 print "Project[%s]: name = %s, description = %s" %(self.id,
1058 self.name,
1058 self.name,
1059 self.description)
1059 self.description)
1060
1060
1061 for procUnitConfObj in self.procUnitConfObjDict.values():
1061 for procUnitConfObj in self.procUnitConfObjDict.values():
1062 procUnitConfObj.printattr()
1062 procUnitConfObj.printattr()
1063
1063
1064 def createObjects(self):
1064 def createObjects(self):
1065
1065
1066 for procUnitConfObj in self.procUnitConfObjDict.values():
1066 for procUnitConfObj in self.procUnitConfObjDict.values():
1067 procUnitConfObj.createObjects(self.plotterQueue)
1067 procUnitConfObj.createObjects(self.plotterQueue)
1068
1068
1069 def __connect(self, objIN, thisObj):
1069 def __connect(self, objIN, thisObj):
1070
1070
1071 thisObj.setInput(objIN.getOutputObj())
1071 thisObj.setInput(objIN.getOutputObj())
1072
1072
1073 def connectObjects(self):
1073 def connectObjects(self):
1074
1074
1075 for thisPUConfObj in self.procUnitConfObjDict.values():
1075 for thisPUConfObj in self.procUnitConfObjDict.values():
1076
1076
1077 inputId = thisPUConfObj.getInputId()
1077 inputId = thisPUConfObj.getInputId()
1078
1078
1079 if int(inputId) == 0:
1079 if int(inputId) == 0:
1080 continue
1080 continue
1081
1081
1082 #Get input object
1082 #Get input object
1083 puConfINObj = self.procUnitConfObjDict[inputId]
1083 puConfINObj = self.procUnitConfObjDict[inputId]
1084 puObjIN = puConfINObj.getProcUnitObj()
1084 puObjIN = puConfINObj.getProcUnitObj()
1085
1085
1086 #Get current object
1086 #Get current object
1087 thisPUObj = thisPUConfObj.getProcUnitObj()
1087 thisPUObj = thisPUConfObj.getProcUnitObj()
1088
1088
1089 self.__connect(puObjIN, thisPUObj)
1089 self.__connect(puObjIN, thisPUObj)
1090
1090
1091 def __handleError(self, procUnitConfObj, send_email=True):
1091 def __handleError(self, procUnitConfObj, send_email=True):
1092
1092
1093 import socket
1093 import socket
1094
1094
1095 err = traceback.format_exception(sys.exc_info()[0],
1095 err = traceback.format_exception(sys.exc_info()[0],
1096 sys.exc_info()[1],
1096 sys.exc_info()[1],
1097 sys.exc_info()[2])
1097 sys.exc_info()[2])
1098
1098
1099 print "***** Error occurred in %s *****" %(procUnitConfObj.name)
1099 print "***** Error occurred in %s *****" %(procUnitConfObj.name)
1100 print "***** %s" %err[-1]
1100 print "***** %s" %err[-1]
1101
1101
1102 message = "".join(err)
1102 message = "".join(err)
1103
1103
1104 sys.stderr.write(message)
1104 sys.stderr.write(message)
1105
1105
1106 if not send_email:
1106 if not send_email:
1107 return
1107 return
1108
1108
1109 subject = "SChain v%s: Error running %s\n" %(schainpy.__version__, procUnitConfObj.name)
1109 subject = "SChain v%s: Error running %s\n" %(schainpy.__version__, procUnitConfObj.name)
1110
1110
1111 subtitle = "%s: %s\n" %(procUnitConfObj.getElementName() ,procUnitConfObj.name)
1111 subtitle = "%s: %s\n" %(procUnitConfObj.getElementName() ,procUnitConfObj.name)
1112 subtitle += "Hostname: %s\n" %socket.gethostbyname(socket.gethostname())
1112 subtitle += "Hostname: %s\n" %socket.gethostbyname(socket.gethostname())
1113 subtitle += "Working directory: %s\n" %os.path.abspath("./")
1113 subtitle += "Working directory: %s\n" %os.path.abspath("./")
1114 subtitle += "Configuration file: %s\n" %self.filename
1114 subtitle += "Configuration file: %s\n" %self.filename
1115 subtitle += "Time: %s\n" %str(datetime.datetime.now())
1115 subtitle += "Time: %s\n" %str(datetime.datetime.now())
1116
1116
1117 readUnitConfObj = self.getReadUnitObj()
1117 readUnitConfObj = self.getReadUnitObj()
1118 if readUnitConfObj:
1118 if readUnitConfObj:
1119 subtitle += "\nInput parameters:\n"
1119 subtitle += "\nInput parameters:\n"
1120 subtitle += "[Data path = %s]\n" %readUnitConfObj.path
1120 subtitle += "[Data path = %s]\n" %readUnitConfObj.path
1121 subtitle += "[Data type = %s]\n" %readUnitConfObj.datatype
1121 subtitle += "[Data type = %s]\n" %readUnitConfObj.datatype
1122 subtitle += "[Start date = %s]\n" %readUnitConfObj.startDate
1122 subtitle += "[Start date = %s]\n" %readUnitConfObj.startDate
1123 subtitle += "[End date = %s]\n" %readUnitConfObj.endDate
1123 subtitle += "[End date = %s]\n" %readUnitConfObj.endDate
1124 subtitle += "[Start time = %s]\n" %readUnitConfObj.startTime
1124 subtitle += "[Start time = %s]\n" %readUnitConfObj.startTime
1125 subtitle += "[End time = %s]\n" %readUnitConfObj.endTime
1125 subtitle += "[End time = %s]\n" %readUnitConfObj.endTime
1126
1126
1127 adminObj = schainpy.admin.SchainNotify()
1127 adminObj = schainpy.admin.SchainNotify()
1128 adminObj.sendAlert(message=message,
1128 adminObj.sendAlert(message=message,
1129 subject=subject,
1129 subject=subject,
1130 subtitle=subtitle,
1130 subtitle=subtitle,
1131 filename=self.filename)
1131 filename=self.filename)
1132
1132
1133 def isPaused(self):
1133 def isPaused(self):
1134 return 0
1134 return 0
1135
1135
1136 def isStopped(self):
1136 def isStopped(self):
1137 return 0
1137 return 0
1138
1138
1139 def runController(self):
1139 def runController(self):
1140 """
1140 """
1141 returns 0 when this process has been stopped, 1 otherwise
1141 returns 0 when this process has been stopped, 1 otherwise
1142 """
1142 """
1143
1143
1144 if self.isPaused():
1144 if self.isPaused():
1145 print "Process suspended"
1145 print "Process suspended"
1146
1146
1147 while True:
1147 while True:
1148 sleep(0.1)
1148 sleep(0.1)
1149
1149
1150 if not self.isPaused():
1150 if not self.isPaused():
1151 break
1151 break
1152
1152
1153 if self.isStopped():
1153 if self.isStopped():
1154 break
1154 break
1155
1155
1156 print "Process reinitialized"
1156 print "Process reinitialized"
1157
1157
1158 if self.isStopped():
1158 if self.isStopped():
1159 print "Process stopped"
1159 print "Process stopped"
1160 return 0
1160 return 0
1161
1161
1162 return 1
1162 return 1
1163
1163
1164 def setFilename(self, filename):
1164 def setFilename(self, filename):
1165
1165
1166 self.filename = filename
1166 self.filename = filename
1167
1167
1168 def setPlotterQueue(self, plotter_queue):
1168 def setPlotterQueue(self, plotter_queue):
1169
1169
1170 raise NotImplementedError, "Use schainpy.controller_api.ControllerThread instead Project class"
1170 raise NotImplementedError, "Use schainpy.controller_api.ControllerThread instead Project class"
1171
1171
1172 def getPlotterQueue(self):
1172 def getPlotterQueue(self):
1173
1173
1174 raise NotImplementedError, "Use schainpy.controller_api.ControllerThread instead Project class"
1174 raise NotImplementedError, "Use schainpy.controller_api.ControllerThread instead Project class"
1175
1175
1176 def useExternalPlotter(self):
1176 def useExternalPlotter(self):
1177
1177
1178 raise NotImplementedError, "Use schainpy.controller_api.ControllerThread instead Project class"
1178 raise NotImplementedError, "Use schainpy.controller_api.ControllerThread instead Project class"
1179
1179
1180 def run(self):
1180 def run(self):
1181
1181
1182 print
1182 print
1183 print "*"*60
1183 print "*"*60
1184 print " Starting SIGNAL CHAIN PROCESSING v%s " %schainpy.__version__
1184 print " Starting SIGNAL CHAIN PROCESSING v%s " %schainpy.__version__
1185 print "*"*60
1185 print "*"*60
1186 print
1186 print
1187
1187
1188 keyList = self.procUnitConfObjDict.keys()
1188 keyList = self.procUnitConfObjDict.keys()
1189 keyList.sort()
1189 keyList.sort()
1190
1190
1191 while(True):
1191 while(True):
1192
1192
1193 is_ok = False
1193 is_ok = False
1194
1194
1195 for procKey in keyList:
1195 for procKey in keyList:
1196 # print "Running the '%s' process with %s" %(procUnitConfObj.name, procUnitConfObj.id)
1196 # print "Running the '%s' process with %s" %(procUnitConfObj.name, procUnitConfObj.id)
1197
1197
1198 procUnitConfObj = self.procUnitConfObjDict[procKey]
1198 procUnitConfObj = self.procUnitConfObjDict[procKey]
1199
1199
1200 try:
1200 try:
1201 sts = procUnitConfObj.run()
1201 sts = procUnitConfObj.run()
1202 is_ok = is_ok or sts
1202 is_ok = is_ok or sts
1203 except KeyboardInterrupt:
1203 except KeyboardInterrupt:
1204 is_ok = False
1204 is_ok = False
1205 break
1205 break
1206 except ValueError, e:
1206 except ValueError, e:
1207 sleep(0.5)
1207 sleep(0.5)
1208 self.__handleError(procUnitConfObj, send_email=True)
1208 self.__handleError(procUnitConfObj, send_email=True)
1209 is_ok = False
1209 is_ok = False
1210 break
1210 break
1211 except:
1211 except:
1212 sleep(0.5)
1212 sleep(0.5)
1213 self.__handleError(procUnitConfObj)
1213 self.__handleError(procUnitConfObj)
1214 is_ok = False
1214 is_ok = False
1215 break
1215 break
1216
1216
1217 #If every process unit finished so end process
1217 #If every process unit finished so end process
1218 if not(is_ok):
1218 if not(is_ok):
1219 # print "Every process unit have finished"
1219 # print "Every process unit have finished"
1220 break
1220 break
1221
1221
1222 if not self.runController():
1222 if not self.runController():
1223 break
1223 break
1224
1224
1225 #Closing every process
1225 #Closing every process
1226 for procKey in keyList:
1226 for procKey in keyList:
1227 procUnitConfObj = self.procUnitConfObjDict[procKey]
1227 procUnitConfObj = self.procUnitConfObjDict[procKey]
1228 procUnitConfObj.close()
1228 procUnitConfObj.close()
1229
1229
1230 print "Process finished"
1230 print "Process finished"
1231
1231
1232 def start(self):
1232 def start(self):
1233
1233
1234 self.writeXml()
1234 self.writeXml()
1235
1235
1236 self.createObjects()
1236 self.createObjects()
1237 self.connectObjects()
1237 self.connectObjects()
1238 self.run()
1238 self.run()
1239
1239
1240 if __name__ == '__main__':
1240 if __name__ == '__main__':
1241
1241
1242 desc = "Segundo Test"
1242 desc = "Segundo Test"
1243 filename = "schain.xml"
1243 filename = "schain.xml"
1244
1244
1245 controllerObj = Project()
1245 controllerObj = Project()
1246
1246
1247 controllerObj.setup(id = '191', name='test01', description=desc)
1247 controllerObj.setup(id = '191', name='test01', description=desc)
1248
1248
1249 readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage',
1249 readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage',
1250 path='data/rawdata/',
1250 path='data/rawdata/',
1251 startDate='2011/01/01',
1251 startDate='2011/01/01',
1252 endDate='2012/12/31',
1252 endDate='2012/12/31',
1253 startTime='00:00:00',
1253 startTime='00:00:00',
1254 endTime='23:59:59',
1254 endTime='23:59:59',
1255 online=1,
1255 online=1,
1256 walk=1)
1256 walk=1)
1257
1257
1258 procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId())
1258 procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId())
1259
1259
1260 opObj10 = procUnitConfObj0.addOperation(name='selectChannels')
1260 opObj10 = procUnitConfObj0.addOperation(name='selectChannels')
1261 opObj10.addParameter(name='channelList', value='3,4,5', format='intlist')
1261 opObj10.addParameter(name='channelList', value='3,4,5', format='intlist')
1262
1262
1263 opObj10 = procUnitConfObj0.addOperation(name='selectHeights')
1263 opObj10 = procUnitConfObj0.addOperation(name='selectHeights')
1264 opObj10.addParameter(name='minHei', value='90', format='float')
1264 opObj10.addParameter(name='minHei', value='90', format='float')
1265 opObj10.addParameter(name='maxHei', value='180', format='float')
1265 opObj10.addParameter(name='maxHei', value='180', format='float')
1266
1266
1267 opObj12 = procUnitConfObj0.addOperation(name='CohInt', optype='external')
1267 opObj12 = procUnitConfObj0.addOperation(name='CohInt', optype='external')
1268 opObj12.addParameter(name='n', value='10', format='int')
1268 opObj12.addParameter(name='n', value='10', format='int')
1269
1269
1270 procUnitConfObj1 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj0.getId())
1270 procUnitConfObj1 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj0.getId())
1271 procUnitConfObj1.addParameter(name='nFFTPoints', value='32', format='int')
1271 procUnitConfObj1.addParameter(name='nFFTPoints', value='32', format='int')
1272 # procUnitConfObj1.addParameter(name='pairList', value='(0,1),(0,2),(1,2)', format='')
1272 # procUnitConfObj1.addParameter(name='pairList', value='(0,1),(0,2),(1,2)', format='')
1273
1273
1274
1274
1275 opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='external')
1275 opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='external')
1276 opObj11.addParameter(name='idfigure', value='1', format='int')
1276 opObj11.addParameter(name='idfigure', value='1', format='int')
1277 opObj11.addParameter(name='wintitle', value='SpectraPlot0', format='str')
1277 opObj11.addParameter(name='wintitle', value='SpectraPlot0', format='str')
1278 opObj11.addParameter(name='zmin', value='40', format='int')
1278 opObj11.addParameter(name='zmin', value='40', format='int')
1279 opObj11.addParameter(name='zmax', value='90', format='int')
1279 opObj11.addParameter(name='zmax', value='90', format='int')
1280 opObj11.addParameter(name='showprofile', value='1', format='int')
1280 opObj11.addParameter(name='showprofile', value='1', format='int')
1281
1281
1282 print "Escribiendo el archivo XML"
1282 print "Escribiendo el archivo XML"
1283
1283
1284 controllerObj.writeXml(filename)
1284 controllerObj.writeXml(filename)
1285
1285
1286 print "Leyendo el archivo XML"
1286 print "Leyendo el archivo XML"
1287 controllerObj.readXml(filename)
1287 controllerObj.readXml(filename)
1288 #controllerObj.printattr()
1288 #controllerObj.printattr()
1289
1289
1290 controllerObj.createObjects()
1290 controllerObj.createObjects()
1291 controllerObj.connectObjects()
1291 controllerObj.connectObjects()
1292 controllerObj.run()
1292 controllerObj.run()
1293
1293
1294 No newline at end of file
1294
@@ -1,179 +1,179
1 import threading
1 import threading
2 from Queue import Queue
2 from Queue import Queue
3
3
4 from schainpy.controller import Project
4 from schainpy.controller import Project
5 from schainpy.model.graphics.jroplotter import PlotManager
5 from schainpy.model.graphics.jroplotter import PlotManager
6
6
7 class ControllerThread(threading.Thread, Project):
7 class ControllerThread(threading.Thread, Project):
8
8
9 def __init__(self, plotter_queue=None):
9 def __init__(self, plotter_queue=None):
10
10
11 threading.Thread.__init__(self)
11 threading.Thread.__init__(self)
12 Project.__init__(self, plotter_queue)
12 Project.__init__(self, plotter_queue)
13
13
14 self.setDaemon(True)
14 self.setDaemon(True)
15
15
16 self.lock = threading.Lock()
16 self.lock = threading.Lock()
17 self.control = {'stop':False, 'pause':False}
17 self.control = { 'stop':False, 'pause':False }
18
18
19 def __del__(self):
19 def __del__(self):
20
20
21 self.control['stop'] = True
21 self.control['stop'] = True
22
22
23 def stop(self):
23 def stop(self):
24
24
25 self.lock.acquire()
25 self.lock.acquire()
26
26
27 self.control['stop'] = True
27 self.control['stop'] = True
28
28
29 self.lock.release()
29 self.lock.release()
30
30
31 def pause(self):
31 def pause(self):
32
32
33 self.lock.acquire()
33 self.lock.acquire()
34
34
35 self.control['pause'] = not(self.control['pause'])
35 self.control['pause'] = not(self.control['pause'])
36 paused = self.control['pause']
36 paused = self.control['pause']
37
37
38 self.lock.release()
38 self.lock.release()
39
39
40 return paused
40 return paused
41
41
42 def isPaused(self):
42 def isPaused(self):
43
43
44 self.lock.acquire()
44 self.lock.acquire()
45 paused = self.control['pause']
45 paused = self.control['pause']
46 self.lock.release()
46 self.lock.release()
47
47
48 return paused
48 return paused
49
49
50 def isStopped(self):
50 def isStopped(self):
51
51
52 self.lock.acquire()
52 self.lock.acquire()
53 stopped = self.control['stop']
53 stopped = self.control['stop']
54 self.lock.release()
54 self.lock.release()
55
55
56 return stopped
56 return stopped
57
57
58 def run(self):
58 def run(self):
59 self.control['stop'] = False
59 self.control['stop'] = False
60 self.control['pause'] = False
60 self.control['pause'] = False
61
61
62 self.writeXml()
62 self.writeXml()
63
63
64 self.createObjects()
64 self.createObjects()
65 self.connectObjects()
65 self.connectObjects()
66 Project.run(self)
66 Project.run(self)
67
67
68 def isRunning(self):
68 def isRunning(self):
69
69
70 return self.is_alive()
70 return self.is_alive()
71
71
72 def isFinished(self):
72 def isFinished(self):
73
73
74 return not self.is_alive()
74 return not self.is_alive()
75
75
76 def setPlotters(self):
76 def setPlotters(self):
77
77
78 plotterList = PlotManager.plotterList
78 plotterList = PlotManager.plotterList
79
79
80 for thisPUConfObj in self.procUnitConfObjDict.values():
80 for thisPUConfObj in self.procUnitConfObjDict.values():
81
81
82 inputId = thisPUConfObj.getInputId()
82 inputId = thisPUConfObj.getInputId()
83
83
84 if int(inputId) == 0:
84 if int(inputId) == 0:
85 continue
85 continue
86
86
87 for thisOpObj in thisPUConfObj.getOperationObjList():
87 for thisOpObj in thisPUConfObj.getOperationObjList():
88
88
89 if thisOpObj.type == "self":
89 if thisOpObj.type == "self":
90 continue
90 continue
91
91
92 if thisOpObj.name in plotterList:
92 if thisOpObj.name in plotterList:
93 thisOpObj.type = "plotter"
93 thisOpObj.type = "other"
94
94
95 def setPlotterQueue(self, plotter_queue):
95 def setPlotterQueue(self, plotter_queue):
96
96
97 self.plotterQueue = plotter_queue
97 self.plotterQueue = plotter_queue
98
98
99 def getPlotterQueue(self):
99 def getPlotterQueue(self):
100
100
101 return self.plotterQueue
101 return self.plotterQueue
102
102
103 def useExternalPlotter(self):
103 def useExternalPlotter(self):
104
104
105 self.plotterQueue = Queue(10)
105 self.plotterQueue = Queue(10)
106 self.setPlotters()
106 self.setPlotters()
107
107
108 plotManagerObj = PlotManager(self.plotterQueue)
108 plotManagerObj = PlotManager(self.plotterQueue)
109 plotManagerObj.setController(self)
109 plotManagerObj.setController(self)
110
110
111 return plotManagerObj
111 return plotManagerObj
112
112
113 # from PyQt4 import QtCore
113 # from PyQt4 import QtCore
114 # from PyQt4.QtCore import SIGNAL
114 # from PyQt4.QtCore import SIGNAL
115 #
115 #
116 # class ControllerQThread(QtCore.QThread, Project):
116 # class ControllerQThread(QtCore.QThread, Project):
117 #
117 #
118 # def __init__(self, filename):
118 # def __init__(self, filename):
119 #
119 #
120 # QtCore.QThread.__init__(self)
120 # QtCore.QThread.__init__(self)
121 # Project.__init__(self)
121 # Project.__init__(self)
122 #
122 #
123 # self.filename = filename
123 # self.filename = filename
124 #
124 #
125 # self.lock = threading.Lock()
125 # self.lock = threading.Lock()
126 # self.control = {'stop':False, 'pause':False}
126 # self.control = {'stop':False, 'pause':False}
127 #
127 #
128 # def __del__(self):
128 # def __del__(self):
129 #
129 #
130 # self.control['stop'] = True
130 # self.control['stop'] = True
131 # self.wait()
131 # self.wait()
132 #
132 #
133 # def stop(self):
133 # def stop(self):
134 #
134 #
135 # self.lock.acquire()
135 # self.lock.acquire()
136 #
136 #
137 # self.control['stop'] = True
137 # self.control['stop'] = True
138 #
138 #
139 # self.lock.release()
139 # self.lock.release()
140 #
140 #
141 # def pause(self):
141 # def pause(self):
142 #
142 #
143 # self.lock.acquire()
143 # self.lock.acquire()
144 #
144 #
145 # self.control['pause'] = not(self.control['pause'])
145 # self.control['pause'] = not(self.control['pause'])
146 # paused = self.control['pause']
146 # paused = self.control['pause']
147 #
147 #
148 # self.lock.release()
148 # self.lock.release()
149 #
149 #
150 # return paused
150 # return paused
151 #
151 #
152 # def isPaused(self):
152 # def isPaused(self):
153 #
153 #
154 # self.lock.acquire()
154 # self.lock.acquire()
155 # paused = self.control['pause']
155 # paused = self.control['pause']
156 # self.lock.release()
156 # self.lock.release()
157 #
157 #
158 # return paused
158 # return paused
159 #
159 #
160 # def isStopped(self):
160 # def isStopped(self):
161 #
161 #
162 # self.lock.acquire()
162 # self.lock.acquire()
163 # stopped = self.control['stop']
163 # stopped = self.control['stop']
164 # self.lock.release()
164 # self.lock.release()
165 #
165 #
166 # return stopped
166 # return stopped
167 #
167 #
168 # def run(self):
168 # def run(self):
169 #
169 #
170 # self.control['stop'] = False
170 # self.control['stop'] = False
171 # self.control['pause'] = False
171 # self.control['pause'] = False
172 #
172 #
173 # self.readXml(self.filename)
173 # self.readXml(self.filename)
174 # self.createObjects()
174 # self.createObjects()
175 # self.connectObjects()
175 # self.connectObjects()
176 # self.emit( SIGNAL( "jobStarted( PyQt_PyObject )" ), 1)
176 # self.emit( SIGNAL( "jobStarted( PyQt_PyObject )" ), 1)
177 # Project.run(self)
177 # Project.run(self)
178 # self.emit( SIGNAL( "jobFinished( PyQt_PyObject )" ), 1)
178 # self.emit( SIGNAL( "jobFinished( PyQt_PyObject )" ), 1)
179 # No newline at end of file
179 #
@@ -1,1008 +1,1012
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
35
36 "Miguel Urco":mailto:miguel.urco@jro.igp.gob.pe Jun. 03, 2015
36 "Miguel Urco":mailto:miguel.urco@jro.igp.gob.pe Jun. 03, 2015
37
37
38 """
38 """
39
39
40 server = None
40 server = None
41 username = None
41 username = None
42 password = None
42 password = None
43 remotefolder = None
43 remotefolder = None
44
44
45 period = 60
45 period = 60
46 fileList = []
46 fileList = []
47 bussy = False
47 bussy = False
48
48
49 def __init__(self, server, username, password, remotefolder, period=60):
49 def __init__(self, server, username, password, remotefolder, period=60):
50
50
51 Thread.__init__(self)
51 Thread.__init__(self)
52
52
53 self.setDaemon(True)
53 self.setDaemon(True)
54
54
55 self.status = 0
55 self.status = 0
56
56
57 self.__server = server
57 self.__server = server
58 self.__username = username
58 self.__username = username
59 self.__password = password
59 self.__password = password
60 self.__remotefolder = remotefolder
60 self.__remotefolder = remotefolder
61
61
62 self.period = period
62 self.period = period
63
63
64 self.fileList = []
64 self.fileList = []
65 self.bussy = False
65 self.bussy = False
66
66
67 self.stopFlag = False
67 self.stopFlag = False
68
68
69 print "[Remote Server] Opening server: %s" %self.__server
69 print "[Remote Server] Opening server: %s" %self.__server
70 if self.open(self.__server, self.__username, self.__password, self.__remotefolder):
70 if self.open(self.__server, self.__username, self.__password, self.__remotefolder):
71 print "[Remote Server] %s server was opened successfully" %self.__server
71 print "[Remote Server] %s server was opened successfully" %self.__server
72
72
73 self.close()
73 self.close()
74
74
75 self.mutex = threading.Lock()
75 self.mutex = threading.Lock()
76
76
77 def stop(self):
77 def stop(self):
78
78
79 self.stopFlag = True
79 self.stopFlag = True
80 self.join(10)
80 self.join(10)
81
81
82 def open(self):
82 def open(self):
83 """
83 """
84 Connect to server and create a connection class (FTP or SSH) to remote server.
84 Connect to server and create a connection class (FTP or SSH) to remote server.
85 """
85 """
86 raise NotImplementedError, "Implement this method in child class"
86 raise NotImplementedError, "Implement this method in child class"
87
87
88 def close(self):
88 def close(self):
89 """
89 """
90 Close connection to server
90 Close connection to server
91 """
91 """
92 raise NotImplementedError, "Implement this method in child class"
92 raise NotImplementedError, "Implement this method in child class"
93
93
94 def mkdir(self, remotefolder):
94 def mkdir(self, remotefolder):
95 """
95 """
96 Create a folder remotely
96 Create a folder remotely
97 """
97 """
98 raise NotImplementedError, "Implement this method in child class"
98 raise NotImplementedError, "Implement this method in child class"
99
99
100 def cd(self, remotefolder):
100 def cd(self, remotefolder):
101 """
101 """
102 Change working directory in remote server
102 Change working directory in remote server
103 """
103 """
104 raise NotImplementedError, "Implement this method in child class"
104 raise NotImplementedError, "Implement this method in child class"
105
105
106 def download(self, filename, localfolder=None):
106 def download(self, filename, localfolder=None):
107 """
107 """
108 Download a file from server to local host
108 Download a file from server to local host
109 """
109 """
110 raise NotImplementedError, "Implement this method in child class"
110 raise NotImplementedError, "Implement this method in child class"
111
111
112 def sendFile(self, fullfilename):
112 def sendFile(self, fullfilename):
113 """
113 """
114 sendFile method is used to upload a local file to the current directory in remote server
114 sendFile method is used to upload a local file to the current directory in remote server
115
115
116 Inputs:
116 Inputs:
117 fullfilename - full path name of local file to store in remote directory
117 fullfilename - full path name of local file to store in remote directory
118
118
119 Returns:
119 Returns:
120 0 in error case else 1
120 0 in error case else 1
121 """
121 """
122 raise NotImplementedError, "Implement this method in child class"
122 raise NotImplementedError, "Implement this method in child class"
123
123
124 def upload(self, fullfilename, remotefolder=None):
124 def upload(self, fullfilename, remotefolder=None):
125 """
125 """
126 upload method is used to upload a local file to remote directory. This method changes
126 upload method is used to upload a local file to remote directory. This method changes
127 working directory before sending a file.
127 working directory before sending a file.
128
128
129 Inputs:
129 Inputs:
130 fullfilename - full path name of local file to store in remote directory
130 fullfilename - full path name of local file to store in remote directory
131
131
132 remotefolder - remote directory
132 remotefolder - remote directory
133
133
134 Returns:
134 Returns:
135 0 in error case else 1
135 0 in error case else 1
136 """
136 """
137 print "[Remote Server] Uploading %s to %s:%s" %(fullfilename, self.server, self.remotefolder)
137 print "[Remote Server] Uploading %s to %s:%s" %(fullfilename, self.server, self.remotefolder)
138
138
139 if not self.status:
139 if not self.status:
140 return 0
140 return 0
141
141
142 if remotefolder == None:
142 if remotefolder == None:
143 remotefolder = self.remotefolder
143 remotefolder = self.remotefolder
144
144
145 if not self.cd(remotefolder):
145 if not self.cd(remotefolder):
146 return 0
146 return 0
147
147
148 if not self.sendFile(fullfilename):
148 if not self.sendFile(fullfilename):
149 print "[Remote Server] Error uploading file %s" %fullfilename
149 print "[Remote Server] Error uploading file %s" %fullfilename
150 return 0
150 return 0
151
151
152 print "[Remote Server] upload finished successfully"
152 print "[Remote Server] upload finished successfully"
153
153
154 return 1
154 return 1
155
155
156 def delete(self, filename):
156 def delete(self, filename):
157 """
157 """
158 Remove a file from remote server
158 Remove a file from remote server
159 """
159 """
160 pass
160 pass
161
161
162 def updateFileList(self, fileList):
162 def updateFileList(self, fileList):
163 """
163 """
164 Remove a file from remote server
164 Remove a file from remote server
165 """
165 """
166
166
167 if fileList == self.fileList:
167 if fileList == self.fileList:
168 return 0
168 return 0
169
169
170 self.mutex.acquire()
170 self.mutex.acquire()
171 # init = time.time()
171 # init = time.time()
172 #
172 #
173 # while(self.bussy):
173 # while(self.bussy):
174 # sleep(0.1)
174 # sleep(0.1)
175 # if time.time() - init > 2*self.period:
175 # if time.time() - init > 2*self.period:
176 # return 0
176 # return 0
177
177
178 self.fileList = fileList
178 self.fileList = fileList
179 self.mutex.release()
179 self.mutex.release()
180 return 1
180 return 1
181
181
182 def run(self):
182 def run(self):
183
183
184 if not self.status:
184 if not self.status:
185 print "Finishing FTP service"
185 print "Finishing FTP service"
186 return
186 return
187
187
188 if not self.cd(self.remotefolder):
188 if not self.cd(self.remotefolder):
189 raise ValueError, "Could not access to the new remote directory: %s" %self.remotefolder
189 raise ValueError, "Could not access to the new remote directory: %s" %self.remotefolder
190
190
191 while True:
191 while True:
192
192
193 for i in range(self.period):
193 for i in range(self.period):
194 if self.stopFlag:
194 if self.stopFlag:
195 break
195 break
196 sleep(1)
196 sleep(1)
197
197
198 if self.stopFlag:
198 if self.stopFlag:
199 break
199 break
200
200
201 # self.bussy = True
201 # self.bussy = True
202 self.mutex.acquire()
202 self.mutex.acquire()
203
203
204 print "[Remote Server] Opening %s" %self.__server
204 print "[Remote Server] Opening %s" %self.__server
205 if not self.open(self.__server, self.__username, self.__password, self.__remotefolder):
205 if not self.open(self.__server, self.__username, self.__password, self.__remotefolder):
206 self.mutex.release()
206 self.mutex.release()
207 continue
207 continue
208
208
209 for thisFile in self.fileList:
209 for thisFile in self.fileList:
210 self.upload(thisFile, self.remotefolder)
210 self.upload(thisFile, self.remotefolder)
211
211
212 print "[Remote Server] Closing %s" %self.__server
212 print "[Remote Server] Closing %s" %self.__server
213 self.close()
213 self.close()
214
214
215 self.mutex.release()
215 self.mutex.release()
216 # self.bussy = False
216 # self.bussy = False
217
217
218 print "[Remote Server] Thread stopped successfully"
218 print "[Remote Server] Thread stopped successfully"
219
219
220 class FTPClient(Remote):
220 class FTPClient(Remote):
221
221
222 __ftpClientObj = None
222 __ftpClientObj = None
223
223
224 def __init__(self, server, username, password, remotefolder, period=60):
224 def __init__(self, server, username, password, remotefolder, period=60):
225 """
225 """
226 """
226 """
227 Remote.__init__(self, server, username, password, remotefolder, period)
227 Remote.__init__(self, server, username, password, remotefolder, period)
228
228
229 def open(self, server, username, password, remotefolder):
229 def open(self, server, username, password, remotefolder):
230
230
231 """
231 """
232 This method is used to set FTP parameters and establish a connection to remote server
232 This method is used to set FTP parameters and establish a connection to remote server
233
233
234 Inputs:
234 Inputs:
235 server - remote server IP Address
235 server - remote server IP Address
236
236
237 username - remote server Username
237 username - remote server Username
238
238
239 password - remote server password
239 password - remote server password
240
240
241 remotefolder - remote server current working directory
241 remotefolder - remote server current working directory
242
242
243 Return:
243 Return:
244 Boolean - Returns 1 if a connection has been established, 0 otherwise
244 Boolean - Returns 1 if a connection has been established, 0 otherwise
245
245
246 Affects:
246 Affects:
247 self.status - in case of error or fail connection this parameter is set to 0 else 1
247 self.status - in case of error or fail connection this parameter is set to 0 else 1
248
248
249 """
249 """
250
250
251 if server == None:
251 if server == None:
252 raise ValueError, "FTP server should be defined"
252 raise ValueError, "FTP server should be defined"
253
253
254 if username == None:
254 if username == None:
255 raise ValueError, "FTP username should be defined"
255 raise ValueError, "FTP username should be defined"
256
256
257 if password == None:
257 if password == None:
258 raise ValueError, "FTP password should be defined"
258 raise ValueError, "FTP password should be defined"
259
259
260 if remotefolder == None:
260 if remotefolder == None:
261 raise ValueError, "FTP remote folder should be defined"
261 raise ValueError, "FTP remote folder should be defined"
262
262
263 try:
263 try:
264 ftpClientObj = ftplib.FTP(server)
264 ftpClientObj = ftplib.FTP(server)
265 except ftplib.all_errors, e:
265 except ftplib.all_errors, e:
266 print "[FTP Server]: FTP server connection fail: %s" %server
266 print "[FTP Server]: FTP server connection fail: %s" %server
267 print "[FTP Server]:", e
267 print "[FTP Server]:", e
268 self.status = 0
268 self.status = 0
269 return 0
269 return 0
270
270
271 try:
271 try:
272 ftpClientObj.login(username, password)
272 ftpClientObj.login(username, password)
273 except ftplib.all_errors:
273 except ftplib.all_errors:
274 print "[FTP Server]: FTP username or password are incorrect"
274 print "[FTP Server]: FTP username or password are incorrect"
275 self.status = 0
275 self.status = 0
276 return 0
276 return 0
277
277
278 if remotefolder == None:
278 if remotefolder == None:
279 remotefolder = ftpClientObj.pwd()
279 remotefolder = ftpClientObj.pwd()
280 else:
280 else:
281 try:
281 try:
282 ftpClientObj.cwd(remotefolder)
282 ftpClientObj.cwd(remotefolder)
283 except ftplib.all_errors:
283 except ftplib.all_errors:
284 print "[FTP Server]: FTP remote folder is invalid: %s" %remotefolder
284 print "[FTP Server]: FTP remote folder is invalid: %s" %remotefolder
285 remotefolder = ftpClientObj.pwd()
285 remotefolder = ftpClientObj.pwd()
286
286
287 self.server = server
287 self.server = server
288 self.username = username
288 self.username = username
289 self.password = password
289 self.password = password
290 self.remotefolder = remotefolder
290 self.remotefolder = remotefolder
291 self.__ftpClientObj = ftpClientObj
291 self.__ftpClientObj = ftpClientObj
292 self.status = 1
292 self.status = 1
293
293
294 return 1
294 return 1
295
295
296 def close(self):
296 def close(self):
297 """
297 """
298 Close connection to remote server
298 Close connection to remote server
299 """
299 """
300 if not self.status:
300 if not self.status:
301 return 0
301 return 0
302
302
303 self.__ftpClientObj.close()
303 self.__ftpClientObj.close()
304
304
305 def mkdir(self, remotefolder):
305 def mkdir(self, remotefolder):
306 """
306 """
307 mkdir is used to make a new directory in remote server
307 mkdir is used to make a new directory in remote server
308
308
309 Input:
309 Input:
310 remotefolder - directory name
310 remotefolder - directory name
311
311
312 Return:
312 Return:
313 0 in error case else 1
313 0 in error case else 1
314 """
314 """
315 if not self.status:
315 if not self.status:
316 return 0
316 return 0
317
317
318 try:
318 try:
319 self.__ftpClientObj.mkd(dirname)
319 self.__ftpClientObj.mkd(dirname)
320 except ftplib.all_errors:
320 except ftplib.all_errors:
321 print "[FTP Server]: Error creating remote folder: %s" %remotefolder
321 print "[FTP Server]: Error creating remote folder: %s" %remotefolder
322 return 0
322 return 0
323
323
324 return 1
324 return 1
325
325
326 def cd(self, remotefolder):
326 def cd(self, remotefolder):
327 """
327 """
328 cd is used to change remote working directory on server
328 cd is used to change remote working directory on server
329
329
330 Input:
330 Input:
331 remotefolder - current working directory
331 remotefolder - current working directory
332
332
333 Affects:
333 Affects:
334 self.remotefolder
334 self.remotefolder
335
335
336 Return:
336 Return:
337 0 in case of error else 1
337 0 in case of error else 1
338 """
338 """
339 if not self.status:
339 if not self.status:
340 return 0
340 return 0
341
341
342 if remotefolder == self.remotefolder:
342 if remotefolder == self.remotefolder:
343 return 1
343 return 1
344
344
345 try:
345 try:
346 self.__ftpClientObj.cwd(remotefolder)
346 self.__ftpClientObj.cwd(remotefolder)
347 except ftplib.all_errors:
347 except ftplib.all_errors:
348 print '[FTP Server]: Error changing to %s' %remotefolder
348 print '[FTP Server]: Error changing to %s' %remotefolder
349 print '[FTP Server]: Trying to create remote folder'
349 print '[FTP Server]: Trying to create remote folder'
350
350
351 if not self.mkdir(remotefolder):
351 if not self.mkdir(remotefolder):
352 print '[FTP Server]: Remote folder could not be created'
352 print '[FTP Server]: Remote folder could not be created'
353 return 0
353 return 0
354
354
355 try:
355 try:
356 self.__ftpClientObj.cwd(remotefolder)
356 self.__ftpClientObj.cwd(remotefolder)
357 except ftplib.all_errors:
357 except ftplib.all_errors:
358 return 0
358 return 0
359
359
360 self.remotefolder = remotefolder
360 self.remotefolder = remotefolder
361
361
362 return 1
362 return 1
363
363
364 def sendFile(self, fullfilename):
364 def sendFile(self, fullfilename):
365
365
366 if not self.status:
366 if not self.status:
367 return 0
367 return 0
368
368
369 fp = open(fullfilename, 'rb')
369 fp = open(fullfilename, 'rb')
370
370
371 filename = os.path.basename(fullfilename)
371 filename = os.path.basename(fullfilename)
372
372
373 command = "STOR %s" %filename
373 command = "STOR %s" %filename
374
374
375 try:
375 try:
376 self.__ftpClientObj.storbinary(command, fp)
376 self.__ftpClientObj.storbinary(command, fp)
377 except ftplib.all_errors, e:
377 except ftplib.all_errors, e:
378 print "[FTP Server]:", e
378 print "[FTP Server]:", e
379 return 0
379 return 0
380
380
381 try:
381 try:
382 self.__ftpClientObj.sendcmd('SITE CHMOD 755 ' + filename)
382 self.__ftpClientObj.sendcmd('SITE CHMOD 755 ' + filename)
383 except ftplib.all_errors, e:
383 except ftplib.all_errors, e:
384 print "[FTP Server]:", e
384 print "[FTP Server]:", e
385
385
386 fp.close()
386 fp.close()
387
387
388 return 1
388 return 1
389
389
390 class SSHClient(Remote):
390 class SSHClient(Remote):
391
391
392 __sshClientObj = None
392 __sshClientObj = None
393 __scpClientObj = None
393 __scpClientObj = None
394
394
395 def __init__(self, server, username, password, remotefolder, period=60):
395 def __init__(self, server, username, password, remotefolder, period=60):
396 """
396 """
397 """
397 """
398 Remote.__init__(self, server, username, password, remotefolder, period)
398 Remote.__init__(self, server, username, password, remotefolder, period)
399
399
400 def open(self, server, username, password, remotefolder, port=22):
400 def open(self, server, username, password, remotefolder, port=22):
401
401
402 """
402 """
403 This method is used to set SSH parameters and establish a connection to a remote server
403 This method is used to set SSH parameters and establish a connection to a remote server
404
404
405 Inputs:
405 Inputs:
406 server - remote server IP Address
406 server - remote server IP Address
407
407
408 username - remote server Username
408 username - remote server Username
409
409
410 password - remote server password
410 password - remote server password
411
411
412 remotefolder - remote server current working directory
412 remotefolder - remote server current working directory
413
413
414 Return: void
414 Return: void
415
415
416 Affects:
416 Affects:
417 self.status - in case of error or fail connection this parameter is set to 0 else 1
417 self.status - in case of error or fail connection this parameter is set to 0 else 1
418
418
419 """
419 """
420 import socket
420 import socket
421
421
422 if server == None:
422 if server == None:
423 raise ValueError, "SSH server should be defined"
423 raise ValueError, "SSH server should be defined"
424
424
425 if username == None:
425 if username == None:
426 raise ValueError, "SSH username should be defined"
426 raise ValueError, "SSH username should be defined"
427
427
428 if password == None:
428 if password == None:
429 raise ValueError, "SSH password should be defined"
429 raise ValueError, "SSH password should be defined"
430
430
431 if remotefolder == None:
431 if remotefolder == None:
432 raise ValueError, "SSH remote folder should be defined"
432 raise ValueError, "SSH remote folder should be defined"
433
433
434 sshClientObj = paramiko.SSHClient()
434 sshClientObj = paramiko.SSHClient()
435
435
436 sshClientObj.load_system_host_keys()
436 sshClientObj.load_system_host_keys()
437 sshClientObj.set_missing_host_key_policy(paramiko.WarningPolicy())
437 sshClientObj.set_missing_host_key_policy(paramiko.WarningPolicy())
438
438
439 self.status = 0
439 self.status = 0
440 try:
440 try:
441 sshClientObj.connect(server, username=username, password=password, port=port)
441 sshClientObj.connect(server, username=username, password=password, port=port)
442 except paramiko.AuthenticationException, e:
442 except paramiko.AuthenticationException, e:
443 # print "SSH username or password are incorrect: %s"
443 # print "SSH username or password are incorrect: %s"
444 print "[SSH Server]:", e
444 print "[SSH Server]:", e
445 return 0
445 return 0
446 except SSHException, e:
446 except SSHException, e:
447 print "[SSH Server]:", e
447 print "[SSH Server]:", e
448 return 0
448 return 0
449 except socket.error:
449 except socket.error:
450 self.status = 0
450 self.status = 0
451 print "[SSH Server]:", e
451 print "[SSH Server]:", e
452 return 0
452 return 0
453
453
454 self.status = 1
454 self.status = 1
455 scpClientObj = scp.SCPClient(sshClientObj.get_transport(), socket_timeout=30)
455 scpClientObj = scp.SCPClient(sshClientObj.get_transport(), socket_timeout=30)
456
456
457 if remotefolder == None:
457 if remotefolder == None:
458 remotefolder = self.pwd()
458 remotefolder = self.pwd()
459
459
460 self.server = server
460 self.server = server
461 self.username = username
461 self.username = username
462 self.password = password
462 self.password = password
463 self.__sshClientObj = sshClientObj
463 self.__sshClientObj = sshClientObj
464 self.__scpClientObj = scpClientObj
464 self.__scpClientObj = scpClientObj
465 self.status = 1
465 self.status = 1
466
466
467 if not self.cd(remotefolder):
467 if not self.cd(remotefolder):
468 raise ValueError, "[SSH Server]: Could not access to remote folder: %s" %remotefolder
468 raise ValueError, "[SSH Server]: Could not access to remote folder: %s" %remotefolder
469 return 0
469 return 0
470
470
471 self.remotefolder = remotefolder
471 self.remotefolder = remotefolder
472
472
473 return 1
473 return 1
474
474
475 def close(self):
475 def close(self):
476 """
476 """
477 Close connection to remote server
477 Close connection to remote server
478 """
478 """
479 if not self.status:
479 if not self.status:
480 return 0
480 return 0
481
481
482 self.__scpClientObj.close()
482 self.__scpClientObj.close()
483 self.__sshClientObj.close()
483 self.__sshClientObj.close()
484
484
485 def __execute(self, command):
485 def __execute(self, command):
486 """
486 """
487 __execute a command on remote server
487 __execute a command on remote server
488
488
489 Input:
489 Input:
490 command - Exmaple 'ls -l'
490 command - Exmaple 'ls -l'
491
491
492 Return:
492 Return:
493 0 in error case else 1
493 0 in error case else 1
494 """
494 """
495 if not self.status:
495 if not self.status:
496 return 0
496 return 0
497
497
498 stdin, stdout, stderr = self.__sshClientObj.exec_command(command)
498 stdin, stdout, stderr = self.__sshClientObj.exec_command(command)
499
499
500 result = stderr.readlines()
500 result = stderr.readlines()
501 if len(result) > 1:
501 if len(result) > 1:
502 return 0
502 return 0
503
503
504 result = stdout.readlines()
504 result = stdout.readlines()
505 if len(result) > 1:
505 if len(result) > 1:
506 return result[0][:-1]
506 return result[0][:-1]
507
507
508 return 1
508 return 1
509
509
510 def mkdir(self, remotefolder):
510 def mkdir(self, remotefolder):
511 """
511 """
512 mkdir is used to make a new directory in remote server
512 mkdir is used to make a new directory in remote server
513
513
514 Input:
514 Input:
515 remotefolder - directory name
515 remotefolder - directory name
516
516
517 Return:
517 Return:
518 0 in error case else 1
518 0 in error case else 1
519 """
519 """
520
520
521 command = 'mkdir %s' %remotefolder
521 command = 'mkdir %s' %remotefolder
522
522
523 return self.__execute(command)
523 return self.__execute(command)
524
524
525 def pwd(self):
525 def pwd(self):
526
526
527 command = 'pwd'
527 command = 'pwd'
528
528
529 return self.__execute(command)
529 return self.__execute(command)
530
530
531 def cd(self, remotefolder):
531 def cd(self, remotefolder):
532 """
532 """
533 cd is used to change remote working directory on server
533 cd is used to change remote working directory on server
534
534
535 Input:
535 Input:
536 remotefolder - current working directory
536 remotefolder - current working directory
537
537
538 Affects:
538 Affects:
539 self.remotefolder
539 self.remotefolder
540
540
541 Return:
541 Return:
542 0 in case of error else 1
542 0 in case of error else 1
543 """
543 """
544 if not self.status:
544 if not self.status:
545 return 0
545 return 0
546
546
547 if remotefolder == self.remotefolder:
547 if remotefolder == self.remotefolder:
548 return 1
548 return 1
549
549
550 chk_command = "cd %s; pwd" %remotefolder
550 chk_command = "cd %s; pwd" %remotefolder
551 mkdir_command = "mkdir %s" %remotefolder
551 mkdir_command = "mkdir %s" %remotefolder
552
552
553 if not self.__execute(chk_command):
553 if not self.__execute(chk_command):
554 if not self.__execute(mkdir_command):
554 if not self.__execute(mkdir_command):
555 self.remotefolder = None
555 self.remotefolder = None
556 return 0
556 return 0
557
557
558 self.remotefolder = remotefolder
558 self.remotefolder = remotefolder
559
559
560 return 1
560 return 1
561
561
562 def sendFile(self, fullfilename):
562 def sendFile(self, fullfilename):
563
563
564 if not self.status:
564 if not self.status:
565 return 0
565 return 0
566
566
567 try:
567 try:
568 self.__scpClientObj.put(fullfilename, remote_path=self.remotefolder)
568 self.__scpClientObj.put(fullfilename, remote_path=self.remotefolder)
569 except scp.ScpError, e:
569 except scp.ScpError, e:
570 print "[SSH Server]", str(e)
570 print "[SSH Server]", str(e)
571 return 0
571 return 0
572
572
573 remotefile = os.path.join(self.remotefolder, os.path.split(fullfilename)[-1])
573 remotefile = os.path.join(self.remotefolder, os.path.split(fullfilename)[-1])
574 command = 'chmod 775 %s' %remotefile
574 command = 'chmod 775 %s' %remotefile
575
575
576 return self.__execute(command)
576 return self.__execute(command)
577
577
578 class SendToServer(ProcessingUnit):
578 class SendToServer(ProcessingUnit):
579
579
580 def __init__(self):
580 def __init__(self):
581
581
582 ProcessingUnit.__init__(self)
582 ProcessingUnit.__init__(self)
583
583
584 self.isConfig = False
584 self.isConfig = False
585 self.clientObj = None
585 self.clientObj = None
586
587
586
588
587 def setup(self, server, username, password, remotefolder, localfolder, ext='.png', period=60, protocol='ftp', **kwargs):
589 def setup(self, server, username, password, remotefolder, localfolder, ext='.png', period=60, protocol='ftp', **kwargs):
588
590
589 self.clientObj = None
591 self.clientObj = None
590 self.localfolder = localfolder
592 self.localfolder = localfolder
591 self.ext = ext
593 self.ext = ext
592 self.period = period
594 self.period = period
593
595
594 if str.lower(protocol) == 'ftp':
596 if str.lower(protocol) == 'ftp':
595 self.clientObj = FTPClient(server, username, password, remotefolder, period)
597 self.clientObj = FTPClient(server, username, password, remotefolder, period)
596
598
597 if str.lower(protocol) == 'ssh':
599 if str.lower(protocol) == 'ssh':
598 self.clientObj = SSHClient(server, username, password, remotefolder, period)
600 self.clientObj = SSHClient(server, username, password, remotefolder, period)
599
601
600 if not self.clientObj:
602 if not self.clientObj:
601 raise ValueError, "%s has been chosen as remote access protocol but it is not valid" %protocol
603 raise ValueError, "%s has been chosen as remote access protocol but it is not valid" %protocol
602
604
603 self.clientObj.start()
605 self.clientObj.start()
604
606
605 def findFiles(self):
607 def findFiles(self):
606
608
607 if not type(self.localfolder) == list:
609 if not type(self.localfolder) == list:
608 folderList = [self.localfolder]
610 folderList = [self.localfolder]
609 else:
611 else:
610 folderList = self.localfolder
612 folderList = self.localfolder
611
613
612 #Remove duplicate items
614 #Remove duplicate items
613 folderList = list(set(folderList))
615 folderList = list(set(folderList))
614
616
615 fullfilenameList = []
617 fullfilenameList = []
616
618
617 for thisFolder in folderList:
619 for thisFolder in folderList:
618
620
619 print "[Remote Server]: Searching files on %s" %thisFolder
621 print "[Remote Server]: Searching files on %s" %thisFolder
620
622
621 filenameList = glob.glob1(thisFolder, '*%s' %self.ext)
623 filenameList = glob.glob1(thisFolder, '*%s' %self.ext)
622
624
623 if len(filenameList) < 1:
625 if len(filenameList) < 1:
624 continue
626 continue
625
627
626 for thisFile in filenameList:
628 for thisFile in filenameList:
627 fullfilename = os.path.join(thisFolder, thisFile)
629 fullfilename = os.path.join(thisFolder, thisFile)
628
630
629 if fullfilename in fullfilenameList:
631 if fullfilename in fullfilenameList:
630 continue
632 continue
631
633
632 #Only files modified in the last 30 minutes are considered
634 #Only files modified in the last 30 minutes are considered
633 if os.path.getmtime(fullfilename) < time.time() - 30*60:
635 if os.path.getmtime(fullfilename) < time.time() - 30*60:
634 continue
636 continue
635
637
636 fullfilenameList.append(fullfilename)
638 fullfilenameList.append(fullfilename)
637
639
638 return fullfilenameList
640 return fullfilenameList
639
641
640 def run(self, **kwargs):
642 def run(self, **kwargs):
641
642 if not self.isConfig:
643 if not self.isConfig:
643 self.init = time.time()
644 self.init = time.time()
644 self.setup(**kwargs)
645 self.setup(**kwargs)
645 self.isConfig = True
646 self.isConfig = True
646
647
648 if not self.clientObj.is_alive():
649 print "[Remote Server]: Restarting connection "
650 self.setup(**kwargs)
651
647 if time.time() - self.init >= self.period:
652 if time.time() - self.init >= self.period:
648 fullfilenameList = self.findFiles()
653 fullfilenameList = self.findFiles()
649
654
650 if self.clientObj.updateFileList(fullfilenameList):
655 if self.clientObj.updateFileList(fullfilenameList):
651 print "[Remote Server]: Sending the next files ", str(fullfilenameList)
656 print "[Remote Server]: Sending the next files ", str(fullfilenameList)
652
653 self.init = time.time()
657 self.init = time.time()
654
658
655 def close(self):
659 def close(self):
656 print "[Remote Server] Stopping thread"
660 print "[Remote Server] Stopping thread"
657 self.clientObj.stop()
661 self.clientObj.stop()
658
662
659
663
660 class FTP(object):
664 class FTP(object):
661 """
665 """
662 Ftp is a public class used to define custom File Transfer Protocol from "ftplib" python module
666 Ftp is a public class used to define custom File Transfer Protocol from "ftplib" python module
663
667
664 Non-standard Python modules used: None
668 Non-standard Python modules used: None
665
669
666 Written by "Daniel Suarez":mailto:daniel.suarez@jro.igp.gob.pe Oct. 26, 2010
670 Written by "Daniel Suarez":mailto:daniel.suarez@jro.igp.gob.pe Oct. 26, 2010
667 """
671 """
668
672
669 def __init__(self,server = None, username=None, password=None, remotefolder=None):
673 def __init__(self,server = None, username=None, password=None, remotefolder=None):
670 """
674 """
671 This method is used to setting parameters for FTP and establishing connection to remote server
675 This method is used to setting parameters for FTP and establishing connection to remote server
672
676
673 Inputs:
677 Inputs:
674 server - remote server IP Address
678 server - remote server IP Address
675
679
676 username - remote server Username
680 username - remote server Username
677
681
678 password - remote server password
682 password - remote server password
679
683
680 remotefolder - remote server current working directory
684 remotefolder - remote server current working directory
681
685
682 Return: void
686 Return: void
683
687
684 Affects:
688 Affects:
685 self.status - in Error Case or Connection Failed this parameter is set to 1 else 0
689 self.status - in Error Case or Connection Failed this parameter is set to 1 else 0
686
690
687 self.folderList - sub-folder list of remote folder
691 self.folderList - sub-folder list of remote folder
688
692
689 self.fileList - file list of remote folder
693 self.fileList - file list of remote folder
690
694
691
695
692 """
696 """
693
697
694 if ((server == None) and (username==None) and (password==None) and (remotefolder==None)):
698 if ((server == None) and (username==None) and (password==None) and (remotefolder==None)):
695 server, username, password, remotefolder = self.parmsByDefault()
699 server, username, password, remotefolder = self.parmsByDefault()
696
700
697 self.server = server
701 self.server = server
698 self.username = username
702 self.username = username
699 self.password = password
703 self.password = password
700 self.remotefolder = remotefolder
704 self.remotefolder = remotefolder
701 self.file = None
705 self.file = None
702 self.ftp = None
706 self.ftp = None
703 self.status = 0
707 self.status = 0
704
708
705 try:
709 try:
706 self.ftp = ftplib.FTP(self.server)
710 self.ftp = ftplib.FTP(self.server)
707 self.ftp.login(self.username,self.password)
711 self.ftp.login(self.username,self.password)
708 self.ftp.cwd(self.remotefolder)
712 self.ftp.cwd(self.remotefolder)
709 # print 'Connect to FTP Server: Successfully'
713 # print 'Connect to FTP Server: Successfully'
710
714
711 except ftplib.all_errors:
715 except ftplib.all_errors:
712 print 'Error FTP Service'
716 print 'Error FTP Service'
713 self.status = 1
717 self.status = 1
714 return
718 return
715
719
716
720
717
721
718 self.dirList = []
722 self.dirList = []
719
723
720 try:
724 try:
721 self.dirList = self.ftp.nlst()
725 self.dirList = self.ftp.nlst()
722
726
723 except ftplib.error_perm, resp:
727 except ftplib.error_perm, resp:
724 if str(resp) == "550 No files found":
728 if str(resp) == "550 No files found":
725 print "no files in this directory"
729 print "no files in this directory"
726 self.status = 1
730 self.status = 1
727 return
731 return
728
732
729 except ftplib.all_errors:
733 except ftplib.all_errors:
730 print 'Error Displaying Dir-Files'
734 print 'Error Displaying Dir-Files'
731 self.status = 1
735 self.status = 1
732 return
736 return
733
737
734 self.fileList = []
738 self.fileList = []
735 self.folderList = []
739 self.folderList = []
736 #only for test
740 #only for test
737 for f in self.dirList:
741 for f in self.dirList:
738 name, ext = os.path.splitext(f)
742 name, ext = os.path.splitext(f)
739 if ext != '':
743 if ext != '':
740 self.fileList.append(f)
744 self.fileList.append(f)
741 # print 'filename: %s - size: %d'%(f,self.ftp.size(f))
745 # print 'filename: %s - size: %d'%(f,self.ftp.size(f))
742
746
743 def parmsByDefault(self):
747 def parmsByDefault(self):
744 server = 'jro-app.igp.gob.pe'
748 server = 'jro-app.igp.gob.pe'
745 username = 'wmaster'
749 username = 'wmaster'
746 password = 'mst2010vhf'
750 password = 'mst2010vhf'
747 remotefolder = '/home/wmaster/graficos'
751 remotefolder = '/home/wmaster/graficos'
748
752
749 return server, username, password, remotefolder
753 return server, username, password, remotefolder
750
754
751
755
752 def mkd(self,dirname):
756 def mkd(self,dirname):
753 """
757 """
754 mkd is used to make directory in remote server
758 mkd is used to make directory in remote server
755
759
756 Input:
760 Input:
757 dirname - directory name
761 dirname - directory name
758
762
759 Return:
763 Return:
760 1 in error case else 0
764 1 in error case else 0
761 """
765 """
762 try:
766 try:
763 self.ftp.mkd(dirname)
767 self.ftp.mkd(dirname)
764 except:
768 except:
765 print 'Error creating remote folder:%s'%dirname
769 print 'Error creating remote folder:%s'%dirname
766 return 1
770 return 1
767
771
768 return 0
772 return 0
769
773
770
774
771 def delete(self,filename):
775 def delete(self,filename):
772 """
776 """
773 delete is used to delete file in current working directory of remote server
777 delete is used to delete file in current working directory of remote server
774
778
775 Input:
779 Input:
776 filename - filename to delete in remote folder
780 filename - filename to delete in remote folder
777
781
778 Return:
782 Return:
779 1 in error case else 0
783 1 in error case else 0
780 """
784 """
781
785
782 try:
786 try:
783 self.ftp.delete(filename)
787 self.ftp.delete(filename)
784 except:
788 except:
785 print 'Error deleting remote file:%s'%filename
789 print 'Error deleting remote file:%s'%filename
786 return 1
790 return 1
787
791
788 return 0
792 return 0
789
793
790 def download(self,filename,localfolder):
794 def download(self,filename,localfolder):
791 """
795 """
792 download is used to downloading file from remote folder into local folder
796 download is used to downloading file from remote folder into local folder
793
797
794 Inputs:
798 Inputs:
795 filename - filename to donwload
799 filename - filename to donwload
796
800
797 localfolder - directory local to store filename
801 localfolder - directory local to store filename
798
802
799 Returns:
803 Returns:
800 self.status - 1 in error case else 0
804 self.status - 1 in error case else 0
801 """
805 """
802
806
803 self.status = 0
807 self.status = 0
804
808
805
809
806 if not(filename in self.fileList):
810 if not(filename in self.fileList):
807 print 'filename:%s not exists'%filename
811 print 'filename:%s not exists'%filename
808 self.status = 1
812 self.status = 1
809 return self.status
813 return self.status
810
814
811 newfilename = os.path.join(localfolder,filename)
815 newfilename = os.path.join(localfolder,filename)
812
816
813 self.file = open(newfilename, 'wb')
817 self.file = open(newfilename, 'wb')
814
818
815 try:
819 try:
816 print 'Download: ' + filename
820 print 'Download: ' + filename
817 self.ftp.retrbinary('RETR ' + filename, self.__handleDownload)
821 self.ftp.retrbinary('RETR ' + filename, self.__handleDownload)
818 print 'Download Complete'
822 print 'Download Complete'
819 except ftplib.all_errors:
823 except ftplib.all_errors:
820 print 'Error Downloading ' + filename
824 print 'Error Downloading ' + filename
821 self.status = 1
825 self.status = 1
822 return self.status
826 return self.status
823
827
824 self.file.close()
828 self.file.close()
825
829
826 return self.status
830 return self.status
827
831
828
832
829 def __handleDownload(self,block):
833 def __handleDownload(self,block):
830 """
834 """
831 __handleDownload is used to handle writing file
835 __handleDownload is used to handle writing file
832 """
836 """
833 self.file.write(block)
837 self.file.write(block)
834
838
835
839
836 def upload(self,filename,remotefolder=None):
840 def upload(self,filename,remotefolder=None):
837 """
841 """
838 upload is used to uploading local file to remote directory
842 upload is used to uploading local file to remote directory
839
843
840 Inputs:
844 Inputs:
841 filename - full path name of local file to store in remote directory
845 filename - full path name of local file to store in remote directory
842
846
843 remotefolder - remote directory
847 remotefolder - remote directory
844
848
845 Returns:
849 Returns:
846 self.status - 1 in error case else 0
850 self.status - 1 in error case else 0
847 """
851 """
848
852
849 if remotefolder == None:
853 if remotefolder == None:
850 remotefolder = self.remotefolder
854 remotefolder = self.remotefolder
851
855
852 self.status = 0
856 self.status = 0
853
857
854 try:
858 try:
855 self.ftp.cwd(remotefolder)
859 self.ftp.cwd(remotefolder)
856
860
857 self.file = open(filename, 'rb')
861 self.file = open(filename, 'rb')
858
862
859 (head, tail) = os.path.split(filename)
863 (head, tail) = os.path.split(filename)
860
864
861 command = "STOR " + tail
865 command = "STOR " + tail
862
866
863 print 'Uploading: ' + tail
867 print 'Uploading: ' + tail
864 self.ftp.storbinary(command, self.file)
868 self.ftp.storbinary(command, self.file)
865 print 'Upload Completed'
869 print 'Upload Completed'
866
870
867 except ftplib.all_errors:
871 except ftplib.all_errors:
868 print 'Error Uploading ' + tail
872 print 'Error Uploading ' + tail
869 self.status = 1
873 self.status = 1
870 return self.status
874 return self.status
871
875
872 self.file.close()
876 self.file.close()
873
877
874 #back to initial directory in __init__()
878 #back to initial directory in __init__()
875 self.ftp.cwd(self.remotefolder)
879 self.ftp.cwd(self.remotefolder)
876
880
877 return self.status
881 return self.status
878
882
879
883
880 def dir(self,remotefolder):
884 def dir(self,remotefolder):
881 """
885 """
882 dir is used to change working directory of remote server and get folder and file list
886 dir is used to change working directory of remote server and get folder and file list
883
887
884 Input:
888 Input:
885 remotefolder - current working directory
889 remotefolder - current working directory
886
890
887 Affects:
891 Affects:
888 self.fileList - file list of working directory
892 self.fileList - file list of working directory
889
893
890 Return:
894 Return:
891 infoList - list with filenames and size of file in bytes
895 infoList - list with filenames and size of file in bytes
892
896
893 self.folderList - folder list
897 self.folderList - folder list
894 """
898 """
895
899
896 self.remotefolder = remotefolder
900 self.remotefolder = remotefolder
897 print 'Change to ' + self.remotefolder
901 print 'Change to ' + self.remotefolder
898 try:
902 try:
899 self.ftp.cwd(remotefolder)
903 self.ftp.cwd(remotefolder)
900 except ftplib.all_errors:
904 except ftplib.all_errors:
901 print 'Error Change to ' + self.remotefolder
905 print 'Error Change to ' + self.remotefolder
902 infoList = None
906 infoList = None
903 self.folderList = None
907 self.folderList = None
904 return infoList,self.folderList
908 return infoList,self.folderList
905
909
906 self.dirList = []
910 self.dirList = []
907
911
908 try:
912 try:
909 self.dirList = self.ftp.nlst()
913 self.dirList = self.ftp.nlst()
910
914
911 except ftplib.error_perm, resp:
915 except ftplib.error_perm, resp:
912 if str(resp) == "550 No files found":
916 if str(resp) == "550 No files found":
913 print "no files in this directory"
917 print "no files in this directory"
914 infoList = None
918 infoList = None
915 self.folderList = None
919 self.folderList = None
916 return infoList,self.folderList
920 return infoList,self.folderList
917 except ftplib.all_errors:
921 except ftplib.all_errors:
918 print 'Error Displaying Dir-Files'
922 print 'Error Displaying Dir-Files'
919 infoList = None
923 infoList = None
920 self.folderList = None
924 self.folderList = None
921 return infoList,self.folderList
925 return infoList,self.folderList
922
926
923 infoList = []
927 infoList = []
924 self.fileList = []
928 self.fileList = []
925 self.folderList = []
929 self.folderList = []
926 for f in self.dirList:
930 for f in self.dirList:
927 name,ext = os.path.splitext(f)
931 name,ext = os.path.splitext(f)
928 if ext != '':
932 if ext != '':
929 self.fileList.append(f)
933 self.fileList.append(f)
930 value = (f,self.ftp.size(f))
934 value = (f,self.ftp.size(f))
931 infoList.append(value)
935 infoList.append(value)
932
936
933 if ext == '':
937 if ext == '':
934 self.folderList.append(f)
938 self.folderList.append(f)
935
939
936 return infoList,self.folderList
940 return infoList,self.folderList
937
941
938
942
939 def close(self):
943 def close(self):
940 """
944 """
941 close is used to close and end FTP connection
945 close is used to close and end FTP connection
942
946
943 Inputs: None
947 Inputs: None
944
948
945 Return: void
949 Return: void
946
950
947 """
951 """
948 self.ftp.close()
952 self.ftp.close()
949
953
950 class SendByFTP(Operation):
954 class SendByFTP(Operation):
951
955
952 def __init__(self):
956 def __init__(self):
953
957
954 self.status = 1
958 self.status = 1
955 self.counter = 0
959 self.counter = 0
956
960
957 def error_print(self, ValueError):
961 def error_print(self, ValueError):
958
962
959 print ValueError, 'Error FTP'
963 print ValueError, 'Error FTP'
960 print "don't worry the program is running..."
964 print "don't worry the program is running..."
961
965
962 def worker_ftp(self, server, username, password, remotefolder, filenameList):
966 def worker_ftp(self, server, username, password, remotefolder, filenameList):
963
967
964 self.ftpClientObj = FTP(server, username, password, remotefolder)
968 self.ftpClientObj = FTP(server, username, password, remotefolder)
965 for filename in filenameList:
969 for filename in filenameList:
966 self.ftpClientObj.upload(filename)
970 self.ftpClientObj.upload(filename)
967 self.ftpClientObj.close()
971 self.ftpClientObj.close()
968
972
969 def ftp_thread(self, server, username, password, remotefolder):
973 def ftp_thread(self, server, username, password, remotefolder):
970 if not(self.status):
974 if not(self.status):
971 return
975 return
972
976
973 import multiprocessing
977 import multiprocessing
974
978
975 p = multiprocessing.Process(target=self.worker_ftp, args=(server, username, password, remotefolder, self.filenameList,))
979 p = multiprocessing.Process(target=self.worker_ftp, args=(server, username, password, remotefolder, self.filenameList,))
976 p.start()
980 p.start()
977
981
978 p.join(3)
982 p.join(3)
979
983
980 if p.is_alive():
984 if p.is_alive():
981 p.terminate()
985 p.terminate()
982 p.join()
986 p.join()
983 print 'killing ftp process...'
987 print 'killing ftp process...'
984 self.status = 0
988 self.status = 0
985 return
989 return
986
990
987 self.status = 1
991 self.status = 1
988 return
992 return
989
993
990 def filterByExt(self, ext, localfolder):
994 def filterByExt(self, ext, localfolder):
991 fnameList = glob.glob1(localfolder,ext)
995 fnameList = glob.glob1(localfolder,ext)
992 self.filenameList = [os.path.join(localfolder,x) for x in fnameList]
996 self.filenameList = [os.path.join(localfolder,x) for x in fnameList]
993
997
994 if len(self.filenameList) == 0:
998 if len(self.filenameList) == 0:
995 self.status = 0
999 self.status = 0
996
1000
997 def run(self, dataOut, ext, localfolder, remotefolder, server, username, password, period=1):
1001 def run(self, dataOut, ext, localfolder, remotefolder, server, username, password, period=1):
998
1002
999 self.counter += 1
1003 self.counter += 1
1000 if self.counter >= period:
1004 if self.counter >= period:
1001 self.filterByExt(ext, localfolder)
1005 self.filterByExt(ext, localfolder)
1002
1006
1003 self.ftp_thread(server, username, password, remotefolder)
1007 self.ftp_thread(server, username, password, remotefolder)
1004
1008
1005 self.counter = 0
1009 self.counter = 0
1006
1010
1007 self.status = 1
1011 self.status = 1
1008
1012
General Comments 0
You need to be logged in to leave comments. Login now