From c5731326acc36a3cfc6870ddb51ce2cc86e2cdc5 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 09 一月 2025 17:00:16 +0800
Subject: [PATCH] 10361 【越南】【英语】【BT】【砍树】仙匠大会 - 服务端

---
 Tool/RemoteTool/RemoteServer/webapp.py |  205 ++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 153 insertions(+), 52 deletions(-)

diff --git a/Tool/RemoteTool/RemoteServer/webapp.py b/Tool/RemoteTool/RemoteServer/webapp.py
index 676b552..8152336 100644
--- a/Tool/RemoteTool/RemoteServer/webapp.py
+++ b/Tool/RemoteTool/RemoteServer/webapp.py
@@ -15,7 +15,7 @@
 #---------------------------------------------------------------------
 from bottle import Bottle, request
 from lib import mylog
-import os
+import os, time
 import md5
 import smtplib
 from email.mime.text import MIMEText
@@ -23,6 +23,8 @@
 import datetime
 import subprocess
 import urllib
+from lib import ReadConfig
+import traceback
 # get: request.query.username request.GET.get('username','')
 # post: request.forms.get('username')  request.POST.get('username')
 #===============================================================================
@@ -32,12 +34,17 @@
 # client_ip = request.environ.get('HTTP_X_FORWARDED_FOR') or request.environ.get('REMOTE_ADDR')
 #===============================================================================
 
+cfg = ReadConfig.ReadConfig(os.getcwd() + "\\config.ini")
+SSL = cfg.GetInt("Mail", "SSL")
+SMTPServer = cfg.GetValue("Mail", "SMTPServer")
+Receivers = eval(cfg.GetValue("Mail", "Receivers"))
+
 g_AllMapCnt = 0
 
 myapp = Bottle()
 
 # 可执行固定的远程命令
-
+
 @myapp.route('/control/openandclose.php', method='POST')
 def RemoteCmd():
     dataDict = request.POST
@@ -55,27 +62,76 @@
     ofile = open(r".\key.txt")
     text = ofile.read().strip()
     ofile.close()
-    if sign != md5.md5("%s1234666%s"%(result, text)).hexdigest():
-        mylog.debug("签名失败")
+    if sign != md5.md5("%s1234666%s" % (result, text)).hexdigest():
+        mylog.debug("sign failed")
         return
     
-    if result == "open":
+    if result == "kaifu":
         pResult = os.popen('tasklist /FI "IMAGENAME eq EventServer.exe"')
         pResult = pResult.read()
         if "PID" in pResult or "pid" in pResult:
-            return " =======服务器已经开启,请再次确认服务器情况, EventServer.exe运行中"
-        #os.system(r"call D:\ProjectServer\LaunchServerManager\正常开服.bat")
+            return " =======server is opening, EventServer.exe  is running"
+        #os.system(r"call c:\ProjectServer\LaunchServerManager\正常开服.bat")
         # system call会导致子进程占用父进程的文件描述符导致端口无法释放, 影响重启使用
         # 如果需要保持子进程持续长期运行的应该调用 subprocess.Popen(cmd, close_fds=True)
-        cmd = r"D:\ProjectServer\LaunchServerManager\正常开服.bat"
+        cmd = r"C:\server\LaunchServerManager\start.bat"
         subprocess.Popen(cmd, close_fds=True)
         return "open success"
-    elif result == "close":
+    elif result == "guanfu":
         # 记得关服后或者重启机器需自动启动服务器控制台
-        os.system(r"call D:\ProjectServer\LaunchServerManager\正常关服.bat")
+        os.system(r"call C:\server\LaunchServerManager\close.bat")
         return "close success"
-    
+    elif result == "xiazai":
+        # 记得关服后或者重启机器需自动启动服务器控制台
+        os.system(r"call c:\RemoteServer\download.py")
+        return "download success"
+    elif result == "gengxin":
+        # 记得关服后或者重启机器需自动启动服务器控制台
+        os.system(r"call c:\RemoteServer\update.py")
+        return "update success"
+    elif result == "chongqi":
+        # 记得关服后或者重启机器需自动启动服务器控制台
+        pResult = os.popen('tasklist /FI "IMAGENAME eq ChinGameServer.exe"')
+        pResult = pResult.read()
+        if "PID" in pResult :
+            return "server is opening, restart failed"
+        else:
+            os.system(r"call c:\RemoteServer\reboot.py")
+            return "reboot success"
+    elif result == "quxiaochongqi":
+        
+        # 记得关服后或者重启机器需自动启动服务器控制台
+        os.system(r"call c:\RemoteServer\calreboot.py")
+        return "cancel reboot  success"
+    elif result == "runscript":
+        # 执行脚本 路径固定当前目录script.py
+        os.system(r"call c:\RemoteServer\script.py")
+        return "run script success"
+    elif result == "runtime":
+        return CheckUpTime()
+    elif result == "restarMain":
+        os.system(r"call c:\RemoteServer\restartMain.py")
+        return "RestartMain ok"
     return
+
+#获取服务器运行时间
+def CheckUpTime():
+    cmd = 'systeminfo |findstr "System Boot Time"'
+    r = os.popen(cmd)
+    text = r.read().replace(',', '')
+    text = text.split()
+
+    startTime = text[3] + ' ' + text[4]
+    print startTime
+    timeArray = time.strptime(startTime, "%Y-%m-%d %H:%M:%S")
+    startTimeStamp = int(time.mktime(timeArray))
+    nowTimeStamp = time.time()
+    print 
+    upTime = nowTimeStamp - startTimeStamp
+    days = int(upTime // (3600 * 24))
+    hours = int(upTime % (3600 * 24) // 3600)
+    updatetime = "OpenTime:%d Day %d Hours" % (days, hours)
+    return updatetime
 
 # OnLogError OnPyError
 # 服务器开启的状态汇报
@@ -85,40 +141,58 @@
     try:
         dataDict = request.GET
         stateType = dataDict.get("Type", "")
+        
         if not stateType:
             return
+        
         if stateType == "MapInit":
             # 服务器关闭的时候会重启,此状态只用于开服的时候是否初始化OK
             g_AllMapCnt = dataDict.get("MapCount", 0)
             if g_AllMapCnt:
                 ifile = open(".\MapCount.txt", "w")
-                ifile.write(str(datetime.datetime.today()) + "\t服务器开启完毕,地图数=%s"%g_AllMapCnt)
+                ifile.write(str(datetime.datetime.today()) + "\t服务器开启完毕,地图数=%s" % g_AllMapCnt)
                 ifile.close()
             #return "服务器开启完毕,地图数=%s"%dataDict.get("MapCount", 0)
             return
         
+        elif stateType == "ClearOpenServerOK":
+            mailText = "清档完毕:%s 服务器组:%s, dbname:%s" % (stateType, dataDict.get("groupID", 0), dataDict.get("userDBName", 0))
+            SendEmail(mailText, dataDict.get("userDBName", 0), "清档完毕")
+            return
+        
         elif stateType in ["MapError", "GameServerError", "PyMongoError"]:
             #groupID=%s&userDBName=%s&Type=PyMongoError
-            ServerInfo = "错误类型:%s 服务器组:%s, dbname:%s"%(stateType,
+            mailText = "错误类型:%s 服务器组:%s, dbname:%s 异常信息:%s" % (stateType,
                                                        dataDict.get("groupID", 0),
-                                                       dataDict.get("userDBName", 0))
-            SendEmail(ServerInfo)
+                                                       dataDict.get("userDBName", 0),
+                                                       urllib.unquote_plus(dataDict.get("MsgInfo", "")))
+            SendEmail(mailText, dataDict.get("userDBName", 0))
             return
         elif stateType == "MapDisconnect":
             # 地图5分钟未响应,可以卡了或者闪退 关闭
             #groupID=%s&userDBName=%s&Type=PyMongoError
-            ServerInfo = "错误类型:地图被关闭%s 服务器组:%s, dbname:%s"%(stateType,
+            mailText = "错误类型:地图被关闭%s 服务器组:%s, dbname:%s" % (stateType,
                                                        dataDict.get("groupID", 0),
                                                        dataDict.get("userDBName", 0))
-            SendEmail(ServerInfo)
-            return  
-        elif stateType == "GameWarning":
-            # 游戏通用警告邮件使用
-            ServerInfo = "游戏警报:服务器组:%s, dbname:%s, 警告信息:"%(
+            SendEmail(mailText, dataDict.get("userDBName", 0))
+            return
+        elif stateType in ["MapServerRaiseException", "GameServerRaiseException", "RaiseException"]:
+            mailText = "%s 抛出Try异常报错:服务器组:%s, dbname:%s, MapID:%s 异常信息:%s" % (
+                                                       stateType,
                                                        dataDict.get("groupID", 0),
                                                        dataDict.get("userDBName", 0),
-                                                       urllib.unquote_plus(dataDict.get("MsgInfo", 0)))
-            SendEmail(ServerInfo)
+                                                       dataDict.get("mapID", 0),
+                                                       urllib.unquote_plus(dataDict.get("MsgInfo", "")))
+            SendEmail(mailText, dataDict.get("userDBName", 0))
+            return
+        elif stateType == "GameWarning":
+            # 游戏通用警告邮件使用
+            mailText = "游戏警报:服务器组:%s, dbname:%s, 警告信息:%s" % (
+                                                       dataDict.get("groupID", 0),
+                                                       dataDict.get("userDBName", 0),
+                                                       urllib.unquote_plus(dataDict.get("MsgInfo", "")))
+            SendEmail(mailText, dataDict.get("userDBName", 0))
+
         elif stateType == "QueryMapOK":
             if g_AllMapCnt == 0:
                 if not os.path.exists(".\MapCount.txt"):
@@ -127,36 +201,63 @@
                 text = ifile.read()
                 ifile.close()
                 return "=========上一次记录的开启情况, 请过会再查询========", text
-            return "服务器开启完毕,地图数:%s"%g_AllMapCnt
-    except Exception, e:
-        print e
-
+            return "服务器开启完毕,地图数:%s" % g_AllMapCnt
+        
+        else:
+            mailText = "错误类型:%s 服务器组:%s, dbname:%s 异常信息:%s" % (stateType,
+                                                       dataDict.get("groupID", 0),
+                                                       dataDict.get("userDBName", 0),
+                                                       urllib.unquote_plus(dataDict.get("MsgInfo", "")))
+            SendEmail(mailText, dataDict.get("userDBName", 0))
+            return
+        
+    except BaseException:
+        errInfo = str(traceback.format_exc())
+        print errInfo
+        mailText = "邮件控制台报错! %s" % errInfo
+        try:
+            SendEmail(mailText, dataDict.get("userDBName", 0), "邮件控制台报错")
+        except:
+            print "无法发送邮件"
+            
 # 邮件汇报
-def SendEmail(ServerInfo):
-     
-    # 第三方 SMTP 服务
-    mail_host="smtp.qq.com"  #设置服务器
-    mail_user="2199274165@qq.com"    #用户名
-    mail_pass="asmizpysxngtdjic"   # 开通QQ邮箱的SMTP,短信验证后获取的,非密码
-     
-     
-    sender = '2199274165@qq.com'
+def SendEmail(mailText, dbname, subject="游戏服务器异常"):
     
-    # 这里可以填写需要接收汇报的邮件地址
-    receivers = ['305670599@qq.com']#, '1142397645@qq.com']  
-     
-    message = MIMEText('异常汇报:%s'%ServerInfo, 'plain', 'gbk')
-    message['From'] = Header("游戏服务器异常汇报", 'gbk')
-    message['To'] =  Header("运维", 'gbk')    # 不发送的话会被记录为垃圾邮件
-     
-    subject = '游戏服务器异常'
-    message['Subject'] = Header(subject, 'gbk')
-     
-     
-
-    smtpObj = smtplib.SMTP() 
-    smtpObj.connect(mail_host, 25)    # 25 为 SMTP 端口号, 如果用SSL 需要换端口
-    smtpObj.login(mail_user,mail_pass)  
-    smtpObj.sendmail(sender, receivers, message.as_string())
+    section = "Mail_%s" % SMTPServer
+    if not cfg.HasSection(section):
+        print "没有配置该邮箱服务器:%s" % section
+        return
+    
+    # 第三方 SMTP 服务
+    mail_host = cfg.GetValue(section, "Host") #设置服务器
+    mail_user = cfg.GetValue(section, "User") #用户名
+    mail_pass = cfg.GetValue(section, "Pass") #开通邮箱的SMTP,短信验证后获取的,非密码
+    
+    sender = mail_user
+    
+    serverInfo = dbname.split('GameUser_')[1]
+    
+    if SMTPServer == "qq":
+        message = MIMEText('%s' % mailText, 'plain', 'gbk')
+        message['From'] = mail_user
+        message['To'] = Header("运维", 'gbk')    # 不发送的话会被记录为垃圾邮件
+        message['Subject'] = Header("%s%s" % (serverInfo, subject), 'gbk')
+    else:
+        message = MIMEText('%s' % mailText, 'plain', 'gbk')
+        message['From'] = Header("%s %s" % (serverInfo, subject), 'gbk')
+        message['To'] = Header("运维", 'gbk')    # 不发送的话会被记录为垃圾邮件
+        message['Subject'] = Header(subject, 'gbk')
+    
+    if SSL == 1:
+        smtpObj = smtplib.SMTP_SSL(mail_host)
+        smtpObj.connect(mail_host, 465)
+        smtpObj.login(mail_user, mail_pass)
+        smtpObj.sendmail(sender, Receivers, message.as_string())
+    else:
+        smtpObj = smtplib.SMTP()
+        smtpObj.connect(mail_host, 25)
+        smtpObj.login(mail_user, mail_pass)
+        smtpObj.sendmail(sender, Receivers, message.as_string())
+        
     print "邮件发送成功"
 

--
Gitblit v1.8.0