Kea 1.5.0
hooks_manager.h
Go to the documentation of this file.
1// Copyright (C) 2013-2018 Internet Systems Consortium, Inc. ("ISC")
2//
3// This Source Code Form is subject to the terms of the Mozilla Public
4// License, v. 2.0. If a copy of the MPL was not distributed with this
5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
7#ifndef HOOKS_MANAGER_H
8#define HOOKS_MANAGER_H
9
10#include <hooks/server_hooks.h>
11#include <hooks/libinfo.h>
12
13#include <boost/noncopyable.hpp>
14#include <boost/shared_ptr.hpp>
15
16#include <string>
17#include <vector>
18
19namespace isc {
20namespace hooks {
21
22// Forward declarations
23class CalloutHandle;
24class CalloutManager;
25class LibraryHandle;
26class LibraryManagerCollection;
27
37
38class HooksManager : boost::noncopyable {
39public:
44
65 static bool loadLibraries(const HookLibsCollection& libraries);
66
80 static void unloadLibraries();
81
91 static bool calloutsPresent(int index);
92
102 static bool commandHandlersPresent(const std::string& command_name);
103
115 static void callCallouts(int index, CalloutHandle& handle);
116
130 static void callCommandHandlers(const std::string& command_name,
131 CalloutHandle& handle);
132
148
164
174 static boost::shared_ptr<CalloutHandle> createCalloutHandle();
175
192 static int registerHook(const std::string& name);
193
199 static std::vector<std::string> getLibraryNames();
200
207
222 static std::vector<std::string> validateLibraries(
223 const std::vector<std::string>& libraries);
224
228
235 static boost::shared_ptr<CalloutManager>& getSharedCalloutManager();
236
267 template<typename T>
268 static void park(const std::string& hook_name, T parked_object,
269 std::function<void()> unpark_callback) {
270 getHooksManager().parkInternal(hook_name, parked_object, unpark_callback);
271 }
272
283 template<typename T>
284 static bool unpark(const std::string& hook_name, T parked_object) {
285 return (getHooksManager().unparkInternal(hook_name, parked_object));
286 }
287
294 template<typename T>
295 static bool drop(const std::string& hook_name, T parked_object) {
296 return (getHooksManager().dropInternal(hook_name, parked_object));
297 }
298
308 template<typename T>
309 static void reference(const std::string& hook_name, T parked_object) {
310 getHooksManager().referenceInternal(hook_name, parked_object);
311 }
312
318 static void clearParkingLots() {
319 getHooksManager().clearParkingLotsInternal();
320 }
321
322private:
323
328 HooksManager();
329
336 template<typename T>
337 void parkInternal(const std::string& hook_name, T parked_object,
338 std::function<void()> unpark_callback) {
340 getParkingLotPtr(hook_name)->park(parked_object, unpark_callback);
341 }
342
349 template<typename T>
350 bool unparkInternal(const std::string& hook_name, T parked_object) {
352 getParkingLotPtr(hook_name)->unpark(parked_object, true));
353 }
354
361 template<typename T>
362 static bool dropInternal(const std::string& hook_name, T parked_object) {
364 getParkingLotPtr(hook_name)->drop(parked_object));
365 }
366
373 template<typename T>
374 void referenceInternal(const std::string& hook_name, T parked_object) {
376 getParkingLotPtr(hook_name)->reference(parked_object);
377 }
378
382 void clearParkingLotsInternal() {
384 }
385
387
390
399 std::string validateLibrariesInternal(
400 const std::vector<std::string>& libraries) const;
401
411 bool loadLibrariesInternal(const HookLibsCollection& libraries);
412
414 void unloadLibrariesInternal();
415
422 bool calloutsPresentInternal(int index);
423
433 bool commandHandlersPresentInternal(const std::string& command_name);
434
440 void callCalloutsInternal(int index, CalloutHandle& handle);
441
450 void callCommandHandlersInternal(const std::string& command_name,
451 CalloutHandle& handle);
452
456 boost::shared_ptr<CalloutHandle> createCalloutHandleInternal();
457
462 LibraryHandle& preCalloutsLibraryHandleInternal();
463
468 LibraryHandle& postCalloutsLibraryHandleInternal();
469
473 std::vector<std::string> getLibraryNamesInternal() const;
474
476 HookLibsCollection getLibraryInfoInternal() const;
477
479
485 void performConditionalInitialization();
486
500 void conditionallyInitialize() {
501 if (!lm_collection_) {
502 performConditionalInitialization();
503 }
504 }
505
506 // Members
507
509 boost::shared_ptr<LibraryManagerCollection> lm_collection_;
510
512 boost::shared_ptr<CalloutManager> callout_manager_;
513
515 boost::shared_ptr<CalloutManager> shared_callout_manager_;
516
517};
518
519} // namespace util
520} // namespace hooks
521
522#endif // HOOKS_MANAGER_H
Per-packet callout handle.
static void unloadLibraries()
Unload libraries.
static int registerHook(const std::string &name)
Register Hook.
static LibraryHandle & postCalloutsLibraryHandle()
Return post-callouts library handle.
static bool calloutsPresent(int index)
Are callouts present?
static bool unpark(const std::string &hook_name, T parked_object)
Forces unparking the object (packet).
static std::vector< std::string > getLibraryNames()
Return list of loaded libraries.
static void callCommandHandlers(const std::string &command_name, CalloutHandle &handle)
Calls the callouts/command handlers for a given command name.
static const int CONTEXT_CREATE
Index numbers for pre-defined hooks.
static boost::shared_ptr< CalloutManager > & getSharedCalloutManager()
Return the shared callout manager.
static bool loadLibraries(const HookLibsCollection &libraries)
Load and reload libraries.
static const int CONTEXT_DESTROY
static void park(const std::string &hook_name, T parked_object, std::function< void()> unpark_callback)
Park an object (packet).
static LibraryHandle & preCalloutsLibraryHandle()
Return pre-callouts library handle.
static bool commandHandlersPresent(const std::string &command_name)
Checks if control command handlers are present for the specified command.
static boost::shared_ptr< CalloutHandle > createCalloutHandle()
Return callout handle.
static void reference(const std::string &hook_name, T parked_object)
Increases reference counter for the parked object.
static void callCallouts(int index, CalloutHandle &handle)
Calls the callouts for a given hook.
static HookLibsCollection getLibraryInfo()
Return list of loaded libraries with its parameters.
static HooksManager & getHooksManager()
Get singleton hooks manager.
static bool drop(const std::string &hook_name, T parked_object)
Removes parked object without calling a callback.
static void clearParkingLots()
Clears any parking packets.
static std::vector< std::string > validateLibraries(const std::vector< std::string > &libraries)
Validate library list.
static ServerHooks & getServerHooks()
Return ServerHooks object.
static const int CONTEXT_DESTROY
Definition: server_hooks.h:67
ParkingLotsPtr getParkingLotsPtr() const
Returns pointer to all parking lots.
static const int CONTEXT_CREATE
Index numbers for pre-defined hooks.
Definition: server_hooks.h:66
std::vector< HookLibInfo > HookLibsCollection
A storage for information about hook libraries.
Definition: libinfo.h:31
Defines the logger used by the top-level component of kea-dhcp-ddns.