2020-01-12 00:36:56 +01:00
|
|
|
#!/usr/bin/perl -w -s
|
|
|
|
# Copyright (C) 2012
|
|
|
|
# Charles Roussel <charles.roussel@ensimag.imag.fr>
|
|
|
|
# Simon Cathebras <simon.cathebras@ensimag.imag.fr>
|
|
|
|
# Julien Khayat <julien.khayat@ensimag.imag.fr>
|
|
|
|
# Guillaume Sasdy <guillaume.sasdy@ensimag.imag.fr>
|
|
|
|
# Simon Perrat <simon.perrat@ensimag.imag.fr>
|
|
|
|
# License: GPL v2 or later
|
|
|
|
|
|
|
|
# Usage:
|
|
|
|
# ./test-gitmw.pl <command> [argument]*
|
|
|
|
# Execute in terminal using the name of the function to call as first
|
|
|
|
# parameter, and the function's arguments as following parameters
|
|
|
|
#
|
|
|
|
# Example:
|
|
|
|
# ./test-gitmw.pl "get_page" foo .
|
|
|
|
# will call <wiki_getpage> with arguments <foo> and <.>
|
|
|
|
#
|
|
|
|
# Available functions are:
|
|
|
|
# "get_page"
|
|
|
|
# "delete_page"
|
|
|
|
# "edit_page"
|
|
|
|
# "getallpagename"
|
|
|
|
|
|
|
|
use MediaWiki::API;
|
|
|
|
use Getopt::Long;
|
|
|
|
use DateTime::Format::ISO8601;
|
|
|
|
use constant SLASH_REPLACEMENT => "%2F";
|
|
|
|
|
|
|
|
#Parsing of the config file
|
|
|
|
|
|
|
|
my $configfile = "$ENV{'CURR_DIR'}/test.config";
|
|
|
|
my %config;
|
|
|
|
open my $CONFIG, "<", $configfile or die "can't open $configfile: $!";
|
|
|
|
while (<$CONFIG>)
|
|
|
|
{
|
|
|
|
chomp;
|
|
|
|
s/#.*//;
|
|
|
|
s/^\s+//;
|
|
|
|
s/\s+$//;
|
|
|
|
next unless length;
|
|
|
|
my ($key, $value) = split (/\s*=\s*/,$_, 2);
|
|
|
|
$config{$key} = $value;
|
|
|
|
last if ($key eq 'LIGHTTPD' and $value eq 'false');
|
|
|
|
last if ($key eq 'PORT');
|
|
|
|
}
|
|
|
|
close $CONFIG or die "can't close $configfile: $!";
|
|
|
|
|
|
|
|
my $wiki_address = "http://$config{'SERVER_ADDR'}".":"."$config{'PORT'}";
|
|
|
|
my $wiki_url = "$wiki_address/$config{'WIKI_DIR_NAME'}/api.php";
|
|
|
|
my $wiki_admin = "$config{'WIKI_ADMIN'}";
|
|
|
|
my $wiki_admin_pass = "$config{'WIKI_PASSW'}";
|
|
|
|
my $mw = MediaWiki::API->new;
|
|
|
|
$mw->{config}->{api_url} = $wiki_url;
|
|
|
|
|
|
|
|
|
|
|
|
# wiki_login <name> <password>
|
|
|
|
#
|
|
|
|
# Logs the user with <name> and <password> in the global variable
|
|
|
|
# of the mediawiki $mw
|
|
|
|
sub wiki_login {
|
|
|
|
$mw->login( { lgname => "$_[0]",lgpassword => "$_[1]" } )
|
|
|
|
|| die "getpage: login failed";
|
|
|
|
}
|
|
|
|
|
|
|
|
# wiki_getpage <wiki_page> <dest_path>
|
|
|
|
#
|
|
|
|
# fetch a page <wiki_page> from the wiki referenced in the global variable
|
|
|
|
# $mw and copies its content in directory dest_path
|
|
|
|
sub wiki_getpage {
|
|
|
|
my $pagename = $_[0];
|
|
|
|
my $destdir = $_[1];
|
|
|
|
|
|
|
|
my $page = $mw->get_page( { title => $pagename } );
|
|
|
|
if (!defined($page)) {
|
|
|
|
die "getpage: wiki does not exist";
|
|
|
|
}
|
|
|
|
|
|
|
|
my $content = $page->{'*'};
|
|
|
|
if (!defined($content)) {
|
|
|
|
die "getpage: page does not exist";
|
|
|
|
}
|
|
|
|
|
|
|
|
$pagename=$page->{'title'};
|
|
|
|
# Replace spaces by underscore in the page name
|
|
|
|
$pagename =~ s/ /_/g;
|
|
|
|
$pagename =~ s/\//%2F/g;
|
2020-11-21 19:20:35 +01:00
|
|
|
open(my $file, ">:encoding(UTF-8)", "$destdir/$pagename.mw");
|
2020-01-12 00:36:56 +01:00
|
|
|
print $file "$content";
|
|
|
|
close ($file);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
# wiki_delete_page <page_name>
|
|
|
|
#
|
|
|
|
# delete the page with name <page_name> from the wiki referenced
|
|
|
|
# in the global variable $mw
|
|
|
|
sub wiki_delete_page {
|
|
|
|
my $pagename = $_[0];
|
|
|
|
|
|
|
|
my $exist=$mw->get_page({title => $pagename});
|
|
|
|
|
|
|
|
if (defined($exist->{'*'})){
|
|
|
|
$mw->edit({ action => 'delete',
|
|
|
|
title => $pagename})
|
|
|
|
|| die $mw->{error}->{code} . ": " . $mw->{error}->{details};
|
|
|
|
} else {
|
|
|
|
die "no page with such name found: $pagename\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
# wiki_editpage <wiki_page> <wiki_content> <wiki_append> [-c=<category>] [-s=<summary>]
|
|
|
|
#
|
|
|
|
# Edit a page named <wiki_page> with content <wiki_content> on the wiki
|
|
|
|
# referenced with the global variable $mw
|
|
|
|
# If <wiki_append> == true : append <wiki_content> at the end of the actual
|
|
|
|
# content of the page <wiki_page>
|
|
|
|
# If <wik_page> doesn't exist, that page is created with the <wiki_content>
|
|
|
|
sub wiki_editpage {
|
|
|
|
my $wiki_page = $_[0];
|
|
|
|
my $wiki_content = $_[1];
|
|
|
|
my $wiki_append = $_[2];
|
|
|
|
my $summary = "";
|
|
|
|
my ($summ, $cat) = ();
|
|
|
|
GetOptions('s=s' => \$summ, 'c=s' => \$cat);
|
|
|
|
|
|
|
|
my $append = 0;
|
|
|
|
if (defined($wiki_append) && $wiki_append eq 'true') {
|
|
|
|
$append=1;
|
|
|
|
}
|
|
|
|
|
|
|
|
my $previous_text ="";
|
|
|
|
|
|
|
|
if ($append) {
|
|
|
|
my $ref = $mw->get_page( { title => $wiki_page } );
|
|
|
|
$previous_text = $ref->{'*'};
|
|
|
|
}
|
|
|
|
|
|
|
|
my $text = $wiki_content;
|
|
|
|
if (defined($previous_text)) {
|
|
|
|
$text="$previous_text$text";
|
|
|
|
}
|
|
|
|
|
|
|
|
# Eventually, add this page to a category.
|
|
|
|
if (defined($cat)) {
|
|
|
|
my $category_name="[[Category:$cat]]";
|
|
|
|
$text="$text\n $category_name";
|
|
|
|
}
|
|
|
|
if(defined($summ)){
|
|
|
|
$summary=$summ;
|
|
|
|
}
|
|
|
|
|
|
|
|
$mw->edit( { action => 'edit', title => $wiki_page, summary => $summary, text => "$text"} );
|
|
|
|
}
|
|
|
|
|
|
|
|
# wiki_getallpagename [<category>]
|
|
|
|
#
|
|
|
|
# Fetch all pages of the wiki referenced by the global variable $mw
|
|
|
|
# and print the names of each one in the file all.txt with a new line
|
|
|
|
# ("\n") between these.
|
|
|
|
# If the argument <category> is defined, then this function get only the pages
|
|
|
|
# belonging to <category>.
|
|
|
|
sub wiki_getallpagename {
|
|
|
|
# fetch the pages of the wiki
|
|
|
|
if (defined($_[0])) {
|
|
|
|
my $mw_pages = $mw->list ( { action => 'query',
|
|
|
|
list => 'categorymembers',
|
|
|
|
cmtitle => "Category:$_[0]",
|
|
|
|
cmnamespace => 0,
|
|
|
|
cmlimit => 500 },
|
|
|
|
)
|
|
|
|
|| die $mw->{error}->{code}.": ".$mw->{error}->{details};
|
2020-11-21 19:20:35 +01:00
|
|
|
open(my $file, ">:encoding(UTF-8)", "all.txt");
|
2020-01-12 00:36:56 +01:00
|
|
|
foreach my $page (@{$mw_pages}) {
|
|
|
|
print $file "$page->{title}\n";
|
|
|
|
}
|
|
|
|
close ($file);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
my $mw_pages = $mw->list({
|
|
|
|
action => 'query',
|
|
|
|
list => 'allpages',
|
|
|
|
aplimit => 500,
|
|
|
|
})
|
|
|
|
|| die $mw->{error}->{code}.": ".$mw->{error}->{details};
|
2020-11-21 19:20:35 +01:00
|
|
|
open(my $file, ">:encoding(UTF-8)", "all.txt");
|
2020-01-12 00:36:56 +01:00
|
|
|
foreach my $page (@{$mw_pages}) {
|
|
|
|
print $file "$page->{title}\n";
|
|
|
|
}
|
|
|
|
close ($file);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sub wiki_upload_file {
|
|
|
|
my $file_name = $_[0];
|
|
|
|
my $resultat = $mw->edit ( {
|
|
|
|
action => 'upload',
|
|
|
|
filename => $file_name,
|
|
|
|
comment => 'upload a file',
|
|
|
|
file => [ $file_name ],
|
|
|
|
ignorewarnings=>1,
|
|
|
|
}, {
|
|
|
|
skip_encoding => 1
|
|
|
|
} ) || die $mw->{error}->{code} . ' : ' . $mw->{error}->{details};
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Main part of this script: parse the command line arguments
|
|
|
|
# and select which function to execute
|
|
|
|
my $fct_to_call = shift;
|
|
|
|
|
|
|
|
wiki_login($wiki_admin, $wiki_admin_pass);
|
|
|
|
|
2020-11-21 19:20:35 +01:00
|
|
|
my %functions_to_call = (
|
|
|
|
upload_file => \&wiki_upload_file,
|
|
|
|
get_page => \&wiki_getpage,
|
|
|
|
delete_page => \&wiki_delete_page,
|
|
|
|
edit_page => \&wiki_editpage,
|
|
|
|
getallpagename => \&wiki_getallpagename,
|
2020-01-12 00:36:56 +01:00
|
|
|
);
|
|
|
|
die "$0 ERROR: wrong argument" unless exists $functions_to_call{$fct_to_call};
|
2020-11-21 19:20:35 +01:00
|
|
|
$functions_to_call{$fct_to_call}->(map { utf8::decode($_); $_ } @ARGV);
|