219 lines
5.9 KiB
Perl
219 lines
5.9 KiB
Perl
|
#!/usr/bin/perl -w
|
||
|
|
||
|
package LJR::Import;
|
||
|
|
||
|
use strict; # preventing my program from doing bad things
|
||
|
use DBI; # http://dbi.perl.org
|
||
|
use POSIX ();
|
||
|
|
||
|
do $ENV{'LJHOME'} . "/cgi-bin/ljconfig.pl";
|
||
|
|
||
|
my $qhost = $LJ::DBINFO{'master'}->{'host'};
|
||
|
my $quser = $LJ::DBINFO{'master'}->{'user'};
|
||
|
my $qpass = $LJ::DBINFO{'master'}->{'pass'};
|
||
|
my $qdb = $LJ::DBINFO{'master'}->{'dbname'};
|
||
|
my $qsock = $LJ::DBINFO{'master'}->{'sock'};
|
||
|
my $qport = $LJ::DBINFO{'master'}->{'port'};
|
||
|
|
||
|
|
||
|
require "ijournal.pl";
|
||
|
require "icomments.pl";
|
||
|
|
||
|
$| = 1; # unbuffered (almost) output
|
||
|
|
||
|
# global database handle
|
||
|
$LJR::Import::global_dbh = 0;
|
||
|
# global shutdown request received flag
|
||
|
$LJR::Import::cool_stop = 0;
|
||
|
|
||
|
my $history_id;
|
||
|
|
||
|
# POSIX unmasks the sigprocmask properly
|
||
|
my $sigset = POSIX::SigSet->new();
|
||
|
my $action = POSIX::SigAction->new(
|
||
|
'LJR::Import::sigTERM_handler', $sigset, &POSIX::SA_NODEFER);
|
||
|
|
||
|
POSIX::sigaction(&POSIX::SIGTERM, $action);
|
||
|
|
||
|
sub log_print {
|
||
|
my $msg = shift;
|
||
|
my $t = `date +"%D %T"`;
|
||
|
print substr($t, 0, length($t) - 1) . " $msg\n";
|
||
|
}
|
||
|
|
||
|
sub sigTERM_handler {
|
||
|
my $t = `date +"%D %T"`;
|
||
|
print substr($t, 0, length($t) - 1) . " ljr-import-do.pl: received shutdown request\n";
|
||
|
$LJR::Import::cool_stop = 1;
|
||
|
}
|
||
|
|
||
|
# configuration
|
||
|
my $speed_throttle = 10; # seconds
|
||
|
|
||
|
|
||
|
process_queue_alone(); # there must be something there!
|
||
|
if (process_exit()) {
|
||
|
exit 1;
|
||
|
}
|
||
|
else {
|
||
|
exit 0;
|
||
|
}
|
||
|
|
||
|
sub import_log {
|
||
|
my ($istatus) = @_;
|
||
|
|
||
|
my $sth2 = $LJR::Import::global_dbh->prepare (
|
||
|
"update ljr_ihistory set
|
||
|
istatus = ?,
|
||
|
idate = now()
|
||
|
where importid = ?");
|
||
|
$sth2->execute($istatus, $history_id);
|
||
|
$sth2->finish;
|
||
|
}
|
||
|
|
||
|
sub process_exit {
|
||
|
return ($LJR::Import::cool_stop);
|
||
|
}
|
||
|
|
||
|
sub process_queue_alone {
|
||
|
my $row;
|
||
|
my $row1;
|
||
|
my $sth2;
|
||
|
my $e;
|
||
|
|
||
|
$LJR::Import::global_dbh = DBI->connect(
|
||
|
"DBI:mysql:mysql_socket=$qsock;hostname=$qhost;port=$qport;database=$qdb",
|
||
|
$quser, $qpass,
|
||
|
{RaiseError => 0, AutoCommit => 1}
|
||
|
) || die "Can't open database connection: $DBI::errstr";
|
||
|
|
||
|
my $sth = $LJR::Import::global_dbh->prepare("SELECT * from ljr_iqueue order by priority, importid");
|
||
|
$sth->execute;
|
||
|
|
||
|
while (($row = $sth->fetchrow_hashref) && !process_exit()) {
|
||
|
my $sth1 = $LJR::Import::global_dbh->prepare (
|
||
|
"SELECT * from ljr_iqueue where
|
||
|
local_user = '" . $row->{'local_user'} . "'
|
||
|
order by local_user desc, importid desc limit 1");
|
||
|
$sth1->execute; # find last user request for import
|
||
|
$row = $sth1->fetchrow_hashref;
|
||
|
|
||
|
# create history record
|
||
|
$sth2 = $LJR::Import::global_dbh->prepare (
|
||
|
"insert into ljr_ihistory values ('',?,?,'',?,?,?,?,now(),'STARTED',now())");
|
||
|
$sth2->execute (
|
||
|
$row->{'remote_site'}, $row->{'remote_user'}, $row->{'remote_protocol'},
|
||
|
$row->{'local_user'}, $row->{'opt_overwrite'}, $row->{'opt_comments'}
|
||
|
); # save import history (parameters, time when started)
|
||
|
|
||
|
$history_id = $LJR::Import::global_dbh->selectrow_array("SELECT LAST_INSERT_ID()");
|
||
|
$sth2->finish;
|
||
|
|
||
|
LJR::Import::log_print(
|
||
|
$row->{'local_user'} . " <- " .
|
||
|
$row->{'remote_site'} . "::" . $row->{'remote_user'} .
|
||
|
" (entries)"
|
||
|
);
|
||
|
|
||
|
$e = "";
|
||
|
$e = import_journal(
|
||
|
0, # throttle_speed (seconds)
|
||
|
$row->{'remote_site'}, # remote_site
|
||
|
$row->{'remote_protocol'},# remote_protocol
|
||
|
$row->{'remote_user'}, # remote_user
|
||
|
$row->{'remote_pass'}, # remote_pass
|
||
|
"", # remote shared journal (if any)
|
||
|
$row->{'local_user'}, # local_user
|
||
|
"", # local shared journal (if any)
|
||
|
$row->{'opt_overwrite'} # overwrite entries
|
||
|
);
|
||
|
|
||
|
if ($row->{'opt_comments'} && (!$e || !$e->{'err'})) {
|
||
|
LJR::Import::log_print(
|
||
|
$row->{'local_user'} . " <- " .
|
||
|
$row->{'remote_site'} . "::" . $row->{'remote_user'} .
|
||
|
" (caching comments)"
|
||
|
);
|
||
|
|
||
|
$e = get_comments(
|
||
|
$row->{'remote_site'},
|
||
|
$row->{'remote_user'},
|
||
|
$row->{'remote_pass'},
|
||
|
1);
|
||
|
|
||
|
if (!$e || !$e->{'err'}) {
|
||
|
LJR::Import::log_print(
|
||
|
$row->{'local_user'} . " <- " .
|
||
|
$row->{'remote_site'} . "::" . $row->{'remote_user'} .
|
||
|
" (creating comments)");
|
||
|
|
||
|
$e = create_imported_comments (
|
||
|
$row->{'remote_site'},
|
||
|
$row->{'remote_user'},
|
||
|
$row->{'local_user'});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ($e->{'err'}) {
|
||
|
$sth2 = $LJR::Import::global_dbh->prepare (
|
||
|
"update ljr_ihistory " .
|
||
|
"set remote_pass = '" . $row->{'remote_pass'} . "' " .
|
||
|
"where importid = " . $history_id . " ;"
|
||
|
);
|
||
|
$sth2->execute; # save remote pass for debugging purposes
|
||
|
$sth2->finish;
|
||
|
|
||
|
my $boo = $e->{errtext};
|
||
|
$boo =~ s/\n//;
|
||
|
|
||
|
LJR::Import::log_print(
|
||
|
$row->{'local_user'} . " <- " .
|
||
|
$row->{'remote_site'} . "::" . $row->{'remote_user'} . " " . $boo
|
||
|
);
|
||
|
|
||
|
import_log($e->{errtext});
|
||
|
}
|
||
|
else {
|
||
|
$sth2 = $LJR::Import::global_dbh->prepare (
|
||
|
"update ljr_ihistory " .
|
||
|
"set remote_pass = '' " .
|
||
|
"where remote_site = '" . $row->{'remote_site'} . "' and " .
|
||
|
"remote_user = '" . $row->{'remote_user'} . "' ;"
|
||
|
);
|
||
|
$sth2->execute; # remove remote pass since the journal was imported successfully
|
||
|
$sth2->finish;
|
||
|
|
||
|
LJR::Import::log_print(
|
||
|
$row->{'local_user'} . " <- " .
|
||
|
$row->{'remote_site'} . "::" . $row->{'remote_user'} .
|
||
|
": successful"
|
||
|
);
|
||
|
|
||
|
if ($e->{'warns'}) {
|
||
|
import_log("SUCCESSFUL, but " . $e->{'warns'});
|
||
|
}
|
||
|
else {
|
||
|
import_log("SUCCESSFUL");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$sth1 = $LJR::Import::global_dbh->prepare (
|
||
|
"delete from ljr_iqueue " .
|
||
|
"where local_user = '" . $row->{'local_user'} . "'"
|
||
|
); # empty all the user's request after processing last one
|
||
|
$sth1->execute;
|
||
|
$sth1->finish;
|
||
|
|
||
|
$sth->finish;
|
||
|
|
||
|
# we're quitting!
|
||
|
# if (process_exit()) {
|
||
|
$LJR::Import::global_dbh->disconnect;
|
||
|
return;
|
||
|
# }
|
||
|
}
|
||
|
$sth->finish;
|
||
|
|
||
|
$LJR::Import::global_dbh->disconnect;
|
||
|
}
|