def internalerror(e): #if str(e).find('Permanent Redirect') != -1: return e public.submit_error() errorStr = public.ReadFile('./BTPanel/templates/' + public.GetConfigValue('template') + '/error.html') try: if not app.config['DEBUG']: errorStr = errorStr.format(public.getMsg('PAGE_ERR_500_TITLE'),public.getMsg('PAGE_ERR_500_H1'),public.getMsg('PAGE_ERR_500_P1'),public.getMsg('NAME'),public.getMsg('PAGE_ERR_HELP')) else: errorStr = errorStr.format(public.getMsg('PAGE_ERR_500_TITLE'),str(e),'<pre>'+public.get_error_info() + '</pre>','以上调试信息仅在开发者模式显示','版本号: ' + public.version()) except IndexError:pass return errorStr,500
def panel_other(name=None,fun = None,stype=None): if not name: name = 'coll' if not public.path_safe_check("%s/%s/%s" % (name,fun,stype)): return abort(404) if name.find('./') != -1 or not re.match("^[\w-]+$",name): return abort(404) if not name: return public.returnJson(False,public.GetMsg("PLUGIN_INPUT_A")),json_header p_path = '/www/server/panel/plugin/' + name if not os.path.exists(p_path): return abort(404) #是否响插件应静态文件 if fun == 'static': if stype.find('./') != -1 or not os.path.exists(p_path + '/static'): return abort(404) s_file = p_path + '/static/' + stype if s_file.find('..') != -1: return abort(404) if not re.match("^[\w\./-]+$",s_file): return abort(404) if not public.path_safe_check(s_file): return abort(404) if not os.path.exists(s_file): return abort(404) return send_file(s_file,conditional=True,add_etags=True) #准备参数 args = get_input(); args.client_ip = public.GetClientIp(); if not fun: fun = 'index.html' if not stype: tmp = fun.split('.') fun = tmp[0] if len(tmp) == 1: tmp.append('') stype = tmp[1] args.fun = fun #初始化插件对象 try: is_php = os.path.exists(p_path + '/index.php') if not is_php: sys.path.append(p_path); plugin_main = __import__(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.' + name + '_main()') if not hasattr(plu,fun): return public.returnJson(False,'SPECIFY_METHOD'),json_header #检查访问权限 comReturn = comm.local() if comReturn: if not is_php: if not hasattr(plu,'_check'): session.clear() return public.returnJson(False,'SPECIFY_PLUG_ERR'),json_header checks = plu._check(args) r_type = type(checks) if r_type == Response: return checks if r_type != bool or not checks: return public.getJson(checks),json_header #初始化面板数据 comm.setSession() comm.init() comm.checkWebType() comm.GetOS() import panelPlugin plugins = panelPlugin.panelPlugin() args.name = name if not plugins.check_accept(args): return public.returnMsg(False,public.to_string([24744, 26410, 36141, 20080, 91, 37, 115, 93, 25110, 25480, 26435, 24050, 21040, 26399, 33]) % (plugins.get_title_byname(args),)) #执行插件方法 if not is_php: data = eval('plu.'+fun+'(args)') else: import panelPHP args.s = fun args.name = name data = panelPHP.panelPHP(name).exec_php_script(args) r_type = type(data) if r_type == Response: return data #处理响应 if stype == 'json': #响应JSON return public.getJson(data),json_header elif stype == 'html': #使用模板 t_path_root = p_path + '/templates/' t_path = t_path_root + fun + '.html' if not os.path.exists(t_path): return public.returnJson(False,public.GetMsg("SPECIFY_TEMPLATE")), json_header t_body = public.readFile(t_path) #处理模板包含 rep = '{%\s?include\s"(.+)"\s?%}' includes = re.findall(rep,t_body) for i_file in includes: filename = p_path + '/templates/' + i_file i_body = 'ERROR: File '+filename+' does not exists.' if os.path.exists(filename): i_body = public.readFile(filename) t_body = re.sub(rep.replace('(.+)',i_file),i_body,t_body) return render_template_string(t_body,data = data) else: #直接响应插件返回值,可以是任意flask支持的响应类型 r_type = type(data) if r_type == dict: return public.returnJson(False,public.GetMsg("RETURN_TYPE_ERR") + '[%s]' % r_type), json_header return data except: error_info = public.get_error_info() public.submit_error(error_info) return error_info.replace('\n','<br>\n')