#!/usr/bin/perl

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

# RCS: $Id: wbmc_backup,v 1.1.1.1 2004/09/09 08:14:22 snavi Exp $

##000727 4.1  misa Require修正
##000819 4.1 DM用にbackup.confのDIR変更		.haramoto
##000902 4.1 追加修正(DMはFTPのみ)			.haramoto
##000907 4.1 クラスタ対応修正(引数にドメイン名追加)			.haramoto
##000908 4.1 バックアップファイル名変更		.haramoto
##000909 4.1 mailtar -> /mailtar/mailtar		.haramoto
##000911 4.1 tag_name ,target_dir 修正		.haramoto

#
# バックアップコマンド(DM)
#
# usage: wbmc_backup [-c conffilename] [-l] [-m] -i item -d domainname
#		 -c		コンフィグレーションファイル
#		 -l		メッセージをログに出力
#		 -l無し メッセージをSTDERRに出力
#		 -m		実行メッセージを出力
#		 -i		バックアップ対象のアイテム名
#		 -d		ドメイン名
#
# 戻り値: 成功:0
#		  失敗:1
#

# 000724 misa rep require		##haramoto 000902
#require "/opt/nec/wbmc/lib/wbmc.pl";
#require "../lib/wbmc.pl";
require "/opt/nec/wbmc/domain/lib/wbmc.pl";


#ドメイン名の取得
#$domainname = &getDomainName();		##000907

$| = 1;
$old = select(STDERR); $| = 1; select($old);

#DM決め打ち
##000907 comment out next 2 line
#$conf_file = "$WBMC_DOMCNF_DIR/backup.conf";		##000819
#$conf_lock = "backup.conf";
my($conf_file, $conf_lock);				##000907 add
$tag_name = "wbmc_backup_dm";			##000911
$log_file = "/var/log/wbmc";

# 引数処理
$item = "";
$domainname = "";						##000907 add
$errtolog = 0; # 0:STDERR, 1:LOG
$msgout = 0;
$argerr = 0;
$argerrmsg = "";
for ($i = 0; $i < @ARGV; $i++) {
	if ($ARGV[$i] eq "-c") {
		if ($i == $#ARGV) {
			$argerrmsg = "'$ARGV[$i]'";
			$argerr = 1;
			next;
		}
		$conf_file = $ARGV[$i + 1];
		$i++;
	} elsif ($ARGV[$i] eq "-i") {
		if ($i == $#ARGV) {
			$argerrmsg = "'$ARGV[$i]'";
			$argerr = 1;
			next;
		}
		$item = $ARGV[$i + 1];
		$i++;
#-------------------------------------------##000907 クラスタ対応 add start--
	} elsif ($ARGV[$i] eq "-d") {
		if ($i == $#ARGV) {
			$argerrmsg = "'$ARGV[$i]'";
			$argerr = 1;
			next;
		}
		$domainname = $ARGV[$i + 1];
		$i++;
#-------------------------------------------##000907 クラスタ対応 add end  --
	} elsif ($ARGV[$i] eq "-l") {
		$errtolog = 1;
	} elsif ($ARGV[$i] eq "-m") {
		$msgout = 1;
	} else {
		$argerrmsg = "'$ARGV[$i]'";
		$argerr = 1;
	}
}
if ($argerr) {
	&writeError("invalid argment $argerrmsg", "");
	exit(1);
}

#-------------------------------------------##000907 クラスタ対応 add start--
if ($domainname ne "") {		#cluster
	if (-e "/home/.wbmc/$domainname") {
		$conf_file = "/home/.wbmc/$domainname/backup.conf";
		$conf_lock = "backup_$domainname.conf";
	} else {
		#対象ドメインではない
		#			->正常終了
		exit(0);
	}
} else {						#local**
	$domainname = &getDomainName();
}
#-------------------------------------------##000907 クラスタ対応 add end  --

# コンフィグから設定値を読み込む
if (!&readFile($conf_file, $conf_lock, *conf)) {
	&writeError("read file error '$conf_file'", "$item");
	exit(1);
}
$item_flag = 0;
for ($i = 0; $i < @conf; $i++) {
	if ($conf[$i] =~ /^\s*$item\s*{\s*$/) {
		$item_flag = 1;
	}
	if ($item_flag && $conf[$i] =~ /^\s*}\s*$/) {
		$item_flag = 0;
	}
	if ($item_flag && $conf[$i] =~ /^\s*TARGET\s*=\s*(.*)\s*$/) {
		$target_dir = &getValue($1);
	}
	if ($item_flag && $conf[$i] =~ /^\s*BACKUP\s*=\s*(.*)\s*$/) {
		$backup_dir = &getValue($1);
	}
	if ($item_flag && $conf[$i] =~ /^\s*ROTATE\s*=\s*(.*)\s*$/) {
		$rotate_max = &getValue($1);
	}
#------------------------------ 000902 delete start
#	if ($item_flag && $conf[$i] =~ /^\s*BACKUPMODE\s*=\s*(.*)\s*$/) {
#		$backupmode = &getValue($1);
#	}
#	if ($item_flag && $conf[$i] =~ /^\s*WINMACHINE\s*=\s*(.*)\s*$/) {
#		$winmachine = &getValue($1);
#		$winmachine_arg = &encodeCmdArg($winmachine);
#		}
#		if ($item_flag && $conf[$i] =~ /^\s*SHARE\s*=\s*(.*)\s*$/) {
#				$share = &getValue($1);
#				$share_arg = &encodeCmdArg($share);
#		}
#		if ($item_flag && $conf[$i] =~ /^\s*SMBUSER\s*=\s*(.*)\s*$/) {
#				$smbuser = &getValue($1);
#				$smbuser_arg = &encodeCmdArg($smbuser);
#		}
#		if ($item_flag && $conf[$i] =~ /^\s*SMBPASSWD\s*=\s*"(.*)"\s*$/) {
#				$smbpasswd = &getValue($1);
#				$smbpasswd_arg = &encodeCmdArg($smbpasswd);
#		}
#------------------------------ 000902 delete end
		if ($item_flag && $conf[$i] =~ /^\s*FTPSERVER\s*=\s*(.*)\s*$/) {
				$ftpserver = &getValue($1);
				$ftpserver_arg = &encodeCmdArg($ftpserver);
		}
		if ($item_flag && $conf[$i] =~ /^\s*FTPUSER\s*=\s*(.*)\s*$/) {
				$ftpuser = &getValue($1);
				$ftpuser_arg = &encodeCmdArg($ftpuser);
		}
		if ($item_flag && $conf[$i] =~ /^\s*FTPPASSWD\s*=\s*"(.*)"\s*$/) {
				$ftppasswd = &getValue($1);
				$ftppasswd_arg = &encodeCmdArg($ftppasswd);
		}
}

# 設定値が無い場合は既定値を設定
if ($backup_dir eq "") {
	$backup_dir = "/var/backup/$domainname";		##000907**
#	$backup_dir = "/var/backup/";
}
if ($rotate_max eq "") {
	$rotate_max = 3;
}

# バックアップ対象のディレクトリが存在しない場合は終了
if ($target_dir eq "") {
	&writeError("no target", $item);
	exit(1);
}
# バックアップ対象のディレクトリ名にドメイン名がなかった場合、				##000911
if ($target_dir =~ /^\/home\/web$/ || $target_dir =~ /^\/home\/$item$/) {
	$target_dir .= "/$domainname";
}

#バックアップディレクトリが無ければ作成
if (! -d $backup_dir) {
	if (!mkdir($backup_dir, 0755)) {
		&writeError("mkdir error", $item);
	}
}

#------------------------------ 000902 delete start
#if ($backupmode eq "LOCAL") {
#
#	$rotate_file = "$backup_dir/.current_$item";
#	$rotate_file_lock = ".current_$item";
#
#	$backup_file = "backup_$item";
#
#} elsif ($backupmode eq "SMB") {
#
#	if (!&readFile("/etc/sysconfig/network-scripts/ifcfg-eth0", "ifcfg-eth0", *file)) {
#		&writeError("read file error", $item);
#		exit(1);
#	}
#	for ($i = 0; $i < @file; $i++) {
#		if ($file[$i] =~ /^\s*IPADDR\s*=\s*(.*)\s*$/) {
#			$ipaddr = $1;
#		}
#	}
#
#	$rotate_file = "$backup_dir/.current_smb_$item";
#	$rotate_file_lock = ".current_smb_$item";
#
#	$backup_file = "backup_smb_$item";
#
#} elsif ($backupmode eq "FTP") {

	$rotate_file = "$backup_dir/.current_ftp_$item";
	$rotate_file_lock = ".current_ftp_$item";

	$backup_file = "wbmcbackup_ftp_$item";		##000908
#}
#------------------------------ 000902 delete end

# ローテート用ナンバー読み込み
if (!&readFile($rotate_file, $rotate_file_lock, *current)) {
	$backup_num = 0;
} else {
	$backup_num = $current[0] + 1;
}

# MAX と比較
if ($rotate_max <= $backup_num) {
	$backup_num = 0;
}

$tgzfile = "${backup_file}_${backup_num}.tgz";

#------------------------------ 000902 delete start
#if ($backupmode eq "LOCAL") {
#	# 作成するファイルと同名ファイルを削除
#	unlink ("$backup_dir/$tgzfile");
#}
#------------------------------ 000902 delete end

# 引数に-mあり:メッセージは画面に表示
#		-m無し:メッセージは表示しない

# アーカイブ作成
##000909
#open(CMD, "/bin/tar cvfz ${backup_dir}/$tgzfile -P  --ignore-failed-read $target_dir 2>&1 |");		##000909
if ($item eq "mail") {
# delete -P option 001202 seki
	open(CMD, "/opt/nec/mailtar/mailtar cvfzh ${backup_dir}/$tgzfile --ignore-failed-read $target_dir 2>&1 |");
} else {
# delete -P option 001202 seki
# update /bin/tar -> /opt/nec/baktar/baktar 010220
	open(CMD, "/opt/nec/baktar/baktar cvfzh ${backup_dir}/$tgzfile --ignore-failed-read $target_dir 2>&1 |");
}

$errmessage = "";
$cnt = 0;
while (<CMD>) {
# update /bin/tar -> /opt/nec/baktar/baktar 010220
	if (/\/opt\/nec\/baktar\/baktar: /) {
		if (/Removing leading/i) {
			next;
		}
		if (/Archive contains future timestamp/i) {
						next;
		}
		$errmessage = $_;
	}
	if (/^tar: /) {
		$errmessage = $_;
		last;
	}
	if ($msgout) {
		if (($cnt % 100) == 0) {
			print "$cnt: $_";
		}
		$cnt++;
	}
}
close(CMD);
if ($?) {
	if ($errmessage eq "") {
		&writeError("tar: Unknown error", $item);
		goto error;
	} else {
		&writeError($errmessage, $item);
		goto error;
	}
}

chdir("$backup_dir");
#------------------------------ 000902 delete start
#if ($backupmode eq "LOCAL") {
#
#	# パーミッション変更
#	if (!chmod(0600, "$tgzfile")) {
#		&writeError("chmod error", $item);
#		goto error;
#	}
#} elsif ($backupmode eq "SMB") {
#
#	# パーミッション変更
#	if (!chmod(0666, "$tgzfile")) {
#		&writeError("chmod error", $item);
#		goto error;
#	}
#
#	# ディレクトリ作成
#	open(CMD, "/usr/bin/smbclient //$winmachine_arg/$share_arg $smbpasswd_arg -U $smbuser_arg -c \"mkdir $ipaddr\" 2>&1 |");
#	$errmessage = "";
#	while(<CMD>) {
#		if (/ERR/) {
#			if (/making remote directory/i) {
#				next;
#			}
#			$errmessage = $_;
#		} elsif (/Connection to.*failed/i) {
#			$errmessage = $_;
#		}
#		if ($msgout) {
#			print $_;
#		}
#	}
#	close(CMD);
#	if ($errmessage ne "") {
#		&writeError($errmessage, $item);
#		goto error;
#	}
#
#	# ファイル転送
#	open(CMD, "/usr/bin/smbclient //$winmachine_arg/$share_arg $smbpasswd_arg -U $smbuser_arg -c \"cd $ipaddr; put $tgzfile; exit\" 2>&1 |");
#	$errmessage = "";
#	while(<CMD>) {
#		if ($msgout) {
#			print $_;
#		}
#		if (/ERR/) {
#			$errmessage = $_;
#		}
#	}
#	close(CMD);
#	if ($errmessage ne "") {
#		&writeError($errmessage, $item);
#		goto error;
#	}
#
#	# ファイル削除
#	unlink("$tgzfile");
#} elsif ($backupmode eq "FTP") {

	# パーミッション変更
	if (!chmod(0666, "$backup_dir/$tgzfile")) {
		&writeError("chmod error", $item);
		goto error;
	}

	# ファイル転送
	open(CMD, "/usr/bin/lftp $ftpserver_arg -u $ftpuser_arg,$ftppasswd_arg -e \"put $tgzfile;exit\" 2>&1 |");
	$errmessage = "";
	while (<CMD>) {
		if ($msgout) {
			print $_;
		}
		if (/bytes transferred/i) {
			next;
		}
		$errmessage = $_;
	}
	close(CMD);
	if ($errmessage ne "") {
		&writeError($errmessage, $item);
		goto error;
	}

	# ファイル削除
	unlink("$tgzfile");
#}
#------------------------------ 000902 delete end

# ローテートファイル書き込み
$current[0] = $backup_num;
if (!&writeFile($rotate_file, $rotate_file_lock, @current)) {
	&writeLog("write file error", $tag_name, $log_file);
}

## 正常終了
exit(0);

# ファイルを削除して終了
error:
	unlink("$tgzfile");
	exit(1);

#-----------------------------------------------------------------------
sub writeError {
	local($msg, $item) = @_;

	$msg =~ s/\s*$//;
	if ($item ne "") {
		$msg = "[$item]$msg";
	}
	if ($errtolog) {
		&writeLog($msg, $tag_name, $log_file);
	} else {
		print STDERR "$tag_name:$msg\n";
	}
}

sub getValue {
	local($str) = @_;

	$str =~ s/^[\s]*//;
	$str =~ s/[\s]*$//;
	if ($str =~ /^"(.*)"$/) {
		$str = $1;
	}

	return($str);
}

