//*********************************************
//
//	DataStage JOB 実行監視ツール
//
//		By Akito Kobayashi 2004.09.27
//
//=============================================
// 開始コマンド
//	coal -4 -P65530 ps_DSD.cl 15 0 0 '' '' 1
// 停止コマンド
//	shut . 65530 -A -D
//*********************************************
define array $a 30;			// ps list のアーギュメント格納配列
define array $tbl 100 1442;	// Job実行時刻テーブル(Jobは100個まで登録可能)
							// 24h * 60m + 2, +2 はuser名とJob名用
proc main;
	if (%0 < 1);	// sleepは、必須
		fputline(STDERR,'\nusage: ',SCRIPTNAME,' sleep [display_interval] [stop_count]\n		 [load_tbl date] [output_file] [full_disp]');
	fputline(STDERR,'	sleep        : ps を実行する間隔(sec)');
	fputline(STDERR,'	interval     : 表示する間隔(sleepの何回おき)\n
	               0 以下のときは、３分間隔で表示するように自動計算');
	fputline(STDERR,'	stop_count   : 停止カウント(何回表示した後)\n
	               0 以下のときは、停止しない');
	fputline(STDERR,'	load_tbl date: 保存・読み込みファイルの日付(yyyymmdd)\n
	               save_file = /tmp/sol01/pr_DSD.tbl.yyyymmdd');
	fputline(STDERR,'	output_file  : Job実行table表示ファイル(default:stdout)');
	fputline(STDERR,'	full_disp    : Job名full表示フラグ(0 以外のときfull)');
	fputline(STDERR);
		return ERROR;
	end if;

	let options 2 3;

// ps list のアーギュメント位置
IF 0;	// HP-UX
	$i_user = 2;
	$i_cmnd = 14;
	$i_job  = 16;
ELSE;	// test for Cygwin
	$i_user = 0;
	$i_cmnd = 5;
	$i_job  = 5;
ENDIF;

	$save_file = '/tmp/sol01/pr_DSD.tbl';	// 保存・読み込みファイル
											// $save_file.yyyymmdd
	$sleep = 0;			// ps を実行する間隔(sec)
	$interval = 0;		// 表示する間隔(sleepの何回おき)
						//   0 以下のときは、３分間隔で表示するように自動計算
	$stop_count = 0;	// 停止カウント(何回表示した後)
						//   0 以下のときは、停止しない
	$output_file = '';	// Job実行table表示ファイル(default:stdout)
	$full_disp =  0;	// Job名full表示フラグ(0 以外のときfull)
	if (%0 >= 1);
		$sleep = %1 + 0;
		if ($sleep < 10); $sleep = 10; endif;
	endif;
	if (%0 >= 2); $interval = %2 + 0; endif;
	if ($interval <= 0);
		$interval = (180+$sleep-1)/$sleep;
	endif;
	if (%0 >= 3);
		$stop_count = %3 + 0;
		if ($stop_count < 0); $stop_count = 0; endif;
	endif;
	if (%0 >= 5);
		$output_file = %5;
	endif;
	if (%0 >= 6);
		$full_disp = %6 + 0;
	endif;
print 'sleep=' $sleep 'display_interval=' $interval
	'stop_count=' $stop_count 'load_date=' %4 'output_file=' $output_file
	'full_disp=' $full_disp;

	$load_hmin = 24;	// tableにデータが存在する最小時間
	$load_hmax = 0;		// tableにデータが存在する最大時間
	$count = 0;			// user+job の登録数
	exec ip load_tbl;
	if (ERROR < 0); return ERROR; end if;

	$h = TIME/1000;
	if ($h < $load_hmin); $load_hmin = $h; endif;
print '$load_hmin=' $load_hmin '$load_hmax=' $load_hmax;

	$int_cnt = $interval;
	loop while !ERROR;
//		if (shutctl()); break; endif;
		exec ip update_tbl;				// table更新
		if (ERROR < 0); break; end if;
		$int_cnt--;
		if ($int_cnt <= 0);
			exec ip display;			// table表示
			if (ERROR < 0); break; end if;
			if ($stop_count > 0);
				$stop_count--;
				if ($stop_count <= 0); break; endif;
			endif;
			$int_cnt = $interval;
		end if;
		sleep $sleep;
//print ERROR ERRMSG;
	end loop;
	exec ip save_tbl;
	return ERROR;
end proc;

/********************************/
/*		table更新				*/
/********************************/
proc update_tbl;
	$fpp = popen('ps_DSD.sh');			// shell の実行
	if (ERROR < 0); return ERROR; end if;
	loop while (1);
		$line = fgetline($fpp);			// shell 実行結果の入力
		if (ERROR < 0); break; end if;
		$c = substr($line,1,3);
//print '$c=' $c;
		if ($c == '---'); let continue; end if;
		$n = getargs($line,$a,30);
//print '$n=' $n;
		if ($c == '+++');
			$time = $a[2];
			$h = substr($time,1,2) + 0;
			$m = substr($time,4,2);
			$t = $h*60 + $m + 2;
			if ($h < $load_hmin); $load_hmin = $h; endif;
			if ($h > $load_hmax); $load_hmax = $h; endif;
print '$time=' $time $t '$load_hmin=' $load_hmin '$load_hmax=' $load_hmax '$int_cnt=' $int_cnt;
		else;
			if ($a[$i_cmnd]=='egrep'); let continue; end if;
			$user = $a[$i_user];
			$job  = $a[$i_job];
			$user_job = concat($user,'_',$job);
			$index = $$user_job;	// $user_job の内容を変数名とする変数に
									// 登録位置が入っている
//print '$user=' $user '$job=' $job '$index=' $index;
			if ($index == '');			// user+job 未登録時
				$index = $count;
				$tbl[$index,0] = $user;
				$tbl[$index,1] = $job;
//print '$index=' $index $tbl[$index,0] $tbl[$index,1];
				$$user_job = $index;// $user_job の内容を変数名とする変数に
									// 登録位置を入れる
				$count++;
				$tbl[$index,$t] = '*';
				exec ip display_now;
			else;
				$tbl[$index,$t] = '*';
			end if;
//print 'tbl='  $tbl[$index,0] $tbl[$index,1] $tbl[$index,$t];
		end if;
	end loop;
	pclose($fpp);
	return ERROR;
end proc;

/********************************/
/*		table表示制御			*/
/********************************/
proc display;
	if (!$count); return 0; endif;
	if ($output_file != '');
		$fp = fopen($output_file,'w');
		if (ERROR); return ERROR; endif;
	else;
		$fp = STDOUT;
	endif;
	fputline($fp,'\\n\\n');
	$s = strings(' ',16);
	$h = $load_hmin;
	loop 24-$h;
		$index = 0;
		$head = 1;
		loop $count;
			$m = 0;
			loop 60;
				if ($tbl[$index,$h*60 + $m + 2]); break; end if;
				$m++;
			end loop;
			if ($m < 60);
				exec ip display_body;
			end if;
			$index++;
		end loop;
		$h++;
		if ($h > $load_hmax); break; endif;
	end loop;
	if ($fp != STDOUT);
		fclose($fp);
	endif;
	return ERROR;
end proc;

/********************************/
/*		table表示実体			*/
/********************************/
proc display_body;
	if ($head);
		$c = $h;
		if ($c < 10); $c = concat(' ',$c); end if;
		if ($output_file);
			$ss = strings(' ',26);
		else;
			$ss = $s;
		endif;
		fputline($fp,$ss,$c,':00      10        20        30        40        50');
//		fputline($fp,$ss,'  ',strings('+---------',6));
		$head = 0;
	end if;
	$cc = concat($tbl[$index,0],' ',$tbl[$index,1]);
	if ($output_file);
		$c = concat($cc,$s,$s);
		$c = substr($c,1,26);
	else;
		if ($full_disp && (is($cc,'len')>16));
			fputline($fp,$cc);
			$c = $s;
		else;
			$c = concat($cc,$s);
			$c = substr($c,1,16);
		endif;
	endif;
	felwrite($fp,$c,' |');
	$m = 0;
	loop 60;
		$c = $tbl[$index,$h*60 + $m + 2];
		if ($c=='');
			if (mod($m,10));
				$c = '-';
			else;
				$c = '+';
			end if;
		end if;
		felwrite($fp,$c);
		$m++;
	end loop;
	fputline($fp,'|');
	return ERROR;
end proc;

/********************************/
/*	Job実行開始時のtable表示	*/
/********************************/
proc display_now;
	if (!$count); return 0; endif;
	if ($output_file != '');
		$fp = fopen($output_file,'w');
		if (ERROR); return ERROR; endif;
	else;
		$fp = STDOUT;
	endif;
	$s = strings(' ',16);
//	fputline($fp,'\\n\\n');
	$head = 1;
	$m = 0;
	exec ip display_body;
	if ($fp != STDOUT);
		fclose($fp);
	endif;
	return ERROR;
end proc;

/********************************/
/*		table保存				*/
/********************************/
proc save_tbl;
	if (!$count); return 0; endif;
	$fp = fopen(concat($save_file,'.',DATE),'w');
	if (ERROR); return ERROR; endif;
	$h = $load_hmin;
	loop 24-$h;
		$index = 0;
		loop $count;
			$m = 0;
			loop 60;
				$t = $h*60 + $m + 2;
				if ($tbl[$index,$t]);
					fputline($fp,$tbl[$index,0],' ',$tbl[$index,1],' ',$h,' ',$m);
				end if;
				$m++;
			end loop;
			$index++;
		end loop;
		$h++;
		if ($h > $load_hmax); break; endif;
	end loop;
	fclose($fp);
	return ERROR;
end proc;

/********************************/
/*		table読み込み			*/
/********************************/
proc load_tbl;
	$date = DATE;
	if (%0>=4 && %4!='');
		$date = %4;
	endif;
	$fp = fopen(concat($save_file,'.',$date),'r');
	if (ERROR); return 0; endif;
	loop while (1);
		$line = fgetline($fp);
		if (ERROR < 0); break; end if;
		$n = getargs($line,$a,4);
		if ($n >= 4);
			$user = $a[0];
			$job  = $a[1];
			$user_job = concat($user,'_',$job);
			$index = $$user_job;
			if ($index == '');	// user+job 未登録時
				$index = $count;
				$tbl[$index,0] = $user;
				$tbl[$index,1] = $job;
				$$user_job = $index;
				$count++;
			end if;
			$h = $a[2] + 0;
			if ($h < $load_hmin); $load_hmin = $h; endif;
			if ($h > $load_hmax); $load_hmax = $h; endif;
			$t = $h*60 + $a[3] + 2;
			$tbl[$index,$t] = '*';
		endif;
	end loop;
	fclose($fp);
	exec ip display;
	return ERROR;
end proc;
