403Webshell
Server IP : 104.21.38.3  /  Your IP : 108.162.226.252
Web Server : Apache
System : Linux krdc-ubuntu-s-2vcpu-4gb-amd-blr1-01.localdomain 5.15.0-142-generic #152-Ubuntu SMP Mon May 19 10:54:31 UTC 2025 x86_64
User : www ( 1000)
PHP Version : 7.4.33
Disable Function : passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : ON
Directory :  /www/server/panel/class_v2/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /www/server/panel/class_v2/panel_restore_v2.py
# coding: utf-8
# -------------------------------------------------------------------
# aaPanel
# -------------------------------------------------------------------
# Copyright (c) 2015-2099 aaPanel(www.aapanel.com) All rights reserved.
# -------------------------------------------------------------------
# Author: zhwwen <[email protected]>
# -------------------------------------------------------------------
#
# ------------------------------
# 网站恢复
# ------------------------------
import public,os,files,sys
from time import sleep
from public.validate import Param
class panel_restore:

    _local_file = '/tmp/{}'
    _progress_file = '/tmp/restore_site.log'

    # def __init__(self):
    #     # 清空日志文件

    def _progress_rewrite(self,content,mothed='a+'):
        sleep(2)
        public.writeFile(self._progress_file,content+'\n',mothed)

    def _get_local_backup_path(self):
        local_backdir = public.M('config').field('backup_path').find()['backup_path']
        return local_backdir

    def _build_aws_backup_path(self,btype,file_name,domain):
        config_file = "/www/server/panel/plugin/aws_s3/config.conf"
        conf = public.readFile(config_file)
        backup_path = conf.split('|')[-1].strip()+btype+'/'+ domain + '/' + file_name
        return backup_path

    def _build_google_backup_path(self,btype,file_name,domain):
        object_name = 'bt_backup/{}/{}/{}'.format(btype,domain,file_name)
        return object_name

    def _get_backfile_method(self,filename):
        backup_info = public.M('backup').where("name=?", (filename,)).getField('filename')
        backup_info = backup_info.split('|')
        if len(backup_info) >= 3:
            method = backup_info[1]
        else:
            method = 'local'
        return method

    def _remove_old_website_file_to_trush(self,args):
        # 将原来目录移至回收站
        files.files().DeleteDir(args)

    def _get_website_info(self,site_id):
        site_name = public.M('sites').where("id=?",(site_id,)).getField('name')
        site_path = public.M('sites').where("id=?",(site_id,)).getField('path')
        return {'site_name':site_name,'site_path':site_path}

    def _restore_backup(self,local_backup_file_path,site_info,args):

        # 判断备份文件是否存在,如果不存在继续检查是否远程备份
        if not os.path.exists(local_backup_file_path):
            self._progress_rewrite('No backup file found: {}'.format(str(local_backup_file_path)))
            return public.return_message(-1, 0, public.lang("Panel does not find the backup file: {}",local_backup_file_path))
        # 将网站目录移至回收站
        self._progress_rewrite('Move the current website directory to the recycle bin: {}'.format(str(args.path)))
        self._remove_old_website_file_to_trush(args)
        if not os.path.exists(args.path):
            self._progress_rewrite('Create an empty directory for the site: {}'.format(str(args.path)))
            os.makedirs(site_info['site_path'])
        if 'zip' in args.file_name:
            uncompress_comand = 'unzip'
        else:
            uncompress_comand = 'tar -zxvf'
        self._progress_rewrite('The decompression command is: {}'.format(str(uncompress_comand)))
        self._progress_rewrite('Start to restore data......')
        public.ExecShell('cd {} && {} {} >> /tmp/restore_site.log'.format(site_info['site_path'], uncompress_comand, local_backup_file_path))
        if len(os.listdir(site_info['site_path'])) == 2:
            public.ExecShell('cd {s} && mv {s}/{d}/* .'.format(s=site_info['site_path'],d=site_info['site_name']))
            public.ExecShell('cd {s} && rmdir {d}'.format(s=site_info['site_path'],d=site_info['site_name']))
        # 将文件全新设置为644,文件夹设置为755
        self._progress_rewrite('Setting site permissions......')
        files.files().fix_permissions(args)

    def _download_aws_file(self,args,btype='site'):
        sys.path.append('/www/server/panel/plugin/aws_s3')
        import aws_s3_main
        aws3 = aws_s3_main.aws_s3_main()
        self._progress_rewrite('Building S3 download path...')
        download_file = self._build_aws_backup_path(btype,args.file_name,args.obj_name)
        self._progress_rewrite('The download path is:{}'.format(download_file))
        self._local_file = self._local_file.format(args.file_name)
        self._progress_rewrite('Backup file will be downloaded to:{}'.format(self._local_file))
        self._progress_rewrite('Starting to download file:{}'.format(self._local_file))
        args.object_name = download_file
        args.local_file = self._local_file
        aws3.download_file(args)
        self._progress_rewrite('Download completed:{}'.format(self._local_file))
        return self._local_file

    def _download_google_cloud_file(self,args,btype='site'):
        sys.path.append('/www/server/panel/plugin/gcloud_storage')
        import gcloud_storage_main
        gs = gcloud_storage_main.gcloud_storage_main()
        self._progress_rewrite('Building Google Store download path...')
        download_file = self._build_google_backup_path(btype,args.file_name,args.obj_name)
        self._progress_rewrite('The download path is:{}'.format(download_file))
        self._local_file = self._local_file.format(args.file_name)
        self._progress_rewrite('Backup file will be downloaded to:{}'.format(self._local_file))
        self._progress_rewrite('Starting to download file:{}'.format(self._local_file))
        args.source_blob_name = download_file
        args.destination_file_name = self._local_file
        gs.download_blob(args)
        self._progress_rewrite('Download completed:{}'.format(self._local_file))
        return self._local_file

    def _download_google_drive_file(self,args):
        sys.path.append('/www/server/panel/plugin/gdrive')
        import gdrive_main
        gd = gdrive_main.gdrive_main()
        self._local_file = self._local_file.format(args.file_name)
        self._progress_rewrite('Backup file will be downloaded to:{}'.format(self._local_file))
        self._progress_rewrite('Starting to download file:{}'.format(self._local_file))
        gd.download_file(args.file_name)
        self._progress_rewrite('Download completed:{}'.format(self._local_file))
        return self._local_file

    def restore_website_backup(self,args):
        """
            @name 恢复站点文件
            @author zhwen<[email protected]>
            @parma file_name 备份得文件名
            @parma site_id 网站id
        """
         # 校验参数
        try:
            args.validate([
                Param('file_name').String(),
                Param('site_id').Integer(),

            ], [
                public.validate.trim_filter(),
            ])
        except Exception as ex:
            public.print_log("error info: {}".format(ex))
            return public.return_message(-1, 0, str(ex))

        self._progress_rewrite('','w')
        site_info = self._get_website_info(args.site_id)
        self._progress_rewrite('Get site information:{}'.format(str(site_info)))
        args.path = site_info['site_path']
        args.obj_name = site_info['site_name']
        self._progress_rewrite('Get the site path:{}'.format(str(site_info['site_path'])))
        local_backup_path = self._get_local_backup_path()
        local_backup_file_path = local_backup_path +'/site/'+ args.file_name
        if not os.path.exists(local_backup_file_path):
            local_backup_file_path = local_backup_path +'/site/'+ site_info['site_name']+'/'+args.file_name
        self._progress_rewrite('Get the local backup file path: {}'.format(str(local_backup_path)))
        backup_method = self._get_backfile_method(args.file_name)
        self._progress_rewrite('Get the backup method: {}'.format(str(backup_method)))
        if backup_method == 'local':
            self._progress_rewrite('Start to restore local backup files: {}'.format(str(local_backup_file_path)))
            result = self._restore_backup(local_backup_file_path,site_info,args)
            if result:
                self._progress_rewrite('Recovery failed: {}'.format(str(site_info['site_path'])))
                return result
        elif backup_method == 'aws_s3':
            self._download_aws_file(args)
            result = self._restore_backup(self._local_file, site_info, args)
        elif backup_method == 'Google Cloud':
            self._download_google_cloud_file(args)
            result = self._restore_backup(self._local_file, site_info, args)
        elif backup_method == 'Google Drive':
            self._download_google_drive_file(args)
            result = self._restore_backup(self._local_file, site_info, args)
        else:
            return public.return_msg_gettext(False,'Currently only supports restoring local, Google storage and AWS S3 backups')
        if os.path.exists(self._local_file):
            os.remove(self._local_file)
        if result:
            self._progress_rewrite('Recovery failed: {}'.format(str(site_info['site_path'])))
            return result
        self._progress_rewrite('Successful recovery: {}'.format(str(site_info['site_path'])))
        return public.return_message(0, 0, public.lang("Restore Successful"))

    # 取任务进度
    def get_progress(self, get):
        """
            @name 获取进度日志
            @author zhwen<[email protected]>
        """
        # result = public.GetNumLines(self._progress_file, 20)
        result = public.ExecShell('tail -n 20 {}'.format(self._progress_file))[0]
        if len(result) < 1:
            return public.return_message(0, 0, public.lang("Wait for the restore to start"))
        return public.return_message(0,0,result)

    # 恢复数据库
    def restore_db_backup(self,args):
        """
            @name 恢复站点文件
            @author zhwen<[email protected]>
            @parma file_name 备份得文件名 /www/backup/database/db_test_com_20200817_112722.sql.gz|Google Drive|db_test_com_20200817_112722.sql.gz
            @parma obj_name 数据库名
        """
        if "|" not in args.file:
            return public.returnMsg(True,'success')
        try:
            backup_info = args.file.split('|')
            args.file_name = backup_info[-1]
            args.obj_name = args.name
            backup_method = backup_info[1]
            self._progress_rewrite('','w')
            self._progress_rewrite('Restoring database...')
            self._progress_rewrite('Get the backup method: {}'.format(str(backup_method)))
            if backup_method == 'aws_s3':
                self._download_aws_file(args,'database')
            elif backup_method == 'Google Cloud':
                self._download_google_cloud_file(args,'database')
            elif backup_method == 'Google Drive':
                self._download_google_drive_file(args)
            else:
                return public.returnMsg(False,'Currently only supports restoring local, Google storage and AWS S3 backups')
            public.ExecShell('mv {} {}/database'.format(self._local_file, self._get_local_backup_path()))
            return public.returnMsg(True,'success')
        except:
            return public.returnMsg(False,"Download error!")

Youez - 2016 - github.com/yon3zu
LinuXploit