# HG changeset patch # User devi # Date 1139503624 -7200 # Node ID a10db759e5872c0e241cd06b9b584c964ec3984f # Parent 35e0d61c820d62d32e61e781d15d92d8cbb51f6d Перешёл на новый формат приглашения. Ура Ура Ура! Теперь в нём есть информация о номере строки в истории (history), текущем каталоге (pwd), времени появления приглашения (time) Давно пора было! diff -r 35e0d61c820d -r a10db759e587 l3-agent --- a/l3-agent Tue Feb 07 12:51:03 2006 +0200 +++ b/l3-agent Thu Feb 09 18:47:04 2006 +0200 @@ -196,12 +196,27 @@ (.*) # command line ) '; - #my $cline_re = qr/$cline_re_base(?:$cline_re_base|$)/x; - #my $cline_re = qr/(?:$cline_re_base)*$cline_re_base$/x; my $cline_re = qr/$cline_re_base/sx; - my $cline_re1 = qr/$cline_re_base\x0D/sx; my $cline_re2 = qr/$cline_re_base$/sx; + my $cline_re_v2_base = qq' + ( + v2[\#] # version + ([0-9]+)[\#] # history line number + ([0-9]+)[\#] # exitcode + ([0-9]+)[\#] # uid + ([0-9]+)[\#] # pid + ([0-9]+)[\#] # time + (.*?)[\#] # pwd + .\\[1024D.\\[K # killing symbols + (.*?([\$\#]\\s?)) # prompt + (.*) # command line + ) + '; + + my $cline_re_v2 = qr/$cline_re_v2_base/sx; + my $cline_re2_v2 = qr/$cline_re_v2_base$/sx; + my $vt = Term::VT102->new ( 'cols' => $Config{"terminal_width"}, 'rows' => $Config{"terminal_height"}); my $cline_vt = Term::VT102->new ('cols' => $Config{"terminal_width"}, @@ -210,7 +225,7 @@ my $converter = Text::Iconv->new($Config{"encoding"}, "utf-8") if ($Config{"encoding"} && $Config{"encoding"} !~ /^utf-8$/i); - print "Loading lm-scripts...\n" if $Config{"verbose"} =~ /y/; + print "Parsing lab scripts...\n" if $Config{"verbose"} =~ /y/; my $file; my $skip_info; @@ -266,6 +281,8 @@ $file =~ m@.*/(.*?)-.*@; + print "+- processing file $file\n" if $Config{"verbose"} =~/y/; + my $tty = $1; my $first_pass = 1; my %cl; @@ -289,7 +306,7 @@ $cl{"local_session_id"} = $local_session_id; # Parse new command $cl{"uid"} = $3; - $cl{"euid"} = $cl{"uid"}; # Если в команде обнаружится sudo, euid поменяем на 0 + #$cl{"euid"} = $cl{"uid"}; # Если в команде обнаружится sudo, euid поменяем на 0 $cl{"pid"} = $4; $cl{"day"} = $5; $cl{"lab"} = $6; @@ -317,7 +334,7 @@ $cline_vt->reset(); my %commands = extract_commands_from_cline($cl{"cline"}); - $cl{"euid"}=0 if defined $commands{"sudo"}; + #$cl{"euid"}=0 if defined $commands{"sudo"}; my @comms = sort { $commands{$a} cmp $commands{$b} } keys %commands; $cl{"last_command"} = $comms[$#comms] || ""; @@ -371,9 +388,6 @@ $vt->reset(); - # Classifying the command line - - # Save if (!$Config{"lab"} || $cl{"lab"} eq $Config{"lab"}) { # Changing encoding @@ -391,6 +405,130 @@ } next; } + + + elsif (m/$cline_re_v2/) { + + +# Разбираем командную строку версии 2 + + + s/.*\x0d(?!\x0a)//; + m/$cline_re2_v2/gs; + + $commandlines_loaded++; + $last_output_length=0; + + # Previous command + my %last_cl = %cl; + + $cl{"local_session_id"} = $local_session_id; + # Parse new command + $cl{"history"} = $2; + my $err = $3; + $cl{"uid"} = $4; + #$cl{"euid"} = $cl{"uid"}; # Если в команде обнаружится sudo, euid поменяем на 0 + $cl{"pid"} = $5; + $cl{"time"} = $6; + $cl{"pwd"} = $7; + #$cl{"fullprompt"} = $8; + $cl{"prompt"} = $9; + $cl{"raw_cline"}= $10; + + { + use bytes; + $cl{"raw_start"} = tell (FILE) - length($1); + $cl{"raw_output_start"} = tell FILE; + } + $cl{"raw_file"} = $file; + + $cl{"err"} = 0; + $cl{"output"} = ""; + #$cl{"tty"} = $tty; + + $cline_vt->process($cl{"raw_cline"}."\n"); + $cl{"cline"} = $cline_vt->row_plaintext (1); + $cl{"cline"} =~ s/\s*$//; + $cline_vt->reset(); + + my %commands = extract_commands_from_cline($cl{"cline"}); + #$cl{"euid"} = 0 if defined $commands{"sudo"}; + my @comms = sort { $commands{$a} cmp $commands{$b} } keys %commands; + $cl{"last_command"} + = $comms[$#comms] || ""; + + if ( + $Config{"suppress_editors"} =~ /^y/i + && grep ($_ eq $cl{"last_command"}, @{$Config{"editors"}}) + || $Config{"suppress_pagers"} =~ /^y/i + && grep ($_ eq $cl{"last_command"}, @{$Config{"pagers"}}) + || $Config{"suppress_terminal"}=~ /^y/i + && grep ($_ eq $cl{"last_command"}, @{$Config{"terminal"}}) + ) { + $cl{"suppress_output"} = "1"; + } + else { + $cl{"suppress_output"} = "0"; + } + $skip_info = 0; + + + if ($Config{verbose} =~ /y/i) { + print "| " if $commandlines_loaded % 15 == 1; + print " ",$cl{"last_command"}; + } + + # Processing previous command line + if ($first_pass) { + $first_pass = 0; + next; + } + + # Error code + $last_cl{"err"}=$err; + $last_cl{"raw_end"} = $cl{"raw_start"}; + + if (grep ($_ eq $last_cl{"last_command"}, @{$Config{"editors"}})) { + bind_diff(\%last_cl); + } + + # Output + if (!$last_cl{"suppress_output"} || $last_cl{"err"}) { + for (my $i=0; $i<$Config{"terminal_height"}; $i++) { + my $line= $vt->row_plaintext($i); + next if !defined ($line) ; #|| $line =~ /^\s*$/; + $line =~ s/\s*$//; + $line .= "\n" unless $line =~ /^\s*$/; + $last_cl{"output"} .= $line; + } + } + else { + $last_cl{"output"}= ""; + } + + $vt->reset(); + + + # Changing encoding + for (keys %last_cl) { + next if /raw/; + if ($Config{"encoding"} && + $Config{"encoding"} !~ /^utf-8$/i) { + $last_cl{$_} = $converter->convert($last_cl{$_}) + } + } + push @Command_Lines, \%last_cl; + + # Сохранение позиции в файле, до которой выполнен + # успешный разбор + $Script_Files{$file}->{tell} = $last_cl{raw_end}; + + next; + + } + +# Иначе, это строка вывода + $last_output_length+=length($_); #if (!$cl{"suppress_output"} || $last_output_length < 5000) { if ($last_output_length < 50000) { @@ -408,7 +546,7 @@ } if ($Config{"verbose"} =~ /y/) { - print "...finished." ; + print "\n`- finished.\n" ; print "Lines loaded: $commandlines_processed\n"; print "Command lines: $commandlines_loaded\n"; } @@ -419,7 +557,7 @@ sub sort_command_lines { - print "Sorting command lines...\n" if $Config{"verbose"} =~ /y/; + print "Sorting command lines..." if $Config{"verbose"} =~ /y/; # Sort Command_Lines # Write Command_Lines to Command_Lines_Index @@ -430,13 +568,14 @@ } @Command_Lines_Index = sort { + $Command_Lines[$index[$a]]->{"time"} <=> $Command_Lines[$index[$b]]->{"time"} || $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"} } @index; - print "...finished\n" if $Config{"verbose"} =~ /y/; + print "finished\n" if $Config{"verbose"} =~ /y/; } @@ -531,22 +670,26 @@ #$year = 2004 if ( $cl->{day} > 330 ); $year = $Config{year} if $Config{year}; # timelocal( $sec, $min, $hour, $mday,$mon,$year); - $cl->{time} = timelocal_nocheck($cl->{sec},$cl->{min},$cl->{hour},$cl->{day},0,$year); + $cl->{time} ||= timelocal_nocheck($cl->{sec},$cl->{min},$cl->{hour},$cl->{day},0,$year); # Начинаем вывод команды print OUT "\n"; for my $element (qw( local_session_id + history + uid + pid time + pwd raw_start raw_output_start raw_end raw_file tty - uid err last_command + history )) { next unless defined($cl->{"$element"}); print OUT "<$element>".$cl->{$element}."\n"; @@ -663,12 +806,11 @@ if ($Config{"mode"} ne "daemon") { -=cut - В нормальном режиме работы нужно - считать скрипты, обработать их и записать - результат выполнения в результирующий файл. - После этого завершить работу. -=cut +# В нормальном режиме работы нужно +# считать скрипты, обработать их и записать +# результат выполнения в результирующий файл. +# После этого завершить работу. + for my $lab_log (split (/\s+/, $Config{"diffs"} || $Config{"input"})) { load_diff_files($lab_log); } @@ -732,7 +874,7 @@ load_cache_stat(); load_command_lines($Config{"input"}, $Config{"input_mask"}); if (@Command_Lines) { - #sort_command_lines; + sort_command_lines; #process_command_lines; print_command_lines($Config{"cache"}); } diff -r 35e0d61c820d -r a10db759e587 l3bashrc --- a/l3bashrc Tue Feb 07 12:51:03 2006 +0200 +++ b/l3bashrc Thu Feb 09 18:47:04 2006 +0200 @@ -28,12 +28,12 @@ _l3_prompt() { -#export PS1='\[v2_$(date +%s)_$?_$PWD_\!_\033[1024D\033[K\][\u@\h:\W]\$ ' - export PS1='\[` - a="$?"; - HIDDEN=$([ "$a" = 0 ] || echo -n ^"$a")$(echo -n _${UID}_)$(echo -n _$$_)$(date\ - +"%j$(cat ${LMHOME}/lab 2>/dev/null) %H:%M:%S"); - echo $HIDDEN`\033[50D\033[K\][\u@\h:\W]\$ ' + export PS1='\[v2#\!#$?#$UID#$$#$(date +%s)#$PWD#\033[1024D\033[K\][\u@\h:\W]\$ ' +# export PS1='\[` +# a="$?"; +# HIDDEN=$([ "$a" = 0 ] || echo -n ^"$a")$(echo -n _${UID}_)$(echo -n _$$_)$(date\ +# +"%j$(cat ${LMHOME}/lab 2>/dev/null) %H:%M:%S"); +# echo $HIDDEN`\033[50D\033[K\][\u@\h:\W]\$ ' } _l3_start_session() diff -r 35e0d61c820d -r a10db759e587 l3config.pm --- a/l3config.pm Tue Feb 07 12:51:03 2006 +0200 +++ b/l3config.pm Thu Feb 09 18:47:04 2006 +0200 @@ -81,7 +81,7 @@ "detach" => "yes", "agent_pidfile" => "$ENV{HOME}/.lilalo/l3-agent.pid", - "backend_address" => "192.168.15.254", + "backend_address" => "192.168.18.254", "backend_port" => "18030", "backend_pidfile" => "/tmp/l3-backend.pid", "backend_datafile" => "/var/lilalo/lablogs-xml/backend.xml", diff -r 35e0d61c820d -r a10db759e587 l3scripts --- a/l3scripts Tue Feb 07 12:51:03 2006 +0200 +++ b/l3scripts Thu Feb 09 18:47:04 2006 +0200 @@ -124,6 +124,8 @@ Журналы содержат запись всех лабораторных работ, которые выполнялись на курсе с его начала и по сегодняшний день. +(в прошлый раз, оказывается, в журналы не попал последний день) + Файл с архивом прикреплён к письму. Если будет возможность, постарайтесь подготовиться к