lilalo
diff l3-backend @ 27:098664cf339c
Выполнены шаги 4,5 в плане N05 по построению распределённой системы lilalo.
Шаг <6> в настоящее время не является необходимым.
Введено понятие сеанса.
Сеансом считается процедура работы с системой, начинающаяся с регистрации
в ней и зазаканчивающаяся разрегистрацией, и сопровождающаяся ведением одного
файла скрипта.
Одновременно с созданием скрипта (.script) создаётся соответствующий ему
файл с информацией о сеансе (.info).
Каждый сеанс имеет уникальный в пределах хоста идентификатор,
~local_session_id~, который впоследствии позволяет определить,
какие команды относятся к какому сеансу.
Добавлен backend-сервер, который получает данные от агентов и записывает
из в backend (в настойщий момент - в XML-файл).
Данные передаются по tcp-соединениям.
(Одновременно может работать несколько серверов.
Блокировка файла при записи пока что не выполняется ОСТОРОЖНО!!!!!!)
Агент периодически пытается отправить backend-серверу содержимое своего кэш-файла,
и если ему это удаётся, кэш файл очищается -- данные теперь хранятся в backend'е.
Взаимодействие агентов, backend-сервера и frontend'а
сейчас выполнеятся так:
+-------+
| |
| cache |
| |
+-^---+-+
| |
. ^ v . ^^ . +---------+ . ^^ .
/ \ tcp / \ | | / \ CGI
( agent )----->( backend- )-->| backend |-->( frontend )----->
\ / \ сервер / | | \ /
' . ' ' .. ' +---------+ ' .. '
^
|
+----+----+
| |
|*.script |
| *.info |
| |
+---------+
l3-frontend:
Теперь может выдавать результат работы на стандартный поток вывода.
Вместо имени файла нужно указать символ -
Добавлены файлы:
l3-backend - backend-сервер
l3-cgi - CGI-обвязка для l3-frontend'а
Новые конфигурационные параметры:
frontend_css Путь к файлу CSS, используемому в HTML-странице, которую генерирует frontend
frontend_google_ico Путь к иконке google
frontend_linux_ico Путь к иконке linux
frontend_freebsd_ico Путь к иконке freebsd
frontend_opennet_ico Путь к иконке opennet
frontend_local_ico Путь к иконке локальной документации
backend_address IP-адрес интерфейса, на котором работает backend-сервер
backend_port Порт, который слушает backend-сервер
backend_pidfile Путь к файлу, который хранит идентификатор процесса backend-сервера
backend_datafile Путь к файлу хранилищу (файлу backend)
Шаг <6> в настоящее время не является необходимым.
Введено понятие сеанса.
Сеансом считается процедура работы с системой, начинающаяся с регистрации
в ней и зазаканчивающаяся разрегистрацией, и сопровождающаяся ведением одного
файла скрипта.
Одновременно с созданием скрипта (.script) создаётся соответствующий ему
файл с информацией о сеансе (.info).
Каждый сеанс имеет уникальный в пределах хоста идентификатор,
~local_session_id~, который впоследствии позволяет определить,
какие команды относятся к какому сеансу.
Добавлен backend-сервер, который получает данные от агентов и записывает
из в backend (в настойщий момент - в XML-файл).
Данные передаются по tcp-соединениям.
(Одновременно может работать несколько серверов.
Блокировка файла при записи пока что не выполняется ОСТОРОЖНО!!!!!!)
Агент периодически пытается отправить backend-серверу содержимое своего кэш-файла,
и если ему это удаётся, кэш файл очищается -- данные теперь хранятся в backend'е.
Взаимодействие агентов, backend-сервера и frontend'а
сейчас выполнеятся так:
+-------+
| |
| cache |
| |
+-^---+-+
| |
. ^ v . ^^ . +---------+ . ^^ .
/ \ tcp / \ | | / \ CGI
( agent )----->( backend- )-->| backend |-->( frontend )----->
\ / \ сервер / | | \ /
' . ' ' .. ' +---------+ ' .. '
^
|
+----+----+
| |
|*.script |
| *.info |
| |
+---------+
l3-frontend:
Теперь может выдавать результат работы на стандартный поток вывода.
Вместо имени файла нужно указать символ -
Добавлены файлы:
l3-backend - backend-сервер
l3-cgi - CGI-обвязка для l3-frontend'а
Новые конфигурационные параметры:
frontend_css Путь к файлу CSS, используемому в HTML-странице, которую генерирует frontend
frontend_google_ico Путь к иконке google
frontend_linux_ico Путь к иконке linux
frontend_freebsd_ico Путь к иконке freebsd
frontend_opennet_ico Путь к иконке opennet
frontend_local_ico Путь к иконке локальной документации
backend_address IP-адрес интерфейса, на котором работает backend-сервер
backend_port Порт, который слушает backend-сервер
backend_pidfile Путь к файлу, который хранит идентификатор процесса backend-сервера
backend_datafile Путь к файлу хранилищу (файлу backend)
author | devi |
---|---|
date | Mon Nov 07 11:24:49 2005 +0200 (2005-11-07) |
parents | |
children | 4c02cf4123ee |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/l3-backend Mon Nov 07 11:24:49 2005 +0200 1.3 @@ -0,0 +1,106 @@ 1.4 +#!/usr/bin/perl 1.5 + 1.6 +use strict; 1.7 +use lib '.'; 1.8 +use l3config; 1.9 +use IO::Socket; 1.10 +use POSIX qw(:sys_wait_h); 1.11 + 1.12 +sub main; 1.13 + 1.14 +main(); 1.15 + 1.16 +sub REAPER { 1.17 + 1 until (-1 == waitpid(-1, WNOHANG)); 1.18 + $SIG{CHLD} = \&REAPER; 1.19 +} 1.20 + 1.21 +sub process_was_killed 1.22 +{ 1.23 + # Здесь должна быть красивая процедура 1.24 + # завершения демона 1.25 + unlink $Config{backend_pidfile}; 1.26 + exit(0); 1.27 +} 1.28 + 1.29 +sub main { 1.30 + init_config(); 1.31 + 1.32 + 1.33 + # Проверяем, возможно демон уже запущен 1.34 + # Если он работает, просто завершаемся 1.35 + if (open(PIDFILE, $Config{backend_pidfile})) { 1.36 + my $pid = <PIDFILE>; 1.37 + close(PIDFILE); 1.38 + if ( ! -e "/proc/$pid" || !`grep $Config{"l3-backend"} /proc/$pid/cmdline && grep "uid:.*\b$<\b" /proc/$pid/status`) { 1.39 + print "Removing stale pidfile\n"; 1.40 + unlink $Config{backend_pidfile} 1.41 + or die "Can't remove stale pidfile ". $Config{backend_pidfile}. " : $!"; 1.42 + } 1.43 + else { 1.44 + print "l3-backend is already running\n"; 1.45 + exit(0); 1.46 + } 1.47 + } 1.48 + 1.49 + # Уходим в background, если необходимо 1.50 + if ($Config{detach} =~ /^y/i) { 1.51 + #$Config{verbose} = "no"; 1.52 + my $pid = fork; 1.53 + exit if $pid; 1.54 + die "Couldn't fork: $!" unless defined ($pid); 1.55 + 1.56 + open(PIDFILE, ">", $Config{backend_pidfile}) 1.57 + or die "Can't open pidfile ". $Config{backend_pidfile}. " for wrting: $!"; 1.58 + print PIDFILE $$; 1.59 + close(PIDFILE); 1.60 + 1.61 + for my $handle (*STDIN, *STDOUT, *STDERR) { 1.62 + open ($handle, "+<", "/dev/null") 1.63 + or die "can't reopen $handle to /dev/null: $!" 1.64 + } 1.65 + 1.66 + POSIX::setsid() 1.67 + or die "Can't start a new session: $!"; 1.68 + 1.69 + $0 = $Config{"l3-backend"}; 1.70 + 1.71 + $SIG{INT} = $SIG{TERM} = $SIG{HUP} = \&process_was_killed; 1.72 + } 1.73 + 1.74 + # Открываем сетевой сокет и слушаем 1.75 + my $server = IO::Socket::INET->new( 1.76 + LocalPort => $Config{backend_port}, 1.77 + Type => SOCK_STREAM, 1.78 + Reuse => 1, 1.79 + Listen => 10 ); 1.80 + 1.81 + if (!$server) { 1.82 + die "Couldn't bind to socket ".$Config{backend_port}."\n"; 1.83 + } 1.84 + 1.85 + $SIG{CHLD} = 'IGNORE'; 1.86 + 1.87 + # При получении новых соединенений, 1.88 + # порождаем дочерние процессы 1.89 + while (my $client = $server->accept()) { 1.90 + my $pid; 1.91 + next if $pid = fork; 1.92 + die "fork: $!" unless defined $pid; 1.93 + 1.94 + # Это наш ответвлённый клиент 1.95 + close($server); 1.96 + 1.97 + # Считываем данные и передаём их в точку получения 1.98 + open(OUT, ">>", $Config{"backend_datafile"}); 1.99 + select OUT; $|=1; 1.100 + while(<$client>) { 1.101 + print OUT $_; 1.102 + } 1.103 + close(OUT); 1.104 + } 1.105 + continue { 1.106 + # Наш родитель 1.107 + close ($client); 1.108 + } 1.109 +}