diff --git a/app/script/convert.sh b/app/script/convert.sh index fba6792..5bc3fa5 100644 --- a/app/script/convert.sh +++ b/app/script/convert.sh @@ -1,7 +1,7 @@ #!/bin/bash Linux_Version="7.9.4" -Windows_Version="7.6.0" +Windows_Version="7.7.0" FILES=( public/install/src/panel6.zip diff --git a/public/install/src/panel6.zip b/public/install/src/panel6.zip index 503c7b5..d742d9c 100644 Binary files a/public/install/src/panel6.zip and b/public/install/src/panel6.zip differ diff --git a/public/install/update/LinuxPanel-7.9.4.zip b/public/install/update/LinuxPanel-7.9.4.zip index 19d4e21..564b809 100644 Binary files a/public/install/update/LinuxPanel-7.9.4.zip and b/public/install/update/LinuxPanel-7.9.4.zip differ diff --git a/public/win/panel/panel_7.6.0.zip b/public/win/panel/panel_7.7.0.zip similarity index 83% rename from public/win/panel/panel_7.6.0.zip rename to public/win/panel/panel_7.7.0.zip index 0f3981a..1feec55 100644 Binary files a/public/win/panel/panel_7.6.0.zip and b/public/win/panel/panel_7.7.0.zip differ diff --git a/wiki/files/win/PluginLoader.py b/wiki/files/win/PluginLoader.py new file mode 100644 index 0000000..e7ffd52 --- /dev/null +++ b/wiki/files/win/PluginLoader.py @@ -0,0 +1,122 @@ +#coding: utf-8 +import public,os,sys,json + +#获取插件列表(0/1) +def get_plugin_list(force = 0): + api_root_url = 'https://api.bt.cn' + api_url = api_root_url+ '/wpanel/get_plugin_list' + cache_file = 'data/plugin_list.json' + + if force==0 and os.path.exists(cache_file): + jsonData = public.readFile(cache_file) + softList = json.loads(jsonData) + else: + try: + jsonData = public.HttpGet(api_url) + except Exception as ex: + raise public.error_conn_cloud(str(ex)) + softList = json.loads(jsonData) + if type(softList)!=dict or 'list' not in softList: raise Exception('云端插件列表获取失败') + public.writeFile(cache_file, jsonData) + return softList + +#获取授权状态() 返回:0.免费版 1.专业版 2.企业版 -1.获取失败 +def get_auth_state(): + try: + softList = get_plugin_list() + if softList['ltd'] > -1: + return 2 + elif softList['pro'] > -1: + return 1 + else: + return 0 + except: + return -1 + +#执行插件方法(插件名,方法名,参数) +def plugin_run(plugin_name, def_name, args): + if not plugin_name or not def_name: return public.returnMsg(False,'插件名称和插件方法名称不能为空!') + if not path_check(plugin_name) or not path_check(def_name): return public.returnMsg(False,'插件名或方法名不能包含特殊符号!') + p_path = public.get_plugin_path(plugin_name) + if not os.path.exists(p_path + '/index.php') and not os.path.exists(p_path + '/%s_main.py' % plugin_name): return public.returnMsg(False,'插件不存在!') + + is_php = os.path.exists(p_path + '/index.php') + if not is_php: + sys.path.append(p_path) + plugin_main = __import__(plugin_name + '_main') + try: + if sys.version_info[0] == 2: + reload(plugin_main) + else: + from imp import reload + reload(plugin_main) + except: + pass + plu = eval('plugin_main.' + plugin_name + '_main()') + if not hasattr(plu, def_name): + return public.returnMsg(False,'在[%s]插件中找不到[%s]方法' % (plugin_name,def_name)) + + if 'plugin_get_object' in args and args.plugin_get_object == 1: + if not is_php: + return getattr(plu, def_name) + else: + return None + else: + if not is_php: + data = eval('plu.' + def_name + '(args)') + else: + import panelPHP + args.s = def_name + args.name = plugin_name + data = panelPHP.panelPHP(plugin_name).exec_php_script(args) + return data + +#执行模块方法(模块名,方法名,参数) +def module_run(mod_name, def_name, args): + if not mod_name or not def_name: return public.returnMsg(False,'模块名称和模块方法名称不能为空!') + if not path_check(mod_name) or not path_check(def_name): return public.returnMsg(False,'模块名或方法名不能包含特殊符号!') + + if 'model_index' in args: + if args.model_index: + mod_file = "{}/{}Model/{}Model.py".format(public.get_class_path(),args.model_index,mod_name) + else: + mod_file = "{}/projectModel/{}Model.py".format(public.get_class_path(),mod_name) + else: + module_list = get_module_list() + for module_dir in module_list: + mod_file = "{}/{}/{}Model.py".format(public.get_class_path(),module_dir,mod_name) + if os.path.exists(mod_file): break + + if not os.path.exists(mod_file): + return public.returnMsg(False,'模块[%s]不存在' % mod_name) + + def_object = public.get_script_object(mod_file) + if not def_object: return public.returnMsg(False,'模块[%s]不存在!' % mod_name) + try: + run_object = getattr(def_object.main(),def_name,None) + except: + return public.returnMsg(False,'模块入口实例化失败' % mod_name) + if not run_object: return public.returnMsg(False,'在[%s]模块中找不到[%s]方法' % (mod_name,def_name)) + if 'module_get_object' in args and args.module_get_object == 1: + return run_object + result = run_object(args) + return result + +#获取模块文件夹列表 +def get_module_list(): + list = [] + class_path = public.get_class_path() + f_list = os.listdir(class_path) + for fname in f_list: + f_path = class_path+'/'+fname + if os.path.isdir(f_path) and len(fname) > 6 and fname.find('.') == -1 and fname.find('Model') != -1: + list.append(fname) + return list + +#检查路径是否合法 +def path_check(path): + list = ["./","..",",",";",":","?","'","\"","<",">","|","\\","\n","\r","\t","\b","\a","\f","\v","*","%","&","$","#","@","!","~","`","^","(",")","+","=","{","}","[","]"] + for i in path: + if i in list: + return False + return True diff --git a/wiki/files/win/pluginAuth.py b/wiki/files/win/pluginAuth.py deleted file mode 100644 index d16a175..0000000 --- a/wiki/files/win/pluginAuth.py +++ /dev/null @@ -1,60 +0,0 @@ -#coding: utf-8 -import public,os,sys,json - -class Plugin: - name = False - p_path = None - is_php = False - plu = None - __api_root_url = 'https://api.bt.cn' - __api_url = __api_root_url+ '/wpanel/get_plugin_list' - __cache_file = 'data/plugin_list.json' - - def __init__(self, name): - self.name = name - self.p_path = public.get_plugin_path(name) - self.is_php = os.path.exists(self.p_path + '/index.php') - - def get_plugin_list(self, force = False): - if force==False and os.path.exists(self.__cache_file): - jsonData = public.readFile(self.__cache_file) - softList = json.loads(jsonData) - else: - try: - jsonData = public.HttpGet(self.__api_url) - except Exception as ex: - raise public.error_conn_cloud(str(ex)) - softList = json.loads(jsonData) - if type(softList)!=dict or 'list' not in softList: raise Exception('云端插件列表获取失败') - public.writeFile(self.__cache_file, jsonData) - - return softList - - def isdef(self, fun): - if not self.is_php: - sys.path.append(self.p_path) - plugin_main = __import__(self.name + '_main') - try: - from imp import reload - reload(plugin_main) - except: - pass - self.plu = eval('plugin_main.' + self.name + '_main()') - if not hasattr(self.plu, fun): - if self.name == 'btwaf' and fun == 'index': - raise Exception("未购买") - return False - return True - - def exec_fun(self, args): - fun = args.s - if not self.is_php: - plu = self.plu - data = eval('plu.' + fun + '(args)') - else: - import panelPHP - args.s = fun - args.name = self.name - data = panelPHP.panelPHP(self.name).exec_php_script(args) - return data - diff --git a/wiki/update.md b/wiki/update.md index 7bb169e..820788c 100644 --- a/wiki/update.md +++ b/wiki/update.md @@ -14,7 +14,7 @@ - 全局搜索替换 https://api.bt.cn => http://www.example.com -- 全局搜索替换 https://www.bt.cn/api/ => http://www.example.com/api/(需排除clearModel.py、ipsModel.py) +- 全局搜索替换 https://www.bt.cn/api/ => http://www.example.com/api/(需排除clearModel.py、scanningModel.py、ipsModel.py) - 全局搜索替换 http://download.bt.cn/install/update6.sh => http://www.example.com/install/update6.sh @@ -67,6 +67,10 @@ "check_panel_msg": check_panel_msg, + PluginLoader.daemon_task() + + PluginLoader.daemon_panel() + - 去除首页广告:BTPanel/static/js/index.js 文件删除最下面index.recommend_paid_version()这一行 - 去除内页广告:BTPanel/templates/default/layout.html 删除getPaymentStatus();这一行 diff --git a/wiki/updatewin.md b/wiki/updatewin.md index 00cbae7..d05f18b 100644 --- a/wiki/updatewin.md +++ b/wiki/updatewin.md @@ -8,11 +8,11 @@ Windows版宝塔由于加密文件太多,无法全部解密,因此无法做到全开源。 -- 删除pluginAuth.cp38-win_amd64.pyd,将win/pluginAuth.py复制到class文件夹 +- 删除PluginLoader.pyd,将win/PluginLoader.py复制到class文件夹 - 全局搜索替换 https://api.bt.cn => http://www.example.com -- 全局搜索替换 https://www.bt.cn/api/ => http://www.example.com/api/ +- 全局搜索替换 https://www.bt.cn/api/ => http://www.example.com/api/(需排除ipsModel.py) - 全局搜索替换 http://www.bt.cn/api/ => http://www.example.com/api/ @@ -50,7 +50,7 @@ Windows版宝塔由于加密文件太多,无法全部解密,因此无法做 - 去除面板日志上报:script/site_task.py 文件 - 删除最下面 logs_analysis() 这1行 + - 删除最下面 logs_analysis() 这1行 - 去除首页广告:BTPanel/static/js/index.js 文件删除最下面index.recommend_paid_version()这一行 @@ -72,5 +72,5 @@ Windows版宝塔由于加密文件太多,无法全部解密,因此无法做 删除 if not os.path.exists(self.sitePath + '/.htaccess') 这一行 - +- [可选]关闭自动生成访问日志:在 BTPanel/\_\_init\_\_.py 删除public.write_request_log()这一行