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