[BACK]Return to NewTorrents.pl CVS log [TXT][DIR] Up to [local] / openbsd / OpenBSDTorrents

File: [local] / openbsd / OpenBSDTorrents / NewTorrents.pl (download)

Revision 1.15, Wed Mar 3 18:23:46 2010 UTC (14 years, 3 months ago) by andrew
Branch: MAIN
Changes since 1.14: +3 -3 lines

more quieter output

#!/usr/bin/perl -T
#$RedRiver: NewTorrents.pl,v 1.14 2009/10/20 19:03:25 andrew Exp $
use strict;
use warnings;
use diagnostics;

use lib 'lib';
use OpenBSDTorrents;

use POSIX qw / setsid :sys_wait_h /;
$SIG{CHLD} = \&REAPER;
my %Kids;
my %Kid_Status;
my %Need_Update;

%ENV = ();

my $last_dir = '';
while (<>) {
	#print;
	chomp;
	# *** This requires --log-format="%t [%p] %o %f %l" on the rsync command
	if (my ($year,  $mon,   $mday,     $time,
                $pid,        $oper,    $file,  $size) = m#^
		(\d{4})/(\d{2})/(\d{2}) \s (\d{2}:\d{2}:\d{2}) \s
		\[(\d+)\] \s (\S+) \s  (.+) \s (\d+)
		$#xms) {

		$file =~ s/^.*$OBT->{BASENAME}\/?//;

        	my ($dir, $file) = $file =~ m#^(.*)/([^/]+)#;
		#print "$oper - ($last_dir) [$dir]/[$file]\n";

		next unless $oper eq 'recv';
		next unless $size;
		next unless $dir;

		if ($last_dir && $last_dir ne $dir) {
			StartTorrent($last_dir);
		}
		$last_dir = $dir;
	}
}

# Regen just the new ones now
sleep(1) while (keys %Kids > 0);
StartTorrent($last_dir);

# after the new ones are done, regen all, just to make sure
sleep(1) while (keys %Kids > 0);
StartTorrent('skip');

# and wait for it to finish
sleep(1) while (keys %Kids > 0);

sub REAPER {
	my $child;
        while (($child = waitpid(-1,WNOHANG)) > 0) {
		$Kid_Status{$child} = $?;
		delete $Kids{$child};
	}
	$SIG{CHLD} = \&REAPER;  # still loathe sysV

	StartTorrent('waiting');
}

sub StartTorrent
{
	my $dir = shift;
	return undef unless $dir;
	
	my $should_fork = 1;

	if ($dir eq 'skip') {
		#$dir = '';
		%Need_Update = ();
		$should_fork = 0;
	} 
	elsif ($dir eq 'waiting') {
		return if ! %Need_Update;

		my $count = scalar keys %Need_Update;
		print "Have $count waiting torrents\n";
	}
	else {
		#print "Need to make torrent for '$dir'\n";
		$dir = $OBT->{BASENAME} . "/$dir";
		$Need_Update{$dir} = 1;
	}

	if (keys %Kids > 0) {
		print "Not making torrents for $dir now, already running\n";
		return;
	}

	my @now_update = keys %Need_Update;
	%Need_Update = ();

	if ($should_fork) {
		defined(my $pid = fork)	or die "Can't fork: $!";

		if ($pid) {
			$Kids{$pid} = 1;
			return;
		}

	}

	if (@now_update) {
		print "Making torrents for ", join(" ", @now_update), "\n";
	} else {
		print "Remaking all torrents\n";
		push @now_update, $dir;
	}
	exec($OBT->{DIR_HOME} . '/regen.sh', @now_update);
	exit;
}