#!/usr/bin/perl

# Copyright (C) 2001 NEC Corporation
# All Rights Reserved.

# RCS: $Id: wbmc_trip,v 1.1.1.1 2004/09/09 08:14:21 snavi Exp $

##011228 create murakami

#############################################################
# Cronにより自動起動されるコマンド（整合性チェック＋DB更新）#
#                     wbmc_trip                             #
#############################################################

# 必要な関数があればインポート
require "/opt/nec/wbmc/lib/wbmc.pl";
require "/opt/nec/wbmc/adm/system/tripwire/tripwire.pl";
require "/opt/nec/wbmc/lib/cluster_com.pl";

## Cron実行コマンド

# wbmc_trip -i : 整合性チェック＋DB更新
# wbmc_trip -c : 整合性チェック
# wbmc_trip -d : DB更新
# コマンドのオプションは、$ARGV[0] に格納されている

# クラスタ判定
# フェイルオーバ構成で、待機系の場合は実行不可とする
if (&cluster_masterchk() eq "slave") {
	print "フェイルオーバ構成、待機系時は実行されません。";
	exit (1);
}

############ -cオプション時の動作（-iオプション時も実行される）#############
if ($ARGV[0] eq "-i" || $ARGV[0] eq "-c") {
# チェックコマンド取得処理
# /etc/opt/nec/wbmc/wbmc_tripconf 内の EMAIL_CMD の値を取得
	$cmd = &GetCheckcmd();
	# コマンド実行
	system("$cmd -n >/dev/null 2>&1");
	$? = $?/1024;
	# 成功判定は、コマンドの返り値を用いて行う
	if ($? != 0) {
		print "\n整合性チェックの実行に失敗しました。データベースが更新されていない可能性があります。\n";
	## レポート削除処理
	$err_msg = &DelReport();
    	if ($err_msg) {
			print "整合性チェックは正常に終了しましたが、$err_msg<BR>";
    	}
	}
}
############ -cオプション時の動作 ここまで #############
############ -dオプション時の動作（-iオプション時も実行される）#############
if ($ARGV[0] eq "-i" || $ARGV[0] eq "-d") {
## DB更新時に、設定されているドメインに対しては、
## ユーザ一覧を取得して、ポリシーの再設定を行う。

###### 中間ファイル(wbmc_middlepolicy)生成ここから #####
	# ファイル名定義
	$trip_middlepol = "/etc/opt/nec/wbmc/wbmc_middlepolicy";
	$trip_middlepol_lock = "wbmc_middlepolicy";

	# 中間ファイルの読み込み
	@conf = ();
	if (-f $trip_middlepol) {
		if (!&readFile($trip_middlepol, $trip_middlepol_lock, *conf)) {
			print("中間ファイル(/etc/opt/nec/wbmc/wbmc_middlepolicy)の読み込みに失敗しました。ロックがかかっている可能性があります。しばらく待って、再度操作してください。");
			exit(1);
		}
	} else {
		print("中間ファイル(/etc/opt/nec/wbmc/wbmc_middlepolicy)が存在しません。設定ファイルのバックアップを取っている場合は、ファイルをリストアしてください。") ;
		exit(1);
	}

	## 設定されているドメイン一覧取得
	@polset_domain_list = &GetPolsetdomainlist(*conf);

	## ドメインに、UC or UF が存在する場合の更新処理
	foreach $domainname (@polset_domain_list) {
		# UCの更新処理
		@chk_directory_contents = &GetPolicy("UC",$domainname,*conf);
		if ($chk_directory_contents[0] ne "") {
			@policy_list = &GetPolsetitem("UC",$domainname,*chk_directory_contents);
			# 対象外とするファイルのリストを配列に１つずつ格納
			@nochk_file_list = split(/[\r\n]+/,$policy_list[1]);
			@addtxt = &MakeMiddlePolicy($domainname,"UC",$policy_list[0],*nochk_file_list);
			if ($add_txt[0] == "-1") {
				print("$domainnameドメインにユーザが１人もいません。ユーザの追加後、ポリシーを設定してください。");
			} else {
				$err_msg = &WritePolicy($domainname,"UC",*addtxt,*conf);
				if ($err_msg) {
					print("$err_msg");
				}
			}
		}
		# 変数の最初期化
		undef @chk_directory_contents;
		undef @addtxt;
		undef @nochk_file_list;
		undef @policy_list;
		# UFの更新処理
		@chk_directory_contents = &GetPolicy("UF",$domainname,*conf);
		if ($chk_directory_contents[0] ne "") {
			@policy_list = &GetPolsetitem("UF",$domainname,*chk_directory_contents);
			# 対象外とするファイルのリストを配列に１つずつ格納
			@nochk_file_list = split(/[\r\n]+/,$policy_list[1]);
			@addtxt = &MakeMiddlePolicy($domainname,"UF",$policy_list[0],*nochk_file_list);
			if ($add_txt[0] == "-1") {
				print("$domainnameドメインにユーザが１人もいません。ユーザの追加後、ポリシーを設定してください。");
			} else {
				$err_msg = &WritePolicy($domainname,"UF",*addtxt,*conf);
				if ($err_msg) {
					print("$err_msg");
				}
			}
		}
	}

	# 更新失敗時の復帰用中間ファイルの作成
	# 復帰用中間ファイル名($backup_filename)作成
	@gettime = localtime(time);
	$backup_filename = "/tmp/wbmc_middlepolicy-$gettime[2]-$gettime[1]-$gettime[0].bak";
	system("/bin/cp -pf $trip_middlepol $backup_filename >/dev/null 2>&1");

	# 中間ファイルに書き込み
	# 失敗時は、バックアップファイルを復帰させて終了する
	# 以降のエラー時は全てファイルの復帰もエラー処理に含める
	if (-f $trip_middlepol) {
		if (!&writeFile($trip_middlepol, $trip_middlepol_lock, @conf)) {
			system("/bin/mv -f $backup_filename $trip_middlepol >/dev/null 2>&1");
	    	print("中間ファイル(/etc/opt/nec/wbmc/wbmc_middlepolicy)の書き込みに失敗しました。ロックがかかっている可能性があります。しばらく待って、再度操作してください。");
		    exit(1);
		}
	} else {
		print("中間ファイル(/etc/opt/nec/wbmc/wbmc_middlepolicy)が存在しません。設定ファイルのバックアップを取っている場合は、ファイルをリストアしてください。") ;
		exit(1);
	}
##### 中間ファイル生成ここまで #####
	# 変数の再初期化
	undef @addtxt;
	undef @chk_directory_contents;
	undef @nochk_file_list;
	undef @policy_list;
##### ポリシーファイル生成ここから #####
	# ファイル名定義
	$trip_pol = "/etc/tripwire/twpol.txt";
	$trip_pol_lock = "trippol_lock";

	# テキストポリシーの読み込み
	@conf2 = ();
	if (-f $trip_pol) {
		if (!&readFile($trip_pol, $trip_pol_lock, *conf2)) {
			print("ポリシーファイル(/etc/tripwire/twpol.txt)の読み込みに失敗しました。ロックがかかっている可能性があります。しばらく待って、再度操作してください。");
			system("/bin/mv -f $backup_filename $trip_middlepol >/dev/null 2>&1");
			exit(1);
		}
	} else {
		print("ポリシーファイル(/etc/tripwire/twpol.txt)が存在しません。設定ファイルのバックアップを取っている場合は、ファイルをリストアしてください。") ;
		exit(1);
	}

## ドメインに、UC or UF が存在する場合の更新処理
	foreach $domainname (@polset_domain_list) {
		# UCの更新処理
		@chk_directory_contents = &GetPolicy("UC",$domainname,*conf);
		if ($chk_directory_contents[0] ne "") {
			@policy_list = &GetPolsetitem("UC",$domainname,*chk_directory_contents);
			# 対象外とするファイルのリストを配列に１つずつ格納
			@nochk_file_list = split(/[\r\n]+/,$policy_list[1]);
			@addtxt = &MakePolicy($domainname,"UC",$policy_list[0],*nochk_file_list);
			if ($add_txt[0] == "-1") {
				print("$domainnameドメインにユーザが１人もいません。ユーザの追加後、ポリシーを設定してください。");
			} else {
				$err_msg = &WritePolicy($domainname,"UC",*addtxt,*conf2);
				if ($err_msg) {
					print("$err_msg");
				}
			}
		}
		# 変数の再初期化
		undef @chk_directory_contents;
		undef @addtxt;
		undef @nochk_file_list;
		undef @policy_list;
		# UFの更新処理
		@chk_directory_contents = &GetPolicy("UF",$domainname,*conf);
		if ($chk_directory_contents[0] ne "") {
			@policy_list = &GetPolsetitem("UF",$domainname,*chk_directory_contents);
			# 対象外とするファイルのリストを配列に１つずつ格納
			@nochk_file_list = split(/[\r\n]+/,$policy_list[1]);
			@addtxt = &MakePolicy($domainname,"UF",$policy_list[0],*nochk_file_list);
			if ($add_txt[0] == "-1") {
				print("$domainnameドメインにユーザが１人もいません。ユーザの追加後、ポリシーを設定してください。");
#				next;
			} else {
				$err_msg = &WritePolicy($domainname,"UF",*addtxt,*conf2);
				if ($err_msg) {
					print("$err_msg");
				}
			}
		}
	}

	# ファイルに書き込み
	if (-f $trip_pol) {
		if (!&writeFile($trip_pol, $trip_pol_lock, @conf2)) {
		    print("ポリシーファイル(/etc/tripwire/twpol.txt)の書き込みに失敗しました。ロックがかかっている可能性があります。しばらく待って、再度操作してください。");
			system("/bin/mv -f $backup_filename $trip_middlepol >/dev/null 2>&1");
		    exit(1);
		}
	} else {
		print("ポリシーファイル(/etc/tripwire/twpol.txt)が存在しません。設定ファイルのバックアップを取っている場合は、ファイルをリストアしてください。") ;
		system("/bin/mv -f $backup_filename $trip_middlepol");
		exit(1);
	}

##### ポリシーファイル生成ここまで #####
	# メモリ解放
	undef @conf;
	undef @conf2;

	## ポリシーファイル更新処理開始 
	# パスフレーズの取得
	$phrase = &GetPassphrase();
	if ($phrase == -1) {
		system("/bin/mv -f $backup_filename $trip_middlepol >/dev/null 2>&1");
		print("パスフレーズの取得に失敗しました。");
		exit(1);
	}
	# 更新コマンド実行、現時点ではロックを考えていない
	if(system("/usr/sbin/twadmin -m P -Q $phrase /etc/tripwire/twpol.txt >/dev/null 2>&1")) {
		system("/bin/mv -f $backup_filename $trip_middlepol >/dev/null 2>&1");
		print ("ポリシーファイルの更新に失敗しました。");
		exit(1);
	}

	# データベース更新処理に、長い時間がかかる可能性があるため、前もって
	# バックアップファイルは削除
	system("/bin/rm -f $backup_filename >/dev/null 2>&1");

	# データベースの更新コマンド実行
	if (system("/usr/sbin/tripwire -m i -P $phrase >/dev/null 2>&1")) {
		print ("データベースの更新に失敗しました。");
		exit(1);
	}
}
############ -dオプション時の動作 ここまで #############
exit (0);
