1/* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include "distributed_cfg.h" 17 18#include <iostream> 19#include <fstream> 20 21namespace OHOS { 22namespace DistributeSystemTest { 23using namespace std; 24using namespace OHOS::HiviewDFX; 25 26 27DistributedCfg::DistributedCfg() 28{ 29} 30 31DistributedCfg::~DistributedCfg() 32{ 33} 34 35bool DistributedCfg::OpenCfg(std::string fileName) 36{ 37 ifstream cfgFile; 38 size_t position = 0; 39 std::string strline; 40 41 cfgFile.open(fileName.c_str()); 42 if (!cfgFile.is_open()) { 43 return false; 44 } 45 46 std::string key; 47 std::string value; 48 while (getline(cfgFile, strline)) { 49 if (strline == "") { 50 continue; 51 } 52 position = strline.find(":"); 53 if (position == std::string::npos) { 54 continue; 55 } 56 key = strline.substr(0, position); 57 value = strline.substr(position + 1); 58 cfgMap_.insert(std::pair<std::string, std::string>(key, value)); 59 } 60 61 cfgFile.close(); 62 return true; 63} 64 65bool DistributedCfg::GetCfgVal(std::string key, std::string &value) 66{ 67 std::string iplist = ""; 68 std::map<std::string, std::string>::iterator cfgIterator; 69 cfgIterator = cfgMap_.find(key); 70 if (cfgIterator == cfgMap_.end()) { 71 return false; 72 } 73 value = cfgIterator->second; 74 return true; 75} 76 77std::string DistributedCfg::GetValueInString(std::string str, size_t devNo) 78{ 79 size_t pos = 0; 80 size_t posend = 0; 81 for (size_t i = 0; i < devNo; i++) { 82 posend = str.find(",", pos); 83 if (posend == std::string::npos) { 84 return ""; 85 } 86 pos = posend + 1; 87 } 88 std::string ipaddr; 89 posend = str.find(",", pos); 90 if (posend != std::string::npos) { 91 ipaddr = str.substr(pos, posend - pos); 92 } else { 93 ipaddr = ""; 94 } 95 return ipaddr; 96} 97 98std::string DistributedCfg::GetDeviceIp(std::string fileName, size_t devNo) 99{ 100 devNo--; 101 if (!OpenCfg(fileName)) { 102 HiLog::Error(DistributedCfg::LABEL, 103 "OpenCfg() failed! make sure the filename:%s of major or agent", 104 fileName.c_str()); 105 return ""; 106 } 107 std::string valueOfIps; 108 if (!GetCfgVal("agentlist", valueOfIps)) { 109 HiLog::Error(DistributedCfg::LABEL, 110 "GetCfgVal() failed! make sure the filename:%s of major or agent", 111 fileName.c_str()); 112 return ""; 113 } 114 std::string ip = GetValueInString(valueOfIps, devNo); 115 if (!ip.compare("")) { 116 HiLog::Error(DistributedCfg::LABEL, 117 "GetValueOfString() return ""! %zu maybe bigger than the sum of devices_online", 118 devNo + 1); 119 return ""; 120 } 121 HiLog::Info(DistributedCfg::LABEL, "get %zu device's ip : %s", devNo + 1, ip.c_str()); 122 return ip; 123} 124 125std::string DistributedCfg::GetDeviceUuid(std::string fileName, size_t devNo) 126{ 127 if (!OpenCfg(fileName)) { 128 HiLog::Error(DistributedCfg::LABEL, 129 "OpenCfg() failed! make sure the filename:%s of major or agent", 130 fileName.c_str()); 131 return ""; 132 } 133 std::string valueOfUuids; 134 if (!GetCfgVal("devicesuuid", valueOfUuids)) { 135 HiLog::Error(DistributedCfg::LABEL, 136 "GetCfgVal() failed! make sure the filename:%s of major or agent", 137 fileName.c_str()); 138 return ""; 139 } 140 std::string uuid = GetValueInString(valueOfUuids, devNo); 141 if (!uuid.compare("")) { 142 printf("device:%zu uuid is null \n", devNo); 143 HiLog::Error(DistributedCfg::LABEL, 144 "GetValueOfString() return ""! %zu maybe bigger than the sum of devices_online", 145 devNo); 146 return ""; 147 } 148 HiLog::Info(DistributedCfg::LABEL, "get %zu device's uuid : %s", devNo, uuid.c_str()); 149 return uuid; 150} 151 152std::unique_ptr<DistributedCfg>& DistributedCfg::GetInstance() 153{ 154 if (DistributedCfg::getCfg_ == nullptr) { 155 DistributedCfg::getCfg_ = std::make_unique<DistributedCfg>(); 156 } 157 return DistributedCfg::getCfg_; 158} 159 160std::unique_ptr<DistributedCfg> DistributedCfg::getCfg_ = nullptr; 161} // namespace DistributeSystemTest 162} // namespace OHOS 163