OSDN Git Service

ソフト404等のレスポンスエラーコード対応
[fswiki/fswiki.git] / plugin / admin / AdminLogHandler.pm
1 ###############################################################################
2 #
3 # ¥í¥°¥Õ¥¡¥¤¥ë¤ò´ÉÍý¤¹¤ë¥â¥¸¥å¡¼¥ë
4 #
5 ###############################################################################
6 package plugin::admin::AdminLogHandler;
7 use strict;
8 use HTTP::Status;
9 #==============================================================================
10 # ¥³¥ó¥¹¥È¥é¥¯¥¿
11 #==============================================================================
12 sub new {
13         my $class = shift;
14         my $self = {};
15         return bless $self,$class;
16 }
17
18 #==============================================================================
19 # ¥¢¥¯¥·¥ç¥ó¥Ï¥ó¥É¥é¥á¥½¥Ã¥É
20 #==============================================================================
21 sub do_action {
22         my $self  = shift;
23         my $wiki  = shift;
24         my $cgi   = $wiki->get_CGI;
25         my $login = $wiki->get_login_info();
26         
27         if($cgi->param("delete")){
28                 return $self->delete_log($wiki);
29                 
30         } elsif($cgi->param("download")){
31                 $self->download_log($wiki);
32                 
33         } elsif($cgi->param("deletecache")){
34                 return $self->delete_cache($wiki);
35                 
36         } else {
37                 return $self->log_info($wiki);
38         }
39 }
40
41 #==============================================================================
42 # ¥í¥°¥Õ¥¡¥¤¥ë¤Î¾ðÊó¤òɽ¼¨
43 #==============================================================================
44 sub log_info {
45         my $self = shift;
46         my $wiki = shift;
47         my $buf  = "";
48         
49         $wiki->set_title("¥í¥°¥Õ¥¡¥¤¥ë¤Î´ÉÍý");
50         
51         $buf .= $self->make_log_form($wiki,"¥¢¥¯¥»¥¹¥í¥°","access");
52         $buf .= $self->make_log_form($wiki,"źÉÕ¥Õ¥¡¥¤¥ë¤Î¥í¥°","attach");
53         $buf .= $self->make_log_form($wiki,"źÉÕ¥Õ¥¡¥¤¥ë¥À¥¦¥ó¥í¡¼¥É¿ô¤Î¥í¥°","download");
54         $buf .= "<p>¢¨¤³¤Î¥í¥°¥Õ¥¡¥¤¥ë¤òºï½ü¤¹¤ë¤ÈźÉÕ¥Õ¥¡¥¤¥ë¤Î¥À¥¦¥ó¥í¡¼¥É¿ô¤¬¥¯¥ê¥¢¤µ¤ì¤Þ¤¹¡£</p>\n";
55         $buf .= $self->make_log_form($wiki,"¥Ú¡¼¥¸Åà·ë¤Î¥í¥°","freeze");
56         $buf .= "<p>¢¨¤³¤Î¥í¥°¥Õ¥¡¥¤¥ë¤òºï½ü¤¹¤ë¤ÈÁ´¤Æ¤Î¥Ú¡¼¥¸Åà·ë¤¬²ò½ü¤µ¤ì¤Þ¤¹¡£</p>\n";
57         
58         # ¥­¥ã¥Ã¥·¥å¥Õ¥¡¥¤¥ë¤Î¾ðÊó
59         $buf .= "<h2>¥­¥ã¥Ã¥·¥å¥Õ¥¡¥¤¥ë</h2>\n";
60         my @cachefiles = ();
61         if($wiki->config("log_dir") ne ""){
62                 opendir(DIR,$wiki->config("log_dir")) or die $wiki->config("log_dir")."¤Î¥ª¡¼¥×¥ó¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£";
63                 while(my $entry = readdir(DIR)){
64                         if($entry =~ /\.cache$/){
65                                 push(@cachefiles,$entry);
66                         }
67                 }
68                 closedir(DIR);
69         }
70         
71         if($#cachefiles==-1){
72                 $buf .= "<p>¥­¥ã¥Ã¥·¥å¥Õ¥¡¥¤¥ë¤Ï¤¢¤ê¤Þ¤»¤ó¡£</p>\n";
73         } else {
74                 $buf .= "<ul>\n";
75                 @cachefiles = sort(@cachefiles);
76                 foreach(@cachefiles){
77                         my @status = stat($wiki->config("log_dir")."/".$_);
78                         my $size = @status[7] / 1024;
79                         $size = ($size==int($size) ? $size : int($size + 1));
80                         
81                         $buf .= "<li>".&Util::escapeHTML($_)."(".$size."KB)</li>\n";
82                 }
83                 $buf .= "</ul>\n";
84                 $buf .= "<form action=\"\" method=\"POST\">\n".
85                         "  <input type=\"submit\" name=\"deletecache\" value=\"¥­¥ã¥Ã¥·¥å¤òºï½ü\">\n".
86                         "  <input type=\"hidden\" name=\"action\" value=\"ADMINLOG\">\n".
87                         "</form>\n";
88         }
89         
90         return $buf;
91 }
92
93 #==============================================================================
94 # ¥í¥°¥Õ¥¡¥¤¥ë¤Î¾ðÊóɽ¼¨¤ÈÁàºî¤ò¹Ô¤¦¥Õ¥©¡¼¥à¤ò½ÐÎϤ¹¤ë´Ø¿ô
95 #==============================================================================
96 sub make_log_form {
97         my $self   = shift;
98         my $wiki   = shift;
99         my $name   = shift;
100         my $target = shift;
101         my $file   = $self->get_filename_from_target($wiki,$target);
102         
103         my $buf .= "<h2>".&Util::escapeHTML($name)."</h2>\n";
104         
105         if(-e $wiki->config('log_dir')."/$file"){
106                 my @status = stat($wiki->config('log_dir')."/$file");
107                 my $size = @status[7] / 1024;
108                 # À°¿ô¤ËÀÚ¤ê¾å¤²
109                 $size = ($size==int($size) ? $size : int($size + 1));
110                 $buf .= "<p>".&Util::escapeHTML($file)."(".$size."KB)</p>\n".
111                         "<form action=\"".$wiki->create_url()."\" method=\"POST\">\n".
112                         "  <input type=\"submit\" name=\"download\" value=\"¥À¥¦¥ó¥í¡¼¥É\">\n".
113                         "  <input type=\"submit\" name=\"delete\" value=\"¥Õ¥¡¥¤¥ëºï½ü\">\n".
114                         "  <input type=\"hidden\" name=\"target\" value=\"$target\">\n".
115                         "  <input type=\"hidden\" name=\"action\" value=\"ADMINLOG\">\n".
116                         "</form>\n";
117         } else {
118                 $buf .= "<p>¥í¥°¥Õ¥¡¥¤¥ë¤Ï¤¢¤ê¤Þ¤»¤ó¡£</p>\n";
119         }
120         
121         return $buf;
122 }
123
124 #==============================================================================
125 # ¥í¥°¥Õ¥¡¥¤¥ë¤òºï½ü
126 #==============================================================================
127 sub delete_log {
128         my $self = shift;
129         my $wiki = shift;
130         my $target = $wiki->get_CGI->param("target");
131         my $file   = $self->get_filename_from_target($wiki,$target);
132         
133         if($file eq ""){
134                 return $wiki->error(RC_BAD_REQUEST, "¥Ñ¥é¥á¡¼¥¿¤¬ÉÔÀµ¤Ç¤¹¡£");
135         }
136         
137         unlink($wiki->config('log_dir')."/$file") or die $file."¤Îºï½ü¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£";
138         
139         return $wiki->redirectURL( $wiki->create_url({ action=>"ADMINLOG"}) );
140         
141         #$wiki->set_title("¥í¥°¥Õ¥¡¥¤¥ë¤Î´ÉÍý");
142         #return "<p>¥í¥°¥Õ¥¡¥¤¥ë¤òºï½ü¤·¤Þ¤·¤¿¡£</p>\n".
143         #       "<p>[<a href=\"".$wiki->config('script_name')."?action=ADMINLOG\">Ìá¤ë</a>]</p>\n";
144 }
145
146 #==============================================================================
147 # ¥í¥°¥Õ¥¡¥¤¥ë¤ò¥À¥¦¥ó¥í¡¼¥É
148 #==============================================================================
149 sub download_log {
150         my $self = shift;
151         my $wiki = shift;
152         my $target = $wiki->get_CGI->param("target");
153         my $file   = $self->get_filename_from_target($wiki,$target);
154         
155         if($file eq ""){
156                 return $wiki->error(RC_BAD_REQUEST, "¥Ñ¥é¥á¡¼¥¿¤¬ÉÔÀµ¤Ç¤¹¡£");
157         }
158         
159         print "Content-Type: text/plain\n";
160         print "Content-Disposition: inline;filename=\"".&Jcode::convert($file,"sjis")."\"\n\n";
161         open(LOG,$wiki->config('log_dir')."/$file") or die $file."¤Î¥ª¡¼¥×¥ó¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£";
162         binmode(LOG);
163         while(<LOG>){ print $_; }
164         close(LOG);
165         
166         exit();
167 }
168
169 #==============================================================================
170 # ¥í¥°¥Õ¥¡¥¤¥ë¤Î¥Õ¥¡¥¤¥ë̾¤ò¼èÆÀ¤¹¤ë´Ø¿ô
171 #==============================================================================
172 sub get_filename_from_target {
173         my $self   = shift;
174         my $wiki   = shift;
175         my $target = shift;
176         if($target eq "access"){
177                 return $wiki->config('access_log_file');
178         } elsif($target eq "attach"){
179                 return $wiki->config('attach_log_file');
180         } elsif($target eq "freeze"){
181                 return $wiki->config('freeze_file');
182         } elsif($target eq "download"){
183                 return $wiki->config('download_count_file');
184         } else {
185                 return "";
186         }
187 }
188
189 #==============================================================================
190 # ¥­¥ã¥Ã¥·¥å¥Õ¥¡¥¤¥ë¤òºï½ü
191 #==============================================================================
192 sub delete_cache {
193         my $self = shift;
194         my $wiki = shift;
195         
196         unlink glob($wiki->config("log_dir")."/*.cache") or die "¥­¥ã¥Ã¥·¥å¥Õ¥¡¥¤¥ë¤Îºï½ü¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£";
197         
198         return $wiki->redirectURL( $wiki->create_url({ action=>"ADMINLOG"}) );
199         
200         #$wiki->set_title("¥í¥°¥Õ¥¡¥¤¥ë¤Î´ÉÍý");
201         #return "<p>¥­¥ã¥Ã¥·¥å¥Õ¥¡¥¤¥ë¤òºï½ü¤·¤Þ¤·¤¿¡£</p>\n".
202         #       "<p>[<a href=\"".$wiki->config('script_name')."?action=ADMINLOG\">Ìá¤ë</a>]</p>\n";
203 }
204
205 1;