Сервер (1.1.1.1):
Клиент (1.1.1.2):
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use POSIX;
use IO::Socket;
use XML::Simple;
use Text::Iconv;
use Data::Dumper;
my $settings = {
'user' => "smsd",
'group' => "smsd",
'port' => 22457,
'outgoing_dir' => '/var/spool/sms/outgoing/',
'logfile' => '/var/log/smstools/zabbix_smsd.log',
};
# Резолвим идентификаторы пользователя и группы
my $d_uid = getpwnam($settings->{'user'});
my $d_gid = getgrnam($settings->{'group'});
# Урезаем права
setuid($d_uid);
setgid($d_gid);
# Создаём сокет
my $sock = new IO::Socket::INET (
LocalPort => $settings->{'port'},
Proto => 'tcp',
Listen => 1,
Reuse => 1,
);
# Обрабатываем входящие соединения
while (my $client = $sock->accept()) {
# IP-адрес клиента
my $client_ip = $client->peerhost;
# Считываем данные с клиента
my $xml_data = "";
while (<$client>) {
$xml_data .= $_;
}
# Пытаемся распарсить данные
eval {
my $data = XMLin($xml_data);
# Если данные указаны
if (defined($data->{'number'}) && defined($data->{'message'})) {
# Имя файла для записи SMS
my $uniq_name = time();
my $sms_file_name = $settings->{'outgoing_dir'} . $uniq_name;
# Перекодируем сообщение
my $converter = Text::Iconv->new('UTF-8', 'UCS-2BE');
my $message = $converter->convert($data->{'message'});
# Извлекаем номер
my $number = $data->{'number'};
# Формируем SMS-сообщение
my $sms_data = "To: $number\nAlphabet: UCS2\n\n$message";
# Печатаем сообщение в файл
open SMSFILE, '>', $sms_file_name;
print SMSFILE $sms_data;
close SMSFILE;
# Формируем сообщение для записи в лог
my $logtime = strftime("%Y-%m-%d %H:%M:%S", localtime());
my $logline = "$logtime $client_ip $number $uniq_name\n";
# Пишем в лог
open LOGFILE, '>>', $settings->{'logfile'};
flock LOGFILE, 2;
print LOGFILE $logline;
close LOGFILE;
}
};
# Если произошла ошибка то не расстраиваемся
if (my $error = $@) {
}
}
# Закрываем сокет
close($sock);
Клиент (1.1.1.2):
#!/usr/bin/perl
use strict;
use warnings;
use warnings;
use IO::Socket;
use XML::Simple;
use Data::Dumper;
# Настройки
my $settings = {
'host' => '1.1.1.1',
'port' => 22457,
};
# Если количество аргументов не равняется трём:
exit 1 if @ARGV != 3;
# Извлекаем данные
my $number = shift @ARGV;
my $subject = shift @ARGV;
my $body = shift @ARGV;
# Создаём структуру данных
my $data = {
'number' => $number,
'message' => $body,
};
# Создаём строку данных
my $data_line = XMLout(
$data,
'RootName' => 'xml',
'NoAttr' => 1
);
# Создаём сокет
my $sock = new IO::Socket::INET (
PeerAddr => $settings->{'host'},
PeerPort => $settings->{'port'},
Proto => 'tcp',
);
# Пишем строку данных в сокет
print $sock $data_line;
# Закрываем сокет
close $sock;
Комментариев нет:
Отправить комментарий