#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:
download_url = public.get_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('/www/server/php/' + v2 + '/sbin/php-fpm')
softInfo['status'] = os.path.exists('/tmp/php-cgi-'+v2+'.sock')
if not softInfo['fpm']: softInfo['status'] = True
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:
%s ' % (public.GetMsg("HAVE_ERR"),errorMsg.replace('\n','
')))
#上传插件包
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)