| #include "system_configuration.hpp" |
| |
| #include <phosphor-logging/elog-errors.hpp> |
| #include <phosphor-logging/lg2.hpp> |
| #include <stdplus/pinned.hpp> |
| #include <xyz/openbmc_project/Common/error.hpp> |
| |
| namespace phosphor |
| { |
| namespace network |
| { |
| |
| static constexpr char HOSTNAMED_SVC[] = "org.freedesktop.hostname1"; |
| static constexpr char HOSTNAMED_OBJ[] = "/org/freedesktop/hostname1"; |
| static constexpr char HOSTNAMED_INTF[] = "org.freedesktop.hostname1"; |
| |
| using namespace sdbusplus::xyz::openbmc_project::Common::Error; |
| |
| static constexpr char propMatch[] = |
| "type='signal',sender='org.freedesktop.hostname1'," |
| "path='/org/freedesktop/hostname1'," |
| "interface='org.freedesktop.DBus.Properties',member='PropertiesChanged'," |
| "arg0='org.freedesktop.hostname1'"; |
| |
| SystemConfiguration::SystemConfiguration( |
| stdplus::PinnedRef<sdbusplus::bus_t> bus, stdplus::const_zstring objPath) : |
| Iface(bus, objPath.c_str(), Iface::action::defer_emit), |
| bus(bus), hostnamePropMatch( |
| bus, propMatch, |
| [sc = stdplus::PinnedRef(*this)](sdbusplus::message_t& m) { |
| std::string intf; |
| std::unordered_map<std::string, std::variant<std::string>> values; |
| try |
| { |
| m.read(intf, values); |
| auto it = values.find("Hostname"); |
| if (it == values.end()) |
| { |
| return; |
| } |
| sc.get().Iface::hostName(std::get<std::string>(it->second)); |
| } |
| catch (const std::exception& e) |
| { |
| lg2::error("Hostname match parsing failed: {ERROR}", "ERROR", e); |
| } |
| }) |
| { |
| try |
| { |
| std::variant<std::string> name; |
| auto req = bus.get().new_method_call(HOSTNAMED_SVC, HOSTNAMED_OBJ, |
| "org.freedesktop.DBus.Properties", |
| "Get"); |
| |
| req.append(HOSTNAMED_INTF, "Hostname"); |
| auto reply = req.call(); |
| reply.read(name); |
| SystemConfigIntf::hostName(std::get<std::string>(name), true); |
| } |
| catch (const std::exception& e) |
| { |
| lg2::error("Failed to get hostname: {ERROR}", "ERROR", e); |
| } |
| |
| emit_object_added(); |
| } |
| |
| std::string SystemConfiguration::hostName(std::string name) |
| { |
| if (SystemConfigIntf::hostName() == name) |
| { |
| return name; |
| } |
| try |
| { |
| auto method = bus.get().new_method_call( |
| HOSTNAMED_SVC, HOSTNAMED_OBJ, HOSTNAMED_INTF, "SetStaticHostname"); |
| method.append(name, /*interactive=*/false); |
| bus.get().call_noreply(method); |
| return SystemConfigIntf::hostName(std::move(name)); |
| } |
| catch (const std::exception& e) |
| { |
| lg2::error("Failed to set hostname: {ERROR}", "ERROR", e); |
| } |
| return SystemConfigIntf::hostName(); |
| } |
| |
| } // namespace network |
| } // namespace phosphor |