Changeset 831
- Timestamp:
- 12/05/06 09:17:37 (2 years ago)
- Files:
-
- branches/wheeljack/lib/MT/App/CMS.pm (modified) (13 diffs)
- branches/wheeljack/lib/MT/BackupRestore.pm (modified) (4 diffs)
- branches/wheeljack/tmpl/cms/backup_end.tmpl (added)
- branches/wheeljack/tmpl/cms/backup_files.tmpl (deleted)
- branches/wheeljack/tmpl/cms/backup_start.tmpl (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/wheeljack/lib/MT/App/CMS.pm
r829 r831 148 148 'backup_restore' => \&backup_restore, 149 149 'backup' => \&backup, 150 'backup_download' => \&backup_download, 150 151 'restore' => \&restore, 151 152 'restore_upload_manifest' => \&restore_upload_manifest, … … 10819 10820 } 10820 10821 10822 sub _backup_finisher { 10823 my $app = shift; 10824 my ($fname, $param) = @_; 10825 $param->{filename} = $fname; 10826 $param->{backup_success} = 1; 10827 require MT::Session; 10828 my $sess = MT::Session->new; 10829 $sess->id($app->make_magic_token()); 10830 $sess->kind('BU'); # BU == Backup 10831 $sess->name($fname); 10832 $sess->start(time); 10833 $sess->save; 10834 $app->print($app->build_page('backup_end.tmpl', $param)); 10835 } 10836 10821 10837 sub backup { 10822 10838 my $app = shift; … … 10841 10857 my $archive = $q->param('backup_archive_format'); 10842 10858 my $enc = $app->config('PublishCharset') || 'utf-8'; 10843 my $file = '';10844 10859 my @ts = gmtime(time); 10845 10860 my $ts = sprintf "%04d-%02d-%02d-%02d-%02d-%02d", 10846 10861 $ts[5]+1900, $ts[4]+1, @ts[3,2,1,0]; 10847 $file .= "Movable_Type-$ts" . '-Backup';10862 my $file = "Movable_Type-$ts" . '-Backup'; 10848 10863 10849 10864 if ('1' eq $archive) { … … 10859 10874 } 10860 10875 10876 my $param = {}; 10877 $app->{no_print_body} = 1; 10878 $app->add_breadcrumb($app->translate('Backup & Restore'), $app->uri(mode => 'backup_restore')); 10879 $app->add_breadcrumb($app->translate('Backup')); 10880 $param->{system_overview_nav} = 1; 10881 $param->{nav_backup} = 1; 10882 10883 local $| = 1; 10884 my $charset = MT::ConfigMgr->instance->PublishCharset; 10885 $app->send_http_header('text/html' . 10886 ($charset ? "; charset=$charset" : '')); 10887 $app->print($app->build_page('backup_start.tmpl', $param)); 10888 require File::Temp; 10889 require File::Spec; 10890 my $temp_dir = $app->config('TempDir'); 10891 10861 10892 require MT::BackupRestore; 10862 10893 require MT::Asset; … … 10866 10897 my $finisher; 10867 10898 my $fh; 10899 my $fname; 10868 10900 my $arc_buf; 10869 10901 if (!($number || $num_assets)) { 10870 $app->{no_print_body} = 1;10871 10902 $splitter = sub {}; 10903 10872 10904 if ('0' eq $archive) { 10873 $app->set_header("Content-Disposition" => "attachment; filename=$file.xml"); 10874 $app->send_http_header($enc ? "text/xml; charset=$enc" 10875 : 'text/xml'); 10876 $printer = sub { $app->print(@_); }; 10877 $finisher = sub { my ($asset_files) = @_; 1; }; 10905 ($fh, my $filepath) = File::Temp::tempfile('xml.XXXXXXXX', DIR => $temp_dir); 10906 (my $vol, my $dir, $fname) = File::Spec->splitpath($filepath); 10907 $printer = sub { my ($data, $message) = @_; print $fh $data; $app->print($message); }; 10908 $finisher = sub { 10909 my ($asset_files) = @_; 10910 close $fh; 10911 $app->_backup_finisher($fname, $param); 10912 }; 10878 10913 } elsif ('1' eq $archive) { # tar.gz 10879 10914 require Archive::Tar; 10880 10915 require Compress::Zlib; 10881 $app->set_header("Content-Disposition" => "attachment; filename=$file.tar.gz"); 10882 $app->send_http_header('application/x-tar-gz'); 10883 $printer = sub { $arc_buf .= $_[0]; }; 10916 $printer = sub { my ($data, $message) = @_; $arc_buf .= $data; $app->print($message); }; 10884 10917 $finisher = sub { 10885 10918 my ($asset_files) = @_; 10919 ($fh, my $filepath) = File::Temp::tempfile('tar.XXXXXXXX', DIR => $temp_dir); 10920 (my $vol, my $dir, $fname) = File::Spec->splitpath($filepath); 10886 10921 my $arc = Archive::Tar->new; 10887 10922 $arc->add_data("$file.xml", $arc_buf); … … 10891 10926 require Compress::Zlib; 10892 10927 my $dest = Compress::Zlib::memGzip($arc->write); 10893 $app->print($dest); 10928 binmode $fh; 10929 print $fh $dest; 10930 close $fh; 10931 $app->_backup_finisher($fname, $param); 10894 10932 } 10895 10933 } elsif ('2' eq $archive) { # zip 10896 10934 require Archive::Zip; 10897 $app->set_header("Content-Disposition" => "attachment; filename=$file.zip"); 10898 $app->send_http_header('application/zip'); 10899 $printer = sub { $arc_buf .= $_[0]; }; 10935 $printer = sub { my ($data, $message) = @_; $arc_buf .= $data; $app->print($message); }; 10900 10936 $finisher = sub { 10901 10937 my ($asset_files) = @_; 10938 ($fh, my $filepath) = File::Temp::tempfile('zip.XXXXXXXX', DIR => $temp_dir); 10939 (my $vol, my $dir, $fname) = File::Spec->splitpath($filepath); 10902 10940 my $arc = Archive::Zip->new; 10903 10941 $arc->addString($arc_buf, "$file.xml"); … … 10905 10943 "<manifest xmlns='" . MT::BackupRestore::NS_MOVABLETYPE() . "'><file type='backup' name='$file.xml' /></manifest>", 10906 10944 "$file.manifest"); 10907 my $buf; 10908 require IO::String; 10909 my $ios = IO::String->new(\$buf); 10910 $arc->writeToFileHandle($ios); 10911 $app->print($buf); 10945 $arc->writeToFileHandle($fh); 10946 close $fh; 10947 $app->_backup_finisher($fname, $param); 10912 10948 }; 10913 10949 } … … 10919 10955 open $fh, ">$filename"; 10920 10956 push @files, { filename => $file . "-1.xml" }; 10921 $printer = sub { print $fh $_[0]; };10957 $printer = sub { my ($data, $message) = @_; print $fh $data; $app->print($message); }; 10922 10958 $splitter = sub { 10923 10959 my ($findex) = @_; … … 10956 10992 push @files, { filename => "$file.manifest" }; 10957 10993 if ('0' eq $archive) { 10958 my $param = {};10959 $app->add_breadcrumb($app->translate('Backup & Restore'), $app->uri(mode => 'backup_restore'));10960 $app->add_breadcrumb($app->translate('Backup'));10961 $param->{system_overview_nav} = 1;10962 $param->{nav_backup} = 1;10963 10994 $param->{files_loop} = \@files; 10964 $param->{tempdir} = $temp_dir; 10965 $app->build_page('backup_files.tmpl', $param); 10995 $app->_backup_finisher($fname, $param); 10966 10996 } elsif ('1' eq $archive) { # tar.gz 10967 10997 require Archive::Tar; … … 10978 11008 } 10979 11009 } 11010 my ($fh_arc, $filepath) = File::Temp::tempfile('tar.XXXXXXXX', DIR => $temp_dir); 11011 (my $vol, my $dir, $fname) = File::Spec->splitpath($filepath); 10980 11012 require Compress::Zlib; 10981 11013 my $dest = Compress::Zlib::memGzip($arc->write); 10982 $app->{no_print_body} = 1;10983 $app->set_header("Content-Disposition" => "attachment; filename=$file.tar.gz");10984 $app->send_http_header('application/x-tar-gz');10985 $app-> print($dest);11014 binmode $fh_arc; 11015 print $fh_arc $dest; 11016 close $fh_arc; 11017 $app->_backup_finisher($fname, $param); 10986 11018 } elsif ('2' eq $archive) { # zip 10987 11019 require Archive::Zip; 10988 11020 my $arc = Archive::Zip->new; 10989 $app->{no_print_body} = 1;10990 $app->set_header("Content-Disposition" => "attachment; filename=$file.zip");10991 $app->send_http_header('application/zip');10992 11021 for my $f (@files) { 10993 11022 if (defined $f->{path}) { … … 10998 11027 } 10999 11028 } 11000 my $buf; 11001 require IO::String; 11002 my $ios = IO::String->new(\$buf); 11003 $arc->writeToFileHandle($ios); 11004 for my $f (@files) { 11005 unlink File::Spec->catfile($temp_dir, $f->{filename}) if !defined($f->{path}); 11006 } 11007 $app->print($buf); 11029 my ($fh_arc, $filepath) = File::Temp::tempfile('zip.XXXXXXXX', DIR => $temp_dir); 11030 (my $vol, my $dir, $fname) = File::Spec->splitpath($filepath); 11031 $arc->writeToFileHandle($fh_arc); 11032 close $fh_arc; 11033 $app->_backup_finisher($fname, $param); 11008 11034 } 11009 11035 }; … … 11012 11038 MT::BackupRestore->backup( 11013 11039 \@blog_ids, $printer, $splitter, $finisher, $number, $enc); 11040 } 11041 11042 sub backup_download { 11043 my $app = shift; 11044 my $user = $app->user; 11045 return $app->errtrans("Permission denied.") if !$user->is_superuser; 11046 $app->validate_magic() or return; 11047 my $filename = $app->param('filename'); 11048 my $temp_dir = $app->config('TempDir'); 11049 require File::Spec; 11050 my $fname = File::Spec->catfile($temp_dir, $filename); 11051 11052 my $sess = MT::Session->load( { kind => 'BU', name => $filename } ); 11053 if (!defined($sess) || !$sess) { 11054 return $app->errtrans("Specified file was not found."); 11055 } 11056 my @ts = gmtime($sess->start); 11057 my $ts = sprintf "%04d-%02d-%02d-%02d-%02d-%02d", 11058 $ts[5]+1900, $ts[4]+1, @ts[3,2,1,0]; 11059 my $newfilename = "Movable_Type-$ts" . '-Backup'; 11060 $sess->remove; 11061 11062 $app->{no_print_body} = 1; 11063 my $contenttype; 11064 if ($filename =~ m/^xml\..+$/i) { 11065 my $enc = $app->config('PublishCharset') || 'utf-8'; 11066 $contenttype = "text/xml; charset=$enc"; 11067 $newfilename .= '.xml'; 11068 } elsif ($filename =~ m/^tar\..+$/i) { 11069 $contenttype = 'application/x-tar-gz'; 11070 $newfilename .= '.tar.gz'; 11071 } elsif ($filename =~ m/^zip\..+$/i) { 11072 $contenttype = 'application/zip'; 11073 $newfilename .= '.zip'; 11074 } else { 11075 $app->send_http_header('application/octet-stream'); 11076 } 11077 11078 $app->set_header("Content-Disposition" => "attachment; filename=$newfilename"); 11079 $app->send_http_header($contenttype); 11080 11081 open my $fh, "<$fname"; 11082 my $data; 11083 while (read $fh, my($chunk), 8192) { 11084 $data .= $chunk; 11085 } 11086 close $fh; 11087 $app->print($data); 11088 unlink $fname; 11014 11089 } 11015 11090 … … 11073 11148 } else { 11074 11149 my $temp_dir = $app->config('TempDir'); 11075 require File::Temp; ;11150 require File::Temp; 11076 11151 my $tmp = File::Temp::tempdir($uploaded_filename . 'XXXX', DIR => $temp_dir, CLEANUP => 1); 11077 11152 my $buffer; branches/wheeljack/lib/MT/BackupRestore.pm
r823 r831 72 72 my $header .= "<movabletype xmlns='" . NS_MOVABLETYPE . "'>\n"; 73 73 $header = "<?xml version='1.0' encoding='$enc'?>\n$header" if $enc !~ m/utf-?8/i; 74 $printer->($header );74 $printer->($header, q()); 75 75 76 76 my $files = {}; … … 79 79 80 80 my $else_xml = MT->run_callbacks('Backup.else'); 81 $printer->($else_xml ) if $else_xml ne '1';82 83 $printer->('</movabletype>' );81 $printer->($else_xml, q()) if $else_xml ne '1'; 82 83 $printer->('</movabletype>', q()); 84 84 $finisher->($files); 85 85 } … … 99 99 my $err = $@; 100 100 if ($err) { 101 $printer->("$err\n" );101 $printer->("$err\n", "$err\n"); 102 102 next; 103 103 } … … 117 117 $splitter->(int($counter / $number + 1)); 118 118 } 119 $printer->($object->to_xml(undef, $args) . "\n") if $object->to_backup; 119 $printer->($object->to_xml(undef, $args) . "\n", 120 MT->translate('[_1]#[_2] has been backup.', $class, $object->id) . "\n") 121 if $object->to_backup; 120 122 if ($class eq 'MT::Author') { 121 123 # MT::Author may be duplicated because of how terms and args are created.
