| #!/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; |
| open(my $file, ">:encoding(UTF-8)", "$destdir/$pagename.mw"); |
| 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}; |
| open(my $file, ">:encoding(UTF-8)", "all.txt"); |
| 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}; |
| open(my $file, ">:encoding(UTF-8)", "all.txt"); |
| 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); |
| |
| 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, |
| ); |
| die "$0 ERROR: wrong argument" unless exists $functions_to_call{$fct_to_call}; |
| $functions_to_call{$fct_to_call}->(map { utf8::decode($_); $_ } @ARGV); |