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
все записанные команды теперь привязаны к контексту,
заданному в параметре
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 }
