Files
OMS/app/base/lib/shell/loader.php
2025-12-28 23:13:25 +08:00

260 lines
8.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* Copyright © ShopeX http://www.shopex.cn. All rights reserved.
* See LICENSE file for license details.
*/
class base_shell_loader{
var $commands_dir;
var $app_id;
var $trigger = array();
var $status = array();
var $input = array();
function __construct(){
set_time_limit(0);
cachemgr::init(false);
kernel::$console_output = true;
if(file_exists(ROOT_DIR.'/config/config.php')){
require(ROOT_DIR.'/config/config.php');
$this->status['config'] = ROOT_DIR.'/config/config.php';
}else{
$this->status['config'] = 'false';
}
include(APP_DIR.'/base/defined.php');
date_default_timezone_set(
defined('DEFAULT_TIMEZONE') ? ('Etc/GMT'.(DEFAULT_TIMEZONE>=0?(DEFAULT_TIMEZONE*-1):'+'.(DEFAULT_TIMEZONE*-1))):'UTC'
);
$this->buildin_commander = new base_shell_buildin($this);;
}
function run(){
ignore_user_abort(false);
ob_implicit_flush(1);
ini_set('implicit_flush',true);
cachemgr::init(false);
if(strpos(strtolower(PHP_OS), 'win') === 0){
if(function_exists('mb_internal_encoding')){
mb_internal_encoding("UTF-8");
mb_http_output("GBK");
ob_start("mb_output_handler",2);
}elseif(function_exists('iconv_set_encoding')){
iconv_set_encoding("internal_encoding", "UTF-8");
iconv_set_encoding("output_encoding", "GBK");
ob_start("ob_iconv_handler",2);
}
}
if(isset($_SERVER['argv'][1])){
$args = array_shift($_SERVER['argv']);
$rst = $this->exec_command(implode(' ',$_SERVER['argv']));
if($rst===false){
exit(-1);
}
}else{
$this->interactive();
}
}
function print_banner(){
$version = 1.3;
echo "Ecos shell V{$version} (abort with ^C), Root: ",ROOT_DIR;
}
/**
* 获取_width
* @return mixed 返回结果
*/
static public function get_width() {
$output = @strtolower(exec('stty -a |grep columns'));
if($output){
foreach(explode(';',$output) as $part){
if(strpos($part,'columns')!==false){
return intval(str_replace('columns', '', $part));
}
}
}
return 80;
}
function &get_commander($app_id,$shell_command){
$shell_command = strtolower($shell_command);
if(!$app_id && isset($this->cmdlibs[$shell_command])){
return $this->cmdlibs[$shell_command];
}
if(file_exists(APP_DIR.'/'.$app_id.'/lib/command/'.$shell_command.'.php')){
require_once(APP_DIR.'/'.$app_id.'/lib/command/'.$shell_command.'.php');
$class_name = $app_id.'_command_'.$shell_command;
$this->cmdlibs[$shell_command] = new $class_name($this);
$this->cmdlibs[$shell_command]->app = app::get($app_id);
return $this->cmdlibs[$shell_command];
}else{
$commander = false;
return $commander;
}
}
function interactive(){
$this->print_banner();
$i=1;
while (true) {
$line = readline("\n".($this->app_id?($i++).':'.$this->app_id:$i++).'> ');
readline_add_history($line);
foreach($this->trigger as $trigger_name => &$trigger){
$trigger->{'begin_'.$trigger_name}($line);
}
$this->exec($line);
foreach($this->trigger as $trigger_name => &$trigger){
$trigger->{'end_'.$trigger_name}($line);
}
//ob_flush();
}
}
function input_option($options,$part,$message=null){
if(PHP_SAPI!='cli'){
trigger_error('Can\'t start options editor',E_ERROR);
exit;
}
do{
echo "\n";
$output= array();
$i = 1;
foreach($options as $key=>$option){
$map[$i] = $key;
if(!array_key_exists($key,(array)$this->input[$part]) && array_key_exists('default',$option)){
$this->input[$part][$key] = $option['default'];
}
if($option['type']=='password'){
$current_value = $this->input[$part][$key]?str_repeat('*',strlen($current_value)):'(empty)';
}elseif($option['type']=='select'){
if(is_array($option['options_callback'])){
$option['options'] = app::get($option['options_callback']['app'])->runtask($option['options_callback']['method'], $this->input);
$options[$key]['options'] = $option['options'];
}
$current_value = $option['options'][$this->input[$part][$key]];
}elseif($this->input[$part][$key]==''){
$current_value = '(empty)';
}else{
$current_value = $this->input[$part][$key];
}
$output[] = array(
str_pad($i,3,' ',STR_PAD_LEFT).'. '.$option['title'],
$current_value
);
$i++;
}
$this->buildin_commander->output_table( $output );
$line = readline(str_repeat('_',40)."\n".app::get('base')->_('输入项目编号,或输入井号').'"#"'.app::get('')->_('确认').": ");
}while($this->save_input_option($options,$map,trim($line),$part));
}
function save_input_option($options,$map,$input,$part){
if($input=='#'){
return false;
}else{
$option = $options[$map[$input]];
switch($option['type']){
case 'password':
@system('stty -echo');
$this->input[$part][$map[$input]] = trim(readline("\n".app::get('base')->_('输入')."{$option['title']}: "));
@system('stty echo');
break;
case 'select':
$i=1;
$output = "\n".app::get('base')->_('选择合适的')."{$option['title']}:\n";
foreach($options[$map[$input]]['options'] as $k=>$v){
$optmap[$i] = $k;
$output.= str_pad($i,3,' ',STR_PAD_LEFT).'. '.$v."\n";
$i++;
}
$output.=app::get('base')->_("输入合适的")."{$option['title']}".app::get('base')->_('编号').": ";
$this->input[$part][$map[$input]] = $optmap[trim(readline($output))];
break;
default:
$this->input[$part][$map[$input]] = trim(readline("\n".app::get('base')->_('输入')."{$option['title']}: "));
break;
}
return true;
}
}
function exec_command($line){
$this->exec($line);
}
function exec($line){
try{
$line = trim($line);
if(substr($line,-1,1)==';'){
return $this->buildin_commander->php_call($line);
}else{
$command_parts = preg_split ("/[\s]+/", $line);
$shell_command = array_shift($command_parts);
list($app_id,$commander) = explode(':',$shell_command);
if(!$commander){
$commander = $app_id;
if(method_exists($this->buildin_commander,'command_'.$commander)){
array_unshift($command_parts,$shell_command);
return $this->buildin_commander->exec($command_parts);
}else{
echo $shell_command.": Command not found.";
}
}else{
$commander = $this->get_commander($app_id,$commander);
if($commander){
return $commander->exec($command_parts);
}else{
echo $shell_command.": Command not found.";
return false;
}
}
}
}catch (Exception $e){
echo 'Error: ', $e->getMessage(), "";
}
}
}
if(!function_exists('readline')){
function readline($prompt){
echo $prompt;
//ob_flush();
$input = '';
while(1){
$key = fgetc(STDIN);
switch($key){
case "\n":
return $input;
default:
$input.=$key;
}
}
}
function readline_add_history($line){
//...
}
function readline_completion_function($callback){
}
}