root/branches/release-38/mt-check.cgi.pre @ 2319

Revision 2319, 18.7 kB (checked in by fumiakiy, 19 months ago)

Applied L10N patch to mt-check.cgi to enable other languages. Thanks mirco for reporting the issue. BugId:79727

  • Property svn:keywords set to Author Date Id Revision
Line 
1#!/usr/bin/perl -w
2
3# Movable Type (r) Open Source (C) 2001-2008 Six Apart, Ltd.
4# This program is distributed under the terms of the
5# GNU General Public License, version 2.
6#
7# $Id$
8
9use strict;
10sub BEGIN {
11    my $dir;
12    if (eval { require File::Spec; 1; }) {
13        if (!($dir = $ENV{MT_HOME})) {
14            if ($0 =~ m!(.*[/\\])!) {
15                $dir = $1;
16            } else {
17                $dir = './';
18            }
19            $ENV{MT_HOME} = $dir;
20        }
21        unshift @INC, File::Spec->catdir($dir, 'lib');
22        unshift @INC, File::Spec->catdir($dir, 'extlib');
23    }
24}
25
26my $cfg_exist;
27my $mt_static_path = q();
28my $mt_cgi_path;
29if ((-f File::Spec->catfile($ENV{MT_HOME}, 'mt-config.cgi')) ||
30    (-f File::Spec->catfile($ENV{MT_HOME}, 'mt.cfg'))) {
31    $cfg_exist = 1;
32    my $file_handle = open(CFG, $ENV{MT_HOME}.'/mt.cfg') || open(CFG, $ENV{MT_HOME}.'/mt-config.cgi');
33    my $line;
34    while ($line = <CFG>) {
35        next if $line !~ /\S/ || $line =~ /^#/;
36        if ($line =~ s/StaticWebPath[\s]*([^\n]*)/$1/) {
37            $mt_static_path = $line;
38            chomp($mt_static_path);
39        }
40        elsif ($line =~ s/CGIPath[\s]*([^\n]*)/$1/) {
41            $mt_cgi_path = $line;
42            chomp($mt_cgi_path);
43        }
44    }
45    if ( !$mt_static_path && $mt_cgi_path ) {
46        $mt_cgi_path .= '/' if $mt_cgi_path !~ m|/$|;
47        $mt_static_path = $mt_cgi_path . 'mt-static/';
48    }
49}
50
51local $| = 1;
52
53use CGI;
54my $cgi = new CGI;
55my $view = $cgi->param("view");
56my $version = $cgi->param("version");
57$version ||= '__PRODUCT_VERSION_ID__';
58
59my ($mt, $LH);
60my $lang = '__BUILD_LANGUAGE__';
61eval {
62    require MT::App::Wizard;
63    $mt = MT::App::Wizard->new();
64    my $cfg = $mt->config;
65    $cfg->PublishCharset('utf-8');
66    $cfg->DefaultLanguage($lang);
67    require MT::L10N;
68    if ( $mt ) {
69        $LH = $mt->language_handle;
70        $mt->set_language($lang);
71    }
72    else {
73        MT::L10N->get_handle($lang);
74    }
75};
76
77sub trans_templ {
78    my($text) = @_;
79    return $mt->translate_templatized($text) if $mt;
80    $text =~ s!(<MT_TRANS(?:\s+((?:\w+)\s*=\s*(["'])(?:<[^>]+?>|[^\3]+?)+?\3))+?\s*/?>)!
81        my($msg, %args) = ($1);
82        #print $msg;
83        while ($msg =~ /\b(\w+)\s*=\s*(["'])((?:<[^>]+?>|[^\2])*?)\2/g) {  #"
84            $args{$1} = $3;
85        }
86        $args{params} = '' unless defined $args{params};
87        my @p = map decode_html($_),
88                split /\s*%%\s*/, $args{params};
89        @p = ('') unless @p;
90        my $translation = translate($args{phrase}, @p);
91        $translation =~ s/([\\'])/\\$1/sg if $args{escape};
92        $translation;
93    !ge;
94    $text;
95}
96
97sub translate {
98    return (
99        $mt ? $mt->translate(@_)
100            : $LH ? $LH->maketext(@_)
101                  : merge_params(@_)
102    );
103}
104
105sub decode_html {
106    my($html) = @_;
107    if ($cfg_exist && (eval 'use MT::Util; 1')) {
108        return MT::Util::decode_html($html);
109    } else {
110        $html =~ s#&quot;#"#g;
111        $html =~ s#&lt;#<#g;
112        $html =~ s#&gt;#>#g;
113        $html =~ s#&amp;#&#g;
114    }
115    $html;
116}
117
118sub merge_params {
119    my ($msg, @param) = @_;
120    my $cnt = 1;
121    foreach my $p (@param) {
122        $msg =~ s/\[_$cnt\]/$p/g;
123        $cnt++;
124    }
125    $msg;
126}
127
128print "Content-Type: text/html; charset=utf-8\n\n";
129if (!$view) {
130    print trans_templ(<<HTML);
131
132<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
133<html xmlns="http://www.w3.org/1999/xhtml">
134
135<head>
136    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
137    <meta http-equiv="content-language" content="$lang" />
138   
139    <title><MT_TRANS phrase="Movable Type System Check"> [mt-check.cgi]</title>
140   
141    <style type=\"text/css\">
142        <!--
143       
144            body {
145                font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
146                font-size: 13px;
147                margin: 0;
148                padding: 0;
149                background-color: #fff;
150            }
151           
152            body.has-static {
153                background: #fff url('$mt_static_path/images/chromeless/chromeless_top_bg.gif') repeat-x;
154            }
155           
156            body.has-static #header {
157                background: url('$mt_static_path/images/chromeless/movable-type-logo.gif') no-repeat 25px 15px;
158                height: 55px;
159            }
160           
161            #content {
162                margin: 20px 20px 100px;
163            }
164           
165            h1 {
166                margin: 0;
167                padding: 10px;
168                text-align: center;
169                font-size: 22px;
170                color: #fff;
171                background: #000;
172            }
173            body.has-static #header h1 {
174                display: none;
175            }
176           
177            h2 {
178                margin-top: 2em;
179                margin-bottom: .5em;
180                font-size: 24px;
181                font-weight: normal;
182            }
183            h2#system-info {
184                margin-top: 1em;
185            }
186           
187            h3 {
188                color: #333;
189                font-size: 16px;
190                margin-bottom: 0px;
191            }
192   
193            p, ul {
194                margin: 0 0 .75em 0;
195                padding: 0;
196            }
197           
198            ul {
199                padding-left: 20px;
200            }
201           
202            .msg {
203                margin: 0 0 10px 0;
204                padding: 16px 10px 16px 46px;
205                background-repeat: no-repeat;
206            }
207            .msg-info {
208                background-color: #eaf2ff;
209                background-image: url('$mt_static_path/images/icon_info.gif');
210                background-position: 12px center;
211                border: 1px solid #999;
212            }
213
214                        .ready {
215                                color: #fff;
216                                background-color: #9C6;
217                border: 0;
218                padding-left: 5px;
219                        }
220
221            .msg-success {
222                background-color: #CFC;
223                background-image: url('$mt_static_path/images/icon_success.png');
224                background-position: 12px .75em;
225                font-size: 24px;
226            }
227            .msg-success h2 {
228                margin-top: 0;
229            }
230            .msg-success p {
231                font-size: 13px;
232            }
233
234            .info {
235                margin-left: 60px;
236                margin-right: 60px;
237                padding: 20px;
238                border: 1px solid #eaf2ff;
239                background: #eaf2ff;
240                color: #000;
241            }
242
243            .installed {
244                color: #93b06b;
245                padding-top: 0px;
246                margin-top: 0px;
247            }
248
249            .warning {
250                padding-top: 0px;
251                margin-top: 4px;
252                border-left: 1px solid red;
253                padding-left: 10px;
254                margin-left: 20px;
255            }
256           
257            ul.version {
258                margin-bottom: 0;
259            }
260       
261        //-->
262    </style>
263
264</head>
265
266HTML
267    if ($mt_static_path) {
268        print "<body class=\"has-static\">\n";
269    } else {
270        print "<body>\n";
271    }
272    print trans_templ(<<HTML);
273<div id="header"><h1><MT_TRANS phrase="Movable Type System Check"> [mt-check.cgi]</h1></div>
274
275<div id="content">
276<p class="msg msg-info"><MT_TRANS phrase="The mt-check.cgi script provides you with information on your system's configuration and determines whether you have all of the components you need to run Movable Type."></p>
277HTML
278}
279
280my $is_good = 1;
281my (@REQ, @DATA, @OPT);
282
283my @CORE_REQ = (
284    [ 'CGI', 0, 1, translate('CGI is required for all Movable Type application functionality.') ],
285
286    [ 'Image::Size', 0, 1, translate('Image::Size is required for file uploads (to determine the size of uploaded images in many different formats).') ],
287
288    [ 'File::Spec', 0.8, 1, translate('File::Spec is required for path manipulation across operating systems.') ],
289
290    [ 'CGI::Cookie', 0, 1, translate('CGI::Cookie is required for cookie authentication.') ],
291);
292
293my @CORE_DATA = (
294    [ 'DBI', 1.21, 0, translate('DBI is required to store data in database.') ],
295
296    [ 'DBD::mysql', 0, 0, translate('DBI and DBD::mysql are required if you want to use the MySQL database backend.') ],
297
298    [ 'DBD::Pg', 1.32, 0, translate('DBI and DBD::Pg are required if you want to use the PostgreSQL database backend.') ],
299
300    [ 'DBD::SQLite', 0, 0, translate('DBI and DBD::SQLite are required if you want to use the SQLite database backend.') ],
301
302    [ 'DBD::SQLite2', 0, 0, translate('DBI and DBD::SQLite2 are required if you want to use the SQLite 2.x database backend.') ],
303
304);
305
306my @CORE_OPT = (
307    [ 'HTML::Entities', 0, 0, translate('HTML::Entities is needed to encode some characters, but this feature can be turned off using the NoHTMLEntities option in the configuration file.') ],
308
309    [ 'LWP::UserAgent', 0, 0, translate('LWP::UserAgent is optional; It is needed if you wish to use the TrackBack system, the weblogs.com ping, or the MT Recently Updated ping.') ],
310
311    [ 'HTML::Parser', 0, 0, translate('HTML::Parser is optional; It is needed if you wish to use the TrackBack system, the weblogs.com ping, or the MT Recently Updated ping.') ],
312
313    [ 'SOAP::Lite', 0.50, 0, translate('SOAP::Lite is optional; It is needed if you wish to use the MT XML-RPC server implementation.') ],
314
315    [ 'File::Temp', 0, 0, translate('File::Temp is optional; It is needed if you would like to be able to overwrite existing files when you upload.') ],
316
317    [ 'Scalar::Util', 0, 1, translate('Scalar::Util is optional; It is needed if you want to use the Publish Queue feature.')],
318
319    [ 'List::Util', 0, 1, translate('List::Util is optional; It is needed if you want to use the Publish Queue feature.')],
320
321    [ 'Image::Magick', 0, 0, translate('Image::Magick is optional; It is needed if you would like to be able to create thumbnails of uploaded images.') ],
322
323    [ 'Storable', 0, 0, translate('Storable is optional; it is required by certain MT plugins available from third parties.')],
324
325    [ 'Crypt::DSA', 0, 0, translate('Crypt::DSA is optional; if it is installed, comment registration sign-ins will be accelerated.')],
326
327    [ 'MIME::Base64', 0, 0, translate('MIME::Base64 is required in order to enable comment registration.')],
328
329    [ 'XML::Atom', 0, 0, translate('XML::Atom is required in order to use the Atom API.')],
330
331    [ 'Cache::Memcached', 0, 0, translate('Cache::Memcached and memcached server/daemon is required in order to use memcached as caching mechanism used by Movable Type.')],
332
333    [ 'Archive::Tar', 0, 0, translate('Archive::Tar is required in order to archive files in backup/restore operation.')],
334
335    [ 'IO::Compress::Gzip', 0, 0, translate('IO::Compress::Gzip is required in order to compress files in backup/restore operation.')],
336       
337    [ 'IO::Uncompress::Gunzip', 0, 0, translate('IO::Uncompress::Gunzip is required in order to decompress files in backup/restore operation.')],
338   
339    [ 'Archive::Zip', 0, 0, translate('Archive::Zip is required in order to archive files in backup/restore operation.')],
340
341    [ 'XML::SAX', 0, 0, translate('XML::SAX and/or its dependencies is required in order to restore.')],
342
343    [ 'Digest::SHA1', 0, 0, translate('Digest::SHA1 and its dependencies are required in order to allow commenters to be authenticated by OpenID providers including Vox and LiveJournal.')],
344    [ 'Mail::Sendmail', 0, 0, translate('Mail::Sendmail is required for sending mail via SMTP Server.')],
345);
346
347use Cwd;
348my $cwd = '';
349{
350    my($bad);
351    local $SIG{__WARN__} = sub { $bad++ };
352    eval { $cwd = Cwd::getcwd() };
353    if ($bad || $@) {
354        eval { $cwd = Cwd::cwd() };
355        if ($@ && $@ !~ /Insecure \$ENV{PATH}/) {
356            die $@;
357        }
358    }
359}
360
361my $ver = ref($^V) eq 'version' ? $^V->normal : ( $^V ? join('.', unpack 'C*', $^V) : $] );
362my $perl_ver_check = '';
363if ($] < 5.006001) {  # our minimal requirement for support
364    $perl_ver_check = <<EOT;
365<p class="warning"><MT_TRANS phrase="The version of Perl installed on your server ([_1]) is lower than the minimum supported version ([_2]). Please upgrade to at least Perl [_2]." params="$ver%%5.6.1"></p>
366EOT
367}
368my $config_check = '';
369if (!$cfg_exist) {
370    $config_check = <<CONFIG;
371<p class="warning"><MT_TRANS phrase="Movable Type configuration file was not found."></p>
372CONFIG
373}
374my $server = $ENV{SERVER_SOFTWARE};
375my $inc_path = join "<br />\n", @INC;
376print trans_templ(<<INFO);
377<h2 id="system-info"><MT_TRANS phrase="System Information"></h2>
378$perl_ver_check
379$config_check
380INFO
381if ($version) {
382    # sanitize down to letters numbers dashes and period
383    $version =~ s/[^a-zA-Z0-9\-\.]//g;
384print trans_templ(<<INFO);
385<ul class="version">
386    <li><strong><MT_TRANS phrase="Movable Type version:"></strong> <code>$version</code></li>
387</ul>
388INFO
389}
390print trans_templ(<<INFO);
391<ul>
392        <li><strong><MT_TRANS phrase="Current working directory:"></strong> <code>$cwd</code></li>
393        <li><strong><MT_TRANS phrase="MT home directory:"></strong> <code>$ENV{MT_HOME}</code></li>
394        <li><strong><MT_TRANS phrase="Operating system:"></strong> $^O</li>
395        <li><strong><MT_TRANS phrase="Perl version:"></strong> <code>$ver</code></li>
396        <li><strong><MT_TRANS phrase="Perl include path:"></strong><br /> <code>$inc_path</code></li>
397INFO
398if ($server) {
399print trans_templ(<<INFO);
400    <li><strong><MT_TRANS phrase="Web server:"></strong> <code>$server</code></li>
401INFO
402}
403
404## Try to create a new file in the current working directory. This
405## isn't a perfect test for running under cgiwrap/suexec, but it
406## is a pretty good test.
407my $TMP = "test$$.tmp";
408local *FH;
409if (open(FH, ">$TMP")) {
410    close FH;
411    unlink($TMP);
412    print trans_templ('    <li><MT_TRANS phrase="(Probably) Running under cgiwrap or suexec"></li>' . "\n");
413}
414
415print "\n\n</ul>\n";
416
417exit if $ENV{QUERY_STRING} && $ENV{QUERY_STRING} eq 'sys-check';
418
419if ($mt) {
420    my $req = $mt->registry("required_packages");
421    foreach my $key (keys %$req) {
422        next if $key eq 'DBI';
423        my $pkg = $req->{$key};
424        push @REQ, [ $key, $pkg->{version} || 0, 1, $pkg->{label}, $key, $pkg->{link} ];
425    }
426    my $drivers = $mt->object_drivers;
427    foreach my $key (keys %$drivers) {
428        my $driver = $drivers->{$key};
429        my $label = $driver->{label};
430        my $link = 'http://search.cpan.org/dist/' . $driver->{dbd_package};
431        $link =~ s/::/-/g;
432        push @DATA, [ $driver->{dbd_package}, $driver->{dbd_version}, 0,
433            $mt->translate("The [_1] database driver is required to use [_2].", $driver->{dbd_package}, $label),
434            $label, $link ];
435    }
436    unshift @DATA, [ 'DBI', 1.21, 0, translate('DBI is required to store data in database.') ]
437        if @DATA;
438    my $opt = $mt->registry("optional_packages");
439    foreach my $key (keys %$opt) {
440        my $pkg = $opt->{$key};
441        push @OPT, [ $key, $pkg->{version} || 0, 0, $pkg->{label}, $key, $pkg->{link} ];
442    }
443}
444@REQ  = @CORE_REQ  unless @REQ;
445@DATA = @CORE_DATA unless @DATA;
446@OPT  = @CORE_OPT  unless @OPT;
447
448for my $list (\@REQ, \@DATA, \@OPT) {
449    my $data = ($list == \@DATA);
450    my $req = ($list == \@REQ);
451    my $type;
452    my $phrase;
453
454    if (!$view) {
455        $phrase = translate("Checking for");
456    } else {
457        $phrase = translate("Installed");
458    }
459
460    if ($data) {
461        $type = translate("Data Storage");
462    } elsif ($req) {
463        $type = translate("Required");
464    } else {
465        $type = translate("Optional");
466    }
467    print trans_templ(qq{<h2><MT_TRANS phrase="[_1] [_2] Modules" params="$phrase%%$type"></h2>\n\t<div>\n});
468    if (!$req && !$data) {
469        if (!$view) {
470        print trans_templ(<<MSG);
471    <p class="msg msg-info"><MT_TRANS phrase="The following modules are <strong>optional</strong>. If your server does not have these modules installed, you only need to install them if you require the functionality that the module provides."></p>
472
473MSG
474       }
475    }
476    if ($data) {
477        if (!$view) {
478        print trans_templ(<<MSG);
479        <p class="msg msg-info"><MT_TRANS phrase="Some of the following modules are required by the various data storage options in Movable Type. In order run the system, your server needs to have DBI and at least one of the other modules installed."></p>
480
481MSG
482        }
483    }
484    my $got_one_data = 0;
485    my $dbi_is_okay = 0;
486    for my $ref (@$list) {
487        my($mod, $ver, $req, $desc) = @$ref;
488        if ('CODE' eq ref($desc)) {
489            $desc = $desc->();
490        }
491        print "<blockquote>\n" if $mod =~ m/^DBD::/;
492        print "    <h3>$mod" .
493            ($ver ? " (version &gt;= $ver)" : "") . "</h3>";
494        eval("use $mod" . ($ver ? " $ver;" : ";"));
495        if ($@) {
496            $is_good = 0 if $req;
497            my $msg = $ver ?
498                      trans_templ(qq{<p class="warning"><MT_TRANS phrase="Either your server does not have [_1] installed, the version that is installed is too old, or [_1] requires another module that is not installed." params="$mod"> }) :
499                      trans_templ(qq{<p class="warning"><MT_TRANS phrase="Your server does not have [_1] installed, or [_1] requires another module that is not installed." params="$mod"> });
500            $msg   .= $desc .
501                      trans_templ(qq{ <MT_TRANS phrase="Please consult the installation instructions for help in installing [_1]." params="$mod"></p>\n\n});
502            print $msg . "\n\n";
503        } else {
504            if ($data) {
505                $dbi_is_okay = 1 if $mod eq 'DBI';
506                if ($mod eq 'DBD::mysql') {
507                    if ($DBD::mysql::VERSION == 3.0000) {
508                        print trans_templ(qq{<p class="warning"><MT_TRANS phrase="The DBD::mysql version you have installed is known to be incompatible with Movable Type. Please install the current release available from CPAN."></p>});
509                    }
510                }
511                if (!$dbi_is_okay) {
512                    print trans_templ(qq{<p class="warning"><MT_TRANS phrase="The $mod is installed properly, but requires an updated DBI module. Please see note above regarding the DBI module requirements."></p>});
513                } else {
514                    $got_one_data = 1;
515                }
516            }
517            print trans_templ(qq{<p class="installed"><MT_TRANS phrase="Your server has [_1] installed (version [_2])." params="$mod%%} . $mod->VERSION . qq{"></p>\n\n});
518        }
519        print "</blockquote>\n" if $mod =~ m/^DBD::/;
520    }
521    $is_good &= $got_one_data if $data;
522    print "\n\t</div>\n\n";
523}
524
525if ($is_good && $cfg_exist) {
526    if (!$view) {
527    print trans_templ(<<HTML);
528   
529    <div class="msg msg-success">
530        <h2><MT_TRANS phrase="Movable Type System Check Successful"></h2>
531        <p><strong><MT_TRANS phrase="You're ready to go!"></strong> <MT_TRANS phrase="Your server has all of the required modules installed; you do not need to perform any additional module installations. Continue with the installation instructions."></p>
532    </div>
533
534</div>
535
536HTML
537    }
538}
539
540print "</body>\n\n</html>\n";
Note: See TracBrowser for help on using the browser.