1 /** 2 * Copyright © 2019 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 #include "updater.hpp" 19 #include "version.hpp" 20 21 #include <CLI/CLI.hpp> 22 #include <phosphor-logging/log.hpp> 23 #include <sdbusplus/bus.hpp> 24 25 #include <cassert> 26 #include <filesystem> 27 28 using namespace phosphor::logging; 29 30 int main(int argc, char** argv) 31 { 32 std::string psuPath; 33 std::vector<std::string> versions; 34 bool rawOutput = false; 35 std::vector<std::string> updateArguments; 36 37 CLI::App app{"PSU utils app for OpenBMC"}; 38 auto action = app.add_option_group("Action"); 39 action->add_option("-g,--get-version", psuPath, 40 "Get PSU version from inventory path"); 41 action->add_option("-c,--compare", versions, 42 "Compare and get the latest version"); 43 action 44 ->add_option("-u,--update", updateArguments, 45 "Update PSU firmware, expecting two arguments: " 46 "<PSU inventory path> <image-dir>") 47 ->expected(2); 48 action->require_option(1); // Only one option is supported 49 app.add_flag("--raw", rawOutput, "Output raw text without linefeed"); 50 CLI11_PARSE(app, argc, argv); 51 52 std::string ret; 53 54 bool useJsonFile = version::utils::checkFileExists(PSU_JSON_PATH); 55 auto bus = sdbusplus::bus::new_default(); 56 if (!psuPath.empty()) 57 { 58 if (!useJsonFile) 59 { 60 ret = version::getVersion(bus, psuPath); 61 } 62 else 63 { 64 ret = version::getVersion(psuPath); 65 } 66 } 67 if (!versions.empty()) 68 { 69 ret = version::getLatest(versions); 70 } 71 if (!updateArguments.empty()) 72 { 73 assert(updateArguments.size() == 2); 74 if (updater::update(updateArguments[0], updateArguments[1])) 75 { 76 ret = "Update successful"; 77 } 78 } 79 80 printf("%s", ret.c_str()); 81 if (!rawOutput) 82 { 83 printf("\n"); 84 } 85 return ret.empty() ? 1 : 0; 86 } 87