lilalo

view l3-backend @ 98:4c02cf4123ee

l3-agent и l3-backend изменены так, что
все записанные команды теперь привязаны к контексту,
заданному в параметре
l3cd
агента

Их XML-представление теперь сохраняется не только в общем
файле backend.xml,
но и в файлах соответствующих контексту l3cd

$Config{backend_datadir}/$l3cd/data.xml

Параметр l3cd (пока что) меняется вручную в конфигурационном
файле агента ~/.l3rc

После того как параметр изменён необходимо перезапустить агент,
отправив ему сигнал HUP
killall -1 l3-agent




ЧТО НУЖНО СДЕЛАТЬ:

== Безопасность ==

* Сделать процедуру залогивинивания и проверки подлинности пользователя
* Ограничить доступ на запись в контекстные каталоги для пользователей

== Смена каталога ==
* Сделать команду l3, которая позволяет изменить и просмотреть
текущий l3-контекст

l3 pwd
l3 cd /devi/netflow
author devi
date Sun Jun 11 22:07:42 2006 +0300 (2006-06-11)
parents 098664cf339c
children 05e99d32f1f5
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 my $saved_data = "";
96 # Считываем данные и передаём их в точку получения
97 open(OUT, ">>", $Config{"backend_datafile"});
98 select OUT; $|=1;
99 while(<$client>) {
100 print OUT $_;
101 $saved_data .= $_;
102 }
103 close(OUT);
105 while ($saved_data =~ m@<(session|command)>(.*)</$1>@sg) {
106 my $element_name = $1;
107 my $element = $2;
108 if ($element =~ m@<l3cd>(.*?)</l3cd>@msg) {
109 # Обнаружен элемент l3cd
110 # Информация должна быть сохранена в соответствующий каталог
111 my $l3cd = $1;
112 # Путь l3cd должен быть не пуст,
113 # и в нём могут быть только символы латинского алфавита, цифры и знаки _ и -
114 if ($l3cd && $l3cd =~ /^[a-zA-Z_\/0-9-]*/) {
115 system("mkdir -p $Config{backend_datadir}/$l3cd");
116 if (open(OUT, ">>", $Config{"backend_datadir"}."/$l3cd/data.xml")) {
117 print OUT "<$element_name>".$element."</$element_name>";
118 close(OUT);
119 };
120 }
121 }
122 }
123 }
124 continue {
125 # Наш родитель
126 close ($client);
127 }
128 }