#!/usr/bin/perl
#============================================================================
# サーバーのデータバックアップ
#   元ネタは、次のWEBページ．
#     http://lucenhangul.com/wiki/lucenwiki?itemid=68
#   ここに書かれていたシェルスクリプトを Perl に直した．
#                    Masashi Yamamoto
#                          ymm10m34@khaki.plala.or.jp
#============================================================================
$today       = `date +%Y%m%d`;                      # 本日の日付
$oldday      = `date --d "1 months ago" +%Y%m%d`;   # これよりも古いものは削除
$mysql       = "/usr/bin/mysql";
$db_dump     = "/usr/bin/mysqldump";
$db_user     = "xxxxxxxxx";                         # データベースのユーザー名
$db_passwd   = "xxxxxxxxx";                         # データベースのパスワード
$home_dir    = "/home";                             # バックアップ対象ディレクトリー
$backup_dir  = "/mnt/LinkStation/web_backup";       # バックアップの場所
$backup_HOME = "HOME";
$backup_DB   = "DB";
$log_file    = "log.txt";

chomp $today;
chomp $oldday;

&open_log;
&mk_dir;
&home_backup;
&db_backup;
&rm_old_backup;
&close_log;

#============================================================================
# ログファイルのオープン
#============================================================================
sub open_log{
    my $time;
    $time=localtime;
    open(LOG, ">>$log_file");
    printf LOG "$time\n";
    printf LOG "$today\n";
}

#============================================================================
# ログファイルのクローズ
#============================================================================
sub close_log{
    my $time;
    $time=localtime;
    printf LOG "$time\n\n";
    close LOG;
}

#============================================================================
# バックアップ用のディレクトリーの作成
#============================================================================
sub mk_dir{
    if(! -e "$backup_dir/$today"){

        `mkdir -p $backup_dir/$today/$backup_DB`;
	if(-d "$backup_dir/$today/$backup_DB"){
	    printf LOG "make DB  \t$backup_dir/$today/$backup_DB \n";
	}

	`mkdir -p $backup_dir/$today/$backup_HOME`;
	if(-d "$backup_dir/$today/$backup_HOME"){
	    printf LOG "make HOME\t$backup_dir/$today/$backup_HOME\n";
	}
    }
}

#============================================================================
# ホームディレクトリーのバックアップ
#============================================================================
sub home_backup{
    my $user, @user_list;
    my $ret;

    opendir(DIR, $home_dir);

    while (defined($user=readdir(DIR))){   # ディレクトリー名の取得
	if((-d $home_dir.'/'.$user) && 
	   ($user ne ".") && ($user ne "..")){
	    push(@user_list, $user);
	}
    }
    
    foreach(@user_list){                   # tarを使ってバックアップ
	$ret=system("tar cPfz $backup_dir/$today/$backup_HOME/$_.tar.gz \\
                      $home_dir/$_");
	printf LOG "backup home dir\t$_\t\t$ret\n";
    }

    closedir(DIR);
}

#============================================================================
# データベースのバックアップ
#============================================================================
sub db_backup(){
    my $database, @list;
    my $ret;

    $database = 
	`$mysql -u $db_user --password=$db_passwd -e "show databases" | 
             grep -v Database`;

    @list = split(/\n/,$database);

    foreach(@list){
	$ret =  system("$db_dump -u $db_user --password=$db_passwd $_ > \\
            $backup_dir/$today/$backup_DB/$_.DB.sql");
	printf LOG "backup data base\t$_\t\t$ret\n";
    }
}

#============================================================================
# 期限の過ぎたバックアップの削除
#============================================================================
sub rm_old_backup(){
    my $dir, @dir_list;
    my $ret;

    opendir(DIR, $backup_dir);

    while (defined($dir=readdir(DIR))){   # ディレクトリー名の取得
	if((-d $backup_dir.'/'.$dir) && 
	   ($dir ne ".") && ($dir ne "..")){
	    push(@dir_list, $dir);
	}
    }

    close DIR;

    @sort_dir_list = sort{$a<=>$b}@dir_list;

    for($i=0; $i<@sort_dir_list; $i++){
	if(($i < @sort_dir_list-1) && ($sort_dir_list[$i]<$oldday)){
	    $ret = system("rm -rf $backup_dir/$sort_dir_list[$i]");
	    printf LOG "delete old backup\t$sort_dir_list[$i]\t$ret\n";
	}
    }
}


