lilalo
annotate l3-backend @ 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 | 53b890d1ae90 |
children |
rev | line source |
---|---|
devi@27 | 1 #!/usr/bin/perl |
devi@27 | 2 |
devi@27 | 3 use strict; |
igor@115 | 4 use lib '/etc/lilalo/'; |
devi@27 | 5 use l3config; |
devi@27 | 6 use IO::Socket; |
devi@27 | 7 use POSIX qw(:sys_wait_h); |
devi@27 | 8 |
devi@27 | 9 sub main; |
devi@27 | 10 |
devi@27 | 11 main(); |
devi@27 | 12 |
devi@27 | 13 sub REAPER { |
devi@27 | 14 1 until (-1 == waitpid(-1, WNOHANG)); |
devi@27 | 15 $SIG{CHLD} = \&REAPER; |
devi@27 | 16 } |
devi@27 | 17 |
devi@27 | 18 sub process_was_killed |
devi@27 | 19 { |
devi@27 | 20 # Здесь должна быть красивая процедура |
devi@27 | 21 # завершения демона |
devi@27 | 22 unlink $Config{backend_pidfile}; |
devi@27 | 23 exit(0); |
devi@27 | 24 } |
devi@27 | 25 |
devi@27 | 26 sub main { |
devi@27 | 27 init_config(); |
devi@27 | 28 |
devi@27 | 29 |
devi@27 | 30 # Проверяем, возможно демон уже запущен |
devi@27 | 31 # Если он работает, просто завершаемся |
devi@27 | 32 if (open(PIDFILE, $Config{backend_pidfile})) { |
devi@27 | 33 my $pid = <PIDFILE>; |
devi@27 | 34 close(PIDFILE); |
devi@27 | 35 if ( ! -e "/proc/$pid" || !`grep $Config{"l3-backend"} /proc/$pid/cmdline && grep "uid:.*\b$<\b" /proc/$pid/status`) { |
devi@27 | 36 print "Removing stale pidfile\n"; |
devi@27 | 37 unlink $Config{backend_pidfile} |
devi@27 | 38 or die "Can't remove stale pidfile ". $Config{backend_pidfile}. " : $!"; |
devi@27 | 39 } |
devi@27 | 40 else { |
devi@27 | 41 print "l3-backend is already running\n"; |
devi@27 | 42 exit(0); |
devi@27 | 43 } |
devi@27 | 44 } |
devi@27 | 45 |
devi@27 | 46 # Уходим в background, если необходимо |
devi@27 | 47 if ($Config{detach} =~ /^y/i) { |
devi@27 | 48 #$Config{verbose} = "no"; |
devi@27 | 49 my $pid = fork; |
devi@27 | 50 exit if $pid; |
devi@27 | 51 die "Couldn't fork: $!" unless defined ($pid); |
devi@27 | 52 |
devi@27 | 53 open(PIDFILE, ">", $Config{backend_pidfile}) |
devi@27 | 54 or die "Can't open pidfile ". $Config{backend_pidfile}. " for wrting: $!"; |
devi@27 | 55 print PIDFILE $$; |
devi@27 | 56 close(PIDFILE); |
devi@27 | 57 |
devi@27 | 58 for my $handle (*STDIN, *STDOUT, *STDERR) { |
devi@27 | 59 open ($handle, "+<", "/dev/null") |
devi@27 | 60 or die "can't reopen $handle to /dev/null: $!" |
devi@27 | 61 } |
devi@27 | 62 |
devi@27 | 63 POSIX::setsid() |
devi@27 | 64 or die "Can't start a new session: $!"; |
devi@27 | 65 |
devi@27 | 66 $0 = $Config{"l3-backend"}; |
devi@27 | 67 |
devi@27 | 68 $SIG{INT} = $SIG{TERM} = $SIG{HUP} = \&process_was_killed; |
devi@27 | 69 } |
devi@27 | 70 |
devi@27 | 71 # Открываем сетевой сокет и слушаем |
devi@27 | 72 my $server = IO::Socket::INET->new( |
devi@27 | 73 LocalPort => $Config{backend_port}, |
devi@27 | 74 Type => SOCK_STREAM, |
devi@27 | 75 Reuse => 1, |
devi@27 | 76 Listen => 10 ); |
devi@27 | 77 |
devi@27 | 78 if (!$server) { |
devi@27 | 79 die "Couldn't bind to socket ".$Config{backend_port}."\n"; |
devi@27 | 80 } |
devi@27 | 81 |
devi@27 | 82 $SIG{CHLD} = 'IGNORE'; |
devi@27 | 83 |
devi@27 | 84 # При получении новых соединенений, |
devi@27 | 85 # порождаем дочерние процессы |
devi@27 | 86 while (my $client = $server->accept()) { |
devi@27 | 87 my $pid; |
devi@27 | 88 next if $pid = fork; |
devi@27 | 89 die "fork: $!" unless defined $pid; |
devi@27 | 90 |
devi@27 | 91 # Это наш ответвлённый клиент |
devi@27 | 92 close($server); |
devi@27 | 93 |
devi@98 | 94 my $saved_data = ""; |
devi@98 | 95 |
devi@27 | 96 # Считываем данные и передаём их в точку получения |
devi@27 | 97 open(OUT, ">>", $Config{"backend_datafile"}); |
devi@27 | 98 select OUT; $|=1; |
devi@27 | 99 while(<$client>) { |
devi@27 | 100 print OUT $_; |
devi@98 | 101 $saved_data .= $_; |
devi@27 | 102 } |
devi@27 | 103 close(OUT); |
devi@98 | 104 |
devi@99 | 105 #open(LOG, ">>", "/tmp/l3-backend.log"); |
devi@99 | 106 #print LOG "Saved data:$saved_data\n"; |
devi@99 | 107 #close(LOG); |
devi@99 | 108 |
devi@99 | 109 while ($saved_data =~ m@<(session|command)>(.*)</\1>@sg) { |
devi@99 | 110 |
devi@99 | 111 #open(LOG, ">>", "/tmp/l3-backend.log"); |
devi@99 | 112 #print LOG "Found element $1\n"; |
devi@99 | 113 #close(LOG); |
devi@99 | 114 |
devi@98 | 115 my $element_name = $1; |
devi@98 | 116 my $element = $2; |
devi@98 | 117 if ($element =~ m@<l3cd>(.*?)</l3cd>@msg) { |
devi@98 | 118 # Обнаружен элемент l3cd |
devi@98 | 119 # Информация должна быть сохранена в соответствующий каталог |
devi@98 | 120 my $l3cd = $1; |
devi@98 | 121 # Путь l3cd должен быть не пуст, |
devi@98 | 122 # и в нём могут быть только символы латинского алфавита, цифры и знаки _ и - |
devi@98 | 123 if ($l3cd && $l3cd =~ /^[a-zA-Z_\/0-9-]*/) { |
devi@106 | 124 system("mkdir -m 770 -p $Config{backend_datadir}/$l3cd"); |
devi@98 | 125 if (open(OUT, ">>", $Config{"backend_datadir"}."/$l3cd/data.xml")) { |
devi@98 | 126 print OUT "<$element_name>".$element."</$element_name>"; |
devi@98 | 127 close(OUT); |
devi@98 | 128 }; |
devi@98 | 129 } |
devi@98 | 130 } |
devi@98 | 131 } |
devi@27 | 132 } |
devi@27 | 133 continue { |
devi@27 | 134 # Наш родитель |
devi@27 | 135 close ($client); |
devi@27 | 136 } |
devi@27 | 137 } |