11bbe3d1eSWilliam A. Kennington III #include "dhcp_configuration.hpp"
21bbe3d1eSWilliam A. Kennington III 
3e94c9ffcSWilliam A. Kennington III #include "config_parser.hpp"
41bbe3d1eSWilliam A. Kennington III #include "network_manager.hpp"
51bbe3d1eSWilliam A. Kennington III 
6180498c5SWilliam A. Kennington III #include <sys/stat.h>
7180498c5SWilliam A. Kennington III 
81bbe3d1eSWilliam A. Kennington III #include <phosphor-logging/elog-errors.hpp>
9a2947b4bSJagpal Singh Gill #include <phosphor-logging/lg2.hpp>
101bbe3d1eSWilliam A. Kennington III #include <xyz/openbmc_project/Common/error.hpp>
111bbe3d1eSWilliam A. Kennington III 
1289d734b9SPatrick Williams #include <filesystem>
1389d734b9SPatrick Williams 
141bbe3d1eSWilliam A. Kennington III namespace phosphor
151bbe3d1eSWilliam A. Kennington III {
161bbe3d1eSWilliam A. Kennington III namespace network
171bbe3d1eSWilliam A. Kennington III {
181bbe3d1eSWilliam A. Kennington III namespace dhcp
191bbe3d1eSWilliam A. Kennington III {
201bbe3d1eSWilliam A. Kennington III 
211bbe3d1eSWilliam A. Kennington III using namespace phosphor::network;
221bbe3d1eSWilliam A. Kennington III using namespace sdbusplus::xyz::openbmc_project::Common::Error;
23e94c9ffcSWilliam A. Kennington III 
24be3bd2fcSWilliam A. Kennington III Configuration::Configuration(sdbusplus::bus_t& bus,
259ede1b74SWilliam A. Kennington III                              stdplus::const_zstring objPath,
2657dfea94SJishnu CM                              stdplus::PinnedRef<EthernetInterface> parent,
2757dfea94SJishnu CM                              DHCPType type) :
28e94c9ffcSWilliam A. Kennington III     Iface(bus, objPath.c_str(), Iface::action::defer_emit),
29*f179e70cSWilliam A. Kennington III     parent(parent)
30e94c9ffcSWilliam A. Kennington III {
31e94c9ffcSWilliam A. Kennington III     config::Parser conf;
32180498c5SWilliam A. Kennington III     std::filesystem::directory_entry newest_file;
33180498c5SWilliam A. Kennington III     time_t newest_time = 0;
3457dfea94SJishnu CM     for (const auto& dirent : std::filesystem::directory_iterator(
3557dfea94SJishnu CM              parent.get().manager.get().getConfDir()))
36e94c9ffcSWilliam A. Kennington III     {
37180498c5SWilliam A. Kennington III         struct stat st = {};
38180498c5SWilliam A. Kennington III         stat(dirent.path().native().c_str(), &st);
39180498c5SWilliam A. Kennington III         if (st.st_mtime > newest_time)
40e94c9ffcSWilliam A. Kennington III         {
41180498c5SWilliam A. Kennington III             newest_file = dirent;
42180498c5SWilliam A. Kennington III             newest_time = st.st_mtime;
43e94c9ffcSWilliam A. Kennington III         }
44e94c9ffcSWilliam A. Kennington III     }
45180498c5SWilliam A. Kennington III     if (newest_file != std::filesystem::directory_entry{})
46180498c5SWilliam A. Kennington III     {
471d25ca4eSWilliam A. Kennington III         lg2::info("Using DHCP options from {CFG_FILE}", "CFG_FILE",
48a2947b4bSJagpal Singh Gill                   newest_file.path().native());
49180498c5SWilliam A. Kennington III         conf.setFile(newest_file.path());
50180498c5SWilliam A. Kennington III     }
51e94c9ffcSWilliam A. Kennington III 
52b6595b29SRavi Teja     ConfigIntf::domainEnabled(getDHCPProp(conf, type, "UseDomains"), true);
5357dfea94SJishnu CM     ConfigIntf::dnsEnabled(getDHCPProp(conf, type, "UseDNS"), true);
5457dfea94SJishnu CM     ConfigIntf::ntpEnabled(getDHCPProp(conf, type, "UseNTP"), true);
5557dfea94SJishnu CM     ConfigIntf::hostNameEnabled(getDHCPProp(conf, type, "UseHostname"), true);
5657dfea94SJishnu CM     if (type == DHCPType::v4)
5757dfea94SJishnu CM     {
5857dfea94SJishnu CM         ConfigIntf::sendHostNameEnabled(getDHCPProp(conf, type, "SendHostname"),
5957dfea94SJishnu CM                                         true);
6057dfea94SJishnu CM     }
6157dfea94SJishnu CM 
62e94c9ffcSWilliam A. Kennington III     emit_object_added();
63e94c9ffcSWilliam A. Kennington III }
64e94c9ffcSWilliam A. Kennington III 
651bbe3d1eSWilliam A. Kennington III bool Configuration::sendHostNameEnabled(bool value)
661bbe3d1eSWilliam A. Kennington III {
671bbe3d1eSWilliam A. Kennington III     if (value == sendHostNameEnabled())
681bbe3d1eSWilliam A. Kennington III     {
691bbe3d1eSWilliam A. Kennington III         return value;
701bbe3d1eSWilliam A. Kennington III     }
711bbe3d1eSWilliam A. Kennington III 
721bbe3d1eSWilliam A. Kennington III     auto name = ConfigIntf::sendHostNameEnabled(value);
7357dfea94SJishnu CM     parent.get().writeConfigurationFile();
7457dfea94SJishnu CM     parent.get().reloadConfigs();
751bbe3d1eSWilliam A. Kennington III     return name;
761bbe3d1eSWilliam A. Kennington III }
771bbe3d1eSWilliam A. Kennington III 
781bbe3d1eSWilliam A. Kennington III bool Configuration::hostNameEnabled(bool value)
791bbe3d1eSWilliam A. Kennington III {
801bbe3d1eSWilliam A. Kennington III     if (value == hostNameEnabled())
811bbe3d1eSWilliam A. Kennington III     {
821bbe3d1eSWilliam A. Kennington III         return value;
831bbe3d1eSWilliam A. Kennington III     }
841bbe3d1eSWilliam A. Kennington III 
851bbe3d1eSWilliam A. Kennington III     auto name = ConfigIntf::hostNameEnabled(value);
8657dfea94SJishnu CM     parent.get().writeConfigurationFile();
8757dfea94SJishnu CM     parent.get().reloadConfigs();
881bbe3d1eSWilliam A. Kennington III 
891bbe3d1eSWilliam A. Kennington III     return name;
901bbe3d1eSWilliam A. Kennington III }
911bbe3d1eSWilliam A. Kennington III 
921bbe3d1eSWilliam A. Kennington III bool Configuration::ntpEnabled(bool value)
931bbe3d1eSWilliam A. Kennington III {
941bbe3d1eSWilliam A. Kennington III     if (value == ntpEnabled())
951bbe3d1eSWilliam A. Kennington III     {
961bbe3d1eSWilliam A. Kennington III         return value;
971bbe3d1eSWilliam A. Kennington III     }
981bbe3d1eSWilliam A. Kennington III 
991bbe3d1eSWilliam A. Kennington III     auto ntp = ConfigIntf::ntpEnabled(value);
10057dfea94SJishnu CM     parent.get().writeConfigurationFile();
10157dfea94SJishnu CM     parent.get().reloadConfigs();
1021bbe3d1eSWilliam A. Kennington III 
1031bbe3d1eSWilliam A. Kennington III     return ntp;
1041bbe3d1eSWilliam A. Kennington III }
1051bbe3d1eSWilliam A. Kennington III 
1061bbe3d1eSWilliam A. Kennington III bool Configuration::dnsEnabled(bool value)
1071bbe3d1eSWilliam A. Kennington III {
1081bbe3d1eSWilliam A. Kennington III     if (value == dnsEnabled())
1091bbe3d1eSWilliam A. Kennington III     {
1101bbe3d1eSWilliam A. Kennington III         return value;
1111bbe3d1eSWilliam A. Kennington III     }
1121bbe3d1eSWilliam A. Kennington III 
1131bbe3d1eSWilliam A. Kennington III     auto dns = ConfigIntf::dnsEnabled(value);
11457dfea94SJishnu CM     parent.get().writeConfigurationFile();
11557dfea94SJishnu CM     parent.get().reloadConfigs();
1161bbe3d1eSWilliam A. Kennington III 
1171bbe3d1eSWilliam A. Kennington III     return dns;
1181bbe3d1eSWilliam A. Kennington III }
1191bbe3d1eSWilliam A. Kennington III 
120b6595b29SRavi Teja bool Configuration::domainEnabled(bool value)
121b6595b29SRavi Teja {
122b6595b29SRavi Teja     if (value == domainEnabled())
123b6595b29SRavi Teja     {
124b6595b29SRavi Teja         return value;
125b6595b29SRavi Teja     }
126b6595b29SRavi Teja 
127b6595b29SRavi Teja     auto domain = ConfigIntf::domainEnabled(value);
128b6595b29SRavi Teja     parent.get().writeConfigurationFile();
129b6595b29SRavi Teja     parent.get().reloadConfigs();
130b6595b29SRavi Teja 
131b6595b29SRavi Teja     return domain;
132b6595b29SRavi Teja }
133b6595b29SRavi Teja 
1341bbe3d1eSWilliam A. Kennington III } // namespace dhcp
1351bbe3d1eSWilliam A. Kennington III } // namespace network
1361bbe3d1eSWilliam A. Kennington III } // namespace phosphor
137