From 2edd7b08b67068e0c2df3894d33d8485e7c08f6e Mon Sep 17 00:00:00 2001 From: lingel <2894340009@qq.com> Date: Wed, 3 Jul 2024 23:08:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=AD=E5=8F=B0=E6=9C=80=E7=BB=88=E7=89=88?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.idea/.gitignore | 0 .../.idea/controller.iml | 0 .../inspectionProfiles/profiles_settings.xml | 0 .../.idea/misc.xml | 0 .../.idea/modules.xml | 0 .../.idea/vcs.xml | 0 .../ConfControl/confControl.py | 0 .../DbProcessor/DatabaseOp.py | 30 +- .../__pycache__/DatabaseOp.cpython-312.pyc | Bin 10449 -> 11136 bytes .../LogAnalyze/MachineLearningDivider.py | 83 +++++ .../LogAnalyze/ServerHealthLogAnalyzer.py | 0 .../MachineLearningDivider.cpython-312.pyc | Bin 0 -> 2982 bytes .../ServerHealthLogAnalyzer.cpython-312.pyc | Bin .../LogAnalyze/datarocess——test.py | 0 .../LogAnalyze/server_health_model.pkl | Bin 0 -> 81325 bytes .../MessageHandler/BackendProcessor.py | 12 +- .../MessageHandler/FrontendProcessor.py | 98 ++++-- .../MessageHandler/PreDataProcessor.py | 0 .../BackendProcessor.cpython-312.pyc | Bin 0 -> 3640 bytes .../FrontendProcessor.cpython-312.pyc | Bin 0 -> 13083 bytes .../PreDataProcessor.cpython-312.pyc | Bin .../MessageHandler}/server_health_model.pkl | Bin src/controller/MessageHandler/try.py | 22 ++ .../MessageHandler/tryselect.py | 0 .../SQL/createServerList.sql | 0 .../SQL/createUser.sql | 0 .../china_ip_address.txt | 0 src/controller/connector_controller.cpp | 288 ------------------ src/controller/connector_database.cpp | 31 -- src/controller/connector_gateway.cpp | 86 ------ src/controller/db_processer/basic_db.cpp | 66 ---- .../index.html | 0 .../interface}/Connector.py | 0 .../interface/KernelToController.py | 167 ++++++++++ .../interface}/Server.py | 0 .../__pycache__/Server.cpython-312.pyc | Bin .../interface}/aiohttpserver.py | 0 .../interface/connector_controller.cpp | 280 ----------------- .../interface/connector_controller.h | 22 -- .../interface/connector_database.cpp | 68 ----- src/controller/interface/connector_database.h | 10 - src/controller/interface/main.cpp | 35 --- src/controller/interface/main_program | Bin 90968 -> 0 bytes .../main.py | 0 src/controller/new_client.cpp | 125 -------- .../LogAnalyze/MachineLearningDivider.py | 74 ----- .../BackendProcessor.cpython-312.pyc | Bin 3649 -> 0 bytes .../FrontendProcessor.cpython-312.pyc | Bin 2380 -> 0 bytes .../MessageHandler/try.py | 2 - 49 files changed, 387 insertions(+), 1112 deletions(-) rename src/{controller_completed => controller}/.idea/.gitignore (100%) rename src/{controller_completed => controller}/.idea/controller.iml (100%) rename src/{controller_completed => controller}/.idea/inspectionProfiles/profiles_settings.xml (100%) rename src/{controller_completed => controller}/.idea/misc.xml (100%) rename src/{controller_completed => controller}/.idea/modules.xml (100%) rename src/{controller_completed => controller}/.idea/vcs.xml (100%) rename src/{controller_completed => controller}/ConfControl/confControl.py (100%) rename src/{controller_completed => controller}/DbProcessor/DatabaseOp.py (94%) rename src/{controller_completed => controller}/DbProcessor/__pycache__/DatabaseOp.cpython-312.pyc (73%) create mode 100644 src/controller/LogAnalyze/MachineLearningDivider.py rename src/{controller_completed => controller}/LogAnalyze/ServerHealthLogAnalyzer.py (100%) create mode 100644 src/controller/LogAnalyze/__pycache__/MachineLearningDivider.cpython-312.pyc rename src/{controller_completed => controller}/LogAnalyze/__pycache__/ServerHealthLogAnalyzer.cpython-312.pyc (100%) rename src/{controller_completed => controller}/LogAnalyze/datarocess——test.py (100%) create mode 100644 src/controller/LogAnalyze/server_health_model.pkl rename src/{controller_completed => controller}/MessageHandler/BackendProcessor.py (86%) rename src/{controller_completed => controller}/MessageHandler/FrontendProcessor.py (78%) rename src/{controller_completed => controller}/MessageHandler/PreDataProcessor.py (100%) create mode 100644 src/controller/MessageHandler/__pycache__/BackendProcessor.cpython-312.pyc create mode 100644 src/controller/MessageHandler/__pycache__/FrontendProcessor.cpython-312.pyc rename src/{controller_completed => controller}/MessageHandler/__pycache__/PreDataProcessor.cpython-312.pyc (100%) rename src/{controller_completed/LogAnalyze => controller/MessageHandler}/server_health_model.pkl (100%) create mode 100644 src/controller/MessageHandler/try.py rename src/{controller_completed => controller}/MessageHandler/tryselect.py (100%) rename src/{controller_completed => controller}/SQL/createServerList.sql (100%) rename src/{controller_completed => controller}/SQL/createUser.sql (100%) rename src/{controller_completed => controller}/china_ip_address.txt (100%) delete mode 100644 src/controller/connector_controller.cpp delete mode 100644 src/controller/connector_database.cpp delete mode 100644 src/controller/connector_gateway.cpp delete mode 100644 src/controller/db_processer/basic_db.cpp rename src/{controller_completed => controller}/index.html (100%) rename src/{controller_completed/Interface => controller/interface}/Connector.py (100%) create mode 100644 src/controller/interface/KernelToController.py rename src/{controller_completed/Interface => controller/interface}/Server.py (100%) rename src/{controller_completed/Interface => controller/interface}/__pycache__/Server.cpython-312.pyc (100%) rename src/{controller_completed/Interface => controller/interface}/aiohttpserver.py (100%) delete mode 100644 src/controller/interface/connector_controller.cpp delete mode 100644 src/controller/interface/connector_controller.h delete mode 100644 src/controller/interface/connector_database.cpp delete mode 100644 src/controller/interface/connector_database.h delete mode 100644 src/controller/interface/main.cpp delete mode 100644 src/controller/interface/main_program rename src/{controller_completed => controller}/main.py (100%) delete mode 100644 src/controller/new_client.cpp delete mode 100644 src/controller_completed/LogAnalyze/MachineLearningDivider.py delete mode 100644 src/controller_completed/MessageHandler/__pycache__/BackendProcessor.cpython-312.pyc delete mode 100644 src/controller_completed/MessageHandler/__pycache__/FrontendProcessor.cpython-312.pyc delete mode 100644 src/controller_completed/MessageHandler/try.py diff --git a/src/controller_completed/.idea/.gitignore b/src/controller/.idea/.gitignore similarity index 100% rename from src/controller_completed/.idea/.gitignore rename to src/controller/.idea/.gitignore diff --git a/src/controller_completed/.idea/controller.iml b/src/controller/.idea/controller.iml similarity index 100% rename from src/controller_completed/.idea/controller.iml rename to src/controller/.idea/controller.iml diff --git a/src/controller_completed/.idea/inspectionProfiles/profiles_settings.xml b/src/controller/.idea/inspectionProfiles/profiles_settings.xml similarity index 100% rename from src/controller_completed/.idea/inspectionProfiles/profiles_settings.xml rename to src/controller/.idea/inspectionProfiles/profiles_settings.xml diff --git a/src/controller_completed/.idea/misc.xml b/src/controller/.idea/misc.xml similarity index 100% rename from src/controller_completed/.idea/misc.xml rename to src/controller/.idea/misc.xml diff --git a/src/controller_completed/.idea/modules.xml b/src/controller/.idea/modules.xml similarity index 100% rename from src/controller_completed/.idea/modules.xml rename to src/controller/.idea/modules.xml diff --git a/src/controller_completed/.idea/vcs.xml b/src/controller/.idea/vcs.xml similarity index 100% rename from src/controller_completed/.idea/vcs.xml rename to src/controller/.idea/vcs.xml diff --git a/src/controller_completed/ConfControl/confControl.py b/src/controller/ConfControl/confControl.py similarity index 100% rename from src/controller_completed/ConfControl/confControl.py rename to src/controller/ConfControl/confControl.py diff --git a/src/controller_completed/DbProcessor/DatabaseOp.py b/src/controller/DbProcessor/DatabaseOp.py similarity index 94% rename from src/controller_completed/DbProcessor/DatabaseOp.py rename to src/controller/DbProcessor/DatabaseOp.py index 365d237..94bf57a 100644 --- a/src/controller_completed/DbProcessor/DatabaseOp.py +++ b/src/controller/DbProcessor/DatabaseOp.py @@ -26,7 +26,6 @@ def connect_user_db(): port=3306 ) if conn.is_connected(): - print("Successfully connected to the database") return conn except Error as e: print("Connection error:", e) @@ -314,6 +313,35 @@ def delete_server_health_log(conn,servername,finaldata): @return: """ +# 通过日期获得当日日志数量 +def getLogNumByDate(conn,date): + """ + + @param conn: + @param date: + @return: + """ + cursor = conn.cursor() + + wherequery = f"detect_date = '{date}'" + + query = f"SELECT COUNT(*) FROM serverhealthlog WHERE {wherequery}" + # print(query) + cursor.execute(query) + count = cursor.fetchone()[0] + + # 关闭连接 + cursor.close() + return count + + +# 测试用例 +def test(): + conn = connect_user_db() + date = '2024-6-2' + print(getLogNumByDate(conn,date)) + +# test() # 断开数据库连接函数 def disconnect_db(conn): """ diff --git a/src/controller_completed/DbProcessor/__pycache__/DatabaseOp.cpython-312.pyc b/src/controller/DbProcessor/__pycache__/DatabaseOp.cpython-312.pyc similarity index 73% rename from src/controller_completed/DbProcessor/__pycache__/DatabaseOp.cpython-312.pyc rename to src/controller/DbProcessor/__pycache__/DatabaseOp.cpython-312.pyc index fdf747b1d7ae08910bc07b2fba8f624e16b98eb7..d7399be4b9a7a673f7b3fc5023d2ee23a2a3d8f6 100644 GIT binary patch delta 996 zcmYLHQD|Fb6h7y__r^3gO_SU%c5AYwOP1ue7DrjdGCHVh3)3t`I+borS8{K+bvAK- zZpc!S=2ixCSg7@XSfLy2VTe!=;flu4;G3akpilb$H&YMX^MB|3 z=bU@a_n)md?RNs-cXs-K%c4l&Xx(Vk)Mwshx6?JWG{TP0|_NZ`{ z)LU-_>cVgn;K*zQg6=z9`NDt2z=8q z)+0S8{xMB@tSMtXPEmS5JPCeVnqym$j5FqO2%dDFc^?rx>wKktNARlC2q3|_vmE@D z;HSD`d<59it8YXoIyw(n%xB04d3asn?kM~5r%vt&Nx=}~c~ z)bmkczK%x{$ha!1j4HqZeRHLqCL5* z9ld|ze(H0466&{K-wljB?0*=2;-9o9c4gnK+;Z-d;UDFLJO1$M)a|Kle{6kr%OAHV zS{_i;TiNC8&D@R}w6k=c*A@f+C!#Hv>`4ypfW;eV%O*71pbiG|r4&J~SjxYs2LG?; z=JP~^D(ED)=p8yfbYk$8!699u5uQN9LWvo5;&Mg{9J@OZkGC0-Ewg0N5_eAv8V)Bo zvf-(EXj_fi<2&jBd;F=~vGVeIa^2eYC4Z8S(Rt@gDv1hR;GxV)4=QC2&a=|5)a&l^Maaw6kPNhO}eqLT`a!G26LP@?tNk*zdN@7W3 zQetuHWF{tio?EO1MVWaeMa)1uCi^laa25a=4GbT+cqVUSvXH#PBX~i`>I#qb4Po&P z?+>gDJn}!jurcrmPX5CrEiD05+vLdL$ii@th0{@)`5-Tkqa5==IaWvI&HBtsnAlW+ z3X0PvPZZPG%*eKxiP2{BR*rp4jDDL-xKA-LW^K0TV`O5i+w3TCkBM>eW(DDFX2$iK zd&GKJ7>{q3l%CDZ_+j%_xojpz*3F8Fx0x7aH~&@s&&X>G48USgpfoakX4w2pLxqw3 z7He`&KF~}2TDq*cKpDHqj#{3Kf|I+oV(mfvqI3|E1tLUiq;-29Z%oK(A_d>|JT qA;lp;;sY}yBjaZg21eey42qvP1R2#nX-ziNw&waQ#?7b;)(-%bCVdhB diff --git a/src/controller/LogAnalyze/MachineLearningDivider.py b/src/controller/LogAnalyze/MachineLearningDivider.py new file mode 100644 index 0000000..c150a7e --- /dev/null +++ b/src/controller/LogAnalyze/MachineLearningDivider.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python +# encoding: utf-8 +# @author: 原凯峰 +# @contact: 2894340009@qq.com +# @software: pycharm +# @file: MachineLearningDivider.py +# @time: 2024/6/26 8:21 +# @desc:利用随机森林法进行模型训练,能够通过平均响应时间、故障率等数据计算出服务器的健康状态 + + +from sklearn.model_selection import train_test_split +from sklearn.ensemble import RandomForestClassifier +from sklearn.metrics import classification_report, accuracy_score +import pickle +def trainmodel(): + # 假设我们有以下数据集 + X = [ + [0.3, 0.005], # 服务器特征:平均响应时间和故障率 + [2.5, 0.03], + [0.7, 0.045], + [1.2, 0.002], + [3.5, 0.1], + [1.3, 0.05], + [0.01, 0.15], # 服务器特征:平均响应时间和故障率 + [5, 0.03], + [0.7, 0.015], + [1.4, 0.02], + [0.15, 0.2], + [1.3, 0.005], + + ] + y = ['良好', '一般', '一般', '良好', '差', '一般', '一般', '差', '良好', '差', '差', '良好'] # 对应的健康状态标签 + + # 将健康状态标签转换为数值 + label_mapping = {'一般': 0, '良好': 1, '差': 2} + y_encoded = [label_mapping[label] for label in y] + + # 划分训练集和测试集 + X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, test_size=0.4, random_state=42) + + # 选择模型,这里使用随机森林分类器 + model = RandomForestClassifier(n_estimators=100, random_state=42) + + # 训练模型 + model.fit(X_train, y_train) + + # 预测测试集 + y_pred = model.predict(X_test) + + # 评估模型 + print(classification_report(y_test, y_pred)) + print("Accuracy:", accuracy_score(y_test, y_pred)) + + # 保存模型 + with open('server_health_model.pkl', 'wb') as file: + pickle.dump(model, file) + + +# trainmodel() +# 定义一个函数来加载模型并进行预测 +def load_model_and_predict(new_data): + with open('../LogAnalyze/server_health_model.pkl', 'rb') as file: + loaded_model = pickle.load(file) + predictions = loaded_model.predict(new_data) + return predictions + +# 定义一个函数来将预测结果转换为健康等级 +def predict_health_status(new_data): + label_mapping = {'一般': 0, '良好': 1, '差': 2} + predictions = load_model_and_predict(new_data) + # 创建逆向映射字典 + inverse_label_mapping = {value: key for key, value in label_mapping.items()} + # 使用逆向映射字典转换预测结果 + health_status = [inverse_label_mapping[pred] for pred in predictions] + return health_status + +# 测试函数 +def testcase(): + new_data = [[0.4, 0.01]] # 新的服务器数据 + health_status = predict_health_status(new_data) + print("预测的健康状态:", health_status) + +# testcase() \ No newline at end of file diff --git a/src/controller_completed/LogAnalyze/ServerHealthLogAnalyzer.py b/src/controller/LogAnalyze/ServerHealthLogAnalyzer.py similarity index 100% rename from src/controller_completed/LogAnalyze/ServerHealthLogAnalyzer.py rename to src/controller/LogAnalyze/ServerHealthLogAnalyzer.py diff --git a/src/controller/LogAnalyze/__pycache__/MachineLearningDivider.cpython-312.pyc b/src/controller/LogAnalyze/__pycache__/MachineLearningDivider.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f3be86dac3a658379fbc1cb8dd90e680612d6f8 GIT binary patch literal 2982 zcmcImZ)_CT5r6ylZujnt?VNoenZGgM3yLAZCW!^OmhFHW?2;yJ6U*qj-nTv$_Wtzk z8gpj1JtV3gEfq$Mgo7$%B}!^al=@2>D{3p$^jp82dv0*Iu1ecLV)a9*9fUyr(0O~e zK8Ggir@qt8n>RD>?d+SG-|X)q5gEa#yX1^~3%I}2g+JH|vvLHO%LpUP7%0UIG7RNe zgH3URoX2wppArUzlsG7QYu*S92C#4r4F<6YRKfwEG7bU_<@mU?M30U$ZmmTWJ)N*L z(@L0GL$^TI_*Es1GpXk@1f<=DVw(Dhu8}zFHmH@As#tm^ogi8^LoByOQPokRsJVox z!lnVW;+S~>>@)CPN;*rBUoW*$00%9YZ$LnzIJ9XFjvTO)uM{qb5hOD6Z0d3rL&l`u}rk4x+@s z-{Hp4ai=pW-+VKBK>kT*W!Fk)^556~_51$eZ+6D{dm?Q7}76Ii-=raZNF-X?DvP4f?gk~$D4!e9NtEF8rtE(ps&E@fE zDjN^G%quRFb0dZ_tQm=vlFjPrq$_w!SIQ-{vvrA-S%Q_d%h3Iry^>3 zc9xlau6Xq2qN>gB9GT;r^M?vwpZLb)2q+_u&u}-k&4+vQy>Ox+f3NRsUm-a$HqUQ{ zbs`bMTW6XVgEbdJ=R*^{lWp_CE%!MPekvom=6{=c2RvBbjq3K@Z-#B&`r&@8ug>0v~Fx6?eTyt)yQd-c`Oq0GIO>DA* z8a7hHvRMKO+$#YnLedJ#eegFA1IeRB8sqjEt0e8GA&KAM7h@YQpSg5qs;v}jDTHZ^ z7hyS=7)_3xnB!ifiDQuPr;;)P6s^G0zuoTyH zUlDquxTgCC9MKNER7QQ+PjSD}0mLyB7Y973CG;bQ(3VIjauC|^;;eUzuAp05%8Uoe zE~;sw4M=HfiO<3r?;%p80-zLnM@^IBI}IQm8_)p6)%NB>+$f2rduH=B-L`|@=6OvB{Y zrn+ArEH)i2@*C!wj@~+O_`_)5%*(}wC#Ks<4SR~wzI;EBh0yvUzy85W0BwAcdGNPr zpGhy`?MRm_z8~(Yq( z{c8-;cAzRyf6s#S5LIsj0ykF|oxl^Jf|EbI7>!T2l%jj{{eXi-xp^w}2fl3utPr%M zmnD#%Ty?;Sne?pOEwwc+wJizcw RY`G@DY*>kMOuKi|e*jm9+{XX_ literal 0 HcmV?d00001 diff --git a/src/controller_completed/LogAnalyze/__pycache__/ServerHealthLogAnalyzer.cpython-312.pyc b/src/controller/LogAnalyze/__pycache__/ServerHealthLogAnalyzer.cpython-312.pyc similarity index 100% rename from src/controller_completed/LogAnalyze/__pycache__/ServerHealthLogAnalyzer.cpython-312.pyc rename to src/controller/LogAnalyze/__pycache__/ServerHealthLogAnalyzer.cpython-312.pyc diff --git a/src/controller_completed/LogAnalyze/datarocess——test.py b/src/controller/LogAnalyze/datarocess——test.py similarity index 100% rename from src/controller_completed/LogAnalyze/datarocess——test.py rename to src/controller/LogAnalyze/datarocess——test.py diff --git a/src/controller/LogAnalyze/server_health_model.pkl b/src/controller/LogAnalyze/server_health_model.pkl new file mode 100644 index 0000000000000000000000000000000000000000..71ed79153c6e78571f004dad5ef38ba0f2766a53 GIT binary patch literal 81325 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 literal 0 HcmV?d00001 diff --git a/src/controller/MessageHandler/__pycache__/FrontendProcessor.cpython-312.pyc b/src/controller/MessageHandler/__pycache__/FrontendProcessor.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b50a95e2714c8fe9d38d219a4ade586dd0e71c5 GIT binary patch literal 13083 zcmd5@Yfu|kmTsvf(Rv~AehP#z7}W!>8x_&3aT;#pn^VQB)<9Bt(A|E_>-QY+xEa6K-?__s+)H~Hr<$i|cgPd+ zc6)d|rnJWwa<{chEeSs=>E+wUfEXe?#9HE=c;v+ZPNgN_%v!+)uW6j}MiITRa&1m6Z(%&`9`A7veGmra?)315 zou1H&yvKTbJiM`6WDs7=u%>QhCcK&Pgu;wpY68|=6ZH5x7?hVFj?HfWe(Ua*BmPdW z|6~L0Iew%a)`AK6d>-bARB5lp0uGxUDIw`I;*I7Wj#FSpe`w3xC2+3;;1i z=yCNif5k(qN+2hq3Mo57t69|rf+pW3uSo5w2v&87s3tqayo=}}2PLfX(Csa;dxD~oI*rjK?I~+O|U|Q_SH!dbmT}ys6o+=Xe zqs5-KXG$Tj3Bi8$8A8XrK|B2Cw)asoV_#mY-|k_U0Amldw}%DDEzt*OOgV%5ho2wr9&3)}ZkjS}p3SR>nJWHk#!|dQkosaMkL9l( zQ;h~=xof9P^>cYe|Gk(61>XmAq16{F9mKEott5FR`zPd=S|FBfIt47kroRv3I&{}9 zf3^V#5VNKpo$ zP}H(^4d#dR@(3}X)v#KYWOY|`VlHUrtVkA{b%>xT@fUiLE2RC>dSN}RP>OrK;*r

E!3~q6Mt)&p)C@>JM9g&x7cspczbT* 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 K$=8G^c>e?5ae?dr literal 0 HcmV?d00001 diff --git a/src/controller_completed/MessageHandler/__pycache__/PreDataProcessor.cpython-312.pyc b/src/controller/MessageHandler/__pycache__/PreDataProcessor.cpython-312.pyc similarity index 100% rename from src/controller_completed/MessageHandler/__pycache__/PreDataProcessor.cpython-312.pyc rename to src/controller/MessageHandler/__pycache__/PreDataProcessor.cpython-312.pyc diff --git a/src/controller_completed/LogAnalyze/server_health_model.pkl b/src/controller/MessageHandler/server_health_model.pkl similarity index 100% rename from src/controller_completed/LogAnalyze/server_health_model.pkl rename to src/controller/MessageHandler/server_health_model.pkl diff --git a/src/controller/MessageHandler/try.py b/src/controller/MessageHandler/try.py new file mode 100644 index 0000000..399e516 --- /dev/null +++ b/src/controller/MessageHandler/try.py @@ -0,0 +1,22 @@ +from datetime import datetime, timedelta + +# 定义时间格式 +date_format = "%Y-%m-%d" + +# 获取当前日期,并按照定义的格式转换 +current_date = datetime.now().strftime(date_format) +# 去除前导零 +current_date = current_date.replace("-0", "-") +# 打印当前日期 +print("当前日期:", current_date) + +for day in range(1,16): + + # 计算当前日期之前15天的日期 + delta = timedelta(days=-day) + previous_date = (datetime.now() + delta).strftime(date_format) + # 去除前导零 + previous_date = previous_date.replace("-0", "-") + print(previous_date) +# 打印之前15天的日期 +print("之前15天的日期:", previous_date) \ No newline at end of file diff --git a/src/controller_completed/MessageHandler/tryselect.py b/src/controller/MessageHandler/tryselect.py similarity index 100% rename from src/controller_completed/MessageHandler/tryselect.py rename to src/controller/MessageHandler/tryselect.py diff --git a/src/controller_completed/SQL/createServerList.sql b/src/controller/SQL/createServerList.sql similarity index 100% rename from src/controller_completed/SQL/createServerList.sql rename to src/controller/SQL/createServerList.sql diff --git a/src/controller_completed/SQL/createUser.sql b/src/controller/SQL/createUser.sql similarity index 100% rename from src/controller_completed/SQL/createUser.sql rename to src/controller/SQL/createUser.sql diff --git a/src/controller_completed/china_ip_address.txt b/src/controller/china_ip_address.txt similarity index 100% rename from src/controller_completed/china_ip_address.txt rename to src/controller/china_ip_address.txt diff --git a/src/controller/connector_controller.cpp b/src/controller/connector_controller.cpp deleted file mode 100644 index 6b0d54c..0000000 --- a/src/controller/connector_controller.cpp +++ /dev/null @@ -1,288 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define BUFFER_SIZE 1024 -#define HTTP_SERVER_PORT 8080 - -std::vector threads; // 存储所有连接线程 -std::map sockets; // 存储套接字 -std::mutex sockets_mutex; // 用于同步访问 sockets -std::atomic exit_flag(false); // 原子退出标志 - - -// 维护连接的函数 -void KeepConnection(int sock) { - char buffer[BUFFER_SIZE]; - int nbytes; - while (!exit_flag) { - nbytes = recv(sock, buffer, BUFFER_SIZE, 0); - if (nbytes <= 0) { - std::cout << "Gateway disconnected" << std::endl; - break; - } - std::cout << "Received from gateway (Socket " << sock << "): " << buffer << std::endl; - } - - { - std::lock_guard lock(sockets_mutex); - sockets.erase(sock); // 从集合中移除套接字 - } - close(sock); -} -// 连接到网关的函数 -void ConnectToGateway(const std::string& ip, int port) { - int sock = socket(AF_INET, SOCK_STREAM, 0); - if (sock < 0) { - perror("Could not create socket"); - return; - } - - struct sockaddr_in server_addr; - server_addr.sin_family = AF_INET; - server_addr.sin_port = htons(port); - if (inet_pton(AF_INET, ip.c_str(), &server_addr.sin_addr) <= 0) { - perror("Invalid address"); - close(sock); - return; - } - - if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { - perror("Connection to the server failed"); - close(sock); - return; - } - - { - std::lock_guard lock(sockets_mutex); - sockets[sock] = 1; // 将套接字添加到集合中 - } - - std::cout << "Connected to gateway at " << ip << ":" << port << " (Socket " << sock << ")" << std::endl; - - // 在新线程中维护连接 - threads.emplace_back(KeepConnection, sock); -} - -// 处理HTTP请求的函数 -void HandleHttpRequest(int client_socket) { - char buffer[BUFFER_SIZE]; - int bytes_read = recv(client_socket, buffer, sizeof(buffer), 0); - if (bytes_read <= 0) { - close(client_socket); - return; - } - - // 简单解析HTTP请求 - std::string http_request(buffer, bytes_read); - std::string ip; - int port; - - // 寻找IP和端口号 - auto host_pos = http_request.find("Host: "); - if (host_pos != std::string::npos) { - auto start = host_pos + std::string("Host: ").size(); - ip = http_request.substr(start, http_request.find("\r\n", start) - start); - } - - auto content_length_pos = http_request.find("Content-Length:"); - if (content_length_pos != std::string::npos) { - auto start = content_length_pos + std::string("Content-Length: ").size(); - int length = std::stoi(http_request.substr(start, http_request.find("\r\n", start) - start)); - if (length > 0) { - char* content = new char[length]; - bytes_read = recv(client_socket, content, length, 0); - if (bytes_read > 0) { - // 解析JSON内容(假设前端发送的是JSON格式) - // 这里需要添加JSON解析逻辑来提取IP和端口 - // 示例:{"ip":"192.168.1.1","port":8080} - // 可以使用第三方库如nlohmann/json来解析JSON - - // 假设解析后得到ip和port - // ConnectToGateway(ip, port); - - delete[] content; - } - } - } - - // 发送HTTP响应 - std::string response = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\n"; - send(client_socket, response.c_str(), response.size(), 0); - close(client_socket); -} - -// 启动HTTP服务器的函数 -void StartHttpServer() { - int http_server_socket = socket(AF_INET, SOCK_STREAM, 0); - if (http_server_socket < 0) { - perror("Could not create HTTP server socket"); - return; - } - - int opt = 1; - if (setsockopt(http_server_socket, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { - perror("Setsockopt failed"); - close(http_server_socket); - return; - } - - struct sockaddr_in server_addr; - server_addr.sin_family = AF_INET; - server_addr.sin_addr.s_addr = INADDR_ANY; - server_addr.sin_port = htons(HTTP_SERVER_PORT); - - if (bind(http_server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { - perror("Bind failed"); - close(http_server_socket); - return; - } - - if (listen(http_server_socket, 5) < 0) { - perror("Listen failed"); - close(http_server_socket); - return; - } - - std::cout << "HTTP server listening on port " << HTTP_SERVER_PORT << std::endl; - - while (!exit_flag) { - int client_socket = accept(http_server_socket, NULL, NULL); - if (client_socket < 0) { - perror("Accept failed"); - continue; - } - - threads.emplace_back(HandleHttpRequest, client_socket); - } - - close(http_server_socket); -} - -int main() { - // threads.emplace_back(StartHttpServer); - - // std::string command, ip; - // int port; - // bool in_connect_mode = false; - // std::cout << "Enter command (connect/exit): "; - // while (true) { - - // if (in_connect_mode) - // { - // std::cout << "continue connect or not ? (y or n) "; - // std::cin >> command; - // if(command=="y"){ - // std::cout << "Enter the gateway IP address: "; - // std::cin >> ip; - // std::cout << "Enter the gateway port: "; - // std::cin >> port; - // ConnectToGateway(ip, port); - // } - // else { - // in_connect_mode = false; // 退出连接模式 - // std::cout << "Exiting connect mode." << std::endl; - // } - // } - // else{ - // std::cout << "Enter command (connect/exit): "; - // std::cin>>command; - // if (command == "connect") { - // if (in_connect_mode) { - // std::cout << "Already in connect mode." << std::endl; - // continue; - // } - // in_connect_mode = true; // 进入连接模式 - // std::cout << "Enter the gateway IP address: "; - // std::cin >> ip; - // std::cout << "Enter the gateway port: "; - // std::cin >> port; - // ConnectToGateway(ip, port); - // } else if (command == "exit") { - // exit_flag = true; // 设置退出标志 - // std::cout << "Exiting program." << std::endl; - // // 关闭所有套接字 - // for (auto& sock_pair : sockets) { - // shutdown(sock_pair.first, SHUT_RDWR); // 关闭套接字的发送和接收 - // close(sock_pair.first); - // } - // sockets.clear(); - // std::cout << "sockets.clear" << std::endl; - // // 等待所有线程结束 - // for (auto& thread : threads) { - // if (thread.joinable()) { - // thread.join(); - // } - // } - // threads.clear(); - // break; // 退出主循环 - // } else { - // std::cout << "Unknown command" << std::endl; - // } - // } - // } - // std::cout<<"out"<> command; - - if (command == "connect") { - if (in_connect_mode) { - std::cout << "Already in connect mode." << std::endl; - continue; - } - in_connect_mode = true; - std::cout << "Enter the gateway IP address: "; - std::cin >> ip; - std::cout << "Enter the gateway port: "; - std::cin >> port; - ConnectToGateway(ip, port); - } else if (command == "exit") { - break; // 接收到退出命令,退出主循环 - } else { - std::cout << "Unknown command" << std::endl; - } - } - - // 设置退出标志 - exit_flag = true; - - // 强制结束HTTP服务器线程 - if (http_server_thread.joinable()) { - http_server_thread.join(); - } - - // 关闭所有套接字 - for (auto& sock_pair : sockets) { - shutdown(sock_pair.first, SHUT_RDWR); - close(sock_pair.first); - } - sockets.clear(); - - // 等待所有工作线程结束 - for (auto& thread : threads) { - if (thread.joinable()) { - thread.join(); - } - } - threads.clear(); - - std::cout << "Exited program." << std::endl; - return 0; - -} \ No newline at end of file diff --git a/src/controller/connector_database.cpp b/src/controller/connector_database.cpp deleted file mode 100644 index d0768cc..0000000 --- a/src/controller/connector_database.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include -#include - -int main() { - MYSQL *conn; - conn = mysql_init(NULL); - - if (conn == NULL) { - std::cerr << "MySQL init failed" << std::endl; - return 1; - } - - const char *server = "localhost"; - const char *user = "rtsw"; - const char *password = "123456"; - const char *database = "nginxdb"; - unsigned int port = 3306; // 使用云数据库提供的端口 - - if (mysql_real_connect(conn, server, user, password, database, port, NULL, 0) == NULL) { - std::cerr << "Connection error: " << mysql_error(conn) << std::endl; - mysql_close(conn); - return 1; - } - - std::cout << "Successfully connected to the database" << std::endl; - - // ... 执行数据库操作 ... - - mysql_close(conn); - return 0; -} \ No newline at end of file diff --git a/src/controller/connector_gateway.cpp b/src/controller/connector_gateway.cpp deleted file mode 100644 index b6ba4d7..0000000 --- a/src/controller/connector_gateway.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#define PORT 8080 -#define MAX_CLIENTS 5 -#define BUFFER_SIZE 1024 - -// 声明 handle_client 函数 -void handle_client(int client_socket); - -int main() { - int server_fd, new_socket; - struct sockaddr_in server_addr, client_addr; - socklen_t client_len = sizeof(client_addr); - char buffer[BUFFER_SIZE]; - int opt = 1; - - // 创建套接字 - server_fd = socket(AF_INET, SOCK_STREAM, 0); - if (server_fd < 0) { - perror("socket creation failed"); - exit(EXIT_FAILURE); - } - - // 设置选项,允许重用地址 - if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { - perror("setsockopt failed"); - exit(EXIT_FAILURE); - } - - server_addr.sin_family = AF_INET; - server_addr.sin_addr.s_addr = INADDR_ANY; - server_addr.sin_port = htons(PORT); - - // 绑定 - if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { - perror("bind failed"); - exit(EXIT_FAILURE); - } - - // 监听 - if (listen(server_fd, MAX_CLIENTS) < 0) { - perror("listen failed"); - exit(EXIT_FAILURE); - } - - std::cout << "Server listening on port " << PORT << std::endl; - - while (true) { - client_len = sizeof(client_addr); - new_socket = accept(server_fd, (struct sockaddr *)&client_addr, &client_len); - if (new_socket < 0) { - perror("accept failed"); - exit(EXIT_FAILURE); - } - - std::cout << "New client connected from " << inet_ntoa(client_addr.sin_addr) << " port " << ntohs(client_addr.sin_port) << std::endl; - - // 创建并启动线程处理客户端 - std::thread(handle_client, new_socket).detach(); - } - - close(server_fd); - return 0; -} - -// 定义 handle_client 函数 -void handle_client(int client_socket) { - while (true) { - char buffer[BUFFER_SIZE]; - memset(buffer, 0, BUFFER_SIZE); // 清空缓冲区 - int nbytes = read(client_socket, buffer, BUFFER_SIZE); - if (nbytes <= 0) { - std::cout << "Client disconnected." << std::endl; - close(client_socket); - break; - } - std::cout << "Received message from client: " << buffer << std::endl; - // 这里可以添加更多的处理逻辑 - } -} \ No newline at end of file diff --git a/src/controller/db_processer/basic_db.cpp b/src/controller/db_processer/basic_db.cpp deleted file mode 100644 index 0abc9ed..0000000 --- a/src/controller/db_processer/basic_db.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include -#include - -int main() { - MYSQL *conn; - conn = mysql_init(NULL); - - if (conn == NULL) { - std::cerr << "MySQL init failed" << std::endl; - return 1; - } - - const char *server = "localhost"; - const char *user = "rtsw"; - const char *password = "123456"; - const char *database = "nginxdb"; - unsigned int port = 3306; - - if (mysql_real_connect(conn, server, user, password, database, port, NULL, 0) == NULL) { - std::cerr << "Connection error: " << mysql_error(conn) << std::endl; - mysql_close(conn); - return 1; - } - - std::cout << "Successfully connected to the database" << std::endl; - - // 插入数据 - const char *insert_query = "INSERT INTO users (username, email) VALUES ('newuser', 'newuser@example.com')"; - if (mysql_query(conn, insert_query)) { - std::cerr << "Insert error: " << mysql_error(conn) << std::endl; - } else { - std::cout << "Insert successful" << std::endl; - } - - // 查询数据 - const char *select_query = "SELECT * FROM users"; - MYSQL_RES *result = mysql_store_result(conn); - if (result) { - MYSQL_ROW row; - while ((row = mysql_fetch_row(result))) { - std::cout << "id: " << row[0] << ", username: " << row[1] << ", email: " << row[2] << std::endl; - } - mysql_free_result(result); - } else { - std::cerr << "Select error: " << mysql_error(conn) << std::endl; - } - - // 更新数据 - const char *update_query = "UPDATE users SET email = 'newuser_updated@example.com' WHERE username = 'newuser'"; - if (mysql_query(conn, update_query)) { - std::cerr << "Update error: " << mysql_error(conn) << std::endl; - } else { - std::cout << "Update successful" << std::endl; - } - - // 删除数据 - const char *delete_query = "DELETE FROM users WHERE username = 'newuser'"; - if (mysql_query(conn, delete_query)) { - std::cerr << "Delete error: " << mysql_error(conn) << std::endl; - } else { - std::cout << "Delete successful" << std::endl; - } - - mysql_close(conn); - return 0; -} \ No newline at end of file diff --git a/src/controller_completed/index.html b/src/controller/index.html similarity index 100% rename from src/controller_completed/index.html rename to src/controller/index.html diff --git a/src/controller_completed/Interface/Connector.py b/src/controller/interface/Connector.py similarity index 100% rename from src/controller_completed/Interface/Connector.py rename to src/controller/interface/Connector.py diff --git a/src/controller/interface/KernelToController.py b/src/controller/interface/KernelToController.py new file mode 100644 index 0000000..0f87b93 --- /dev/null +++ b/src/controller/interface/KernelToController.py @@ -0,0 +1,167 @@ +#!/usr/bin/env python +# encoding: utf-8 +# @author: 原凯峰 +# @contact: 2894340009@qq.com +# @software: pycharm +# @file: KernelToController.py +# @time: 2024/7/2 15:16 +# @desc: +import requests +import socket +import json +import time +from datetime import datetime + + +class CustomEncoder(json.JSONEncoder): + def __init__(self, *args, **kwargs): + super(CustomEncoder, self).__init__(*args, **kwargs) + self.prefix = {'number': '1', 'source': 'backend', 'kind': 'server_health_list'} + + def encode(self, obj): + if not isinstance(obj, dict): + raise TypeError("Object must be a dict.") + # 将prefix添加到原始字典的前面 + encoded_dict = {**self.prefix, **obj} + return super(CustomEncoder, self).encode(encoded_dict) + + +def calResponseTime(time_str1, time_str2, time_format): + # 将字符串时间转换为datetime对象 + time1 = datetime.strptime(time_str1, time_format) + time2 = datetime.strptime(time_str2, time_format) + time_difference = time2 - time1 + seconds_difference = time_difference.total_seconds() + return seconds_difference + + +# 定义时间格式 +time_format = "%a, %d %b %Y %H:%M:%S GMT" +# 目标URL +url = 'http://127.0.0.1/status?format=json' + +# 发送数据的IP地址和端口 +target_ip = '47.96.136.178' +target_port = 8080 +# 定义一个数组来存储last_check_time的值 +last_check_times = [] +last_receive_times = [] +last_response_times = [] +tmp = '' +pos = 0 +while True: + # 从URL获取数据 + response = requests.get(url) + data = response.json() + tip = 0 + pos = pos + 1 + # 检查 'servers' 和 'server' 键是否存在 + if 'servers' in data and 'server' in data['servers']: + # 遍历服务器数据 + for server in data['servers']['server']: + # 将对应的值添加到数组中 + if (pos == 1): + # 数组初添加 + last_check_times.append(server['last_check_time']) + else: + # 修正处理json数据 + server['last_check_time'] = tmp + # 存放到数组中 + last_check_times[tip] = tmp + + # 修正调整 + if (server['last_receive_time'] == ''): + server['last_receive_time'] = 'Null' + if (pos == 1): + last_receive_times.append(server['last_receive_time']) + else: + last_receive_times[tip] = server['last_receive_time'] + + tip = tip + 1 + print("last_check_times:", last_check_times) + print("last_receive_times:", last_receive_times) + ##分析计算出服务器响应时间: + for i in range(len(last_check_times)): + # 初次添加 + if (pos == 1): + if (last_receive_times[i] == 'Null'): + last_response_times.append('Null') + if (last_receive_times[i] != 'Null'): + responseTime = calResponseTime(last_check_times[i], last_receive_times[i], time_format) + last_response_times.append(responseTime) + else: + if (last_receive_times[i] == 'Null'): + last_response_times[i] = 'Null' + if (last_receive_times[i] != 'Null'): + responseTime = calResponseTime(last_check_times[i], last_receive_times[i], time_format) + last_response_times[i] = responseTime + + # 加入到发送数据中: + for server, responseTime in zip(data['servers']['server'], last_response_times): + server['last_response_time'] = responseTime + for i in range(len(last_check_times)): + if (last_receive_times[i] != 'Null'): + tmp = last_receive_times[i] + last_check_times[i] = last_receive_times[i] + + # 打印数组内容,查看存储的值 + + print("last_response_times:", last_response_times) + # 使用自定义的编码器将数据转换为JSON格式的字符串 + json_data = json.dumps(data, cls=CustomEncoder) + + print(json_data) + # 目标服务器的IP地址和端口 + target_url = 'http://47.96.136.178:8080' + + # 发送POST请求 + # 指定发送的内容类型为JSON + headers = {'Content-Type': 'application/json'} + response = requests.post(target_url, data=json_data, headers=headers) + + # 检查请求是否成功 + if response.status_code == 200: + print("数据成功发送。") + else: + print("数据发送失败,状态码:", response.status_code) + + print("数据已发送到IP:{},端口:{}".format(target_ip, target_port)) + # 等待2.5秒 + time.sleep(2.5) + + + + +# 读取文件 +def read_log(file_path): + with open(file_path, 'r') as file: + # 读取所有行 + log_lines = [line.strip() for line in file] + return log_lines + +# # 指定文件路径 +# file_path = '/usr/local/nginx/logs/access.log' +# +# # 指定目标IP和端口 +# targeturl = 'http://47.96.136.178:8080' + +# 构造JSON数据并发送 +# def send_json(url, data): +# headers = {'Content-Type': 'application/json'} +# # 将数据构造为JSON格式 +# json_data = json.dumps({"logs": data}) +# response = requests.post(url, data=json_data, headers=headers) +# return response + +# try: +# # 读取日志文件并转换为JSON +# log_data = read_log(file_path) +# +# # 发送数据 +# response = send_json(targeturl, log_data) +# +# # 打印响应状态码和内容 +# print(f'Status Code: {response.status_code}') +# print(f'Response Content: {response.text}') +# except Exception as e: +# print(f'An error occurred: {e}') \ No newline at end of file diff --git a/src/controller_completed/Interface/Server.py b/src/controller/interface/Server.py similarity index 100% rename from src/controller_completed/Interface/Server.py rename to src/controller/interface/Server.py diff --git a/src/controller_completed/Interface/__pycache__/Server.cpython-312.pyc b/src/controller/interface/__pycache__/Server.cpython-312.pyc similarity index 100% rename from src/controller_completed/Interface/__pycache__/Server.cpython-312.pyc rename to src/controller/interface/__pycache__/Server.cpython-312.pyc diff --git a/src/controller_completed/Interface/aiohttpserver.py b/src/controller/interface/aiohttpserver.py similarity index 100% rename from src/controller_completed/Interface/aiohttpserver.py rename to src/controller/interface/aiohttpserver.py diff --git a/src/controller/interface/connector_controller.cpp b/src/controller/interface/connector_controller.cpp deleted file mode 100644 index 2c93baf..0000000 --- a/src/controller/interface/connector_controller.cpp +++ /dev/null @@ -1,280 +0,0 @@ -#include "connector_controller.h" - -#define BUFFER_SIZE 1024 -#define HTTP_SERVER_PORT 8080 - -std::vector threads; // 存储所有连接线程 -std::map sockets; // 存储套接字 -std::mutex sockets_mutex; // 用于同步访问 sockets -std::atomic exit_flag(false); // 原子退出标志 - - -// 维护连接的函数 -void KeepConnection(int sock) { - char buffer[BUFFER_SIZE]; - int nbytes; - while (!exit_flag) { - nbytes = recv(sock, buffer, BUFFER_SIZE, 0); - if (nbytes <= 0) { - std::cout << "Gateway disconnected" << std::endl; - break; - } - std::cout << "Received from gateway (Socket " << sock << "): " << buffer << std::endl; - } - - { - std::lock_guard lock(sockets_mutex); - sockets.erase(sock); // 从集合中移除套接字 - } - close(sock); -} -// 连接到网关的函数 -void ConnectToGateway(const std::string& ip, int port) { - int sock = socket(AF_INET, SOCK_STREAM, 0); - if (sock < 0) { - perror("Could not create socket"); - return; - } - - struct sockaddr_in server_addr; - server_addr.sin_family = AF_INET; - server_addr.sin_port = htons(port); - if (inet_pton(AF_INET, ip.c_str(), &server_addr.sin_addr) <= 0) { - perror("Invalid address"); - close(sock); - return; - } - - if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { - perror("Connection to the server failed"); - close(sock); - return; - } - - { - std::lock_guard lock(sockets_mutex); - sockets[sock] = 1; // 将套接字添加到集合中 - } - - std::cout << "Connected to gateway at " << ip << ":" << port << " (Socket " << sock << ")" << std::endl; - - // 在新线程中维护连接 - threads.emplace_back(KeepConnection, sock); -} - -// 处理HTTP请求的函数 -void HandleHttpRequest(int client_socket) { - char buffer[BUFFER_SIZE]; - int bytes_read = recv(client_socket, buffer, sizeof(buffer), 0); - if (bytes_read <= 0) { - close(client_socket); - return; - } - - // 简单解析HTTP请求 - std::string http_request(buffer, bytes_read); - std::string ip; - int port; - - // 寻找IP和端口号 - auto host_pos = http_request.find("Host: "); - if (host_pos != std::string::npos) { - auto start = host_pos + std::string("Host: ").size(); - ip = http_request.substr(start, http_request.find("\r\n", start) - start); - } - - auto content_length_pos = http_request.find("Content-Length:"); - if (content_length_pos != std::string::npos) { - auto start = content_length_pos + std::string("Content-Length: ").size(); - int length = std::stoi(http_request.substr(start, http_request.find("\r\n", start) - start)); - if (length > 0) { - char* content = new char[length]; - bytes_read = recv(client_socket, content, length, 0); - if (bytes_read > 0) { - // 解析JSON内容(假设前端发送的是JSON格式) - // 这里需要添加JSON解析逻辑来提取IP和端口 - // 示例:{"ip":"192.168.1.1","port":8080} - // 可以使用第三方库如nlohmann/json来解析JSON - - // 假设解析后得到ip和port - // ConnectToGateway(ip, port); - - delete[] content; - } - } - } - - // 发送HTTP响应 - std::string response = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\n"; - send(client_socket, response.c_str(), response.size(), 0); - close(client_socket); -} - -// 启动HTTP服务器的函数 -void StartHttpServer() { - int http_server_socket = socket(AF_INET, SOCK_STREAM, 0); - if (http_server_socket < 0) { - perror("Could not create HTTP server socket"); - return; - } - - int opt = 1; - if (setsockopt(http_server_socket, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { - perror("Setsockopt failed"); - close(http_server_socket); - return; - } - - struct sockaddr_in server_addr; - server_addr.sin_family = AF_INET; - server_addr.sin_addr.s_addr = INADDR_ANY; - server_addr.sin_port = htons(HTTP_SERVER_PORT); - - if (bind(http_server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { - perror("Bind failed"); - close(http_server_socket); - return; - } - - if (listen(http_server_socket, 5) < 0) { - perror("Listen failed"); - close(http_server_socket); - return; - } - - std::cout << "HTTP server listening on port " << HTTP_SERVER_PORT << std::endl; - - while (!exit_flag) { - int client_socket = accept(http_server_socket, NULL, NULL); - if (client_socket < 0) { - perror("Accept failed"); - continue; - } - - threads.emplace_back(HandleHttpRequest, client_socket); - } - - close(http_server_socket); -} - -/* -int main() { - // threads.emplace_back(StartHttpServer); - - // std::string command, ip; - // int port; - // bool in_connect_mode = false; - // std::cout << "Enter command (connect/exit): "; - // while (true) { - - // if (in_connect_mode) - // { - // std::cout << "continue connect or not ? (y or n) "; - // std::cin >> command; - // if(command=="y"){ - // std::cout << "Enter the gateway IP address: "; - // std::cin >> ip; - // std::cout << "Enter the gateway port: "; - // std::cin >> port; - // ConnectToGateway(ip, port); - // } - // else { - // in_connect_mode = false; // 退出连接模式 - // std::cout << "Exiting connect mode." << std::endl; - // } - // } - // else{ - // std::cout << "Enter command (connect/exit): "; - // std::cin>>command; - // if (command == "connect") { - // if (in_connect_mode) { - // std::cout << "Already in connect mode." << std::endl; - // continue; - // } - // in_connect_mode = true; // 进入连接模式 - // std::cout << "Enter the gateway IP address: "; - // std::cin >> ip; - // std::cout << "Enter the gateway port: "; - // std::cin >> port; - // ConnectToGateway(ip, port); - // } else if (command == "exit") { - // exit_flag = true; // 设置退出标志 - // std::cout << "Exiting program." << std::endl; - // // 关闭所有套接字 - // for (auto& sock_pair : sockets) { - // shutdown(sock_pair.first, SHUT_RDWR); // 关闭套接字的发送和接收 - // close(sock_pair.first); - // } - // sockets.clear(); - // std::cout << "sockets.clear" << std::endl; - // // 等待所有线程结束 - // for (auto& thread : threads) { - // if (thread.joinable()) { - // thread.join(); - // } - // } - // threads.clear(); - // break; // 退出主循环 - // } else { - // std::cout << "Unknown command" << std::endl; - // } - // } - // } - // std::cout<<"out"<> command; - - if (command == "connect") { - if (in_connect_mode) { - std::cout << "Already in connect mode." << std::endl; - continue; - } - in_connect_mode = true; - std::cout << "Enter the gateway IP address: "; - std::cin >> ip; - std::cout << "Enter the gateway port: "; - std::cin >> port; - ConnectToGateway(ip, port); - } else if (command == "exit") { - break; // 接收到退出命令,退出主循环 - } else { - std::cout << "Unknown command" << std::endl; - } - } - - // 设置退出标志 - exit_flag = true; - - // 强制结束HTTP服务器线程 - if (http_server_thread.joinable()) { - http_server_thread.join(); - } - - // 关闭所有套接字 - for (auto& sock_pair : sockets) { - shutdown(sock_pair.first, SHUT_RDWR); - close(sock_pair.first); - } - sockets.clear(); - - // 等待所有工作线程结束 - for (auto& thread : threads) { - if (thread.joinable()) { - thread.join(); - } - } - threads.clear(); - - std::cout << "Exited program." << std::endl; - return 0; - -} -*/ \ No newline at end of file diff --git a/src/controller/interface/connector_controller.h b/src/controller/interface/connector_controller.h deleted file mode 100644 index c45ca15..0000000 --- a/src/controller/interface/connector_controller.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef CONNECTOR_CONTROLLER_H -#define CONNECTOR_CONTROLLER_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// 函数声明 -void StartHttpServer(); -void ConnectToGateway(const std::string& ip, int port); -void KeepConnection(int sock); -void HandleHttpRequest(int client_socket); - -#endif // CONNECTOR_CONTROLLER_H \ No newline at end of file diff --git a/src/controller/interface/connector_database.cpp b/src/controller/interface/connector_database.cpp deleted file mode 100644 index 212bfd5..0000000 --- a/src/controller/interface/connector_database.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - 这个文件可以只负责链接数据库,其他的都不管 - 把数据库的句柄传给主程序 -*/ - -/* -#include -#include - -int main() { - MYSQL *conn; - conn = mysql_init(NULL); - - if (conn == NULL) { - std::cerr << "MySQL init failed" << std::endl; - return 1; - } - - const char *server = "localhost"; - const char *user = "rtsw"; - const char *password = "123456"; - const char *database = "nginxdb"; - unsigned int port = 3306; // 使用云数据库提供的端口 - - if (mysql_real_connect(conn, server, user, password, database, port, NULL, 0) == NULL) { - std::cerr << "Connection error: " << mysql_error(conn) << std::endl; - mysql_close(conn); - return 1; - } - - std::cout << "Successfully connected to the database" << std::endl; - - // ... 执行数据库操作 ... - - mysql_close(conn); - return 0; -} -*/ - -#include "connector_database.h" - -// DatabaseOperation函数定义 -void DatabaseOperation() { - MYSQL *conn = mysql_init(NULL); - - if (conn == NULL) { - std::cerr << "MySQL init failed" << std::endl; - return; - } - - const char *server = "localhost"; - const char *user = "rtsw"; - const char *password = "123456"; - const char *database = "nginxdb"; - unsigned int port = 3306; - - if (mysql_real_connect(conn, server, user, password, database, port, NULL, 0) == NULL) { - std::cerr << "Connection error: " << mysql_error(conn) << std::endl; - mysql_close(conn); - return; - } - - std::cout << "Successfully connected to the database" << std::endl; - - // ... 执行数据库操作 ... - - mysql_close(conn); -} \ No newline at end of file diff --git a/src/controller/interface/connector_database.h b/src/controller/interface/connector_database.h deleted file mode 100644 index 83a2cf6..0000000 --- a/src/controller/interface/connector_database.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef CONNECTOR_DATABASE_H -#define CONNECTOR_DATABASE_H - -#include -#include - -// 函数声明 -void DatabaseOperation(); - -#endif // CONNECTOR_DATABASE_H \ No newline at end of file diff --git a/src/controller/interface/main.cpp b/src/controller/interface/main.cpp deleted file mode 100644 index e469900..0000000 --- a/src/controller/interface/main.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include -#include -#include "connector_controller.h" -#include "connector_database.h" - -int main() { - std::string command; - bool running = true; - - while (running) { - std::cout << "Enter command (start_http_server/connect_gateway/database_operation/exit): "; - std::cin >> command; - - if (command == "start_http_server") { - StartHttpServer(); - } else if (command == "connect_gateway") { - std::string ip; - int port; - std::cout << "Enter the gateway IP address: "<>ip; // 使用getline以获取包含空格的IP地址 - std::cout << "Enter the gateway port: "<> port; - ConnectToGateway(ip, port); - } else if (command == "database_operation") { - DatabaseOperation(); - } else if (command == "exit") { - running = false; - } else { - std::cout << "Unknown command" << std::endl; - } - } - - std::cout << "Exiting program." << std::endl; - return 0; -} \ No newline at end of file diff --git a/src/controller/interface/main_program b/src/controller/interface/main_program deleted file mode 100644 index 71bad27e38cebcd16ab3583728dd749c317ac390..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90968 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define BUFFER_SIZE 1024 - -std::vector threads; // 存储所有连接线程 -std::map sockets; // 存储套接字 -std::mutex sockets_mutex; // 用于同步访问 sockets -std::atomic exit_flag(false); // 原子退出标志 - - -// 维护连接的函数 -void KeepConnection(int sock) { - char buffer[BUFFER_SIZE]; - int nbytes; - while (!exit_flag) { - nbytes = recv(sock, buffer, BUFFER_SIZE, 0); - if (nbytes <= 0) { - std::cout << "Gateway disconnected" << std::endl; - break; - } - std::cout << "Received from gateway (Socket " << sock << "): " << buffer << std::endl; - } - - { - std::lock_guard lock(sockets_mutex); - sockets.erase(sock); // 从集合中移除套接字 - } - close(sock); -} -// 连接到网关的函数 -void ConnectToGateway(const std::string& ip, int port) { - int sock = socket(AF_INET, SOCK_STREAM, 0); - if (sock < 0) { - perror("Could not create socket"); - return; - } - - struct sockaddr_in server_addr; - server_addr.sin_family = AF_INET; - server_addr.sin_port = htons(port); - if (inet_pton(AF_INET, ip.c_str(), &server_addr.sin_addr) <= 0) { - perror("Invalid address"); - close(sock); - return; - } - - if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { - perror("Connection to the server failed"); - close(sock); - return; - } - - { - std::lock_guard lock(sockets_mutex); - sockets[sock] = 1; // 将套接字添加到集合中 - } - - std::cout << "Connected to gateway at " << ip << ":" << port << " (Socket " << sock << ")" << std::endl; - - // 在新线程中维护连接 - threads.emplace_back(KeepConnection, sock); -} - - - -int main() { - std::string command, ip; - int port; - bool in_connect_mode = false; - - while (true) { - std::cout << "Enter command (connect/exitconnect/exit): "; - std::cin >> command; - - if (command == "connect") { - if (in_connect_mode) { - std::cout << "Already in connect mode." << std::endl; - continue; - } - in_connect_mode = true; // 进入连接模式 - std::cout << "Enter the gateway IP address: "; - std::cin >> ip; - std::cout << "Enter the gateway port: "; - std::cin >> port; - ConnectToGateway(ip, port); - } else if (command == "exitconnect") { - if (!in_connect_mode) { - std::cout << "Not in connect mode." << std::endl; - continue; - } - in_connect_mode = false; // 退出连接模式 - std::cout << "Exiting connect mode." << std::endl; - } else if (command == "exit") { - exit_flag = true; // 设置退出标志 - std::cout << "Exiting program." << std::endl; - // 关闭所有套接字 - for (auto& sock_pair : sockets) { - shutdown(sock_pair.first, SHUT_RDWR); // 关闭套接字的发送和接收 - close(sock_pair.first); - } - sockets.clear(); - // 等待所有线程结束 - for (auto& thread : threads) { - if (thread.joinable()) { - thread.join(); - } - } - threads.clear(); - break; // 退出主循环 - } else { - std::cout << "Unknown command" << std::endl; - } - } - - return 0; -} \ No newline at end of file diff --git a/src/controller_completed/LogAnalyze/MachineLearningDivider.py b/src/controller_completed/LogAnalyze/MachineLearningDivider.py deleted file mode 100644 index c08f23b..0000000 --- a/src/controller_completed/LogAnalyze/MachineLearningDivider.py +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env python -# encoding: utf-8 -# @author: 原凯峰 -# @contact: 2894340009@qq.com -# @software: pycharm -# @file: MachineLearningDivider.py -# @time: 2024/6/26 8:21 -# @desc:利用随机森林法进行模型训练,能够通过平均响应时间、故障率等数据计算出服务器的健康状态 - - -from sklearn.model_selection import train_test_split -from sklearn.ensemble import RandomForestClassifier -from sklearn.metrics import classification_report, accuracy_score -import pickle -# 假设我们有以下数据集 -X = [ - [0.3, 0.005], # 服务器特征:平均响应时间和故障率 - [2.5, 0.03], - [0.7, 0.045], - [1.2, 0.002] -] -y = ['良好', '差', '差', '良好'] # 对应的健康状态标签 - -# 将健康状态标签转换为数值 -label_mapping = {'一般': 0, '良好': 1, '差': 2, '极差': 3} -y_encoded = [label_mapping[label] for label in y] - -# 划分训练集和测试集 -X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, test_size=0.25, random_state=42) - -# 选择模型,这里使用随机森林分类器 -model = RandomForestClassifier(n_estimators=100, random_state=42) - -# 训练模型 -model.fit(X_train, y_train) - -# 预测测试集 -y_pred = model.predict(X_test) - -# 评估模型 -print(classification_report(y_test, y_pred)) -print("Accuracy:", accuracy_score(y_test, y_pred)) - -with open('server_health_model.pkl', 'wb') as file: - pickle.dump(model, file) - - -# 保存模型 -with open('server_health_model.pkl', 'wb') as file: - pickle.dump(model, file) - -# 定义一个函数来加载模型并进行预测 -def load_model_and_predict(new_data): - with open('server_health_model.pkl', 'rb') as file: - loaded_model = pickle.load(file) - predictions = loaded_model.predict(new_data) - return predictions - -# 定义一个函数来将预测结果转换为健康等级 -def predict_health_status(new_data): - predictions = load_model_and_predict(new_data) - # 创建逆向映射字典 - inverse_label_mapping = {value: key for key, value in label_mapping.items()} - # 使用逆向映射字典转换预测结果 - health_status = [inverse_label_mapping[pred] for pred in predictions] - return health_status - -# 测试函数 -def testcase(): - new_data = [[0.4, 0.01]] # 新的服务器数据 - health_status = predict_health_status(new_data) - print("预测的健康状态:", health_status) - -testcase() \ No newline at end of file diff --git a/src/controller_completed/MessageHandler/__pycache__/BackendProcessor.cpython-312.pyc b/src/controller_completed/MessageHandler/__pycache__/BackendProcessor.cpython-312.pyc deleted file mode 100644 index 03b894aa8feff86d59d21441e0ff9045e833fbec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3649 zcmbVPeN0=|6~FJx_=|+tj2K+t@#2g)A*3YaV_utEuppVQah5Nt-;es?jEG)h2cMv(o;-g9_`7NzoRF_8)~xo6>)F?t9M; zAE{RD3g36`Ip?1HanA3Y%U^11-3Z#Rl9~8uEkge!gGysWlY4j|TmK{i zPM*@Mev#-L^$vv6d(5nDk3u=>BHDxW>YaxW4&><#bJ!gH4tkG%IO8&sxIFzToq-@E z-|N(MG{#&;*Qu~0-2+RydAmI=ruAVJNBHF*{(SlSA1?py_Ct~7jR?QNV^yKSUP~xa z)~ydGG#>s$KI^O~X8k=1FJr7?UX8`l7|T+G?+-JkBMmNv6N+xQ&Wy$6l%7x(5O`rr z*ae+I$r`x}*c~RWz)tA0?c3b-=-~2!vi5E0#?h+Vu;I!w)|&lXJ8F6t^mmA>f4Ldj5g;xu;A^u=imLsY7Gb; zXvFkutpfUmtA}A`cbsHC=78AbbCOC-pFabhoBC3ZU)u-A`q87Y2;8cd!J6GFe!T)1 z$W!3?DmE*K%riN<7ri2ZoXxQkZAKLb6k}2jpjeZt0g5vzCr}QPasgFiQf{62z-&1t z$5m39Ro6Q7xl%zvbwEAP>F{x7XtaTaCV8F$!| zJ_@?ksQU`hTGcgtnv6$f937U$q&^%?CN$k(6>&s1oavMX$w?eB9GWibY0dCRvM$H; zsGb0^7t2~oRW$h$8L>K~t*ndJ(lL^7+p@bans#|H2_~crFOPv`trH^LX~l4(wQ!%g zuAP@Ih#0sQ0(L^$Qpjp)U`3@t!w+eWj7>{XYqsG_zz(o(52GYg8oqQ2zH)_U9x1p< z&pK>U9Wp0`y(Y8_mu0g*Jz}^m@_F+%$VMuhvr1ewJeD*{t_cU=>M;q7>h+MtagcDF zDXi*hOif}E8X5txol(q>1zv)PY|A$AZc6$Bnf?#x0JC1?ty}a2OP=6d>yf{Dj+8_D z7DJ~>p;LFd7f-)fI{o5&=%tdkZSrg(yW|(<{h`U;yDj_HkgqmH72J25+lvm!$^}n3 zxOe7iDcDtTmK*oX^pzS9798c4eZ}Td%W;slhKrr0)^8NNL@!c2jt7tejva3}D|H|JiG=Hkjiy;=?(dh`6fFA+UiI1d(fbrgGV2S0k@PTwal z&s~;b-luiyXM4%+R$a*3jY-^ZD%S+;X3EfkFv|pGmjpUT+b{-b+c0JURBW6!ivj3c z4T?cyp4(UqD(M11$qk`69iyQfIP%=9+(rAlp&Znt-v&GGDr%liiC7%rtuWB65GJt# z1>)BCmJ72h@BU!r-8YtBe}DNW#pRp7T>j%9?)~}wm75>l|LMe4O;sM+v5UvUXyZGU zKbT(m@yFXO+<*P|E8{o8!pd8>@Be9{YQw0pw_$L)s*6cLtBJhq<8i1xyjUqR*M}2H znTL&Q31!IMI&T4iClG0C!{qhQAEvP%zL@0lu){*eu5Bm92S98vN_qr`h;}`6ngcp3 zzOBe^hH-ZPw#c@OJp%Zo=2j|`x5gDHH?$XBrG~?k&z60S)9odnFnPM%$j<~yjr%8` zEBhO!-G!&-yn5SS!OYTD<&uVH8MlhIx2a} zVA2tcYrCPFKx;I^9bR+q-~wy>V_b?_KUvEKtT{w82ES?}@omO<9}w`4rt(O)pEd|x zC63wBa;Or)@Gv6g%$B37TpAvobiddOR&EHIn#M6%i15Oo^)MDXc!9i42+Q)v#tJ~B zw#z}`hF}Jk5INi-49SX&Me-mKB3)H2A@cGK0j$YmLgeudfz$#aBIvP{&>?Ir6Ts~1 z>H;RYRTzkagD|kF3)t&|xs{>=(pWOBK_&%_4Rwd8b>%z$&*fs9mh1Ye%e|7%hZ%z< z*fqGMDoUE^Yv4HvFA8+~K1x|Y=#^eEEp2^%FK0<~h5u4Hd!1;s)i<9^%;E}jAcfZO| h6!m!>qW1nB9sL{f{F^;RQGw48>DT*ch67fK6rSDnI{qcLlg7p-$zl?~O$eeiDTE4@Hnc!XpoL0JinQ8zC&A#X-PtvX zja{J%3Ad^cw;&?ql?CH*psz5Oy-b`WG0QiV;RJvcaY59Ml!d+S~BBI z-jU${q>BV&FfS)9wnZ6xvDO8XIfT(TBcpLvW^SW#j_MhA$Q)3f>M(+DlZ>KaMZQQf zNvx_FlC%#o)zCQy|Fua|S&=Cs(F7-2{lEf zwh6+s6Q_r-C{rnA_K=KkTuFj2NG6@e5lXt? z;crIbOPI_dH}yW{Zy7SP8#pCKYeq(9i_8N^o`>9mt&c%P<`UY6w5Hd45Q&u7O?wI<-r_$ku`q;PP1y#71CT0vTUAIL4V;&Hhn^=MZu zI-o}fDmV1#Q2E^@U+~_!`#0}TSB_OfuP*uqm)p9kzOKKQS|h87b4LKLwjZc4^J+EJ zx9IEty)FFDN(%tb)DUR>tUHdrcAw(7gtEuf84VXD7 zzvw9PMXu;va9TVD$t|UpV#_5YyR0vqV#{y-$Zpdg{ciMsdqnn>TzPNaoABiZ;lyU@ zzCg-1WsLyAQz=!$M6|2GaOG4?6loe8uB@c0GZ`WqZi1z>XfoNeBL=78bRqbGx%0wB zLCqy;v))_i`_SGhNNLz1=LI|q%2fd>WdwTRgrs7ta0Ub;B&9WRLP}nTb}vG!n@mj= zPTY*EnH)*t_;B2Y;{9<81lC3|YFO0-i!V&3(l}m%0_3d{YX!c7lbT2`BFYn1Sq7om zQl@E<2^oQu0ul{5urJ{@E7fpN4I~UsB@s$!o{%UdF-p8Z4Bs_1qkuMPI-ABSO%=Q2 zG%A~R+CumC%6{%qps%9(2M{P|AMyoi-k9!j zR`(7*_7AQ&Ie%c?h1&PMkcG>!k3N5IWjES2L}&*aO*rXeMbk+X4UZ^JXXIR(&V8cz zNlr>z2-yX)W`iWum)|0Dv(+}~`$H(9jyHSPZM4dA{41*-KOb4^>fy&2OPmUg!eiSp zGSPgB2O7zEA!{ljy;L1F&D8$P^}1!zNpb*q^qo>WfUIx~!>k7o)B6{DoEc+Q5vAt7 Fe*tehJv#sZ diff --git a/src/controller_completed/MessageHandler/try.py b/src/controller_completed/MessageHandler/try.py deleted file mode 100644 index e3ee38a..0000000 --- a/src/controller_completed/MessageHandler/try.py +++ /dev/null @@ -1,2 +0,0 @@ -dic = {'a':1,'b':2,'c':3} -for i in dic.keys():