Subversion Repositories php-qbpwcf

Rev

Rev 152 | Rev 239 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 152 Rev 226
Line 1... Line 1...
1
#!/usr/bin/php
1
#!/usr/bin/php
2
<?php
2
<?php
3
 
3
 
4
/*
4
/*
5
	QBPWCF, Quick Build PHP website Component base on Fedora Linux.
5
	QBPWCF, Quick Build PHP website Component base on Fedora Linux.
6
    Copyright (C) 2015~2024 Min-Jhin,Chen
6
    Copyright (C) 2014~2025 MIN ZHI, CHEN
7
 
7
 
8
    This file is part of QBPWCF.
8
    This file is part of QBPWCF.
9
 
9
 
10
    QBPWCF is free software: you can redistribute it and/or modify
10
    QBPWCF is free software: you can redistribute it and/or modify
11
    it under the terms of the GNU General Public License as published by
11
    it under the terms of the GNU General Public License as published by
Line 17... Line 17...
17
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
    GNU General Public License for more details.
18
    GNU General Public License for more details.
19
 
19
 
20
    You should have received a copy of the GNU General Public License
20
    You should have received a copy of the GNU General Public License
21
    along with QBPWCF.  If not, see <http://www.gnu.org/licenses/>.
21
    along with QBPWCF.  If not, see <http://www.gnu.org/licenses/>.
22
    
22
 
23
*/
23
*/
24
 
24
 
25
/*
25
/*
26
 
26
 
27
說明:
27
說明:
Line 73... Line 73...
73
	#結束執行,回傳shell 1.
73
	#結束執行,回傳shell 1.
74
	exit(1);
74
	exit(1);
75
 
75
 
76
	}#if end
76
	}#if end
77
 
77
 
78
#設置 include path 
78
#設置 include path
79
set_include_path($output[0].PATH_SEPARATOR.get_include_path());
79
set_include_path($output[0].PATH_SEPARATOR.get_include_path());
80
 
80
 
81
#匯入外部套件
81
#匯入外部套件
82
include("allInOne.php");
82
include("allInOne.php");
83
 
83
 
84
#說明函式
84
#說明函式
85
function help(){
85
function help(){
86
 
86
 
87
	#印出指令說明
87
	#印出指令說明
88
	echo "Usage of ".basename(__FILE__).":".PHP_EOL; 
88
	echo "Usage of ".basename(__FILE__).":".PHP_EOL;
89
	echo "--cmd [command to run] 代表要執行的指令,若有多個則會按照順序執行.".PHP_EOL;
89
	echo "--cmd [command to run] 代表要執行的指令,若有多個則會按照順序執行.".PHP_EOL;
90
	echo "--name [servie name] 服務的名稱".PHP_EOL;
90
	echo "--name [servie name] 服務的名稱".PHP_EOL;
91
	echo "--runOnBoot [yes/no] 開機好就要啟動該服務,預設為yes.".PHP_EOL;
91
	echo "--runOnBoot [yes/no] 開機好就要啟動該服務,預設為yes.".PHP_EOL;
92
	echo "--runNow [yes/no] 馬上運行服務,預設為yes.".PHP_EOL;
92
	echo "--runNow [yes/no] 馬上運行服務,預設為yes.".PHP_EOL;
93
	echo "--keepServiceUp [yes/no] 是否要加增確保該服務在線的設定,預設為no.".PHP_EOL;
93
	echo "--keepServiceUp [yes/no] 是否要加增確保該服務在線的設定,預設為no.".PHP_EOL;
94
	echo "--interval [秒數] 要多少時間就檢查一次服務是否在線.".PHP_EOL;
94
	echo "--interval [秒數] 要多少時間就檢查一次服務是否在線.".PHP_EOL;
95
	echo "--checkListenIp [ipv4/ipv6]:[port]/[tcp/udp] 要檢查哪個ip位置的port與protocol有被使用,才代表服務有在線.".PHP_EOL;
95
	echo "--checkListenIp [ipv4/ipv6]:[port]/[tcp/udp] 要檢查哪個ip位置的port與protocol有被使用,才代表服務有在線.".PHP_EOL;
96
	echo "\tip可用*代表所有網路界面取得的ip.".PHP_EOL;
96
	echo "\tip可用*代表所有網路界面取得的ip.".PHP_EOL;
97
	echo "--checkListenAddr [path to socket] 要檢查哪個路徑的unix domain socket有被使用,才代表服務有在線".PHP_EOL;
97
	echo "--checkListenAddr [path to socket] 要檢查哪個路徑的unix domain socket有被使用,才代表服務有在線".PHP_EOL;
98
	echo "--checkCmd [command to check service] 用於確認服務是否有在線的指令,timeout為10秒.".PHP_EOL;
98
	echo "--checkCmd [command to check service] 用於確認服務是否有在線的指令,timeout為10秒.".PHP_EOL;
99
	
99
 
100
	#結束執行
100
	#結束執行
101
	exit;
101
	exit;
102
 
102
 
103
	}#function help end
103
	}#function help end
104
 
104
 
Line 140... Line 140...
140
 
140
 
141
	#結束執行
141
	#結束執行
142
	exit;
142
	exit;
143
 
143
 
144
	}#if end
144
	}#if end
145
	
145
 
146
#檢查參數
146
#檢查參數
147
#函式說明:
147
#函式說明:
148
#檢查必填與可省略參數,可省略參數可指定預設要給與什麼數值內容。
148
#檢查必填與可省略參數,可省略參數可指定預設要給與什麼數值內容。
149
#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
149
#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
150
#$reuslt["error"],執行不正常結束的錯訊息陣列.
150
#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 195... Line 195...
195
#若執行失敗
195
#若執行失敗
196
if($checkArguments["status"]==="false"){
196
if($checkArguments["status"]==="false"){
197
 
197
 
198
	#印出結果
198
	#印出結果
199
	var_dump($checkArguments);
199
	var_dump($checkArguments);
200
	
200
 
201
	#結束執行
201
	#結束執行
202
	exit;
202
	exit;
203
 
203
 
204
	}#if end
204
	}#if end
205
 
205
 
206
#若檢查不通過
206
#若檢查不通過
207
if($checkArguments["passed"]==="false"){
207
if($checkArguments["passed"]==="false"){
208
 
208
 
209
	#提示用法
209
	#提示用法
210
	help();
210
	help();
211
	
211
 
212
	#結束執行
212
	#結束執行
213
	exit;
213
	exit;
214
 
214
 
215
	}#if end
215
	}#if end
216
 
216
 
217
#針對每個要執行的指令字串
217
#針對每個要執行的指令字串
218
foreach($parseArgu["content"]["cmd"] as $index => $cmdStr){
218
foreach($parseArgu["content"]["cmd"] as $index => $cmdStr){
219
 
219
 
220
	#解析成程式與參數
220
	#解析成程式與參數
221
	#函式說明:
221
	#函式說明:
222
	#將指令字串解析成陣列,方便給予 external::callShell 使用 
222
	#將指令字串解析成陣列,方便給予 external::callShell 使用
223
	#回傳結果:
223
	#回傳結果:
224
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
224
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
225
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
225
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
226
	#$result["function"],當前執行的函式名稱.
226
	#$result["function"],當前執行的函式名稱.
227
	#$result["content"],解析好的指令陣列.
227
	#$result["content"],解析好的指令陣列.
Line 243... Line 243...
243
	#若執行失敗
243
	#若執行失敗
244
	if($parseCmdString["status"]==="false"){
244
	if($parseCmdString["status"]==="false"){
245
 
245
 
246
		#印出結果
246
		#印出結果
247
		var_dump($parseCmdString);
247
		var_dump($parseCmdString);
248
		
248
 
249
		#結束執行
249
		#結束執行
250
		exit;
250
		exit;
251
 
251
 
252
		}#if end
252
		}#if end
253
		
253
 
254
	#取得要執行的程式
254
	#取得要執行的程式
255
	$cmds[]=$parseCmdString["cmd"];
255
	$cmds[]=$parseCmdString["cmd"];
256
	
256
 
257
	#若存在程式對應的參數
257
	#若存在程式對應的參數
258
	if(isset($parseCmdString["argus"])){
258
	if(isset($parseCmdString["argus"])){
259
	
259
 
260
		#取得程式對應的參數
260
		#取得程式對應的參數
261
		$argus[]=$parseCmdString["argus"];
261
		$argus[]=$parseCmdString["argus"];
262
	
262
 
263
		}#if end
263
		}#if end
264
	
264
 
265
	#反之
265
	#反之
266
	else{
266
	else{
267
	
267
 
268
		#設置無該程式的參數
268
		#設置無該程式的參數
269
		$argus[]=null;
269
		$argus[]=null;
270
	
270
 
271
		}#else end
271
		}#else end
272
 
272
 
273
	}#foreache end
273
	}#foreache end
274
 
274
 
275
#取得要執行服務的指令
275
#取得要執行服務的指令
Line 295... Line 295...
295
#如果 runNow參數 是 yes
295
#如果 runNow參數 是 yes
296
if($parseArgu["content"]["runNow"][0]==="yes"){
296
if($parseArgu["content"]["runNow"][0]==="yes"){
297
 
297
 
298
	#轉換為 "true"
298
	#轉換為 "true"
299
	$runNow="true";
299
	$runNow="true";
300
	
300
 
301
	}#if end
301
	}#if end
302
 
302
 
303
#預設不用 cmd::keepServiceUp 來確保服務
303
#預設不用 cmd::keepServiceUp 來確保服務
304
$keepServiceUp="false";
304
$keepServiceUp="false";
305
 
305
 
306
#如果有指定 keepServiceUp
306
#如果有指定 keepServiceUp
307
if(isset($parseArgu["content"]["keepServiceUp"][0])){
307
if(isset($parseArgu["content"]["keepServiceUp"][0])){
308
 
308
 
309
	#如果參數 keepServiceUp 為 "true"
309
	#如果參數 keepServiceUp 為 "true"
310
	if($parseArgu["content"]["keepServiceUp"][0]==="yes"){
310
	if($parseArgu["content"]["keepServiceUp"][0]==="yes"){
311
	
311
 
312
		#設置 keepServiceUp 為 "true"
312
		#設置 keepServiceUp 為 "true"
313
		$keepServiceUp="true";
313
		$keepServiceUp="true";
314
	
314
 
315
		}#if end
315
		}#if end
316
 
316
 
317
	}#if end
317
	}#if end
318
 
318
 
319
#如果有指定 interval
319
#如果有指定 interval
Line 321... Line 321...
321
 
321
 
322
	#設定interval
322
	#設定interval
323
	$interval=$parseArgu["content"]["interval"][0];
323
	$interval=$parseArgu["content"]["interval"][0];
324
 
324
 
325
	}#if end
325
	}#if end
326
	
326
 
327
#初始化儲存判斷的方式
327
#初始化儲存判斷的方式
328
$checkListen=array();
328
$checkListen=array();
329
	
329
 
330
#如果有指定 checkListenIp
330
#如果有指定 checkListenIp
331
if(isset($parseArgu["content"]["checkListenIp"])){
331
if(isset($parseArgu["content"]["checkListenIp"])){
332
 
332
 
333
	#針對每個 checkListenIp
333
	#針對每個 checkListenIp
334
	foreach($parseArgu["content"]["checkListenIp"] as $checkListenIp){
334
	foreach($parseArgu["content"]["checkListenIp"] as $checkListenIp){
335
	
335
 
336
		#記錄要檢查的ip & port & protocol
336
		#記錄要檢查的ip & port & protocol
337
		$checkListen[]=array("ip"=>$checkListenIp);
337
		$checkListen[]=array("ip"=>$checkListenIp);
338
	
338
 
339
		}#foreach end
339
		}#foreach end
340
	
340
 
341
	}#if end
341
	}#if end
342
	
342
 
343
#如果有指定 checkListenAddr
343
#如果有指定 checkListenAddr
344
if(isset($parseArgu["content"]["checkListenAddr"])){
344
if(isset($parseArgu["content"]["checkListenAddr"])){
345
 
345
 
346
	#針對每個 checkListenAddr
346
	#針對每個 checkListenAddr
347
	foreach($parseArgu["content"]["checkListenAddr"] as $checkListenAddr){
347
	foreach($parseArgu["content"]["checkListenAddr"] as $checkListenAddr){
348
	
348
 
349
		#記錄要檢查的 unix domain socket 路徑
349
		#記錄要檢查的 unix domain socket 路徑
350
		$checkListen[]=array("addr"=>$checkListenAddr);
350
		$checkListen[]=array("addr"=>$checkListenAddr);
351
	
351
 
352
		}#foreach end
352
		}#foreach end
353
 
353
 
354
	}#if end
354
	}#if end
355
 
355
 
356
#如果有指定 checkCmd
356
#如果有指定 checkCmd
357
if(isset($parseArgu["content"]["checkCmd"])){
357
if(isset($parseArgu["content"]["checkCmd"])){
358
 
358
 
359
	#針對每個 checkCmd
359
	#針對每個 checkCmd
360
	foreach($parseArgu["content"]["checkCmd"] as $checkCmd){
360
	foreach($parseArgu["content"]["checkCmd"] as $checkCmd){
361
	
361
 
362
		#另外儲存成指定的格式
362
		#另外儲存成指定的格式
363
		$checkCmd=array("cmd"=>$checkCmd);
363
		$checkCmd=array("cmd"=>$checkCmd);
364
	
364
 
365
		#記錄用於檢查服務是否在線的指令
365
		#記錄用於檢查服務是否在線的指令
366
		$checkListen[]=array("cmd"=>$checkCmd);
366
		$checkListen[]=array("cmd"=>$checkCmd);
367
	
367
 
368
		}#foreach end
368
		}#foreach end
369
 
369
 
370
	}#if end
370
	}#if end
371
 
371
 
372
#函式說明:
372
#函式說明:
Line 405... Line 405...
405
 
405
 
406
	#$conf["cmd::keepServiceUp"]["checkListen"],#$conf["checkListen"],陣列,用來判斷服務是否有正確啟動的條件,一個元素代表,其中要有一個socket info符合之,若元素的key為"ip",則其數值為[ipv4/ipv6]:port/protocol(tcp/udp);若元素的key為"addr",則其數值為unix domain socket 的位置與名稱;若元素的key為"name",則其數值為程序名稱;若元素的key為"cmd",則其數值為一陣列,該陣列的key有cmd,其value為要執行的指令,另外一個key為timeout,其value為秒數,預設為10秒,代表指令於10秒內結束為正常,反之為異常.
406
	#$conf["cmd::keepServiceUp"]["checkListen"],#$conf["checkListen"],陣列,用來判斷服務是否有正確啟動的條件,一個元素代表,其中要有一個socket info符合之,若元素的key為"ip",則其數值為[ipv4/ipv6]:port/protocol(tcp/udp);若元素的key為"addr",則其數值為unix domain socket 的位置與名稱;若元素的key為"name",則其數值為程序名稱;若元素的key為"cmd",則其數值為一陣列,該陣列的key有cmd,其value為要執行的指令,另外一個key為timeout,其value為秒數,預設為10秒,代表指令於10秒內結束為正常,反之為異常.
407
	$conf["cmd::keepServiceUp"]["checkListen"]=$checkListen;
407
	$conf["cmd::keepServiceUp"]["checkListen"]=$checkListen;
408
 
408
 
409
	}#if end
409
	}#if end
410
	
410
 
411
#如果存在 $interval
411
#如果存在 $interval
412
if(isset($interval)){
412
if(isset($interval)){
413
 
413
 
414
	#$conf["cmd::keepServiceUp"]["interval"],字串,檢查沒問題後,要多少秒後再檢查一次,預設為30秒,亦即"30".
414
	#$conf["cmd::keepServiceUp"]["interval"],字串,檢查沒問題後,要多少秒後再檢查一次,預設為30秒,亦即"30".
415
	$conf["cmd::keepServiceUp"]["interval"]=$interval;
415
	$conf["cmd::keepServiceUp"]["interval"]=$interval;