blob: 27a5dcf433889260ba2289c6d86b28a81021f818 [file] [log] [blame]
#ifndef LIVESTATUS_H
#define LIVESTATUS_H
#include <new>
#include <memory>
#include <cstdint>
#include <map_types.h>
// https://github.com/raltnoeder/cppdsaext
#include <dsaext.h>
#include <DrbdResource.h>
#include <DrbdConnection.h>
#include <DrbdVolume.h>
#include <VolumesContainer.h>
#include <StringTokenizer.h>
#include <GenericDisplay.h>
#include <EventsSourceSpawner.h>
#include <EventsIo.h>
#include <MessageLog.h>
#include <Configurable.h>
#include <Configurator.h>
#include <comparators.h>
class DrbdMon : public Configurable, public Configurator
{
public:
static const std::string PROGRAM_NAME;
static const std::string VERSION;
static const std::string TOKEN_DELIMITER;
static const std::string OPT_HELP_KEY;
static const std::string OPT_VERSION_KEY;
static const ConfigOption OPT_HELP;
static const ConfigOption OPT_VERSION;
static const std::string TYPE_RESOURCE;
static const std::string TYPE_CONNECTION;
static const std::string TYPE_DEVICE;
static const std::string TYPE_PEER_DEVICE;
static const std::string TYPE_SEPARATOR;
static const std::string MODE_EXISTS;
static const std::string MODE_CREATE;
static const std::string MODE_CHANGE;
static const std::string MODE_DESTROY;
static const char HOTKEY_QUIT;
static const char HOTKEY_REPAINT;
static const char HOTKEY_CLEAR_MSG;
static const char HOTKEY_REINIT;
static const char HOTKEY_VERSION;
static const std::string DESC_QUIT;
static const std::string DESC_REPAINT;
static const std::string DESC_CLEAR_MSG;
static const std::string DESC_REINIT;
static const size_t MAX_LINE_LENGTH {1024};
// DrbdMon' normal behavior is to update the display only after
// all events have been read and no more events are pending.
// If new event lines arrive faster than DrbdMon can read them,
// so that there are always events pending, do still update the
// display every MAX_EVENT_BUNDLE events
static const uint32_t MAX_EVENT_BUNDLE {911};
enum class fail_info : uint16_t
{
NONE,
GENERIC,
OUT_OF_MEMORY,
EVENTS_SOURCE,
EVENTS_IO
};
enum class finish_action : uint16_t
{
RESTART_IMMED,
RESTART_DELAYED,
TERMINATE,
TERMINATE_NO_CLEAR
};
// @throws std::bad_alloc
DrbdMon(
int argc,
char* argv[],
MessageLog& log_ref,
fail_info& fail_data_ref,
const std::string* const node_name_ref
);
DrbdMon(const DrbdMon& orig) = delete;
DrbdMon& operator=(const DrbdMon& orig) = delete;
DrbdMon(DrbdMon&& orig) = default;
DrbdMon& operator=(DrbdMon&& orig) = delete;
virtual ~DrbdMon() noexcept;
// @throws std::bad_alloc
virtual void run();
// @throws EventMessageException, EventObjectException
virtual void tokenize_event_message(std::string& event_line, PropsMap& event_props);
// @throws EventMessageException, EventObjectException
virtual void process_event_message(
std::string& mode,
std::string& type,
PropsMap& event_props
);
// Returns the action requested to be taken upon return from this class' run() method.
// This method should be called only after run() has returned.
virtual finish_action get_fin_action() const;
// @throws std::bad_alloc
virtual void add_config_option(Configurable& owner, const ConfigOption& option) override;
// @throws std::bad_alloc
virtual void announce_options(Configurator& collector) override;
virtual void options_help() noexcept override;
// @throws std::bad_alloc
virtual void set_flag(std::string& key) override;
// @throws std::bad_alloc
virtual void set_option(std::string& key, std::string& value) override;
private:
typedef struct option_entry_s
{
Configurable& owner;
const ConfigOption& option;
}
option_entry;
using OptionsMap = QTree<const std::string, DrbdMon::option_entry>;
const int arg_count;
char** const arg_values;
const std::unique_ptr<ResourcesMap> resources_map;
const std::unique_ptr<HotkeysMap> hotkeys_info;
std::unique_ptr<OptionsMap> options;
fail_info& fail_data;
finish_action fin_action {DrbdMon::finish_action::RESTART_IMMED};
MessageLog& log;
const std::string* const node_name;
bool shutdown {false};
bool have_initial_state {false};
std::unique_ptr<GenericDisplay> display {nullptr};
std::unique_ptr<Configurable*[]> configurables {nullptr};
// @throws std::bad_alloc, EventMessageException
void create_connection(PropsMap& event_props);
// @throws std::bad_alloc, EventMessageException
void create_device(PropsMap& event_props);
// @throws std::bad_alloc, EventMessageException
void create_peer_device(PropsMap& event_props);
// @throws std::bad_alloc, EventMessageException
void create_resource(PropsMap& event_props);
// @throws EventMessageException, EventObjectException
void update_connection(PropsMap& event_props);
// @throws EventMessageException, EventObjectException
void update_device(PropsMap& event_props);
// @throws EventMessageException, EventObjectException
void update_peer_device(PropsMap& event_props);
// @throws EventMessageException, EventObjectException
void update_resource(PropsMap& event_props);
// @throws EventMessageException
void destroy_connection(PropsMap& event_props);
// @throws EventMessageException
void destroy_device(PropsMap& event_props);
// @throws EventMessageException
void destroy_peer_device(PropsMap& event_props);
// @throws EventMessageException
void destroy_resource(PropsMap& event_props);
// @throws EventMessageException, EventObjectException
DrbdConnection& get_connection(DrbdResource& res, PropsMap& event_props);
// @throws EventMessageException, EventObjectException
DrbdVolume& get_device(VolumesContainer& vol_con, PropsMap& event_props);
// @throws EventMessageException, EventObjectException
DrbdResource& get_resource(PropsMap& event_props);
// Loads the event_props map with the properties contained in tokens
//
// @param: tokens StringTokenizer that returns the 'key:value' tokens from a 'drbdsetup event2' line
// @param: event_props Property map to load the key == value mappings into
// @throws std::bad_alloc
void parse_event_props(StringTokenizer& tokens, PropsMap& event_props);
// Clears the event_props map and frees all its entries
void clear_event_props(PropsMap& event_props);
// Sets up the hotkeys information map
// @throws std::bad_alloc
void setup_hotkeys_info();
// Configures options (command line arguments)
// configurables is a nullptr-terminated array of pointers to Configurable instances
// @throws std::bad_alloc
void configure_options();
// Frees the options map
void options_cleanup() noexcept;
// Frees resources
// @throws std::bad_alloc
void cleanup(
PropsMap* event_props,
EventsIo* events_io
);
};
#endif /* LIVESTATUS_H */