/[BackupPC]/upstream/2.1.0/lib/BackupPC/CGI/RestoreFile.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /upstream/2.1.0/lib/BackupPC/CGI/RestoreFile.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (show annotations)
Wed Jun 22 19:12:04 2005 UTC (18 years, 10 months ago) by dpavlin
File size: 5927 byte(s)
import of version 2.1.0

1 #============================================================= -*-perl-*-
2 #
3 # BackupPC::CGI::RestoreFile package
4 #
5 # DESCRIPTION
6 #
7 # This module implements the RestoreFile action for the CGI interface.
8 #
9 # AUTHOR
10 # Craig Barratt <cbarratt@users.sourceforge.net>
11 #
12 # COPYRIGHT
13 # Copyright (C) 2003 Craig Barratt
14 #
15 # This program is free software; you can redistribute it and/or modify
16 # it under the terms of the GNU General Public License as published by
17 # the Free Software Foundation; either version 2 of the License, or
18 # (at your option) any later version.
19 #
20 # This program is distributed in the hope that it will be useful,
21 # but WITHOUT ANY WARRANTY; without even the implied warranty of
22 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 # GNU General Public License for more details.
24 #
25 # You should have received a copy of the GNU General Public License
26 # along with this program; if not, write to the Free Software
27 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28 #
29 #========================================================================
30 #
31 # Version 2.1.0, released 20 Jun 2004.
32 #
33 # See http://backuppc.sourceforge.net.
34 #
35 #========================================================================
36
37 package BackupPC::CGI::RestoreFile;
38
39 use strict;
40 use BackupPC::CGI::Lib qw(:all);
41 use BackupPC::FileZIO;
42 use BackupPC::Attrib qw(:all);
43 use BackupPC::View;
44
45 sub action
46 {
47 restoreFile($In{host}, $In{num}, $In{share}, $In{dir});
48 }
49
50 sub restoreFile
51 {
52 my($host, $num, $share, $dir, $skipHardLink, $origName) = @_;
53 my($Privileged) = CheckPermission($host);
54
55 #
56 # Some common content (media) types from www.iana.org (via MIME::Types).
57 #
58 my $Ext2ContentType = {
59 'asc' => 'text/plain',
60 'avi' => 'video/x-msvideo',
61 'bmp' => 'image/bmp',
62 'book' => 'application/x-maker',
63 'cc' => 'text/plain',
64 'cpp' => 'text/plain',
65 'csh' => 'application/x-csh',
66 'csv' => 'text/comma-separated-values',
67 'c' => 'text/plain',
68 'deb' => 'application/x-debian-package',
69 'doc' => 'application/msword',
70 'dot' => 'application/msword',
71 'dtd' => 'text/xml',
72 'dvi' => 'application/x-dvi',
73 'eps' => 'application/postscript',
74 'fb' => 'application/x-maker',
75 'fbdoc'=> 'application/x-maker',
76 'fm' => 'application/x-maker',
77 'frame'=> 'application/x-maker',
78 'frm' => 'application/x-maker',
79 'gif' => 'image/gif',
80 'gtar' => 'application/x-gtar',
81 'gz' => 'application/x-gzip',
82 'hh' => 'text/plain',
83 'hpp' => 'text/plain',
84 'h' => 'text/plain',
85 'html' => 'text/html',
86 'htmlx'=> 'text/html',
87 'htm' => 'text/html',
88 'iges' => 'model/iges',
89 'igs' => 'model/iges',
90 'jpeg' => 'image/jpeg',
91 'jpe' => 'image/jpeg',
92 'jpg' => 'image/jpeg',
93 'js' => 'application/x-javascript',
94 'latex'=> 'application/x-latex',
95 'maker'=> 'application/x-maker',
96 'mid' => 'audio/midi',
97 'midi' => 'audio/midi',
98 'movie'=> 'video/x-sgi-movie',
99 'mov' => 'video/quicktime',
100 'mp2' => 'audio/mpeg',
101 'mp3' => 'audio/mpeg',
102 'mpeg' => 'video/mpeg',
103 'mpg' => 'video/mpeg',
104 'mpp' => 'application/vnd.ms-project',
105 'pdf' => 'application/pdf',
106 'pgp' => 'application/pgp-signature',
107 'php' => 'application/x-httpd-php',
108 'pht' => 'application/x-httpd-php',
109 'phtml'=> 'application/x-httpd-php',
110 'png' => 'image/png',
111 'ppm' => 'image/x-portable-pixmap',
112 'ppt' => 'application/powerpoint',
113 'ppt' => 'application/vnd.ms-powerpoint',
114 'ps' => 'application/postscript',
115 'qt' => 'video/quicktime',
116 'rgb' => 'image/x-rgb',
117 'rtf' => 'application/rtf',
118 'rtf' => 'text/rtf',
119 'shar' => 'application/x-shar',
120 'shtml'=> 'text/html',
121 'swf' => 'application/x-shockwave-flash',
122 'tex' => 'application/x-tex',
123 'texi' => 'application/x-texinfo',
124 'texinfo'=> 'application/x-texinfo',
125 'tgz' => 'application/x-gtar',
126 'tiff' => 'image/tiff',
127 'tif' => 'image/tiff',
128 'txt' => 'text/plain',
129 'vcf' => 'text/x-vCard',
130 'vrml' => 'model/vrml',
131 'wav' => 'audio/x-wav',
132 'wmls' => 'text/vnd.wap.wmlscript',
133 'wml' => 'text/vnd.wap.wml',
134 'wrl' => 'model/vrml',
135 'xls' => 'application/vnd.ms-excel',
136 'xml' => 'text/xml',
137 'xwd' => 'image/x-xwindowdump',
138 'z' => 'application/x-compress',
139 'zip' => 'application/zip',
140 %{$Conf{CgiExt2ContentType}}, # add site-specific values
141 };
142 if ( !$Privileged ) {
143 ErrorExit(eval("qq{$Lang->{Only_privileged_users_can_restore_backup_files2}}"));
144 }
145 ServerConnect();
146 ErrorExit($Lang->{Empty_host_name}) if ( $host eq "" );
147
148 $dir = "/" if ( $dir eq "" );
149 my @Backups = $bpc->BackupInfoRead($host);
150 my $view = BackupPC::View->new($bpc, $host, \@Backups);
151 my $a = $view->fileAttrib($num, $share, $dir);
152 if ( $dir =~ m{(^|/)\.\.(/|$)} || !defined($a) ) {
153 ErrorExit("Can't restore bad file ${EscHTML($dir)}");
154 }
155 my $f = BackupPC::FileZIO->open($a->{fullPath}, 0, $a->{compress});
156 my $data;
157 if ( !$skipHardLink && $a->{type} == BPC_FTYPE_HARDLINK ) {
158 #
159 # hardlinks should look like the file they point to
160 #
161 my $linkName;
162 while ( $f->read(\$data, 65536) > 0 ) {
163 $linkName .= $data;
164 }
165 $f->close;
166 $linkName =~ s/^\.\///;
167 my $share = $1 if ( $dir =~ /^\/?(.*?)\// );
168 restoreFile($host, $num, $share, $linkName, 1, $dir);
169 return;
170 }
171 $bpc->ServerMesg("log User $User recovered file $host/$num:$share/$dir ($a->{fullPath})");
172 $dir = $origName if ( defined($origName) );
173 my $ext = $1 if ( $dir =~ /\.([^\/\.]+)$/ );
174 my $contentType = $Ext2ContentType->{lc($ext)}
175 || "application/octet-stream";
176 my $fileName = $1 if ( $dir =~ /.*\/(.*)/ );
177 $fileName =~ s/"/\\"/g;
178 print "Content-Type: $contentType\n";
179 print "Content-Transfer-Encoding: binary\n";
180 print "Content-Disposition: attachment; filename=\"$fileName\"\n\n";
181 while ( $f->read(\$data, 1024 * 1024) > 0 ) {
182 print STDOUT $data;
183 }
184 $f->close;
185 }
186
187 1;

  ViewVC Help
Powered by ViewVC 1.1.26