mirror of https://github.com/flucont/btcloud.git
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							115 lines
						
					
					
						
							4.0 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							115 lines
						
					
					
						
							4.0 KiB
						
					
					
				
								<?php
							 | 
						|
								declare (strict_types = 1);
							 | 
						|
								
							 | 
						|
								namespace app\command;
							 | 
						|
								
							 | 
						|
								use think\console\Command;
							 | 
						|
								use think\console\Input;
							 | 
						|
								use think\console\input\Argument;
							 | 
						|
								use think\console\input\Option;
							 | 
						|
								use think\console\Output;
							 | 
						|
								use think\facade\Db;
							 | 
						|
								use think\facade\Config;
							 | 
						|
								use app\lib\Plugins;
							 | 
						|
								
							 | 
						|
								class DecryptFile extends Command
							 | 
						|
								{
							 | 
						|
								    protected function configure()
							 | 
						|
								    {
							 | 
						|
								        $this->setName('decrypt')
							 | 
						|
								            ->addArgument('type', Argument::REQUIRED, '文件类型,plugin:插件文件,module:模块文件,classdir:宝塔class目录,all:所有py文件')
							 | 
						|
								            ->addArgument('file', Argument::REQUIRED, '文件路径')
							 | 
						|
								            ->addArgument('os', Argument::OPTIONAL, '操作系统:Windows/Linux')
							 | 
						|
								            ->setDescription('解密宝塔面板python文件');
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    protected function execute(Input $input, Output $output)
							 | 
						|
								    {
							 | 
						|
								        $type = trim($input->getArgument('type'));
							 | 
						|
								        $file = trim($input->getArgument('file'));
							 | 
						|
								
							 | 
						|
								        if(!file_exists($file)){
							 | 
						|
								            $output->writeln('文件不存在');
							 | 
						|
								            return;
							 | 
						|
								        }
							 | 
						|
								        
							 | 
						|
								        if($type == 'plugin'){
							 | 
						|
								            $os = trim($input->getArgument('os'));
							 | 
						|
								            try{
							 | 
						|
								                if(Plugins::decode_plugin_main_local($file, $os)){
							 | 
						|
								                    $output->writeln('文件解密成功!');
							 | 
						|
								                }else{
							 | 
						|
								                    $output->writeln('文件解密失败!');
							 | 
						|
								                }
							 | 
						|
								            }catch(\Exception $e){
							 | 
						|
								                $output->writeln($e->getMessage());
							 | 
						|
								            }
							 | 
						|
								        }elseif($type == 'module'){
							 | 
						|
								            try{
							 | 
						|
								                $res = Plugins::decode_module_file($file);
							 | 
						|
								                if($res == 2){
							 | 
						|
								                    $output->writeln('文件解密失败!');
							 | 
						|
								                }elseif($res == 1){
							 | 
						|
								                    $output->writeln('文件解密成功!');
							 | 
						|
								                }
							 | 
						|
								            }catch(\Exception $e){
							 | 
						|
								                $output->writeln($e->getMessage());
							 | 
						|
								            }
							 | 
						|
								        }elseif($type == 'classdir'){
							 | 
						|
								            $file = rtrim($file, '/');
							 | 
						|
								            if(!file_exists($file.'/common.py')){
							 | 
						|
								                $output->writeln('当前路径非宝塔面板class目录');
							 | 
						|
								                return;
							 | 
						|
								            }
							 | 
						|
								            $dirs = glob($file.'/*Model');
							 | 
						|
								            foreach($dirs as $dir){
							 | 
						|
								                if(!is_dir($dir))continue;
							 | 
						|
								                $files = glob($dir.'/*Model.py');
							 | 
						|
								                foreach($files as $file){
							 | 
						|
								                    try{
							 | 
						|
								                        $res = Plugins::decode_module_file($file);
							 | 
						|
								                        if($res == 2){
							 | 
						|
								                            $output->writeln('文件解密失败:'.$file);
							 | 
						|
								                        }elseif($res == 1){
							 | 
						|
								                            $output->writeln('文件解密成功:'.$file);
							 | 
						|
								                        }
							 | 
						|
								                    }catch(\Exception $e){
							 | 
						|
								                        $output->writeln($e->getMessage().':'.$file);
							 | 
						|
								                    }
							 | 
						|
								                }
							 | 
						|
								            }
							 | 
						|
								        }elseif($type == 'all'){
							 | 
						|
								            $file = rtrim($file, '/');
							 | 
						|
								            $this->scan_all_file($input, $output, $file);
							 | 
						|
								        }else{
							 | 
						|
								            $output->writeln('未知文件类型');
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    private function scan_all_file(Input $input, Output $output, $path) {
							 | 
						|
								        $dir = opendir($path);
							 | 
						|
								        while(false !== ( $file = readdir($dir)) ) {
							 | 
						|
								            if (( $file != '.' ) && ( $file != '..' )) {
							 | 
						|
								                $filepath = $path . '/' . $file;
							 | 
						|
								                if ( is_dir($filepath) ) {
							 | 
						|
								                    $this->scan_all_file($input, $output, $filepath);
							 | 
						|
								                }
							 | 
						|
								                elseif(substr($filepath, -3) == '.py') {
							 | 
						|
								                    try{
							 | 
						|
								                        $res = Plugins::decode_module_file($filepath);
							 | 
						|
								                        if($res == 2){
							 | 
						|
								                            $output->writeln('文件解密失败:'.$filepath);
							 | 
						|
								                        }elseif($res == 1){
							 | 
						|
								                            $output->writeln('文件解密成功:'.$filepath);
							 | 
						|
								                        }
							 | 
						|
								                    }catch(\Exception $e){
							 | 
						|
								                        $output->writeln($e->getMessage().':'.$filepath);
							 | 
						|
								                    }
							 | 
						|
								                }
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								        closedir($dir);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    
							 | 
						|
								}
							 |