| 
					
				 | 
			
			
				@@ -4,6 +4,7 @@ const {spawn, exec, fork, execSync} = require("child_process"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const {logger} = require("./utils/logger"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const http = require("./utils/http"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const e = require("express"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const {is, tr} = require("date-fns/locale"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /******* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * web 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * **** */ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -36,6 +37,9 @@ function getApp(key) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         threadStatus: RobotStatus.STOPPED, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         errorMessage: "成功", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         threadStartTime: -1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        status: 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        restartStatus: 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // logger.info(appMap, appMap.has(key)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (appMap.has(key)) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -52,239 +56,205 @@ function delApp(key) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 async function run(param) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var key = param.id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var appName = param.path 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var app = getApp(key) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var config = getRustConfig() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return new Promise(async (resolve, reject) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var key = param.id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var appName = param.path 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var app = getApp(key) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var config = getRustConfig() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //检查当前机器人id 对应的as 是否已经启动,为了防止重复启动 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (app.status === 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            logger.info(`防止重复启动!结束当前请求`) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return resolve(false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        app.status = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /**** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     *** 第一步:防止 反复启动,先要kill一次 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     ***/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var waitForCondition = function (intervalDuration, conditionFunction) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return new Promise((resolve, reject) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const intervalId = setInterval(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (conditionFunction()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    clearInterval(intervalId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    resolve(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            }, intervalDuration); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    logger.info('当前app', app); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (app.childProcess !== undefined && app.threadStatus !== RobotStatus.STOPPED 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        && app.threadStatus !== RobotStatus.ERROR && app.threadStatus !== RobotStatus.STOP_PENDING) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        logger.info('防止重复启动,需要先杀死'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        app.threadStatus = RobotStatus.STOP_PENDING 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 初始化机器人状态 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        app.threadStatus = RobotStatus.START_PENDING 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        app.id = key 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         robotStatus(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        app.childProcess.kill() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // 当这个条件变为true时,会结束等待 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        await waitForCondition(1000, () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (app.threadStatus === RobotStatus.STOPPED) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                logger.info('成功杀死可以重新开启'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /**** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         *** 第二步:路径经组装 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         *   注意:可能存在一台服务器多个机器人,通过机器人ID创建文件夹区分,需要组装好路径 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         ***/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //系统不同 做不同的路径处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const platform = process.platform; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let exeName = appName;           //可执行程序 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // let configName = "config.toml";        //配置文件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let configName = "config.json";        //配置文件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let appPath = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (platform === 'win32') {//直接运行相对路径 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            appPath = config.winPath + "/" + app.id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else {//打包为docker 镜像 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            appPath = config.linuxPath + "/" + app.id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /**** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         *** 第三步:rust 启动程序检查(下载更新) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         ***/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var isDow = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var scheduleDow = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var scheduleConfig = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //1. 检查目录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        file.checkPathSync(appPath); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //2、 检查执行程序 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var destination = appPath + "/" + exeName 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!file.checkFilePath(destination)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            app.threadStatus = RobotStatus.DOWNLOADING 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            robotStatus(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            isDow = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var dowHeaders = {...config.headers}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (platform === 'win32') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                downloadFileWithPowerShell( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    config.baseUrl + config.dowAppURL + '/?path=' + appName, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    appPath + "/" + appName, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    dowHeaders, (err, b) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (err === null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            scheduleDow = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            app.threadStatus = RobotStatus.ERROR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            app.errorMessage = '下载失败!' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            scheduleDow = -1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            robotStatus(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                logger.info('等待杀死'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                downloadFileWithLinux( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    config.baseUrl + config.dowAppURL + '/?path=' + appName, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    appPath + "/" + appName, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    dowHeaders, (err, b) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (err === null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            scheduleDow = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            app.threadStatus = RobotStatus.ERROR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            app.errorMessage = '下载失败!' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            scheduleDow = -1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            robotStatus(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /********************新杀进程*************************************/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // await waitForCondition(1000, () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    //     if (app.threadStatus === RobotStatus.STOPPED) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    //         logger.info('成功杀死可以重新开启'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    //         return true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    //     } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    //         logger.info('等待杀死'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    //         return false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    //     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /********************新杀进程*************************************/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // 初始化机器人状态 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    app.threadStatus = RobotStatus.START_PENDING 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    app.id = key 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    robotStatus(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /**** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     *** 第二步:路径经组装 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     *   注意:可能存在一台服务器多个机器人,通过机器人ID创建文件夹区分,需要组装好路径 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     ***/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        //系统不同 做不同的路径处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    const platform = process.platform; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    let exeName = appName;           //可执行程序 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // let configName = "config.toml";        //配置文件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    let configName = "config.json";        //配置文件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    let appPath = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (platform === 'win32') {//直接运行相对路径 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        appPath = config.winPath + "/" + app.id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } else {//打包为docker 镜像 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        appPath = config.linuxPath + "/" + app.id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /**** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     *** 第三步:rust 启动程序检查(下载更新) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     ***/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var isDow = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var scheduleDow = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var scheduleConfig = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    //1. 检查目录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    file.checkPathSync(appPath); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    //2、 检查执行程序 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var destination = appPath + "/" + exeName 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!file.checkFilePath(destination)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        app.threadStatus = RobotStatus.DOWNLOADING 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        robotStatus(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        isDow = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        var dowHeaders = {...config.headers}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (platform === 'win32') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            downloadFileWithPowerShell( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                config.baseUrl + config.dowAppURL + '/?path=' + appName, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                appPath + "/" + appName, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                dowHeaders, (err, b) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (err === null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        scheduleDow = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        app.threadStatus = RobotStatus.ERROR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        app.errorMessage = '下载失败!' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        scheduleDow = -1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        robotStatus(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            downloadFileWithLinux( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                config.baseUrl + config.dowAppURL + '/?path=' + appName, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                appPath + "/" + appName, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                dowHeaders, (err, b) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (err === null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        scheduleDow = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            scheduleDow = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /**** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         *** 第四步:rust 启动配置检查(下载更新) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         ***/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //2 为防止启动指令不同,每次重新写入 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var destination2 = appPath + "/" + configName 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var urrrl = config.baseUrl + config.dowConfigURL + '/?robotId=' + app.id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var configHeaders = {...config.headers}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        http.request_get(urrrl, {...config.headers}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .then((data) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                logger.info('配置参数:', data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const json = JSON.parse(data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 处理成配置文件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const map = json.data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var json_obj = JSON.parse("{}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for (k in map) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    json_obj[k] = map[k] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // logger.info(map[k] + "\t") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                logger.info("参数组装完成!") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                te = JSON.stringify(json_obj) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                file.writeFile(destination2, te, (errer, b) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (errer === null && b === true) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        scheduleConfig = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        logger.info("配置参数写入配置失败!", errer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         app.threadStatus = RobotStatus.ERROR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        app.errorMessage = '下载失败!' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        scheduleDow = -1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        app.errorMessage = '配置参数写入配置失败!' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        scheduleConfig = -1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         robotStatus(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        scheduleDow = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .catch((e) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                logger.info("配置参数获取失败", e) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                app.threadStatus = RobotStatus.ERROR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                app.errorMessage = '配置参数获取失败!' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                scheduleConfig = -1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                robotStatus(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /**** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     *** 第四步:rust 启动配置检查(下载更新) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     ***/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        //2 为防止启动指令不同,每次重新写入 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var destination2 = appPath + "/" + configName 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var urrrl = config.baseUrl + config.dowConfigURL + '/?robotId=' + app.id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var configHeaders = {...config.headers}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    http.request_get(urrrl, {...config.headers}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        .then((data) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            logger.info('配置参数:', data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const json = JSON.parse(data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // 处理成配置文件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const map = json.data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            var json_obj = JSON.parse("{}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            for (k in map) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                json_obj[k] = map[k] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                logger.info(map[k] + "\t") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            logger.info("参数组装完成!") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            te = JSON.stringify(json_obj) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            file.writeFile(destination2, te, (errer, b) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (errer === null && b === true) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    scheduleConfig = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //监听下载只有下载完成了才能继续 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        while (true) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            await delay(5000); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let info_t = "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let info_t2 = "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //是否开启下载,如果是新下载,下载完成需要授权 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (isDow) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (scheduleDow === 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    info_t = "启动文件:下载完成!" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    //文件授权 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    execSync(`chmod +x ${appPath + "/" + appName}`, (error, stdout, stderr) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            logger.error(`启动文件:授权失败: ${error}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        logger.info(`启动文件:授权完成!`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } else if (scheduleDow === -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    info_t = "启动文件:下载失败!" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    logger.info("配置参数写入配置失败!", errer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    app.threadStatus = RobotStatus.ERROR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    app.errorMessage = '配置参数写入配置失败!' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    scheduleConfig = -1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    robotStatus(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    info_t = "启动文件:还在下载..." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        .catch((e) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            logger.info("配置参数获取失败", e) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            app.threadStatus = RobotStatus.ERROR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            app.errorMessage = '配置参数获取失败!' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            scheduleConfig = -1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            robotStatus(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    //监听下载只有下载完成了才能继续 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    while (true) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        await delay(5000); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let info_t = "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let info_t2 = "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        //是否开启下载,如果是新下载,下载完成需要授权 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (isDow) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (scheduleDow === 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                info_t = "启动文件:下载完成!" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //文件授权 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                execSync(`chmod +x ${appPath + "/" + appName}`, (error, stdout, stderr) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        logger.error(`启动文件:授权失败: ${error}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    logger.info(`启动文件:授权完成!`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } else if (scheduleDow === -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                info_t = "启动文件:下载失败!" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                info_t = "启动文件:还在下载..." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                info_t = "启动文件:完整无需下载" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            info_t = "启动文件:完整无需下载" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (scheduleConfig === 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            info_t2 = "配置文件:读取成功!" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } else if (scheduleConfig === -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            info_t = "配置文件:读取失败!" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            info_t2 = "配置文件:还在读取..." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        logger.info(info_t, info_t2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (scheduleDow === 1 && scheduleConfig === 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } else if (scheduleConfig === -1 || scheduleDow === -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (scheduleConfig === 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                info_t2 = "配置文件:读取成功!" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else if (scheduleConfig === -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                info_t = "配置文件:读取失败!" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                info_t2 = "配置文件:还在读取..." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            logger.info(info_t, info_t2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (scheduleDow === 1 && scheduleConfig === 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else if (scheduleConfig === -1 || scheduleDow === -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return resolve(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    app.threadStatus = RobotStatus.START_PENDING 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    robotStatus(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    logger.info("开始启动程序!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    //3. spawn启动 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    const exePath = appPath + "/" + exeName 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    const configPath = appPath + "/" + configName 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    logger.info(`文件地址:${exePath}-----${configPath}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    const command = exePath 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    const args = ['--config=' + configPath] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    app.childProcess = spawn(command, args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    app.threadStartTime = new Date().getTime() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /**********监听*********/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    app.childProcess.stdout.on('data', (msg) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // logger.info('stdout:' + msg.toString()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        app.threadStatus = RobotStatus.START_PENDING 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        robotStatus(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        logger.info("开始启动程序!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //3. spawn启动 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const exePath = appPath + "/" + exeName 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const configPath = appPath + "/" + configName 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        logger.info(`文件地址:${exePath}-----${configPath}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const command = exePath 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const args = ['--config=' + configPath] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        app.childProcess = spawn(command, args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        app.threadStartTime = new Date().getTime() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /**********监听*********/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        app.childProcess.stdout.on('data', (msg) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // logger.info('stdout:' + msg.toString()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    app.childProcess.on('message', (msg) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // logger.info(`message: ${msg}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    app.childProcess.on('exit', (code, signal) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        logger.info(`子进程退出-exit,退出码: ${code}, 信号: ${signal}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        app.childProcess.on('message', (msg) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // logger.info(`message: ${msg}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        app.childProcess.on('exit', (code, signal) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            logger.info(`子进程退出-exit,退出码: ${code}, 信号: ${signal}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    app.childProcess.on('close', (code) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        logger.info(`子进程退出-close,退出码 ${code}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        app.threadStatus = RobotStatus.STOPPED 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        robotStatus(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    app.threadStatus = RobotStatus.RUNNING 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        app.childProcess.on('close', (code) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            logger.info(`子进程退出-close,退出码 ${code}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            app.threadStatus = RobotStatus.STOPPED 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            robotStatus(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            app.childProcess = undefined 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            app.status = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        app.threadStatus = RobotStatus.RUNNING 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return resolve(true) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function delay(ms) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -292,14 +262,172 @@ function delay(ms) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 async function closeApp(param) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return new Promise((resolve, reject) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var key = param.id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var app = getApp(key) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        logger.info(` 信号:  `, app.threadStatus); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /*******新的删除方式*************/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //文件授权 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (app.childProcess !== undefined) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var pid = app.childProcess.pid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            exec(`sudo kill ${pid}`, (error, stdout, stderr) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    logger.error(`进程${pid} 杀死失败: ${error}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                logger.info(`进程${pid} 杀死成功`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                logger.info(`当前app:`, app); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                app.threadStatus = RobotStatus.STOP_PENDING 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                robotStatus(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return resolve(true) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /*******新的删除方式*************/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//重启 RESTART 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+async function restartApp(param) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     var key = param.id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     var app = getApp(key) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    logger.info(` 信号:  `, app.threadStatus); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (app.threadStatus === RobotStatus.RUNNING) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        app.childProcess.kill('SIGTERM'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        app.threadStatus = RobotStatus.STOP_PENDING 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        robotStatus(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    var restartStatus = app.restartStatus 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (restartStatus !== 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        logger.info("防止重启指令 重复发送~!") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    app.restartStatus = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    logger.info("--开始重启!") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    logger.info('当前app', app.id, app.threadStatus); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const closeResult = await closeApp(param) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    logger.info('?', JSON.stringify(closeResult)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    while (true) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        await delay(1000) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const runResult = await run(param) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        logger.info('??', JSON.stringify(runResult)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (runResult) break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // var isOK = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // var killCount = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // if (app.id === -1 || (app.childProcess === undefined && app.status === 0)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     isOK = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     var pid = app.childProcess.pid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     logger.info(`当前pid:${pid}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     //1 通过指令查询是否存在 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     var pidIsOK = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     exec(`sudo ps -p ${pid} > /dev/null && echo "true" || echo "false"`, (error, stdout, stderr) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         if (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //             logger.error(`进程${pid} 查询失败: ${error}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //             return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         logger.info(`进程查询结果:${stdout}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         var z = `${stdout}` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         if (z === "true") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //             pidIsOK = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     if (pidIsOK) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         if (killCount === 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //             killCount = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //             exec(`sudo kill ${pid}`, (error, stdout, stderr) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                 if (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                     logger.error(`进程${pid} 杀死失败: ${error}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                 logger.info(`进程${pid} 杀死成功`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                 logger.info(`当前app:`, app); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                 app.threadStatus = RobotStatus.STOP_PENDING 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                 robotStatus(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                 isOK = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //             logger.info(`灭杀指令已发送..等待结果!`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         isOK = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // while (true) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     await delay(2000); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     if(isOK){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         logger.info("----等待~~~") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // //开始重启 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // var killCount = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // var waitForCondition = function (intervalDuration, conditionFunction) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     return new Promise((resolve, reject) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         const intervalId = setInterval(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //             if (conditionFunction()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                 clearInterval(intervalId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                 resolve(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         }, intervalDuration); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // // 当这个条件变为true时,会结束等待 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // await waitForCondition(1000, () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     logger.info('当前app', app.id, app.threadStatus); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     var isOK = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     if (app.id === -1 || (app.childProcess === undefined && app.status === 0)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         isOK = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         var pid = app.childProcess.pid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         logger.info(`当前pid:${pid}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         //1 通过指令查询是否存在 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         var pidIsOK = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         execSync(`sudo ps -p ${pid} > /dev/null && echo "true" || echo "false"`, (error, stdout, stderr) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //             if (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                 logger.error(`进程${pid} 查询失败: ${error}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                 return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //             logger.info(`进程查询结果:${stdout}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //             if (stdout === "true") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                 pidIsOK = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         if (pidIsOK) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //             if (killCount === 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                 killCount = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                 execSync(`sudo kill ${pid}`, (error, stdout, stderr) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                     if (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                         logger.error(`进程${pid} 杀死失败: ${error}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                     logger.info(`进程${pid} 杀死成功`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                     logger.info(`当前app:`, app); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                     app.threadStatus = RobotStatus.STOP_PENDING 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                     robotStatus(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                     isOK = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                 }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //             } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //                 logger.info(`灭杀指令已发送..等待结果!`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //             isOK = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     if (isOK) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //         return true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     return false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //启动 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // run(param) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    app.restartStatus = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    logger.info(`重启完成!!!!!`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -346,7 +474,7 @@ function robotStatus(app) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         "msg": msg 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }, {...config.headers}).then((data) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // logger.info('??', data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        logger.info('汇报--状态:', '机器人id:', app.id, '状态:', app.threadStatus); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        logger.info('#####################汇报:状态:', '机器人id:', app.id, '状态:', app.threadStatus); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }).catch((error) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         logger.error(`请求遇到问题1: ${error.message}`); // 处理可能发生的错误 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -368,7 +496,7 @@ function robotAmount(app) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     }, {...config.headers}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         .then((data2) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             // logger.info('上报响应', data2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            logger.info('汇报--余额:pid:', app.childProcess.pid, '机器人id:', app.id, '机器人本地余额:', app.nowBalance, '实际余额:', d.now_balance); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            logger.info('#####################汇报:余额:pid:', app.childProcess.pid, '机器人id:', app.id, '机器人本地余额:', app.nowBalance, '实际余额:', d.now_balance); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         }).catch((error) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         logger.error(`请求遇到问题:2 ${error.message}`); // 处理可能发生的错误 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     }); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -384,14 +512,14 @@ function robotAmount(app) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // 定时清理停止状态的 机器人 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function delRobot(app) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    const platform = process.platform; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (platform !== 'win32' && app.threadStatus === RobotStatus.STOPPED) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        var pid = app.childProcess.pid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        delApp(app.id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // const platform = process.platform; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // if (platform !== 'win32' && app.threadStatus === RobotStatus.STOPPED) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     var pid = app.childProcess.pid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //     delApp(app.id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 module.exports = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    run, closeApp, delRobot, robotStatus, robotAmount, appMap, RobotStatus 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    run, closeApp, restartApp, delRobot, robotStatus, robotAmount, appMap, RobotStatus 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }; 
			 |