# HG changeset patch
# User igor
# Date 1202863317 -7200
# Node ID 3cd466f35ad67d71a8a7a7be246b5ae8b1c7ccfb
# Parent 0d49f33696b38729878e161e82135436c4f71910
* Добавлено разбиения журнала на блоки
* Оптимизирована генерация всплывающих подсказок
* В заголовке указывается дата
* Переделано взаимодействие с mywi: код mywi интегрирован в lilalo
* Изменён способ вывода таблицы, теперь она лушче показывается в Opera и IE
* Изменён формат diff'а, теперь diff -u
diff -r 0d49f33696b3 -r 3cd466f35ad6 README
--- a/README Sun Nov 12 17:34:47 2006 +0200
+++ b/README Wed Feb 13 02:41:57 2008 +0200
@@ -1,3 +1,24 @@
+
+LiLaLo - Live Lab Log
+
+(c) Игорь Чубин, 2004-2008
+
+Лицензия, по которой распространяется
+приведена в файле LICENSE
+в данном дистрибутиве
+
+
+Дополнительную информацию о программе
+можно найти на странице:
+
+ http://xgu.ru/wiki/LiLaLo
+
+
+
+-----------------------------------------------------------------
+
+
+
АТРИБУТЫ cline
СПИСОК ПОЛЕЙ, ХАРАКТЕРИЗУЮЩИХ КОМАНДНУЮ СТРОКУ
diff -r 0d49f33696b3 -r 3cd466f35ad6 install
--- a/install Sun Nov 12 17:34:47 2006 +0200
+++ b/install Wed Feb 13 02:41:57 2008 +0200
@@ -25,6 +25,7 @@
url_perl_modules=${url_lilalo}/
perl_modules="Term-VT102 Text-Iconv"
+apt_get_install_this="perl make libmodule-build-perl libc6-dev gcc"
wget=wget
uname -a | grep -qi bsd && wget=fetch
@@ -34,6 +35,25 @@
redC='\033[0;31m'
greenC='\033[0;32m'
+apt_get_install_deps()
+{
+ if which apt-get >& /dev/null
+ then
+ apt-get install -y $apt_get_install_this
+ else
+ echo "Please install this dependencies manually:"
+ echo $apt_get_install_this
+ echo "Have you installed this already (y/n)?"
+ echo y | read answer
+ if echo $answer | grep -q ^[yY]
+ then
+ true
+ else
+ echo Please install the dependencies and rerun the script
+ exit 1
+ fi
+ fi
+}
step()
@@ -141,6 +161,7 @@
temp_dir=/tmp/lilalo-install-temp-$$
mkdir -p ${temp_dir}
cd ${temp_dir}
+step "Installing dependencies" apt_get_install_deps
step "Downloading l3bashrc" ${wget} ${url_l3bashrc}
step "Downloading l3-agent" '${wget} ${url_l3agent}; ${wget} ${url_l3config}'
step "Downloading perl modules for l3-agent" '{ for i in ${perl_modules}; do ${wget} ${url_perl_modules}/$i.tar.gz; done; }'
diff -r 0d49f33696b3 -r 3cd466f35ad6 l3-cgi-lite
--- a/l3-cgi-lite Sun Nov 12 17:34:47 2006 +0200
+++ b/l3-cgi-lite Wed Feb 13 02:41:57 2008 +0200
@@ -17,14 +17,26 @@
sub print_footer;
sub nav_bar;
+sub count_command_lines($);
+
my $print="";
my $path = $ENV{PATH_INFO};
remove_extra_slashes_from($path);
+
+my $commands_to_show_at_a_go = $l3config::Config{"commands_to_show_at_a_go"};
+my $start_from_command = "100";
+my $this_page_number=0;
+if ($path =~ s/:(.*)//) {
+ $this_page_number = $1;
+ $start_from_command = $this_page_number*$commands_to_show_at_a_go;
+}
+
my $real_path = $l3config::Config{"backend_datadir"} ;
my $cgi_path = $l3config::Config{"cgi_path"} ;
my $style_files = $l3config::Config{"frontend_files"} ;
my $frontend_css = $l3config::Config{"frontend_css"} ;
+
my $data_file = "data.xml";
path_is_correct($path)
@@ -51,12 +63,12 @@
unless ( -e "$real_path/$data_file"
&& -e "$real_path/index.html"
- && (stat("$real_path/index.html"))[9] > (stat("$real_path/$data_file"))[9] ) {
+ && (stat("$real_path/index.html"))[9] > (stat("$real_path/$data_file"))[9] && 0!=0 ) {
- my $l3_frontend = "/home/devi/cvs/lilalo/l3-frontend --backend_datafile $real_path/$data_file --output $real_path/index.html";
+ my $l3_frontend = "/home/devi/cvs/lilalo/l3-frontend --backend_datafile $real_path/$data_file --output $real_path/index.html --start_from_command $start_from_command ";
system($l3_frontend) == 0
or error("Файл журнала найден, но возникла ошибка при его обработке:
$!");
- $print .= "(перегенирован)
";
+ #$print .= "(перегенирован)
";
}
{
@@ -169,6 +181,28 @@
$current_path .= "/$path_part";
$nav_bar .= "/$path_part";
}
+ my $pages=int(count_command_lines("$real_path/$data_file")/$commands_to_show_at_a_go)+1;
+ my $i=1;
+ while ($i<$pages) {
+ if ($i==$this_page_number) {
+ $nav_bar .= " :$i";
+ }
+ else {
+ $nav_bar .= " :$i";
+ }
+ $i++;
+ }
return "
";
}
+sub count_command_lines($)
+#
+# Считает количество строк в файле с данными
+# Грязный временный хак
+#
+{
+ my $filename= $_[0];
+ return int(`grep '' $filename |wc -l`);
+# return $filename;
+}
+
diff -r 0d49f33696b3 -r 3cd466f35ad6 l3-frontend
--- a/l3-frontend Sun Nov 12 17:34:47 2006 +0200
+++ b/l3-frontend Wed Feb 13 02:41:57 2008 +0200
@@ -1,6 +1,6 @@
#!/usr/bin/perl -w
-use IO::Socket;
+use POSIX qw(strftime);
use lib '.';
use l3config;
use utf8;
@@ -9,9 +9,10 @@
our @Command_Lines_Index;
our %Commands_Description;
our %Args_Description;
-our $Mywi_Socket;
our %Sessions;
+our $debug_output=""; # Используйте эту переменную, если нужно передать отладочную информацию
+
our %filter;
our $filter_url;
sub init_filter;
@@ -26,12 +27,17 @@
our %Elements_Visibility;
# ^^^
+our $First_Command=$0;
+our $Last_Command=40;
+
our %Stat;
our %frequency_of_command; # Сколько раз в журнале встречается какая команда
our $table_number=1;
+our %tigra_hints;
my %mywi_cache_for; # Кэш для экономии обращений к mywi
+sub count_frequency_of_commands;
sub make_comment;
sub make_new_entries_table;
sub load_command_lines_from_xml;
@@ -53,6 +59,20 @@
sub print_stat_html;
sub print_header_html;
sub print_footer_html;
+sub tigra_hints_generate;
+
+#### mywi
+#
+sub mywi_init;
+sub load_mywitxt;
+sub mywi_process_query($);
+#
+sub add_to_log($$);
+sub parse_query;
+sub search_in_txt;
+sub add_to_log($$);
+sub mywi_guess($);
+#
main();
@@ -65,8 +85,8 @@
$Config{frontend_ico_path}=$Config{frontend_css};
$Config{frontend_ico_path}=~s@/[^/]*$@@;
init_filter();
+ mywi_init();
- open_mywi_socket();
load_command_lines_from_xml($Config{"backend_datafile"});
load_sessions_from_xml($Config{"backend_datafile"});
sort_command_lines;
@@ -77,7 +97,6 @@
else {
print_all_html($Config{"output"});
}
- close_mywi_socket;
}
sub init_filter
@@ -150,46 +169,75 @@
}
-
-
-
-#
-# Подпрограммы для работы с mywi
-#
-
-sub open_mywi_socket
+sub mywrap($)
{
- $Mywi_Socket = IO::Socket::INET->new(
- PeerAddr => $Config{mywi_server},
- PeerPort => $Config{mywi_port},
- Proto => "tcp",
- Type => SOCK_STREAM);
+return '';
}
-sub close_mywi_socket
+sub tigra_hints_generate
{
- close ($Mywi_Socket) if $Mywi_Socket ;
+ my $tigra_hints_items="";
+ for my $hint_id (keys %tigra_hints) {
+ $tigra_hints{$hint_id} =~ s@\n@
@gs;
+ $tigra_hints{$hint_id} =~ s@ - @ — @gs;
+ $tigra_hints{$hint_id} =~ s@'@\\'@gs;
+# $tigra_hints_items .= "'$hint_id' : mywrap('".$tigra_hints{$hint_id}."'),";
+ $tigra_hints_items .= "'$hint_id' : '".mywrap($tigra_hints{$hint_id})."',";
+ }
+ $tigra_hints_items =~ s/,$//;
+ return <';
+
+}
+TIGRA
+$a=<;
- utf8::decode($mywi);
- $mywi = "" if $mywi =~ /nothing app/;
+ my $cline = $_[0];
+ my @commands = keys %{extract_from_cline("commands", $cline)};
+ for my $command (@commands) {
+ $frequency_of_command{$command}++;
}
- close_mywi_socket;
- return $mywi;
}
sub make_comment
@@ -206,9 +254,9 @@
# Commands
for my $command (@commands) {
$command =~ s/'//g;
- $frequency_of_command{$command}++;
+ #$frequency_of_command{$command}++;
if (!$Commands_Description{$command}) {
- $mywi_cache_for{$command} ||= mywi_client($command) || "";
+ $mywi_cache_for{$command} ||= mywi_process_query($command) || "";
my $mywi = join ("\n", grep(/\([18]|sh|script\)/, split(/\n/, $mywi_cache_for{$command})));
$mywi =~ s/\s+/ /;
if ($mywi !~ /^\s*$/) {
@@ -330,8 +378,16 @@
sub process_command_lines
{
+
+ my $current_command=0;
+
COMMAND_LINE_PROCESSING:
for my $i (@Command_Lines_Index) {
+
+ $current_command++;
+ next if $current_command < $Config{"start_from_command"};
+ last if $current_command > $Config{"start_from_command"} + $Config{"commands_to_show_at_a_go"};
+
my $cl = \$Command_Lines[$i];
next if !$cl;
@@ -361,11 +417,15 @@
}
my $hint;
+ count_frequency_of_commands($$cl->{"cline"});
$hint = make_comment($$cl->{"cline"});
+
if ($hint) {
$$cl->{hint} = $hint;
}
-# $$cl->{hint}="";
+ $tigra_hints{$$cl->{"time"}} = $hint;
+
+ $$cl->{hint}="";
# Выводим верхних строк
# и нижних строк,
@@ -491,6 +551,8 @@
my $last_session="";
my $last_day=q();
my $last_wday=q();
+ my $first_command_of_the_day_unix_time=q();
+ my $human_readable_time=q();
my $in_range=0;
my $current_command=0;
@@ -517,6 +579,10 @@
my $cl=$Command_Lines[$Command_Lines_Index[$current_command++]];
next unless $cl;
+ next if $current_command < $Config{"start_from_command"};
+ last if $current_command > $Config{"start_from_command"} + $Config{"commands_to_show_at_a_go"};
+
+
# Пропускаем команды, с одинаковым временем
# Это не совсем правильно.
# Возможно, что это команды, набираемые с помощью
@@ -592,6 +658,7 @@
my ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime($cl->{time});
+
# Добавляем спереди 0 для удобочитаемости
$min = "0".$min if $min =~ /^.$/;
$hour = "0".$hour if $hour =~ /^.$/;
@@ -603,6 +670,9 @@
# DAY CHANGE
if ( $last_day ne $day) {
+ $prev_unix_time=$first_command_of_the_day_unix_time;
+ $first_command_of_the_day_unix_time = $cl->{time};
+ $human_readable_time = strftime "%D", localtime($prev_unix_time);
if ($last_day) {
# Вычисляем разность множеств.
@@ -610,7 +680,9 @@
# @new_commands = keys %frequency_of_command - @known_commands;
- $result .= "".$Day_Name[$last_wday]."
";
+# Выводим предыдущий день
+
+ $result .= "".$Day_Name[$last_wday]." ($human_readable_time)
";
for my $entry_class (sort keys %new_entries_of) {
my $table_caption = "Таблица ".$table_number++.".".$Day_Name[$last_wday]
.". Новые ".$new_entries_of{$entry_class};
@@ -623,7 +695,12 @@
$result .= $this_day_result;
}
- push @toc, "".$Day_Name[$wday]."\n";
+# Добавляем текущий день в оглавление
+
+ $human_readable_time = strftime "%D", localtime($first_command_of_the_day_unix_time);
+ push @toc, "".$Day_Name[$wday]." ($human_readable_time)\n";
+
+
$last_day=$day;
$last_wday=$wday;
$this_day_result = q();
@@ -672,8 +749,8 @@
$cline = "$cline";
}
- $this_day_result .= "\n\n";
- $this_day_result .= " \n" . $cline ; #cline
+ $this_day_result .= " \n\n";
+ $this_day_result .= " {time}."')\" onmouseout=\"myHint.hide()\">\n" . $cline ; #cline
$this_day_result .= " \n"
. "\n"
. "\n" if $cl->{"err"};
@@ -716,11 +793,15 @@
# Вывод очередной команды окончен
$this_day_result .= " \n"; # cblock
- $this_day_result .= " |
\n"
+ $this_day_result .= " |
\n"
. "\n"; # command
}
last: {
- $result .= "".$Day_Name[$last_wday]."
";
+ $prev_unix_time=$first_command_of_the_day_unix_time;
+ $first_command_of_the_day_unix_time = $cl->{time};
+ $human_readable_time = strftime "%D", localtime($prev_unix_time);
+
+ $result .= "".$Day_Name[$last_wday]." ($human_readable_time)
";
for my $entry_class (keys %new_entries_of) {
my $table_caption = "Таблица ".$table_number++.".".$Day_Name[$last_wday]
@@ -1120,7 +1201,8 @@
my ($command_lines,$toc) = print_command_lines_html;
my $files_section = print_files_html;
- $result = print_header_html($toc);
+ $result = $debug_output;
+ $result .= print_header_html($toc);
# $result.= join "
", keys %Sessions;
@@ -1195,9 +1277,11 @@
# Управляющая форма отключена
- # Она слишеком сильно мешает, нужно что-то переделать
+ # Она слишком сильно мешает, нужно что-то переделать
$control_form = "";
+ my $tigra_hints_array=tigra_hints_generate;
+
my $result;
$result = <
@@ -1207,23 +1291,51 @@
$title
-
+ -->
-
+
+
+
+
[
править ]
@@ -1824,3 +1936,199 @@
$Search_Machines{$sm}->{"icon"}."' border='0'/>";
}
+
+
+
+########################################################################################
+#
+# mywi
+#
+#
+#
+#
+#
+#
+#
+
+
+
+sub mywi_init
+{
+ our $MyWiFile = "/home/devi/mywi/mywi.txt";
+ our $MyWiLog = "/home/devi/mywi/mywi.log";
+ our $section="";
+
+ our @MywiTXT; # Массив текстовых записей mywi
+ our %MywiHASH; # Хэш массивов записей
+ our %Query;
+
+ load_mywitxt($MyWiFile, \@MywiTXT, \%MywiHASH);
+}
+
+sub mywi_process_query($)
+#
+# Сделать подсказку по заданному запросу
+# $_[0] - тема для подсказки
+#
+# Возвращает:
+# строку-подсказку
+#
+{
+ my $query = shift;
+ parse_query($query, \%Query);
+ $result = search_in_txt(\%Query, \@MywiTXT, \%MywiHASH);
+
+ if (!$result) {
+ #add_to_log(\%Query, $MyWiLog);
+ return "$query nothing appropriate. Logged. ".join (";",%Query);
+ }
+
+ return $result;
+}
+
+####################################################################################
+# private section
+####################################################################################
+
+sub load_mywitxt
+#
+# Загрузить файл с записями Mywi_TXT
+# в массив
+# $_[0] - указатель на массив для загрузки
+# $_[1] - имя файла для загрузки
+#
+{
+ my $MyWiFile = $_[0];
+ my $MywiTXT = $_[1];
+ my $MywiHASH = $_[2];
+
+ open (MW, "$MyWiFile") or die "Can't open $MyWiFile for reading";
+ binmode MW, ":utf8";
+ @{$MywiTXT} =
;
+ close (MWF);
+
+ for my $mywi_line (@{$MywiTXT}) {
+ my $topic = $mywi_line;
+ $topic =~ s@\s*\(.*\n@@;
+ push @{$$MywiHASH{"$topic"}}, $mywi_line;
+# $MywiHASH{"$topic"} .= $mywi_line;
+ }
+}
+
+sub parse_query
+#
+# Строка запроса:
+# [format:]topic[(section)]
+# Элементы format и topic являются не обязательными
+#
+# $_[0] - строка запроса
+# $_[1] - ссылка на хэш запроса
+#
+{
+ my $query_string = shift;
+ my $query_hash = shift;
+
+ %{$query_hash} = (
+ "format" => "txt",
+ "section" => "",
+ "topic" => "",
+ );
+
+ if ($query_string =~ s/^([^:]*)://) {
+ $query_hash->{"format"} = $1 || "txt";
+ }
+ if ($query_string =~ s/\(([^(]*)\)$//) {
+ $query_hash->{"section"} = $1 || "";
+ }
+ $query_hash->{"topic"} = $query_string;
+}
+
+
+sub search_in_txt
+#
+# Выполнить поиск в текстовой базе
+# по известному запросу
+# $_[0] -- ссылка на хэш запроса
+# $_[1] -- ссылка на массив текстовых записей
+# $_[2] -- ссылка на хэш массивов текстовых записей
+# Результат:
+# найденная текстовая запись в заданном формате
+#
+{
+ my %Query = %{$_[0]};
+ my %MywiHASH = %{$_[2]};
+
+ my $topic = $Query{"topic"};
+ my $section = $Query{"section"};
+ my $result = "";
+
+ return join("\n",@{$MywiHASH{"$topic"}})."\n";
+
+ for my $l (@{$$_[2]{$topic}}) {
+# for my $l (@{$_[1]}) {
+ my $line = $l;
+ if (
+ ($section and $line =~ /^\s*\Q$topic\E\s*\($section*\)\s*-/ )
+ or (not $section and $line =~ /^\s*\Q$topic\E\s*(\([^)]*\)?)\s*-/) ) {
+ $line =~ s/^.* -//mg if ($Config{"short"});
+ $result .= "$line";
+ }
+ }
+ return $result;
+}
+
+
+sub add_to_log($$)
+#
+# Если в базе отсутствует информация по данной теме,
+# сделать предположение доступным способом
+# и добавить его в базу
+# или просто сделать отметку о необходимости
+# расширения базы
+#
+# Добавить запись в журнал
+# $_[0] - запись (ссылка на хэш)
+# $_[1] - имя файла-журнала
+#
+{
+ my $query = $_[0];
+ my $MyWiLog = $_[1];
+
+ open (MWF, ">>:utf8", $MyWiLog) or die "Can't open $MyWiLog for writing";
+ my $my_guess = mywi_guess($query);
+ print MWF "$my_guess\n";
+ close(MWF);
+}
+
+sub mywi_guess($)
+# Сформировать исходную строку для журнала по заданному запросу
+# Если секция принадлежит 0..9, в качестве основы для результирующего текста использовать whatis
+# $_[0] - запись (ссылка на хэш)
+#
+# Возвращает:
+# строку-предположение
+{
+ my %query = %{$_[0]};
+
+ my $topic = $query{"topic"};
+ my $section = $query{"section"};
+
+ my $result = "$topic($section)";
+ if (!$section or $section =~ /^[1-9]$/)
+ {
+ # Запрос из категории 1-9
+ # Об этом может знать whatis
+ $result = `LANG=C whatis -- "$topic"`;
+ if ($result =~ /nothing appropriate/i) {
+ $result = $topic;
+ $result .= "($section)" if $section;
+ }
+ else {
+ 1 while ($result =~ s/(\s+)-(\s+)/$1+$2/sg);
+ $result =~ s/\s+\(/(/;
+ chomp $result;
+ }
+ }
+ return $result;
+}
+
diff -r 0d49f33696b3 -r 3cd466f35ad6 l3bashrc
--- a/l3bashrc Sun Nov 12 17:34:47 2006 +0200
+++ b/l3bashrc Wed Feb 13 02:41:57 2008 +0200
@@ -151,11 +151,9 @@
old_file=\"/tmp/l3-saved-\$\$.\$RANDOM.\$RANDOM\"
/bin/cp -- \"\$1\" \"\$old_file\" 2> /dev/null
$editor_file \"\$@\" || ERR=\$?
- [ -e \"\$old_file\" ] && diff \"\$old_file\" \"\$1\" > \"\$L3_HOME/\$DIFFNAME\" 2> /dev/null
- if [ "$?" == 2 ]
- then
- diff /dev/null \"\$1\" > \"\$L3_HOME/\$DIFFNAME\" 2> /dev/null
- fi
+ [ -e \"\$old_file\" ] \
+ && diff -u \"\$old_file\" \"\$1\" > \"\$L3_HOME/\$DIFFNAME\" 2> /dev/null \
+ || diff -u /dev/null \"\$1\" > \"\$L3_HOME/\$DIFFNAME\" 2> /dev/null
/bin/rm \"\$old_file\" 2> /dev/null
return \$ERR
fi
@@ -238,8 +236,26 @@
grep ^l3cd= ~/.l3rc | sed s/[^=]*=//
;;
*)
- echo /usr/local/bin/l3
+ cat < "",
"year" => "2006",
+ "commands_to_show_at_a_go" => "100",
+ "start_from_command" => "0",
);
sub read_config_file