/* $Id: VBoxWatchdogInternal.h 76553 2019-01-01 01:45:53Z vboxsync $ */ /** @file * VBoxWatchdog - VirtualBox Watchdog Service. */ /* * Copyright (C) 2011-2019 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; * you can redistribute it and/or modify it under the terms of the GNU * General Public License (GPL) as published by the Free Software * Foundation, in version 2 as it comes in the "COPYING" file of the * VirtualBox OSE distribution. VirtualBox OSE is distributed in the * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. */ #ifndef ___H_VBOXWATCHDOG #define ___H_VBOXWATCHDOG #ifndef RT_WITHOUT_PRAGMA_ONCE # pragma once #endif #ifndef VBOX_ONLY_DOCS # include # include # include # include # include # include # include # include # include #endif /* !VBOX_ONLY_DOCS */ #include #include #include #include #include using namespace com; //////////////////////////////////////////////////////////////////////////////// // // definitions // //////////////////////////////////////////////////////////////////////////////// /** Command handler argument. */ struct HandlerArg { int argc; char **argv; }; /** * A module's payload for a machine entry. * The payload data is not (yet) thread safe -- so only * use this in one module at a time only! */ typedef struct VBOXWATCHDOG_MODULE_PAYLOAD { /** Pointer to allocated payload. Can be NULL if * a module doesn't have an own payload. */ void *pvData; /** Size of payload (in bytes). */ size_t cbData; /** @todo Add mutex for locking + getPayloadLocked(). */ } VBOXWATCHDOG_MODULE_PAYLOAD, *PVBOXWATCHDOG_MODULE_PAYLOAD; /** * Map containing a module's individual payload -- the module itself * is responsible for allocating/handling/destroying this payload. * Primary key is the module name. */ typedef std::map mapPayload; typedef std::map::iterator mapPayloadIter; typedef std::map::const_iterator mapPayloadIterConst; /** Group list (plus additional per-group flags, not used yet) for one VM. * Primary key is the group name, secondary specify flags (if any). */ typedef std::map mapGroups; typedef std::map::iterator mapGroupsIter; typedef std::map::const_iterator mapGroupsIterConst; /** A machine's internal entry. * Primary key is the machine's UUID. */ typedef struct VBOXWATCHDOG_MACHINE { ComPtr machine; /** The machine's name. For logging. */ Bstr strName; #ifndef VBOX_WATCHDOG_GLOBAL_PERFCOL ComPtr collector; #endif /** The group(s) this machine belongs to. */ mapGroups groups; /** Map containing the individual module payloads. */ mapPayload payload; } VBOXWATCHDOG_MACHINE, *PVBOXWATCHDOG_MACHINE; typedef std::map mapVM; typedef std::map::iterator mapVMIter; typedef std::map::const_iterator mapVMIterConst; /** Members of a VM group; currently only represented by the machine's UUID. * Primary key is the machine's UUID. */ typedef std::vector vecGroupMembers; typedef std::vector::iterator vecGroupMembersIter; typedef std::vector::const_iterator vecGroupMembersIterConst; /** A VM group. Can contain none, one or more group members. * Primary key is the group's name. */ typedef std::map mapGroup; typedef std::map::iterator mapGroupIter; typedef std::map::const_iterator mapGroupIterConst; /** * A module descriptor. */ typedef struct { /** The short module name. */ const char *pszName; /** The longer module name. */ const char *pszDescription; /** A comma-separated list of modules this module * depends on. Might be NULL if no dependencies. */ const char *pszDepends; /** Priority (lower is higher, 0 is invalid) of * module execution. */ uint32_t uPriority; /** The usage options stuff for the --help screen. */ const char *pszUsage; /** The option descriptions for the --help screen. */ const char *pszOptions; /** * Called before parsing arguments. * @returns VBox status code. */ DECLCALLBACKMEMBER(int, pfnPreInit)(void); /** * Tries to parse the given command line options. * * @returns 0 if we parsed, -1 if it didn't and anything else means exit. * @param argc Argument count. * @param argv Arguments. * @param piConsumed How many parameters this callback consumed from the * remaining arguments passed in. */ DECLCALLBACKMEMBER(int, pfnOption)(int argc, char *argv[], int *piConsumed); /** * Called before parsing arguments. * @returns VBox status code. */ DECLCALLBACKMEMBER(int, pfnInit)(void); /** Called from the watchdog's main function. Non-blocking. * * @returns VBox status code. */ DECLCALLBACKMEMBER(int, pfnMain)(void); /** * Stop the module. */ DECLCALLBACKMEMBER(int, pfnStop)(void); /** * Does termination cleanups. * * @remarks This may be called even if pfnInit hasn't been called! */ DECLCALLBACKMEMBER(void, pfnTerm)(void); /** @name Callbacks. * @{ */ /** * * @returns VBox status code. */ DECLCALLBACKMEMBER(int, pfnOnMachineRegistered)(const Bstr &strUuid); /** * * @returns VBox status code. */ DECLCALLBACKMEMBER(int, pfnOnMachineUnregistered)(const Bstr &strUuid); /** * * @returns VBox status code. */ DECLCALLBACKMEMBER(int, pfnOnMachineStateChanged)(const Bstr &strUuid, MachineState_T enmState); /** * * @returns VBox status code. */ DECLCALLBACKMEMBER(int, pfnOnServiceStateChanged)(bool fAvailable); /** @} */ } VBOXMODULE; /** Pointer to a VBOXMODULE. */ typedef VBOXMODULE *PVBOXMODULE; /** Pointer to a const VBOXMODULE. */ typedef VBOXMODULE const *PCVBOXMODULE; RT_C_DECLS_BEGIN extern bool g_fDryrun; extern bool g_fVerbose; extern ComPtr g_pVirtualBox; extern ComPtr g_pSession; extern mapVM g_mapVM; extern mapGroup g_mapGroup; # ifdef VBOX_WATCHDOG_GLOBAL_PERFCOL extern ComPtr g_pPerfCollector; # endif extern VBOXMODULE g_ModBallooning; extern VBOXMODULE g_ModAPIMonitor; extern void serviceLog(const char *pszFormat, ...); #define serviceLogVerbose(a) if (g_fVerbose) { serviceLog a; } int groupAdd(mapGroups &groups, const char *pszGroupsToAdd, uint32_t fFlags); extern int getMetric(PVBOXWATCHDOG_MACHINE pMachine, const Bstr& strName, LONG *pulData); void* payloadFrom(PVBOXWATCHDOG_MACHINE pMachine, const char *pszModule); int payloadAlloc(PVBOXWATCHDOG_MACHINE pMachine, const char *pszModule, size_t cbSize, void **ppszPayload); void payloadFree(PVBOXWATCHDOG_MACHINE pMachine, const char *pszModule); PVBOXWATCHDOG_MACHINE getMachine(const Bstr& strUuid); MachineState_T getMachineState(const PVBOXWATCHDOG_MACHINE pMachine); int cfgGetValueStr(const ComPtr &rptrVBox, const ComPtr &rptrMachine, const char *pszGlobal, const char *pszVM, Utf8Str &strValue, Utf8Str strDefault); int cfgGetValueU32(const ComPtr &rptrVBox, const ComPtr &rptrMachine, const char *pszGlobal, const char *pszVM, uint32_t *puValue, uint32_t uDefault); RT_C_DECLS_END #endif /* !___H_VBOXWATCHDOG */