1
+#!/usr/bin/perl -w -s
2
+# Copyright (C) 2012
3
+# Charles Roussel <charles.roussel@ensimag.imag.fr>
4
+# Simon Cathebras <simon.cathebras@ensimag.imag.fr>
5
+# Julien Khayat <julien.khayat@ensimag.imag.fr>
6
+# Guillaume Sasdy <guillaume.sasdy@ensimag.imag.fr>
7
+# Simon Perrat <simon.perrat@ensimag.imag.fr>
8
+# License: GPL v2 or later
9
+
10
+# Usage:
11
+# ./test-gitmw.pl <command> [argument]*
12
+# Execute in terminal using the name of the function to call as first
13
+# parameter, and the function's arguments as following parameters
14
+#
15
+# Example:
16
+# ./test-gitmw.pl "get_page" foo .
17
+# will call <wiki_getpage> with arguments <foo> and <.>
18
+#
19
+# Available functions are:
20
+# "get_page"
21
+# "delete_page"
22
+# "edit_page"
23
+# "getallpagename"
24
+
25
+use MediaWiki::API;
26
+use Getopt::Long;
27
+use encoding 'utf8';
28
+use DateTime::Format::ISO8601;
29
+use open ':encoding(utf8)';
30
+use constant SLASH_REPLACEMENT => "%2F";
31
+
32
+#Parsing of the config file
33
+
34
+my $configfile = "$ENV{'CURR_DIR'}/test.config";
35
+my %config;
36
+open my $CONFIG, "<", $configfile or die "can't open $configfile: $!";
37
+while (<$CONFIG>)
38
+{
39
+ chomp;
40
+ s/#.*//;
41
+ s/^\s+//;
42
+ s/\s+$//;
43
+ next unless length;
44
+ my ($key, $value) = split (/\s*=\s*/,$_, 2);
45
+ $config{$key} = $value;
46
+ last if ($key eq 'LIGHTTPD' and $value eq 'false');
47
+ last if ($key eq 'PORT');
48
+}
49
+close $CONFIG or die "can't close $configfile: $!";
50
+
51
+my $wiki_address = "http://$config{'SERVER_ADDR'}".":"."$config{'PORT'}";
52
+my $wiki_url = "$wiki_address/$config{'WIKI_DIR_NAME'}/api.php";
53
+my $wiki_admin = "$config{'WIKI_ADMIN'}";
54
+my $wiki_admin_pass = "$config{'WIKI_PASSW'}";
55
+my $mw = MediaWiki::API->new;
56
+$mw->{config}->{api_url} = $wiki_url;
57
+
58
+
59
+# wiki_login <name> <password>
60
+#
61
+# Logs the user with <name> and <password> in the global variable
62
+# of the mediawiki $mw
63
+sub wiki_login {
64
+ $mw->login( { lgname => "$_[0]",lgpassword => "$_[1]" } )
65
+ || die "getpage: login failed";
66
+}
67
+
68
+# wiki_getpage <wiki_page> <dest_path>
69
+#
70
+# fetch a page <wiki_page> from the wiki referenced in the global variable
71
+# $mw and copies its content in directory dest_path
72
+sub wiki_getpage {
73
+ my $pagename = $_[0];
74
+ my $destdir = $_[1];
75
+
76
+ my $page = $mw->get_page( { title => $pagename } );
77
+ if (!defined($page)) {
78
+ die "getpage: wiki does not exist";
79
+ }
80
+
81
+ my $content = $page->{'*'};
82
+ if (!defined($content)) {
83
+ die "getpage: page does not exist";
84
+ }
85
+
86
+ $pagename=$page->{'title'};
87
+ # Replace spaces by underscore in the page name
88
+ $pagename =~ s/ /_/g;
89
+ $pagename =~ s/\//%2F/g;
90
+ open(my $file, ">$destdir/$pagename.mw");
91
+ print $file "$content";
92
+ close ($file);
93
+
94
+}
95
+
96
+# wiki_delete_page <page_name>
97
+#
98
+# delete the page with name <page_name> from the wiki referenced
99
+# in the global variable $mw
100
+sub wiki_delete_page {
101
+ my $pagename = $_[0];
102
+
103
+ my $exist=$mw->get_page({title => $pagename});
104
+
105
+ if (defined($exist->{'*'})){
106
+ $mw->edit({ action => 'delete',
107
+ title => $pagename})
108
+ || die $mw->{error}->{code} . ": " . $mw->{error}->{details};
109
+ } else {
110
+ die "no page with such name found: $pagename\n";
111
+ }
112
+}
113
+
114
+# wiki_editpage <wiki_page> <wiki_content> <wiki_append> [-c=<category>] [-s=<summary>]
115
+#
116
+# Edit a page named <wiki_page> with content <wiki_content> on the wiki
117
+# referenced with the global variable $mw
118
+# If <wiki_append> == true : append <wiki_content> at the end of the actual
119
+# content of the page <wiki_page>
120
+# If <wik_page> doesn't exist, that page is created with the <wiki_content>
121
+sub wiki_editpage {
122
+ my $wiki_page = $_[0];
123
+ my $wiki_content = $_[1];
124
+ my $wiki_append = $_[2];
125
+ my $summary = "";
126
+ my ($summ, $cat) = ();
127
+ GetOptions('s=s' => \$summ, 'c=s' => \$cat);
128
+
129
+ my $append = 0;
130
+ if (defined($wiki_append) && $wiki_append eq 'true') {
131
+ $append=1;
132
+ }
133
+
134
+ my $previous_text ="";
135
+
136
+ if ($append) {
137
+ my $ref = $mw->get_page( { title => $wiki_page } );
138
+ $previous_text = $ref->{'*'};
139
+ }
140
+
141
+ my $text = $wiki_content;
142
+ if (defined($previous_text)) {
143
+ $text="$previous_text$text";
144
+ }
145
+
146
+ # Eventually, add this page to a category.
147
+ if (defined($cat)) {
148
+ my $category_name="[[Category:$cat]]";
149
+ $text="$text\n $category_name";
150
+ }
151
+ if(defined($summ)){
152
+ $summary=$summ;
153
+ }
154
+
155
+ $mw->edit( { action => 'edit', title => $wiki_page, summary => $summary, text => "$text"} );
156
+}
157
+
158
+# wiki_getallpagename [<category>]
159
+#
160
+# Fetch all pages of the wiki referenced by the global variable $mw
161
+# and print the names of each one in the file all.txt with a new line
162
+# ("\n") between these.
163
+# If the argument <category> is defined, then this function get only the pages
164
+# belonging to <category>.
165
+sub wiki_getallpagename {
166
+ # fetch the pages of the wiki
167
+ if (defined($_[0])) {
168
+ my $mw_pages = $mw->list ( { action => 'query',
169
+ list => 'categorymembers',
170
+ cmtitle => "Category:$_[0]",
171
+ cmnamespace => 0,
172
+ cmlimit => 500 },
173
+ )
174
+ || die $mw->{error}->{code}.": ".$mw->{error}->{details};
175
+ open(my $file, ">all.txt");
176
+ foreach my $page (@{$mw_pages}) {
177
+ print $file "$page->{title}\n";
178
+ }
179
+ close ($file);
180
+
181
+ } else {
182
+ my $mw_pages = $mw->list({
183
+ action => 'query',
184
+ list => 'allpages',
185
+ aplimit => 500,
186
+ })
187
+ || die $mw->{error}->{code}.": ".$mw->{error}->{details};
188
+ open(my $file, ">all.txt");
189
+ foreach my $page (@{$mw_pages}) {
190
+ print $file "$page->{title}\n";
191
+ }
192
+ close ($file);
193
+ }
194
+}
195
+
196
+# Main part of this script: parse the command line arguments
197
+# and select which function to execute
198
+my $fct_to_call = shift;
199
+
200
+wiki_login($wiki_admin, $wiki_admin_pass);
201
+
202
+my %functions_to_call = qw(
203
+ get_page wiki_getpage
204
+ delete_page wiki_delete_page
205
+ edit_page wiki_editpage
206
+ getallpagename wiki_getallpagename
207
+);
208
+die "$0 ERROR: wrong argument" unless exists $functions_to_call{$fct_to_call};
209
+&{$functions_to_call{$fct_to_call}}(@ARGV);