#!/usr/bin/perl

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

# RCS: $Id: wbmc_backup,v 1.1 2006/12/22 05:35:01 shodai Exp $

##000727 4.1  misa Require
##000819 4.1 DMѤbackup.confDIRѹ		.haramoto
##000902 4.1 ɲý(DMFTPΤ)			.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);
}

