Permalink
Fetching contributors…
Cannot retrieve contributors at this time
executable file 229 lines (206 sloc) 6.05 KB
#!/usr/bin/perl -w
use strict;
use lib qw( lib extlib );
binmode STDOUT, ":utf8";
binmode STDERR, ":utf8";
use Getopt::Long;
use LWP::UserAgent;
use HTTP::Request;
use Web::Scraper;
use Data::Dumper;
use Time::HiRes;
use MT;
use MT::Blog;
# Set default option value
my @blog_ids;
my @templates;
my $entry_id = 0;
my $count = 1;
my $mt_url = '';
my $username = 'Melody';
my $password = 'Nelson';
my $silent = 0;
my $usage = 0;
GetOptions(
'blog_id=s' => \@blog_ids,
'template=s' => \@templates,
'count=i' => \$count,
'mt_url=s' => \$mt_url,
'user=s' => \$username,
'pass=s' => \$password,
'silent' => \$silent,
'uaage' => \$usage,
);
# Construct MT object
my $mt = new MT
or die "Not MT object " . MT->errstr();
# Validation of required options
if ( $usage
|| ( !$mt_url )
|| ( !$username )
|| ( !$password ) )
{
usage();
exit;
}
# Parse and load blog
if (@blog_ids) {
@blog_ids = split(/,/, join(',', @blog_ids));
}
my @blogs = MT::Blog->load( { ( @blog_ids ? ( id => @blog_ids ) : () ), } )
or die "Couldn't load blogs. [" . Dumper(@blog_ids) . "]\n";
# Parse template option
if (@templates) {
@templates = split(/,/, join(',', @templates));
}
# Construct UserAgent object
my $ua = new LWP::UserAgent;
# Create scraper object
my $scraper = scraper {
process "div.msg-publishing", status_publishing => 'TEXT';
process "div.msg-error", status_error => 'TEXT';
process "div.msg-success", status_success => 'TEXT';
result 'status_publishing', 'status_error', 'status_success';
};
# call rebuild
for ( my $count_i = 0 ; $count_i < $count ; $count_i++ ) {
foreach my $blog (@blogs) {
logging( "rebuilding (" . ($count_i + 1) . ") " . $blog->name . " ...\n" );
run_rebuild($blog);
}
}
sub run_rebuild {
my $blog = shift;
my @at;
if ( !@templates ) {
@at = split( ',', $blog->archive_type );
push @at, 'index';
}
else {
@at = @templates;
}
foreach (@at) {
my $at = $_;
my $archiver = $mt->publisher->archiver($at);
next if ( !$archiver ) && ( $at ne 'index' );
my $start = Time::HiRes::time();
my $total = 0;
if ($archiver) {
if ( ( $archiver->entry_based || $archiver->date_based )
&& !$entry_id )
{
my $entry_class = $archiver->entry_class || 'entry';
require MT::Entry;
my $terms = {
class => $entry_class,
status => MT::Entry::RELEASE(),
blog_id => $blog->id,
};
$total = MT::Entry->count($terms);
}
elsif ( $archiver->category_based ) {
require MT::Category;
my $terms = {
blog_id => $blog->id,
class => $archiver->category_class,
};
$total = MT::Category->count($terms);
}
elsif ( $archiver->author_based ) {
require MT::Author;
require MT::Entry;
my $terms = {
blog_id => $blog->id,
status => MT::Entry::RELEASE(),
class => 'entry',
};
$total = MT::Author->count(
undef,
{
join => MT::Entry->join_on(
'author_id', $terms, { unique => 1 }
),
unique => 1,
}
);
}
}
my $url =
$mt_url
. "?__mode=rebuild"
. "&blog_id="
. $blog->id
. "&next=0"
. "&offset=0"
. "&limit=20"
. "&entry_id="
. "&is_new="
. "&old_status="
. "&old_previous="
. "&old_next="
. "&total="
. $total
. "&type="
. $at;
do {
$url .= "&username=" . $username;
$url .= "&password=" . $password;
my $req = new HTTP::Request( GET => $url );
my $resp = $ua->request($req);
if ( $resp->is_success ) {
my $res = $scraper->scrape( $resp->content() );
if ( $res->{status_publishing} ) {
( undef, $url ) =
$resp->content() =~ /window.location='(.*)\?(.*)'/;
$url = $mt_url . "?" . $url;
}
elsif ( $res->{status_success} ) {
logging( "\t" . $at . " built success." . "\n" );
$url = undef;
}
elsif ( $res->{status_error} ) {
logging("\t"
. $at
. " built failed. "
. $res->{status_error}
. "\n" );
$url = undef;
}
else {
logging("\t"
. $at
. " built failed.\n"
. $resp->content()
. "\n" );
$url = undef;
}
}
else {
logging(
"\t" . $at . " request failed (" . $resp->code . ")\n" );
$url = undef;
}
} while ($url);
logging( "\t total build time:" . ( Time::HiRes::time() - $start ) . "\n" );
}
}
sub logging {
my ($msg) = @_;
print $msg if !$silent;
}
sub usage {
print STDERR << "EOT";
usage: $0
require:
-mt_url='URL to mt.cgi'
-user='login account of mt'
-pass='login password of mt'
optional:
-blog_id='target blog id.'
-template='target archive type'
-count='the count of cyclic call'
-silent='no output any logs (1|0)'
-usage='show this message'
* This script requires Web::Scraper. You must install from CPAN if you not installed yet.
EOT
}