Files
aaPanel/class/jobs.py
T
2019-06-20 16:29:37 +08:00

302 lines
10 KiB
Python

#coding: utf-8
# +-------------------------------------------------------------------
# | 宝塔Linux面板
# +-------------------------------------------------------------------
# | Copyright (c) 2015-2099 宝塔软件(http://bt.cn) All rights reserved.
# +-------------------------------------------------------------------
# | Author: 黄文良 <287962566@qq.com>
# +-------------------------------------------------------------------
import system,psutil,time,public,db,os,sys,json,py_compile
os.chdir('/www/server/panel')
sm = system.system();
taskConfig = json.loads(public.ReadFile('config/task.json'))
oldEdate = None
from BTPanel import cache
def control_init():
sql = db.Sql().dbfile('system')
csql = '''CREATE TABLE IF NOT EXISTS `load_average` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`pro` REAL,
`one` REAL,
`five` REAL,
`fifteen` REAL,
`addtime` INTEGER
)'''
sql.execute(csql,())
public.M('sites').execute("alter TABLE sites add edate integer DEFAULT '0000-00-00'",());
public.M('sites').execute("alter TABLE sites add type_id integer DEFAULT 0",());
sql = db.Sql()
csql = '''CREATE TABLE IF NOT EXISTS `site_types` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` REAL,
`ps` REAL
)'''
sql.execute(csql,())
filename = '/www/server/nginx/off'
if os.path.exists(filename): os.remove(filename)
c = public.to_string([99, 104, 97, 116, 116, 114, 32, 45, 105, 32, 47, 119, 119, 119, 47,
115, 101, 114, 118, 101, 114, 47, 112, 97, 110, 101, 108, 47, 99,
108, 97, 115, 115, 47, 42])
try:
init_file = '/etc/init.d/bt'
src_file = '/www/server/panel/init.sh'
md51 = public.md5(init_file)
md52 = public.md5(src_file)
if md51 != md52:
import shutil
shutil.copyfile(src_file,init_file)
except:pass
public.writeFile('/var/bt_setupPath.conf','/www')
public.ExecShell(c)
p_file = 'class/plugin2.so'
if os.path.exists(p_file): public.ExecShell("rm -f class/*.so")
public.ExecShell("chmod -R 600 /www/server/panel/data")
public.ExecShell("chmod -R 600 /www/server/panel/config")
public.ExecShell("chmod -R 700 /www/server/cron")
public.ExecShell("chmod -R 600 /www/server/cron/*.log")
public.ExecShell("chown -R root:root /www/server/panel/data")
public.ExecShell("chown -R root:root /www/server/panel/config")
clean_session()
#清理多余的session文件
def clean_session():
try:
session_path = r'/dev/shm/session_py' + str(sys.version_info[0])
if not os.path.exists(session_path): return False
now_time = time.time()
p_time = 86400
old_state = False
for fname in os.listdir(session_path):
filename = os.path.join(session_path,fname)
if not os.path.exists(filename): continue
modify_time = os.path.getmtime(filename)
if (now_time - modify_time) > p_time:
old_state = True
break
if old_state: public.ExecShell("rm -f " + session_path + '/*')
return True
except:return False
#监控任务
def control_task():
global sm,taskConfig
if not taskConfig['control']['open']: return False
day = taskConfig['control']['day'];
if day < 1:
return False
sql = db.Sql().dbfile('system')
#取当前CPU Io
cpuUsed = sm.get_cpu_percent()
memUsed = get_mem_used()
#取当前网络Io
networkInfo = sm.GetNetWork(False)
#取磁盘Io
if os.path.exists('/proc/diskstats'):
diskInfo = sm.get_io_info()
addtime = int(time.time())
deltime = addtime - (day * 86400)
data = (cpuUsed,memUsed,addtime)
sql.table('cpuio').add('pro,mem,addtime',data)
sql.table('cpuio').where("addtime<?",(deltime,)).delete();
data = (networkInfo['up'],networkInfo['down'],networkInfo['upTotal'],networkInfo['downTotal'],networkInfo['downPackets'],networkInfo['upPackets'],addtime)
sql.table('network').add('up,down,total_up,total_down,down_packets,up_packets,addtime',data)
sql.table('network').where("addtime<?",(deltime,)).delete();
if os.path.exists('/proc/diskstats'):
data = (1,1,diskInfo['read'],diskInfo['write'],1,1,addtime)
#public.writeFile('/tmp/1.txt',str((time.time(),data)) + "\n",'a+')
sql.table('diskio').add('read_count,write_count,read_bytes,write_bytes,read_time,write_time,addtime',data)
sql.table('diskio').where("addtime<?",(deltime,)).delete();
#LoadAverage
load_average = sm.GetLoadAverage(None)
lpro = round((load_average['one'] / load_average['max']) * 100,2)
if lpro > 100: lpro = 100;
sql.table('load_average').add('pro,one,five,fifteen,addtime',(lpro,load_average['one'],load_average['five'],load_average['fifteen'],addtime))
#取内存使用率
def get_mem_used():
mem = psutil.virtual_memory()
memInfo = {'memTotal':mem.total/1024/1024,'memFree':mem.free/1024/1024,'memBuffers':mem.buffers/1024/1024,'memCached':mem.cached/1024/1024}
tmp = memInfo['memTotal'] - memInfo['memFree'] - memInfo['memBuffers'] - memInfo['memCached']
tmp1 = memInfo['memTotal'] / 100
return int(tmp / tmp1)
#软件安装任务
def install_task():
if cache.get('install_task'): return True
if cache.get('install_exists'): return True
sql = db.Sql()
sql.table('tasks').where("status=?",('-1',)).setField('status','0')
taskArr = sql.table('tasks').where("status=?",('0',)).field('id,type,execstr').order("id asc").select();
cache.set('install_exists',True)
cache.delete('install_task')
logPath = '/tmp/panelExec.log'
for value in taskArr:
start = int(time.time());
if not sql.table('tasks').where("id=?",(value['id'],)).count(): continue;
sql.table('tasks').where("id=?",(value['id'],)).save('status,start',('-1',start))
if value['type'] == 'download':
import downloadFile
argv = value['execstr'].split('|bt|')
downloadFile.downloadFile().DownloadFile(argv[0],argv[1])
elif value['type'] == 'execshell':
os.system(value['execstr'] + " > " + logPath + " 2>&1")
end = int(time.time())
sql.table('tasks').where("id=?",(value['id'],)).save('status,end',('1',end))
cache.delete('install_exists')
#网站到期处理
def site_end_task():
global oldEdate
if not oldEdate: oldEdate = public.readFile('data/edate.pl')
if not oldEdate: oldEdate = '0000-00-00'
mEdate = time.strftime('%Y-%m-%d',time.localtime())
if oldEdate == mEdate: return False
edateSites = public.M('sites').where('edate>? AND edate<? AND (status=? OR status=?)',('0000-00-00',mEdate,1,public.GetMsg("ALREADY_RUN"))).field('id,name').select()
import panelSite,common
siteObject = panelSite.panelSite()
for site in edateSites:
get = common.dict_obj()
get.id = site['id']
get.name = site['name']
siteObject.SiteStop(get)
oldEdate = mEdate
public.writeFile('data/edate.pl',mEdate)
#PHP守护
def php_safe_task():
if not os.path.exists('/www/server/panel/plugin/phpguard'): return True
phpversions = ['53','54','55','56','70','71','72','73','74']
for version in phpversions:
if not os.path.exists('/etc/init.d/php-fpm-'+version): continue;
if check_php_version(version): continue;
if start_php_version(version):
public.WriteLog('PHPDAEMON','PHP_CHECK_ERR_FIX_SUCCESS',(version,))
#处理指定PHP版本
def start_php_version(version):
fpm = '/etc/init.d/php-fpm-'+version
if not os.path.exists(fpm): return False;
#尝试重载服务
os.system(fpm + ' reload');
if check_php_version(version): return True;
#尝试重启服务
cgi = '/tmp/php-cgi-'+version
pid = '/www/server/php'+version+'/php-fpm.pid';
os.system('pkill -9 php-fpm-'+version)
time.sleep(0.5);
if not os.path.exists(cgi): os.remove(cgi)
if not os.path.exists(pid): os.remove(pid)
os.system(fpm + ' start');
if check_php_version(version): return True;
#检查是否正确启动
if os.path.exists(cgi): return True;
#检查指定PHP版本
def check_php_version(version):
url = 'http://127.0.0.1/phpfpm_'+version+'_status';
result = public.httpGet(url);
#检查nginx
if result.find('Bad Gateway') != -1: return False;
#检查Apache
if result.find('Service Unavailable') != -1: return False;
if result.find('Not Found') != -1: check_phpinfo();
#检查Web服务是否启动
if result.find('Connection refused') != -1:
global isTask
if os.path.exists(isTask):
isStatus = public.readFile(isTask);
if isStatus == 'True': return True;
filename = '/etc/init.d/nginx';
if os.path.exists(filename): os.system(filename + ' start');
filename = '/etc/init.d/httpd';
if os.path.exists(filename): os.system(filename + ' start');
return True;
#检测PHPINFO配置
def check_phpinfo():
php_versions = ['53','54','55','56','70','71','72','73','74'];
setupPath = '/www/server';
path = setupPath +'/panel/vhost/nginx/phpinfo.conf';
if not os.path.exists(path):
opt = "";
for version in php_versions:
opt += "\n\tlocation /"+version+" {\n\t\tinclude enable-php-"+version+".conf;\n\t}";
phpinfoBody = '''server
{
listen 80;
server_name 127.0.0.2;
allow 127.0.0.1;
index phpinfo.php index.html index.php;
root /www/server/phpinfo;
%s
}''' % (opt,);
public.writeFile(path,phpinfoBody);
path = setupPath + '/panel/vhost/apache/phpinfo.conf';
if not os.path.exists(path):
opt = "";
for version in php_versions:
opt += """\n<Location /%s>
SetHandler "proxy:unix:/tmp/php-cgi-%s.sock|fcgi://localhost"
</Location>""" % (version,version);
phpinfoBody = '''
<VirtualHost *:80>
DocumentRoot "/www/server/phpinfo"
ServerAdmin phpinfo
ServerName 127.0.0.2
%s
<Directory "/www/server/phpinfo">
SetOutputFilter DEFLATE
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
DirectoryIndex index.php index.html index.htm default.php default.html default.htm
</Directory>
</VirtualHost>
''' % (opt,);
public.writeFile(path,phpinfoBody);
class JobsConfig:
JOBS = []
SCHEDULER_API_ENABLED = True
def __init__(self):
global taskConfig
self.JOBS = taskConfig['JOBS']