1 /** 2 * Copyright © 2017 IBM Corporation 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 #include "config.h" 17 #if defined(PRESENCE_JSON_FILE) || \ 18 (defined(PRESENCE_JSON_DBUS_INTF) && defined(PRESENCE_JSON_DBUS_PROP)) 19 #include "json_config.hpp" 20 #else 21 #include "generated.hpp" 22 #endif 23 #include "sdbusplus.hpp" 24 #include <sdeventplus/event.hpp> 25 #include <functional> 26 #include <stdplus/signal.hpp> 27 #include <sdeventplus/source/signal.hpp> 28 29 int main(void) 30 { 31 using namespace phosphor::fan; 32 33 auto bus = sdbusplus::bus::new_default(); 34 auto event = sdeventplus::Event::get_default(); 35 bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL); 36 37 #ifdef PRESENCE_JSON_FILE 38 // Use json file for presence config 39 presence::JsonConfig config(PRESENCE_JSON_FILE); 40 #elif defined(PRESENCE_JSON_DBUS_INTF) && defined(PRESENCE_JSON_DBUS_PROP) 41 // Use first object returned in the subtree 42 // (There should really only be one object with the config interface) 43 std::string jsonFile = ""; 44 auto objects = util::SDBusPlus::getSubTree( 45 bus, "/", PRESENCE_JSON_DBUS_INTF, 0); 46 auto itObj = objects.begin(); 47 if (itObj != objects.end()) 48 { 49 auto itServ = itObj->second.begin(); 50 if (itServ != itObj->second.end()) 51 { 52 // Retrieve json config file location from dbus 53 jsonFile = util::SDBusPlus::getProperty<std::string>( 54 bus, itServ->first, itObj->first, 55 PRESENCE_JSON_DBUS_INTF, PRESENCE_JSON_DBUS_PROP); 56 } 57 } 58 presence::JsonConfig config(jsonFile); 59 #endif 60 61 #if defined(PRESENCE_JSON_FILE) || \ 62 (defined(PRESENCE_JSON_DBUS_INTF) && defined(PRESENCE_JSON_DBUS_PROP)) 63 for (auto& p: presence::JsonConfig::get()) 64 { 65 p->monitor(); 66 } 67 68 stdplus::signal::block(SIGHUP); 69 sdeventplus::source::Signal signal(event, SIGHUP, 70 std::bind(&presence::JsonConfig::sighupHandler, 71 &config, std::placeholders::_1, std::placeholders::_2)); 72 #else 73 for (auto& p: presence::ConfigPolicy::get()) 74 { 75 p->monitor(); 76 } 77 #endif 78 79 return event.loop(); 80 } 81