Annotation of openbsd/OpenBSDTorrents/ServerTorrents.pl, Revision 1.29
1.1 andrew 1: #!/usr/bin/perl -T
1.29 ! andrew 2: #$RedRiver: ServerTorrents.pl,v 1.28 2010/01/07 18:50:02 andrew Exp $
1.1 andrew 3: use strict;
4: use warnings;
5: use diagnostics;
6:
7: use LWP::UserAgent;
8: use Time::Local;
1.23 andrew 9: use File::Basename;
1.28 andrew 10:
1.23 andrew 11: #use YAML;
1.1 andrew 12:
13: use lib 'lib';
14: use OpenBSDTorrents;
1.14 andrew 15: use BT::MetaInfo::Cached;
1.1 andrew 16:
17: %ENV = ();
18:
1.5 andrew 19: justme();
1.1 andrew 20:
1.28 andrew 21: my @Sizes = ( '', 'Ki', 'Mi', 'Gi', 'Ti' );
1.1 andrew 22: my $ua = LWP::UserAgent->new;
23:
1.28 andrew 24: my $response = $ua->get( $OBT->{URL_TORRENTS} );
1.1 andrew 25:
26: my %server_torrents;
1.28 andrew 27: if ( $response->is_success ) {
28: my $content = $response->content; # or whatever
29: $content =~ s/^.*<!-- BEGIN LIST -->//s
30: || die "Beginning of list not found!";
31: $content =~ s/<!-- END LIST -->.*$//s || die "End of list not found!";
32: unless ( $content =~ /No data/ ) {
33: foreach ( split /\n/, $content ) {
1.1 andrew 34: s/^\s+//;
35: s/\s+$//;
36: next unless $_;
1.28 andrew 37: my ( $name, $hash, $disabled ) = split /\t/;
1.1 andrew 38: next if $name eq 'File';
39:
1.25 andrew 40: $name =~ s#.*/##;
1.28 andrew 41: $server_torrents{$hash} = {
42: name => $name,
43: disabled => $disabled,
44: };
1.1 andrew 45: }
46: }
1.28 andrew 47: }
48: else {
1.1 andrew 49: die $response->status_line;
50: }
51:
1.28 andrew 52: my %torrents;
53: opendir DIR, $OBT->{DIR_TORRENT}
54: or die "Couldn't opendir $OBT->{DIR_TORRENT}: $!";
55: foreach my $torrent ( readdir DIR ) {
56: chomp $torrent;
57: next unless $torrent =~ /\.torrent$/;
58:
59: if ($torrent =~ /^([^\/]+)$/) {
60: $torrent = $1;
61: }
62: else {
63: die "Invalid character in $torrent: $!";
64: }
65:
66: my $name = basename( $torrent, '.torrent' );
67:
68: if ( my ( $base, $year, $mon, $mday, $hour, $min )
69: = $torrent =~ /^(.*)-(\d{4})-(\d{2})-(\d{2})-(\d{2})(\d{2})/ )
70: {
71: $name = $base;
72: }
73:
74: my $t;
75: eval {
76: $t = BT::MetaInfo::Cached->new(
77: $OBT->{DIR_TORRENT} . '/' . $torrent,
78: { cache_root => '/tmp/OBTFileCache'
79:
80: #$OBT->{DIR_HOME} . '/FileCache'
81: }
82: );
83: };
84: if ($@) {
85: warn "Error reading torrent $torrent\n";
86: next;
87: }
88:
89: #my $epoch = $t->creation_date;
1.1 andrew 90:
1.28 andrew 91: my $hash = unpack( "H*", $t->info_hash );
92: $torrents{$hash} = {
93: file => $torrent,
94: details => $t,
95: name => $name,
96: #epoch => $epoch,
97: };
98:
99: if ( !exists $server_torrents{$hash} ) {
100: Upload_Torrent( $torrents{$hash} );
101: }
1.1 andrew 102: }
103: closedir DIR;
104:
1.23 andrew 105: #print Dump \%server_torrents;
1.20 andrew 106: #exit;
1.1 andrew 107:
1.28 andrew 108: foreach my $hash ( keys %server_torrents ) {
109:
110: #printf "SERVER: [%s] [%s]\n", $hash, $torrent;
111: if ( ( !exists $torrents{$hash} )
112: && ( !$server_torrents{$hash}{disabled} ) )
113: {
114: Delete_Torrent( $server_torrents{$hash}{name}, $hash );
115: }
1.1 andrew 116: }
117:
1.28 andrew 118: $ua->get( $OBT->{URL_SANITY} );
119:
120: sub Upload_Torrent {
121: my $torrent = shift;
122: my $t = $torrent->{'details'};
123:
124: my $file = $torrent->{'file'};
1.29 ! andrew 125: #print "Uploading $file\n";
1.28 andrew 126:
127: my $size = $t->total_size;
128: my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday )
129: = gmtime( $t->creation_date );
130: $year += 1900;
131: $mon++;
132: my $time = sprintf "%04d.%02d.%02d %02d:%02d",
133: $year, $mon, $mday, $hour, $min;
134:
135: ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday )
136: = localtime( $t->creation_date );
137: $year += 1900;
138: $mon++;
139: my $sql_time = sprintf "%04d-%02d-%02d %02d:%02d",
140: $year, $mon, $mday, $hour, $min;
141:
142: my $i = 0;
143: while ( $size > 1024 ) {
144: $size /= 1024;
145: $i++;
146: }
147: $size = sprintf( '%.2f', $size );
148: $size .= $Sizes[$i] . 'B';
149:
150: my $comment = $t->{comment};
151: $comment =~ s/\n.*$//s;
152:
153: my $filename
154: = $comment =~ /($OBT->{BASENAME}.+)/
155: ? $1
156: : $file;
157: $filename =~ s#/# #g;
158: $filename =~ s/\.torrent\z//;
159:
160: $comment .= " [$size]";
161: $filename .= " [$time]";
162:
163: my $response = $ua->post(
164: $OBT->{URL_UPLOAD},
165: { username => $OBT->{UPLOAD_USER},
166: password => $OBT->{UPLOAD_PASS},
167: torrent => [ $OBT->{DIR_TORRENT} . "/$file" ],
168: url => "/torrents/$file",
169: filename => $filename,
170: filedate => $sql_time,
171: info => $comment,
172: hash => '',
173: autoset => 'enabled', # -> checked="checked"
174: },
175: Content_Type => 'form-data'
176: );
177:
178: if ( $response->is_success ) {
179: print STDERR "Uploaded $file\n";
180:
181: #print $response->content;
182: }
183: else {
184: die $response->status_line;
185: }
1.1 andrew 186: }
187:
1.28 andrew 188: sub Delete_Torrent {
189: my $filename = shift;
190: my $hash = shift;
191: die "No hash passed!" unless $hash;
192:
1.29 ! andrew 193: #print "Removing $filename [$hash]\n";
1.28 andrew 194:
195: my $response = $ua->post(
196: $OBT->{'URL_DELETE'},
197: { username => $OBT->{UPLOAD_USER},
198: password => $OBT->{UPLOAD_PASS},
199: filename => $filename,
200: hash => $hash,
201: },
202: Content_Type => 'form-data'
203: );
1.1 andrew 204:
1.28 andrew 205: if ( $response->is_success ) {
206: my ($result) = $response->content =~ /class="error"\>([^<]+)\</;
1.1 andrew 207:
1.28 andrew 208: if ( $result eq 'Torrent was removed successfully.' ) {
209: print STDERR "Removed $filename [$hash]\n";
210: }
211: elsif ($result) {
212: print STDERR "Error: $result (removing $filename [$hash])\n";
213: }
214: else {
215: print STDERR
216: "An unknown error occurred removing $filename [$hash]\n";
217: }
218: }
219: else {
220: die $response->status_line . " removing $filename [$hash]\n";
221: }
1.1 andrew 222: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>