lilalo
view l3-cgi @ 150:822b36252d7f
Вывод больших фрагментов текста не теряется.
Большие фрагменты текста теперь не вырезаются бесследно.
Там, откуда они вырезаются, вставляются ссылки,
по которым можно посмотреть полную версию вывода.
Испытано на больших фрагментах текста,
содержащих до 5000 строк (фрагменты более 5000 строк по умолчанию
обрезаются административно; допустимые размеры задаются в l3config.pm).
Исправлены ошибки, из-за которых большие фрагменты
обрабатывались некорректно.
Большие фрагменты текста теперь не вырезаются бесследно.
Там, откуда они вырезаются, вставляются ссылки,
по которым можно посмотреть полную версию вывода.
Испытано на больших фрагментах текста,
содержащих до 5000 строк (фрагменты более 5000 строк по умолчанию
обрезаются административно; допустимые размеры задаются в l3config.pm).
Исправлены ошибки, из-за которых большие фрагменты
обрабатывались некорректно.
| author | igor@chub.in | 
|---|---|
| date | Tue Jun 23 01:15:02 2009 +0300 (2009-06-23) | 
| parents | 54fbf2041159 | 
| children | 
 line source
     1 #!/usr/bin/perl
     3 use strict;
     4 use CGI qw(:standard);
     5 use XML::Simple;
     6 use utf8;
     8 BEGIN {
     9     chdir("/etc/lilalo");
    10     require l3config;
    11     l3config::init_config();
    12 };
    14 my %filter;
    16 for my $key (qw(login_from local_session_id action)) {
    17     $filter{$key} =     param($key) if param($key);
    18     $filter{$key} =     $ENV{$key} if defined $ENV{$key};
    19 }
    21 my %Trainings;
    22 my $XMLTraining;
    23 my %Machines;
    24 my $print = "";
    26 $l3config::Config{cgi2file} = $ENV{cgi2file}    if defined($ENV{cgi2file});
    27 $ENV{PATH_INFO} = $l3config::Config{cgi_path_info} if $l3config::Config{cgi_path_info};
    29 my $is_not_cgi="";
    30 $is_not_cgi = "1" if $l3config::Config{cgi2file};
    31 # Пока что мы считаем, что вызов выполняется через CGI, 
    32 # если не установлена переменная cgi2file 
    33 # и не передан такой аргумент командной строки.
    34 # Это неверно, но как временное решение - пойдёт
    35 my $to_file = $l3config::Config{cgi2file};
    37 $l3config::Config{frontend_css} =~ s@^/@@ if $is_not_cgi;
    39 sub load_training
    40 {
    41         my $training_file;
    43         $training_file = $_[0] || $l3config::Config{"classfile"} || 
    44         $l3config::Config{"path_classes"}.$l3config::Config{"class"}.$l3config::Config{"class_suffix"};
    46         my $XMLTraining = XMLin($training_file , ForceArray => [ 'student' ] )  
    47                 or die "Can't open file of the training ",$training_file,"\n";
    49         my $course_file = $l3config::Config{"courses_path"}.$XMLTraining->{"course"}.".xml";
    50         my $XMLCourse;
    51         if (eval{$XMLCourse = XMLin($course_file)}) {
    52             $XMLTraining->{"course-name"} = $XMLCourse->{"fullname"};
    53         }
    55         for my $student (@{$XMLTraining->{"student"}}) {
    56         $XMLTraining->{host}->{$student->{"host"}}=$student;
    57         }
    58     return $XMLTraining;
    59 }
    63 if ($ENV{PATH_INFO} eq "/index") {
    64     # Показываем индекс курсов
    65     my @training_files = glob($l3config::Config{"path_classes"}."/2*".$l3config::Config{"class_suffix"});
    66     if (@training_files) {
    67         for my $training_file (@training_files) {
    68             $training_file =~ s@.*/@@;
    69             $training_file =~ s@$l3config::Config{"class_suffix"}$@@;
    70             my $training = load_training($training_file);
    71             $Trainings{$training->{"date"}}=$training;
    72         }
    73         $print .= "<html>\n";
    74         $print .= "<head>\n";
    75         $print .= "<title>Журналы лабораторных работ</title>\n";
    76         $print .= "</head>\n";
    77         $print .= "<body>\n";
    78         $print .= "<table>\n";
    79         for my $tdate (reverse sort keys %Trainings) {
    80             my $t = $Trainings{$tdate};
    81             $print .= "<tr>";
    82             $print .= "<td>".$t->{date}."</td>";
    83             $print .= "<td colspan='7'>".$t->{course}."</td>";
    84             $print .= "</tr>\n";
    85             for my $host (sort keys %{$t->{host}}) {
    86                 my %row;
    87                 my @row_keys = qw{
    88                     name email company host root user
    89                 };
    90                 my $h = $t->{host}->{$host};
    91                 $row{name}= $h->{firstname}." ".$h->{surname};
    92                 $row{email}= $h->{email};
    93                 $row{company} = $h->{company};
    94                 $row{host} =  "$host";
    95                 $row{root} = "<a href='/cgi-bin/l3/".$tdate."/".$host."/root'>root</a> ";
    96                 $row{user} = "<a href='/cgi-bin/l3/".$tdate."/".$host."/".$h->{user}."'>".$h->{user}."</a> ";
    97                 $print .= "<tr>".join("", map("<td style='$_'>$row{$_}</td>", @row_keys))."</tr>";
    98             }
    99         }
   100         $print .= "</table>\n";
   101         $print .= "</body>\n";
   102         $print .= "</html>\n";
   103     }
   104     else {
   105         $print .= "No training-files found<br/>\n";
   106         $print .= "Template to load files: ".$l3config::Config{"path_classes"}."*".$l3config::Config{"class_suffix"}."\n"
   107     }
   108 }
   109 elsif ($ENV{PATH_INFO} eq "/current") {
   110     open (FRONTEND, "./l3-frontend --output - --show_comments no --frontend_css $l3config::Config{frontend_css}|");
   111     binmode FRONTEND, ":utf8";
   112     while (<FRONTEND>) {
   113         $print .= $_;
   114     }
   115     close(FRONTEND);
   116 }
   117 else {
   118     # Вызов производится по URL
   119     $ENV{PATH_INFO} = "/".$ENV{PATH_INFO} unless $ENV{PATH_INFO} =~ m@^/@;
   120     #my ($skip, $training, $host, $user) = split /\//,$ENV{PATH_INFO},4;
   121     my ($skip, $training, $host, $user) = split /\//,$ENV{PATH_INFO},4;
   124     if (!$host || $host eq "index") {
   125         # Нам неизвестен курс или явно указан просмотр индекса
   126         # Просматриваем его
   127         my $t;
   128         if ( -e "/var/lilalo/lablogs-xml/$training/class.xml" ) {
   129          $t = load_training("/var/lilalo/lablogs-xml/$training/class.xml");
   130         }
   131         else {
   132          $l3config::Config{class}=$training;
   133          $t = load_training;
   134         }
   135         $training ||= "current";
   137         my $prefix = "/cgi-bin/l3/$training/";
   138         my $suffix = "";
   139         if ($is_not_cgi) {
   140             $prefix = "";
   141             $suffix = ".html";
   142         }
   143         my $path = $to_file;
   144         $path = "" unless $path =~ s@/[^/]*$@@;
   146         $print .= "<html>\n";
   147         $print .= "<head>\n";
   148         $print .= "<title>Журналы лабораторных работ</title>\n";
   149         $print .= "<meta content='text/html; charset=utf-8' http-equiv='Content-Type' />";
   150         $print .= "<link rel='stylesheet' href='".$l3config::Config{frontend_css}."' type='text/css'/>\n";
   151         $print .= "</head>\n";
   152         $print .= "<body>\n";
   153         $print .= "<h1>Журналы лабораторных работ</h1>\n";
   154         $print .= "<table>\n";
   155         $print .= "<tr class='table_header'>\n";
   156         $print .= "<td>"."Имя"."</td>";
   157         $print .= "<td>Хост</td>";
   158         $print .= "<td colspan='3'>Пользователь</td>";
   159         $print .= "</tr>\n";
   160         for my $host (sort keys %{$t->{host}}) {
   161             $print .= "<tr>\n";
   162             my $h = $t->{host}->{$host};
   163             $print .= "<td>".$h->{firstname}." ".$h->{surname}."</td>";
   164             $print .= "<td>$host</td>";
   165             $print .= "<td><a href='".$prefix.$host."/root$suffix'>root</a></td>";
   166             $print .= "<td><a href='".$prefix.$host."/".$h->{user}."$suffix'>".$h->{user}."</a></td>";
   167             $print .= "<td><a href='".$prefix.$host."$suffix'>все</a></td>" if not $is_not_cgi;
   168             $print .= "</td>\n";
   169             $print .= "</tr>\n";
   171             if ($is_not_cgi) {
   172                 # Это грязный хак
   173                 # Если мы чувствуем, что нас вызывают для генерения индексного файла,
   174                 # нам нужно создать и файлы, на которые он указывает
   175                 # Лучше было бы это сделать хотя бы через вызов функций
   176 # Такой же хак чуть ниже
   177                 mkdir("$path/$host");
   178                 system("$0 --cgi2file $path/$prefix$host/root$suffix  ".
   179                       "--cgi_path_info ".$training."/".$host."/root ".
   180                       "--frontend_css ../$l3config::Config{frontend_css}");
   181                 system("$0 --cgi2file $path/$prefix$host/".$h->{user}."$suffix ".
   182                       "--cgi_path_info ".$training."/".$host."/".$h->{user}." ".
   183                       "--frontend_css ../$l3config::Config{frontend_css}");
   184             #   system("$0 --cgi2file $path/$prefix$host$suffix ".
   185             #         "--cgi_path_info ".$training."/".$host." ".
   186             #         "--frontend_css ../$l3config::Config{frontend_css}");
   187             }
   189         }
   190 # Такой же хак был чуть выше
   191         if ($is_not_cgi) {
   192 #            $print .= "<td><a href='".$prefix."instructor.".$suffix."'>все</a></td>";
   193 #            system("$0 --cgi2file $path/$prefix$host$suffix"
   194 #                   . " --cgi_path_info ".$training."?login_from=192.168.15.254".$host
   195 #                  . " --frontend_css ../$l3config::Config{frontend_css}");
   196         }
   197         else {
   198             $print .= "<tr>\n";
   199             $print .= "<td>"."Инструктор"."</td>";
   200             $print .= "<td>from linux.nt</td>";
   201             $print .= "<td/>";
   202             $print .= "<td/>";
   203             $print .= "<td><a href='$training"."?login_from=192.168.15.254'>все</a></td>";
   204         }
   205         $print .= "</tr>\n";
   206         $print .= "</table>\n";
   207         $print .= "</body>\n";
   208         $print .= "</html>\n";
   209     }
   210     else {
   213         my @args=(
   214             "--output"      =>  "-",
   215             "--show_comments"   =>  "no",
   216         );
   218         $l3config::Config{"class"}=$training if $training ne 'current';
   219         if ( -e "/var/lilalo/lablogs-xml/$training/class.xml" ) {
   220          $XMLTraining = load_training("/var/lilalo/lablogs-xml/$training/class.xml");
   221         }
   222         else {
   223          $XMLTraining = load_training;
   224         }
   226         if ($XMLTraining) {
   227             my @args=(
   228                 "--course-center"   =>  $XMLTraining->{center},
   229                 "--course-trainer"  =>  $XMLTraining->{instructor}->{firstname}." ".$XMLTraining->{instructor}->{surname},
   230                 "--course-student"  =>  $XMLTraining->{host}->{$host}->{firstname}." ".$XMLTraining->{host}->{$host}->{surname},
   231                 "--course-code"     =>  $XMLTraining->{course},
   232                 "--course-date"     =>  $XMLTraining->{date},
   233                 "--encoding"        =>  $XMLTraining->{host}->{$host}->{charset},
   234             );
   235             if ($XMLTraining->{"course-name"}) {
   236                 push @args, ("--course-name"     =>  $XMLTraining->{"course-name"});
   237             };
   238         }
   239         if ($training ne 'current') {
   240             push @args,     ("--backend_datafile"   =>  "/var/lilalo/lablogs-xml/$training/$host/$user.xml");
   241         } else {
   242             $filter{hostname}   = $host if $host;
   243             $filter{user}       = $user if $user;
   244         }
   245         push @args, ("--filter" => join ("&", (map("$_=$filter{$_}", keys %filter))));
   247         #$print .= "./l3-frontend --frontend_css $l3config::Config{frontend_css} ".join(" ",map("\"$_\"",@args))." |<br/>";
   248         open (FRONTEND, "./l3-frontend --frontend_css $l3config::Config{frontend_css} ".join(" ",map("\"$_\"",@args))." |");
   249         binmode FRONTEND, ":utf8";
   250         while (<FRONTEND>) {
   251             $print .= $_;
   252         }
   253         close(FRONTEND);
   254     }
   255 }
   257 # Если задана переменная окружения l3_to_file, 
   258 # печатаем в файл с соответствующим именем,
   259 # в противном случае -- выводим на стандартный поток вывода
   260 if (not $to_file) {
   261   binmode STDOUT, ":utf8";
   262   print header(-charset => "utf-8");
   263   print $print;
   264 }
   265 else {
   266   open(FILE, ">:utf8", $to_file)
   267     or die "Can't open $to_file for writing";
   268   print FILE $print;
   269   close(FILE);
   270 }
