Автор Тема: Perl, MailScanner, искам да го променя малко, ама не знам как :)  (Прочетена 2339 пъти)

laskov

  • Напреднали
  • *****
  • Публикации: 3166
    • Профил
В MailScanner има възможност за добавяне на действия. Демо програмката е такава:
Код
GeSHi (Perl):
  1. #
  2. #   MailScanner - SMTP E-Mail Virus Scanner
  3. #   Copyright (C) 2002  Julian Field
  4. #
  5. #   $Id: MyExample.pm 2331 2004-03-23 09:23:43Z jkf $
  6. #
  7. #   This program is free software; you can redistribute it and/or modify
  8. #   it under the terms of the GNU General Public License as published by
  9. #   the Free Software Foundation; either version 2 of the License, or
  10. #   (at your option) any later version.
  11. #
  12. #   This program is distributed in the hope that it will be useful,
  13. #   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. #   GNU General Public License for more details.
  16. #
  17. #   You should have received a copy of the GNU General Public License
  18. #   along with this program; if not, write to the Free Software
  19. #   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  20. #
  21. #   The author, Julian Field, can be contacted by email at
  22. #      Jules@JulianField.net
  23. #   or by paper mail at
  24. #      Julian Field
  25. #      Dept of Electronics & Computer Science
  26. #      University of Southampton
  27. #      Southampton
  28. #      SO17 1BJ
  29. #      United Kingdom
  30. #
  31.  
  32. package MailScanner::CustomConfig;
  33.  
  34. use strict 'vars';
  35. use strict 'refs';
  36. no  strict 'subs'; # Allow bare words for parameter %'s
  37.  
  38. use vars qw($VERSION);
  39.  
  40. ### The package version, both in 1.23 style *and* usable by MakeMaker:
  41. $VERSION = substr q$Revision: 2331 $, 10;
  42.  
  43. #
  44. # This file contains the CustomAction() function which is called by the
  45. # Spam Action 'custom'. If the spam action is 'custom(flag)' then this
  46. # is called with yes_or_no set to 'yes'. If the spam action is
  47. # notcustom(flag)' then this is called with yes_or_no set to 'no'.
  48. #
  49. # You can use this to implement anything you want in the way of custom
  50. # spam actions on messages. Combine this with the 'SpamAssassin Rule Actions'
  51. # setting and you can make any property of a message cause any effect on
  52. # your system.
  53. #
  54.  
  55. sub CustomAction {
  56.  my($message, $yes_or_no, $flag) = @_;
  57.  
  58. #  print STDERR "CustomAction: $message $yes_or_no $flag\n";
  59.  MailScanner::Log::InfoLog("CustomAction: $flag");
  60.  return unless $message;
  61.  if ($yes_or_no =~ /y/) {
  62.    $message->{usecaution} = 1 if $flag eq 'caution';
  63.  } else {
  64.    $message->{usecaution} = 0 if $flag eq 'caution';
  65.  }
  66. }
  67.  
  68. 1;
  69.  
  70.  
Аз замених реда "print STDERR" със следващия за да видя какво се случва - получавам съобщение (нямам предвид писмото) в системния лог.
Искам да стартирам външен скрипт, на който да подавам като параметър това "$flag", но не знам как се прави това от Perl.

PS: Хм. То чрез гугъл и програмист можело да станеш :) . Според това, мисля да ползвам system() . Остава да разбера как се подава параметър.

PS2: Та вместо това " MailScanner::Log::InfoLog..." искам да стартирам външен скрипт.
« Последна редакция: Apr 03, 2013, 21:25 от laskov »
Активен

Не си мислете, че понеже Вие мислите правилно, всички мислят като Вас! Затова, когато има избори, идете и гласувайте, за да не сте изненадани после от резултата, и за да не твърди всяка партия, че тя е спечелила, а Б.Б. (С.С., ...) е загубил, а трети да управлява.  Наздраве!  [_]3

schemer

  • Напреднали
  • *****
  • Публикации: 49
  • Distribution: Debian
  • Window Manager: Gnome 2
    • Профил
В такива ситуации е по-добре да се консултираш с официалната документация - http://perldoc.perl.org/functions/system.html

Имай предвид, че Пърл ще изчака външния процес да приключи, преди да продължи с изпълнението на кода. Ако не ти харесва, може да използваш fork ().

$dir = '/';
system ('/bin/ls', $dir);
« Последна редакция: Apr 03, 2013, 21:39 от schemer »
Активен

Demayl

  • Напреднали
  • *****
  • Публикации: 104
  • Distribution: XUbuntu,FreeBSD
  • Window Manager: Xfce
    • Профил
    • WWW
С system() е най-добре да го направиш защото ескейпва подадените параметри. Синтаксиса е system('path/to/bin',arg1,arg2.....). Иначе мързеливо може с `/path/to/bin arg arg2` или даже с qx{/path/to/bin arg arg2}, но последните са security проблемни. Ако искаш да пишеш резултата по добре използвай pipe или директно от perl да запишеш в искания файл ( open FILE, ">>", "/path/to/file" ; print FILE $flag; close FILE; )
Активен

laskov

  • Напреднали
  • *****
  • Публикации: 3166
    • Профил
Благодаря!
Мисля да е така:

@args = ("/път/bash-скрипт", $flag, "1> /dev/null 2> /dev/null");
system(@args);

Скриптът ще съдържа
echo "Имаш поща" |  smbclient -M sysadmin

където sysadmin е име на хост. Може да завърши с грешка по много причини, но не искам да знам за това, нито пък искам програмата да чака края на изпълнението му и затова се питам къде да сложа в края на командата един & и дали ще работи.


Заработи ето така:
system("/path/to/mailnotify_script $flag 1> /dev/null 2> /dev/null");

Може ли да ми разясните какво правят останалите редове в програмката-пример най-горе?
« Последна редакция: Apr 04, 2013, 10:38 от laskov »
Активен

Не си мислете, че понеже Вие мислите правилно, всички мислят като Вас! Затова, когато има избори, идете и гласувайте, за да не сте изненадани после от резултата, и за да не твърди всяка партия, че тя е спечелила, а Б.Б. (С.С., ...) е загубил, а трети да управлява.  Наздраве!  [_]3

Demayl

  • Напреднали
  • *****
  • Публикации: 104
  • Distribution: XUbuntu,FreeBSD
  • Window Manager: Xfce
    • Профил
    • WWW
package MailScanner::CustomConfig; - Това е името на модула ( нещо като клас )
use strict 'vars'; - като е написано изисква променливите да се дефинират предварително
use strict 'refs'; - грешка ако се ползва symbolic референция
no  strict 'subs'; - не дава грешка като използваш някаква дума която иначе трябва да е функция ( не знам как по-добре да го обясня )
use vars qw($VERSION); - прави глобална променлива $VERSION
$VERSION = substr q$Revision: 2331 $, 10; - От стринга който е заграден между q$$ / с q се заместват ' / се взима всичко от десетия символ до края
sub CustomAction { - Деклариране на функция
my($message, $yes_or_no, $flag) = @_; - Дефиниране на 3 променливи като се взимат от параметрите на функцията / @_ е масив като от него се взимат аргументите с референция/

MailScanner::Log::InfoLog("CustomAction: $flag"); - Извиква функцията InfoLog от модула MailScanner::Log
return unless $message; - "излиза" ако няма съобщение / undef или 0 /
if ($yes_or_no =~ /y/) { - RegEXP - true ако стринга съдържа 'y'
Долните вече трябва да са ти ясни.
Края на модула трябва да завършва с нещо което е true , в случая 1 /
Активен

laskov

  • Напреднали
  • *****
  • Публикации: 3166
    • Профил
OK! Благодаря много!
Активен

Не си мислете, че понеже Вие мислите правилно, всички мислят като Вас! Затова, когато има избори, идете и гласувайте, за да не сте изненадани после от резултата, и за да не твърди всяка партия, че тя е спечелила, а Б.Б. (С.С., ...) е загубил, а трети да управлява.  Наздраве!  [_]3

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
Кирилица и Perl
Общ форум
ivanatora 2 2919 Последна публикация Mar 08, 2005, 18:45
от picmaster
Конфигуриране на spamassassin и mailscanner
Хардуерни и софтуерни проблеми
laskov 0 1641 Последна публикация Aug 30, 2006, 13:25
от laskov
MailScanner
Настройка на програми
laskov 4 2229 Последна публикация Apr 20, 2010, 13:38
от laskov
Пощенски сървър с Sendmail, saslauthd, Dovecot, Mailscanner и SpamAssasin
Настройка на програми
sassue 0 1550 Последна публикация Sep 05, 2010, 22:46
от sassue
MailScanner vs amavisd-new
Настройка на програми
laskov 3 1260 Последна публикация Nov 15, 2019, 12:19
от ray