lilalo
diff l3-frontend @ 50:ff4ab09fd3f1
 öåëÿõ ïðîâåðêè TortoiseCVS äîáàâëåíà îäíà ñòðîêà â òåêñò l3-agent
author | devi |
---|---|
date | Tue Dec 06 23:54:06 2005 +0200 (2005-12-06) |
parents | 568bab7090fc |
children | f9447da96f15 |
line diff
1.1 --- a/l3-frontend Sat Nov 26 16:15:52 2005 +0200 1.2 +++ b/l3-frontend Tue Dec 06 23:54:06 2005 +0200 1.3 @@ -21,7 +21,7 @@ 1.4 # ^^^ 1.5 1.6 our %Stat; 1.7 -our %CommandsFDistribution; # Сколько раз в журнале встречается какая команда 1.8 +our %CommandsFDistribution; # Сколько раз в журнале встречается какая команда 1.9 1.10 sub search_buy; 1.11 sub make_comment; 1.12 @@ -38,163 +38,163 @@ 1.13 1.14 sub main 1.15 { 1.16 - $| = 1; 1.17 + $| = 1; 1.18 1.19 - init_variables(); 1.20 - init_config(); 1.21 + init_variables(); 1.22 + init_config(); 1.23 1.24 - open_mywi_socket(); 1.25 - load_command_lines_from_xml($Config{"backend_datafile"}); 1.26 - load_sessions_from_xml($Config{"backend_datafile"}); 1.27 - sort_command_lines; 1.28 - process_command_lines; 1.29 - print_command_lines($Config{"output"}); 1.30 - close_mywi_socket; 1.31 + open_mywi_socket(); 1.32 + load_command_lines_from_xml($Config{"backend_datafile"}); 1.33 + load_sessions_from_xml($Config{"backend_datafile"}); 1.34 + sort_command_lines; 1.35 + process_command_lines; 1.36 + print_command_lines($Config{"output"}); 1.37 + close_mywi_socket; 1.38 } 1.39 1.40 1.41 sub search_by 1.42 { 1.43 - my $sm = shift; 1.44 - my $topic = shift; 1.45 - $topic =~ s/ /+/; 1.46 - 1.47 - return "<a href='". $Search_Machines{$sm}->{"query"}."$topic'><img width='16' height='16' src='". 1.48 - $Search_Machines{$sm}->{"icon"}."' border='0'/></a>"; 1.49 + my $sm = shift; 1.50 + my $topic = shift; 1.51 + $topic =~ s/ /+/; 1.52 + 1.53 + return "<a href='". $Search_Machines{$sm}->{"query"}."$topic'><img width='16' height='16' src='". 1.54 + $Search_Machines{$sm}->{"icon"}."' border='0'/></a>"; 1.55 } 1.56 1.57 sub extract_from_cline 1.58 # Разобрать командную строку $_[1] и возвратить хэш, содержащий 1.59 # номер первого появление команды в строке: 1.60 -# команда => первая позиция 1.61 +# команда => первая позиция 1.62 { 1.63 - my $what = $_[0]; 1.64 - my $cline = $_[1]; 1.65 - my @lists = split /\;/, $cline; 1.66 - 1.67 - 1.68 - my @commands = (); 1.69 - for my $list (@lists) { 1.70 - push @commands, split /\|/, $list; 1.71 - } 1.72 + my $what = $_[0]; 1.73 + my $cline = $_[1]; 1.74 + my @lists = split /\;/, $cline; 1.75 + 1.76 + 1.77 + my @commands = (); 1.78 + for my $list (@lists) { 1.79 + push @commands, split /\|/, $list; 1.80 + } 1.81 1.82 - my %commands; 1.83 - my %args; 1.84 - my $i=0; 1.85 - for my $command (@commands) { 1.86 - $command =~ s@^\s*\S+/@@; 1.87 - $command =~ /\s*(\S+)\s*(.*)/; 1.88 - if ($1 && $1 eq "sudo" ) { 1.89 - $commands{"$1"}=$i++; 1.90 - $command =~ s/\s*sudo\s+//; 1.91 - } 1.92 - $command =~ s@^\s*\S+/@@; 1.93 - $command =~ /\s*(\S+)\s*(.*)/; 1.94 - if ($1 && !defined $commands{"$1"}) { 1.95 - $commands{"$1"}=$i++; 1.96 - }; 1.97 - if ($2) { 1.98 - my $args = $2; 1.99 - my @args = split (/\s+/, $args); 1.100 - for my $a (@args) { 1.101 - $args{"$a"}=$i++ 1.102 - if !defined $args{"$a"}; 1.103 - }; 1.104 + my %commands; 1.105 + my %args; 1.106 + my $i=0; 1.107 + for my $command (@commands) { 1.108 + $command =~ s@^\s*\S+/@@; 1.109 + $command =~ /\s*(\S+)\s*(.*)/; 1.110 + if ($1 && $1 eq "sudo" ) { 1.111 + $commands{"$1"}=$i++; 1.112 + $command =~ s/\s*sudo\s+//; 1.113 + } 1.114 + $command =~ s@^\s*\S+/@@; 1.115 + $command =~ /\s*(\S+)\s*(.*)/; 1.116 + if ($1 && !defined $commands{"$1"}) { 1.117 + $commands{"$1"}=$i++; 1.118 + }; 1.119 + if ($2) { 1.120 + my $args = $2; 1.121 + my @args = split (/\s+/, $args); 1.122 + for my $a (@args) { 1.123 + $args{"$a"}=$i++ 1.124 + if !defined $args{"$a"}; 1.125 + }; 1.126 1.127 - 1.128 - } 1.129 - } 1.130 + 1.131 + } 1.132 + } 1.133 1.134 - if ($what eq "commands") { 1.135 - return \%commands; 1.136 - } else { 1.137 - return \%args; 1.138 - } 1.139 - 1.140 + if ($what eq "commands") { 1.141 + return \%commands; 1.142 + } else { 1.143 + return \%args; 1.144 + } 1.145 + 1.146 } 1.147 1.148 sub open_mywi_socket 1.149 { 1.150 - $Mywi_Socket = IO::Socket::INET->new( 1.151 - PeerAddr => $Config{mywi_server}, 1.152 - PeerPort => $Config{mywi_port}, 1.153 - Proto => "tcp", 1.154 - Type => SOCK_STREAM); 1.155 + $Mywi_Socket = IO::Socket::INET->new( 1.156 + PeerAddr => $Config{mywi_server}, 1.157 + PeerPort => $Config{mywi_port}, 1.158 + Proto => "tcp", 1.159 + Type => SOCK_STREAM); 1.160 } 1.161 1.162 sub close_mywi_socket 1.163 { 1.164 - close ($Mywi_Socket); 1.165 + close ($Mywi_Socket); 1.166 } 1.167 1.168 1.169 sub mywi_client 1.170 { 1.171 - my $query = $_[0]; 1.172 - my $mywi; 1.173 + my $query = $_[0]; 1.174 + my $mywi; 1.175 1.176 - open_mywi_socket; 1.177 - if ($Mywi_Socket) { 1.178 - local $| = 1; 1.179 - local $/ = ""; 1.180 - print $Mywi_Socket $query."\n"; 1.181 - $mywi = <$Mywi_Socket>; 1.182 - $mywi = "" if $mywi =~ /nothing app/; 1.183 - } 1.184 - close_mywi_socket; 1.185 - return $mywi; 1.186 + open_mywi_socket; 1.187 + if ($Mywi_Socket) { 1.188 + local $| = 1; 1.189 + local $/ = ""; 1.190 + print $Mywi_Socket $query."\n"; 1.191 + $mywi = <$Mywi_Socket>; 1.192 + $mywi = "" if $mywi =~ /nothing app/; 1.193 + } 1.194 + close_mywi_socket; 1.195 + return $mywi; 1.196 } 1.197 1.198 sub make_comment 1.199 { 1.200 - my $cline = $_[0]; 1.201 - #my $files = $_[1]; 1.202 + my $cline = $_[0]; 1.203 + #my $files = $_[1]; 1.204 1.205 - my @comments=(); 1.206 - my @commands = keys %{extract_from_cline("commands", $cline)}; 1.207 - my @args = keys %{extract_from_cline("args", $cline)}; 1.208 - return if (!@commands && !@args); 1.209 - #return "commands=".join(" ",@commands)."; files=".join(" ",@files); 1.210 + my @comments=(); 1.211 + my @commands = keys %{extract_from_cline("commands", $cline)}; 1.212 + my @args = keys %{extract_from_cline("args", $cline)}; 1.213 + return if (!@commands && !@args); 1.214 + #return "commands=".join(" ",@commands)."; files=".join(" ",@files); 1.215 1.216 - # Commands 1.217 - for my $command (@commands) { 1.218 - $command =~ s/'//g; 1.219 - $CommandsFDistribution{$command}++; 1.220 - if (!$Commands_Description{$command}) { 1.221 - my $mywi=""; 1.222 - $mywi = mywi_client ($command); 1.223 - $mywi = join ("\n", grep(/\([18]\)/, split(/\n/, $mywi))); 1.224 - $mywi =~ s/\s+/ /; 1.225 - if ($mywi !~ /^\s*$/) { 1.226 - $Commands_Description{$command} = $mywi; 1.227 - } 1.228 - else { 1.229 - next; 1.230 - } 1.231 - } 1.232 + # Commands 1.233 + for my $command (@commands) { 1.234 + $command =~ s/'//g; 1.235 + $CommandsFDistribution{$command}++; 1.236 + if (!$Commands_Description{$command}) { 1.237 + my $mywi=""; 1.238 + $mywi = mywi_client ($command); 1.239 + $mywi = join ("\n", grep(/\([18]\)/, split(/\n/, $mywi))); 1.240 + $mywi =~ s/\s+/ /; 1.241 + if ($mywi !~ /^\s*$/) { 1.242 + $Commands_Description{$command} = $mywi; 1.243 + } 1.244 + else { 1.245 + next; 1.246 + } 1.247 + } 1.248 1.249 - push @comments, $Commands_Description{$command}; 1.250 - } 1.251 - return join(" \n", @comments); 1.252 - 1.253 - # Files 1.254 - for my $arg (@args) { 1.255 - $arg =~ s/'//g; 1.256 - if (!$Args_Description{$arg}) { 1.257 - my $mywi; 1.258 - $mywi = mywi_client ($arg); 1.259 - $mywi = join ("\n", grep(/\([5]\)/, split(/\n/, $mywi))); 1.260 - $mywi =~ s/\s+/ /; 1.261 - if ($mywi !~ /^\s*$/) { 1.262 - $Args_Description{$arg} = $mywi; 1.263 - } 1.264 - else { 1.265 - next; 1.266 - } 1.267 - } 1.268 + push @comments, $Commands_Description{$command}; 1.269 + } 1.270 + return join(" \n", @comments); 1.271 + 1.272 + # Files 1.273 + for my $arg (@args) { 1.274 + $arg =~ s/'//g; 1.275 + if (!$Args_Description{$arg}) { 1.276 + my $mywi; 1.277 + $mywi = mywi_client ($arg); 1.278 + $mywi = join ("\n", grep(/\([5]\)/, split(/\n/, $mywi))); 1.279 + $mywi =~ s/\s+/ /; 1.280 + if ($mywi !~ /^\s*$/) { 1.281 + $Args_Description{$arg} = $mywi; 1.282 + } 1.283 + else { 1.284 + next; 1.285 + } 1.286 + } 1.287 1.288 - push @comments, $Args_Description{$arg}; 1.289 - } 1.290 + push @comments, $Args_Description{$arg}; 1.291 + } 1.292 1.293 } 1.294 1.295 @@ -209,157 +209,157 @@ 1.296 =cut 1.297 sub load_command_lines_from_xml 1.298 { 1.299 - my $datafile = $_[0]; 1.300 + my $datafile = $_[0]; 1.301 1.302 - open (CLASS, $datafile) 1.303 - or die "Can't open file of the class ",$datafile,"\n"; 1.304 - local $/; 1.305 - $data = <CLASS>; 1.306 - close(CLASS); 1.307 + open (CLASS, $datafile) 1.308 + or die "Can't open file of the class ",$datafile,"\n"; 1.309 + local $/; 1.310 + $data = <CLASS>; 1.311 + close(CLASS); 1.312 1.313 - for $command ($data =~ m@<command>(.*?)</command>@sg) { 1.314 - my %cl; 1.315 - while ($command =~ m@<([^>]*?)>(.*?)</\1>@sg) { 1.316 - $cl{$1} = $2; 1.317 - } 1.318 - push @Command_Lines, \%cl; 1.319 - } 1.320 + for $command ($data =~ m@<command>(.*?)</command>@sg) { 1.321 + my %cl; 1.322 + while ($command =~ m@<([^>]*?)>(.*?)</\1>@sg) { 1.323 + $cl{$1} = $2; 1.324 + } 1.325 + push @Command_Lines, \%cl; 1.326 + } 1.327 } 1.328 1.329 sub load_sessions_from_xml 1.330 { 1.331 - my $datafile = $_[0]; 1.332 + my $datafile = $_[0]; 1.333 1.334 - open (CLASS, $datafile) 1.335 - or die "Can't open file of the class ",$datafile,"\n"; 1.336 - local $/; 1.337 - my $data = <CLASS>; 1.338 - close(CLASS); 1.339 + open (CLASS, $datafile) 1.340 + or die "Can't open file of the class ",$datafile,"\n"; 1.341 + local $/; 1.342 + my $data = <CLASS>; 1.343 + close(CLASS); 1.344 1.345 - for my $session ($data =~ m@<session>(.*?)</session>@sg) { 1.346 - my %session; 1.347 - while ($session =~ m@<([^>]*?)>(.*?)</\1>@sg) { 1.348 - $session{$1} = $2; 1.349 - } 1.350 - $Sessions{$session{local_session_id}} = \%session; 1.351 - } 1.352 + for my $session ($data =~ m@<session>(.*?)</session>@sg) { 1.353 + my %session; 1.354 + while ($session =~ m@<([^>]*?)>(.*?)</\1>@sg) { 1.355 + $session{$1} = $2; 1.356 + } 1.357 + $Sessions{$session{local_session_id}} = \%session; 1.358 + } 1.359 } 1.360 1.361 1.362 1.363 sub sort_command_lines 1.364 { 1.365 - # Sort Command_Lines 1.366 - # Write Command_Lines to Command_Lines_Index 1.367 + # Sort Command_Lines 1.368 + # Write Command_Lines to Command_Lines_Index 1.369 1.370 - my @index; 1.371 - for (my $i=0;$i<=$#Command_Lines;$i++) { 1.372 - $index[$i]=$i; 1.373 - } 1.374 + my @index; 1.375 + for (my $i=0;$i<=$#Command_Lines;$i++) { 1.376 + $index[$i]=$i; 1.377 + } 1.378 1.379 - @Command_Lines_Index = sort { 1.380 - $Command_Lines[$index[$a]]->{"time"} <=> $Command_Lines[$index[$b]]->{"time"} 1.381 - } @index; 1.382 + @Command_Lines_Index = sort { 1.383 + $Command_Lines[$index[$a]]->{"time"} <=> $Command_Lines[$index[$b]]->{"time"} 1.384 + } @index; 1.385 1.386 } 1.387 1.388 sub process_command_lines 1.389 { 1.390 - for my $i (@Command_Lines_Index) { 1.391 + for my $i (@Command_Lines_Index) { 1.392 1.393 - my $cl = \$Command_Lines[$i]; 1.394 - #@{${$cl}->{"new_commands"}} =(); 1.395 - #@{${$cl}->{"new_files"}} =(); 1.396 - $$cl->{"class"} = ""; 1.397 + my $cl = \$Command_Lines[$i]; 1.398 + #@{${$cl}->{"new_commands"}} =(); 1.399 + #@{${$cl}->{"new_files"}} =(); 1.400 + $$cl->{"class"} = ""; 1.401 1.402 - if ($$cl->{"err"}) { 1.403 - $$cl->{"class"}="wrong"; 1.404 - $$cl->{"class"}="interrupted" 1.405 - if ($$cl->{"err"} eq 130); 1.406 - } 1.407 - if (!$$cl->{"euid"}) { 1.408 - $$cl->{"class"}.="_root"; 1.409 - } 1.410 - 1.411 -#tab# my @tab_words=split /\s+/, $$cl->{"output"}; 1.412 -#tab# my $last_word= $$cl->{"cline"} =~ /(\S*)$/; 1.413 -#tab# $last_word =~ s@.*/@@; 1.414 -#tab# my $this_is_tab=1; 1.415 + if ($$cl->{"err"}) { 1.416 + $$cl->{"class"}="wrong"; 1.417 + $$cl->{"class"}="interrupted" 1.418 + if ($$cl->{"err"} eq 130); 1.419 + } 1.420 + if (!$$cl->{"euid"}) { 1.421 + $$cl->{"class"}.="_root"; 1.422 + } 1.423 + 1.424 +#tab# my @tab_words=split /\s+/, $$cl->{"output"}; 1.425 +#tab# my $last_word= $$cl->{"cline"} =~ /(\S*)$/; 1.426 +#tab# $last_word =~ s@.*/@@; 1.427 +#tab# my $this_is_tab=1; 1.428 #tab# 1.429 -#tab# if ($last_word && @tab_words >2) { 1.430 -#tab# for my $tab_words (@tab_words) { 1.431 -#tab# if ($tab_words !~ /^$last_word/) { 1.432 -#tab# $this_is_tab=0; 1.433 -#tab# last; 1.434 -#tab# } 1.435 -#tab# } 1.436 -#tab# } 1.437 -#tab# $$cl->{"class"}="tab" if $this_is_tab; 1.438 - 1.439 +#tab# if ($last_word && @tab_words >2) { 1.440 +#tab# for my $tab_words (@tab_words) { 1.441 +#tab# if ($tab_words !~ /^$last_word/) { 1.442 +#tab# $this_is_tab=0; 1.443 +#tab# last; 1.444 +#tab# } 1.445 +#tab# } 1.446 +#tab# } 1.447 +#tab# $$cl->{"class"}="tab" if $this_is_tab; 1.448 + 1.449 1.450 -# if ( !$$cl->{"err"}) { 1.451 -# # Command does not contain mistakes 1.452 -# 1.453 -# my %commands = extract_from_cline("commands", ${$cl}->{"cline"}); 1.454 -# my %files = extract_from_cline("files", ${$cl}->{"cline"}); 1.455 +# if ( !$$cl->{"err"}) { 1.456 +# # Command does not contain mistakes 1.457 +# 1.458 +# my %commands = extract_from_cline("commands", ${$cl}->{"cline"}); 1.459 +# my %files = extract_from_cline("files", ${$cl}->{"cline"}); 1.460 # 1.461 -# # Searching for new commands only 1.462 -# for my $command (keys %commands) { 1.463 -# if (!defined $Commands_Stat{$command}) { 1.464 -# push @{$$cl->{new_commands}}, $command; 1.465 -# } 1.466 -# $Commands_Stat{$command}++; 1.467 -# } 1.468 -# 1.469 -# for my $file (keys %files) { 1.470 -# if (!defined $Files_Stat{$file}) { 1.471 -# push @{$$cl->{new_files}}, $file; 1.472 -# } 1.473 -# $Files_Stat{$file}++; 1.474 -# } 1.475 -# } 1.476 +# # Searching for new commands only 1.477 +# for my $command (keys %commands) { 1.478 +# if (!defined $Commands_Stat{$command}) { 1.479 +# push @{$$cl->{new_commands}}, $command; 1.480 +# } 1.481 +# $Commands_Stat{$command}++; 1.482 +# } 1.483 +# 1.484 +# for my $file (keys %files) { 1.485 +# if (!defined $Files_Stat{$file}) { 1.486 +# push @{$$cl->{new_files}}, $file; 1.487 +# } 1.488 +# $Files_Stat{$file}++; 1.489 +# } 1.490 +# } 1.491 1.492 - if ($$cl->{cline}=~ m@cat[^#]*#([\^=v])\s*(.*)@) { 1.493 - if ($1 eq "=") { 1.494 - $$cl->{"class"} = "note"; 1.495 - $$cl->{"note"} = $$cl->{"output"}; 1.496 - $$cl->{"note_title"} = $2; 1.497 - } 1.498 - else { 1.499 - my $j = $i; 1.500 - if ($1 eq "^") { 1.501 - $j--; 1.502 - $j-- while ($j >=0 && (!$Command_Lines[$j] || $Command_Lines[$j]->{tty} ne $$cl->{tty})); 1.503 - } 1.504 - elsif ($1 eq "v") { 1.505 - $j++; 1.506 - $j++ while ($j <= @Command_Lines && (!$Command_Lines[$j] || $Command_Lines[$j]->{tty} ne $$cl->{tty})); 1.507 - } 1.508 - $Command_Lines[$j]->{note_title}="$2"; 1.509 - $Command_Lines[$j]->{note}=$$cl->{output}; 1.510 - $$cl=0; 1.511 - } 1.512 - } 1.513 - elsif ($$cl->{cline}=~ /#([\^=v])(.*)/) { 1.514 - if ($1 eq "=") { 1.515 - $$cl->{"class"} = "note"; 1.516 - $$cl->{"note"} = $2; 1.517 - } 1.518 - else { 1.519 - my $j=$i; 1.520 - if ($1 eq "^") { 1.521 - $j--; 1.522 - $j-- while ($j >=0 && (!$Command_Lines[$j] || $Command_Lines[$j]->{tty} ne $$cl->{tty})); 1.523 - } 1.524 - elsif ($1 eq "v") { 1.525 - $j++; 1.526 - $j++ while ($j <= @Command_Lines && $Command_Lines[$j]->{tty} ne $$cl->{tty} || !$Command_Lines[$j]); 1.527 - } 1.528 - $Command_Lines[$j]->{note}.="$2\n"; 1.529 - $$cl=0; 1.530 - } 1.531 - } 1.532 - } 1.533 + if ($$cl->{cline}=~ m@cat[^#]*#([\^=v])\s*(.*)@) { 1.534 + if ($1 eq "=") { 1.535 + $$cl->{"class"} = "note"; 1.536 + $$cl->{"note"} = $$cl->{"output"}; 1.537 + $$cl->{"note_title"} = $2; 1.538 + } 1.539 + else { 1.540 + my $j = $i; 1.541 + if ($1 eq "^") { 1.542 + $j--; 1.543 + $j-- while ($j >=0 && (!$Command_Lines[$j] || $Command_Lines[$j]->{tty} ne $$cl->{tty})); 1.544 + } 1.545 + elsif ($1 eq "v") { 1.546 + $j++; 1.547 + $j++ while ($j <= @Command_Lines && (!$Command_Lines[$j] || $Command_Lines[$j]->{tty} ne $$cl->{tty})); 1.548 + } 1.549 + $Command_Lines[$j]->{note_title}="$2"; 1.550 + $Command_Lines[$j]->{note}=$$cl->{output}; 1.551 + $$cl=0; 1.552 + } 1.553 + } 1.554 + elsif ($$cl->{cline}=~ /#([\^=v])(.*)/) { 1.555 + if ($1 eq "=") { 1.556 + $$cl->{"class"} = "note"; 1.557 + $$cl->{"note"} = $2; 1.558 + } 1.559 + else { 1.560 + my $j=$i; 1.561 + if ($1 eq "^") { 1.562 + $j--; 1.563 + $j-- while ($j >=0 && (!$Command_Lines[$j] || $Command_Lines[$j]->{tty} ne $$cl->{tty})); 1.564 + } 1.565 + elsif ($1 eq "v") { 1.566 + $j++; 1.567 + $j++ while ($j <= @Command_Lines && $Command_Lines[$j]->{tty} ne $$cl->{tty} || !$Command_Lines[$j]); 1.568 + } 1.569 + $Command_Lines[$j]->{note}.="$2\n"; 1.570 + $$cl=0; 1.571 + } 1.572 + } 1.573 + } 1.574 1.575 } 1.576 1.577 @@ -373,447 +373,447 @@ 1.578 1.579 sub print_command_lines 1.580 { 1.581 - my $output_filename=$_[0]; 1.582 + my $output_filename=$_[0]; 1.583 1.584 - my $course_name = $Config{"course-name"}; 1.585 - my $course_code = $Config{"course-code"}; 1.586 - my $course_date = $Config{"course-date"}; 1.587 - my $course_center = $Config{"course-center"}; 1.588 - my $course_trainer = $Config{"course-trainer"}; 1.589 - my $course_student = $Config{"course-student"}; 1.590 - 1.591 + my $course_name = $Config{"course-name"}; 1.592 + my $course_code = $Config{"course-code"}; 1.593 + my $course_date = $Config{"course-date"}; 1.594 + my $course_center = $Config{"course-center"}; 1.595 + my $course_trainer = $Config{"course-trainer"}; 1.596 + my $course_student = $Config{"course-student"}; 1.597 + 1.598 1.599 - # Результат выполнения процедуры равен 1.600 - # join("", @Result{header,body,stat,help,about,footer}) 1.601 - my %Result; 1.602 - my @toc; # Хранит оглавление 1.603 - my $note_number=0; 1.604 + # Результат выполнения процедуры равен 1.605 + # join("", @Result{header,body,stat,help,about,footer}) 1.606 + my %Result; 1.607 + my @toc; # Хранит оглавление 1.608 + my $note_number=0; 1.609 1.610 - $Result{"body"} = "<table width='100%'>\n"; 1.611 - 1.612 - my $cl; 1.613 - my $last_tty=""; 1.614 - my $last_day=""; 1.615 - my $in_range=0; 1.616 + $Result{"body"} = "<table width='100%'>\n"; 1.617 + 1.618 + my $cl; 1.619 + my $last_tty=""; 1.620 + my $last_day=""; 1.621 + my $in_range=0; 1.622 1.623 - my $current_command=0; 1.624 + my $current_command=0; 1.625 1.626 COMMAND_LINE: 1.627 - for my $k (@Command_Lines_Index) { 1.628 + for my $k (@Command_Lines_Index) { 1.629 1.630 - my $cl=$Command_Lines[$Command_Lines_Index[$current_command++]]; 1.631 - 1.632 - next unless $cl; 1.633 + my $cl=$Command_Lines[$Command_Lines_Index[$current_command++]]; 1.634 + 1.635 + next unless $cl; 1.636 1.637 1.638 - if ($Config{filter}) { 1.639 - # Инициализация фильтра 1.640 - my %filter; 1.641 - for (split /&/,$Config{filter}) { 1.642 - my ($var, $val) = split /=/; 1.643 - $filter{$var} = $val || ""; 1.644 - } 1.645 + if ($Config{filter}) { 1.646 + # Инициализация фильтра 1.647 + my %filter; 1.648 + for (split /&/,$Config{filter}) { 1.649 + my ($var, $val) = split /=/; 1.650 + $filter{$var} = $val || ""; 1.651 + } 1.652 1.653 - for my $filter_key (keys %filter) { 1.654 - next COMMAND_LINE unless ( 1.655 - not defined($cl->{local_session_id}) 1.656 - || not defined($Sessions{$cl->{local_session_id}}->{$filter_key}) 1.657 - || $Sessions{$cl->{local_session_id}}->{$filter_key} eq $filter{$filter_key}); 1.658 - } 1.659 + for my $filter_key (keys %filter) { 1.660 + next COMMAND_LINE unless ( 1.661 + not defined($cl->{local_session_id}) 1.662 + || not defined($Sessions{$cl->{local_session_id}}->{$filter_key}) 1.663 + || $Sessions{$cl->{local_session_id}}->{$filter_key} eq $filter{$filter_key}); 1.664 + } 1.665 1.666 - #if ($filter{user}) { 1.667 - # next COMMAND_LINE unless $Sessions{$cl->{local_session_id}}->{user} eq $filter{user}; 1.668 - #} 1.669 + #if ($filter{user}) { 1.670 + # next COMMAND_LINE unless $Sessions{$cl->{local_session_id}}->{user} eq $filter{user}; 1.671 + #} 1.672 1.673 - #for my $filter_field (keys %filter) { 1.674 - # next COMMAND_LINE unless $Sessions{$cl->{local_session_id}}->{$filter_field} eq $filter{$filter_field}; 1.675 - #} 1.676 - } 1.677 + #for my $filter_field (keys %filter) { 1.678 + # next COMMAND_LINE unless $Sessions{$cl->{local_session_id}}->{$filter_field} eq $filter{$filter_field}; 1.679 + #} 1.680 + } 1.681 1.682 - if ($Config{"from"} && $cl->{"cline"} =~ /$Config{"signature"}\s*$Config{"from"}/) { 1.683 - $in_range=1; 1.684 - next; 1.685 - } 1.686 - if ($Config{"to"} && $cl->{"cline"} =~ /$Config{"signature"}\s*$Config{"to"}/) { 1.687 - $in_range=0; 1.688 - next; 1.689 - } 1.690 - next if ($Config{"from"} && $Config{"to"} && !$in_range) 1.691 - || 1.692 - ($Config{"skip_empty"} =~ /^y/i && $cl->{"cline"} =~ /^\s*$/ ) 1.693 - || 1.694 - ($Config{"skip_wrong"} =~ /^y/i && $cl->{"err"} != 0) 1.695 - || 1.696 - ($Config{"skip_interrupted"} =~ /^y/i && $cl->{"err"} == 130); 1.697 - 1.698 - #my @new_commands=@{$cl->{"new_commands"}}; 1.699 - #my @new_files=@{$cl->{"new_files"}}; 1.700 + if ($Config{"from"} && $cl->{"cline"} =~ /$Config{"signature"}\s*$Config{"from"}/) { 1.701 + $in_range=1; 1.702 + next; 1.703 + } 1.704 + if ($Config{"to"} && $cl->{"cline"} =~ /$Config{"signature"}\s*$Config{"to"}/) { 1.705 + $in_range=0; 1.706 + next; 1.707 + } 1.708 + next if ($Config{"from"} && $Config{"to"} && !$in_range) 1.709 + || 1.710 + ($Config{"skip_empty"} =~ /^y/i && $cl->{"cline"} =~ /^\s*$/ ) 1.711 + || 1.712 + ($Config{"skip_wrong"} =~ /^y/i && $cl->{"err"} != 0) 1.713 + || 1.714 + ($Config{"skip_interrupted"} =~ /^y/i && $cl->{"err"} == 130); 1.715 + 1.716 + #my @new_commands=@{$cl->{"new_commands"}}; 1.717 + #my @new_files=@{$cl->{"new_files"}}; 1.718 1.719 - if ($cl->{class} eq "note") { 1.720 - my $note = $cl->{note}; 1.721 - $note = join ("\n", map ("<p>$_</p>", split (/-\n/, $note))); 1.722 - $note =~ s@(http:[a-zA-Z.0-9/?%-]*)@<a href='$1'>$1</a>@g; 1.723 - $note =~ s@(www\.[a-zA-Z.0-9/?%-]*)@<a href='$1'>$1</a>@g; 1.724 - $Result{"body"} .= "<tr><td colspan='6'>"; 1.725 - $Result{"body"} .= "<h4 id='note$note_number'>".$cl->{note_title}."</h4>" if $cl->{note_title}; 1.726 - $Result{"body"} .= "".$note."<p/><p/></td></td>"; 1.727 + if ($cl->{class} eq "note") { 1.728 + my $note = $cl->{note}; 1.729 + $note = join ("\n", map ("<p>$_</p>", split (/-\n/, $note))); 1.730 + $note =~ s@(http:[a-zA-Z.0-9/?%-]*)@<a href='$1'>$1</a>@g; 1.731 + $note =~ s@(www\.[a-zA-Z.0-9/?%-]*)@<a href='$1'>$1</a>@g; 1.732 + $Result{"body"} .= "<tr><td colspan='6'>"; 1.733 + $Result{"body"} .= "<h4 id='note$note_number'>".$cl->{note_title}."</h4>" if $cl->{note_title}; 1.734 + $Result{"body"} .= "".$note."<p/><p/></td></td>"; 1.735 1.736 - if ($cl->{note_title}) { 1.737 - push @{$toc[@toc]},"<a href='#note$note_number'>".$cl->{note_title}."</a>"; 1.738 - $note_number++; 1.739 - } 1.740 - next; 1.741 - } 1.742 + if ($cl->{note_title}) { 1.743 + push @{$toc[@toc]},"<a href='#note$note_number'>".$cl->{note_title}."</a>"; 1.744 + $note_number++; 1.745 + } 1.746 + next; 1.747 + } 1.748 1.749 - my $cl_class="cline"; 1.750 - my $out_class="output"; 1.751 - if ($cl->{"class"}) { 1.752 - $cl_class = $cl->{"class"}."_".$cl_class; 1.753 - $out_class = $cl->{"class"}."_".$out_class; 1.754 - } 1.755 + my $cl_class="cline"; 1.756 + my $out_class="output"; 1.757 + if ($cl->{"class"}) { 1.758 + $cl_class = $cl->{"class"}."_".$cl_class; 1.759 + $out_class = $cl->{"class"}."_".$out_class; 1.760 + } 1.761 1.762 - my @new_commands; 1.763 - my @new_files; 1.764 - @new_commands = split (/\s+/, $cl->{"new_commands"}) if defined $cl->{"new_commands"}; 1.765 - @new_files = split (/\s+/, $cl->{"new_files"}) if defined $cl->{"new_files"}; 1.766 + my @new_commands; 1.767 + my @new_files; 1.768 + @new_commands = split (/\s+/, $cl->{"new_commands"}) if defined $cl->{"new_commands"}; 1.769 + @new_files = split (/\s+/, $cl->{"new_files"}) if defined $cl->{"new_files"}; 1.770 1.771 - my $output=""; 1.772 - if ($Config{"head_lines"} || $Config{"tail_lines"}) { 1.773 - # Partialy output 1.774 - my @lines = split '\n', $cl->{"output"}; 1.775 - # head 1.776 - my $mark=1; 1.777 - for (my $i=0; $i<= $#lines && $i < $Config{"head_lines"}; $i++) { 1.778 - $output .= $lines[$i]."\n"; 1.779 - } 1.780 - # tail 1.781 - my $start=$#lines-$Config{"tail_lines"}+1; 1.782 - if ($start < 0) { 1.783 - $start=0; 1.784 - $mark=0; 1.785 - } 1.786 - if ($start < $Config{"head_lines"}) { 1.787 - $start=$Config{"head_lines"}; 1.788 - $mark=0; 1.789 - } 1.790 - $output .= $Config{"skip_text"}."\n" if $mark; 1.791 - for ($i=$start; $i<= $#lines; $i++) { 1.792 - $output .= $lines[$i]."\n"; 1.793 - } 1.794 - } 1.795 - else { 1.796 - # Full output 1.797 - $output .= $cl->{"output"}; 1.798 - } 1.799 - #$output .= "^C\n" if ($cl->{"err"} eq "130"); 1.800 + my $output=""; 1.801 + if ($Config{"head_lines"} || $Config{"tail_lines"}) { 1.802 + # Partialy output 1.803 + my @lines = split '\n', $cl->{"output"}; 1.804 + # head 1.805 + my $mark=1; 1.806 + for (my $i=0; $i<= $#lines && $i < $Config{"head_lines"}; $i++) { 1.807 + $output .= $lines[$i]."\n"; 1.808 + } 1.809 + # tail 1.810 + my $start=$#lines-$Config{"tail_lines"}+1; 1.811 + if ($start < 0) { 1.812 + $start=0; 1.813 + $mark=0; 1.814 + } 1.815 + if ($start < $Config{"head_lines"}) { 1.816 + $start=$Config{"head_lines"}; 1.817 + $mark=0; 1.818 + } 1.819 + $output .= $Config{"skip_text"}."\n" if $mark; 1.820 + for ($i=$start; $i<= $#lines; $i++) { 1.821 + $output .= $lines[$i]."\n"; 1.822 + } 1.823 + } 1.824 + else { 1.825 + # Full output 1.826 + $output .= $cl->{"output"}; 1.827 + } 1.828 + #$output .= "^C\n" if ($cl->{"err"} eq "130"); 1.829 1.830 - # 1.831 - ## 1.832 - ## Начинается собственно вывод 1.833 - ## 1.834 - # 1.835 + # 1.836 + ## 1.837 + ## Начинается собственно вывод 1.838 + ## 1.839 + # 1.840 1.841 - # <command> 1.842 + # <command> 1.843 1.844 - my ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime($cl->{time}); 1.845 - next if $Stat{LastCommand} == $cl->{time}; 1.846 - $Stat{FirstCommand} = $cl->{time} unless $Stat{FirstCommand}; 1.847 - $Stat{LastCommand} = 0 unless defined $Stat{LastCommand}; 1.848 - $Stat{TotalTime} += $cl->{time} - $Stat{LastCommand} 1.849 - if $cl->{time} - $Stat{LastCommand} < $Config{stat_inactivity_interval}; 1.850 - $Stat{LastCommand} = $cl->{time}; 1.851 - $Stat{TotalCommands} = 0 unless $Stat{TotalCommands}; 1.852 - $Stat{TotalCommands}++; 1.853 + my ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime($cl->{time}); 1.854 + next if $Stat{LastCommand} == $cl->{time}; 1.855 + $Stat{FirstCommand} = $cl->{time} unless $Stat{FirstCommand}; 1.856 + $Stat{LastCommand} = 0 unless defined $Stat{LastCommand}; 1.857 + $Stat{TotalTime} += $cl->{time} - $Stat{LastCommand} 1.858 + if $cl->{time} - $Stat{LastCommand} < $Config{stat_inactivity_interval}; 1.859 + $Stat{LastCommand} = $cl->{time}; 1.860 + $Stat{TotalCommands} = 0 unless $Stat{TotalCommands}; 1.861 + $Stat{TotalCommands}++; 1.862 1.863 - # Добавляем спереди 0 для удобочитаемости 1.864 - $min = "0".$min if $min =~ /^.$/; 1.865 - $hour = "0".$hour if $hour =~ /^.$/; 1.866 - $sec = "0".$sec if $sec =~ /^.$/; 1.867 + # Добавляем спереди 0 для удобочитаемости 1.868 + $min = "0".$min if $min =~ /^.$/; 1.869 + $hour = "0".$hour if $hour =~ /^.$/; 1.870 + $sec = "0".$sec if $sec =~ /^.$/; 1.871 1.872 - $class=$cl->{"out_class"}; 1.873 - $class =~ s/output$//; 1.874 + $class=$cl->{"out_class"}; 1.875 + $class =~ s/output$//; 1.876 1.877 - $Stat{ErrorCommands}++ 1.878 - if $class =~ /wrong/; 1.879 - 1.880 - $Result{"body"} .= "<tr class='command'>\n"; 1.881 - 1.882 - 1.883 - # DAY CHANGE 1.884 - if ( $last_day ne $day) { 1.885 - #$Result{"body"} .= "<td colspan='6'><p></p><h3>День ",$day,"</h4></td></tr><tr>"; 1.886 - $Result{"body"} .= "<td colspan='6'><p></p><h3 id='day$day'>".$Day_Name[$wday]."</h4></td></tr><tr>"; 1.887 - push @toc, "<a href='#day$day'>".$Day_Name[$wday]."</a>\n"; 1.888 - $last_day=$day; 1.889 - } 1.890 + $Stat{ErrorCommands}++ 1.891 + if $class =~ /wrong/; 1.892 + 1.893 + $Result{"body"} .= "<tr class='command'>\n"; 1.894 + 1.895 + 1.896 + # DAY CHANGE 1.897 + if ( $last_day ne $day) { 1.898 + #$Result{"body"} .= "<td colspan='6'><p></p><h3>День ",$day,"</h4></td></tr><tr>"; 1.899 + $Result{"body"} .= "<td colspan='6'><p></p><h3 id='day$day'>".$Day_Name[$wday]."</h4></td></tr><tr>"; 1.900 + push @toc, "<a href='#day$day'>".$Day_Name[$wday]."</a>\n"; 1.901 + $last_day=$day; 1.902 + } 1.903 1.904 - # CONSOLE CHANGE 1.905 - if ( $last_tty ne $cl->{"tty"}) { 1.906 - my $host; 1.907 - #$host = $Sessions{$cl->{local_session_id}}->{user}."@".$Sessions{$cl->{local_session_id}}->{hostname}; 1.908 - my $body = $cl->{"tty"}; 1.909 - $body .= " \@$host" if $host; 1.910 - $Result{"body"} .= "<td colspan='6'><table><tr><td class='ttychange' width='140' align='center'>".$body."</td></tr></table></td></tr><tr>"; 1.911 - $last_tty=$cl->{"tty"}; 1.912 - } 1.913 + # CONSOLE CHANGE 1.914 + if ( $last_tty ne $cl->{"tty"}) { 1.915 + my $host; 1.916 + #$host = $Sessions{$cl->{local_session_id}}->{user}."@".$Sessions{$cl->{local_session_id}}->{hostname}; 1.917 + my $body = $cl->{"tty"}; 1.918 + $body .= " \@$host" if $host; 1.919 + $Result{"body"} .= "<td colspan='6'><table><tr><td class='ttychange' width='140' align='center'>".$body."</td></tr></table></td></tr><tr>"; 1.920 + $last_tty=$cl->{"tty"}; 1.921 + } 1.922 1.923 - # TIME 1.924 - if ($Config{"show_time"} =~ /^y/i) { 1.925 - $Result{"body"} .= "<td valign='top' class='time' width='$Config{time_width}'><pre>". 1.926 - $hour. ":". $min. ":". $sec. 1.927 - "</td>"; 1.928 - } else { 1.929 - $Result{"body"} .= "<td width='0'/>" 1.930 - } 1.931 + # TIME 1.932 + if ($Config{"show_time"} =~ /^y/i) { 1.933 + $Result{"body"} .= "<td valign='top' class='time' width='$Config{time_width}'><pre>". 1.934 + $hour. ":". $min. ":". $sec. 1.935 + "</td>"; 1.936 + } else { 1.937 + $Result{"body"} .= "<td width='0'/>" 1.938 + } 1.939 1.940 - # COMMAND 1.941 - $Result{"body"} .= "<td class='script'>\n"; 1.942 - $Result{"body"} .= "<pre class='${class}cline'>\n"; 1.943 - my $cline = $cl->{"prompt"}.$cl->{"cline"}; 1.944 - $cline =~ s/\n//; 1.945 + # COMMAND 1.946 + $Result{"body"} .= "<td class='script'>\n"; 1.947 + $Result{"body"} .= "<pre class='${class}cline'>\n"; 1.948 + my $cline = $cl->{"prompt"}.$cl->{"cline"}; 1.949 + $cline =~ s/\n//; 1.950 1.951 - #$cline .= "(".$Sessions{$cl->{local_session_id}}.")"; 1.952 - 1.953 - my $hint = make_comment($cl->{"cline"}); 1.954 - $cline = "<div title='$hint'>$cline</div>" if $hint; 1.955 - $Result{"body"} .= $cline; 1.956 - $Result{"body"} .= "</pre>\n"; 1.957 + #$cline .= "(".$Sessions{$cl->{local_session_id}}.")"; 1.958 + 1.959 + my $hint = make_comment($cl->{"cline"}); 1.960 + $cline = "<div title='$hint'>$cline</div>" if $hint; 1.961 + $Result{"body"} .= $cline; 1.962 + $Result{"body"} .= "</pre>\n"; 1.963 1.964 - my $last_command = $cl->{"last_command"}; 1.965 - if (!( 1.966 - $Config{"suppress_editors"} =~ /^y/i && grep ($_ eq $last_command, @{$Config{"editors"}}) || 1.967 - $Config{"suppress_pagers"} =~ /^y/i && grep ($_ eq $last_command, @{$Config{"pagers"}}) || 1.968 - $Config{"suppress_terminal"}=~ /^y/i && grep ($_ eq $last_command, @{$Config{"terminal"}}) 1.969 - )) { 1.970 + my $last_command = $cl->{"last_command"}; 1.971 + if (!( 1.972 + $Config{"suppress_editors"} =~ /^y/i && grep ($_ eq $last_command, @{$Config{"editors"}}) || 1.973 + $Config{"suppress_pagers"} =~ /^y/i && grep ($_ eq $last_command, @{$Config{"pagers"}}) || 1.974 + $Config{"suppress_terminal"}=~ /^y/i && grep ($_ eq $last_command, @{$Config{"terminal"}}) 1.975 + )) { 1.976 1.977 - $Result{"body"} .= "<pre class='".$cl->{out_class}."'>"; 1.978 - $Result{"body"} .= $output; 1.979 - $Result{"body"} .= "</pre>\n"; 1.980 - } 1.981 + $Result{"body"} .= "<pre class='".$cl->{out_class}."'>"; 1.982 + $Result{"body"} .= $output; 1.983 + $Result{"body"} .= "</pre>\n"; 1.984 + } 1.985 1.986 - # DIFF 1.987 - if ( $Config{"show_diffs"} =~ /^y/i && $cl->{"diff"}) { 1.988 - $Result{"body"} .= "<table><tr><td width='5'/><td class='diff'><pre>"; 1.989 - $Result{"body"} .= $cl->{"diff"}; 1.990 - $Result{"body"} .= "</pre></td></tr></table>"; 1.991 - } 1.992 - 1.993 - #NOTES 1.994 - if ( $Config{"show_notes"} =~ /^y/i && $cl->{"note"}) { 1.995 - my $note=$cl->{"note"}; 1.996 - $note =~ s/\n/<br\/>\n/msg; 1.997 - $note =~ s@(http:[a-zA-Z.0-9/?%-]*)@<a href='$1'>$1</a>@g; 1.998 - $note =~ s@(www\.[a-zA-Z.0-9/?%-]*)@<a href='$1'>$1</a>@g; 1.999 - # Ширину пока не используем 1.1000 - # $Result{"body"} .= "<table width='$Config{note_width}' class='note'>"; 1.1001 - $Result{"body"} .= "<table class='note'>"; 1.1002 - $Result{"body"} .= "<tr><td class='note_title'>".$cl->{note_title}."</td></tr>" if $cl->{note_title}; 1.1003 - $Result{"body"} .= "<tr><td width='100%' class='note_text'>".$note."</td></tr>"; 1.1004 - $Result{"body"} .= "</table>\n"; 1.1005 - } 1.1006 + # DIFF 1.1007 + if ( $Config{"show_diffs"} =~ /^y/i && $cl->{"diff"}) { 1.1008 + $Result{"body"} .= "<table><tr><td width='5'/><td class='diff'><pre>"; 1.1009 + $Result{"body"} .= $cl->{"diff"}; 1.1010 + $Result{"body"} .= "</pre></td></tr></table>"; 1.1011 + } 1.1012 + 1.1013 + #NOTES 1.1014 + if ( $Config{"show_notes"} =~ /^y/i && $cl->{"note"}) { 1.1015 + my $note=$cl->{"note"}; 1.1016 + $note =~ s/\n/<br\/>\n/msg; 1.1017 + $note =~ s@(http:[a-zA-Z.0-9/?%-]*)@<a href='$1'>$1</a>@g; 1.1018 + $note =~ s@(www\.[a-zA-Z.0-9/?%-]*)@<a href='$1'>$1</a>@g; 1.1019 + # Ширину пока не используем 1.1020 + # $Result{"body"} .= "<table width='$Config{note_width}' class='note'>"; 1.1021 + $Result{"body"} .= "<table class='note'>"; 1.1022 + $Result{"body"} .= "<tr><td class='note_title'>".$cl->{note_title}."</td></tr>" if $cl->{note_title}; 1.1023 + $Result{"body"} .= "<tr><td width='100%' class='note_text'>".$note."</td></tr>"; 1.1024 + $Result{"body"} .= "</table>\n"; 1.1025 + } 1.1026 1.1027 - # COMMENT 1.1028 - if ( $Config{"show_comments"} =~ /^y/i) { 1.1029 - my $comment = make_comment($cl->{"cline"}); 1.1030 - if ($comment) { 1.1031 - $Result{"body"} .= "<table width='$Config{comment_width}'>". 1.1032 - "<tr><td width='5'/><td>"; 1.1033 - $Result{"body"} .= "<table class='note' width='100%'>"; 1.1034 - $Result{"body"} .= $comment; 1.1035 - $Result{"body"} .= "</table>\n"; 1.1036 - $Result{"body"} .= "</td></tr></table>"; 1.1037 - } 1.1038 - } 1.1039 + # COMMENT 1.1040 + if ( $Config{"show_comments"} =~ /^y/i) { 1.1041 + my $comment = make_comment($cl->{"cline"}); 1.1042 + if ($comment) { 1.1043 + $Result{"body"} .= "<table width='$Config{comment_width}'>". 1.1044 + "<tr><td width='5'/><td>"; 1.1045 + $Result{"body"} .= "<table class='note' width='100%'>"; 1.1046 + $Result{"body"} .= $comment; 1.1047 + $Result{"body"} .= "</table>\n"; 1.1048 + $Result{"body"} .= "</td></tr></table>"; 1.1049 + } 1.1050 + } 1.1051 1.1052 - # Вывод очередной команды окончен 1.1053 - $Result{"body"} .= "</td>\n"; 1.1054 - $Result{"body"} .= "</tr>\n"; 1.1055 - } 1.1056 + # Вывод очередной команды окончен 1.1057 + $Result{"body"} .= "</td>\n"; 1.1058 + $Result{"body"} .= "</tr>\n"; 1.1059 + } 1.1060 1.1061 - $Result{"body"} .= "</table>\n"; 1.1062 + $Result{"body"} .= "</table>\n"; 1.1063 1.1064 - #$Result{"stat"} = "<hr/>"; 1.1065 + #$Result{"stat"} = "<hr/>"; 1.1066 1.1067 - %StatNames = ( 1.1068 - FirstCommand => "Время первой команды журнала", 1.1069 - LastCommand => "Время последней команды журнала", 1.1070 - TotalCommands => "Количество командных строк в журнале", 1.1071 - ErrorsPercentage => "Процент команд с ненулевым кодом завершения, %", 1.1072 - TotalTime => "Суммарное время работы с терминалом <sup><font size='-2'>*</font></sup>, час", 1.1073 - CommandsPerTime => "Количество командных строк в единицу времени, команда/мин", 1.1074 - CommandsFrequency => "Частота использования команд", 1.1075 - RareCommands => "Частота использования этих команд < 0.5%", 1.1076 - ); 1.1077 - @StatOrder = ( 1.1078 - FirstCommand, 1.1079 - LastCommand, 1.1080 - TotalCommands, 1.1081 - ErrorsPercentage, 1.1082 - TotalTime, 1.1083 - CommandsPerTime, 1.1084 - CommandsFrequency, 1.1085 - RareCommands, 1.1086 - ); 1.1087 + %StatNames = ( 1.1088 + FirstCommand => "Время первой команды журнала", 1.1089 + LastCommand => "Время последней команды журнала", 1.1090 + TotalCommands => "Количество командных строк в журнале", 1.1091 + ErrorsPercentage => "Процент команд с ненулевым кодом завершения, %", 1.1092 + TotalTime => "Суммарное время работы с терминалом <sup><font size='-2'>*</font></sup>, час", 1.1093 + CommandsPerTime => "Количество командных строк в единицу времени, команда/мин", 1.1094 + CommandsFrequency => "Частота использования команд", 1.1095 + RareCommands => "Частота использования этих команд < 0.5%", 1.1096 + ); 1.1097 + @StatOrder = ( 1.1098 + FirstCommand, 1.1099 + LastCommand, 1.1100 + TotalCommands, 1.1101 + ErrorsPercentage, 1.1102 + TotalTime, 1.1103 + CommandsPerTime, 1.1104 + CommandsFrequency, 1.1105 + RareCommands, 1.1106 + ); 1.1107 1.1108 - # Подготовка статистики к выводу 1.1109 - # Некоторые значения пересчитываются! 1.1110 - # Дальше их лучше уже не использовать!!! 1.1111 + # Подготовка статистики к выводу 1.1112 + # Некоторые значения пересчитываются! 1.1113 + # Дальше их лучше уже не использовать!!! 1.1114 1.1115 - my %CommandsFrequency = %CommandsFDistribution; 1.1116 + my %CommandsFrequency = %CommandsFDistribution; 1.1117 1.1118 - $Stat{TotalTime} ||= 0; 1.1119 - my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($Stat{FirstCommand} || 0); 1.1120 - $Stat{FirstCommand} = sprintf "%02i:%02i:%02i %04i-%2i-%2i", $hour, $min, $sec, $year+1900, $mon+1, $mday; 1.1121 - ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($Stat{LastCommand} || 0); 1.1122 - $Stat{LastCommand} = sprintf "%02i:%02i:%02i %04i-%2i-%2i", $hour, $min, $sec, $year+1900, $mon+1, $mday; 1.1123 - $Stat{ErrorsPercentage} = sprintf "%5.2f", $Stat{ErrorCommands}*100/$Stat{TotalCommands} 1.1124 - if $Stat{TotalCommands}; 1.1125 - $Stat{CommandsPerTime} = sprintf "%5.2f", $Stat{TotalCommands}*60/$Stat{TotalTime} 1.1126 - if $Stat{TotalTime}; 1.1127 - $Stat{TotalTime} = sprintf "%5.2f", $Stat{TotalTime}/60/60; 1.1128 + $Stat{TotalTime} ||= 0; 1.1129 + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($Stat{FirstCommand} || 0); 1.1130 + $Stat{FirstCommand} = sprintf "%02i:%02i:%02i %04i-%2i-%2i", $hour, $min, $sec, $year+1900, $mon+1, $mday; 1.1131 + ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($Stat{LastCommand} || 0); 1.1132 + $Stat{LastCommand} = sprintf "%02i:%02i:%02i %04i-%2i-%2i", $hour, $min, $sec, $year+1900, $mon+1, $mday; 1.1133 + $Stat{ErrorsPercentage} = sprintf "%5.2f", $Stat{ErrorCommands}*100/$Stat{TotalCommands} 1.1134 + if $Stat{TotalCommands}; 1.1135 + $Stat{CommandsPerTime} = sprintf "%5.2f", $Stat{TotalCommands}*60/$Stat{TotalTime} 1.1136 + if $Stat{TotalTime}; 1.1137 + $Stat{TotalTime} = sprintf "%5.2f", $Stat{TotalTime}/60/60; 1.1138 1.1139 - my $total_commands=0; 1.1140 - for $command (keys %CommandsFrequency){ 1.1141 - $total_commands += $CommandsFrequency{$command}; 1.1142 - } 1.1143 - if ($total_commands) { 1.1144 - for $command (reverse sort {$CommandsFrequency{$a} <=> $CommandsFrequency{$b}} keys %CommandsFrequency){ 1.1145 - my $command_html; 1.1146 - my $percentage = sprintf "%5.2f",$CommandsFrequency{$command}*100/$total_commands; 1.1147 - if ($percentage < 0.5) { 1.1148 - my $hint = make_comment($command); 1.1149 - $command_html = "$command"; 1.1150 - $command_html = "<span title='$hint' class='hint'>$command_html</span>" if $hint; 1.1151 - my $command_html = "<tt>$command_html</tt>"; 1.1152 - $Stat{RareCommands} .= $command_html."<sub><font size='-2'>".$CommandsFrequency{$command}."</font></sub> , "; 1.1153 - } 1.1154 - else { 1.1155 - my $hint = make_comment($command); 1.1156 - $command_html = "$command"; 1.1157 - $command_html = "<span title='$hint' class='hint'>$command_html</span>" if $hint; 1.1158 - my $command_html = "<tt>$command_html</tt>"; 1.1159 - $percentage = sprintf "%5.2f",$percentage; 1.1160 - $Stat{CommandsFrequency} .= "<tr><td>".$command_html."</td><td>".$CommandsFrequency{$command}."</td>". 1.1161 - "<td>|".("="x int($CommandsFrequency{$command}*100/$total_commands))."| $percentage%</td></tr>"; 1.1162 - } 1.1163 - } 1.1164 - $Stat{CommandsFrequency} = "<table>".$Stat{CommandsFrequency}."</table>"; 1.1165 - $Stat{RareCommands} =~ s/, $// if $Stat{RareCommands}; 1.1166 - } 1.1167 + my $total_commands=0; 1.1168 + for $command (keys %CommandsFrequency){ 1.1169 + $total_commands += $CommandsFrequency{$command}; 1.1170 + } 1.1171 + if ($total_commands) { 1.1172 + for $command (reverse sort {$CommandsFrequency{$a} <=> $CommandsFrequency{$b}} keys %CommandsFrequency){ 1.1173 + my $command_html; 1.1174 + my $percentage = sprintf "%5.2f",$CommandsFrequency{$command}*100/$total_commands; 1.1175 + if ($percentage < 0.5) { 1.1176 + my $hint = make_comment($command); 1.1177 + $command_html = "$command"; 1.1178 + $command_html = "<span title='$hint' class='hint'>$command_html</span>" if $hint; 1.1179 + my $command_html = "<tt>$command_html</tt>"; 1.1180 + $Stat{RareCommands} .= $command_html."<sub><font size='-2'>".$CommandsFrequency{$command}."</font></sub> , "; 1.1181 + } 1.1182 + else { 1.1183 + my $hint = make_comment($command); 1.1184 + $command_html = "$command"; 1.1185 + $command_html = "<span title='$hint' class='hint'>$command_html</span>" if $hint; 1.1186 + my $command_html = "<tt>$command_html</tt>"; 1.1187 + $percentage = sprintf "%5.2f",$percentage; 1.1188 + $Stat{CommandsFrequency} .= "<tr><td>".$command_html."</td><td>".$CommandsFrequency{$command}."</td>". 1.1189 + "<td>|".("="x int($CommandsFrequency{$command}*100/$total_commands))."| $percentage%</td></tr>"; 1.1190 + } 1.1191 + } 1.1192 + $Stat{CommandsFrequency} = "<table>".$Stat{CommandsFrequency}."</table>"; 1.1193 + $Stat{RareCommands} =~ s/, $// if $Stat{RareCommands}; 1.1194 + } 1.1195 1.1196 - $Result{"stat"} .= "<h2 id='stat'>Статистика</h2>"; 1.1197 - $Result{"stat"} .= "<table>"; 1.1198 - for my $stat (@StatOrder) { 1.1199 - $Result{"stat"} .= "<tr valign='top'><td width='300'>".$StatNames{"$stat"}."</td><td>".$Stat{"$stat"}."</td></tr>" 1.1200 - if $Stat{"$stat"}; 1.1201 - } 1.1202 - 1.1203 - $Result{"stat"} .= "</table>"; 1.1204 - $Result{"stat"} .= "<font size='-2'>____<br/>*) Интервалы неактивности длительностью ".($Config{stat_inactivity_interval}/60)." минут и более не учитываются</font></br>"; 1.1205 + $Result{"stat"} .= "<h2 id='stat'>Статистика</h2>"; 1.1206 + $Result{"stat"} .= "<table>"; 1.1207 + for my $stat (@StatOrder) { 1.1208 + $Result{"stat"} .= "<tr valign='top'><td width='300'>".$StatNames{"$stat"}."</td><td>".$Stat{"$stat"}."</td></tr>" 1.1209 + if $Stat{"$stat"}; 1.1210 + } 1.1211 + 1.1212 + $Result{"stat"} .= "</table>"; 1.1213 + $Result{"stat"} .= "<font size='-2'>____<br/>*) Интервалы неактивности длительностью ".($Config{stat_inactivity_interval}/60)." минут и более не учитываются</font></br>"; 1.1214 1.1215 - #$Result{"help"} .= "<hr/>"; 1.1216 - $Result{"help"} .= "<h2 id='help'>Справка</h2>"; 1.1217 - $Result{"help"} .= "$Html_Help<br/>"; 1.1218 - #$Result{"about"} .= "<hr/>"; 1.1219 - $Result{"about"} .= "<h2 id='about'>О программе</h2>"; 1.1220 - $Result{"about"} .= "$Html_About"; 1.1221 - $Result{"footer"} .= "</body>\n"; 1.1222 - $Result{"footer"} .= "</html>\n"; 1.1223 + #$Result{"help"} .= "<hr/>"; 1.1224 + $Result{"help"} .= "<h2 id='help'>Справка</h2>"; 1.1225 + $Result{"help"} .= "$Html_Help<br/>"; 1.1226 + #$Result{"about"} .= "<hr/>"; 1.1227 + $Result{"about"} .= "<h2 id='about'>О программе</h2>"; 1.1228 + $Result{"about"} .= "$Html_About"; 1.1229 + $Result{"footer"} .= "</body>\n"; 1.1230 + $Result{"footer"} .= "</html>\n"; 1.1231 1.1232 - $Result{"title"} = "Журнал лабораторных работ"; 1.1233 - $Result{"title"}.= " -- ".$course_student if $course_student; 1.1234 - if ($course_date) { 1.1235 - $Result{"title"}.= " -- ".$course_date; 1.1236 - $Result{"title"}.= "/".$course_code if $course_code; 1.1237 - } 1.1238 - else { 1.1239 - $Result{"title"}.= " -- ".$course_code if $course_code; 1.1240 - } 1.1241 + $Result{"title"} = "Журнал лабораторных работ"; 1.1242 + $Result{"title"}.= " -- ".$course_student if $course_student; 1.1243 + if ($course_date) { 1.1244 + $Result{"title"}.= " -- ".$course_date; 1.1245 + $Result{"title"}.= "/".$course_code if $course_code; 1.1246 + } 1.1247 + else { 1.1248 + $Result{"title"}.= " -- ".$course_code if $course_code; 1.1249 + } 1.1250 1.1251 - # Заголовок генерируется позже всего 1.1252 - # Тогда, когда известно уже, что должно быть написано в 1.1253 - # оглавлении 1.1254 - $Result{"header"} = <<HEADER; 1.1255 - <html> 1.1256 - <head> 1.1257 - <meta content='text/html; charset=utf-8' http-equiv='Content-Type' /> 1.1258 - <link rel='stylesheet' href='$Config{frontend_css}' type='text/css'/> 1.1259 - <title>$Result{title}</title> 1.1260 - </head> 1.1261 - <body> 1.1262 - <script> 1.1263 - $Html_JavaScript 1.1264 - </script> 1.1265 - <h1>Журнал лабораторных работ</h1> 1.1266 + # Заголовок генерируется позже всего 1.1267 + # Тогда, когда известно уже, что должно быть написано в 1.1268 + # оглавлении 1.1269 + $Result{"header"} = <<HEADER; 1.1270 + <html> 1.1271 + <head> 1.1272 + <meta content='text/html; charset=utf-8' http-equiv='Content-Type' /> 1.1273 + <link rel='stylesheet' href='$Config{frontend_css}' type='text/css'/> 1.1274 + <title>$Result{title}</title> 1.1275 + </head> 1.1276 + <body> 1.1277 + <script> 1.1278 + $Html_JavaScript 1.1279 + </script> 1.1280 + <h1>Журнал лабораторных работ</h1> 1.1281 1.1282 HEADER 1.1283 - $Result{"header"} .= "<p>" if $course_student || $course_trainer || $course_name || $course_code || $course_date || $course_center; 1.1284 - $Result{"header"} .= "Выполнил $course_student<br/>" if $course_student; 1.1285 - $Result{"header"} .= "Проверил $course_trainer <br/>" if $course_trainer; 1.1286 - $Result{"header"} .= "Курс " if $course_name || $course_code || $course_date; 1.1287 - $Result{"header"} .= "$course_name " if $course_name; 1.1288 - $Result{"header"} .= "($course_code)" if $course_code; 1.1289 - $Result{"header"} .= ", $course_date<br/>" if $course_date; 1.1290 - $Result{"header"} .= "Учебный центр $course_center <br/>" if $course_center; 1.1291 - $Result{"header"} .= "</p>" if $course_student || $course_trainer || $course_name || $course_code || $course_date || $course_center; 1.1292 + $Result{"header"} .= "<p>" if $course_student || $course_trainer || $course_name || $course_code || $course_date || $course_center; 1.1293 + $Result{"header"} .= "Выполнил $course_student<br/>" if $course_student; 1.1294 + $Result{"header"} .= "Проверил $course_trainer <br/>" if $course_trainer; 1.1295 + $Result{"header"} .= "Курс " if $course_name || $course_code || $course_date; 1.1296 + $Result{"header"} .= "$course_name " if $course_name; 1.1297 + $Result{"header"} .= "($course_code)" if $course_code; 1.1298 + $Result{"header"} .= ", $course_date<br/>" if $course_date; 1.1299 + $Result{"header"} .= "Учебный центр $course_center <br/>" if $course_center; 1.1300 + $Result{"header"} .= "</p>" if $course_student || $course_trainer || $course_name || $course_code || $course_date || $course_center; 1.1301 1.1302 - my $toc = collapse_list (\@toc); 1.1303 - $Result{"header"} .= <<HEADER; 1.1304 - <table border=0 id='toc' class='toc'> 1.1305 - <tr> 1.1306 - <td> 1.1307 - <div class='toc_title'>Содержание</div> 1.1308 - <ul> 1.1309 - <li><a href='#log'>Журнал</a></li> 1.1310 - <ul>$toc</ul> 1.1311 - <li><a href='#stat'>Статистика</a></li> 1.1312 - <li><a href='#help'>Справка</a></li> 1.1313 - <li><a href='#about'>О программе</a></li> 1.1314 - </ul> 1.1315 - </td> 1.1316 - </tr> 1.1317 - </table> 1.1318 + my $toc = collapse_list (\@toc); 1.1319 + $Result{"header"} .= <<HEADER; 1.1320 + <table border=0 id='toc' class='toc'> 1.1321 + <tr> 1.1322 + <td> 1.1323 + <div class='toc_title'>Содержание</div> 1.1324 + <ul> 1.1325 + <li><a href='#log'>Журнал</a></li> 1.1326 + <ul>$toc</ul> 1.1327 + <li><a href='#stat'>Статистика</a></li> 1.1328 + <li><a href='#help'>Справка</a></li> 1.1329 + <li><a href='#about'>О программе</a></li> 1.1330 + </ul> 1.1331 + </td> 1.1332 + </tr> 1.1333 + </table> 1.1334 1.1335 - <h2 id="log">Журнал</h2> 1.1336 + <h2 id="log">Журнал</h2> 1.1337 HEADER 1.1338 - $Result{"header"} .= "<table id='visibility_form' class='visibility_form'><tr><td><form>\n"; 1.1339 - for my $element (keys %Elements_Visibility) 1.1340 - { 1.1341 - my @e = split /\s+/, $element; 1.1342 - my $showhide = join "", map { "ShowHide('$_');" } @e ; 1.1343 - $Result{"header"} .= "<input type='checkbox' name='$e[0]' onclick=\"$showhide\" checked>". 1.1344 - $Elements_Visibility{$element}. 1.1345 - "</input><br>\n"; 1.1346 - } 1.1347 + $Result{"header"} .= "<table id='visibility_form' class='visibility_form'><tr><td><form>\n"; 1.1348 + for my $element (keys %Elements_Visibility) 1.1349 + { 1.1350 + my @e = split /\s+/, $element; 1.1351 + my $showhide = join "", map { "ShowHide('$_');" } @e ; 1.1352 + $Result{"header"} .= "<input type='checkbox' name='$e[0]' onclick=\"$showhide\" checked>". 1.1353 + $Elements_Visibility{$element}. 1.1354 + "</input><br>\n"; 1.1355 + } 1.1356 1.1357 - $Result{"header"} .= "</form></td></tr></table>\n"; 1.1358 + $Result{"header"} .= "</form></td></tr></table>\n"; 1.1359 1.1360 - if ($output_filename eq "-") { 1.1361 - print $Result{"header"}, $Result{"body"}, $Result{"stat"}, $Result{"help"}, $Result{"about"}, $Result{"footer"}; 1.1362 - } 1.1363 - else { 1.1364 - open(OUT, ">", $output_filename) 1.1365 - or die "Can't open $output_filename for writing\n"; 1.1366 - print OUT $Result{"header"}, $Result{"body"}, $Result{"stat"}, $Result{"help"}, $Result{"about"}, $Result{"footer"}; 1.1367 - close(OUT); 1.1368 - } 1.1369 + if ($output_filename eq "-") { 1.1370 + print $Result{"header"}, $Result{"body"}, $Result{"stat"}, $Result{"help"}, $Result{"about"}, $Result{"footer"}; 1.1371 + } 1.1372 + else { 1.1373 + open(OUT, ">", $output_filename) 1.1374 + or die "Can't open $output_filename for writing\n"; 1.1375 + print OUT $Result{"header"}, $Result{"body"}, $Result{"stat"}, $Result{"help"}, $Result{"about"}, $Result{"footer"}; 1.1376 + close(OUT); 1.1377 + } 1.1378 } 1.1379 1.1380 1.1381 1.1382 sub collapse_list($) 1.1383 { 1.1384 - my $res = ""; 1.1385 - for my $elem (@{$_[0]}) { 1.1386 - if (ref $elem eq "ARRAY") { 1.1387 - $res .= "<ul>".collapse_list($elem)."</ul>"; 1.1388 - } 1.1389 - else 1.1390 - { 1.1391 - $res .= "<li>".$elem."</li>"; 1.1392 - } 1.1393 - } 1.1394 - return $res; 1.1395 + my $res = ""; 1.1396 + for my $elem (@{$_[0]}) { 1.1397 + if (ref $elem eq "ARRAY") { 1.1398 + $res .= "<ul>".collapse_list($elem)."</ul>"; 1.1399 + } 1.1400 + else 1.1401 + { 1.1402 + $res .= "<li>".$elem."</li>"; 1.1403 + } 1.1404 + } 1.1405 + return $res; 1.1406 } 1.1407 1.1408 1.1409 @@ -822,24 +822,24 @@ 1.1410 sub init_variables 1.1411 { 1.1412 $Html_Help = <<HELP; 1.1413 - Для того чтобы использовать LiLaLo, не нужно знать ничего особенного: 1.1414 - всё происходит само собой. 1.1415 - Однако, чтобы ведение и последующее использование журналов 1.1416 - было как можно более эффективным, желательно иметь в виду следующее: 1.1417 - <ul> 1.1418 - <li><p> 1.1419 - В журнал автоматически попадают все команды, данные в любом терминале системы. 1.1420 - </p></li> 1.1421 - <li><p> 1.1422 - Для того чтобы убедиться, что журнал на текущем терминале ведётся, 1.1423 - и команды записываются, дайте команду w. 1.1424 - В поле WHAT, соответствующем текущему терминалу, 1.1425 - должна быть указана программа script. 1.1426 - </p></li> 1.1427 - <li><p> 1.1428 - Если код завершения команды равен нулю, 1.1429 - команда была выполнена без ошибок. 1.1430 - Команды, код завершения которых отличен от нуля, выделяются цветом. 1.1431 + Для того чтобы использовать LiLaLo, не нужно знать ничего особенного: 1.1432 + всё происходит само собой. 1.1433 + Однако, чтобы ведение и последующее использование журналов 1.1434 + было как можно более эффективным, желательно иметь в виду следующее: 1.1435 + <ul> 1.1436 + <li><p> 1.1437 + В журнал автоматически попадают все команды, данные в любом терминале системы. 1.1438 + </p></li> 1.1439 + <li><p> 1.1440 + Для того чтобы убедиться, что журнал на текущем терминале ведётся, 1.1441 + и команды записываются, дайте команду w. 1.1442 + В поле WHAT, соответствующем текущему терминалу, 1.1443 + должна быть указана программа script. 1.1444 + </p></li> 1.1445 + <li><p> 1.1446 + Если код завершения команды равен нулю, 1.1447 + команда была выполнена без ошибок. 1.1448 + Команды, код завершения которых отличен от нуля, выделяются цветом. 1.1449 <table> 1.1450 <tr class='command'> 1.1451 <td class='script'> 1.1452 @@ -851,9 +851,9 @@ 1.1453 </tr> 1.1454 </table> 1.1455 <br/> 1.1456 - </p></li> 1.1457 - <li><p> 1.1458 - Команды, ход выполнения которых был прерван пользователем, выделяются цветом. 1.1459 + </p></li> 1.1460 + <li><p> 1.1461 + Команды, ход выполнения которых был прерван пользователем, выделяются цветом. 1.1462 <table> 1.1463 <tr class='command'> 1.1464 <td class='script'> 1.1465 @@ -870,10 +870,10 @@ 1.1466 </tr> 1.1467 </table> 1.1468 <br/> 1.1469 - </p></li> 1.1470 - <li><p> 1.1471 - Команды, выполненные с привилегиями суперпользователя, 1.1472 - выделяются слева красной чертой. 1.1473 + </p></li> 1.1474 + <li><p> 1.1475 + Команды, выполненные с привилегиями суперпользователя, 1.1476 + выделяются слева красной чертой. 1.1477 <table> 1.1478 <tr class='command'> 1.1479 <td class='script'> 1.1480 @@ -885,33 +885,33 @@ 1.1481 </td> 1.1482 </tr> 1.1483 </table> 1.1484 - <br/> 1.1485 - </p></li> 1.1486 - <li><p> 1.1487 - Изменения, внесённые в текстовый файл с помощью редактора, 1.1488 - запоминаются и показываются в журнале в формате ed. 1.1489 - Строки, начинающиеся символом "<", удалены, а строки, 1.1490 - начинающиеся символом ">" -- добавлены. 1.1491 + <br/> 1.1492 + </p></li> 1.1493 + <li><p> 1.1494 + Изменения, внесённые в текстовый файл с помощью редактора, 1.1495 + запоминаются и показываются в журнале в формате ed. 1.1496 + Строки, начинающиеся символом "<", удалены, а строки, 1.1497 + начинающиеся символом ">" -- добавлены. 1.1498 <table> 1.1499 <tr class='command'> 1.1500 <td class='script'> 1.1501 <pre class='cline'> 1.1502 \$ vi ~/.bashrc</pre> 1.1503 <table><tr><td width='5'/><td class='diff'><pre>2a3,5 1.1504 -> if [ -f /usr/local/etc/bash_completion ]; then 1.1505 +> if [ -f /usr/local/etc/bash_completion ]; then 1.1506 > . /usr/local/etc/bash_completion 1.1507 -> fi 1.1508 +> fi 1.1509 </pre></td></tr></table></td> 1.1510 </tr> 1.1511 </table> 1.1512 - <br/> 1.1513 - </p></li> 1.1514 - <li><p> 1.1515 - Для того чтобы изменить файл в соответствии с показанными в диффшоте 1.1516 - изменениями, можно воспользоваться командой patch. 1.1517 - Нужно скопировать изменения, запустить программу patch, указав в 1.1518 - качестве её аргумента файл, к которому применяются изменения, 1.1519 - и всавить скопированный текст: 1.1520 + <br/> 1.1521 + </p></li> 1.1522 + <li><p> 1.1523 + Для того чтобы изменить файл в соответствии с показанными в диффшоте 1.1524 + изменениями, можно воспользоваться командой patch. 1.1525 + Нужно скопировать изменения, запустить программу patch, указав в 1.1526 + качестве её аргумента файл, к которому применяются изменения, 1.1527 + и всавить скопированный текст: 1.1528 <table> 1.1529 <tr class='command'> 1.1530 <td class='script'> 1.1531 @@ -920,35 +920,35 @@ 1.1532 </td> 1.1533 </tr> 1.1534 </table> 1.1535 - В данном случае изменения применяются к файлу ~/.bashrc 1.1536 - </p></li> 1.1537 - <li><p> 1.1538 - Для того чтобы получить краткую справочную информацию о команде, 1.1539 - нужно подвести к ней мышь. Во всплывающей подсказке появится краткое 1.1540 - описание команды. 1.1541 - </p></li> 1.1542 - <li><p> 1.1543 - Время ввода команды, показанное в журнале, соответствует времени 1.1544 - <i>начала ввода командной строки</i>, которое равно тому моменту, 1.1545 - когда на терминале появилось приглашение интерпретатора 1.1546 - </p></li> 1.1547 - <li><p> 1.1548 - Имя терминала, на котором была введена команда, показано в специальном блоке. 1.1549 - Этот блок показывается только в том случае, если терминал 1.1550 - текущей команды отличается от терминала предыдущей. 1.1551 - </p></li> 1.1552 - <li><p> 1.1553 - Вывод не интересующих вас в настоящий момент элементов журнала, 1.1554 - таких как время, имя терминала и других, можно отключить. 1.1555 - Для этого нужно воспользоваться <a href='#visibility_form'>формой управления журналом</a> 1.1556 - вверху страницы. 1.1557 - </p></li> 1.1558 - <li><p> 1.1559 - Небольшие комментарии к командам можно вставлять прямо из командной строки. 1.1560 - Комментарий вводится прямо в командную строку, после символов #^ или #v. 1.1561 - Символы ^ и v показывают направление выбора команды, к которой относится комментарий: 1.1562 - ^ - к предыдущей, v - к следующей. 1.1563 - Например, если в командной строке было введено: 1.1564 + В данном случае изменения применяются к файлу ~/.bashrc 1.1565 + </p></li> 1.1566 + <li><p> 1.1567 + Для того чтобы получить краткую справочную информацию о команде, 1.1568 + нужно подвести к ней мышь. Во всплывающей подсказке появится краткое 1.1569 + описание команды. 1.1570 + </p></li> 1.1571 + <li><p> 1.1572 + Время ввода команды, показанное в журнале, соответствует времени 1.1573 + <i>начала ввода командной строки</i>, которое равно тому моменту, 1.1574 + когда на терминале появилось приглашение интерпретатора 1.1575 + </p></li> 1.1576 + <li><p> 1.1577 + Имя терминала, на котором была введена команда, показано в специальном блоке. 1.1578 + Этот блок показывается только в том случае, если терминал 1.1579 + текущей команды отличается от терминала предыдущей. 1.1580 + </p></li> 1.1581 + <li><p> 1.1582 + Вывод не интересующих вас в настоящий момент элементов журнала, 1.1583 + таких как время, имя терминала и других, можно отключить. 1.1584 + Для этого нужно воспользоваться <a href='#visibility_form'>формой управления журналом</a> 1.1585 + вверху страницы. 1.1586 + </p></li> 1.1587 + <li><p> 1.1588 + Небольшие комментарии к командам можно вставлять прямо из командной строки. 1.1589 + Комментарий вводится прямо в командную строку, после символов #^ или #v. 1.1590 + Символы ^ и v показывают направление выбора команды, к которой относится комментарий: 1.1591 + ^ - к предыдущей, v - к следующей. 1.1592 + Например, если в командной строке было введено: 1.1593 <pre class='cline'> 1.1594 \$ whoami 1.1595 </pre> 1.1596 @@ -958,8 +958,8 @@ 1.1597 <pre class='cline'> 1.1598 \$ #^ Интересно, кто я? 1.1599 </pre> 1.1600 - в журнале это будет выглядеть так: 1.1601 - 1.1602 + в журнале это будет выглядеть так: 1.1603 + 1.1604 <pre class='cline'> 1.1605 \$ whoami 1.1606 </pre> 1.1607 @@ -968,10 +968,10 @@ 1.1608 </pre> 1.1609 <table class='note'><tr><td width='100%' class='note_text'> 1.1610 <tr> <td> Интересно, кто я?<br/> </td></tr></table> 1.1611 - </p></li> 1.1612 - <li><p> 1.1613 - Если комментарий содержит несколько строк, 1.1614 - его можно вставить в журнал следующим образом: 1.1615 + </p></li> 1.1616 + <li><p> 1.1617 + Если комментарий содержит несколько строк, 1.1618 + его можно вставить в журнал следующим образом: 1.1619 <pre class='cline'> 1.1620 \$ whoami 1.1621 </pre> 1.1622 @@ -988,7 +988,7 @@ 1.1623 Она не может ответить на вопрос о нашем назначении 1.1624 в этом мире. 1.1625 </pre> 1.1626 - В журнале это будет выглядеть так: 1.1627 + В журнале это будет выглядеть так: 1.1628 <table> 1.1629 <tr class='command'> 1.1630 <td class='script'> 1.1631 @@ -1006,103 +1006,103 @@ 1.1632 </td> 1.1633 </tr> 1.1634 </table> 1.1635 - Для разделения нескольких абзацев между собой 1.1636 - используйте символ "-", один в строке. 1.1637 - <br/> 1.1638 + Для разделения нескольких абзацев между собой 1.1639 + используйте символ "-", один в строке. 1.1640 + <br/> 1.1641 </p></li> 1.1642 - <li><p> 1.1643 - Комментарии, не относящиеся непосредственно ни к какой из команд, 1.1644 - добавляются точно таким же способом, только вместо симолов #^ или #v 1.1645 - нужно использовать символы #= 1.1646 - </p></li> 1.1647 + <li><p> 1.1648 + Комментарии, не относящиеся непосредственно ни к какой из команд, 1.1649 + добавляются точно таким же способом, только вместо симолов #^ или #v 1.1650 + нужно использовать символы #= 1.1651 + </p></li> 1.1652 </ul> 1.1653 HELP 1.1654 1.1655 $Html_About = <<ABOUT; 1.1656 - <p> 1.1657 - LiLaLo (L3) расшифровывается как Live Lab Log.<br/> 1.1658 - Программа разработана для повышения эффективности обучения Unix/Linux-системам.<br/> 1.1659 - (c) Игорь Чубин, 2004-2005<br/> 1.1660 - </p> 1.1661 + <p> 1.1662 + LiLaLo (L3) расшифровывается как Live Lab Log.<br/> 1.1663 + Программа разработана для повышения эффективности обучения Unix/Linux-системам.<br/> 1.1664 + (c) Игорь Чубин, 2004-2005<br/> 1.1665 + </p> 1.1666 ABOUT 1.1667 $Html_About.='$Id$ </p>'; 1.1668 1.1669 $Html_JavaScript = <<JS; 1.1670 - function getElementsByClassName(Class_Name) 1.1671 - { 1.1672 - var Result=new Array(); 1.1673 - var All_Elements=document.all || document.getElementsByTagName('*'); 1.1674 - for (i=0; i<All_Elements.length; i++) 1.1675 - if (All_Elements[i].className==Class_Name) 1.1676 - Result.push(All_Elements[i]); 1.1677 - return Result; 1.1678 - } 1.1679 - function ShowHide (name) 1.1680 - { 1.1681 - elements=getElementsByClassName(name); 1.1682 - for(i=0; i<elements.length; i++) 1.1683 - if (elements[i].style.display == "none") 1.1684 - elements[i].style.display = ""; 1.1685 - else 1.1686 - elements[i].style.display = "none"; 1.1687 - //if (elements[i].style.visibility == "hidden") 1.1688 - // elements[i].style.visibility = "visible"; 1.1689 - //else 1.1690 - // elements[i].style.visibility = "hidden"; 1.1691 - } 1.1692 - function filter_by_output(text) 1.1693 - { 1.1694 - 1.1695 - var jjj=0; 1.1696 - 1.1697 - elements=getElementsByClassName('command'); 1.1698 - for(i=0; i<elements.length; i++) { 1.1699 - subelems = elements[i].getElementsByTagName('pre'); 1.1700 - for(j=0; j<subelems.length; j++) { 1.1701 - if (subelems[j].className = 'output') { 1.1702 - var str = new String(subelems[j].nodeValue); 1.1703 - if (jjj != 1) { 1.1704 - alert(str); 1.1705 - jjj=1; 1.1706 - } 1.1707 - if (str.indexOf(text) >0) 1.1708 - subelems[j].style.display = "none"; 1.1709 - else 1.1710 - subelems[j].style.display = ""; 1.1711 + function getElementsByClassName(Class_Name) 1.1712 + { 1.1713 + var Result=new Array(); 1.1714 + var All_Elements=document.all || document.getElementsByTagName('*'); 1.1715 + for (i=0; i<All_Elements.length; i++) 1.1716 + if (All_Elements[i].className==Class_Name) 1.1717 + Result.push(All_Elements[i]); 1.1718 + return Result; 1.1719 + } 1.1720 + function ShowHide (name) 1.1721 + { 1.1722 + elements=getElementsByClassName(name); 1.1723 + for(i=0; i<elements.length; i++) 1.1724 + if (elements[i].style.display == "none") 1.1725 + elements[i].style.display = ""; 1.1726 + else 1.1727 + elements[i].style.display = "none"; 1.1728 + //if (elements[i].style.visibility == "hidden") 1.1729 + // elements[i].style.visibility = "visible"; 1.1730 + //else 1.1731 + // elements[i].style.visibility = "hidden"; 1.1732 + } 1.1733 + function filter_by_output(text) 1.1734 + { 1.1735 + 1.1736 + var jjj=0; 1.1737 + 1.1738 + elements=getElementsByClassName('command'); 1.1739 + for(i=0; i<elements.length; i++) { 1.1740 + subelems = elements[i].getElementsByTagName('pre'); 1.1741 + for(j=0; j<subelems.length; j++) { 1.1742 + if (subelems[j].className = 'output') { 1.1743 + var str = new String(subelems[j].nodeValue); 1.1744 + if (jjj != 1) { 1.1745 + alert(str); 1.1746 + jjj=1; 1.1747 + } 1.1748 + if (str.indexOf(text) >0) 1.1749 + subelems[j].style.display = "none"; 1.1750 + else 1.1751 + subelems[j].style.display = ""; 1.1752 1.1753 - } 1.1754 - 1.1755 - } 1.1756 - } 1.1757 + } 1.1758 + 1.1759 + } 1.1760 + } 1.1761 1.1762 - } 1.1763 + } 1.1764 JS 1.1765 1.1766 %Search_Machines = ( 1.1767 - "google" => { "query" => "http://www.google.com/search?q=" , 1.1768 - "icon" => "$Config{frontend_google_ico}" }, 1.1769 - "freebsd" => { "query" => "http://www.freebsd.org/cgi/man.cgi?query=", 1.1770 - "icon" => "$Config{frontend_freebsd_ico}" }, 1.1771 - "linux" => { "query" => "http://man.he.net/?topic=", 1.1772 - "icon" => "$Config{frontend_linux_ico}"}, 1.1773 - "opennet" => { "query" => "http://www.opennet.ru/search.shtml?words=", 1.1774 - "icon" => "$Config{frontend_opennet_ico}"}, 1.1775 - "local" => { "query" => "http://www.freebsd.org/cgi/man.cgi?query=", 1.1776 - "icon" => "$Config{frontend_local_ico}" }, 1.1777 + "google" => { "query" => "http://www.google.com/search?q=" , 1.1778 + "icon" => "$Config{frontend_google_ico}" }, 1.1779 + "freebsd" => { "query" => "http://www.freebsd.org/cgi/man.cgi?query=", 1.1780 + "icon" => "$Config{frontend_freebsd_ico}" }, 1.1781 + "linux" => { "query" => "http://man.he.net/?topic=", 1.1782 + "icon" => "$Config{frontend_linux_ico}"}, 1.1783 + "opennet" => { "query" => "http://www.opennet.ru/search.shtml?words=", 1.1784 + "icon" => "$Config{frontend_opennet_ico}"}, 1.1785 + "local" => { "query" => "http://www.freebsd.org/cgi/man.cgi?query=", 1.1786 + "icon" => "$Config{frontend_local_ico}" }, 1.1787 1.1788 - ); 1.1789 + ); 1.1790 1.1791 %Elements_Visibility = ( 1.1792 - "note" => "замечания", 1.1793 - "diff" => "редактор", 1.1794 - "time" => "время", 1.1795 - "ttychange" => "терминал", 1.1796 - "wrong_output wrong_cline wrong_root_output wrong_root_cline" 1.1797 - => "команды с ошибками", 1.1798 - "interrupted_output interrupted_cline interrupted_root_output interrupted_root_cline" 1.1799 - => "прерванные команды", 1.1800 - "tab_completion_output tab_completion_cline" 1.1801 - => "продолжение с помощью tab" 1.1802 + "note" => "замечания", 1.1803 + "diff" => "редактор", 1.1804 + "time" => "время", 1.1805 + "ttychange" => "терминал", 1.1806 + "wrong_output wrong_cline wrong_root_output wrong_root_cline" 1.1807 + => "команды с ошибками", 1.1808 + "interrupted_output interrupted_cline interrupted_root_output interrupted_root_cline" 1.1809 + => "прерванные команды", 1.1810 + "tab_completion_output tab_completion_cline" 1.1811 + => "продолжение с помощью tab" 1.1812 ); 1.1813 1.1814 @Day_Name = qw/ Воскресенье Понедельник Вторник Среда Четверг Пятница Суббота /;