钩子方法

温馨提示:

  1. 记得将命名空间中的“pluginExample”替换成插件名称
  2. URLOS自带了大量的可用函数(方法),请参考“URLOS内置函数”查看详情
  3. 所有钩子函数的参数都是一致的,说明如下: $plugin 格式为“插件名:插件版本”或者“插件类型:插件名:插件版本”,如:pluginName:v0_1_0, system:phpWebsites:v0_1_0
    $hook 插件钩子名称,如:trafficGetBootScript表示获取启动脚本
    $vars 传入到钩子的变量,如:$vars['serviceId']为服务的ID,$vars['serviceArr']为服务的数组。
    $pluginType 插件类型,共有以下3种插件类型:
     system(系统插件)<br>
     official(官方插件)<br>
     user(用户插件,一般用于调试)<br>
     db(数据库类型的插件,直接在URLOS后台编写插件)<br>
    
    $moduleName 模块名,如:admin, home
<?php

namespace plugin\admin\db\pluginExample\v0_1_0;
use _common\lib\BaseHook as parentHook;

class hookLoader extends parentHook {
    #-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- 安装脚本相关
    /**
     * 处理并返回安装脚本所需要的服务数组
     * @return array
     */
    public function trafficGetInstallScriptServiceArr($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        #自定义代码
        {
            // $serviceArr['myVar'] = "ok";
        }
        #返回
        return $serviceArr;
    }

    /**
     * 处理并返回安装脚本
     * @return array
     */
    public function trafficGetInstallScript($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        $serviceId = $serviceArr['id'];
        $appId = $serviceArr['appId'];
        $nodeId = $serviceArr['nodeId'];
        $installScript = $vars['installScript'];

        #对installScript内容的相关处理,也可以直接替换
        $shellArr = array();
        $shellArr[] = $installScript;      #应用的安装脚本
        #支持多行Shell
        $shellArr[] = '
            #apt update -y && apt install nginx
            if [ true ]; then
                echo ok;
            fi
        ';
        #返回
        return $shellArr;
    }

    /**
     * 分析安装脚本执行的日志内容,如果有错误,则格式化后再返回
     * @return (string or null)
     */
    public function trafficReceiveInstallScriptResultLog($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        $serviceId = $serviceArr['id'];
        $appArr = $vars['appArr'];
        $shellResult = $vars['shellResult'];

        #自定义代码
        {
            #把错误内容格式化
            if (preg_match('@Error: (.{1,100})@', $shellResult, $matchArr)) {
                #错误内容
                $errorMessage = '安装脚本执行错误:'.$matchArr[1];
                #用于报错的内容(JSON格式)
                $logJson = $this->msg->error($errorMessage, [], [
                    'description' => [
                        $this->getModel('service')->getDescription($serviceArr),
                        '脚本执行结果:'.mb_substr($shellResult, -4096),        #显示执行结果,便于排错
                    ]
                ]);
                return $logJson;
            }
        }

        return null;
    }





    #-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- 配置脚本相关
    /**
     * 处理并返回配置脚本所需要的服务数组
     * @return array
     */
    public function trafficGetConfigScriptServiceArr($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        #自定义代码
        {
            // $serviceArr['myVar'] = "ok";
        }
        #返回
        return $serviceArr;
    }

    /**
     * 处理并返回配置脚本
     * @return array
     */
    public function trafficGetConfigScript($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        $serviceId = $serviceArr['id'];
        $appId = $serviceArr['appId'];
        $nodeId = $serviceArr['nodeId'];
        $shellArr = $vars['configScriptArr'];

        #支持多行Shell
        $shellArr[] = '
            #shell script
        ';
        #返回
        return $shellArr;
    }

    /**
     * 分析配置脚本执行的日志内容,如果有错误,则格式化后再返回
     * @return (string or null)
     */
    public function trafficReceiveConfigScriptResultLog($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        $serviceId = $serviceArr['id'];
        $appArr = $vars['appArr'];
        $shellResult = $vars['shellResult'];

        #自定义代码
        {
            #把错误内容格式化
            if (preg_match('@Error: (.{1,100})@', $shellResult, $matchArr)) {
                #错误内容
                $errorMessage = '配置脚本执行错误:'.$matchArr[1];
                #用于报错的内容(JSON格式)
                $logJson = $this->msg->error($errorMessage, [], [
                    'description' => [
                        $this->getModel('service')->getDescription($serviceArr),
                        '脚本执行结果:'.mb_substr($shellResult, -4096),        #显示执行结果,便于排错
                    ]
                ]);
                return $logJson;
            }
        }

        return null;
    }





    #-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- 启动脚本相关
    /**
     * 处理并返回启动脚本所需要的服务数组
     * @return array
     */
    public function trafficGetBootScriptServiceArr($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        #自定义代码
        {
            // $serviceArr['myVar'] = "ok";
        }
        #返回
        return $serviceArr;
    }

    /**
     * 处理并返回启动脚本
     * @return array
     */
    public function trafficGetBootScript($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        $serviceId = $serviceArr['id'];
        $appId = $serviceArr['appId'];
        $nodeId = $serviceArr['nodeId'];
        $bootScript = $vars['bootScript'];

        #对bootScript内容的相关处理,也可以直接替换
        $shellArr = array();
        $shellArr[] = $bootScript;      #应用的启动脚本
        #支持多行Shell
        $shellArr[] = '
            #nginx
        ';
        #返回
        return $shellArr;
    }

    /**
     * 分析启动脚本执行的日志内容,如果有错误,则格式化后再返回
     * @return (string or null)
     */
    public function trafficReceiveBootScriptResultLog($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        $serviceId = $serviceArr['id'];
        $appArr = $vars['appArr'];
        $shellResult = $vars['shellResult'];

        #自定义代码
        {        //如需执行,把false改为true
            #把错误内容格式化
            if (preg_match('@Error: (.{1,100})@', $shellResult, $matchArr)) {
                #错误内容
                $errorMessage = '启动脚本执行错误:'.$matchArr[1];
                #用于报错的内容(JSON格式)
                $logJson = $this->msg->error($errorMessage, [], [
                    'description' => [
                        $this->getModel('service')->getDescription($serviceArr),
                        '脚本执行结果:'.mb_substr($shellResult, -4096),        #显示执行结果,便于排错
                    ]
                ]);
                return $logJson;
            }
        }

        return null;
    }





    #-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- 数据脚本相关
    /**
     * 处理并返回启动脚本
     * 注意:如果未定义数据模型和数据变量,就不会执行数据脚本
     * @return array
     */
    public function trafficGetDataScript($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        $serviceId = $serviceArr['id'];
        $appId = $serviceArr['appId'];
        $nodeId = $serviceArr['nodeId'];

        #对dataScript内容的相关处理,也可以直接替换
        $shellArr = array();
        #支持多行Shell
        $shellArr[] = '
            #shell script
        ';
        #返回
        return $shellArr;
    }

    /**
     * 分析数据脚本执行的日志内容,如果有错误,则格式化后再返回
     * @return (string or null)
     */
    public function trafficReceiveDataScriptResultLog($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        $serviceId = $serviceArr['id'];
        $appArr = $vars['appArr'];
        $shellResult = $vars['shellResult'];

        #自定义代码
        {
            #把错误内容格式化
            if (preg_match('@Error: (.{1,100})@', $shellResult, $matchArr)) {
                #错误内容
                $errorMessage = '数据脚本执行错误:'.$matchArr[1];
                #用于报错的内容(JSON格式)
                $logJson = $this->msg->error($errorMessage, [], [
                    'description' => [
                        $this->getModel('service')->getDescription($serviceArr),
                        '脚本执行结果:'.mb_substr($shellResult, -4096),        #显示执行结果,便于排错
                    ]
                ]);
                return $logJson;
            }
        }

        return null;
    }




    #-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- 附加脚本相关
    /**
     * 处理并返回附加脚本所需要的服务数组
     * @return array
     */
    public function trafficGetAppendScriptServiceArr($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        #自定义代码
        {
            // $serviceArr['myVar'] = "ok";
        }
        #返回
        return $serviceArr;
    }

    /**
     * 处理并返回附加脚本
     * @return array
     */
    public function trafficGetAppendScript($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        $serviceId = $serviceArr['id'];
        $appId = $serviceArr['appId'];
        $nodeId = $serviceArr['nodeId'];
        $appendScript = $vars['appendScript'];

        #对appendScript内容的相关处理,也可以直接替换
        $shellArr = array();
        $shellArr[] = $appendScript;      #应用的附加脚本
        #支持多行Shell
        $shellArr[] = '
            #shell contents
        ';
        #返回
        return $shellArr;
    }

    /**
     * 分析附加脚本执行的日志内容,如果有错误,则格式化后再返回
     * @return (string or null)
     */
    public function trafficReceiveAppendScriptResultLog($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        $serviceId = $serviceArr['id'];
        $appArr = $vars['appArr'];
        $shellResult = $vars['shellResult'];

        #自定义代码
        {
            #把错误内容格式化
            if (preg_match('@Error: (.{1,100})@', $shellResult, $matchArr)) {
                #错误内容
                $errorMessage = '附加脚本执行错误:'.$matchArr[1];
                #用于报错的内容(JSON格式)
                $logJson = $this->msg->error($errorMessage, [], [
                    'description' => [
                        $this->getModel('service')->getDescription($serviceArr),
                        '脚本执行结果:'.mb_substr($shellResult, -4096),        #显示执行结果,便于排错
                    ]
                ]);
                return $logJson;
            }
        }

        return null;
    }





    #-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- 状态脚本相关
    /**
     * 处理并返回启动脚本所需要的服务数组
     * @return array
     */
    public function trafficGetStatusScriptServiceArr($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        #自定义代码
        {
            // $serviceArr['myVar'] = "ok";
        }
        #返回
        return $serviceArr;
    }

    /**
     * 处理并返回启动脚本
     * @return array
     */
    public function trafficGetStatusScript($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        $serviceId = $serviceArr['id'];
        $appId = $serviceArr['appId'];
        $nodeId = $serviceArr['nodeId'];
        $statusScript = $vars['statusScript'];

        #对statusScript内容的相关处理,也可以直接替换
        $shellArr = array();
        $shellArr[] = $statusScript;      #应用的启动脚本
        #支持多行Shell
        $shellArr[] = '
            #shell script1
        ';
        #返回
        return $shellArr;
    }

    /**
     * 分析状态脚本执行的日志内容,如果有错误,则格式化后再返回
     * @return (string or null)
     */
    public function trafficReceiveStatusScriptResultLog($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        $serviceId = $serviceArr['id'];
        $appArr = $vars['appArr'];
        $shellResult = $vars['shellResult'];

        #自定义代码
        {        //如需执行,把false改为true
            #把错误内容格式化
            if (preg_match('@Error: (.{1,100})@', $shellResult, $matchArr)) {
                #错误内容
                $errorMessage = '状态脚本执行错误:'.$matchArr[1];
                #用于报错的内容(JSON格式)
                $logJson = $this->msg->error($errorMessage, [], [
                    'description' => [
                        $this->getModel('service')->getDescription($serviceArr),
                        '脚本执行结果:'.mb_substr($shellResult, -4096),        #显示执行结果,便于排错
                    ]
                ]);
                return $logJson;
            }
        }

        return null;
    }





    #-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- 监控脚本相关
    /**
     * 处理并返回监控脚本
     * @return array
     */
    public function trafficGetMonitorScript($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        $serviceId = $serviceArr['id'];
        $appId = $serviceArr['appId'];
        $nodeId = $serviceArr['nodeId'];
        $monitorScript = $vars['monitorScript'];
        #对monitorScript内容的相关处理,也可以直接替换
        $shellArr[] = $monitorScript;
        #自定义代码
        {
            $shellArr[] = '#sleep 3';        #执行别太频繁
        }
        return $shellArr;
    }





    #-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- 退出脚本相关
    /**
     * 处理并返回退出脚本
     * @return array
     */
    public function trafficGetQuitScript($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        $serviceId = $serviceArr['id'];
        $appId = $serviceArr['appId'];
        $nodeId = $serviceArr['nodeId'];
        $quitScript = $vars['quitScript'];
        #对quitScript内容的相关处理,也可以直接替换
        $shellArr[] = $quitScript;
        #自定义代码
        {
            $shellArr[] = '#nginx -s stop && service mysql stop';
        }
        return $shellArr;
    }





    #-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- 服务启动相关
    /**
     * 修改docker run启动容器时的参数
     * @return array
     */
    public function serviceDeployDockerRunArgsArr($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        $serviceId = $serviceArr['id'];
        $nodeArr = $vars['nodeArr'];
        $swarmArr = $vars['swarmArr'];
        $appArr = $vars['appArr'];

        #docker run的附加参数(数组)
        $dockerRunArgsArr = $vars['dockerRunArgsArr'];    

        #自定义代码
        {
            $dockerRunArgsArr[] = '--env "isMyEnv01=Yes"';
        }

        #是否强制部署
        $forceDeploy = false;

        #返回
        return [$dockerRunArgsArr, $forceDeploy];
    }




    #-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- 服务表单相关
    /**
     * 添加服务时对表单数据的相关处理
     * @return array
     */
    public function serviceGetAddDatasArr($plugin, $hook, $vars, $pluginType, $moduleName) {
        $datasArr = $vars['datasArr'];
        $appId = $vars['appId'];
        #自定义代码
        {
            #print_r($datasArr);
        }
        return $datasArr;
    }

    /**
     * 修改服务时对表单数据的相关处理
     * @return array
     */
    public function serviceGetEditDatasArr($plugin, $hook, $vars, $pluginType, $moduleName) {
        $datasArr = $vars['datasArr'];
        $appId = $vars['appId'];
        #自定义代码
        {
            #print_r($datasArr);
        }
        return $datasArr;
    }

    /**
     * 修改服务时的相关检查
     * @return array
     */
    public function serviceGetInputData($plugin, $hook, $vars, $pluginType, $moduleName) {
        $inputDataArr = $vars['inputData'];
        $serviceArr = $vars['serviceArr'];

        #自定义代码
        {
            foreach ($inputDataArr as $key => $iarr) {
                $fieldName = $iarr['fieldName'];
                switch ($fieldName) {
                    case 'myFieldName':        #变量名称
                        #URLOS使用了antd前端框架,具体请参考:https://3x.ant.design/index-cn
                        $iarr['disabled'] = true;        #禁止修改
                        $iarr['title'] = '这是我的变量说明';
                    break;
                }
                $inputDataArr[$key] = $iarr;
            }
        }

        return $inputDataArr;
    }

    /**
     * 添加或修改服务时的选项卡
     * @return array
     */
    public function serviceStepCaptionArr($plugin, $hook, $vars, $pluginType, $moduleName) {
        $appArr = $vars['appArr'];
        $stepCaptionArr = $vars['stepCaptionArr'];

        #自定义代码
        {
            #增加A1步骤
            #$stepCaptionArr['A1'] = '设置A1相关参数';
        }

        return $stepCaptionArr;
    }





    #-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- 服务表单验证相关
    /**
     * 添加服务时的相关检查(数据暂未存入数据库)
     * @return array
     */
    public function serviceAddDataCheck($plugin, $hook, $vars, $pluginType, $moduleName) {
        return $this->serviceEditDataCheck($plugin, $hook, $vars, $pluginType, $moduleName);
    }

    /**
     * 修改服务时的相关检查(数据暂未存入数据库)
     * @return null
     */
    public function serviceEditDataCheck($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArrOld'];

        #自定义代码
        {
            if (preg_match('@8080:8080@s', $_POST['ports'])) {
                if (false) {        //如需执行,把false改为true
                    #直接报错
                    $this->msg->errorExit('服务端口和容器端口都必须是8080端口,请修正后再试!');
                } else {
                    #报错并自动跳转到填写端口所在的步骤
                    $this->msg->serviceVerifyExit('服务端口和容器端口都必须是8080端口,请修正后再试!', 'ports', $serviceArr['appId']);
                }
            }
        }

        return null;
    }

    /**
     * 添加服务时的相关处理(数据已经存入数据库)
     * @return array
     */
    public function serviceAddDataSaved($plugin, $hook, $vars, $pluginType, $moduleName) {
        return $this->serviceEditDataSaved($plugin, $hook, $vars, $pluginType, $moduleName);
    }

    /**
     * 修改服务时的相关处理(数据已经存入数据库)
     * @return null
     */
    public function serviceEditDataSaved($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArrOld = $vars['serviceArrOld'];    #旧数据(如果是添加行为,则为空数组)
        $serviceArr = $vars['serviceArr'];            #保存后的新数据
        $appArr = $vars['appArr'];

        #自定义代码
        {
            #print_r($serviceArrOld);
            #print_r($serviceArr);
        }

        return null;
    }




    #-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- 服务列表相关
    /**
     * 调整服务列表的“单个服务”数组
     * @return array
     */
    public function serviceListServerArr($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        #自定义代码
        {

        }
        return $serviceArr;
    }

    /**
     * 修改服务时的相关检查
     * @return array
     */
    public function serviceListActions($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        $serviceId = $serviceArr['id'];
        $actionsArr = $vars['actions'];
        #自定义代码
        {
            $actionsArr[] = [
                'text' => '自定义行为01',
                'ajaxGetAppend' => [
                    'serviceId' => $serviceId,
                    'a' => 'custom',
                    'actionMark' => 'serviceCustom01Action',
                ],
                // 操作前的提示:如果不需要提示,直接注释即可
                'confirm' => [
                    'title' => '警告!',
                    'content' => '此操作将有风险,要继续吗?',
                ],
                // 放到服务列表中的“更多”浮窗中
                'inMoreBox' => true,
            ];
        }
        return $actionsArr;
    }

    /**
     * 自定义行为01
     * @return null
     */
    public function serviceCustom01Action($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];    
        $serviceId = $serviceArr['id'];

        #自定义代码
        {
            $containerInfoArr = $this->service->isRunning($serviceId);
            if (!is_array($containerInfoArr)) {
                $this->msg->errorExit('服务未运行!');
            }

            #主机数组
            $nodeArr = $containerInfoArr['nodeArr'];
            #容器的hostname(容器ID)
            $containerHostname = $containerInfoArr['containerHostname'];

            #异步执行命令
            list($boolResult, $shellResult) = $this->shell->runShellInContainer([
                '#shell script1',
                '
                    #shell script2

                    if [ true ]; then
                        echo ok;
                    fi
                ',
                #执行完成后发送一个通知给URLOS,通知类型:success, info, warning, error, fail
                $this->shell->getSendNoticeShellInContainer(
                    '通知标题,如:命令执行完毕',
                    '通知内容,如:成功重载了Nginx,进程数为18,系统压力极大。',
                    'warning'
                ),
                'echo WSY_EXEC_OK',
            ], $nodeArr, $containerHostname, [
                'runType' => 'async'        #同步执行使用sync(默认),异步执行则使用async
            ]);

            if (strstr($shellResult, 'WSY_EXEC_OK') == false) {
                $this->msg->errorExit('操作失败!');
            }
        }

        $this->msg->successExit('操作成功');
    }




    #-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- 网站代理相关
    /**
     * 某个网站的Nginx代理配置内容
     * @return array
     */
    public function websiteProxyVhostConfigContents($plugin, $hook, $vars, $pluginType, $moduleName) {
        $websiteServiceId = $vars['websiteServiceId'];
        $proxyServiceId = $vars['proxyServiceId'];
        $vhostConfigContents = $vars['vhostConfigContents'];

        #自定义代码
        {

        }

        return $vhostConfigContents;
    }




    #-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- 服务部署相关
    /**
     * 部署服务前的检查或处理
     * @return array
     */
    public function sendDeployServiceCronHandle($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        $appArr = $vars['appArr'];
        $swarmArr = $vars['swarmArr'];
        $leaderNodeArr = $vars['leaderNodeArr'];

        #自定义代码
        {
            #修改为强制部署
            $serviceArr['deployDataHash'] = 'force';
            #修改为暴力部署
            $serviceArr['deployDataHash'] = 'force2';

            #例如:检查服务是否存在“父服务”,如果父服务还没有部署,则提示先需要部署父服务
        }


        return $serviceArr;
    }

    /**
     * 修改挂载目录
     * @return array
     */
    public function serviceDeployMounts($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        $appArr = $vars['appArr'];
        $swarmArr = $vars['swarmArr'];
        $mountsArr = $vars['mounts'];
        $serviceType = $vars['serviceType'];

        #自定义代码
        {
            #print_r($mountsArr);
        }

        return $mountsArr;
    }

    /**
     * 修改服务容器的环境变量
     * @return array
     */
    public function serviceDeployDockerEnvArr($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        $envArr = $vars['envArr'];

        #自定义代码
        {
            #print_r($envArr);
        }

        return $envArr;
    }

    /**
     * 服务部署完成后的相关处理
     * @return array
     */
    public function serviceCheckAllScriptSuccessful($plugin, $hook, $vars, $pluginType, $moduleName) {
        $serviceArr = $vars['serviceArr'];
        $appArr = $vars['appArr'];
        $serviceId = $serviceArr['id'];

        #自定义代码
        {
            #当本服务部署成功后,再部署名称为“service001”的服务
            {
                $otherServiceObj = $this->getModel('service')->select('id')->where('name', 'service001')->first();
                if ($otherServiceObj) {
                    #重新部署服务
                    $this->service->sendDeployServiceCron($otherServiceObj->id);
                }
            }

            #执行脚本
            {
                list($serviceArr, $appArr, $nodeArr) = $this->getModel('service')->getMergeArr($serviceId, [
                    'serviceArr', 'appArr', 'nodeArr',
                ]);

                #主机中执行脚本
                {
                    $shellResult = $this->shell->runAgentShell([
                        '#shell script',
                        'echo WSY_EXEC_OK'
                    ], $nodeArr);
                    if (strstr($shellResult, 'WSY_EXEC_OK')) {
                        #执行成功
                    } else {
                        #执行失败
                    }
                }

                #在容器中执行脚本(单机应用)
                {
                    list($_, $shellResult) = $this->shell->runShellInContainer([
                        '#shell script',
                        'echo WSY_EXEC_OK'
                    ], $nodeArr, $serviceArr['name']);
                    if (strstr($shellResult, 'WSY_EXEC_OK')) {
                        #执行成功
                    } else {
                        #执行失败
                    }
                }

                #在容器中执行脚本(如果服务存在多个容器,则只在“某一个”容器中执行)
                {
                    list($_, $shellResult) = $this->shell->runShellByServiceId($serviceId, [
                        '#shell script',
                        'echo WSY_EXEC_OK'
                    ], $nodeArr);
                    if (strstr($shellResult, 'WSY_EXEC_OK')) {
                        #执行成功
                    } else {
                        #执行失败
                    }
                }
            }

            #当本服务部署成功后,重新部署其子服务
            {
                $subServiceIds = $this->getModel('service')->select('id')
                    ->where('linkServiceId', $serviceId)
                    ->pluck('id');        #请参考laravel语法
                if ($subServiceIds) {
                    foreach ($subServiceIds as $subServiceIdOne) {
                        #第二个参数表示不必部署集群,第三个参数表示强制部署子服务
                        $this->service->sendDeployServiceCron($subServiceIdOne, false, true);
                    }
                }
            }
        }

        #返回
        return $serviceArr;
    }
}
Copyright © 广州市万岁云计算有限公司 2020 all right reserved,powered by Gitbook文档最近一次修订时间: 2022-08-27 15:11:48

results matching ""

    No results matching ""