lilalo
view 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 source
     1 #!/usr/bin/perl
     3 use strict;
     4 use lib '.';
     5 use l3config;
     6 use IO::Socket;
     7 use POSIX qw(:sys_wait_h);
     9 sub main;
    11 main();
    13 sub REAPER {
    14 	1 until (-1 == waitpid(-1, WNOHANG));
    15 	$SIG{CHLD} = \&REAPER;
    16 }
    18 sub process_was_killed
    19 {
    20 	# Здесь должна быть красивая процедура 
    21 	# завершения демона
    22 	unlink $Config{backend_pidfile};
    23 	exit(0);
    24 }
    26 sub main {
    27 	init_config();
    30 	# Проверяем, возможно демон уже запущен
    31 	# Если он работает, просто завершаемся
    32 	if (open(PIDFILE, $Config{backend_pidfile})) {
    33 		my $pid = <PIDFILE>;
    34 		close(PIDFILE);
    35 		if ( ! -e "/proc/$pid" || !`grep $Config{"l3-backend"} /proc/$pid/cmdline && grep "uid:.*\b$<\b" /proc/$pid/status`) {
    36 			print "Removing stale pidfile\n";
    37 			unlink $Config{backend_pidfile}
    38 				or die "Can't remove stale pidfile ". $Config{backend_pidfile}. " : $!";
    39 		}
    40 		else {
    41 			print "l3-backend is already running\n";
    42 			exit(0);
    43 		}
    44 	}
    46 	# Уходим в background, если необходимо
    47 	if ($Config{detach} =~ /^y/i) {
    48 		#$Config{verbose} = "no";
    49 		my $pid = fork;
    50 		exit if $pid;
    51 		die "Couldn't fork: $!" unless defined ($pid);
    53 		open(PIDFILE, ">", $Config{backend_pidfile})
    54 			or die "Can't open pidfile ". $Config{backend_pidfile}. " for wrting: $!";
    55 		print PIDFILE $$;
    56 		close(PIDFILE);
    58 		for my $handle (*STDIN, *STDOUT, *STDERR) {
    59 			open ($handle, "+<", "/dev/null")
    60 				or die "can't reopen $handle to /dev/null: $!"
    61 		}
    63 		POSIX::setsid()
    64 			or die "Can't start a new session: $!";
    66 		$0 = $Config{"l3-backend"};
    68 		$SIG{INT} = $SIG{TERM} = $SIG{HUP} = \&process_was_killed;
    69 	}
    71 	# Открываем сетевой сокет и слушаем
    72 	my $server = IO::Socket::INET->new(
    73 			LocalPort 	=> $Config{backend_port},
    74 			Type		=> SOCK_STREAM,
    75 			Reuse		=> 1,
    76 			Listen		=> 10 );
    78 	if (!$server) {
    79 		die "Couldn't bind to socket ".$Config{backend_port}."\n";
    80 	}
    82 	$SIG{CHLD} = 'IGNORE';
    84 	# При получении новых соединенений,
    85 	# порождаем дочерние процессы
    86 	while (my $client = $server->accept()) {
    87 		my $pid;
    88 		next if $pid = fork;
    89 		die "fork: $!" unless defined $pid;
    91 		# Это наш ответвлённый клиент
    92 		close($server);
    94 		# Считываем данные и передаём их в точку получения
    95 		open(OUT, ">>", $Config{"backend_datafile"});
    96 		select OUT; $|=1;
    97 		while(<$client>) {
    98 			print OUT $_;
    99 		}
   100 		close(OUT);
   101 	} 
   102 	continue {
   103 		# Наш родитель
   104 		close ($client);
   105 	}
   106 }
