Handle hostnames with upper-case letters
[webmin.git] / webminlog / view.cgi
1 #!/usr/local/bin/perl
2 # view.cgi
3 # Show details of the action, including changed files
4
5 use strict;
6 use warnings;
7 require './webminlog-lib.pl';
8 our (%text, %in);
9 &ReadParse();
10
11 # find the log record to view
12 my $act = &get_action($in{'id'});
13 &can_user($act->{'user'}) || &error($text{'view_ecannot'});
14 &can_mod($act->{'module'}) || &error($text{'view_ecannot'});
15
16 # display info about the action
17 &ui_print_header(undef, $text{'view_title'}, "");
18
19 my @files = &list_files($act);
20 print &ui_form_start("rollback.cgi");
21 print &ui_hidden("id", $in{'id'});
22 print &ui_hidden("search", $in{'search'});
23
24 print &ui_hidden_table_start(&text('view_header', $act->{'id'}),
25                              "width=100%", 4, "main", 1);
26
27 # This "" is needed to make the label show properly!
28 print &ui_table_row($text{'view_action'}."",
29                     &get_action_description($act, 1), 3);
30
31 my %minfo = $act->{'module'} eq 'global' ?
32                 ( 'desc' => $text{'search_global'} ) :
33                 &get_module_info($act->{'module'});
34 print &ui_table_row($text{'view_module'},
35                     $minfo{'desc'});
36
37 if ($act->{'module'} ne 'global') {
38         print &ui_table_row($text{'view_script'},
39                             "<tt>$act->{'module'}/$act->{'script'}</tt>");
40         }
41 else {
42         print &ui_table_row($text{'view_script'}, "<tt>$act->{'script'}</tt>");
43         }
44
45 print &ui_table_row($text{'view_user'},
46                     $act->{'user'});
47
48 print &ui_table_row($text{'view_ip'},
49                     $act->{'ip'});
50
51 if ($act->{'sid'} ne '-') {
52         print &ui_table_row($text{'view_sid'},
53                 "<a href='search.cgi?sid=$act->{'sid'}&uall=1&mall=1&tall=1&fall=1&return=".&urlize($in{'return'})."&returndesc=".&urlize($in{'returndesc'})."'>$act->{'sid'}</a>");
54         }
55
56 print &ui_table_row($text{'view_time'}, &make_date($act->{'time'}));
57
58 if ($act->{'webmin'}) {
59         print &ui_table_row($text{'view_host'},
60                             $act->{'webmin'});
61         }
62 print &ui_hidden_table_end("main");
63
64 # Annotations for this log entry
65 my $text = &get_annotation($act);
66 print &ui_hidden_table_start($text{'view_anno'}, "width=100%", 1, "anno",
67                              $text ? 1 : 0);
68 print &ui_table_row(undef,
69         &ui_textarea("anno", $text, 10, 80, "auto", 0,
70                      "style='width:100%'")."<br>".
71         &ui_submit($text{'save'}, "annosave"));
72 print &ui_hidden_table_end("anno");
73
74 # Page output, if any
75 my $output = &get_action_output($act);
76 if ($output && &foreign_check("mailboxes")) {
77         &foreign_require("mailboxes");
78         $output = &mailboxes::filter_javascript($output);
79         $output = &mailboxes::safe_urls($output);
80         $output = &mailboxes::disable_html_images($output, 1);
81         print &ui_hidden_table_start($text{'view_output'}, "width=100%", 1,
82                                      "output", 0);
83         print &ui_table_row(undef, $output, 2);
84         print &ui_hidden_table_end("output");
85         }
86
87 # Raw log data, hidden by default
88 print &ui_hidden_table_start($text{'view_raw'}, "width=100%", 1, "raw", 0);
89 my @tds = ( "width=20% ");
90 my $rtable = &ui_columns_start(
91         [ $text{'view_rawname'}, $text{'view_rawvalue'} ], 100, 0, \@tds);
92 foreach my $k (keys %$act) {
93         next if ($k eq 'param');
94         $rtable .= &ui_columns_row([
95                 "<b>".&html_escape($k)."</b>",
96                 &html_escape($act->{$k}) ], \@tds);
97         }
98 foreach my $k (keys %{$act->{'param'}}) {
99         $rtable .= &ui_columns_row([
100                 &html_escape($k),
101                 &html_escape(join("\n", split(/\0/, $act->{'param'}->{$k}))) ],
102                 \@tds);
103         }
104 $rtable .= &ui_columns_end();
105 print &ui_table_row(undef, $rtable, 2);
106 print &ui_hidden_table_end("raw");
107
108 # display modified and commands run files
109 my $rbcount = 0;
110 my $i = 0;
111 my $fhtml = "";
112 my $anydiffs = 0;
113 foreach my $d (&list_diffs($act)) {
114         my $t = $text{"view_type_".$d->{'type'}};
115         my $rb;
116         if ($d->{'type'} eq 'create' || $d->{'type'} eq 'modify' ||
117             $d->{'type'} eq 'delete') {
118                 ($rb) = grep { $_->{'file'} eq $d->{'object'} } @files;
119                 }
120         my $cbox = @files ?
121                 &ui_checkbox("r", $d->{'object'}, "", $rb, undef, !$rb) : undef;
122         $rbcount++ if ($rb);
123         if ($t =~ /\$2/ || !$d->{'diff'}) {
124                 # Diff is just a single line message
125                 $fhtml .= &ui_hidden_table_start($cbox.
126                       &text("view_type_".$d->{'type'},
127                             "<tt>$d->{'object'}</tt>",
128                             "<tt>".&html_escape($d->{'diff'})."</tt>"),
129                       "width=100%", 2, "diff$i", 1);
130                 }
131         else {
132                 # Show multi-line diff
133                 $fhtml .= &ui_hidden_table_start(
134                         $cbox.&text("view_type_".$d->{'type'},
135                                     "<tt>$d->{'object'}</tt>"),
136                         "width=100%", 2, "diff$i", 1);
137                 $fhtml .= &ui_table_row(undef,
138                         "<pre>".&html_escape($d->{'diff'})."</pre>", 2);
139                 if ($d->{'input'}) {
140                         # And input too
141                         $fhtml .= &ui_table_row(undef,
142                                 "<b>".&text('view_input')."</b><br>".
143                                 "<pre>".&html_escape($d->{'input'})."</pre>",2);
144                         }
145                 }
146         $fhtml .= &ui_hidden_table_end("diff$i");
147         $i++;
148         $anydiffs++;
149         }
150 if ($rbcount) {
151         $fhtml .= &ui_links_row([ &select_all_link("r"),
152                                   &select_invert_link("r") ]);
153         }
154 print &ui_hidden_table_start($text{'view_files'}, "width=100%", 1, "files", 0);
155 $fhtml .= "<b>$text{'view_nofiles'}</b><p>\n" if (!$anydiffs);
156 print &ui_table_row(undef, $fhtml, 2);
157 print &ui_hidden_table_end("raw");
158
159 # Show rollback button
160 if (@files && $rbcount) {
161         print &ui_form_end([ [ "rollback", $text{'view_rollback2'} ] ]);
162         }
163 else {
164         print &ui_form_end();
165         }
166
167 &ui_print_footer("search.cgi?$in{'search'}", $text{'search_return'},
168                  "", $text{'index_return'});
169
170