Files
ljr/obsolete/bin/rlj2lj.pl
2019-02-06 00:49:12 +03:00

406 lines
12 KiB
Perl
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/perl -w
use strict;
use XMLRPC::Lite;
use Digest::MD5 qw(md5_hex);
use DBI;
use Time::Local;
use lib "$ENV{'LJHOME'}/cgi-bin";
use LJR::Viewuserstandalone;
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 $qsock = $LJ::DBINFO{'master'}->{'sock'};
my $qport = $LJ::DBINFO{'master'}->{'port'};
#my $qdb = $LJ::DBINFO{'master'}->{'dbname'};
my $qdb = "prod_ljgate";
#óÁÊÔ, Ó ËÏÔÏÒÏÇÏ ËÏÐÉÒÕÅÍ
my $source_site = "127.0.0.2";
#óÁÊÔ, ÎÁ ËÏÔÏÒÏÊ ËÏÐÉÒÕÅÍ
my $dest_site = "www.livejournal.com";
#þÁÓÔÏÔÁ ÓÉÎÈÒÏÎÉÚÁÃÉÉ × ÆÏÒÍÁÔÅ þþ:íí:óó
#(ÔÏ ÅÓÔØ ÓÉÎÈÒÏÎÉÚÁÃÉÑ ËÁÖÄÙÅ 15 ÍÉÎÕÔ ÂÕÄÅÔ ×ÙÇÌÑÄÅÔØ ËÁË
#00:15:00
my $sync_freq = "00:10:00";
#òÁÚÎÉÃÁ ×Ï ×ÒÅÍÅÎÉ ÍÅÖÄÕ ÍÁÛÉÎÏÊ, ÎÁ ËÏÔÏÒÏÊ ÕÓÔÁÎÏ×ÌÅÎ ÇÅÊÔ,
#É ÍÁÛÉÎÏÊ, ÎÁ ËÏÔÏÒÏÊ ÕÓÔÁÎÏ×ÌÅÎ ÉÓÈÏÄÎÙÊ LJ-ÓÅÒ×ÅÒ (ÚÁÐÉÓÉ
#ÄÁÔÉÒÕÀÔÓÑ ÌÏËÁÌØÎÙÍ ×ÒÅÍÅÎÅÍ ÐÏÌØÚÏ×ÁÔÅÌÑ, Á ×ÒÅÍÑ ÓÉÎÈÒÏÎÉÚÁÃÉÉ
#ÏÔÓÞÉÔÙ×ÁÅÔÓÑ ÐÏ ÞÁÓÁÍ ÍÁÛÉÎÙ, ÇÄÅ ËÒÕÔÉÔÓÑ LJ, ÂÌÉÎ).
#òÁÚÎÉÃÁ ÕËÁÚÙ×ÁÅÔÓÑ × ËÏÌÉÞÅÓÔ×Å ÓÅËÕÎÄ. åÓÌÉ ×ÒÅÍÑ ÇÅÊÔÁ ÍÅÎØÛÅ
#×ÒÅÍÅÎÉ ÓÅÒ×ÅÒÁ, ÒÁÚÎÉÃÁ ÄÏÌÖÎÁ ÂÙÔØ ÐÏÌÏÖÉÔÅÌØÎÙÍ ÞÉÓÌÏÍ, ÂÏÌØÛÅ ---
#ÐÏÎÑÔÎÏÅ ÄÅÌÏ, ÏÔÒÉÃÁÔÅÌØÎÙÍ.
my $time_diff = 0;
#îÁÓÔÒÏÊËÉ ÚÁËÏÎÞÉÌÓØ
#áËËÁÕÎÔ, ËÏÔÏÒÙÊ ËÏÐÉÒÕÅÍ
my $source_user;
my $source_pass;
#áËËÁÕÎÔ, × ËÏÔÏÒÙÊ ËÏÐÉÒÕÅÍ
my $dest_user;
my $dest_pass;
#úÄÅÓØ ÂÕÄÕÔ ÈÒÁÎÉÔØÓÑ ÌÏÇÉÎÙ É ÐÁÒÏÌÉ ÓÉÎÈÒÏÎÉÚÉÒÕÅÍÙÈ
#ÄÎÅ×ÎÉËÏ× (ÎÁ ÎÁÛÅÍ É ÞÕÖÏÍ ÓÅÒ×ÅÒÁÈ)
my %journals;
open (STDERR, "+>>$ENV{LJHOME}/logs/ljgate.log") || die "Can't open logfile:$!";
#÷ÙÞÉÓÌÑÅÍ ×ÒÅÍÑ ÐÒÅÄÙÄÕÝÅÇÏ ÏÂÎÏ×ÌÅÎÉÑ
my ($fr_hour,$fr_min,$fr_sec);
my ($ls_year,$ls_month,$ls_day,$ls_hour,$ls_min,$ls_sec);
($fr_hour,$fr_min,$fr_sec) = split(/:/,$sync_freq);
my $lastsync = (time() - ($fr_hour * 60 * 60)
- ($fr_min * 60)
- $fr_sec);
$lastsync = $lastsync + $time_diff;
($ls_sec,$ls_min,$ls_hour,$ls_day,$ls_month,$ls_year) = localtime($lastsync);
$ls_year += 1900;
$ls_month += 1;
$ls_month=sprintf("%.02d",$ls_month);
$ls_day=sprintf("%.02d",$ls_day);
$ls_sec=sprintf("%.02d",$ls_sec);
$ls_min=sprintf("%.02d",$ls_min);
$ls_hour=sprintf("%.02d",$ls_hour);
$lastsync = $ls_year."-".
$ls_month."-".
$ls_day." ".
$ls_hour.":".
$ls_min.":".
$ls_sec;
#print "$lastsync\n";
#ó×ÑÚÙ×ÁÅÍÓÑ Ó ÂÁÚÏÊ
my $dbh = DBI->connect(
"DBI:mysql:mysql_socket=$qsock;hostname=$qhost;port=$qport;database=$qdb",
$quser, $qpass,
) || die localtime(time) . ": Can't connect to database\n";
#úÁÂÉÒÁÅÍ ÉÚ ÂÁÚÙ ID ÖÕÒÎÁÌÏ×, ËÏÔÏÒÙÅ ÎÕÖÎÏ ÓÉÎÈÒÏÎÉÚÉÒÏ×ÁÔØ
my $sqh = $dbh->prepare("SELECT userid,alienid
FROM rlj2lj");
$sqh->execute;
my $result;
#ðÏÍÅÝÁÅÍ ÒÅÚÕÌØÔÁÔÙ ÚÁÐÒÏÓÁ × ÈÜÛ %journals
while ($result = $sqh->fetchrow_hashref) {
$journals{$result->{'userid'}} = $result->{'alienid'};
}
#éÎÉÃÉÁÌÉÚÉÒÕÅÍ ÉÎÔÅÒÆÅÊÓ ÐÒÏÔÏËÏÌÁ XMLRPC
my $xmlrpc = new XMLRPC::Lite;
#óÉÎÈÒÏÎÉÚÉÒÕÅÍ ÖÕÒÎÁÌÙ
foreach (keys(%journals)) {
#úÁÂÉÒÁÅÍ ÉÚ ÂÁÚÙ ÏÞÅÒÅÄÎÏÇÏ ÐÏÌØÚÏ×ÁÔÅÌÑ ÉÓÈÏÄÎÏÇÏ ÖÕÒÎÁÌÁ
$sqh = $dbh->prepare("SELECT our_user,our_pass
FROM our_user
WHERE userid=$_");
$sqh->execute;
($source_user,$source_pass) = $sqh->fetchrow_array;
#úÁÂÉÒÁÅÍ ÉÚ ÂÁÚÙ ÏÞÅÒÅÄÎÏÇÏ ÐÏÌØÚÏ×ÁÔÅÌÑ ÞÕÖÏÇÏ ÓÅÒ×ÉÓÁ
$sqh = $dbh->prepare("SELECT alien,alienpass
FROM alien
WHERE alienid=$journals{$_}");
$sqh->execute;
($dest_user,$dest_pass) = $sqh->fetchrow_array;
#ëÏÐÉÒÕÅÍ ×ÓÅ ÚÁÐÉÓÉ, ÄÏÂÁ×ÌÅÎÎÙÅ ÉÌÉ ÉÚÍÅΣÎÎÙÅ
#ÐÏÓÌÅ ÐÒÅÄÙÄÕÝÅÇÏ ÏÂÎÏ×ÌÅÎÉÑ
eval {
sync_journals($source_site,$source_user,$source_pass,
$dest_site,$dest_user,$dest_pass,
$lastsync,$_);
};
if ($@) {
print STDERR localtime(time) . ": Syncronizing $source_user failed\n";
}
}
###SUBROUTINES###
#óÉÎÈÒÏÎÉÚÁÃÉÑ ÄÎÅ×ÎÉËÏ×
sub sync_journals{
my ($source_site,$souce_user,$source_pass,
$dest_site,$dest_user,$dest_pass,
$lastsync, $user_id);
#ðÏÌÕÞÁÅÍ ÁÄÒÅÓÁ ÉÓÐÏÌØÚÕÅÍÙÈ ÓÁÊÔÏ× É ÐÁÒÏÌÉ/ÌÏÇÉÎÙ
#ÓÉÎÈÒÏÎÉÚÉÒÕÅÍÙÈ ÁËËÁÕÎÔÏ× ÉÚ ÓÔÒÏËÉ Ó ÁÒÇÕÍÅÎÔÁÍÉ
($source_site,$souce_user,$source_pass,
$dest_site,$dest_user,$dest_pass,$lastsync,$user_id) = @_;
my $proxy = "http://" . $source_site . "/interface/xmlrpc";
$xmlrpc->proxy($proxy);
#XMLRPC object, for login call
my $get_challenge;
#Challenge (random string from server for secure login)
my $challenge;
#String for md5 hash of server challenge and password
my $response;
#ðÏÌÕÞÁÅÍ ÐÁÒÕ ÐÁÒÏÌØ-ÏÔÚÙ× Õ ÉÓÈÏÄÎÏÇÏ ÓÅÒ×ÅÒÁ
eval {
$get_challenge = xmlrpc_call("LJ.XMLRPC.getchallenge");
$challenge = $get_challenge->{'challenge'};
$response = md5_hex($challenge . md5_hex($source_pass));
};
#Error handling (russian over ssh doesn't work, sorry)
if ($@) {
print STDERR localtime(time) . ": Login on $source_site failed\n";
die;
};
#XMLRPC object, for "getevents" call
my $getevents;
#úÁÂÉÒÁÅÍ ×ÓÅ ÓÏÏÂÝÅÎÉÑ, ÐÏÑ×É×ÛÉÅÓÑ ÓÏ ×ÒÅÍÅÎÉ ÐÏÓÌÅÄÎÅÊ ÓÉÎÈÒÏÎÉÚÁÃÉÉ
eval {
$getevents = xmlrpc_call('LJ.XMLRPC.getevents', {
'username' => $source_user,
'auth_method' => 'challenge',
'auth_challenge' => $challenge,
'auth_response' => $response,
'ver' => 1,
'selecttype' => 'syncitems',
'lastsync' => $lastsync,
'lineendings' => 'unix',
});
};
#Error handling
if ($@) {
print STDERR localtime(time) . ": Getevents on $source_site failed\n";
die;
}
$proxy = "http://" . $dest_site . "/interface/xmlrpc";
$xmlrpc->proxy($proxy);
#ðÏÌÕÞÁÅÍ ÐÁÒÕ ÐÁÒÏÌØ-ÏÔÚÙ× Õ ÓÅÒ×ÅÒÁ, ÎÁ ËÏÔÏÒÙÊ ËÏÐÉÒÕÅÍ ÚÁÐÉÓÉ
eval {
$get_challenge = xmlrpc_call("LJ.XMLRPC.getchallenge");
$challenge = $get_challenge->{'challenge'};
$response = md5_hex($challenge . md5_hex($dest_pass));
};
#Error handling
if ($@) {
print STDERR localtime(time) . ": Login on $dest_site failed\n";
print STDERR "debug1: " . $@;
print STDERR "\n\n";
die;
}
my $entry;
my( $entry_date, $entry_time, $sec, $min, $hour, $day, $month, $year );
my $fields;
my $postevent;
foreach $entry (@{$getevents->{'events'}}) {
#ðÏÌÕÞÁÅÍ ÐÁÒÕ ÐÁÒÏÌØ-ÏÔÚÙ× Õ ÓÅÒ×ÅÒÁ, ÎÁ ËÏÔÏÒÙÊ ÐÅÒÅÎÏÓÉÍ ÚÁÐÉÓÉ
eval {
$get_challenge = xmlrpc_call("LJ.XMLRPC.getchallenge");
$challenge = $get_challenge->{'challenge'};
$response = md5_hex($challenge . md5_hex($dest_pass));
};
#Error handling
if ($@) {
print STDERR localtime(time) . ": Login on $dest_site failed\n";
print STDERR "debug2: " . $@;
print STDERR "\n\n";
die;
}
($entry_date, $entry_time) = split(/ /,$entry->{'eventtime'});
($year, $month, $day) = split(/-/,$entry_date);
($hour, $min, $sec) = split(/:/,$entry_time);
#ëÏÐÉÒÕÅÍ × ÎÏ×ÕÀ ÚÁÐÉÓØ ÔÅ ÐÏÌÑ, ËÏÔÏÒÙÅ ÍÏÖÎÏ ÔÕÐÏ ÓËÏÐÉÒÏ×ÁÔØ
$fields = {
'username' => $dest_user,
'auth_method' => 'challenge',
'auth_challenge' => $challenge,
'auth_response' => $response,
'ver' => 1,
'subject' => ($entry->{'subject'})?
LJR::Viewuserstandalone::expand_ljuser_tags($entry->{'subject'})
: "",
'year' => $year,
'mon' => $month,
'day' => $day,
'hour' => $hour,
'min' => $min,
};
#÷ÙÑÓÎÑÅÍ ÕÒÏ×ÅÎØ ÄÏÓÔÕÐÁ ËÏÐÉÒÕÅÍÏÊ ÚÁÐÉÓÉ
if (!$entry->{'security'}) {
$fields->{'security'} = 'public';
} else {
$fields->{'security'} = $entry->{'security'};
if ($entry->{'allowmask'}) {
$fields->{'allowmask'} = $entry->{'allowmask'};
}
};
#úÁÄÁ£Í ÓÔÒÏËÕ Ó ÍÅÔÁÄÁÎÎÙÍÉ
if ($entry->{'props'}->{'current_mood'})
{
$fields->{'props'}->{'current_mood'} =
$entry->{'props'}->{'current_mood'};
}
if ($entry->{'props'}->{'mood_id'})
{
$fields->{'props'}->{'mood_id'} =
$entry->{'props'}->{'mood_id'};
}
if ($entry->{'props'}->{'current_music'})
{
$fields->{'props'}->{'current_music'} =
$entry->{'props'}->{'current_music'};
}
if ($entry->{'props'}->{'opt_backdated'})
{
$fields->{'props'}->{'opt_backdated'} =
$entry->{'props'}->{'opt_backdated'};
}
#úÁÐÒÅÝÁÅÍ ËÏÍÍÅÎÔÁÒÉÉ × ËÏÐÉÒÕÅÍÏÊ ÚÁÐÉÓÉ
$fields->{'props'}->{'opt_nocomments'} = 1;
#äÏÂÁ×ÌÑÅÍ Ë ÔÅËÓÔÕ ÚÁÐÉÓÉ ÓÓÙÌËÕ ÎÁ ËÏÍÍÅÎÔÁÒÉÉ × ÉÓÈÏÄÎÏÍ ÖÕÒÎÁÌÅ
my $talklink_line = "<div style=\"text-align:right\">".
"<font size=\"-2\"><a href=\"".
$entry->{'url'}.
"\">Comments</a> | <a href=\"".
$entry->{'url'}.
"?mode=reply\">Comment on this</a></div>";
$fields->{'event'} = LJR::Viewuserstandalone::expand_ljuser_tags($entry->{'event'}).$talklink_line;
# print STDERR "\n" . $fields->{'event'} . "\n";
#ïÔÐÒÁ×ÌÑÅÍ ÏÞÅÒÅÄÎÕÀ ÚÁÐÉÓØ...
unless ($entry->{'props'}->{'revnum'}) {
eval {
$postevent = xmlrpc_call('LJ.XMLRPC.postevent', $fields);
#úÁÐÉÓÙ×ÁÅÍ ÓÏÏÔ×ÅÔÓÔ×ÉÅ ID ÉÓÈÏÄÎÏÇÏ ÐÏÓÔÉÎÇÁ É
#ID ÏÔÇÅÊÔÏ×ÁÎÎÏÇÏ ÐÏÓÔÉÎÇÁ × ÔÁÂÌÉÃÕ rlj_lj_id
$sqh = $dbh->prepare ("INSERT INTO rlj_lj_id(userid,ljr_id,lj_id)
VALUES ($user_id,
$entry->{'itemid'},
$postevent->{'itemid'})");
$sqh->execute;
};
#ïÂÒÁÂÏÔËÁ ÉÓËÌÀÞÅÎÉÑ: ÅÓÌÉ ÎÅ ÕÄÁÌÓÑ ×ÙÚÏ× XMLRPC
if ($@) {
print STDERR localtime(time) . ": Posting event on $dest_site failed\n";
print STDERR "debug3: " . $@;
print STDERR "\n\n";
};
#...ÉÌÉ ÒÅÄÁËÔÉÒÕÅÍ Å£, ÅÓÌÉ ÏÎÁ ÉÍÅÅÔ ÎÅÎÕÌÅ×ÏÊ ÎÏÍÅÒ ÒÅ×ÉÚÉÉ
} else {
#éÝÅÍ × ÂÁÚÅ ID ÁÎÁÌÏÇÉÞÎÏÊ ÚÁÐÉÓÉ ÄÎÅ×ÎÉËÁ-ËÏÐÉÉ
$sqh = $dbh->prepare ("SELECT lj_id
FROM rlj_lj_id
WHERE userid=$user_id
AND ljr_id=$entry->{'itemid'}");
$sqh->execute;
#ID ÚÁÐÉÓÉ × ÄÎÅ×ÎÉËÅ-ËÏÐÉÉ
my $lj_id;
#åÓÌÉ ÎÁÛÌÉ, ÒÅÄÁËÔÉÒÕÅÍ ÚÁÐÉÓØ Ó ÎÁÊÄÅÎÎÙÍ ID...
if (($lj_id) = $sqh->fetchrow_array) {
$fields->{'itemid'} = $lj_id;
eval {
$postevent = xmlrpc_call('LJ.XMLRPC.editevent', $fields);
};
#ïÂÒÁÂÏÔËÁ ÉÓËÌÀÞÉÔÅÌØÎÏÊ ÓÉÔÕÁÃÉÉ
if ($@) {
print STDERR localtime(time) . ": Editing event on $dest_site failed\n";
print STDERR "debug4: " . $@;
print STDERR "\n\n";
};
#...Á ÅÓÌÉ ÎÅÔ, ÓÒÁ×ÎÉ×ÁÅÍ Å£ ÄÁÔÕ
#Ó ÄÁÔÏÊ ÐÒÅÄÙÄÕÝÅÊ ÓÉÎÈÒÏÎÉÚÁÃÉÉ
} else {
#åÓÌÉ ÚÁÐÉÓØ ÎÏ×ÁÑ, ÔÏ ÐÒÏÓÔÏ ÐÏÓÔÉÍ Å£...
if (timelocal($ls_sec,$ls_min,$ls_hour,$ls_day,$ls_month,$ls_year)<
timelocal($sec, $min, $hour, $day, $month, $year))
{
eval {
$postevent = xmlrpc_call('LJ.XMLRPC.postevent', $fields);
#úÁÐÉÓÙ×ÁÅÍ ÓÏÏÔ×ÅÔÓÔ×ÉÅ ID ÉÓÈÏÄÎÏÇÏ ÐÏÓÔÉÎÇÁ É
#ID ÏÔÇÅÊÔÏ×ÁÎÎÏÇÏ ÐÏÓÔÉÎÇÁ × ÔÁÂÌÉÃÕ rlj_lj_id
$sqh = $dbh->prepare (
"INSERT INTO rlj_lj_id(userid,ljr_id,lj_id)
VALUES ($user_id,
$entry->{'itemid'},
$postevent->{'itemid'})");
$sqh->execute;
};
#ïÂÒÁÂÏÔËÁ ÉÓËÌÀÞÅÎÉÑ: ÅÓÌÉ ÎÅ ÕÄÁÌÓÑ ×ÙÚÏ× XMLRPC
if ($@) {
print STDERR localtime(time) . ": Posting event on $dest_site failed\n";
print STDERR "debug5: " . $@;
print STDERR "\n\n";
};
#...ÉÎÁÞÅ ÐÏÓÔÉÍ Å£ Ó ÁÔÒÉÂÕÔÏÍ backdate
} else {
$fields->{'props'}->{'opt_backdated'} = 1;
eval {
$postevent = xmlrpc_call('LJ.XMLRPC.postevent', $fields);
#úÁÐÉÓÙ×ÁÅÍ ÓÏÏÔ×ÅÔÓÔ×ÉÅ ID ÉÓÈÏÄÎÏÇÏ ÐÏÓÔÉÎÇÁ É
#ID ÏÔÇÅÊÔÏ×ÁÎÎÏÇÏ ÐÏÓÔÉÎÇÁ × ÔÁÂÌÉÃÕ rlj_lj_id
$sqh = $dbh->prepare (
"INSERT INTO rlj_lj_id(userid,ljr_id,lj_id)
VALUES ($user_id,
$entry->{'itemid'},
$postevent->{'itemid'})");
$sqh->execute;
};
#ïÂÒÁÂÏÔËÁ ÉÓËÌÀÞÅÎÉÑ: ÅÓÌÉ ÎÅ ÕÄÁÌÓÑ ×ÙÚÏ× XMLRPC
if ($@) {
print STDERR localtime(time) . ": Posting event on $dest_site failed\n";
print STDERR "debug4: " . $@;
print STDERR "\n\n";
};
};
};
};
};
};
sub xmlrpc_call {
my ($method, $req) = @_;
my $res = $xmlrpc->call($method, $req);
if ($res && $res->fault) {
print STDERR "XML-RPC Error:\n".
" String: " . $res->faultstring . "\n" .
" Code: " . $res->faultcode . "\n";
die;
}
elsif (!$res) {
print STDERR "Unknown XML-RPC Error.\n";
die;
}
return $res->result;
}