lilalo

changeset 57:187b6636a3be

l3-agent:
Исправлен микробаг с uid
Раньше он не отправлялся в поток

l3-cgi:
При генерировании не CGI-версии
в таблице отсутствуют поля "инструктор" и "все"
На текущий момент они указывали в никуда,
поэтому я отключил их

l3-frontend:
Выводятся новые команды в начале каждого дня.
Команды сортируются по убыванию частоты использования.

l3scripts:
в письмо в одном месте е заменил на ё
author devi
date Wed Dec 28 18:44:42 2005 +0200 (2005-12-28)
parents 43aeb3036aaa
children 93e98a3fa44d
files l3-agent l3-cgi l3-frontend l3scripts
line diff
     1.1 --- a/l3-agent	Wed Dec 28 01:01:00 2005 +0200
     1.2 +++ b/l3-agent	Wed Dec 28 18:44:42 2005 +0200
     1.3 @@ -813,6 +813,7 @@
     1.4  		print OUT "<raw_end>",$cl->{raw_end},"</raw_end>\n";
     1.5  		print OUT "<raw_file>",$cl->{raw_file},"</raw_file>\n";
     1.6  		print OUT "<tty>",$cl->{tty},"</tty>\n";
     1.7 +		print OUT "<uid>",$cl->{uid},"</uid>\n";
     1.8  		print OUT "<out_class>",$out_class,"</out_class>\n";
     1.9  		print OUT "<err>",$cl->{err},"</err>\n";
    1.10  		print OUT "<prompt>";
     2.1 --- a/l3-cgi	Wed Dec 28 01:01:00 2005 +0200
     2.2 +++ b/l3-cgi	Wed Dec 28 18:44:42 2005 +0200
     2.3 @@ -120,9 +120,19 @@
     2.4  		my $t = load_training($training);
     2.5  		$training ||= "current";
     2.6  
     2.7 +        my $prefix = "/cgi-bin/l3/$training/";
     2.8 +        my $suffix = "";
     2.9 +        if ($is_not_cgi) {
    2.10 +            $prefix = "";
    2.11 +            $suffix = ".html";
    2.12 +        }
    2.13 +        my $path = $to_file;
    2.14 +        $path = "" unless $path =~ s@/[^/]*$@@;
    2.15 +
    2.16  		$print .= "<html>\n";
    2.17  		$print .= "<head>\n";
    2.18  		$print .= "<title>Журналы лабораторных работ</title>\n";
    2.19 +        $print .= "<meta content='text/html; charset=utf-8' http-equiv='Content-Type' />";
    2.20  		$print .= "<link rel='stylesheet' href='".$l3config::Config{frontend_css}."' type='text/css'/>\n";
    2.21  		$print .= "</head>\n";
    2.22  		$print .= "<body>\n";
    2.23 @@ -135,12 +145,6 @@
    2.24  		$print .= "</tr>\n";
    2.25  		for my $host (sort keys %{$t->{host}}) {
    2.26  
    2.27 -			my $prefix = "/cgi-bin/l3/$training/";
    2.28 -			my $suffix = "";
    2.29 -			if ($is_not_cgi) {
    2.30 -				$prefix = "";
    2.31 -				$suffix = ".html";
    2.32 -			}
    2.33  			
    2.34  			$print .= "<tr>\n";
    2.35  			my $h = $t->{host}->{$host};
    2.36 @@ -148,7 +152,7 @@
    2.37  			$print .= "<td>$host</td>";
    2.38  			$print .= "<td><a href='".$prefix.$host."/root$suffix'>root</a></td>";
    2.39  			$print .= "<td><a href='".$prefix.$host."/".$h->{user}."$suffix'>".$h->{user}."</a></td>";
    2.40 -			$print .= "<td><a href='".$prefix.$host."$suffix'>все</a></td>";
    2.41 +			$print .= "<td><a href='".$prefix.$host."$suffix'>все</a></td>" if not $is_not_cgi;
    2.42  			$print .= "</td>\n";
    2.43  			$print .= "</tr>\n";
    2.44  
    2.45 @@ -157,8 +161,7 @@
    2.46  				# Если мы чувствуем, что нас вызывают для генерения индексного файла,
    2.47  				# нам нужно создать и файлы, на которые он указывает
    2.48  				# Лучше было бы это сделать хотя бы через вызов функций
    2.49 -				my $path = $to_file;
    2.50 -				$path = "" unless $path =~ s@/[^/]*$@@;
    2.51 +# Такой же хак чуть ниже
    2.52  				mkdir("$path/$host");
    2.53  				system("$0 --cgi2file $path/$prefix$host/root$suffix  ".
    2.54  					  "--cgi_path_info ".$training."/".$host."/root ".
    2.55 @@ -166,15 +169,27 @@
    2.56  				system("$0 --cgi2file $path/$prefix$host/".$h->{user}."$suffix ".
    2.57  					  "--cgi_path_info ".$training."/".$host."/".$h->{user}." ".
    2.58  					  "--frontend_css ../$l3config::Config{frontend_css}");
    2.59 +			#	system("$0 --cgi2file $path/$prefix$host$suffix ".
    2.60 +			#		  "--cgi_path_info ".$training."/".$host." ".
    2.61 +			#		  "--frontend_css ../$l3config::Config{frontend_css}");
    2.62  			}
    2.63  			
    2.64  		}
    2.65 -		$print .= "<tr>\n";
    2.66 -		$print .= "<td>"."Инструктор"."</td>";
    2.67 -		$print .= "<td>from linux.nt</td>";
    2.68 -		$print .= "<td/>";
    2.69 -		$print .= "<td/>";
    2.70 -		$print .= "<td><a href='/cgi-bin/l3/current"."?login_from=192.168.15.254'>все</a></td>";
    2.71 +# Такой же хак был чуть выше
    2.72 +        if ($is_not_cgi) {
    2.73 +#            $print .= "<td><a href='".$prefix."instructor.".$suffix."'>все</a></td>";
    2.74 +#            system("$0 --cgi2file $path/$prefix$host$suffix"
    2.75 +#                   . " --cgi_path_info ".$training."?login_from=192.168.15.254".$host
    2.76 +#                  . " --frontend_css ../$l3config::Config{frontend_css}");
    2.77 +        }
    2.78 +        else {
    2.79 +            $print .= "<tr>\n";
    2.80 +            $print .= "<td>"."Инструктор"."</td>";
    2.81 +            $print .= "<td>from linux.nt</td>";
    2.82 +            $print .= "<td/>";
    2.83 +            $print .= "<td/>";
    2.84 +            $print .= "<td><a href='$training"."?login_from=192.168.15.254'>все</a></td>";
    2.85 +        }
    2.86  		$print .= "</tr>\n";
    2.87  		$print .= "</table>\n";
    2.88  		$print .= "</body>\n";
     3.1 --- a/l3-frontend	Wed Dec 28 01:01:00 2005 +0200
     3.2 +++ b/l3-frontend	Wed Dec 28 18:44:42 2005 +0200
     3.3 @@ -26,6 +26,7 @@
     3.4  my %mywi_cache_for;         # Кэш для экономии обращений к mywi
     3.5  
     3.6  sub make_comment;
     3.7 +sub make_new_commands_table;
     3.8  sub load_command_lines_from_xml;
     3.9  sub load_sessions_from_xml;
    3.10  sub sort_command_lines;
    3.11 @@ -301,9 +302,10 @@
    3.12          $$cl->{"class"} =   $$cl->{"err"} eq 130 ?  "interrupted"
    3.13                          :   $$cl->{"err"} eq 127 ?  "mistyped"
    3.14                          :   $$cl->{"err"}        ?  "wrong"
    3.15 -                        :                           "";
    3.16 +                        :                           "normal";
    3.17  
    3.18 -        if (!$$cl->{"euid"}) {
    3.19 +        if ($$cl->{"cline"} =~ /[^|`]\s*sudo/
    3.20 +            || $$cl->{"uid"} eq 0) {
    3.21              $$cl->{"class"}.="_root";
    3.22          }
    3.23  
    3.24 @@ -389,6 +391,8 @@
    3.25  
    3.26      my $current_command=0;
    3.27  
    3.28 +    my @known_commands;
    3.29 +
    3.30      my %filter;
    3.31  
    3.32      if ($Config{filter}) {
    3.33 @@ -460,9 +464,9 @@
    3.34              $note = join ("\n", map ("<p>$_</p>", split (/-\n/, $note)));
    3.35              $note =~ s@(http:[a-zA-Z.0-9/?\_%-]*)@<a href='$1'>$1</a>@g;
    3.36              $note =~ s@(www\.[a-zA-Z.0-9/?\_%-]*)@<a href='$1'>$1</a>@g;
    3.37 -            $result .= "<tr><td colspan='6'>";
    3.38 -            $result .= "<h4 id='note$note_number'>".$cl->{note_title}."</h4>" if $cl->{note_title};
    3.39 -            $result .= "".$note."<p/><p/></td></td>";
    3.40 +            $this_day_result .= "<tr><td colspan='6'>"
    3.41 +                             .  "<h4 id='note$note_number'>".$cl->{note_title}."</h4>" if $cl->{note_title}
    3.42 +                             .  "".$note."<p/><p/></td></tr>";
    3.43  
    3.44              if ($cl->{note_title}) {
    3.45                  push @{$toc[@toc]},"<a href='#note$note_number'>".$cl->{note_title}."</a>";
    3.46 @@ -508,11 +512,6 @@
    3.47          $hour = "0".$hour if $hour =~ /^.$/;
    3.48          $sec  = "0".$sec  if $sec  =~ /^.$/;
    3.49  
    3.50 -        #my @new_commands;
    3.51 -        #my @new_files;
    3.52 -        #@new_commands = split (/\s+/, $cl->{"new_commands"}) if defined $cl->{"new_commands"};
    3.53 -        #@new_files = split (/\s+/, $cl->{"new_files"}) if defined $cl->{"new_files"};
    3.54 -
    3.55          $class=$cl->{"class"};
    3.56          $Stat{ErrorCommands}++          if $class =~ /wrong/;
    3.57          $Stat{MistypedCommands}++       if $class =~ /mistype/;
    3.58 @@ -521,8 +520,25 @@
    3.59  # DAY CHANGE
    3.60          if ( $last_day ne $day) {
    3.61              if ($last_day) {
    3.62 +
    3.63 +# Вычисляем разность множеств.
    3.64 +# Что-то вроде этого, если бы так можно было писать:
    3.65 +#   @new_commands = keys %CommandsFDistribution - @known_commands;
    3.66 +
    3.67 +
    3.68                  $result .= "<h3 id='day$last_day'>".$Day_Name[$last_wday]."</h3>";
    3.69 -                #$result .= "Новые команды<br/>";
    3.70 +
    3.71 +                my $new_commands_section = make_new_commands_table(\@known_commands);
    3.72 +                @known_commands = keys %CommandsFDistribution;
    3.73 +
    3.74 +                if ($new_commands_section) {
    3.75 +                    $result .= "<h5>Новые команды</h5>"
    3.76 +                            .  "<table class='new_commands_table'>"
    3.77 +                            .  "<tr class='new_commands_header'><td>Команда</td><td>Описание</td></tr>"
    3.78 +                            .  $new_commands_section 
    3.79 +                            .  "</table>"
    3.80 +                }
    3.81 +
    3.82                  $result .= "<table width='100%'>\n";
    3.83                  $result .= $this_day_result;
    3.84                  $result .= "</table>";
    3.85 @@ -614,17 +630,53 @@
    3.86          $this_day_result .= "</td>\n";
    3.87          $this_day_result .= "</tr>\n";
    3.88      }
    3.89 +    last: {
    3.90 +        my $new_commands_section = make_new_commands_table(\@known_commands);
    3.91 +        @known_commands = keys %CommandsFDistribution;
    3.92  
    3.93 -    $result .= "<h3 id='day$last_day'>".$Day_Name[$last_wday]."</h3>";
    3.94 -    $result .= "<table width='100%'>\n";
    3.95 -    $result .= $this_day_result;
    3.96 -    $result .= "</table>";
    3.97 +        $result .= "<h3 id='day$last_day'>".$Day_Name[$last_wday]."</h3>";
    3.98 +        if ($new_commands_section) {
    3.99 +            $result .= "<h5>Новые команды</h5>"
   3.100 +                    .  "<table class='new_commands_table'>"
   3.101 +                    .  "<tr class='new_commands_header'><td>Команда</td><td>Описание</td></tr>"
   3.102 +                    .  $new_commands_section 
   3.103 +                    .  "</table>"
   3.104 +        }
   3.105 +
   3.106 +        $result .= "<table width='100%'>\n";
   3.107 +        $result .= $this_day_result;
   3.108 +        $result .= "</table>";
   3.109 +   }
   3.110  
   3.111      return ($result, collapse_list (\@toc));
   3.112  
   3.113  }
   3.114  
   3.115 +sub make_new_commands_table
   3.116 +{
   3.117 +    my @known_commands = @{$_[0]};
   3.118  
   3.119 +    my %count;
   3.120 +    my @new_commands = ();
   3.121 +    for my $c (keys %CommandsFDistribution, @known_commands) {
   3.122 +        $count{$c}++
   3.123 +    }
   3.124 +    for my $c (keys %CommandsFDistribution) {
   3.125 +        push @new_commands, $c if $count{$c} != 2;
   3.126 +    }
   3.127 +
   3.128 +    
   3.129 +    my $new_commands_section;
   3.130 +    if (@new_commands){
   3.131 +        my $hint;
   3.132 +        for my $c (reverse sort { $CommandsFDistribution{$a} <=> $CommandsFDistribution{$b} } @new_commands) {
   3.133 +                $hint = make_comment($c);
   3.134 +                my ($command, $hint) = $hint =~ m/(.*?) \s*- \s*(.*)/;
   3.135 +                $new_commands_section .= "<tr><td>$command</td><td>$hint</td></tr>"  if $hint;
   3.136 +        }
   3.137 +    }
   3.138 +    return $new_commands_section;
   3.139 +}
   3.140  
   3.141  
   3.142  #############
   3.143 @@ -796,7 +848,7 @@
   3.144          LastCommand         => "Время последней команды журнала",
   3.145          TotalCommands       => "Количество командных строк в журнале",
   3.146          ErrorsPercentage    => "Процент команд с ненулевым кодом завершения, %",
   3.147 -        MistypesPercentage  => "Процент синтаксически неверное набранных команд, %",
   3.148 +        MistypesPercentage  => "Процент синтаксически неверно набранных команд, %",
   3.149          TotalTime           => "Суммарное время работы с терминалом <sup><font size='-2'>*</font></sup>, час",
   3.150          CommandsPerTime     => "Количество командных строк в единицу времени, команда/мин",
   3.151          CommandsFrequency   => "Частота использования команд",
   3.152 @@ -914,6 +966,21 @@
   3.153      должна быть указана программа script.
   3.154      </p></li>
   3.155      <li><p>
   3.156 +    Команды, при наборе которых были допущены синтаксические ошибки, 
   3.157 +    выводятся перечёркнутым текстом:
   3.158 +<table>
   3.159 +<tr class='command'>
   3.160 +<td class='script'>
   3.161 +<pre class='mistyped_cline'>
   3.162 +\$ l s-l</pre>
   3.163 +<pre class='mistyped_output'>bash: l: command not found
   3.164 +</pre>
   3.165 +</td>
   3.166 +</tr>
   3.167 +</table>
   3.168 +<br/>
   3.169 +    </p></li>
   3.170 +    <li><p>
   3.171      Если код завершения команды равен нулю, 
   3.172      команда была выполнена без ошибок.
   3.173      Команды, код завершения которых отличен от нуля, выделяются цветом.
   3.174 @@ -921,12 +988,14 @@
   3.175  <tr class='command'>
   3.176  <td class='script'>
   3.177  <pre class='wrong_cline'>
   3.178 -\$ l s-l</pre>
   3.179 -<pre class='wrong_output'>bash: l: command not found
   3.180 +\$ test 5 -lt 4</pre>
   3.181  </pre>
   3.182  </td>
   3.183  </tr>
   3.184  </table>
   3.185 +    Обратите внимание на то, что код завершения команды может быть отличен от нуля
   3.186 +    не только в тех случаях, когда команда была выполнена с ошибкой.
   3.187 +    Многие команды используют код завершения, например, для того чтобы показать результаты проверки
   3.188  <br/>
   3.189      </p></li>
   3.190      <li><p>
   3.191 @@ -1003,6 +1072,22 @@
   3.192      Для того чтобы получить краткую справочную информацию о команде, 
   3.193      нужно подвести к ней мышь. Во всплывающей подсказке появится краткое
   3.194      описание команды.
   3.195 +    </p>
   3.196 +    <p>
   3.197 +    Если справочная информация о команде есть, 
   3.198 +    команда выделяется голубым фоном, например: <span class="with_hint" title="главный текстовый редактор Unix">vi</span>.
   3.199 +    Если справочная информация отсутствует,
   3.200 +    команда выделяется розовым фоном, например: <span class="without_hint">notepad.exe</span>.
   3.201 +    Справочная информация может отсутствовать в том случае, 
   3.202 +    если (1) команда введена неверно; (2) если распознавание команды LiLaLo выполнено неверно;
   3.203 +    (3) если информация о команде неизвестна LiLaLo.
   3.204 +    Последнее возможно для редких команд.
   3.205 +    </p></li>
   3.206 +    <li><p>
   3.207 +    Большие, в особенности многострочные, всплывающие подсказки лучше 
   3.208 +    всего показываются браузерами KDE Konqueror, Apple Safari и Microsoft Internet Explorer.
   3.209 +    В браузерах Mozilla и Firefox они отображаются не полностью, 
   3.210 +    а вместо перевода строки выводится специальный символ.
   3.211      </p></li>
   3.212      <li><p>
   3.213      Время ввода команды, показанное в журнале, соответствует времени 
     4.1 --- a/l3scripts	Wed Dec 28 01:01:00 2005 +0200
     4.2 +++ b/l3scripts	Wed Dec 28 18:44:42 2005 +0200
     4.3 @@ -88,7 +88,7 @@
     4.4  
     4.5  высылаю вам журналы лабораторных работ по курсу $course,
     4.6  который проходил начиная с $date в УЦ Сетевые Технологии (Киев).
     4.7 -Файл с архивом прикреплен к письму.
     4.8 +Файл с архивом прикреплён к письму.
     4.9  
    4.10  Пишите, если у вас будут любые замечания/советы/вопросы 
    4.11  по методическому пособию или системе ведения журналов.