| rev | 
   line source | 
| 
devi@27
 | 
     1 #!/usr/bin/perl
 | 
| 
devi@27
 | 
     2 
 | 
| 
devi@27
 | 
     3 use strict;
 | 
| 
devi@27
 | 
     4 use lib '.';
 | 
| 
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 }
 |