Rev 750 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed
| Rev 750 | Rev 751 | ||
|---|---|---|---|
| Line 18... | Line 18... | ||
| 18 | from NodeIfSerial import NodeIfSerial |
18 | from NodeIfSerial import NodeIfSerial |
| 19 | from NodeIfTCP import NodeIfTCP |
19 | from NodeIfTCP import NodeIfTCP |
| 20 | from NodeIfUDP import NodeIfUDP |
20 | from NodeIfUDP import NodeIfUDP |
| 21 | from NodeIfTCPTLS import NodeIfTCPTLS |
21 | from NodeIfTCPTLS import NodeIfTCPTLS |
| 22 | from NodeIfCanStim import NodeIfCanStim |
22 | from NodeIfCanStim import NodeIfCanStim |
| - | 23 | ||
| - | 24 | from TCPServer1 import TCPServer1 |
|
| - | 25 | from TCPTLSServer import TCPTLSServer |
|
| - | 26 | from CanCtldServer import CanCtldServer |
|
| 23 | 27 | ||
| 24 | class DynamicModuleCfg: |
28 | class DynamicModuleCfg: |
| 25 | """Dynamic module manager""" |
29 | """Dynamic module manager""" |
| 26 | 30 | ||
| 27 | modSubDir = None |
31 | modSubDir = None |
| Line 106... | Line 110... | ||
| 106 | csumcfg.readfp(csumsfile) |
110 | csumcfg.readfp(csumsfile) |
| 107 | digest = csumcfg.get(self.CHECKSUM_SECTION, entryname) |
111 | digest = csumcfg.get(self.CHECKSUM_SECTION, entryname) |
| 108 | cur_digest = self.__doCheckSum(filename) |
112 | cur_digest = self.__doCheckSum(filename) |
| 109 | log.debug('Old checksum ' + digest + '\nNew checksum: ' + cur_digest) |
113 | log.debug('Old checksum ' + digest + '\nNew checksum: ' + cur_digest) |
| 110 | if cur_digest == digest: |
114 | if cur_digest == digest: |
| 111 | return True |
115 | return True |
| 112 | return False |
116 | return False |
| 113 | 117 | ||
| 114 | 118 | ||
| 115 | def importModule(self, className, requiredAttributes): |
119 | def importModule(self, className, requiredAttributes): |
| 116 | """Imports a given class from the module with the same name """ |
120 | """Imports a given class from the module with the same name """ |
| 117 | 121 | ||
| 118 | codeFile = os.getcwd() + '/' + self.modSubDir + '/' + className + '.py' |
122 | codeFile = os.getcwd() + '/' + self.modSubDir + '/' + className + '.py' |
| 119 | mod = imp.load_source(self.modSubDir + '.' + className, codeFile) |
123 | mod = imp.load_source(self.modSubDir + '.' + className, codeFile) |
| 120 | newClass = eval('mod.' + className)() |
124 | newClass = eval('mod.' + className)() |
| 121 | 125 | ||
| 122 | for ra in requiredAttributes: |
126 | for ra in requiredAttributes: |
| 123 | if not hasattr(newClass, ra): |
127 | if not hasattr(newClass, ra): |
| 124 | print className, ': missing required symbol \"' + ra + '\"' |
128 | print className, ': missing required symbol \"' + ra + '\"' |
| 125 | return None |
129 | return None |
| 126 | 130 | ||
| 127 | self.saveModule(className, newClass) |
131 | self.saveModule(className, newClass) |
| 128 | return newClass |
132 | return newClass |
| 129 | 133 | ||
| 130 | 134 | ||
| 131 | class FilterCfg: |
135 | class FilterCfg: |
| 132 | """Filter resource manager""" |
136 | """Filter resource manager""" |
| 133 | 137 | ||
| 134 | REQUIRED_ATTRIBUTES = ['ASSOCIATED_SPACES', 'DESCRIPTIVE_NAME', |
138 | REQUIRED_ATTRIBUTES = ['ASSOCIATED_SPACES', 'DESCRIPTIVE_NAME', |
| 135 | 'attach', 'detach', 'filter'] |
139 | 'attach', 'detach', 'filter'] |
| 136 | 140 | ||
| 137 | dynamicModuleCfg = None |
141 | dynamicModuleCfg = None |
| 138 | FILTER_SUBDIR = 'filters' |
142 | FILTER_SUBDIR = 'filters' |
| 139 | filterModules = {} |
143 | filterModules = {} |
| 140 | 144 | ||
| 141 | def __init__(self): |
145 | def __init__(self): |
| 142 | self.dynamicModuleCfg = DynamicModuleCfg(self.FILTER_SUBDIR) |
146 | self.dynamicModuleCfg = DynamicModuleCfg(self.FILTER_SUBDIR) |
| 143 | 147 | ||
| 144 | def loadFilter(self, name): |
148 | def loadFilter(self, name): |
| 145 | newFilt = self.dynamicModuleCfg.loadModule(name) |
149 | newFilt = self.dynamicModuleCfg.loadModule(name) |
| 146 | if newFilt is not None: |
150 | if newFilt is not None: |
| 147 | self.filterModules[name] = newFilt |
151 | self.filterModules[name] = newFilt |
| 148 | return True |
152 | return True |
| 149 | else: |
153 | else: |
| 150 | return False |
154 | return False |
| 151 | 155 | ||
| 152 | def loadFilters(self, config = None): |
156 | def loadFilters(self, config = None): |
| 153 | self.filterModules = self.dynamicModuleCfg.loadModules() |
157 | self.filterModules = self.dynamicModuleCfg.loadModules() |
| 154 | for fM in self.filterModules: |
158 | for fM in self.filterModules: |
| 155 | log.debug(fM) |
159 | log.debug(fM) |
| Line 158... | Line 162... | ||
| 158 | self.dynamicModuleCfg.saveModule(className, classObj) |
162 | self.dynamicModuleCfg.saveModule(className, classObj) |
| 159 | 163 | ||
| 160 | def saveFilters(self): |
164 | def saveFilters(self): |
| 161 | for className in self.filterModules: |
165 | for className in self.filterModules: |
| 162 | self.__saveFilter(className, self.filterModules[className]) |
166 | self.__saveFilter(className, self.filterModules[className]) |
| 163 | 167 | ||
| 164 | def importFilter(self, className): |
168 | def importFilter(self, className): |
| 165 | """Imports a given filter definition """ |
169 | """Imports a given filter definition """ |
| 166 | classObj = self.dynamicModuleCfg.importModule(className, self.REQUIRED_ATTRIBUTES) |
170 | classObj = self.dynamicModuleCfg.importModule(className, self.REQUIRED_ATTRIBUTES) |
| 167 | if classObj is not None: |
171 | if classObj is not None: |
| 168 | print 'Imported: ' + classObj.DESCRIPTIVE_NAME |
172 | print 'Imported: ' + classObj.DESCRIPTIVE_NAME |
| 169 | return True |
173 | return True |
| 170 | else: |
174 | else: |
| 171 | return False |
175 | return False |
| 172 | 176 | ||
| 173 | 177 | ||
| 174 | class StateSpaceCfg: |
178 | class StateSpaceCfg: |
| 175 | """State space resource manager""" |
179 | """State space resource manager""" |
| 176 | 180 | ||
| 177 | REQUIRED_ATTRIBUTES = ['DESCRIPTIVE_NAME', 'RELATED_SPACES' |
181 | REQUIRED_ATTRIBUTES = ['DESCRIPTIVE_NAME', 'RELATED_SPACES' |
| Line 220... | Line 224... | ||
| 220 | pktHandler = None |
224 | pktHandler = None |
| 221 | 225 | ||
| 222 | filterChain = [] |
226 | filterChain = [] |
| 223 | nodeInterfaces = [] |
227 | nodeInterfaces = [] |
| 224 | nodeInterfaceMap = {} |
228 | nodeInterfaceMap = {} |
| - | 229 | ||
| - | 230 | serverDaemons = [] |
|
| 225 | 231 | ||
| 226 | INTERFACE_TYPES = {'serial' : NodeIfSerial, 'tcp' : NodeIfTCP, |
232 | INTERFACE_TYPES = {'serial' : NodeIfSerial, 'tcp' : NodeIfTCP, |
| 227 | 'udp' : NodeIfUDP, 'sim' : NodeIfCanStim, |
233 | 'udp' : NodeIfUDP, 'sim' : NodeIfCanStim, |
| 228 | 'tcptls' : NodeIfTCPTLS} |
234 | 'tcptls' : NodeIfTCPTLS} |
| - | 235 | ||
| - | 236 | SERVER_TYPES = {'tcpd' : TCPServer1, 'tcptlsd' : TCPTLSServer, |
|
| - | 237 | 'canctld' : CanCtldServer} |
|
| 229 | 238 | ||
| 230 | def __init__ (self): |
239 | def __init__ (self): |
| 231 | self.filterCfg = FilterCfg() |
240 | self.filterCfg = FilterCfg() |
| 232 | self.stateSpaceCfg = StateSpaceCfg() |
241 | self.stateSpaceCfg = StateSpaceCfg() |
| 233 | self.pktHandler = CanPktHandler1(self) |
242 | self.pktHandler = CanPktHandler1(self) |
| Line 252... | Line 261... | ||
| 252 | if not self.INTERFACE_TYPES.has_key(type): |
261 | if not self.INTERFACE_TYPES.has_key(type): |
| 253 | log.debug('addInterface called with invalid interface type') |
262 | log.debug('addInterface called with invalid interface type') |
| 254 | return False |
263 | return False |
| 255 | 264 | ||
| 256 | cfg = self.INTERFACE_TYPES[type].DEFAULT_CONFIG |
265 | cfg = self.INTERFACE_TYPES[type].DEFAULT_CONFIG |
| 257 | print cfg |
- | |
| 258 | nodeIf = self.INTERFACE_TYPES[type](self.pktHandler, cfg) |
266 | nodeIf = self.INTERFACE_TYPES[type](self.pktHandler, cfg) |
| 259 | print nodeIf |
- | |
| 260 | self.nodeInterfaces.append(nodeIf) |
267 | self.nodeInterfaces.append(nodeIf) |
| - | 268 | return True |
|
| 261 | 269 | ||
| 262 | def remInterface(self, name): |
270 | def remInterface(self, name): |
| - | 271 | pass |
|
| - | 272 | ||
| - | 273 | def addServerDaemon(self, type, cfg = None): |
|
| - | 274 | ||
| - | 275 | if not self.SERVER_TYPES.has_key(type): |
|
| - | 276 | log.debug('addServerDaemon called with invalid daemon type') |
|
| - | 277 | return False |
|
| - | 278 | ||
| - | 279 | serverd = self.SERVER_TYPES[type]() # actung! |
|
| - | 280 | return True |
|
| - | 281 | ||
| - | 282 | def remServerDaemon(self, name): |
|
| 263 | pass |
283 | pass |
| 264 | 284 | ||
| 265 | def __setupFilterChain(self): |
285 | def __setupFilterChain(self): |
| 266 | self.filterChain = ['DefaultFilter'] |
286 | self.filterChain = ['DefaultFilter'] |
| 267 | 287 | ||