Distribution_Service/Server/Configuration/Config.cpp

177 lines
6.1 KiB
C++
Raw Normal View History

2025-11-11 18:09:51 +08:00
#include "Config.h"
2025-12-03 18:08:23 +08:00
#include "BS_Log.h"
#include "CCFIleInStream.h"
#include "CCFileOutStream.h"
2025-12-05 16:46:23 +08:00
#include "CCProcess.h"
#include "ConnectionService.h"
#include "NetInfo/NetWork.h"
#include "PortService/ByteTool.h"
2025-12-03 18:08:23 +08:00
void Config::Save() {
const auto Setting = getConfig();
try {
const CTL::JSONObject Json = *Setting;
const auto Path = GetSettingDB();
CTL::FileOutStream::WriteFile(Path,Json.to_String());
}
catch (CCException& e) {
BS_Log::Error("Config::Save Error: {}",e.what());
}
}
void Config::Init() {
const auto Setting = getConfig();
try {
const auto Path = GetSettingDB();
const CCFile file(Path);
if (file.isExists()) {
const auto str = CTL::FileInputStream::ReadFileDataAll(Path);
CTL::JSONObject Json = CTL::JSONObject::parse(str);
Setting->IP = Json["IP"];
Setting->OrderPort = Json["OrderPort"];
Setting->StreamPort = Json["StreamPort"];
Setting->HttpPort = Json["HttpPort"];
Setting->Flag = Json["Flag"];
Setting->ServerID = Json["ServerID"];
Setting->ServerIP = Json["ServerIP"];
Setting->ServerPort = Json["ServerPort"];
Setting->ID = Json["ID"];
Setting->Name = Json["Name"];
}
}
catch (CCException& e) {
BS_Log::Error("Config::Init Error: {}",e.what());
}
Setting->IP = GetIP();
2025-12-04 18:12:54 +08:00
BS_Log::Log("Local IP: {}",Setting->IP.c_str());
2025-12-05 16:46:23 +08:00
BS_Log::Log("Local ID: {}",Setting->ID);
2025-12-03 18:08:23 +08:00
}
2025-11-11 18:09:51 +08:00
Config * Config::getConfig() {
static Config config;
return &config;
}
bool Config::IsRunning() {
return getConfig()->Flag;
}
2025-12-03 18:08:23 +08:00
CTL::String Config::GetIP() {
const auto Setting = Config::getConfig();
2025-12-05 16:46:23 +08:00
try {
Setting->MacAddr = CTL::System::GetMac();
Setting->TermIPGw = NetWorkInfo::getGw();
Setting->TermIPNm = NetWorkInfo::getNm();
}
catch (...){}
2025-12-03 18:08:23 +08:00
const auto List = CTL::Socket::GetLocalIP(Setting->IP_x);
CCVector<CTL::String> IPList;
for (const auto IP : List) {
if (IP != "127.0.0.1") {
IPList.push_back(IP);
}
if (IP == Setting->IP) {
return IP;
}
}
return IPList.empty() ? "127.0.0.1" : IPList[0];
}
2025-12-05 16:46:23 +08:00
ConfigTerm * Config::getThisInfo() {
const auto Setting = getConfig();
const auto Data = new ConfigTerm;
std::strcpy(Data->termIDnVerStr,Setting->Ver.c_str());
std::strcpy(Data->macStr,Setting->MacAddr.c_str());
std::strcpy(Data->macChkStr,Setting->MacAddr.c_str());
std::strcpy(Data->servIPAddrStr,Setting->ServerIP.c_str());
std::strcpy(Data->termIPAddrStr,Setting->IP.c_str());
std::strcpy(Data->termIPGwStr,Setting->TermIPGw.c_str());
std::strcpy(Data->termIPNmStr,Setting->TermIPNm.c_str());
std::strcpy(Data->termCmdPortStr,CC::to_String(Setting->OrderPort).c_str());
std::strcpy(Data->servCmdPortStr,CC::to_String(Setting->ServerPort).c_str());
std::strcpy(Data->termStmPortStr,CC::to_String(Setting->StreamPort).c_str());
std::strcpy(Data->workModeStr,"");
std::strcpy(Data->btNameStr,"");
std::strcpy(Data->dhcpFlagStr,CC::to_String(1).c_str());
std::strcpy(Data->btPwdStr,"");
std::strcpy(Data->termTypeStr,CC::to_String(1).c_str());
std::strcpy(Data->sipUsrNameStr,"");
std::strcpy(Data->sipUsrPwdStr,"");
std::strcpy(Data->sipProxyRealmStr,"");
std::strcpy(Data->cmdFlagByteStr,CC::to_String("").c_str());
std::strcpy(Data->onlineFlagStr,CC::to_String(Setting->isConnect).c_str());
return Data;
}
void Config::groupBroadcast(const CTL::ByteArray &data, int port) {
std::shared_lock lock(m_mutex_udp_tool);
const auto Setting = getConfig();
if (Setting->m_socket_udp_tool) {
CTL::DatagramPacket packet;
packet.setPort(port);
packet.setData(data);
Setting->m_socket_udp_tool->broadcast(packet);
}
}
void Config::SetNetWorkInfo(const CTL::String& IP,const CTL::String& GW,const CTL::String& Mask) {
try{
//获取当前网络名称
CTL::String GetNetName = ("nmcli -t -f NAME,TYPE,DEVICE,STATE con show --active");
CTL::Process Process;
Process.Command(GetNetName);
Process.Start();
auto NetName = Process.ReadLineBuffer().toString();
NetName = CTL::String(NetName.substr(0,NetName.find(":")).c_str());
BS_Log::Log("[fun-configure|MainConfigure] NetName: %s",NetName.c_str());
Process.Stop();
//设置为手动
CTL::String SetManual = ("sudo nmcli con modify '" + NetName + "' ipv4.method manual");
CTL::System::Execute(SetManual);
//设置IP与子网掩码
CTL::String SetIP = ("sudo nmcli con modify '" + NetName + "' ipv4.addresses " + IP +"/" + GetNetMaskCIDR(Mask));
CTL::System::Execute(SetIP);
//设置默认网关
CTL::String SetGateway = ("sudo nmcli con modify '" + NetName + "' ipv4.gateway " + GW);
CTL::System::Execute(SetGateway);
//重启网络
CTL::String NetDown = ("sudo nmcli con down '" + NetName + "'");
CTL::System::Execute(NetDown);
CTL::String NetUp = ("sudo nmcli con up '" + NetName + "'");
CTL::System::Execute(NetUp);
}
catch (CCException& e){
BS_Log::Error("[fun-configure|MainConfigure] NetInit Error: {}",e.what());
}
}
void Config::CloseService() {
const auto Setting = getConfig();
const auto sock = ConnectionService::getSocket();
const auto IDS = APPTool::GetBytes(Setting->ID);
sock->SendBinary({0x66,0xAB,0xA1,0x00,IDS[0],IDS[1],0x01,0x00});
CTL::Thread::SleepMS(500);
sock->Stop();
}
CTL::String Config::GetNetMaskCIDR(const CTL::String& Mask) {
std::vector<int> octets;
std::stringstream ss(Mask);
std::string segment;
while (std::getline(ss, segment, '.')){
octets.push_back(std::stoi(segment));
}
// 转换每个八位组为二进制并计算连续的 1 的数量
int cidr = 0;
for (int octet : octets){
while (octet > 0){
cidr += (octet & 1); // 统计每一位是否为 1
octet >>= 1;
}
}
CTL::String cidr_str = CTL::String::format("%d",cidr);
return cidr_str;
}