2fedd
public text v1 · immutable#!/usr/bin/perl -w
use File::Copy;
use POSIX qw(strftime);
use Sys::Syslog qw(:DEFAULT setlogsock);
#$ENV{PGPPATH}='/root/.gnupg/';
$ENV{GNUPGHOME}='/usr/local/rshb/.gnupg';
%keyIDhomes= (
'<pgp-fo@lyubino.rshb.com.ru>' => '/usr/local/rshb/fo/in/0901/',
);
setlogsock 'unix';
openlog 'all.in.one', 'ndelay,pid,nowait', 'local3';
syslog('debug', "Начало работы");
&parse_header() || return 0;
# syslog LOG_INFO, "%s", "Почта от $USERADDR";
#if ( defined $SUBJECT ) { $filename="$USERADDR_$SUBJECT" }
#else {
# $nowis= strftime "%Y-%m-%d %H-%M-%S", localtime;
# $filename="$nowis $$"
#};
$filename = "$SUBJECT";
$cryptedfile = "$SUBJECT.pgp";
syslog('debug', "Получен файл от $USERADDR - $filename");
chdir '/usr/local/rshb/fo/temp' or safe_die("Не могу перейти в каталог /usr/local/rshb/fo/temp");
open TEMPFILE, ">$cryptedfile" or safe_die("Не могу открыть файл $cryptedfile для записи вложения в него. Ошибка $!");
print TEMPFILE <>;
close TEMPFILE;
syslog('debug', "Приступаю к расшифровке файла $cryptedfile");
#$pgpres=`/usr/local/bin/pgp +batchmode -z Charlie $cryptedfile -o $filename`;
#$pgpres=`/usr/local/bin/pgp -z Charlie $cryptedfile -o $filename`;
$pgpres=`/usr/local/bin/gpg --outputfile $filename --decrypt $cryptedfile`;
if ( $? == 0 )
{
syslog('debug', "Расшифровывание завершилось удачно");
`rm -f $cryptedfile`;
if ( $pgpres =~ /Good\ signature\ from\ user\ \"(.*)\"\./m ) {
$keyID=$1;
syslog('debug', "Найден ключ $keyID");
if ( exists $keyIDhomes{$keyID} ) {
$now_string = strftime "%Y-%m-%d %H-%M-%S ", localtime;
chmod 0666, "$filename" or safe_die("!!! Не могу изменить права доступа на файл $filename");
$archfilename = "/usr/local/rshb/fo/archive/" . $now_string . $filename;
syslog('debug', "%s", "Имя файла в архиве - $archfilename");
copy($filename, $archfilename) or safe_die("Не удалось скопировать файл $filename в /usr/local/rshb/fo/archive/$now_string" . '_' . "$filename - ошибка: $!");
move($filename, "$keyIDhomes{$keyID}$filename") or safe_die("Расшифрованный файл не удалось переместить в каталог пользователя ($keyIDhomes{$keyID}) - ошибка $!");
if ($USERADDR =~ /bolsher/)
{
open MP, "| /usr/bin/mail -s 'Квитанция: $filename' oper\@bolsher.rshb.com.ru";
print MP "Транспортной системой успешно принят файл $filename\n";
close MP;
}
}
else {
safe_die("Для ключа $keyID не определён каталог")
}
}
else {
safe_die("Странная ситуация: PGP завершила работу удачно, но KeyID найти не удалось - возможно шифрование сторонним ключом\n$pgpres\n")
}
}
else
{
syslog('debug', "%s %d", "!!! Не расшифровывается $cryptedfile", length($cryptedfile));
syslog('debug', $pgpres);
}
syslog('debug', "Работа закончена");
closelog;
sub parse_addr
{
local($line)=@_;
return $1 if ($line=~/^[^<]*<(\S+@\S+)>/o);
return $1 if ($line=~/^(\S+@\S+)/o);
}
sub parse_header
{
undef $REPLYTO;
undef $USERADDR;
undef $SUBJECT;
while(<>)
{
last if (/^\s*$/o);
next unless (($headline,$value)=/([^:]+):\s*(.*)\s*$/o);
$SUBJECT=$value if ($headline=~/^Subject$/io);
$USERADDR=&parse_addr($value) if ($headline=~/^From$/io);
$REPLYTO=&parse_addr($value) if ($headline=~/^Reply-To$/io);
}
return 0 unless (defined($USERADDR) && defined($SUBJECT));
# ($USERNAME,$USERHOST)=split("@",$USERADDR);
return 1;
}
sub safe_die {
my $reason = shift;
syslog LOG_INFO, "!!! %s", $reason;
closelog;
die $reason
}