# HG changeset patch
# User devi
# Date 1140847345 -7200
# Node ID 2cb912bff2ea265549efce8f94770550b68c9015
# Parent  bdc1f02d3f87028025d29e61e70f30c36fedba95
* В журнале выводится имя курса, а не только его код
* Исправлена ошибка с фильтром при чтении журнала из XML-репозитория
  Теперь всё ок

diff -r bdc1f02d3f87 -r 2cb912bff2ea l3-agent
--- a/l3-agent	Fri Feb 24 18:43:35 2006 +0200
+++ b/l3-agent	Sat Feb 25 08:02:25 2006 +0200
@@ -279,6 +279,9 @@
                 #Загруженную информацию сразу же отправляем в поток
                 print_session($Config{cache}, $local_session_id);
             }
+            else {
+                die "can't open session file";
+            }
         }
 
         open (FILE, "$file");
@@ -581,10 +584,12 @@
     @Command_Lines_Index = sort {
         defined($Command_Lines[$index[$a]]->{"time"}) 
         ?  $Command_Lines[$index[$a]]->{"time"} <=> $Command_Lines[$index[$b]]->{"time"} 
-        :  $Command_Lines[$index[$a]]->{"day"} cmp $Command_Lines[$index[$b]]->{"day"} 
+        :  defined($Command_Lines[$index[$a]]->{"day"})
+        ?  $Command_Lines[$index[$a]]->{"day"} cmp $Command_Lines[$index[$b]]->{"day"} 
         || $Command_Lines[$index[$a]]->{"hour"} <=> $Command_Lines[$index[$b]]->{"hour"}
         || $Command_Lines[$index[$a]]->{"min"} <=> $Command_Lines[$index[$b]]->{"min"} 
         || $Command_Lines[$index[$a]]->{"sec"} <=> $Command_Lines[$index[$b]]->{"sec"}
+        :  0
     } @index;
 
     print "finished\n" if $Config{"verbose"} =~ /y/;
@@ -738,12 +743,16 @@
     my $local_session_id = $_[1];
     return if not defined($Sessions{$local_session_id});
 
+    print "printing session info. session id = ".$local_session_id."\n"
+        if $Config{verbose} =~ /y/;
+
     open(OUT, ">>", $output_filename)
         or die "Can't open $output_filename for writing\n";
     print OUT "<session>\n";
     my %session = %{$Sessions{$local_session_id}};
     for my $key (keys %session) {
-        print OUT "<$key>".$session{$key}."</$key>\n"
+        print OUT "<$key>".$session{$key}."</$key>\n";
+        print "         ".$key,"\n";
     }
     print OUT "</session>\n";
     close(OUT);
diff -r bdc1f02d3f87 -r 2cb912bff2ea l3-cgi
--- a/l3-cgi	Fri Feb 24 18:43:35 2006 +0200
+++ b/l3-cgi	Sat Feb 25 08:02:25 2006 +0200
@@ -6,16 +6,16 @@
 use utf8;
 
 BEGIN {
-	chdir("/home/devi/cvs/lilalo");
-	require l3config;
-	l3config::init_config();
+    chdir("/home/devi/cvs/lilalo");
+    require l3config;
+    l3config::init_config();
 };
 
 my %filter;
 
 for my $key (qw(login_from local_session_id)) {
-	$filter{$key} =  param($key) if param($key);
-	$filter{$key} = $ENV{$key} if defined $ENV{$key};
+    $filter{$key} =     param($key) if param($key);
+    $filter{$key} =     $ENV{$key} if defined $ENV{$key};
 }
 
 my %Trainings;
@@ -23,7 +23,7 @@
 my %Machines;
 my $print = "";
 
-$l3config::Config{cgi2file} = $ENV{cgi2file}	if defined($ENV{cgi2file});
+$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="";
@@ -39,87 +39,93 @@
 sub load_training
 {
         my $training_file;
-	
-	$training_file = $l3config::Config{"path_classes"}.$_[0].$l3config::Config{"class_suffix"} if $_[0];
+    
+    $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($training_file , ForceArray => [ 'student' ] )  
                 or die "Can't open file of the training ",$training_file,"\n";
 
+        my $course_file = $l3config::Config{"courses_path"}.$XMLTraining->{"course"}.".xml";
+        my $XMLCourse;
+        if (eval{$XMLCourse = XMLin($course_file)}) {
+            $XMLTraining->{"course-name"} = $XMLCourse->{"fullname"};
+        }
+
         for my $student (@{$XMLTraining->{"student"}}) {
-		$XMLTraining->{host}->{$student->{"host"}}=$student;
+        $XMLTraining->{host}->{$student->{"host"}}=$student;
         }
-	return $XMLTraining;
+    return $XMLTraining;
 }
 
 
 
 if ($ENV{PATH_INFO} eq "/index") {
-	# Показываем индекс курсов
-	my @training_files = glob($l3config::Config{"path_classes"}."/2*".$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;
-		}
-		$print .= "<html>\n";
-		$print .= "<head>\n";
-		$print .= "<title>Журналы лабораторных работ</title>\n";
-		$print .= "</head>\n";
-		$print .= "<body>\n";
-		$print .= "<table>\n";
-		for my $tdate (reverse sort keys %Trainings) {
-			my $t = $Trainings{$tdate};
-			$print .= "<tr>";
-			$print .= "<td>".$t->{date}."</td>";
-			$print .= "<td>".$t->{course}."</td>";
-			$print .= "</tr>\n";
-			$print .= "<tr>";
-			$print .= "<td/>";
-			$print .= "<td><pre>";
-			for my $host (sort keys %{$t->{host}}) {
-				my $h = $t->{host}->{$host};
-				$print .= "$host";
-				$print .= " ".$h->{firstname}." ".$h->{surname}." ";
-				$print .= " ".$h->{company}." ";
-				$print .= "<a href='/cgi-bin/l3/".$tdate."/".$host."/root'>root</a> ";
-				$print .= "<a href='/cgi-bin/l3/".$tdate."/".$host."/".$h->{user}."'>".$h->{user}."</a> ";
-				$print .= "\n";
-			}
-			$print .= "</pre><td>";
-			$print .= "</tr>\n";
-		}
-		$print .= "</table>\n";
-		$print .= "</body>\n";
-		$print .= "</html>\n";
-	}
-	else {
-		$print .= "No training-files found<br/>\n";
-		$print .= "Template to load files: ".$l3config::Config{"path_classes"}."*".$l3config::Config{"class_suffix"}."\n"
-	}
+    # Показываем индекс курсов
+    my @training_files = glob($l3config::Config{"path_classes"}."/2*".$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;
+        }
+        $print .= "<html>\n";
+        $print .= "<head>\n";
+        $print .= "<title>Журналы лабораторных работ</title>\n";
+        $print .= "</head>\n";
+        $print .= "<body>\n";
+        $print .= "<table>\n";
+        for my $tdate (reverse sort keys %Trainings) {
+            my $t = $Trainings{$tdate};
+            $print .= "<tr>";
+            $print .= "<td>".$t->{date}."</td>";
+            $print .= "<td>".$t->{course}."</td>";
+            $print .= "</tr>\n";
+            $print .= "<tr>";
+            $print .= "<td/>";
+            $print .= "<td><pre>";
+            for my $host (sort keys %{$t->{host}}) {
+                my $h = $t->{host}->{$host};
+                $print .= "$host";
+                $print .= " ".$h->{firstname}." ".$h->{surname}." ";
+                $print .= " ".$h->{company}." ";
+                $print .= "<a href='/cgi-bin/l3/".$tdate."/".$host."/root'>root</a> ";
+                $print .= "<a href='/cgi-bin/l3/".$tdate."/".$host."/".$h->{user}."'>".$h->{user}."</a> ";
+                $print .= "\n";
+            }
+            $print .= "</pre><td>";
+            $print .= "</tr>\n";
+        }
+        $print .= "</table>\n";
+        $print .= "</body>\n";
+        $print .= "</html>\n";
+    }
+    else {
+        $print .= "No training-files found<br/>\n";
+        $print .= "Template to load files: ".$l3config::Config{"path_classes"}."*".$l3config::Config{"class_suffix"}."\n"
+    }
 }
 elsif ($ENV{PATH_INFO} eq "/current") {
-	open (FRONTEND, "./l3-frontend --output - --show_comments no --frontend_css $l3config::Config{frontend_css}|");
-	binmode FRONTEND, ":utf8";
-	while (<FRONTEND>) {
-		$print .= $_;
-	}
-	close(FRONTEND);
+    open (FRONTEND, "./l3-frontend --output - --show_comments no --frontend_css $l3config::Config{frontend_css}|");
+    binmode FRONTEND, ":utf8";
+    while (<FRONTEND>) {
+        $print .= $_;
+    }
+    close(FRONTEND);
 }
 else {
-	# Вызов производится по URL
-	$ENV{PATH_INFO} = "/".$ENV{PATH_INFO} unless $ENV{PATH_INFO} =~ m@^/@;
-	my ($skip, $training, $host, $user) = split /\//,$ENV{PATH_INFO},4;
+    # Вызов производится по URL
+    $ENV{PATH_INFO} = "/".$ENV{PATH_INFO} unless $ENV{PATH_INFO} =~ m@^/@;
+    my ($skip, $training, $host, $user) = split /\//,$ENV{PATH_INFO},4;
 
-	if (!$host || $host eq "index") {
-		# Нам неизвестен курс или явно указан просмотр индекса
-		# Просматриваем его
+    if (!$host || $host eq "index") {
+        # Нам неизвестен курс или явно указан просмотр индекса
+        # Просматриваем его
 
-		my $t = load_training($training);
-		$training ||= "current";
+        my $t = load_training($training);
+        $training ||= "current";
 
         my $prefix = "/cgi-bin/l3/$training/";
         my $suffix = "";
@@ -130,52 +136,50 @@
         my $path = $to_file;
         $path = "" unless $path =~ s@/[^/]*$@@;
 
-		$print .= "<html>\n";
-		$print .= "<head>\n";
-		$print .= "<title>Журналы лабораторных работ</title>\n";
+        $print .= "<html>\n";
+        $print .= "<head>\n";
+        $print .= "<title>Журналы лабораторных работ</title>\n";
         $print .= "<meta content='text/html; charset=utf-8' http-equiv='Content-Type' />";
-		$print .= "<link rel='stylesheet' href='".$l3config::Config{frontend_css}."' type='text/css'/>\n";
-		$print .= "</head>\n";
-		$print .= "<body>\n";
-		$print .= "<h1>Журналы лабораторных работ</h1>\n";
-		$print .= "<table>\n";
-		$print .= "<tr class='table_header'>\n";
-		$print .= "<td>"."Имя"."</td>";
-		$print .= "<td>Хост</td>";
-		$print .= "<td colspan='3'>Пользователь</td>";
-		$print .= "</tr>\n";
-		for my $host (sort keys %{$t->{host}}) {
+        $print .= "<link rel='stylesheet' href='".$l3config::Config{frontend_css}."' type='text/css'/>\n";
+        $print .= "</head>\n";
+        $print .= "<body>\n";
+        $print .= "<h1>Журналы лабораторных работ</h1>\n";
+        $print .= "<table>\n";
+        $print .= "<tr class='table_header'>\n";
+        $print .= "<td>"."Имя"."</td>";
+        $print .= "<td>Хост</td>";
+        $print .= "<td colspan='3'>Пользователь</td>";
+        $print .= "</tr>\n";
+        for my $host (sort keys %{$t->{host}}) {
+            $print .= "<tr>\n";
+            my $h = $t->{host}->{$host};
+            $print .= "<td>".$h->{firstname}." ".$h->{surname}."</td>";
+            $print .= "<td>$host</td>";
+            $print .= "<td><a href='".$prefix.$host."/root$suffix'>root</a></td>";
+            $print .= "<td><a href='".$prefix.$host."/".$h->{user}."$suffix'>".$h->{user}."</a></td>";
+            $print .= "<td><a href='".$prefix.$host."$suffix'>все</a></td>" if not $is_not_cgi;
+            $print .= "</td>\n";
+            $print .= "</tr>\n";
 
-			
-			$print .= "<tr>\n";
-			my $h = $t->{host}->{$host};
-			$print .= "<td>".$h->{firstname}." ".$h->{surname}."</td>";
-			$print .= "<td>$host</td>";
-			$print .= "<td><a href='".$prefix.$host."/root$suffix'>root</a></td>";
-			$print .= "<td><a href='".$prefix.$host."/".$h->{user}."$suffix'>".$h->{user}."</a></td>";
-			$print .= "<td><a href='".$prefix.$host."$suffix'>все</a></td>" if not $is_not_cgi;
-			$print .= "</td>\n";
-			$print .= "</tr>\n";
-
-			if ($is_not_cgi) {
-				# Это грязный хак
-				# Если мы чувствуем, что нас вызывают для генерения индексного файла,
-				# нам нужно создать и файлы, на которые он указывает
-				# Лучше было бы это сделать хотя бы через вызов функций
+            if ($is_not_cgi) {
+                # Это грязный хак
+                # Если мы чувствуем, что нас вызывают для генерения индексного файла,
+                # нам нужно создать и файлы, на которые он указывает
+                # Лучше было бы это сделать хотя бы через вызов функций
 # Такой же хак чуть ниже
-				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}");
-			#	system("$0 --cgi2file $path/$prefix$host$suffix ".
-			#		  "--cgi_path_info ".$training."/".$host." ".
-			#		  "--frontend_css ../$l3config::Config{frontend_css}");
-			}
-			
-		}
+                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}");
+            #   system("$0 --cgi2file $path/$prefix$host$suffix ".
+            #         "--cgi_path_info ".$training."/".$host." ".
+            #         "--frontend_css ../$l3config::Config{frontend_css}");
+            }
+            
+        }
 # Такой же хак был чуть выше
         if ($is_not_cgi) {
 #            $print .= "<td><a href='".$prefix."instructor.".$suffix."'>все</a></td>";
@@ -191,42 +195,45 @@
             $print .= "<td/>";
             $print .= "<td><a href='$training"."?login_from=192.168.15.254'>все</a></td>";
         }
-		$print .= "</tr>\n";
-		$print .= "</table>\n";
-		$print .= "</body>\n";
-		$print .= "</html>\n";
-	}
-	else {
+        $print .= "</tr>\n";
+        $print .= "</table>\n";
+        $print .= "</body>\n";
+        $print .= "</html>\n";
+    }
+    else {
 
-		$l3config::Config{"class"}=$training if $training ne 'current';
-		$XMLTraining = load_training;
+        $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);
-		}
+        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 ($XMLTraining->{"course-name"}) {
+            push @args, ("--course-name"     =>  $XMLTraining->{"course-name"});
+        };
+        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))));
 
-		open (FRONTEND, "./l3-frontend --frontend_css $l3config::Config{frontend_css} ".join(" ",map("\"$_\"",@args))." |");
-		binmode FRONTEND, ":utf8";
-		while (<FRONTEND>) {
-			$print .= $_;
-		}
-		close(FRONTEND);
-	}
+        #$print .= "./l3-frontend --frontend_css $l3config::Config{frontend_css} ".join(" ",map("\"$_\"",@args))." |<br/>";
+        open (FRONTEND, "./l3-frontend --frontend_css $l3config::Config{frontend_css} ".join(" ",map("\"$_\"",@args))." |");
+        binmode FRONTEND, ":utf8";
+        while (<FRONTEND>) {
+            $print .= $_;
+        }
+        close(FRONTEND);
+    }
 }
 
 # Если задана переменная окружения l3_to_file, 
diff -r bdc1f02d3f87 -r 2cb912bff2ea l3-frontend
--- a/l3-frontend	Fri Feb 24 18:43:35 2006 +0200
+++ b/l3-frontend	Sat Feb 25 08:02:25 2006 +0200
@@ -11,6 +11,7 @@
 our %Args_Description;
 our $Mywi_Socket;
 our %Sessions;
+our %filter;
 
 our %Files;
 
@@ -255,12 +256,13 @@
     my $data = <CLASS>;
     close(CLASS);
 
-    for my $session ($data =~ m@<session>(.*?)</session>@sg) {
-        my %session;
+    my $i=0;
+    for my $session ($data =~ m@<session>(.*?)</session>@msg) {
+        my %session_hash;
         while ($session =~ m@<([^>]*?)>(.*?)</\1>@sg) {
-            $session{$1} = $2;
+            $session_hash{$1} = $2;
         }
-        $Sessions{$session{local_session_id}} = \%session;
+        $Sessions{$session_hash{local_session_id}} = \%session_hash;
     }
 }
 
@@ -409,7 +411,6 @@
 
     my @known_commands;
 
-    my %filter;
 
     if ($Config{filter}) {
         # Инициализация фильтра
@@ -455,9 +456,9 @@
             #$result .= "undefined local session id<br/>\n" if !defined($cl->{local_session_id});
             #$result .= "undefined filter key $filter_key <br/>\n" if !defined($Sessions{$cl->{local_session_id}}->{$filter_key});
             #$result .= $Sessions{$cl->{local_session_id}}->{$filter_key}." != ".$filter{$filter_key};
-            next COMMAND_LINE if 
-                defined($cl->{local_session_id}) 
-                && defined($Sessions{$cl->{local_session_id}}->{$filter_key}) 
+            next COMMAND_LINE 
+                if defined($cl->{local_session_id})
+                && defined($Sessions{$cl->{local_session_id}}->{$filter_key})
                 && $Sessions{$cl->{local_session_id}}->{$filter_key} ne $filter{$filter_key};
         }
 
@@ -688,7 +689,7 @@
         my $hint = make_comment($cl->{"cline"});
 
         my $cline;
-        $prompt_hint = join ("&#10;", map("$_=$cl->{$_}", grep (!/^output$/, sort(keys(%{$cl})))));
+        $prompt_hint = join ("&#10;", map("$_=$cl->{$_}", grep (!/^(output|diff)$/, sort(keys(%{$cl})))));
         $cline = "<span title='$prompt_hint'>".$cl->{"prompt"}."</span>".$cl->{"cline"};
         $cline =~ s/\n//;
 
@@ -836,6 +837,14 @@
     my $files_section         = print_files;
 
     $result = print_header($toc);
+
+
+#    $result.= join " <br/>", keys %Sessions;
+#    for my $sess (keys %Sessions) {
+#            $result .= join " ", keys (%{$Sessions{$sess}});
+#            $result .= "<br/>";
+#    }
+
     $result.= "<h2 id='log'>Журнал</h2>"       . $command_lines;
     $result.= "<h2 id='files'>Файлы</h2>"      . $files_section if $files_section;
     $result.= "<h2 id='stat'>Статистика</h2>"  . print_stat;
@@ -944,6 +953,7 @@
             $result .= "($course_code)"                 if $course_code;
             $result .= ", $course_date<br/>"            if $course_date;
             $result .= "Учебный центр $course_center <br/>" if $course_center;
+            $result .= "Фильтр ".join(" ", map("$filter{$_}=$_", keys %filter))."<br/>" if %filter;
             $result .= "</p>";
     }
 
diff -r bdc1f02d3f87 -r 2cb912bff2ea l3config.pm
--- a/l3config.pm	Fri Feb 24 18:43:35 2006 +0200
+++ b/l3config.pm	Sat Feb 25 08:02:25 2006 +0200
@@ -94,7 +94,7 @@
 
     "course-name"       => "", 
     "course-code"       => "", 
-    "course-date"       => "", 
+    "course-date"       => 
     "course-center"     => "", 
     "course-trainer"    => "", 
     "course-student"    => "",