# HG changeset patch # User devi # Date 1135788282 -7200 # Node ID 187b6636a3be6bfcccc32f803f2fba8123138746 # Parent 43aeb3036aaa0a3f35edad44a800683cc8028db1 l3-agent: Исправлен микробаг с uid Раньше он не отправлялся в поток l3-cgi: При генерировании не CGI-версии в таблице отсутствуют поля "инструктор" и "все" На текущий момент они указывали в никуда, поэтому я отключил их l3-frontend: Выводятся новые команды в начале каждого дня. Команды сортируются по убыванию частоты использования. l3scripts: в письмо в одном месте е заменил на ё diff -r 43aeb3036aaa -r 187b6636a3be l3-agent --- a/l3-agent Wed Dec 28 01:01:00 2005 +0200 +++ b/l3-agent Wed Dec 28 18:44:42 2005 +0200 @@ -813,6 +813,7 @@ print OUT "",$cl->{raw_end},"\n"; print OUT "",$cl->{raw_file},"\n"; print OUT "",$cl->{tty},"\n"; + print OUT "",$cl->{uid},"\n"; print OUT "",$out_class,"\n"; print OUT "",$cl->{err},"\n"; print OUT ""; diff -r 43aeb3036aaa -r 187b6636a3be l3-cgi --- a/l3-cgi Wed Dec 28 01:01:00 2005 +0200 +++ b/l3-cgi Wed Dec 28 18:44:42 2005 +0200 @@ -120,9 +120,19 @@ my $t = load_training($training); $training ||= "current"; + my $prefix = "/cgi-bin/l3/$training/"; + my $suffix = ""; + if ($is_not_cgi) { + $prefix = ""; + $suffix = ".html"; + } + my $path = $to_file; + $path = "" unless $path =~ s@/[^/]*$@@; + $print .= "\n"; $print .= "\n"; $print .= "Журналы лабораторных работ\n"; + $print .= ""; $print .= "\n"; $print .= "\n"; $print .= "\n"; @@ -135,12 +145,6 @@ $print .= "\n"; for my $host (sort keys %{$t->{host}}) { - my $prefix = "/cgi-bin/l3/$training/"; - my $suffix = ""; - if ($is_not_cgi) { - $prefix = ""; - $suffix = ".html"; - } $print .= "\n"; my $h = $t->{host}->{$host}; @@ -148,7 +152,7 @@ $print .= "$host"; $print .= "root"; $print .= "".$h->{user}.""; - $print .= "все"; + $print .= "все" if not $is_not_cgi; $print .= "\n"; $print .= "\n"; @@ -157,8 +161,7 @@ # Если мы чувствуем, что нас вызывают для генерения индексного файла, # нам нужно создать и файлы, на которые он указывает # Лучше было бы это сделать хотя бы через вызов функций - my $path = $to_file; - $path = "" unless $path =~ s@/[^/]*$@@; +# Такой же хак чуть ниже mkdir("$path/$host"); system("$0 --cgi2file $path/$prefix$host/root$suffix ". "--cgi_path_info ".$training."/".$host."/root ". @@ -166,15 +169,27 @@ system("$0 --cgi2file $path/$prefix$host/".$h->{user}."$suffix ". "--cgi_path_info ".$training."/".$host."/".$h->{user}." ". "--frontend_css ../$l3config::Config{frontend_css}"); + # system("$0 --cgi2file $path/$prefix$host$suffix ". + # "--cgi_path_info ".$training."/".$host." ". + # "--frontend_css ../$l3config::Config{frontend_css}"); } } - $print .= "\n"; - $print .= ""."Инструктор".""; - $print .= "from linux.nt"; - $print .= ""; - $print .= ""; - $print .= "все"; +# Такой же хак был чуть выше + if ($is_not_cgi) { +# $print .= "все"; +# system("$0 --cgi2file $path/$prefix$host$suffix" +# . " --cgi_path_info ".$training."?login_from=192.168.15.254".$host +# . " --frontend_css ../$l3config::Config{frontend_css}"); + } + else { + $print .= "\n"; + $print .= ""."Инструктор".""; + $print .= "from linux.nt"; + $print .= ""; + $print .= ""; + $print .= "все"; + } $print .= "\n"; $print .= "\n"; $print .= "\n"; diff -r 43aeb3036aaa -r 187b6636a3be l3-frontend --- a/l3-frontend Wed Dec 28 01:01:00 2005 +0200 +++ b/l3-frontend Wed Dec 28 18:44:42 2005 +0200 @@ -26,6 +26,7 @@ my %mywi_cache_for; # Кэш для экономии обращений к mywi sub make_comment; +sub make_new_commands_table; sub load_command_lines_from_xml; sub load_sessions_from_xml; sub sort_command_lines; @@ -301,9 +302,10 @@ $$cl->{"class"} = $$cl->{"err"} eq 130 ? "interrupted" : $$cl->{"err"} eq 127 ? "mistyped" : $$cl->{"err"} ? "wrong" - : ""; + : "normal"; - if (!$$cl->{"euid"}) { + if ($$cl->{"cline"} =~ /[^|`]\s*sudo/ + || $$cl->{"uid"} eq 0) { $$cl->{"class"}.="_root"; } @@ -389,6 +391,8 @@ my $current_command=0; + my @known_commands; + my %filter; if ($Config{filter}) { @@ -460,9 +464,9 @@ $note = join ("\n", map ("

$_

", split (/-\n/, $note))); $note =~ s@(http:[a-zA-Z.0-9/?\_%-]*)@$1@g; $note =~ s@(www\.[a-zA-Z.0-9/?\_%-]*)@$1@g; - $result .= ""; - $result .= "

".$cl->{note_title}."

" if $cl->{note_title}; - $result .= "".$note."

"; + $this_day_result .= "" + . "

".$cl->{note_title}."

" if $cl->{note_title} + . "".$note."

"; if ($cl->{note_title}) { push @{$toc[@toc]},"".$cl->{note_title}.""; @@ -508,11 +512,6 @@ $hour = "0".$hour if $hour =~ /^.$/; $sec = "0".$sec if $sec =~ /^.$/; - #my @new_commands; - #my @new_files; - #@new_commands = split (/\s+/, $cl->{"new_commands"}) if defined $cl->{"new_commands"}; - #@new_files = split (/\s+/, $cl->{"new_files"}) if defined $cl->{"new_files"}; - $class=$cl->{"class"}; $Stat{ErrorCommands}++ if $class =~ /wrong/; $Stat{MistypedCommands}++ if $class =~ /mistype/; @@ -521,8 +520,25 @@ # DAY CHANGE if ( $last_day ne $day) { if ($last_day) { + +# Вычисляем разность множеств. +# Что-то вроде этого, если бы так можно было писать: +# @new_commands = keys %CommandsFDistribution - @known_commands; + + $result .= "

".$Day_Name[$last_wday]."

"; - #$result .= "Новые команды
"; + + my $new_commands_section = make_new_commands_table(\@known_commands); + @known_commands = keys %CommandsFDistribution; + + if ($new_commands_section) { + $result .= "
Новые команды
" + . "" + . "" + . $new_commands_section + . "
КомандаОписание
" + } + $result .= "\n"; $result .= $this_day_result; $result .= "
"; @@ -614,17 +630,53 @@ $this_day_result .= "\n"; $this_day_result .= "\n"; } + last: { + my $new_commands_section = make_new_commands_table(\@known_commands); + @known_commands = keys %CommandsFDistribution; - $result .= "

".$Day_Name[$last_wday]."

"; - $result .= "\n"; - $result .= $this_day_result; - $result .= "
"; + $result .= "

".$Day_Name[$last_wday]."

"; + if ($new_commands_section) { + $result .= "
Новые команды
" + . "" + . "" + . $new_commands_section + . "
КомандаОписание
" + } + + $result .= "\n"; + $result .= $this_day_result; + $result .= "
"; + } return ($result, collapse_list (\@toc)); } +sub make_new_commands_table +{ + my @known_commands = @{$_[0]}; + my %count; + my @new_commands = (); + for my $c (keys %CommandsFDistribution, @known_commands) { + $count{$c}++ + } + for my $c (keys %CommandsFDistribution) { + push @new_commands, $c if $count{$c} != 2; + } + + + my $new_commands_section; + if (@new_commands){ + my $hint; + for my $c (reverse sort { $CommandsFDistribution{$a} <=> $CommandsFDistribution{$b} } @new_commands) { + $hint = make_comment($c); + my ($command, $hint) = $hint =~ m/(.*?) \s*- \s*(.*)/; + $new_commands_section .= "$command$hint" if $hint; + } + } + return $new_commands_section; +} ############# @@ -796,7 +848,7 @@ LastCommand => "Время последней команды журнала", TotalCommands => "Количество командных строк в журнале", ErrorsPercentage => "Процент команд с ненулевым кодом завершения, %", - MistypesPercentage => "Процент синтаксически неверное набранных команд, %", + MistypesPercentage => "Процент синтаксически неверно набранных команд, %", TotalTime => "Суммарное время работы с терминалом *, час", CommandsPerTime => "Количество командных строк в единицу времени, команда/мин", CommandsFrequency => "Частота использования команд", @@ -914,6 +966,21 @@ должна быть указана программа script.

  • + Команды, при наборе которых были допущены синтаксические ошибки, + выводятся перечёркнутым текстом: + + + + +
    +
    +\$ l s-l
    +
    bash: l: command not found
    +
    +
    +
    +

  • +
  • Если код завершения команды равен нулю, команда была выполнена без ошибок. Команды, код завершения которых отличен от нуля, выделяются цветом. @@ -921,12 +988,14 @@

    -\$ l s-l
    -
    bash: l: command not found
    +\$ test 5 -lt 4
    + Обратите внимание на то, что код завершения команды может быть отличен от нуля + не только в тех случаях, когда команда была выполнена с ошибкой. + Многие команды используют код завершения, например, для того чтобы показать результаты проверки

  • @@ -1003,6 +1072,22 @@ Для того чтобы получить краткую справочную информацию о команде, нужно подвести к ней мышь. Во всплывающей подсказке появится краткое описание команды. +

    +

    + Если справочная информация о команде есть, + команда выделяется голубым фоном, например: vi. + Если справочная информация отсутствует, + команда выделяется розовым фоном, например: notepad.exe. + Справочная информация может отсутствовать в том случае, + если (1) команда введена неверно; (2) если распознавание команды LiLaLo выполнено неверно; + (3) если информация о команде неизвестна LiLaLo. + Последнее возможно для редких команд. +

  • +
  • + Большие, в особенности многострочные, всплывающие подсказки лучше + всего показываются браузерами KDE Konqueror, Apple Safari и Microsoft Internet Explorer. + В браузерах Mozilla и Firefox они отображаются не полностью, + а вместо перевода строки выводится специальный символ.

  • Время ввода команды, показанное в журнале, соответствует времени diff -r 43aeb3036aaa -r 187b6636a3be l3scripts --- a/l3scripts Wed Dec 28 01:01:00 2005 +0200 +++ b/l3scripts Wed Dec 28 18:44:42 2005 +0200 @@ -88,7 +88,7 @@ высылаю вам журналы лабораторных работ по курсу $course, который проходил начиная с $date в УЦ Сетевые Технологии (Киев). -Файл с архивом прикреплен к письму. +Файл с архивом прикреплён к письму. Пишите, если у вас будут любые замечания/советы/вопросы по методическому пособию или системе ведения журналов.