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 18 #ifndef MONITOR_USE_JSON 19 #include <CLI/CLI.hpp> 20 #endif 21 #include "fan.hpp" 22 #ifdef MONITOR_USE_JSON 23 #include "dbus_paths.hpp" 24 #include "json_config.hpp" 25 #include "json_parser.hpp" 26 #endif 27 #include "system.hpp" 28 #include "trust_manager.hpp" 29 30 #include <sdbusplus/bus.hpp> 31 #include <sdeventplus/event.hpp> 32 #include <sdeventplus/source/signal.hpp> 33 #include <stdplus/signal.hpp> 34 35 using namespace phosphor::fan::monitor; 36 37 int main([[maybe_unused]] int argc, [[maybe_unused]] char* argv[]) 38 { 39 auto event = sdeventplus::Event::get_default(); 40 auto bus = sdbusplus::bus::new_default(); 41 Mode mode = Mode::init; 42 43 #ifndef MONITOR_USE_JSON 44 CLI::App app{"Phosphor Fan Monitor"}; 45 46 bool init = false; 47 bool monitor = false; 48 app.add_flag("-i,--init", init, "Set fans to functional"); 49 app.add_flag("-m,--monitor", monitor, "Start fan functional monitoring"); 50 app.require_option(); 51 52 try 53 { 54 app.parse(argc, argv); 55 } 56 catch (const CLI::Error& e) 57 { 58 return app.exit(e); 59 } 60 61 if (init) 62 { 63 mode = Mode::init; 64 } 65 else if (monitor) 66 { 67 mode = Mode::monitor; 68 } 69 #endif 70 71 // Attach the event object to the bus object so we can 72 // handle both sd_events (for the timers) and dbus signals. 73 bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL); 74 75 System system(mode, bus, event); 76 77 #ifdef MONITOR_USE_JSON 78 79 phosphor::fan::JsonConfig config(std::bind(&System::start, &system)); 80 81 // Enable SIGHUP handling to reload JSON config 82 stdplus::signal::block(SIGHUP); 83 sdeventplus::source::Signal signal(event, SIGHUP, 84 std::bind(&System::sighupHandler, 85 &system, std::placeholders::_1, 86 std::placeholders::_2)); 87 88 // Enable SIGUSR1 handling to dump debug data 89 stdplus::signal::block(SIGUSR1); 90 sdeventplus::source::Signal sigUsr1( 91 event, SIGUSR1, 92 std::bind(&System::dumpDebugData, &system, std::placeholders::_1, 93 std::placeholders::_2)); 94 95 bus.request_name(THERMAL_ALERT_BUSNAME); 96 #else 97 system.start(); 98 99 if (mode == Mode::init) 100 { 101 // Fans were initialized to be functional, exit 102 return 0; 103 } 104 #endif 105 106 return event.loop(); 107 } 108