1 martin 1.8 //%LICENSE////////////////////////////////////////////////////////////////
|
2 martin 1.9 //
|
3 martin 1.8 // Licensed to The Open Group (TOG) under one or more contributor license
4 // agreements. Refer to the OpenPegasusNOTICE.txt file distributed with
5 // this work for additional information regarding copyright ownership.
6 // Each contributor licenses this file to you under the OpenPegasus Open
7 // Source License; you may not use this file except in compliance with the
8 // License.
|
9 martin 1.9 //
|
10 martin 1.8 // Permission is hereby granted, free of charge, to any person obtaining a
11 // copy of this software and associated documentation files (the "Software"),
12 // to deal in the Software without restriction, including without limitation
13 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 // and/or sell copies of the Software, and to permit persons to whom the
15 // Software is furnished to do so, subject to the following conditions:
|
16 martin 1.9 //
|
17 martin 1.8 // The above copyright notice and this permission notice shall be included
18 // in all copies or substantial portions of the Software.
|
19 martin 1.9 //
|
20 martin 1.8 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
21 martin 1.9 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
22 martin 1.8 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
24 // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
27 martin 1.9 //
|
28 martin 1.8 //////////////////////////////////////////////////////////////////////////
|
29 h.sterling 1.1 //
|
30 marek 1.7 //%////////////////////////////////////////////////////////////////////////////
|
31 h.sterling 1.1
32 #include "DynamicListener.h"
33 #include "ListenerService.h"
34 #include "ConsumerManager.h"
35
36 #include <Pegasus/Common/Config.h>
37 #include <Pegasus/Common/Exception.h>
38 #include <Pegasus/Common/SSLContext.h>
39 #include <Pegasus/Common/Monitor.h>
40 #include <Pegasus/Common/HTTPAcceptor.h>
41 #include <Pegasus/Common/PegasusVersion.h>
42 #include <Pegasus/Common/Tracer.h>
43
44 #include <Pegasus/Common/HashTable.h>
45 #include <Pegasus/Common/FileSystem.h>
|
46 venkat.puvvada 1.11 #include <Pegasus/General/SSLContextManager.h>
|
47 h.sterling 1.1
48 #include <Pegasus/ExportServer/CIMExportResponseEncoder.h>
49 #include <Pegasus/ExportServer/CIMExportRequestDecoder.h>
50
51 PEGASUS_NAMESPACE_BEGIN
52 PEGASUS_USING_STD;
53
54
55 const Boolean DynamicListener::DEFAULT_CONSUMER_UNLOAD = true;
56 const Uint32 DynamicListener::DEFAULT_IDLE_TIMEOUT = 300000; //ms
57 const Boolean DynamicListener::DEFAULT_FORCE_SHUTDOWN = false;
58 const Uint32 DynamicListener::DEFAULT_SHUTDOWN_TIMEOUT = 10000; //ms
59
60
61 /////////////////////////////////////////////////////////////////////////////
62 // DynamicListenerRep
63 /////////////////////////////////////////////////////////////////////////////
64
65 //This class is used to stabilize the DynamicListener external interface.
66
67 class DynamicListenerRep
68 h.sterling 1.1 {
69 public:
70
|
71 kumpf 1.10 DynamicListenerRep(Uint32 portNumber,
72 const String& consumerDir,
|
73 h.sterling 1.1 const String& consumerConfigDir,
74 SSLContext* sslContext,
|
75 venkat.puvvada 1.11 ReadWriteSem* _sslContextObjectLock,
|
76 kumpf 1.10 Boolean enableConsumerUnload,
77 Uint32 consumerIdleTimeout,
|
78 h.sterling 1.1 Uint32 shutdownTimeout);
79
|
80 venkat.puvvada 1.11 DynamicListenerRep(
81 Uint32 portNumber,
82 const String& consumerDir,
83 const String& consumerConfigDir,
84 Boolean useSSL,
85 const String& keyPath,
86 const String& certPath,
87 Boolean enableConsumerUnload,
88 Uint32 consumerIdleTimeout,
|
89 anusha.kandepu 1.13 Uint32 shutdownTimeout,
90 const String & sslCipherSuite="DEFAULT");
|
91 venkat.puvvada 1.11
|
92 h.sterling 1.1 ~DynamicListenerRep();
93
94 void start();
95
96 void stop(Boolean forceShutdown);
97
98 Boolean isAlive();
99
|
100 marek 1.7 Boolean addConsumer(
101 const String& consumerName,
102 const String& location = String::EMPTY);
|
103 h.sterling 1.1
104 Boolean removeConsumer(const String& consumerName);
105
106 Uint32 getPortNumber();
107
108 String getConsumerDir();
109
110 String getConsumerConfigDir();
111
112 void setEnableConsumerUnload(Boolean consumerUnload);
113
114 Boolean getEnableConsumerUnload();
115
|
116 gs.keenan 1.4 void setIdleTimeout(Uint32 idleTimeout);
|
117 h.sterling 1.1
|
118 kumpf 1.10 Uint32 getIdleTimeout();
|
119 h.sterling 1.1
120 private:
121
122 // core components
|
123 kumpf 1.10 ListenerService* _listenerService;
|
124 h.sterling 1.1 ConsumerManager* _consumerManager;
125
126 // config properties -- do we want to separate these out????
127 Uint32 _port;
128 SSLContext* _sslContext;
|
129 venkat.puvvada 1.11 ReadWriteSem* _sslContextObjectLock;
130 SSLContextManager *_sslContextMgr;
|
131 h.sterling 1.1 };
132
|
133 marek 1.7 DynamicListenerRep::DynamicListenerRep(
|
134 kumpf 1.10 Uint32 portNumber,
|
135 marek 1.7 const String& consumerDir, //consumer mgr
136 const String& consumerConfigDir, //consumer mgr
137 SSLContext* sslContext, //listener svc
|
138 venkat.puvvada 1.11 ReadWriteSem* sslContextObjectLock, // lock for accessing the ssl context
|
139 marek 1.7 Boolean enableConsumerUnload, //consumer mgr
140 Uint32 consumerIdleTimeout, //consumer mgr
|
141 venkat.puvvada 1.11 Uint32 shutdownTimeout) :
142 _port(portNumber),
143 _sslContext(sslContext),
144 _sslContextObjectLock(sslContextObjectLock),
145 _sslContextMgr(0)
|
146 h.sterling 1.1 {
147 PEG_METHOD_ENTER(TRC_LISTENER, "DynamicListenerRep::DynamicListenerRep");
148
|
149 marek 1.7 _consumerManager = new ConsumerManager(
150 consumerDir,
151 consumerConfigDir,
152 enableConsumerUnload,
153 consumerIdleTimeout);
|
154 h.sterling 1.1
155 _listenerService = new ListenerService(_consumerManager);
156
157 PEG_METHOD_EXIT();
158 }
159
|
160 venkat.puvvada 1.11 DynamicListenerRep::DynamicListenerRep(
161 Uint32 portNumber,
162 const String& consumerDir,
163 const String& consumerConfigDir,
164 Boolean useSSL,
165 const String& keyPath,
166 const String& certPath,
167 Boolean enableConsumerUnload,
168 Uint32 consumerIdleTimeout,
|
169 anusha.kandepu 1.13 Uint32 shutdownTimeout,
170 const String & sslCipherSuite) :
|
171 venkat.puvvada 1.11 _port(portNumber),
172 _sslContext(0),
173 _sslContextObjectLock(0),
174 _sslContextMgr(0)
175 {
176 PEG_METHOD_ENTER(TRC_LISTENER, "DynamicListenerRep::DynamicListenerRep");
177
|
178 s.kodali 1.12 #ifdef PEGASUS_HAS_SSL
|
179 venkat.puvvada 1.11 if (useSSL)
180 {
181 _sslContextMgr = new SSLContextManager();
182 _sslContextMgr->createSSLContext(
183 String(),
184 certPath,
185 keyPath,
186 String(),
187 true,
188 String(),
|
189 anusha.kandepu 1.13 sslCipherSuite);
|
190 venkat.puvvada 1.11 _sslContext = _sslContextMgr->getSSLContext();
191 _sslContextObjectLock = _sslContextMgr->getSSLContextObjectLock();
192 }
|
193 s.kodali 1.12 #endif
|
194 venkat.puvvada 1.11
195 _consumerManager = new ConsumerManager(
196 consumerDir,
197 consumerConfigDir,
198 enableConsumerUnload,
199 consumerIdleTimeout);
200
201 _listenerService = new ListenerService(_consumerManager);
202
203 PEG_METHOD_EXIT();
204 }
205
|
206 h.sterling 1.1 DynamicListenerRep::~DynamicListenerRep()
207 {
208 PEG_METHOD_ENTER(TRC_LISTENER, "DynamicListenerRep::~DynamicListenerRep");
209
|
210 kumpf 1.6 delete _consumerManager;
|
211 h.sterling 1.1
|
212 kumpf 1.6 delete _listenerService;
|
213 h.sterling 1.1
|
214 venkat.puvvada 1.11 delete _sslContextMgr;
215
|
216 h.sterling 1.1 PEG_METHOD_EXIT();
217 }
218
219 void DynamicListenerRep::start()
220 {
221 PEG_METHOD_ENTER(TRC_LISTENER, "DynamicListenerRep::start");
222
223 if (_sslContext)
224 {
|
225 venkat.puvvada 1.11 _listenerService->initializeListener(
226 _port,
227 true,
228 _sslContext,
229 _sslContextObjectLock);
|
230 h.sterling 1.1
|
231 venkat.puvvada 1.11 }
232 else
|
233 h.sterling 1.1 {
|
234 venkat.puvvada 1.11 _listenerService->initializeListener(_port, false, 0, 0);
|
235 h.sterling 1.1 }
236
237 _listenerService->runListener();
238
|
239 kumpf 1.10 PEG_METHOD_EXIT();
|
240 h.sterling 1.1 }
241
242 void DynamicListenerRep::stop(Boolean forceShutdown)
243 {
244 PEG_METHOD_ENTER(TRC_LISTENER, "DynamicListenerRep::stop");
245
246 _listenerService->shutdownListener();
247
248 PEG_METHOD_EXIT();
249 }
250
251 Boolean DynamicListenerRep::isAlive()
252 {
253 return _listenerService->isAlive();
254 }
255
|
256 kumpf 1.10 //TODO:
|
257 marek 1.7 Boolean DynamicListenerRep::addConsumer(
258 const String& consumerName,
259 const String& location)
|
260 h.sterling 1.1 {
261 return true;
262 //return _consumerManager->addConsumer(consumerName, location);
263 }
264
265 //TODO:
266 Boolean DynamicListenerRep::removeConsumer(const String& consumerName)
267 {
268 return true;
269 //return _consumerManager->unloadConsumer(consumerName);
270 }
271
|
272 kumpf 1.10 Uint32 DynamicListenerRep::getPortNumber()
|
273 h.sterling 1.1 {
274 return _listenerService->getPortNumber();
275 }
276
277 String DynamicListenerRep::getConsumerDir()
278 {
279 return _consumerManager->getConsumerDir();
280 }
281
282 String DynamicListenerRep::getConsumerConfigDir()
283 {
284 return _consumerManager->getConsumerConfigDir();
285 }
286
287 Boolean DynamicListenerRep::getEnableConsumerUnload()
288 {
289 return _consumerManager->getEnableConsumerUnload();
290 }
291
292 void DynamicListenerRep::setEnableConsumerUnload(Boolean enableConsumerUnload)
293 {
294 h.sterling 1.1 //do nothing for now
295 }
296
297 Uint32 DynamicListenerRep::getIdleTimeout()
298 {
299 return _consumerManager->getIdleTimeout();
300 }
301
|
302 gs.keenan 1.3 void DynamicListenerRep::setIdleTimeout(Uint32 idleTimeout)
|
303 h.sterling 1.1 {
304 //do nothing for now
305 }
306
307
308 /////////////////////////////////////////////////////////////////////////////
309 // DynamicListener
310 /////////////////////////////////////////////////////////////////////////////
311
|
312 kumpf 1.10 DynamicListener::DynamicListener(Uint32 portNumber,
313 const String& consumerDir,
|
314 h.sterling 1.1 const String& consumerConfigDir,
|
315 kumpf 1.10 Boolean enableConsumerUnload,
316 Uint32 consumerIdleTimeout,
317 Uint32 shutdownTimeout)
318 {
319 _rep = new DynamicListenerRep(portNumber,
320 consumerDir,
321 consumerConfigDir,
322 0,
|
323 venkat.puvvada 1.11 0,
|
324 kumpf 1.10 enableConsumerUnload,
325 consumerIdleTimeout,
|
326 h.sterling 1.1 shutdownTimeout);
327 }
328
329 #ifdef PEGASUS_HAS_SSL
|
330 marek 1.7 DynamicListener::DynamicListener(
|
331 kumpf 1.10 Uint32 portNumber,
|
332 marek 1.7 const String& consumerDir,
333 const String& consumerConfigDir,
|
334 kumpf 1.10 Boolean useSSL,
335 const String& keyPath,
|
336 marek 1.7 const String& certPath,
|
337 kumpf 1.10 Boolean enableConsumerUnload,
338 Uint32 consumerIdleTimeout,
|
339 anusha.kandepu 1.13 Uint32 shutdownTimeout,
340 const String & sslCipherSuite) //ONLY IF PEGASUS_HAS_SSL
|
341 h.sterling 1.1 {
342
|
343 venkat.puvvada 1.11 _rep = new DynamicListenerRep(
344 portNumber,
345 consumerDir,
346 consumerConfigDir,
347 useSSL,
348 keyPath,
349 certPath,
350 enableConsumerUnload,
351 consumerIdleTimeout,
|
352 anusha.kandepu 1.13 shutdownTimeout,
353 sslCipherSuite);
|
354 h.sterling 1.1 }
355
|
356 marek 1.7 DynamicListener::DynamicListener(
|
357 kumpf 1.10 Uint32 portNumber,
|
358 marek 1.7 const String& consumerDir,
359 const String& consumerConfigDir,
|
360 kumpf 1.10 Boolean useSSL,
|
361 marek 1.7 SSLContext* sslContext,
|
362 venkat.puvvada 1.11 ReadWriteSem* sslContextObjectLock,
|
363 kumpf 1.10 Boolean enableConsumerUnload,
364 Uint32 consumerIdleTimeout,
|
365 marek 1.7 Uint32 shutdownTimeout) //ONLY IF PEGASUS_HAS_SSL
|
366 h.sterling 1.1 {
|
367 kumpf 1.10 _rep = new DynamicListenerRep(portNumber,
368 consumerDir,
369 consumerConfigDir,
370 sslContext,
|
371 venkat.puvvada 1.11 sslContextObjectLock,
|
372 kumpf 1.10 enableConsumerUnload,
373 consumerIdleTimeout,
|
374 h.sterling 1.1 shutdownTimeout);
375 }
376 #endif
377
378 DynamicListener::~DynamicListener()
379 {
|
380 kumpf 1.6 delete static_cast<DynamicListenerRep*>(_rep);
|
381 h.sterling 1.1 }
382
383 void DynamicListener::start()
384 {
385 static_cast<DynamicListenerRep*>(_rep)->start();
386 }
387
388 void DynamicListener::stop(Boolean forceShutdown)
389 {
390 static_cast<DynamicListenerRep*>(_rep)->stop(forceShutdown);
391 }
392
393 Boolean DynamicListener::isAlive()
394 {
395 return static_cast<DynamicListenerRep*>(_rep)->isAlive();
396 }
397
|
398 marek 1.7 Boolean DynamicListener::addConsumer(
399 const String& consumerName,
400 const String& location)
401 {
402 return static_cast<DynamicListenerRep*>(_rep)->addConsumer(
403 consumerName,
404 location);
|
405 h.sterling 1.1 }
406
407 Boolean DynamicListener::removeConsumer(const String& consumerName)
408 {
|
409 marek 1.7 return static_cast<DynamicListenerRep*>(_rep)->removeConsumer(
410 consumerName);
|
411 h.sterling 1.1 }
412
|
413 kumpf 1.10 Uint32 DynamicListener::getPortNumber()
|
414 h.sterling 1.1 {
415 return static_cast<DynamicListenerRep*>(_rep)->getPortNumber();
416 }
417
|
418 kumpf 1.10 String DynamicListener::getConsumerDir()
|
419 h.sterling 1.1 {
420 return static_cast<DynamicListenerRep*>(_rep)->getConsumerDir();
|
421 kumpf 1.10 }
|
422 h.sterling 1.1
|
423 kumpf 1.10 String DynamicListener::getConsumerConfigDir()
|
424 h.sterling 1.1 {
425 return static_cast<DynamicListenerRep*>(_rep)->getConsumerConfigDir();
|
426 kumpf 1.10 }
|
427 h.sterling 1.1
428 void DynamicListener::setEnableConsumerUnload(const Boolean consumerUnload)
429 {
|
430 marek 1.7 static_cast<DynamicListenerRep*>(_rep)->setEnableConsumerUnload(
431 consumerUnload);
|
432 h.sterling 1.1 }
433
434 Boolean DynamicListener::getEnableConsumerUnload()
435 {
436 return static_cast<DynamicListenerRep*>(_rep)->getEnableConsumerUnload();
437 }
438
|
439 kumpf 1.10 Uint32 DynamicListener::getIdleTimeout()
|
440 h.sterling 1.1 {
441 return static_cast<DynamicListenerRep*>(_rep)->getIdleTimeout();
442 }
443
|
444 gs.keenan 1.3 void DynamicListener::setIdleTimeout(Uint32 idleTimeout)
|
445 h.sterling 1.1 {
446 static_cast<DynamicListenerRep*>(_rep)->setIdleTimeout(idleTimeout);
447 }
448
449
450 PEGASUS_NAMESPACE_END
451
|