// -*-C++-*- // Copyright © 2011, 2012, 2014-2016 Richard Kettlewell. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef HOST_H #define HOST_H /** @file Host.h * @brief Configuration and state of a host */ #include "ConfBase.h" /** @brief Type of map from volume names to volumes * @see Host::volumes */ typedef std::map volumes_type; /** @brief Represents a host */ class Host: public ConfBase { public: /** @brief Constructor * @param parent_ Parent configuration * @param name_ Name of host */ Host(Conf *parent_, const std::string &name_): ConfBase(static_cast(parent_)), parent(parent_), name(name_), group(name_), hostname(name_) { parent->addHost(this); } /** @brief Destructor */ virtual ~Host(); /** @brief Parent configuration */ Conf *parent; /** @brief Name of host */ std::string name; /** @brief Host group name */ std::string group; /** @brief Volumes for this host */ volumes_type volumes; /** @brief Remote username */ std::string user; /** @brief Remote hostname */ std::string hostname; /** @brief True if host is expected to always be up */ bool alwaysUp = false; /** @brief Priority of this host */ int priority = 0; /** @brief Unrecognized volume names found in logs * * Set by Conf::readState(). */ std::set unknownVolumes; /** @brief Test whether host is selected * @return True if any volume for this host is selected */ bool selected() const; /** @brief (De-)select all volumes * @param sense True to select all volumes, false to deselect */ void select(bool sense); /** @brief Add a volume * @param v Pointer to new volume * * The volume name must not be in use. */ void addVolume(Volume *v); /** @brief Find a volume by name * @param volumeName Name of volume to find * @return Volume or null pointer */ Volume *findVolume(const std::string &volumeName) const; /** @brief SSH user+host string * @return String to pass to SSH client */ std::string userAndHost() const; /** @brief SSH prefix * @return Either "" or "user@host:" */ std::string sshPrefix() const; /** @brief Test if host available * @return true if host is available */ bool available() const; /** @brief Test whether a host name is valid * @param n Host name * @return true if @p n is a valid host name */ static bool valid(const std::string &n); /** @brief Invoke a command on the host and return its exit status * @param capture Where to put capture stdout, or null pointer * @param cmd Command to invoke * @param ... Arguments to command, terminatd by a null pointer * @return Exit status */ int invoke(std::string *capture, const char *cmd, ...) const; ConfBase *getParent() const override; std::string what() const override; void write(std::ostream &os, int step, bool verbose) const override; }; #endif /* HOST_H */