# HG changeset patch # User devi # Date 1133014552 -7200 # Node ID 568bab7090fc349ce2e9c4bb67d809e8a18e810f # Parent fcd63bc2bfa0341321454368f4bdfc9f4ed7353d l3-cgi: Журналы могут быть сохранены в файл, l3: Отправка файлов журналов по электронной почте. l3 do send-logs Новые параметры: cgi2file - имя файла, в который будет выполняться запись cgi_path_info - путь к странице, которая должна быть записана в файл (то что вводится в браузер после l3/location) diff -r fcd63bc2bfa0 -r 568bab7090fc l3-cgi --- a/l3-cgi Wed Nov 23 00:18:36 2005 +0200 +++ b/l3-cgi Sat Nov 26 16:15:52 2005 +0200 @@ -8,6 +8,7 @@ BEGIN { chdir("/home/devi/cvs/lilalo"); require l3config; + l3config::init_config(); }; my %filter; @@ -22,23 +23,29 @@ my %Machines; my $print = ""; +$l3config::Config{cgi2file} = $ENV{cgi2file} if defined($ENV{cgi2file}); +$ENV{PATH_INFO} = $l3config::Config{cgi_path_info} if $l3config::Config{cgi_path_info}; + my $is_not_cgi=""; -$is_not_cgi = "1" if defined($ENV{l3_to_file}); +$is_not_cgi = "1" if $l3config::Config{cgi2file}; # Пока что мы считаем, что вызов выполняется через CGI, -# если не установлена переменная l3_to_file +# если не установлена переменная cgi2file +# и не передан такой аргумент командной строки. # Это неверно, но как временное решение - пойдёт +my $to_file = $l3config::Config{cgi2file}; $l3config::Config{frontend_css} =~ s@^/@@ if $is_not_cgi; sub load_training { - my $classfile = - $_[0]|| - $l3config::Config{"classfile"} || - $l3config::Config{"path_classes"}."/".$l3config::Config{"class"}.$l3config::Config{"class_suffix"}; + my $training_file; + + $training_file = $l3config::Config{"path_classes"}.$_[0].$l3config::Config{"class_suffix"} if $_[0]; + $training_file ||= $l3config::Config{"classfile"} || + $l3config::Config{"path_classes"}.$l3config::Config{"class"}.$l3config::Config{"class_suffix"}; - my $XMLTraining = XMLin($classfile , ForceArray => [ 'student' ] ) - or die "Can't open file of the training ",$classfile,"\n"; + my $XMLTraining = XMLin($training_file , ForceArray => [ 'student' ] ) + or die "Can't open file of the training ",$training_file,"\n"; for my $student (@{$XMLTraining->{"student"}}) { $XMLTraining->{host}->{$student->{"host"}}=$student; @@ -53,6 +60,8 @@ my @training_files = glob($l3config::Config{"path_classes"}."/*".$l3config::Config{"class_suffix"}); if (@training_files) { for my $training_file (@training_files) { + $training_file =~ s@.*/@@; + $training_file =~ s@$l3config::Config{"class_suffix"}$@@; my $training = load_training($training_file); $Trainings{$training->{"date"}}=$training; } @@ -91,54 +100,9 @@ $print .= "Template to load files: ".$l3config::Config{"path_classes"}."*".$l3config::Config{"class_suffix"}."\n" } } -elsif ($ENV{PATH_INFO} eq "/current/index" || $ENV{PATH_INFO} eq "") { - my $t = load_training(); - - $print .= "\n"; - $print .= "\n"; - $print .= "Журналы лабораторных работ\n"; - $print .= "\n"; - $print .= "\n"; - $print .= "\n"; - $print .= "

Журналы лабораторных работ

\n"; - $print .= "\n"; - $print .= "\n"; - $print .= ""; - $print .= ""; - $print .= ""; - $print .= "\n"; - for my $host (sort keys %{$t->{host}}) { - - my $prefix = "/cgi-bin/l3/current/"; - my $suffix = ""; - if ($is_not_cgi) { - $prefix = ""; - $suffix = ".html"; - } - - $print .= "\n"; - my $h = $t->{host}->{$host}; - $print .= ""; - $print .= ""; - $print .= ""; - $print .= ""; - $print .= ""; - $print .= "\n"; - $print .= "\n"; - } - $print .= "\n"; - $print .= ""; - $print .= ""; - $print .= ""; - $print .= "\n"; - $print .= "
"."Имя"."ХостПользователь
".$h->{firstname}." ".$h->{surname}."$hostroot".$h->{user}."все
"."Инструктор"."from linux.nt"; - $print .= ""; - $print .= "все
\n"; - $print .= "\n"; - $print .= "\n"; -} elsif ($ENV{PATH_INFO} eq "/current") { - open (FRONTEND, "./l3-frontend --output - --show_comments no |"); + open (FRONTEND, "./l3-frontend --output - --show_comments no --frontend_css $l3config::Config{frontend_css}|"); + binmode FRONTEND, ":utf8"; while () { $print .= $_; } @@ -146,48 +110,120 @@ } else { # Вызов производится по URL - my ($skip, $course, $host, $user) = split /\//,$ENV{PATH_INFO},4; + $ENV{PATH_INFO} = "/".$ENV{PATH_INFO} unless $ENV{PATH_INFO} =~ m@^/@; + my ($skip, $training, $host, $user) = split /\//,$ENV{PATH_INFO},4; - $l3config::Config{"class"}=$course if $course ne 'current'; - $XMLTraining = load_training; + if (!$host || $host eq "index") { + # Нам неизвестен курс или явно указан просмотр индекса + # Просматриваем его - my @args=( - "--output" => "-", - "--show_comments" => "no", - "--course-center" => $XMLTraining->{center}, - "--course-trainer" => $XMLTraining->{instructor}->{firstname}." ".$XMLTraining->{instructor}->{surname}, - "--course-student" => $XMLTraining->{host}->{$host}->{firstname}." ".$XMLTraining->{host}->{$host}->{surname}, - "--course-code" => $XMLTraining->{course}, - "--course-date" => $XMLTraining->{date}, - "--encoding" => $XMLTraining->{host}->{$host}->{charset}, - ); - if ($course ne 'current') { - push @args, ("--backend_datafile" => "/var/lilalo/lablogs-xml/$course/$host/$user.xml"); - } else { - $filter{hostname} = $host if $host; - $filter{user} = $user if $user; - push @args, ("--filter" => join ("&", (map("$_=$filter{$_}", keys %filter)))); - #push @args, ("--filter" => "hostname=".$host."&user=".$user); + my $t = load_training($training); + $training ||= "current"; + + $print .= "\n"; + $print .= "\n"; + $print .= "Журналы лабораторных работ\n"; + $print .= "\n"; + $print .= "\n"; + $print .= "\n"; + $print .= "

Журналы лабораторных работ

\n"; + $print .= "\n"; + $print .= "\n"; + $print .= ""; + $print .= ""; + $print .= ""; + $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}; + $print .= ""; + $print .= ""; + $print .= ""; + $print .= ""; + $print .= ""; + $print .= "\n"; + $print .= "\n"; + + if ($is_not_cgi) { + # Это грязный хак + # Если мы чувствуем, что нас вызывают для генерения индексного файла, + # нам нужно создать и файлы, на которые он указывает + # Лучше было бы это сделать хотя бы через вызов функций + 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 ". + "--frontend_css ../$l3config::Config{frontend_css}"); + system("$0 --cgi2file $path/$prefix$host/".$h->{user}."$suffix ". + "--cgi_path_info ".$training."/".$host."/".$h->{user}." ". + "--frontend_css ../$l3config::Config{frontend_css}"); + } + + } + $print .= "\n"; + $print .= ""; + $print .= ""; + $print .= ""; + $print .= "\n"; + $print .= "
"."Имя"."ХостПользователь
".$h->{firstname}." ".$h->{surname}."$hostroot".$h->{user}."все
"."Инструктор"."from linux.nt"; + $print .= ""; + $print .= "все
\n"; + $print .= "\n"; + $print .= "\n"; } + else { - open (FRONTEND, "./l3-frontend ".join(" ",map("\"$_\"",@args))." |"); - while () { - $print .= $_; + $l3config::Config{"class"}=$training if $training ne 'current'; + $XMLTraining = load_training; + + my @args=( + "--output" => "-", + "--show_comments" => "no", + "--course-center" => $XMLTraining->{center}, + "--course-trainer" => $XMLTraining->{instructor}->{firstname}." ".$XMLTraining->{instructor}->{surname}, + "--course-student" => $XMLTraining->{host}->{$host}->{firstname}." ".$XMLTraining->{host}->{$host}->{surname}, + "--course-code" => $XMLTraining->{course}, + "--course-date" => $XMLTraining->{date}, + "--encoding" => $XMLTraining->{host}->{$host}->{charset}, + ); + if ($training ne 'current') { + push @args, ("--backend_datafile" => "/var/lilalo/lablogs-xml/$training/$host/$user.xml"); + } else { + $filter{hostname} = $host if $host; + $filter{user} = $user if $user; + push @args, ("--filter" => join ("&", (map("$_=$filter{$_}", keys %filter)))); + #push @args, ("--filter" => "hostname=".$host."&user=".$user); + } + + open (FRONTEND, "./l3-frontend --frontend_css $l3config::Config{frontend_css} ".join(" ",map("\"$_\"",@args))." |"); + binmode FRONTEND, ":utf8"; + while () { + $print .= $_; + } + close(FRONTEND); } - close(FRONTEND); } # Если задана переменная окружения l3_to_file, # печатаем в файл с соответствующим именем, # в противном случае -- выводим на стандартный поток вывода -if (not defined $ENV{l3_to_file}) { +if (not $to_file) { binmode STDOUT, ":utf8"; print header(-charset => "utf-8"); print $print; } else { - open(FILE, ">:utf8", $ENV{l3_to_file}) - or die "Can't open $ENV{l3_to_file} for writing"; + open(FILE, ">:utf8", $to_file) + or die "Can't open $to_file for writing"; print FILE $print; close(FILE); } diff -r fcd63bc2bfa0 -r 568bab7090fc l3-frontend --- a/l3-frontend Wed Nov 23 00:18:36 2005 +0200 +++ b/l3-frontend Sat Nov 26 16:15:52 2005 +0200 @@ -396,12 +396,12 @@ my $last_day=""; my $in_range=0; - my $i=0; + my $current_command=0; COMMAND_LINE: for my $k (@Command_Lines_Index) { - my $cl=$Command_Lines[$Command_Lines_Index[$i++]]; + my $cl=$Command_Lines[$Command_Lines_Index[$current_command++]]; next unless $cl; @@ -411,11 +411,14 @@ my %filter; for (split /&/,$Config{filter}) { my ($var, $val) = split /=/; - $filter{$var} = $val; + $filter{$var} = $val || ""; } for my $filter_key (keys %filter) { - next COMMAND_LINE unless $Sessions{$cl->{local_session_id}}->{$filter_key} eq $filter{$filter_key}; + next COMMAND_LINE unless ( + not defined($cl->{local_session_id}) + || not defined($Sessions{$cl->{local_session_id}}->{$filter_key}) + || $Sessions{$cl->{local_session_id}}->{$filter_key} eq $filter{$filter_key}); } #if ($filter{user}) { @@ -494,7 +497,7 @@ $mark=0; } $output .= $Config{"skip_text"}."\n" if $mark; - for (my $i=$start; $i<= $#lines; $i++) { + for ($i=$start; $i<= $#lines; $i++) { $output .= $lines[$i]."\n"; } } @@ -548,7 +551,9 @@ if ( $last_tty ne $cl->{"tty"}) { my $host; #$host = $Sessions{$cl->{local_session_id}}->{user}."@".$Sessions{$cl->{local_session_id}}->{hostname}; - $Result{"body"} .= "
".$cl->{"tty"}."$host
"; + my $body = $cl->{"tty"}; + $body .= " \@$host" if $host; + $Result{"body"} .= "
".$body."
"; $last_tty=$cl->{"tty"}; } @@ -656,9 +661,10 @@ my %CommandsFrequency = %CommandsFDistribution; - my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($Stat{FirstCommand}); + $Stat{TotalTime} ||= 0; + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($Stat{FirstCommand} || 0); $Stat{FirstCommand} = sprintf "%02i:%02i:%02i %04i-%2i-%2i", $hour, $min, $sec, $year+1900, $mon+1, $mday; - ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($Stat{LastCommand}); + ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($Stat{LastCommand} || 0); $Stat{LastCommand} = sprintf "%02i:%02i:%02i %04i-%2i-%2i", $hour, $min, $sec, $year+1900, $mon+1, $mday; $Stat{ErrorsPercentage} = sprintf "%5.2f", $Stat{ErrorCommands}*100/$Stat{TotalCommands} if $Stat{TotalCommands}; @@ -753,6 +759,10 @@ my $toc = collapse_list (\@toc); $Result{"header"} .= < + + +
Содержание
+ + +

Журнал

HEADER @@ -894,6 +907,22 @@

  • + Для того чтобы изменить файл в соответствии с показанными в диффшоте + изменениями, можно воспользоваться командой patch. + Нужно скопировать изменения, запустить программу patch, указав в + качестве её аргумента файл, к которому применяются изменения, + и всавить скопированный текст: + + + + +
    +
    +\$ patch ~/.bashrc
    +
    + В данном случае изменения применяются к файлу ~/.bashrc +

  • +
  • Для того чтобы получить краткую справочную информацию о команде, нужно подвести к ней мышь. Во всплывающей подсказке появится краткое описание команды. diff -r fcd63bc2bfa0 -r 568bab7090fc l3config.pm --- a/l3config.pm Wed Nov 23 00:18:36 2005 +0200 +++ b/l3config.pm Sat Nov 26 16:15:52 2005 +0200 @@ -127,6 +127,9 @@ "l3scripts" => "l3scripts", + + "cgi_path_info" => "", + "cgi2file" => "", ); sub read_config_file diff -r fcd63bc2bfa0 -r 568bab7090fc l3scripts --- a/l3scripts Wed Nov 23 00:18:36 2005 +0200 +++ b/l3scripts Sat Nov 26 16:15:52 2005 +0200 @@ -64,8 +64,7 @@ rm -rf /tmp/lilalo-$course-$date 2> /dev/null mkdir -p /tmp/lilalo-$course-$date/l3 cp /var/www/l3/* /tmp/lilalo-$course-$date/l3 -export l3_to_file=/tmp/lilalo-$course-$date/index.html -./l3-cgi +./l3-cgi --cgi2file /tmp/lilalo-$course-$date/index.html --cgi_path_info $date cd /tmp rm -rf lilalo-$course-$date.zip 2> /dev/null zip -r lilalo-$course-$date.zip lilalo-$course-$date @@ -77,13 +76,13 @@ $firstname, высылаю вам журналы лабораторных работ по курсу $course, -который проходил на этой неделе (начался $date). +который проходил начиная с $date в УЦ Сетевые Технологии (Киев). Файл с архивом прикреплен к письму. Пишите, если у вас будут любые замечания/советы/вопросы по методическому пособию или системе ведения журналов. Если нужна будет помощь по курсу или темам, -связанным с ним -- спрашивайте. +связанным с ним -- обязательно спрашивайте. Надеюсь, что смогу вам помочь. Пожалуйста, напишите ответ, если вы получили это письмо,