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 
19 namespace isc {
20 namespace hooks {
21 
22 // Forward declarations
23 class CalloutHandle;
24 class CalloutManager;
25 class LibraryHandle;
26 class LibraryManagerCollection;
27 
37 
38 class HooksManager : boost::noncopyable {
39 public:
43  static HooksManager& getHooksManager();
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 
322 private:
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) {
351  return (ServerHooks::getServerHooks().
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) {
363  return (ServerHooks::getServerHooks().
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 
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
static LibraryHandle & preCalloutsLibraryHandle()
Return pre-callouts library handle.
static const int CONTEXT_CREATE
Index numbers for pre-defined hooks.
Definition: server_hooks.h:66
static void unloadLibraries()
Unload libraries.
static ServerHooks & getServerHooks()
Return ServerHooks object.
static void callCallouts(int index, CalloutHandle &handle)
Calls the callouts for a given hook.
static int registerHook(const std::string &name)
Register Hook.
static void clearParkingLots()
Clears any parking packets.
static HookLibsCollection getLibraryInfo()
Return list of loaded libraries with its parameters.
static bool calloutsPresent(int index)
Are callouts present?
std::vector< HookLibInfo > HookLibsCollection
A storage for information about hook libraries.
Definition: libinfo.h:31
static void reference(const std::string &hook_name, T parked_object)
Increases reference counter for the parked object.
static const int CONTEXT_DESTROY
Per-packet callout handle.
static HooksManager & getHooksManager()
Get singleton hooks manager.
static bool loadLibraries(const HookLibsCollection &libraries)
Load and reload libraries.
static void park(const std::string &hook_name, T parked_object, std::function< void()> unpark_callback)
Park an object (packet).
static bool unpark(const std::string &hook_name, T parked_object)
Forces unparking the object (packet).
static void callCommandHandlers(const std::string &command_name, CalloutHandle &handle)
Calls the callouts/command handlers for a given command name.
static const int CONTEXT_DESTROY
Definition: server_hooks.h:67
Defines the logger used by the top-level component of kea-dhcp-ddns.
static boost::shared_ptr< CalloutManager > & getSharedCalloutManager()
Return the shared callout manager.
static const int CONTEXT_CREATE
Index numbers for pre-defined hooks.
static std::vector< std::string > validateLibraries(const std::vector< std::string > &libraries)
Validate library list.
static boost::shared_ptr< CalloutHandle > createCalloutHandle()
Return callout handle.
static std::vector< std::string > getLibraryNames()
Return list of loaded libraries.
static bool drop(const std::string &hook_name, T parked_object)
Removes parked object without calling a callback.
static LibraryHandle & postCalloutsLibraryHandle()
Return post-callouts library handle.
static bool commandHandlersPresent(const std::string &command_name)
Checks if control command handlers are present for the specified command.
ParkingLotsPtr getParkingLotsPtr() const
Returns pointer to all parking lots.