#coding: utf-8 #------------------------------------------------------------------- # 宝塔Linux面板 #------------------------------------------------------------------- # Copyright (c) 2015-2019 宝塔软件(http:#bt.cn) All rights reserved. #------------------------------------------------------------------- # Author: 黄文良 <287962566@qq.com> #------------------------------------------------------------------- import public,os,sys,json,time,psutil,py_compile from BTPanel import session,cache if sys.version_info[0] == 3: from importlib import reload class mget: pass; class panelPlugin: __isTable = None; __install_path = None; __tasks = None; __list = 'data/list.json' __type = 'data/type.json' __index = 'config/index.json' __link = 'config/link.json' __product_list = None __plugin_list = None pids = None ROWS = 15; def __init__(self): self.__install_path = 'plugin' #检查依赖 def check_deps(self,get): cacheKey = 'plugin_lib_list' if not 'force' in get: libList = cache.get(cacheKey) if libList: return libList libList = json.loads(public.readFile('config/lib.json')) centos = os.path.exists('/bin/yum') for key in libList.keys(): for i in range(len(libList[key])): checks = libList[key][i]['check'].split(',') libList[key][i]['status'] = False for check in checks: if os.path.exists(check): libList[key][i]['status'] = True break; libList[key][i]['version'] = "-" if libList[key][i]['status']: shellTmp = libList[key][i]['getv'].split(':D') shellEx = shellTmp[0] if len(shellTmp) > 1 and not centos: shellEx = shellTmp[1] libList[key][i]['version'] = public.ExecShell(shellEx)[0].strip() cache.set(cacheKey,libList,86400); return libList #检测关键目录是否可以被写入文件 def check_sys_write(self): test_file = '/etc/init.d/bt_10000100.pl' public.writeFile(test_file,'True') if os.path.exists(test_file): if public.readFile(test_file) == 'True': os.remove(test_file) return True os.remove(test_file) return False #检查互斥 def check_mutex(self,mutex): mutexs = mutex.split(',') for name in mutexs: pluginInfo = self.get_soft_find(name) if not pluginInfo: continue if pluginInfo['setup'] == True: return False return True #检查依赖 def check_dependnet(self,dependnet): if not dependnet: return True dependnets = dependnet.split(',') status = True; for dep in dependnets: if not dep: continue if dep.find('|') != -1: names = dep.split('|') for name in names: pluginInfo = self.get_soft_find(name) if pluginInfo['setup'] == True: status = True break else: status = False else: pluginInfo = self.get_soft_find(dep) if pluginInfo['setup'] != True: status = False break return status #检查CPU限制 def check_cpu_limit(self,cpuLimit): if psutil.cpu_count() < cpuLimit: return False return True #检查内存限制 def check_mem_limit(self,memLimit): if psutil.virtual_memory().total/1024/1024 < memLimit: return False return True #检查操作系统限制 def check_os_limit(self,osLimit): if osLimit == 0: return True if osLimit == 1: centos = os.path.exists('/usr/bin/yum') return centos elif osLimit == 2: debian = os.path.exists('/usr/bin/apt-get') return debian return True #安装插件 def install_plugin(self,get): if not self.check_sys_write(): return public.returnMsg(False,'CANT_WRITE_SYS_DIR') pluginInfo = self.get_soft_find(get.sName); p_node = '/www/server/panel/install/public.sh' if os.path.exists(p_node): if len(public.readFile(p_node)) < 100: os.remove(p_node) if not pluginInfo: return public.returnMsg(False,'INIT_PLUGIN_NOT_EXISTS') if not self.check_mutex(pluginInfo['mutex']): return public.returnMsg(False,'UNINSTALL_FIRST' , (pluginInfo['mutex'],)) if not hasattr(get,'id'): if not self.check_dependnet(pluginInfo['dependnet']): return public.returnMsg(False,'DEP_PAGE' , (pluginInfo['dependnet'],)) if 'version' in get: for versionInfo in pluginInfo['versions']: if versionInfo['m_version'] != get.version: continue if not self.check_cpu_limit(versionInfo['cpu_limit']): return public.returnMsg(False,'At least [{0}] CPU cores are required to install'.format(versionInfo['cpu_limit'])) if not self.check_mem_limit(versionInfo['mem_limit']): return public.returnMsg(False,'At least [{0} MB] memory is required to install'.format(versionInfo['mem_limit'])) if not self.check_os_limit(versionInfo['os_limit']): m_ps = {0:public.GetMsg("ALL"),1:"Centos",2:"Ubuntu/Debian"} return public.returnMsg(False,'ONLY_SUP_SYS' , (m_ps[int(versionInfo['os_limit'])],)) if not hasattr(get,'id'): if not self.check_dependnet(versionInfo['dependnet']): return public.returnMsg(False,'DEP_PAGE' , (versionInfo['dependnet'],)) if pluginInfo['type'] != 5: result = self.install_sync(pluginInfo,get) else: result = self.install_async(pluginInfo,get) try: if 'status' in result: if result['status']: public.httpPost(public.GetConfigValue('home') + '/api/panel/plugin_total',{"pid":pluginInfo['id'],'p_name':pluginInfo['name']},3) except:pass return result #同步安装 def install_sync(self,pluginInfo,get): if 'download' in pluginInfo['versions'][0]: tmp_path = '/www/server/panel/temp' if not os.path.exists(tmp_path): os.makedirs(tmp_path,mode=384); toFile = tmp_path + '/' + pluginInfo['name'] + '.zip' public.downloadFile('http://www.bt.cn/api/Pluginother/get_file?fname=' + pluginInfo['versions'][0]['download'],toFile) if public.FileMd5(toFile) != pluginInfo['versions'][0]['md5']: return public.returnMsg(False,'CHECK_FILE_HASH') update = False; if os.path.exists(pluginInfo['install_checks']): update =pluginInfo['versions'][0]['version_msg'] return self.update_zip(None,toFile,update); else: if not 'download_url' in session: session['download_url'] = 'http://download.bt.cn'; download_url = session['download_url'] + '/install/plugin/' + pluginInfo['name'] + '/install.sh'; toFile = '/tmp/%s.sh' % pluginInfo['name'] public.downloadFile(download_url,toFile); os.system('/bin/bash ' + toFile + ' install > /tmp/panelShell.pl'); if os.path.exists(pluginInfo['install_checks']): public.WriteLog('TYPE_SETUP','PLUGIN_INSTALL_LIB',(pluginInfo['title'],)); if os.path.exists(toFile): os.remove(toFile) return public.returnMsg(True,'PLUGIN_INSTALL_SUCCESS'); return public.returnMsg(False,'INSTALL_FAIL'); #异步安装 def install_async(self,pluginInfo,get): mtype = 'install'; mmsg = public.GetMsg("INSTALL") if hasattr(get, 'upgrade'): mtype = 'update' mmsg = 'upgrade' if not 'type' in get: get.type = '0' if int(get.type) > 3: get.type = '0' if get.sName == 'nginx': if get.version == '1.8': return public.returnMsg(False,'NOT_SUP_NG1.8') if get.sName.find('php-') != -1: get.sName = get.sName.split('-')[0] php_path = '/www/server/php' if not os.path.exists(php_path): os.makedirs(php_path) apacheVersion='false'; if public.get_webserver() == 'apache': apacheVersion = public.readFile('/www/server/apache/version.pl'); public.writeFile('/var/bt_apacheVersion.pl',apacheVersion) public.writeFile('/var/bt_setupPath.conf','/www') if os.path.exists('/usr/bin/apt-get'): get.type = '3' execstr = "cd /www/server/panel/install && /bin/bash install_soft.sh " + get.type + " "+mtype+" " + get.sName + " "+ get.version; public.M('tasks').add('id,name,type,status,addtime,execstr',(None, mmsg + '['+get.sName+'-'+get.version+']','execshell','0',time.strftime('%Y-%m-%d %H:%M:%S'),execstr)) cache.delete('install_task') public.writeFile('/tmp/panelTask.pl','True') public.WriteLog('TYPE_SETUP','PLUGIN_ADD',(get.sName,get.version)); return public.returnMsg(True,'PLUGIN_INSTALL_ADD'); #卸载插件 def uninstall_plugin(self,get): pluginInfo = self.get_soft_find(get.sName); if not pluginInfo: return public.returnMsg(False,'INIT_PLUGIN_NOT_EXISTS') if pluginInfo['type'] != 5: pluginPath = self.__install_path + '/' + pluginInfo['name'] if pluginInfo['type'] != 6: download_url = session['download_url'] + '/install/plugin/' + pluginInfo['name'] + '/install.sh' toFile = '/tmp/%s.sh' % pluginInfo['name'] public.downloadFile(download_url,toFile) if os.path.exists(toFile): if os.path.getsize(toFile) > 100: os.system('/bin/bash ' + toFile + ' uninstall') if os.path.exists(pluginPath + '/install.sh'): os.system('/bin/bash ' + pluginPath + '/install.sh uninstall'); if os.path.exists(pluginPath): os.system('rm -rf ' + pluginPath) public.WriteLog('TYPE_SETUP','PLUGIN_UNINSTALL_SOFT',(pluginInfo['title'],)); return public.returnMsg(True,'PLUGIN_UNINSTALL'); else: if pluginInfo['name'] == 'mysql': if public.M('databases').count() > 0: return public.returnMsg(False,"RM_DB_WARN") get.type = '0' issue = public.readFile('/etc/issue') if session['server_os']['x'] != 'RHEL': get.type = '3' get.sName = get.sName.lower() if get.sName.find('php-') != -1: get.sName = get.sName.split('-')[0] execstr = "cd /www/server/panel/install && /bin/bash install_soft.sh "+get.type+" uninstall " + get.sName.lower() + " "+ get.version.replace('.',''); os.system(execstr); public.WriteLog('TYPE_SETUP','PLUGIN_UNINSTALL',(get.sName,get.version)); return public.returnMsg(True,"PLUGIN_UNINSTALL"); #从云端取列表 def get_cloud_list(self,get=None): lcoalTmp = 'data/plugin.json' softList = None listTmp = public.readFile(lcoalTmp) try: if listTmp: softList = json.loads(listTmp) except: if os.path.exists(lcoalTmp): os.remove(lcoalTmp) focre = 0 if hasattr(get,'force'): focre = int(get.force) if 'focre_cloud' in session: if session['focre_cloud']: focre = 1 session['focre_cloud'] = False if not 'init_cloud' in session: focre = 1 session['init_cloud'] = True if not softList or focre > 0: self.clean_panel_log() cloudUrl = 'http://www.bt.cn/api/panel/get_soft_list_en' import panelAuth pdata = panelAuth.panelAuth().create_serverid(None) listTmp = public.httpPost(cloudUrl,pdata,10) if len(listTmp) < 200: listTmp = public.readFile(lcoalTmp) try: softList = json.loads(listTmp) except: pass if softList: public.writeFile(lcoalTmp,json.dumps(softList)) public.ExecShell('rm -f /tmp/bmac_*') self.getCloudPHPExt(get) try: public.writeFile("/tmp/" + cache.get('p_token'),str(softList['pro'])) except:pass sType = 0 if hasattr(get,'type'): sType = int(get['type']) softList['list'] = self.get_local_plugin(softList['list']) softList['list'] = self.get_types(softList['list'],sType) if hasattr(get,'query'): if get.query: tmpList = [] for softInfo in softList['list']: if softInfo['name'].find(get.query) != -1 or softInfo['title'].find(get.query) != -1: tmpList.append(softInfo) softList['list'] = tmpList return softList #清除多余面板日志 def clean_panel_log(self): try: log_path = 'logs/request' if not os.path.exists(log_path): return False limit_num = 7 p_logs = sorted(os.listdir(log_path)) num = len(p_logs) - limit_num if num <= 0: return False for i in range(num): filename = log_path + '/' + p_logs[i] if not os.path.exists(filename): continue os.remove(filename) return True except:return False #取本地插件 def get_local_plugin(self,sList): localList = [] for name in os.listdir('plugin/'): isExists = False for softInfo in sList: if name == softInfo['name']: isExists = True break; if isExists: continue filename = 'plugin/' + name + '/info.json' if not os.path.exists(filename): continue tmpInfo = public.ReadFile(filename).strip() if not tmpInfo: continue try: info = json.loads(tmpInfo) except: continue pluginInfo = self.get_local_plugin_info(info) if not pluginInfo: continue sList.append(pluginInfo) return sList #检查是否正在安装 def check_setup_task(self,sName): if not self.__tasks: self.__tasks = public.M('tasks').where("status!=?",('1',)).field('status,name').select() if sName.find('php-') != -1: tmp = sName.split('-') sName = tmp[0] version = tmp[1] isTask = '1'; for task in self.__tasks: tmpt = public.getStrBetween('[',']',task['name']) if not tmpt:continue; tmp1 = tmpt.split('-'); name1 = tmp1[0].lower(); if sName == 'php': if name1 == sName and tmp1[1] == version: isTask = task['status']; else: if name1 == 'pure': name1 = 'pure-ftpd'; if name1 == sName: isTask = task['status']; return isTask #构造本地插件信息 def get_local_plugin_info(self,info): m_version = info['versions'].split(".") if len(m_version) < 2: return None if len(m_version) > 2: tmp = m_version.copy() del(tmp[0]) m_version[1] = '.'.join(tmp) try: if not 'author' in info: info['author'] = '未知' if not 'home' in info: info['home'] = '#' pluginInfo = { "id": 10000, "pid": 0, "type": 10, "price": 0, "author":info['author'], "home":info['home'], "name": info['name'], "title": info['title'], "panel_pro": 1, "panel_free": 1, "panel_test": 1, "ps": info['ps'], "version": info['versions'], "s_version": "0", "manager_version": "1", "c_manager_version": "1", "dependnet": "", "mutex": "", "install_checks": "/www/server/panel/plugin/" + info['name'], "uninsatll_checks": "/www/server/panel/plugin/" + info['name'], "compile_args": 0, "version_coexist": 0, "versions": [ { "m_version": m_version[0], "version": m_version[1], "dependnet": "", "mem_limit": 32, "cpu_limit": 1, "os_limit": 0, "setup": True } ], "setup": True, "status": True } except: pluginInfo = None return pluginInfo #处理分类 def get_types(self,sList,sType): if sType == 0: return sList newList = [] for sInfo in sList: if sInfo['type'] == sType: newList.append(sInfo) return newList #检查权限 def check_accept(self,get): import common args = common.dict_obj() args.type = '8' p_list = self.get_cloud_list(args) for p in p_list['list']: if p['name'] == get.name: if p_list['pro'] < 0 and p['endtime'] < 0: return False break args.type = '10' p_list = self.get_cloud_list(args) for p in p_list['list']: if p['name'] == get.name: if not 'endtime' in p: continue; if p['endtime'] < 0: return False break return True #取软件列表 def get_soft_list(self,get = None): softList = self.get_cloud_list(get) if not softList: get.force = 1 softList = self.get_cloud_list(get) if not softList: return public.returnMsg(False,'GET_SOFTLIST_FAIL',"401") softList['list'] = self.set_coexist(softList['list']) softList['list'] = self.get_page(softList['list'],get) softList['list']['data'] = self.check_isinstall(softList['list']['data']) softList['apache22'] = False softList['apache24'] = False check_version_path = '/www/server/apache/version_check.pl' if os.path.exists(check_version_path): softList['apache24'] = True if public.readFile(check_version_path).find('2.2') == 0: softList['apache22'] = True softList['apache24'] = False return softList #取首页软件列表 def get_index_list(self,get=None): softList = self.get_cloud_list(get)['list'] if not softList: get.force = 1 softList = self.get_cloud_list(get)['list'] if not softList: return public.returnMsg(False,'GET_SOFTLIST_FAIL',"401") softList = self.set_coexist(softList) if not os.path.exists(self.__index): public.writeFile(self.__index,'[]') indexList = json.loads(public.ReadFile(self.__index)) dataList = [] for index in indexList: for softInfo in softList: if softInfo['name'] == index: dataList.append(softInfo) dataList = self.check_isinstall(dataList) return dataList #添加到首页 def add_index(self,get): sName = get.sName if not os.path.exists(self.__index): public.writeFile(self.__index,'[]') indexList = json.loads(public.ReadFile(self.__index)) if sName in indexList: return public.returnMsg(False,'DONT_ADD_AGAIN') if len(indexList) >= 12: new_indexList = [] softList = self.get_cloud_list(get)['list'] for softInfo in softList: if softInfo['name'] in indexList: new_softInfo = self.check_status(softInfo) if not new_softInfo['setup']: indexList.remove(softInfo['name']) public.writeFile(self.__index,json.dumps(indexList)) if len(indexList) >= 12: return public.returnMsg(False,'HP_DIS_MOST') indexList.append(sName) public.writeFile(self.__index,json.dumps(indexList)) return public.returnMsg(True,'ADD_SUCCESS') #删除首页 def remove_index(self,get): sName = get.sName indexList = [] if not os.path.exists(self.__index): public.writeFile(self.__index,'[]') indexList = json.loads(public.ReadFile(self.__index)) if not sName in indexList: return public.returnMsg(True,'DEL_SUCCESS') indexList.remove(sName) public.writeFile(self.__index,json.dumps(indexList)) return public.returnMsg(True,'DEL_SUCCESS') #设置排序 def sort_index(self,get): indexList = get.ssort.split('|') public.writeFile(self.__index,json.dumps(indexList)) return public.returnMsg(True,'SET_SUCCESS') #取快捷软件列表 def get_link_list(self,get=None): softList = self.get_cloud_list(get)['list'] softList = self.set_coexist(softList) indexList = json.loads(public.ReadFile(self.__link)) dataList = [] for index in indexList: for softInfo in softList: if softInfo['name'] == index: dataList.append(softInfo) dataList = self.check_isinstall(dataList) return dataList #添加到快捷栏 def add_link(self,get): sName = get.sName indexList = json.loads(public.ReadFile(self.__link)) if sName in indexList: return public.returnMsg(False,'DONT_ADD_AGAIN') if len(indexList) >= 5: return public.returnMsg(False,'BAR_DIS_MOST') indexList.append(sName) public.writeFile(self.__link,json.dumps(indexList)) return public.returnMsg(True,'ADD_SUCCESS') #删除快捷栏 def remove_link(self,get): sName = get.sName indexList = [] indexList = json.loads(public.ReadFile(self.__link)) if sName in indexList: return public.returnMsg(True,'DEL_SUCCESS') indexList.remove(sName) public.writeFile(self.__link,json.dumps(indexList)) return public.returnMsg(True,'DEL_SUCCESS') #设置快捷栏排序 def sort_link(self,get): indexList = get.ssort.split('|') public.writeFile(self.__link,json.dumps(indexList)) return public.returnMsg(True,'SET_SUCCESS') #处理共存软件 def set_coexist(self,sList): softList = [] for sInfo in sList: if sInfo['version_coexist'] == 1: for versionA in sInfo['versions']: sTmp = sInfo.copy() v = versionA['m_version'].replace('.','') sTmp['title'] = sTmp['title']+'-'+versionA['m_version'] sTmp['name'] = sTmp['name']+'-'+versionA['m_version'] sTmp['version'] = sTmp['version'].replace('{VERSION}',v) sTmp['manager_version'] = sTmp['manager_version'].replace('{VERSION}',v) sTmp['install_checks'] = sTmp['install_checks'].replace('{VERSION}',v) sTmp['uninsatll_checks'] = sTmp['uninsatll_checks'].replace('{VERSION}',v) sTmp['s_version'] = sTmp['s_version'].replace('{VERSION}',v) sTmp['versions'] = [] sTmp['versions'].append(versionA) softList.append(sTmp) else: softList.append(sInfo) return softList #检测是否安装 def check_isinstall(self,sList): if not os.path.exists(self.__index): public.writeFile(self.__index,'[]') indexList = json.loads(public.ReadFile(self.__index)) for i in range(len(sList)): sList[i]['index_display'] = sList[i]['name'] in indexList sList[i] = self.check_status(sList[i]) return sList #检查软件状态 def check_status(self,softInfo): softInfo['setup'] = os.path.exists(softInfo['install_checks']) softInfo['status'] = False softInfo['task'] = self.check_setup_task(softInfo['name']) if softInfo['name'].find('php-') != -1: softInfo['fpm'] = False if softInfo['setup']: softInfo['shell'] = softInfo['version'] softInfo['version'] = self.get_version_info(softInfo) softInfo['status'] = True softInfo['versions'] = self.tips_version(softInfo['versions'],softInfo['version']) softInfo['admin'] = os.path.exists('/www/server/panel/plugin/' + softInfo['name']) if len(softInfo['s_version']) > 3: pNames = softInfo['s_version'].split(',') for pName in pNames: if len(softInfo['manager_version']) > 5: softInfo['status'] = self.process_exists(pName,softInfo['manager_version']) else: softInfo['status'] = self.process_exists(pName) if softInfo['status']: break else: softInfo['version'] = "" if softInfo['version_coexist'] == 1: self.get_icon(softInfo['name'].split('-')[0]) else: if 'min_image' in softInfo: self.get_icon(softInfo['name'],softInfo['min_image']) else: self.get_icon(softInfo['name']) if softInfo['name'].find('php-') != -1: v2= softInfo['versions'][0]['m_version'].replace('.','') softInfo['fpm'] = os.path.exists('/etc/init.d/php-fpm-' + v2) softInfo['status'] = os.path.exists('/tmp/php-cgi-'+v2+'.sock') if softInfo['name'] == 'mysql': softInfo['status'] = self.process_exists('mysqld') if softInfo['name'] == 'phpmyadmin': softInfo['status'] = self.get_phpmyadmin_stat() return softInfo #取phpmyadmin状态 def get_phpmyadmin_stat(self): if public.get_webserver() == 'nginx': filename = public.GetConfigValue('setup_path') + '/nginx/conf/nginx.conf'; else: filename = public.GetConfigValue('setup_path') + '/apache/conf/extra/httpd-vhosts.conf'; if not os.path.exists(filename): return False conf = public.readFile(filename) if not conf: return False return conf.find('/www/server/stop') == -1 #获取指定软件信息 def get_soft_find(self,get = None): softList = self.get_cloud_list(get)['list'] softList = self.set_coexist(softList) try: sName = get['sName'] except: sName = get for softInfo in softList: if softInfo['name'] == sName: if sName == 'phpmyadmin': softInfo['ext'] = self.getPHPMyAdminStatus() return self.check_status(softInfo) return False #获取版本信息 def get_version_info(self,sInfo): version = '' vFile1 = sInfo['uninsatll_checks'] + '/version_check.pl' vFile2 = sInfo['uninsatll_checks'] + '/info.json' if os.path.exists(vFile1): version = public.ReadFile(vFile1).strip() if not version: os.remove(vFile1) elif os.path.exists(vFile2): v_tmp = public.ReadFile(vFile2).strip() if v_tmp: try: version = json.loads(v_tmp)['versions'] except: public.ExecShell('rm -f ' + vFile2) else: version = "1.0" else: exec_args = { 'nginx':"/www/server/nginx/sbin/nginx -v 2>&1|grep version|awk '{print $3}'|cut -f2 -d'/'", 'apache':"/www/server/apache/bin/httpd -v|grep version|awk '{print $3}'|cut -f2 -d'/'", 'mysql':"/www/server/mysql/bin/mysql -V|grep Ver|awk '{print $5}'|cut -f1 -d','", 'php':"/www/server/php/{VERSION}/bin/php -v|grep cli|awk '{print $2}'", 'pureftpd':"cat /www/server/pure-ftpd/version.pl", 'phpmyadmin':"cat /www/server/phpmyadmin/version.pl", 'tomcat':"/www/server/tomcat/bin/version.sh|grep version|awk '{print $4}'|cut -f2 -d'/'", 'memcached':"/usr/local/memcached/bin/memcached -V|awk '{print $2}'", 'redis':"/www/server/redis/src/redis-server -v|awk '{print $3}'|cut -f2 -d'='", 'gitlab':'echo "8.8.5"' } exec_str = '' if sInfo['name'] in exec_args: exec_str = exec_args[sInfo['name']] if sInfo['version_coexist'] == 1: v_tmp = sInfo['name'].split('-') exec_str = exec_args[v_tmp[0]].replace('{VERSION}',v_tmp[1].replace('.','')) version = public.ExecShell(exec_str)[0].strip() if version: public.writeFile(vFile1,version) if sInfo['name'] == 'mysql': vFile3 = sInfo['uninsatll_checks'] + '/version.pl' if os.path.exists(vFile3): version_str = public.readFile(vFile3) if version_str.find('AliSQL') != -1: version = 'AliSQL' if version == 'Linux': version = version_str public.writeFile(vFile1,version) if sInfo['name'] == 'nginx': if version.find('2.2.') != -1: version = '-Tengine' + version return version.replace('p1','') #标记当前安装的版本 def tips_version(self,versions,version): if len(versions) == 1: versions[0]['setup'] = True; return versions for i in range(len(versions)): if version == (versions[i]['m_version'] + '.' + versions[i]['version']): versions[i]['setup'] = True continue; vTmp = versions[i]['m_version'].split('_') if len(vTmp) > 1: vTmp = vTmp[1] else: vTmp = vTmp[0] vLen = len(vTmp) versions[i]['setup'] = (version[:vLen] == vTmp) return versions #进程是否存在 def process_exists(self,pname,exe = None): try: if not self.pids: self.pids = psutil.pids() for pid in self.pids: try: p = psutil.Process(pid) if p.name() == pname: if not exe: return True; else: if p.exe() == exe: return True except:pass return False except: return True #取分页 def get_page(self,data,get): #包含分页类 import page #实例化分页类 page = page.Page(); info = {} info['count'] = len(data) info['row'] = self.ROWS; info['p'] = 1 if hasattr(get,'p'): info['p'] = int(get['p']) info['uri'] = {} info['return_js'] = '' if hasattr(get,'tojs'): info['return_js'] = get.tojs #获取分页数据 result = {} result['page'] = page.GetPage(info) n = 0; result['data'] = []; for i in range(info['count']): if n >= page.ROW: break; if i < page.SHIFT: continue; n += 1; result['data'].append(data[i]); return result; #取列表 def GetList(self,get = None): try: if not os.path.exists(self.__list): return []; data = json.loads(public.readFile(self.__list)); #排序 data = sorted(data, key= lambda b:b['sort'],reverse=False); #获取非划分列表 n = 0; for dirinfo in os.listdir(self.__install_path): isTrue = True for tm in data: if tm['name'] == dirinfo: isTrue = False if not isTrue: continue; path = self.__install_path + '/' + dirinfo if os.path.isdir(path): jsonFile = path + '/info.json' if os.path.exists(jsonFile): try: tmp = json.loads(public.readFile(jsonFile)) if not hasattr(get,'type'): get.type = 0; else: get.type = int(get.type) if get.type > 0: try: if get.type != tmp['id']: continue; except: continue; tmp['pid'] = len(data) + 1000 + n tmp['status'] = tmp['display']; tmp['display'] = 0; data.append(tmp) except: pass #索引列表 if get: display = None if hasattr(get,'display'): display = True; if not hasattr(get,'type'): get.type = 0; else: get.type = int(get.type) if not hasattr(get,'search'): search = None m = 0 else: search = get.search.encode('utf-8').lower(); m = 1 tmp = []; for d in data: self.get_icon(d['name']); if display: if d['display'] == 0: continue; i=0; if get.type > 0: if get.type == d['id']: i+=1 else: i+=1 if search: if d['name'].lower().find(search) != -1: i+=1; if d['name'].find(search) != -1: i+=1; if d['title'].lower().find(search) != -1: i+=1; if d['title'].find(search) != -1: i+=1; if get.type > 0 and get.type != d['type']: i -= 1; if i>m:tmp.append(d); data = tmp; return data except Exception as ex: return str(ex); #获取图标 def get_icon(self,name,downFile = None): iconFile = 'BTPanel/static/img/soft_ico/ico-' + name + '.png' if not os.path.exists(iconFile): self.download_icon(name,iconFile,downFile) else: size = os.path.getsize(iconFile) if size == 0: self.download_icon(name,iconFile,downFile) #下载图标 def download_icon(self,name,iconFile,downFile): srcIcon = 'plugin/' + name + '/icon.png'; if os.path.exists(srcIcon): public.ExecShell("\cp -a -r " + srcIcon + " " + iconFile) else: if downFile: public.ExecShell('wget -O ' + iconFile + ' ' + public.GetConfigValue('home') + downFile + '&'); else: public.ExecShell('wget -O ' + iconFile + ' ' + public.get_url() + '/install/plugin/' + name + '/icon.png &'); #取分页 def GetPage(self,data,get): #包含分页类 import page #实例化分页类 page = page.Page(); info = {} info['count'] = len(data) info['row'] = self.ROWS; info['p'] = 1 if hasattr(get,'p'): info['p'] = int(get['p']) info['uri'] = {} info['return_js'] = '' if hasattr(get,'tojs'): info['return_js'] = get.tojs #获取分页数据 result = {} result['page'] = page.GetPage(info) n = 0; result['data'] = []; for i in range(info['count']): if n > page.ROW: break; if i < page.SHIFT: continue; n += 1; result['data'].append(data[i]); return result; #取分类 def GetType(self,get = None): try: if not os.path.exists(self.__type): return False; data = json.loads(public.readFile(self.__type)); return data except: return False; #取单个 def GetFind(self,name): try: data = self.GetList(None); for d in data: if d['name'] == name: return d; return None except: return None; #设置 def SetField(self,name,key,value): data = self.GetList(None); for i in range(len(data)): if data[i]['name'] != name: continue; data[i][key] = value; public.writeFile(self.__list,json.dumps(data)); return True; #安装插件 def install(self,get): pluginInfo = self.GetFind(get.name); if not pluginInfo: import json pluginInfo = json.loads(public.readFile(self.__install_path + '/' + get.name + '/info.json')); if pluginInfo['tip'] == 'lib': if not os.path.exists(self.__install_path + '/' + pluginInfo['name']): os.system('mkdir -p ' + self.__install_path + '/' + pluginInfo['name']); if not 'download_url' in session: session['download_url'] = 'http://download.bt.cn'; download_url = session['download_url'] + '/install/plugin/' + pluginInfo['name'] + '/install.sh'; toFile = self.__install_path + '/' + pluginInfo['name'] + '/install.sh'; public.downloadFile(download_url,toFile); os.system('/bin/bash ' + toFile + ' install'); if self.checksSetup(pluginInfo['name'],pluginInfo['checks'],pluginInfo['versions'])[0]['status'] or os.path.exists(self.__install_path + '/' + get.name): public.WriteLog('TYPE_SETUP','PLUGIN_INSTALL_LIB',(pluginInfo['title'],)); #os.system('rm -f ' + toFile); return public.returnMsg(True,'PLUGIN_INSTALL_SUCCESS'); return public.returnMsg(False,'PLUGIN_INSTALL_ERR'); else: import db,time path = '/www/server/php' if not os.path.exists(path): os.system("mkdir -p " + path); issue = public.readFile('/etc/issue') if session['server_os']['x'] != 'RHEL': get.type = '3' apacheVersion='false'; if public.get_webserver() == 'apache': apacheVersion = public.readFile('/www/server/apache/version.pl'); public.writeFile('/var/bt_apacheVersion.pl',apacheVersion) public.writeFile('/var/bt_setupPath.conf',public.GetConfigValue('root_path')) isTask = '/tmp/panelTask.pl' mtype = 'install'; mmsg = '安装'; if hasattr(get, 'upgrade'): if get.upgrade: mtype = 'update'; mmsg = 'upgrade'; execstr = "cd /www/server/panel/install && /bin/bash install_soft.sh " + get.type + " "+mtype+" " + get.name + " "+ get.version; sql = db.Sql() if hasattr(get,'id'): id = get.id; else: id = None; sql.table('tasks').add('id,name,type,status,addtime,execstr',(None, mmsg + '['+get.name+'-'+get.version+']','execshell','0',time.strftime('%Y-%m-%d %H:%M:%S'),execstr)) public.writeFile(isTask,'True') public.WriteLog('TYPE_SETUP','PLUGIN_ADD',(get.name,get.version)); return public.returnMsg(True,'PLUGIN_INSTALL'); #卸载插件 def unInstall(self,get): pluginInfo = self.GetFind(get.name); if not pluginInfo: import json pluginInfo = json.loads(public.readFile(self.__install_path + '/' + get.name + '/info.json')); if pluginInfo['tip'] == 'lib': if not os.path.exists(self.__install_path+ '/' + pluginInfo['name']): os.system('mkdir -p ' + self.__install_path + '/' + pluginInfo['name']); download_url = session['download_url'] + '/install/plugin/' + pluginInfo['name'] + '/install.sh'; toFile = self.__install_path + '/' + pluginInfo['name'] + '/uninstall.sh'; public.downloadFile(download_url,toFile) os.system('/bin/bash ' + toFile + ' uninstall') os.system('rm -rf ' + session['download_url'] + '/install/plugin/' + pluginInfo['name']) pluginPath = self.__install_path + '/' + pluginInfo['name'] if os.path.exists(pluginPath + '/install.sh'): os.system('/bin/bash ' + pluginPath + '/install.sh uninstall'); if os.path.exists(pluginPath): public.ExecShell('rm -rf ' + pluginPath); public.WriteLog('TYPE_SETUP','PLUGIN_UNINSTALL_SOFT',(pluginInfo['title'],)); return public.returnMsg(True,'PLUGIN_UNINSTALL'); else: get.type = '0' issue = public.readFile('/etc/issue') if session['server_os']['x'] != 'RHEL': get.type = '3' public.writeFile('/var/bt_setupPath.conf',public.GetConfigValue('root_path')) execstr = "cd /www/server/panel/install && /bin/bash install_soft.sh "+get.type+" uninstall " + get.name.lower() + " "+ get.version.replace('.',''); os.system(execstr); public.WriteLog('TYPE_SETUP','PLUGIN_UNINSTALL',(get.name,get.version)); return public.returnMsg(True,"PLUGIN_UNINSTALL"); #取产品信息 def getProductInfo(self,productName): if not self.__product_list: import panelAuth Auth = panelAuth.panelAuth(); self.__product_list = Auth.get_business_plugin(None); for product in self.__product_list: if product['name'] == productName: return product; return None; #取到期时间 def getEndDate(self,pluginName): if not self.__plugin_list: import panelAuth Auth = panelAuth.panelAuth(); tmp = Auth.get_plugin_list(None) if not tmp: return public.GetMsg("NOT_OPENED") if not 'data' in tmp: return public.GetMsg("NOT_OPENED") self.__plugin_list = tmp['data'] for pluinfo in self.__plugin_list: if pluinfo['product'] == pluginName: if not pluinfo['endtime'] or not pluinfo['state']: return public.GetMsg("WAITING_FOR_PAY") if pluinfo['endtime'] < time.time(): return public.GetMsg("EXPIRED") return time.strftime("%Y-%m-%d",time.localtime(pluinfo['endtime'])); return public.GetMsg("NOT_OPENED") #取插件列表 def getPluginList(self,get): import json arr = self.GetList(get); result = {} if not arr: result['data'] = arr; result['type'] = self.GetType(None); return result; apacheVersion = "" try: apavFile = '/www/server/apache/version.pl'; if os.path.exists(apavFile): apacheVersion = public.readFile(apavFile).strip(); except: pass; result = self.GetPage(arr,get); arr = result['data']; for i in range(len(arr)): arr[i]['end'] = '--'; #if 'price' in arr[i]: # if arr[i]['price'] > 0: # arr[i]['end'] = self.getEndDate(arr[i]['title']); # if os.path.exists('plugin/beta/config.conf'): # if os.path.exists('plugin/' + arr[i]['name'] + '/' + arr[i]['name'] + '_main.py') and arr[i]['end'] == '未开通': arr[i]['end'] = '--'; if arr[i]['name'] == 'php': if apacheVersion == '2.2': arr[i]['versions'] = '5.2,5.3,5.4'; arr[i]['update'] = self.GetPv(arr[i]['versions'], arr[i]['update']) elif apacheVersion == '2.4': arr[i]['versions'] = '5.3,5.4,5.5,5.6,7.0,7.1,7.2,7.3,7.4'; arr[i]['update'] = self.GetPv(arr[i]['versions'], arr[i]['update']) arr[i]['apache'] = apacheVersion; arr[i]['versions'] = self.checksSetup(arr[i]['name'].replace('_soft',''),arr[i]['checks'],arr[i]['versions']) try: arr[i]['update'] = arr[i]['update'].split(','); except: arr[i]['update'] = []; #是否强制使用插件模板 LIB_TEMPLATE if os.path.exists(self.__install_path+'/'+arr[i]['name']): arr[i]['tip'] = 'lib'; if arr[i]['tip'] == 'lib': arr[i]['path'] = self.__install_path + '/' + arr[i]['name'].replace('_soft',''); arr[i]['config'] = os.path.exists(arr[i]['path'] + '/index.html'); else: arr[i]['path'] = '/www/server/' + arr[i]['name'].replace('_soft',''); arr.append(public.M('tasks').where("status!=?",('1',)).count()); result['data'] = arr; result['type'] = self.GetType(None); return result; #GetPHPV def GetPv(self,versions,update): versions = versions.split(','); update = update.split(','); updates = []; for up in update: if up[:3] in versions: updates.append(up); return ','.join(updates); #保存插件排序 def savePluginSort(self,get): ssort = get.ssort.split('|'); data = self.GetList(None) l = len(data); for i in range(len(ssort)): if int(ssort[i]) > 1000: continue; for n in range(l): if data[n]['pid'] == int(ssort[i]): data[n]['sort'] = i; public.writeFile(self.__list,json.dumps(data)); return public.returnMsg(True,'PLUGIN_SORT'); #检查是否安装 def checksSetup(self,name,checks,vers = ''): tmp = checks.split(','); versions = []; path = '/www/server/' + name + '/version.pl'; v1 = ''; if os.path.exists(path): v1 = public.readFile(path).strip() if name == 'nginx': v1 = v1.replace('1.10', '1.12'); if not self.__tasks: self.__tasks = public.M('tasks').where("status!=?",('1',)).field('status,name').select() isStatus = 0; versArr = vers.split(','); for v in versArr: version = {} v2 = v; if name == 'php': v2 = v2.replace('.',''); status = False; for tm in tmp: if name == 'php': path = '/www/server/php/' + v2 if os.path.exists(path + '/bin/php') and not os.path.exists(path + '/version.pl'): public.ExecShell("echo `"+path+"/bin/php 2>/dev/null -v|grep cli|awk '{print $2}'` > " + path + '/version.pl') try: v1 = public.readFile(path+'/version.pl').strip(); if not v1: os.system('rm -f ' + path + '/version.pl'); except: v1 = ""; if os.path.exists(tm.replace('VERSION',v2)): status = True; else: if os.path.exists(tm) and isStatus == 0: if len(versArr) > 1: im = v1.find(v) if im != -1 and im < 3: status = True isStatus += 1; else: status = True isStatus += 1; #处理任务标记 if not self.__tasks: self.__tasks = public.M('tasks').where("status!=?",('1',)).field('status,name').select() isTask = '1'; for task in self.__tasks: tmpt = public.getStrBetween('[',']',task['name']) if not tmpt:continue; tmp1 = tmpt.split('-'); name1 = tmp1[0].lower(); if name == 'php': if name1 == name and tmp1[1] == v: isTask = task['status']; else: if name1 == 'pure': name1 = 'pure-ftpd'; if name1 == name: isTask = task['status']; infoFile = 'plugin/' + name + '/info.json' if os.path.exists(infoFile): try: tmps = json.loads(public.readFile(infoFile)); if tmps: v1 = tmps['versions']; except:pass; if name == 'memcached': if os.path.exists('/etc/init.d/memcached'): v1 = session.get('memcachedv') if not v1: v1 = public.ExecShell("memcached -V|awk '{print $2}'")[0].strip(); session['memcachedv'] = v1 if name == 'apache': if os.path.exists('/www/server/apache/bin/httpd'): v1 = session.get('httpdv') if not v1: v1 = public.ExecShell("/www/server/apache/bin/httpd -v|grep Apache|awk '{print $3}'|sed 's/Apache\///'")[0].strip(); session['httpdv'] = v1 #if name == 'mysql': # if os.path.exists('/www/server/mysql/bin/mysql'): v1 = public.ExecShell("mysql -V|awk '{print $5}'|sed 's/,//'")[0].strip(); version['status'] = status version['version'] = v; version['task'] = isTask; version['no'] = v1 versions.append(version); return self.checkRun(name,versions); #检查是否启动 def checkRun(self,name,versions): if name == 'php': path = '/www/server/php' for i in range(len(versions)): if versions[i]['status']: v4 = versions[i]['version'].replace('.','') versions[i]['run'] = os.path.exists('/tmp/php-cgi-' + v4 + '.sock'); versions[i]['fpm'] = os.path.exists('/etc/init.d/php-fpm-'+v4); phpConfig = self.GetPHPConfig(v4); versions[i]['max'] = phpConfig['max'] versions[i]['maxTime'] = phpConfig['maxTime'] versions[i]['pathinfo'] = phpConfig['pathinfo'] versions[i]['display'] = os.path.exists(path + '/' + v4 + '/display.pl'); if len(versions) < 5: versions[i]['run'] = True; elif name == 'nginx': status = False if os.path.exists('/etc/init.d/nginx'): pidf = '/www/server/nginx/logs/nginx.pid'; if os.path.exists(pidf): try: pid = public.readFile(pidf) pname = self.checkProcess(pid); if pname: status = True; except: status = False for i in range(len(versions)): versions[i]['run'] = False if versions[i]['status']: versions[i]['run'] = status elif name == 'apache': status = False if os.path.exists('/etc/init.d/httpd'): pidf = '/www/server/apache/logs/httpd.pid'; if os.path.exists(pidf): pid = public.readFile(pidf) status = self.checkProcess(pid); for i in range(len(versions)): versions[i]['run'] = False if versions[i]['status']: versions[i]['run'] = status elif name == 'mysql': status = os.path.exists('/tmp/mysql.sock') for i in range(len(versions)): versions[i]['run'] = False if versions[i]['status']: versions[i]['run'] = status elif name == 'tomcat': status = False if os.path.exists('/www/server/tomcat/logs/catalina-daemon.pid'): if self.getPid('jsvc'): status = True if not status: if self.getPid('java'): status = True for i in range(len(versions)): versions[i]['run'] = False if versions[i]['status']: versions[i]['run'] = status elif name == 'pure-ftpd': for i in range(len(versions)): pidf = '/var/run/pure-ftpd.pid' if os.path.exists(pidf): pid = public.readFile(pidf) versions[i]['run'] = self.checkProcess(pid) if not versions[i]['run']: os.system('rm -f ' + pidf) elif name == 'phpmyadmin': for i in range(len(versions)): if versions[i]['status']: versions[i] = self.getPHPMyAdminStatus(); elif name == 'redis': for i in range(len(versions)): pidf = '/var/run/redis_6379.pid' if os.path.exists(pidf): pid = public.readFile(pidf) versions[i]['run'] = self.checkProcess(pid) if not versions[i]['run']: os.system('rm -f ' + pidf) elif name == 'memcached': for i in range(len(versions)): pidf = '/var/run/memcached.pid' if os.path.exists(pidf): pid = public.readFile(pidf) versions[i]['run'] = self.checkProcess(pid) if not versions[i]['run']: os.system('rm -f ' + pidf) else: for i in range(len(versions)): if versions[i]['status']: versions[i]['run'] = True; return versions #取PHPMyAdmin状态 def getPHPMyAdminStatus(self): import re tmp = {} setupPath = '/www/server'; configFile = setupPath + '/nginx/conf/nginx.conf'; pauth = False pstatus = False phpversion = "54"; if os.path.exists(configFile): conf = public.readFile(configFile); rep = "listen\s+([0-9]+)\s*;"; rtmp = re.search(rep,conf); if rtmp: phpport = rtmp.groups()[0]; if conf.find('AUTH_START') != -1: pauth = True; if conf.find(setupPath + '/stop') == -1: pstatus = True; configFile = setupPath + '/nginx/conf/enable-php.conf'; if not os.path.exists(configFile): public.writeFile(configFile,public.readFile(setupPath + '/nginx/conf/enable-php-54.conf')); conf = public.readFile(configFile); rep = "php-cgi-([0-9]+)\.sock"; rtmp = re.search(rep,conf); if rtmp: phpversion = rtmp.groups()[0]; else: rep = "php-cgi.*\.sock"; public.writeFile(configFile,conf); phpversion = '54'; configFile = setupPath + '/apache/conf/extra/httpd-vhosts.conf'; if os.path.exists(configFile): conf = public.readFile(configFile); rep = "php-cgi-([0-9]+)\.sock"; rtmp = re.search(rep,conf); if rtmp: phpversion = rtmp.groups()[0]; rep = "Listen\s+([0-9]+)\s*\n"; rtmp = re.search(rep,conf); if rtmp: phpport = rtmp.groups()[0]; if conf.find('AUTH_START') != -1: pauth = True; if conf.find('/www/server/stop') == -1: pstatus = True; try: vfile = setupPath + '/phpmyadmin/version.pl'; if os.path.exists(vfile): tmp['version'] = public.readFile(vfile).strip(); tmp['status'] = True; tmp['no'] = tmp['version']; else: tmp['version'] = ""; tmp['status'] = False; tmp['no'] = ""; tmp['run'] = pstatus; tmp['phpversion'] = phpversion; tmp['port'] = phpport; tmp['auth'] = pauth; except Exception as ex: tmp['status'] = False; tmp['error'] = str(ex); return tmp; #取PHP配置 def GetPHPConfig(self,version): import re setupPath = '/www/server'; file = setupPath + "/php/"+version+"/etc/php.ini" phpini = public.readFile(file) file = setupPath + "/php/"+version+"/etc/php-fpm.conf" phpfpm = public.readFile(file) data = {} try: rep = "upload_max_filesize\s*=\s*([0-9]+)M" tmp = re.search(rep,phpini).groups() data['max'] = tmp[0] except: data['max'] = '50' try: rep = "request_terminate_timeout\s*=\s*([0-9]+)\n" tmp = re.search(rep,phpfpm).groups() data['maxTime'] = tmp[0] except: data['maxTime'] = 0 try: rep = u"\n;*\s*cgi\.fix_pathinfo\s*=\s*([0-9]+)\s*\n" tmp = re.search(rep,phpini).groups() if tmp[0] == '1': data['pathinfo'] = True else: data['pathinfo'] = False except: data['pathinfo'] = False return data #名取PID def getPid(self,pname): try: if not self.pids: self.pids = psutil.pids() for pid in self.pids: if psutil.Process(pid).name() == pname: return True; return False except: return True #检测指定进程是否存活 def checkProcess(self,pid): try: if not self.pids: self.pids = psutil.pids() if int(pid) in self.pids: return True return False; except: return False #获取配置模板 def getConfigHtml(self,get): filename = self.__install_path + '/' + get.name + '/index.html'; if not os.path.exists(filename): return public.returnMsg(False,'PLUGIN_GET_HTML'); srcBody = public.readFile(filename,'r') return srcBody #取插件信息 def getPluginInfo(self,get): try: pluginInfo = self.GetFind(get.name) apacheVersion = "" try: apavFile = '/www/server/apache/version.pl'; if os.path.exists(apavFile): apacheVersion = public.readFile(apavFile).strip(); except: pass; if pluginInfo['name'] == 'php': if apacheVersion == '2.2': pluginInfo['versions'] = '5.2,5.3,5.4'; elif apacheVersion == '2.4': pluginInfo['versions'] = '5.3,5.4,5.5,5.6,7.0,7.1,7.2,7.3,7.4'; pluginInfo['versions'] = self.checksSetup(pluginInfo['name'],pluginInfo['checks'],pluginInfo['versions']) if get.name == 'php': pluginInfo['phpSort'] = public.readFile('/www/server/php/sort.pl'); return pluginInfo except: return False #取插件状态 def getPluginStatus(self,get): find = self.GetFind(get.name); versions = []; path = '/www/server/php'; for version in find['versions'].split(','): tmp = {} tmp['version'] = version if get.name == 'php': tmp['status'] = os.path.exists(path + '/' + version.replace(',','') + '/display.pl') else: tmp['status'] = find['status']; versions.append(tmp); return versions #设置插件状态 def setPluginStatus(self,get): if get.name == 'php': isRemove = True path = '/www/server/php'; if get.status == '0': versions = self.GetFind(get.name)['versions'] os.system('rm -f ' + path + '/' + get.version.replace('.','') + '/display.pl'); for version in versions.split(','): if os.path.exists(path + '/' + version.replace('.','') + '/display.pl'): isRemove = False; break; else: public.writeFile(path + '/' + get.version.replace('.','') + '/display.pl','True'); if isRemove: self.SetField(get.name, 'display', int(get.status)) else: self.SetField(get.name, 'display', int(get.status)) return public.returnMsg(True,'SET_SUCCESS'); #从云端获取插件列表 def getCloudPlugin(self,get): if session.get('getCloudPlugin') and get != None: return public.returnMsg(True,'PLUGIN_UPDATE_ERR1',("-1",)); import json if not session.get('download_url'): session['download_url'] = 'http://download.bt.cn'; #获取列表 try: newUrl = public.get_url(); if os.path.exists('plugin/beta/config.conf'): download_url = newUrl + '/install/list.json' else: download_url = newUrl + '/install/list_pro.json' data = json.loads(public.httpGet(download_url)) session['download_url'] = newUrl; except: download_url = session['download_url'] + '/install/list_pro.json' data = json.loads(public.httpGet(download_url)) n = i = j = 0; lists = self.GetList(None); for i in range(len(data)): for pinfo in lists: if data[i]['name'] != pinfo['name']: continue; data[i]['display'] = pinfo['display'] if data[i]['default']: get.name = data[i]['name'] self.install(get) public.writeFile(self.__list,json.dumps(data)) #获取分类 try: download_url = session['download_url'] + '/install/type.json' types = json.loads(public.httpGet(download_url)) public.writeFile(self.__type,json.dumps(types)) except: pass; self.getCloudPHPExt(get) self.GetCloudWarning(get) session['getCloudPlugin'] = True return public.returnMsg(True,'PLUGIN_UPDATE') #刷新缓存 def flush_cache(self,get): self.getCloudPlugin(None) return public.returnMsg(True,'SOFTLIST_UPDATE_SUCCESS') #获取PHP扩展 def getCloudPHPExt(self,get): import json try: if not session.get('download_url'): session['download_url'] = 'http://download.bt.cn'; download_url = session['download_url'] + '/install/lib/phplib.json' tstr = public.httpGet(download_url) data = json.loads(tstr); if not data: return False; public.writeFile('data/phplib.conf',json.dumps(data)); return True; except: return False; #获取警告列表 def GetCloudWarning(self,get): import json if not session.get('download_url'): session['download_url'] = 'http://download.bt.cn'; download_url = session['download_url'] + '/install/warning.json' tstr = public.httpGet(download_url) data = json.loads(tstr); if not data: return False; wfile = 'data/warning.json'; wlist = json.loads(public.readFile(wfile)); for i in range(len(data['data'])): for w in wlist['data']: if data['data'][i]['name'] != w['name']: continue; data['data'][i]['ignore_count'] = w['ignore_count']; data['data'][i]['ignore_time'] = w['ignore_time']; public.writeFile(wfile,json.dumps(data)); return data; #名取标题 def get_title_byname(self,get): get.sName = get.name find = self.get_soft_find(get) return find['title'] #请求插件事件 def a(self,get): if not hasattr(get,'name'): return public.returnMsg(False,'PLUGIN_INPUT_A'); try: path = self.__install_path + '/' + get.name if not os.path.exists(path + '/'+get.name+'_main.py'): return public.returnMsg(False,'PLUGIN_INPUT_B'); if not self.check_accept(get):return public.returnMsg(False,public.to_string([24744, 26410, 36141, 20080, 91, 37, 115, 93, 25110, 25480, 26435, 24050, 21040, 26399, 33]) % (self.get_title_byname(get),)) sys.path.append(path); plugin_main = __import__(get.name+'_main'); try: reload(plugin_main) except: pass pluginObject = eval('plugin_main.' + get.name + '_main()'); if not hasattr(pluginObject,get.s): return public.returnMsg(False,'PLUGIN_INPUT_C',(get.s,)); execStr = 'pluginObject.' + get.s + '(get)' return eval(execStr); except Exception as ex: import traceback errorMsg = traceback.format_exc(); public.writeFile('logs/done.log',errorMsg) return public.returnMsg(False,'%s:<br> %s ' % (public.GetMsg("HAVE_ERR"),errorMsg.replace('\n','<br>'))) #上传插件包 def update_zip(self,get = None,tmp_file = None, update = False): tmp_path = '/www/server/panel/temp' if not os.path.exists(tmp_path): os.makedirs(tmp_path,mode=384) if tmp_file: if not os.path.exists(tmp_file): return public.returnMsg(False,'DOWNLOAD_FILE_FAIL') if get: public.ExecShell("rm -rf " + tmp_path + '/*') tmp_file = tmp_path + '/plugin_tmp.zip' from werkzeug.utils import secure_filename from flask import request f = request.files['plugin_zip'] if f.filename[-4:] != '.zip': tmp_file = tmp_path + '/plugin_tmp.tar.gz' f.save(tmp_file) import panelTask panelTask.bt_task()._unzip(tmp_file,tmp_path,'','/dev/null') os.remove(tmp_file) p_info = tmp_path + '/info.json' if not os.path.exists(p_info): d_path = None for df in os.walk(tmp_path): if len(df[2]) < 3: continue if not 'info.json' in df[2]: continue if not 'install.sh' in df[2]: continue if not os.path.exists(df[0] + '/info.json'): continue d_path = df[0] if d_path: tmp_path = d_path p_info = tmp_path + '/info.json' try: try: data = json.loads(public.ReadFile(p_info)) except: data = json.loads(public.ReadFile(p_info).decode('utf-8-sig')) data['size'] = public.get_path_size(tmp_path) if not 'author' in data: data['author'] = public.GetMsg("UNKNOW") if not 'home' in data: data['home'] = 'https://www.bt.cn/bbs/forum-40-1.html' plugin_path = '/www/server/panel/plugin/' + data['name'] + '/info.json' data['old_version'] = '0' data['tmp_path'] = tmp_path if os.path.exists(plugin_path): try: old_info = json.loads(public.ReadFile(plugin_path)) data['old_version'] = old_info['versions'] except:pass except: public.ExecShell("rm -rf " + tmp_path + '/*') return public.returnMsg(False,'CANT_FIND_PLU_IN_PACKAGE'); data['update'] = update return data #导入插件包 def input_zip(self,get): if not os.path.exists(get.tmp_path): return public.returnMsg(False,'TEM_FILE_NOT_EXIST!') plugin_path = '/www/server/panel/plugin/' + get.plugin_name if not os.path.exists(plugin_path): os.makedirs(plugin_path) public.ExecShell("\cp -a -r " + get.tmp_path + '/* ' + plugin_path + '/') public.ExecShell('chmod -R 600 ' + plugin_path) public.ExecShell('cd ' + plugin_path + ' && bash install.sh install') p_info = public.ReadFile(plugin_path + '/info.json') public.ExecShell("rm -rf /www/server/panel/temp/*") if p_info: public.WriteLog('TYPE_SOFT','INSTALL_THIRD_PARDY_PLUG' ,(json.loads(p_info)['title'],)) return public.returnMsg(True,'PLUGIN_INSTALL_SUCCESS') public.ExecShell("rm -rf " + plugin_path) return public.returnMsg(False,'INSTALL_FAIL') #导出插件包 def export_zip(self,get): plugin_path = '/www/server/panel/plugin/' + get.plugin_name if not os.path.exists(plugin_path): return public.returnMsg(False,'INIT_PLUGIN_NOT_EXISTS') get.sfile = plugin_path + '/' get.dfile = '/www/server/panel/temp/bt_plugin_' + get.plugin_name + '.zip' get.type = 'zip' import files files.files().Zip(get) if not os.path.exists(get.dfile): return public.returnMsg(False,'PLUG_EXPORT_FAIL') return public.returnMsg(True,get.dfile)