【プログラミング】自宅サーバのバックアップスクリプトを改変

以前組んでここのblogにも晒した自作のバックアップスクリプトですが、
改めて見直したところなんか色々と突っ込む所があったので
(あとバグも発見されたので)全面的に手直しをすることにしました。
ちなみに仕様は

・newsyslogで7日ローテーションとして設定してあるログを
 7日ごとにひとつのtarballにまとめる
・保存ディレクトリは/data/backup/logsに置く
・tarballの名前は「ログファイル名.取得日.tgz」とする

です。というわけで以下が改変版のソースコード
ざっと見で怪しい点は見つからなかったから、後は実際に
回してみてどうなるかってところですね。


#!/usr/bin/perl
use strict;

my $BKDIR = '/data/backup/logs';
my $LOGDIR = '/var/log';

my @list;
my $listsrc;
my @logkind;
my $name;
my $i;
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
my $TODAY;

$mday = sprintf("%02d", $mday);
$mon = sprintf("%02d", $mon + 1);
$TODAY = $year + 1900 . $mon . $mday;

opendir LDIR, $LOGDIR or die "ERROR: Can't open logdir ($!)\n";
@list = grep /.*\.gz/, readdir(LDIR);
closedir LDIR;

foreach $listsrc (@list) {
my $checked = 0;
my @logname = ();
chomp $listsrc;
$listsrc =~ s/\.[0-7]\.gz$//g;

foreach (@logkind) {
if ($_ eq $listsrc) {
$checked = 1;
last;
}
}

if ($checked) {
next;
}

push @logkind, $listsrc;

for ($i = 0; $i < 8; $i++) {
my $setlog = "$LOGDIR/$listsrc.$i.gz";
if (-e $setlog) {
push @logname, $setlog;
} else {
last;
}
}

$listsrc =~ s/\.log$//;
system ("tar", "zcf", "$BKDIR/$listsrc.$TODAY.tgz", @logname);

if ($? >> 8 != 0) {
warn "making 'tar' archive failed.\n";
warn "($listsrc.log)\n";
}

}

exit 0;