初始化添加pqdif判断,新增pqdif进程
This commit is contained in:
@@ -156,6 +156,7 @@ public:
|
|||||||
char dev_type[64];
|
char dev_type[64];
|
||||||
char dev_key[255];
|
char dev_key[255];
|
||||||
char dev_series[255];
|
char dev_series[255];
|
||||||
|
char com_type[32];
|
||||||
char addr_str[64];
|
char addr_str[64];
|
||||||
char port[64];
|
char port[64];
|
||||||
char timestamp[64];
|
char timestamp[64];
|
||||||
@@ -859,7 +860,10 @@ void init_config() {
|
|||||||
}
|
}
|
||||||
else if (g_node_id == SOE_COMTRADE_BASE_NODE_ID) {//暂态录波
|
else if (g_node_id == SOE_COMTRADE_BASE_NODE_ID) {//暂态录波
|
||||||
TEST_PORT = TEST_PORT + SOE_COMTRADE_BASE_NODE_ID + g_front_seg_index;
|
TEST_PORT = TEST_PORT + SOE_COMTRADE_BASE_NODE_ID + g_front_seg_index;
|
||||||
}
|
}
|
||||||
|
else if (g_node_id == PQDIF_DATA_BASE_NODE_ID) {
|
||||||
|
TEST_PORT = TEST_PORT + PQDIF_DATA_BASE_NODE_ID + g_front_seg_index;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3388,6 +3392,31 @@ void SendJsonAPI_web(const std::string& strUrl, const char* code, const std::str
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 打印 terminal_dev_map 中所有内容的函数
|
// 打印 terminal_dev_map 中所有内容的函数
|
||||||
|
static bool is_cfg_pqdif_process()
|
||||||
|
{
|
||||||
|
return std::strstr(subdir, "cfg_pqdif_data") != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool is_pqdif_com_type(const char* com_type)
|
||||||
|
{
|
||||||
|
QString type = com_type ? QString::fromLocal8Bit(com_type).trimmed() : QString();
|
||||||
|
return type.compare("pqdif", Qt::CaseInsensitive) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool terminal_should_bind_to_current_process(const terminal_dev* dev)
|
||||||
|
{
|
||||||
|
if (dev == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (is_pqdif_com_type(dev->com_type))
|
||||||
|
return is_cfg_pqdif_process();
|
||||||
|
|
||||||
|
if (is_cfg_pqdif_process())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return (atoi(dev->processNo) == g_front_seg_index || g_front_seg_index == 0);
|
||||||
|
}
|
||||||
|
|
||||||
void printTerminalDevMap(const QMap<QString, terminal_dev*>& terminal_dev_map) {
|
void printTerminalDevMap(const QMap<QString, terminal_dev*>& terminal_dev_map) {
|
||||||
QMap<QString, terminal_dev*>::const_iterator it;
|
QMap<QString, terminal_dev*>::const_iterator it;
|
||||||
for (it = terminal_dev_map.constBegin(); it != terminal_dev_map.constEnd(); ++it) {
|
for (it = terminal_dev_map.constBegin(); it != terminal_dev_map.constEnd(); ++it) {
|
||||||
@@ -3406,6 +3435,7 @@ void printTerminalDevMap(const QMap<QString, terminal_dev*>& terminal_dev_map) {
|
|||||||
<< ", Device Type:" << QString(dev->dev_type)
|
<< ", Device Type:" << QString(dev->dev_type)
|
||||||
<< ", Device Key:" << QString(dev->dev_key)
|
<< ", Device Key:" << QString(dev->dev_key)
|
||||||
<< ", Device Series:" << QString(dev->dev_series)
|
<< ", Device Series:" << QString(dev->dev_series)
|
||||||
|
<< ", Device comType:" << QString(dev->com_type)
|
||||||
<< ", Device processNo:" << QString(dev->processNo)
|
<< ", Device processNo:" << QString(dev->processNo)
|
||||||
<< ", Device maxProcessNum:" << QString(dev->maxProcessNum)
|
<< ", Device maxProcessNum:" << QString(dev->maxProcessNum)
|
||||||
<< ", Address:" << QString(dev->addr_str)
|
<< ", Address:" << QString(dev->addr_str)
|
||||||
@@ -4085,6 +4115,13 @@ int terminal_ledger_web(QMap<QString, terminal_dev*>* terminal_dev_map,
|
|||||||
else strncpy(dev->dev_series, "N/A", sizeof(dev->dev_series) - 1);
|
else strncpy(dev->dev_series, "N/A", sizeof(dev->dev_series) - 1);
|
||||||
dev->dev_series[sizeof(dev->dev_series) - 1] = '\0';
|
dev->dev_series[sizeof(dev->dev_series) - 1] = '\0';
|
||||||
|
|
||||||
|
cJSON* comType = cJSON_GetObjectItem(item, "comType");
|
||||||
|
if (comType == NULL)
|
||||||
|
comType = cJSON_GetObjectItem(item, "com_type");
|
||||||
|
if (comType && comType->type == cJSON_String) strncpy(dev->com_type, comType->valuestring, sizeof(dev->com_type) - 1);
|
||||||
|
else strncpy(dev->com_type, "mms", sizeof(dev->com_type) - 1);
|
||||||
|
dev->com_type[sizeof(dev->com_type) - 1] = '\0';
|
||||||
|
|
||||||
//lnk20250210台账进程号
|
//lnk20250210台账进程号
|
||||||
cJSON* processNo = cJSON_GetObjectItem(item, "processNo"); // processNo转为字符串
|
cJSON* processNo = cJSON_GetObjectItem(item, "processNo"); // processNo转为字符串
|
||||||
if (processNo && processNo->type == cJSON_Number) snprintf(dev->processNo, sizeof(dev->processNo), "%d", processNo->valueint);
|
if (processNo && processNo->type == cJSON_Number) snprintf(dev->processNo, sizeof(dev->processNo), "%d", processNo->valueint);
|
||||||
@@ -4190,19 +4227,20 @@ int terminal_ledger_web(QMap<QString, terminal_dev*>* terminal_dev_map,
|
|||||||
|
|
||||||
//lnk20260312防止内存泄漏
|
//lnk20260312防止内存泄漏
|
||||||
bool inserted = false;
|
bool inserted = false;
|
||||||
|
bool should_bind = terminal_should_bind_to_current_process(dev);
|
||||||
|
|
||||||
// 检查是否存在重复键
|
// 检查是否存在重复键
|
||||||
if (terminal_dev_map->contains(key)) {
|
if (terminal_dev_map->contains(key)) {
|
||||||
std::cerr << "Duplicate terminal_code found: " << key.toStdString() << std::endl;
|
std::cerr << "Duplicate terminal_code found: " << key.toStdString() << std::endl;
|
||||||
|
|
||||||
// 删除旧的 terminal_dev 对象以避免内存泄漏
|
// 删除旧的 terminal_dev 对象以避免内存泄漏
|
||||||
delete terminal_dev_map->value(key);
|
if (should_bind) delete terminal_dev_map->value(key);
|
||||||
|
|
||||||
// 移除旧的键值对
|
// 移除旧的键值对
|
||||||
terminal_dev_map->remove(key);
|
if (should_bind) terminal_dev_map->remove(key);
|
||||||
|
|
||||||
// 插入新的 terminal_dev 对象
|
// 插入新的 terminal_dev 对象
|
||||||
if(atoi(dev->processNo) == g_front_seg_index || g_front_seg_index == 0){//lnk20250210匹配进程号
|
if(should_bind){//lnk20250210匹配进程号
|
||||||
//调试用
|
//调试用
|
||||||
std::cout<< "process num match" << std::endl;
|
std::cout<< "process num match" << std::endl;
|
||||||
terminal_dev_map->insert(key, dev);
|
terminal_dev_map->insert(key, dev);
|
||||||
@@ -4210,7 +4248,7 @@ int terminal_ledger_web(QMap<QString, terminal_dev*>* terminal_dev_map,
|
|||||||
}//后续修改为只有进程号匹配上index才录入当前进程
|
}//后续修改为只有进程号匹配上index才录入当前进程
|
||||||
} else {
|
} else {
|
||||||
// 插入新的 terminal_dev 对象
|
// 插入新的 terminal_dev 对象
|
||||||
if(atoi(dev->processNo) == g_front_seg_index || g_front_seg_index == 0){//lnk20250210匹配进程号
|
if(should_bind){//lnk20250210匹配进程号
|
||||||
//调试用
|
//调试用
|
||||||
std::cout<< "process num match" << std::endl;
|
std::cout<< "process num match" << std::endl;
|
||||||
terminal_dev_map->insert(key, dev);
|
terminal_dev_map->insert(key, dev);
|
||||||
@@ -7290,6 +7328,8 @@ const char* get_front_msg_from_subdir() {
|
|||||||
return "实时数据进程";
|
return "实时数据进程";
|
||||||
else if (std::strstr(subdir, "cfg_soe_comtrade") != NULL)
|
else if (std::strstr(subdir, "cfg_soe_comtrade") != NULL)
|
||||||
return "暂态和告警进程";
|
return "暂态和告警进程";
|
||||||
|
else if (std::strstr(subdir, "cfg_pqdif_data") != NULL)
|
||||||
|
return "pqdif处理进程";
|
||||||
else if (std::strstr(subdir, "cfg_recallhis_data") != NULL)
|
else if (std::strstr(subdir, "cfg_recallhis_data") != NULL)
|
||||||
return "稳态补招进程";
|
return "稳态补招进程";
|
||||||
else if (std::strstr(subdir, "cfg_stat_data") != NULL)
|
else if (std::strstr(subdir, "cfg_stat_data") != NULL)
|
||||||
@@ -7511,4 +7551,4 @@ void read_latest_ledger_file(char** out) {
|
|||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -229,6 +229,8 @@ std::string get_front_type_from_subdir() {
|
|||||||
return "realTime";
|
return "realTime";
|
||||||
else if (std::strstr(subdir, "cfg_soe_comtrade") != NULL)
|
else if (std::strstr(subdir, "cfg_soe_comtrade") != NULL)
|
||||||
return "comtrade";
|
return "comtrade";
|
||||||
|
else if (std::strstr(subdir, "cfg_pqdif_data") != NULL)
|
||||||
|
return "pqdif";
|
||||||
else if (std::strstr(subdir, "cfg_recallhis_data") != NULL)
|
else if (std::strstr(subdir, "cfg_recallhis_data") != NULL)
|
||||||
return "recall";
|
return "recall";
|
||||||
else if (std::strstr(subdir, "cfg_stat_data") != NULL)
|
else if (std::strstr(subdir, "cfg_stat_data") != NULL)
|
||||||
@@ -869,4 +871,4 @@ int main() {
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
#define THREE_SECS_DATA_BASE_NODE_ID 200 // 三秒数据、实时数据
|
#define THREE_SECS_DATA_BASE_NODE_ID 200 // 三秒数据、实时数据
|
||||||
#define SOE_COMTRADE_BASE_NODE_ID 300 // soe 录波
|
#define SOE_COMTRADE_BASE_NODE_ID 300 // soe 录波
|
||||||
#define HIS_DATA_BASE_NODE_ID 400 //历史、补招
|
#define HIS_DATA_BASE_NODE_ID 400 //历史、补招
|
||||||
|
#define PQDIF_DATA_BASE_NODE_ID 800 // pqdif数据
|
||||||
|
|
||||||
class json_block_data //json拼接参数类
|
class json_block_data //json拼接参数类
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -271,6 +271,8 @@ void add_comm_log(char* log_str)
|
|||||||
com_log_fn += "comm_300_comtrade.txt";
|
com_log_fn += "comm_300_comtrade.txt";
|
||||||
else if (g_node_id == HIS_DATA_BASE_NODE_ID)
|
else if (g_node_id == HIS_DATA_BASE_NODE_ID)
|
||||||
com_log_fn += "comm_400_his.txt";
|
com_log_fn += "comm_400_his.txt";
|
||||||
|
else if (g_node_id == PQDIF_DATA_BASE_NODE_ID)
|
||||||
|
com_log_fn += "comm_800_pqdif.txt";
|
||||||
else if (g_node_id == NEW_HIS_DATA_BASE_NODE_ID) {
|
else if (g_node_id == NEW_HIS_DATA_BASE_NODE_ID) {
|
||||||
com_log_fn.append(QString("comm_400_his_%1.txt").arg(g_front_seg_index));
|
com_log_fn.append(QString("comm_400_his_%1.txt").arg(g_front_seg_index));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
#define NEW_HIS_DATA_BASE_NODE_ID 500
|
#define NEW_HIS_DATA_BASE_NODE_ID 500
|
||||||
#define RECALL_HIS_DATA_BASE_NODE_ID 600
|
#define RECALL_HIS_DATA_BASE_NODE_ID 600
|
||||||
#define RECALL_ALL_DATA_BASE_NODE_ID 700
|
#define RECALL_ALL_DATA_BASE_NODE_ID 700
|
||||||
|
#define PQDIF_DATA_BASE_NODE_ID 800
|
||||||
|
|
||||||
#define REPORT_TYPE_STAT 1
|
#define REPORT_TYPE_STAT 1
|
||||||
#define REPORT_TYPE_REAL 2
|
#define REPORT_TYPE_REAL 2
|
||||||
|
|||||||
@@ -81,6 +81,8 @@ void init_global_function_enable()
|
|||||||
three_secs_enabled = 1;
|
three_secs_enabled = 1;
|
||||||
}else if (strcmp(subdir,"cfg_soe_comtrade")==0) { //告警和录波和暂态
|
}else if (strcmp(subdir,"cfg_soe_comtrade")==0) { //告警和录波和暂态
|
||||||
g_node_id = SOE_COMTRADE_BASE_NODE_ID;
|
g_node_id = SOE_COMTRADE_BASE_NODE_ID;
|
||||||
|
}else if (strcmp(subdir,"cfg_pqdif_data")==0) {
|
||||||
|
g_node_id = PQDIF_DATA_BASE_NODE_ID;
|
||||||
}else if (strcmp(subdir,"cfg_his_data")==0) { //不使用
|
}else if (strcmp(subdir,"cfg_his_data")==0) { //不使用
|
||||||
g_node_id = RECALL_ALL_DATA_BASE_NODE_ID;
|
g_node_id = RECALL_ALL_DATA_BASE_NODE_ID;
|
||||||
g_node_id = HIS_DATA_BASE_NODE_ID;
|
g_node_id = HIS_DATA_BASE_NODE_ID;
|
||||||
|
|||||||
@@ -1634,12 +1634,18 @@ void CheckAllConnectedChannel()
|
|||||||
if(DEBUGOPEN)printf("[FILEDIR] enter HandleFileDirReqForChannel");
|
if(DEBUGOPEN)printf("[FILEDIR] enter HandleFileDirReqForChannel");
|
||||||
HandleFileDirReqForChannel(chnl_usr);//文件目录请求
|
HandleFileDirReqForChannel(chnl_usr);//文件目录请求
|
||||||
}
|
}
|
||||||
|
if(g_node_id == PQDIF_DATA_BASE_NODE_ID){
|
||||||
ChannelCheckIECReports(chnl_usr);//报告
|
//补招PQDIF文件
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
ChannelCheckIECReports(chnl_usr);//报告
|
||||||
|
}
|
||||||
|
|
||||||
if ( (g_node_id == SOE_COMTRADE_BASE_NODE_ID) || (g_node_id == HIS_DATA_BASE_NODE_ID) || (g_node_id == NEW_HIS_DATA_BASE_NODE_ID) || (g_node_id == RECALL_HIS_DATA_BASE_NODE_ID) || (g_node_id == RECALL_ALL_DATA_BASE_NODE_ID))
|
if ( (g_node_id == SOE_COMTRADE_BASE_NODE_ID) || (g_node_id == HIS_DATA_BASE_NODE_ID) || (g_node_id == NEW_HIS_DATA_BASE_NODE_ID) || (g_node_id == RECALL_HIS_DATA_BASE_NODE_ID) || (g_node_id == RECALL_ALL_DATA_BASE_NODE_ID))
|
||||||
ChannelCheckWaveFiles(chnl_usr);//录波文件
|
ChannelCheckWaveFiles(chnl_usr);//录波文件
|
||||||
if(g_node_id == HIS_DATA_BASE_NODE_ID || g_node_id == NEW_HIS_DATA_BASE_NODE_ID || g_node_id == RECALL_HIS_DATA_BASE_NODE_ID || (g_node_id == RECALL_ALL_DATA_BASE_NODE_ID))
|
if(g_node_id == HIS_DATA_BASE_NODE_ID || g_node_id == NEW_HIS_DATA_BASE_NODE_ID || g_node_id == RECALL_HIS_DATA_BASE_NODE_ID || (g_node_id == RECALL_ALL_DATA_BASE_NODE_ID))
|
||||||
ChannelCheckIECLogs(chnl_usr);//补招文件
|
ChannelCheckIECLogs(chnl_usr);//补招文件
|
||||||
|
|
||||||
if ( (sGetMsTime() - chnl_usr->m_LastPosRespTime) > 15*1000 ) //wait 15 secs,隔15秒获取一次响应,两次没响应后关闭
|
if ( (sGetMsTime() - chnl_usr->m_LastPosRespTime) > 15*1000 ) //wait 15 secs,隔15秒获取一次响应,两次没响应后关闭
|
||||||
{
|
{
|
||||||
char** varnames ;
|
char** varnames ;
|
||||||
|
|||||||
@@ -311,6 +311,9 @@ apr_status_t run_protocol()
|
|||||||
else if (g_node_id == SOE_COMTRADE_BASE_NODE_ID) {//暂态录波
|
else if (g_node_id == SOE_COMTRADE_BASE_NODE_ID) {//暂态录波
|
||||||
ServerPort = SOCKET_PORT + SOE_COMTRADE_BASE_NODE_ID + g_front_seg_index;
|
ServerPort = SOCKET_PORT + SOE_COMTRADE_BASE_NODE_ID + g_front_seg_index;
|
||||||
}
|
}
|
||||||
|
else if (g_node_id == PQDIF_DATA_BASE_NODE_ID) {
|
||||||
|
ServerPort = SOCKET_PORT + PQDIF_DATA_BASE_NODE_ID + g_front_seg_index;
|
||||||
|
}
|
||||||
|
|
||||||
struct sockaddr_in server_sockaddr;
|
struct sockaddr_in server_sockaddr;
|
||||||
memset(&server_sockaddr, 0, sizeof(server_sockaddr));
|
memset(&server_sockaddr, 0, sizeof(server_sockaddr));
|
||||||
@@ -351,6 +354,9 @@ apr_status_t run_protocol()
|
|||||||
else if (g_node_id == SOE_COMTRADE_BASE_NODE_ID) {//暂态录波
|
else if (g_node_id == SOE_COMTRADE_BASE_NODE_ID) {//暂态录波
|
||||||
HTTP_PORT = HTTP_PORT + SOE_COMTRADE_BASE_NODE_ID + g_front_seg_index;
|
HTTP_PORT = HTTP_PORT + SOE_COMTRADE_BASE_NODE_ID + g_front_seg_index;
|
||||||
}
|
}
|
||||||
|
else if (g_node_id == PQDIF_DATA_BASE_NODE_ID) {
|
||||||
|
HTTP_PORT = HTTP_PORT + PQDIF_DATA_BASE_NODE_ID + g_front_seg_index;
|
||||||
|
}
|
||||||
printf("try_start_web_http_thread \n");
|
printf("try_start_web_http_thread \n");
|
||||||
try_start_web_http_thread();
|
try_start_web_http_thread();
|
||||||
printf("try_start_http_thread \n");
|
printf("try_start_http_thread \n");
|
||||||
|
|||||||
@@ -329,6 +329,7 @@ handle_reset() {
|
|||||||
sed -i '/cfg_recallhis_data/d' /FeProject/etc/runtime.cf
|
sed -i '/cfg_recallhis_data/d' /FeProject/etc/runtime.cf
|
||||||
sed -i '/cfg_3s_data/d' /FeProject/etc/runtime.cf
|
sed -i '/cfg_3s_data/d' /FeProject/etc/runtime.cf
|
||||||
sed -i '/cfg_soe_comtrade/d' /FeProject/etc/runtime.cf
|
sed -i '/cfg_soe_comtrade/d' /FeProject/etc/runtime.cf
|
||||||
|
sed -i '/cfg_pqdif_data/d' /FeProject/etc/runtime.cf
|
||||||
sed -i '/fe_watchdog/d' /FeProject/etc/runtime.cf
|
sed -i '/fe_watchdog/d' /FeProject/etc/runtime.cf
|
||||||
|
|
||||||
# 根据进程号添加对应进程配置
|
# 根据进程号添加对应进程配置
|
||||||
@@ -340,6 +341,7 @@ handle_reset() {
|
|||||||
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s 1_1^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
|
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s 1_1^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
|
||||||
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_3s_data^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
|
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_3s_data^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
|
||||||
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_soe_comtrade^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
|
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_soe_comtrade^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
|
||||||
|
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_pqdif_data^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
|
||||||
|
|
||||||
else
|
else
|
||||||
#看门狗固定放在第一个,防止stop时会把要杀死的进程重启
|
#看门狗固定放在第一个,防止stop时会把要杀死的进程重启
|
||||||
@@ -353,6 +355,7 @@ handle_reset() {
|
|||||||
#以下部分没有多进程
|
#以下部分没有多进程
|
||||||
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_3s_data^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
|
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_3s_data^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
|
||||||
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_soe_comtrade^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
|
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_soe_comtrade^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
|
||||||
|
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_pqdif_data^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user