| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #  | 
| ##@package  | 
| #  | 
| # @todo:   | 
| #  | 
| # @author: Alee  | 
| # @date 2019-2-20 ÏÂÎç04:50:04  | 
| # @version 1.0  | 
| #  | 
| # @note:   | 
| #  | 
| #---------------------------------------------------------------------  | 
| #---------------------------------------------------------------------  | 
| from bottle import Bottle, request  | 
| from lib import mylog  | 
| import os, time  | 
| import md5  | 
| import smtplib  | 
| from email.mime.text import MIMEText  | 
| from email.header import Header  | 
| 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')  | 
| #===============================================================================  | 
| # @myapp.route('/cool/kk/:name3/:count#\\d+#')  | 
| # def maybe(name3, count):  | 
| # client_ip = request.environ.get('REMOTE_ADDR')  | 
| # 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  | 
| #    for key in dataDict:  | 
| #        print key  | 
| #        mylog.debug("---%s"%dataDict[key])  | 
|     result = dataDict.get("control", "")  | 
|     if not result:  | 
|         return  | 
|       | 
|     sign = dataDict.get("sign", "")  | 
|     if not sign:  | 
|         return  | 
|       | 
|     ofile = open(r".\key.txt")  | 
|     text = ofile.read().strip()  | 
|     ofile.close()  | 
|     if sign != md5.md5("%s1234666%s" % (result, text)).hexdigest():  | 
|         mylog.debug("sign failed")  | 
|         return  | 
|       | 
|     if result == "kaifu":  | 
|         pResult = os.popen('tasklist /FI "IMAGENAME eq EventServer.exe"')  | 
|         pResult = pResult.read()  | 
|         if "PID" in pResult or "pid" in pResult:  | 
|             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"C:\server\LaunchServerManager\start.bat"  | 
|         subprocess.Popen(cmd, close_fds=True)  | 
|         return "open success"  | 
|     elif result == "guanfu":  | 
|         # ¼ÇµÃ¹Ø·þºó»òÕßÖØÆô»úÆ÷Ðè×Ô¶¯Æô¶¯·þÎñÆ÷¿ØÖÆÌ¨  | 
|         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  | 
| # ·þÎñÆ÷¿ªÆôµÄ״̬»ã±¨  | 
| @myapp.route('/control/state.php')  | 
| def ServerState():  | 
|     global g_AllMapCnt  | 
|     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.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  | 
|             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  | 
|         elif stateType == "MapDisconnect":  | 
|             # µØÍ¼5·ÖÖÓδÏìÓ¦£¬¿ÉÒÔ¿¨ÁË»òÕßÉÁÍË ¹Ø±Õ  | 
|             #groupID=%s&userDBName=%s&Type=PyMongoError  | 
|             mailText = "´íÎóÀàÐÍ:µØÍ¼±»¹Ø±Õ%s ·þÎñÆ÷×é:%s, dbname:%s" % (stateType,  | 
|                                                        dataDict.get("groupID", 0),  | 
|                                                        dataDict.get("userDBName", 0))  | 
|             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),  | 
|                                                        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"):  | 
|                     return "===ÔÝÎÞ·´À¡£¬ÉԵȺó²éѯ==="  | 
|                 ifile = open(".\MapCount.txt")  | 
|                 text = ifile.read()  | 
|                 ifile.close()  | 
|                 return "=========ÉÏÒ»´Î¼Ç¼µÄ¿ªÆôÇé¿ö, Çë¹ý»áÔÙ²éѯ========", text  | 
|             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(mailText, dbname, subject="ÓÎÏ··þÎñÆ÷Òì³£"):  | 
|       | 
|     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]  | 
|       | 
|     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 "Óʼþ·¢Ëͳɹ¦"  | 
|   |