virthttp  0.0
libvirt http interface
Network.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <cstdlib>
4 #include <memory>
5 #include <vector>
6 #include <libvirt/libvirt.h>
7 #include "../Connection.hpp"
8 #include "../Network.hpp"
9 #include "../utility.hpp"
10 
11 namespace virt {
12 
13 constexpr inline Network::Network(Network&& net) noexcept : underlying(net.underlying) { net.underlying = nullptr; }
14 
15 inline Network& Network::operator=(Network&& net) noexcept {
16  this->~Network();
17  underlying = net.underlying;
18  net.underlying = nullptr;
19  return *this;
20 }
21 
22 inline Network::~Network() noexcept {
23  if (*this)
24  virNetworkFree(underlying);
25 }
26 
27 [[nodiscard]] inline UniqueZstring Network::getBridgeName() const noexcept { return UniqueZstring(virNetworkGetBridgeName(underlying)); }
28 
29 [[nodiscard]] inline Connection Network::getConnect() const noexcept {
30  const auto res = virNetworkGetConnect(underlying);
31  if (res)
32  virConnectRef(res);
33  return Connection{res};
34 }
35 
36 [[nodiscard]] inline passive<const char*> Network::getName() const noexcept { return virNetworkGetName(underlying); }
37 
38 [[nodiscard]] inline std::string Network::extractName() const noexcept { return {getName()}; }
39 
40 [[nodiscard]] inline auto Network::getUUID() const noexcept {
41  std::array<unsigned char, VIR_UUID_BUFLEN> ret{};
42  return virNetworkGetUUID(underlying, ret.data()) == 0 ? std::optional(ret) : std::nullopt;
43 }
44 
45 [[nodiscard]] inline auto Network::getUUIDString() const noexcept -> std::optional<std::array<char, VIR_UUID_STRING_BUFLEN>> {
46  std::array<char, VIR_UUID_STRING_BUFLEN> ret{};
47  return virNetworkGetUUIDString(underlying, ret.data()) == 0 ? std::optional(ret) : std::nullopt;
48 }
49 
50 [[nodiscard]] inline auto Network::extractUUIDString() const -> std::string {
51  std::string ret{};
52  ret.resize(VIR_UUID_STRING_BUFLEN);
53  if (virNetworkGetUUIDString(underlying, ret.data()) != 0)
54  return {};
55  ret.resize(std::strlen(ret.data()));
56  ret.shrink_to_fit();
57  return ret;
58 }
59 
60 [[nodiscard]] inline UniqueZstring Network::getXMLDesc(enums::network::XMLFlags flags) const noexcept {
61  return UniqueZstring{virNetworkGetXMLDesc(underlying, to_integral(flags))};
62 }
63 
64 [[nodiscard]] inline std::string Network::extractXMLDesc(enums::network::XMLFlags flags) const noexcept {
65  const auto res = virNetworkGetXMLDesc(underlying, to_integral(flags));
66  const auto ret = std::string{res};
67  freeany(res);
68  return ret;
69 }
70 
71 [[nodiscard]] inline TFE Network::isActive() const noexcept { return TFE{virNetworkIsActive(underlying)}; }
72 
73 [[nodiscard]] inline TFE Network::isPersistent() const noexcept { return TFE{virNetworkIsPersistent(underlying)}; }
74 
75 [[nodiscard]] inline auto Network::getDHCPLeases(gsl::czstring<> mac) const noexcept {
76  using RetType = std::optional<std::unique_ptr<virNetworkDHCPLeasePtr[], void (*)(virNetworkDHCPLeasePtr*)>>;
77  virNetworkDHCPLeasePtr* lease_arr;
78  auto res = virNetworkGetDHCPLeases(underlying, mac, &lease_arr, 0);
79  if (res == -1)
80  return RetType{std::nullopt};
81  return std::optional{std::unique_ptr<virNetworkDHCPLeasePtr[], void (*)(virNetworkDHCPLeasePtr*)>(lease_arr, [](auto arr) {
82  auto it = arr;
83  while (it++)
84  virNetworkDHCPLeaseFree(*it);
85  freeany(arr);
86  })};
87 }
88 
89 [[nodiscard]] inline auto Network::extractDHCPLeases(gsl::czstring<> mac) const -> std::optional<std::vector<virNetworkDHCPLease>> {
90  virNetworkDHCPLeasePtr* lease_arr;
91  auto res = virNetworkGetDHCPLeases(underlying, mac, &lease_arr, 0);
92  if (res == -1)
93  return std::nullopt;
94  std::vector<virNetworkDHCPLease> ret{};
95  ret.reserve(res);
96  std::for_each(lease_arr, lease_arr + res, [&](virNetworkDHCPLeasePtr v) {
97  ret.push_back(*v);
98  virNetworkDHCPLeaseFree(v);
99  });
100  freeany(lease_arr);
101  return ret;
102 }
103 [[nodiscard]] inline auto Network::extractDHCPLeases(std::string mac) const -> std::optional<std::vector<virNetworkDHCPLease>> {
104  return extractDHCPLeases(mac.empty() ? nullptr : mac.c_str());
105 }
106 
107 inline bool Network::setAutostart(bool autostart) noexcept { return virNetworkSetAutostart(underlying, autostart) == 0; }
108 
109 [[nodiscard]] inline TFE Network::getAutostart() const noexcept {
110  int v;
111  const auto res = virNetworkGetAutostart(underlying, &v);
112  return TFE{res == 0 ? v : -1};
113 }
114 
115 inline bool Network::create() noexcept { return virNetworkCreate(underlying) == 0; }
116 
117 inline bool Network::destroy() noexcept { return virNetworkDestroy(underlying) == 0; }
118 
119 inline bool Network::undefine() noexcept { return virNetworkUndefine(underlying) == 0; }
120 
121 inline Network Network::createXML(Connection& conn, gsl::czstring<> xml) { return Network{virNetworkCreateXML(conn.underlying, xml)}; }
122 inline Network Network::defineXML(Connection& conn, gsl::czstring<> xml) { return Network{virNetworkDefineXML(conn.underlying, xml)}; }
123 
124 } // namespace virt
bool create() noexcept
Definition: Network.hpp:115
auto extractDHCPLeases(gsl::czstring<> mac) const -> std::optional< std::vector< virNetworkDHCPLease >>
Definition: Network.hpp:89
std::string extractName() const noexcept
Definition: Network.hpp:38
void freeany(T ptr)
Definition: utility.hpp:50
bool setAutostart(bool autostart) noexcept
Definition: Network.hpp:107
constexpr auto to_integral(E e) noexcept
Definition: Base.hpp:32
TFE getAutostart() const noexcept
Definition: Network.hpp:109
STL namespace.
Definition: Connection.hpp:47
T passive
Definition: utility.hpp:48
bool destroy() noexcept
Definition: Network.hpp:117
auto getDHCPLeases(gsl::czstring<> mac) const noexcept
Definition: Network.hpp:75
Connection getConnect() const noexcept
Definition: Network.hpp:29
passive< const char * > getName() const noexcept
Definition: Network.hpp:36
TFE isPersistent() const noexcept
Definition: Network.hpp:73
Definition: utility.hpp:122
~Network() noexcept
Definition: Network.hpp:22
static Network defineXML(Connection &conn, gsl::czstring<> xml)
Definition: Network.hpp:122
Definition: AdminConnection.hpp:11
Definition: Network.hpp:14
TFE isActive() const noexcept
Definition: Network.hpp:71
Network & operator=(const Network &)=delete
UniqueZstring getBridgeName() const noexcept
Definition: Network.hpp:27
constexpr Network() noexcept=default
std::string extractXMLDesc(enums::network::XMLFlags flags=enums::network::XMLFlags::DEFAULT) const noexcept
Definition: Network.hpp:64
auto getUUID() const noexcept
Definition: Network.hpp:40
UniqueZstring getXMLDesc(enums::network::XMLFlags flags=enums::network::XMLFlags::DEFAULT) const noexcept
Definition: Network.hpp:60
static Network createXML(Connection &conn, gsl::czstring<> xml)
Definition: Network.hpp:121
auto extractUUIDString() const -> std::string
Definition: Network.hpp:50
bool undefine() noexcept
Definition: Network.hpp:119
Definition: XMLFlags.hpp:8
auto getUUIDString() const noexcept-> std::optional< std::array< char, VIR_UUID_STRING_BUFLEN >>
Definition: Network.hpp:45
Definition: tfe.hpp:4