#!/usr/bin/perl -I/usr/local/teamfile/tfsplugin/lib/perl
#
# ZIP temporary file cleaner.
#
use strict;
use Getopt::Long;

require "/usr/local/teamfile/www/bin/mt-lib.pl";

my $TMP_PATH = '/var/lib/teamfile/tmp';
my $PREFIX = 'tf_zip_';
my $PART_EXPIRE = 10 * 60;
my $ZIP_EXPIRE = 60 * 60;

my $LOCK_FILE = getLogPath() . '/zipcleaner.pid';
my $LOG_FILE  = getJobsWorkPath() . '/zipcleaner.log';
my $F_LOG     = undef;
my $opt_h     = undef;
my $opt_v     = undef;

my $ret = GetOptions("h" => \$opt_h, "v" => \$opt_v);
if ($opt_h) {
	usage();
	exit(0);
}

exit(main());

sub main {
	if ((my $pid = lockScript($LOCK_FILE)) != 0) {
		printerr("This script had been already started by $pid.\n");
		return 1;
	}

	initLog();

	if (!-d $TMP_PATH) {
		writeLog("Temporary directory does not exist. path=$TMP_PATH");
		closeLog();
		unlockScript($LOCK_FILE);
		return 0;
	}

	my $now = time;
	my $deleted = 0;
	for my $path (glob("$TMP_PATH/$PREFIX*")) {
		next if $path !~ /\Q$TMP_PATH\E\/\Q$PREFIX\E[^\/]+\.(part|zip)\z/;
		next if !-f $path;

		my $ext = $1;
		my @st = stat($path);
		next if !@st;

		my $expire = ($ext eq 'part') ? $PART_EXPIRE : $ZIP_EXPIRE;
		next if ($now - $st[9]) < $expire;

		if (unlink($path)) {
			$deleted++;
			writeLog("Deleted expired ZIP temporary file. path=$path");
		}
		else {
			writeLog("Failed to delete ZIP temporary file. path=$path error=$!");
		}
	}

	writeLog("Finished ZIP cleaner. deleted=$deleted");
	closeLog();
	unlockScript($LOCK_FILE);
	return 0;
}

sub usage {
	print <<"_EOF_";
Usage: zipcleaner [-v] | [-h]
       -v : Show detail status
       -h : Show usage
_EOF_
}

sub printerr {
	my $msg = shift || '';
	print STDERR $msg if $opt_v && $msg;
}

sub initLog {
	open $F_LOG, ">", $LOG_FILE;
}

sub writeLog {
	my $msg = shift || '';
	return if !$msg;
	my $ctime = localtime(time);
	print $F_LOG $ctime . ' : ' . $msg . "\n" if $F_LOG;
	printerr($msg . "\n");
}

sub closeLog {
	close $F_LOG if $F_LOG;
}
