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