lilalo

annotate l3-backend @ 131:ab7c06df9db9

merge
author Igor Chubin <igor@chub.in>
date Fri Jul 04 17:46:39 2008 +0300 (2008-07-04)
parents 53b890d1ae90
children
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 }