Zimbra Część 3 – Filtracja przesyłania wiadomości email (Narzędzia)

  Do poprzednich wpisów dodajemy jeszcze dwa narzędzia, które maja usprawnić administrację serwerem bądź są skryptami pomocniczymi dla innych skryptów. 2.1. Globalne usuwanie uprawnień dla pojedynczego adresu Skrypt clear_users.pl usuwa […]

 

Do poprzednich wpisów dodajemy jeszcze dwa narzędzia, które maja usprawnić administrację serwerem bądź są skryptami pomocniczymi dla innych skryptów.

2.1. Globalne usuwanie uprawnień dla pojedynczego adresu

Skrypt clear_users.pl usuwa wszystkie wystąpienia danego ciągu znaków ze wszystkich plików konfiguracyjnych w katalogu /root/postfix_conf/scripts/perms oraz jego podkatalogach. W ten sposób możemy usunąć globalnie jakiś adres z listy uprawnionych.

Skrypt porównuje podany jako argument ciąg znaków z każda linią wszystkich kolejnych plików. Jeżeli w danej linii znajdzie się identyczny ciąg znaków Gana linia zostanie usunięta.

Porównanie łańcucha szukanego z linia jest realizowane za pomocą RegEx’a co pociąga za sobą następujące konsekwencje:

  1. 1. Łańcuch znaków nie musi być dokładny wystarczy, że będzie możliwie unikalny (Uwaga: łańcuch zbyt ogólny może spustoszyć pliki z uprawnieniami)
  2. Wyłączone zostało interpretowanie znaków specjalnych w RegExie wiec jeżeli w łańcuchu występują znaki specjalne np. „@ $ . ?” itp. NIE należy ich poprzedzić znakiem „\”

Przy okazji skrypt usuwa wszystkie niepotrzebne spacje i inne białe znaki.

Przykład użycia. Usuwamy wszystkie wystąpienia ciągu root@mojadomena.pl

#clear_users.pl root@mojadomena.pl

UWAGA!!!
Skrypt zakłada że pliki uprawnień zostały umieszczone w katalogu tak jak to zostało opisane w poprzednim wpisie z tej serii „Zimbra Część 2 -…”

#use strict;
#use warnings;
# Configuration:
$internal_path = „/opt/zimbra/postfix/conf/scripts/perms”;
$list_directories = „false”;
$list_files = „true”;
$list_bytes_total = „false”;
@Directory_Parent = $internal_path;
my $search_string = shift @ARGV;
if ($search_string eq „”){ 

help();

}
else{
print „Na pewno chcesz usunac wszystkie wystapienia $search_string w plikach perms? [y/n]\n”;
my $key;
do {$key = <STDIN>; chomp($key);} while($key !~ /^[yn]+$/i);
exit if($key =~ /n/i);

while (@Directory_Parent){
$directory = shift (@Directory_Parent);
opendir(DIR, $directory) || next;
while (defined($child = readdir(DIR))){

if ((-d „$directory/$child”) && ($child ne „.”) && ($child ne „..”)){

push(@Directory_Parent, „$directory/$child”);

if ($list_directories eq „true”){

push (@Directory_List, „$directory/$child”);

}
}

if ((-f „$directory/$child”) && ($list_files eq „true”)){
push (@File_List, „$directory/$child”);
}
if ((-f „$directory/$child”) && ($list_bytes_total eq „true”)){
$filename = „$directory/$child”;
$bytes = $bytes + (-s $filename);
}
}
closedir(DIR);
if ($bytes){
push (@Bytes, ” $directory : $bytes”);
$bytes = 0;
}
}

# @Directory_List = sort { $a cmp $b } (@Directory_List);
# @File_List = sort { $a cmp $b } (@File_List);

print „All apirience of: $search_string will be delitred in all files in: $internal_path\n\n”;

for (@File_List){
$infile = $PERMS_DIR.$_;
#print „FLILE IN: $infile\n”;
open FILE_IN, $infile or die $!;
my @file_in =<FILE_IN>;
close FILE_IN;

#print  „FILE OUT: $infile\n”;
open FILE_OUT, „>$infile” or die $!;
for (@file_in){
s/\s+/ /g;
s/^\s//;
s/\s$//;
#TU DECYDUJEMY CO USUWA JEZELI NA MA BYC FULL REGEX WSTAWIAMY ($_ ne $search_string)
if ($_ !~ /\Q$search_string\E/){
print FILE_OUT „$_ \n”;
}
else{
print „File processed $infile string $_ removed \n”;
}
}
close FILE_OUT;
}
}
exit;

sub help{
print „\n\nProgram usuwa wszystkie wystpienia zdefiniowanego lancucha\nze wszystkich plikow w katalogu perms/\n”;
print „Wywolanie: .\/clear_user <String_do_usuniecia>\n\n\n”;
}

2.2. Lista wszystkich uprawnionych adresów

Skrypt wypisuje wszystkie dozwolone adresy emailowe i zapisuje je w pliku /root/postfix_conf/scripts/allow.log bądź wyświetla na konsoli. Skrypt jest narzędziem pomocniczym dla innych skryptów.

#! /usr/bin/perl
use strict;
use warnings; 

############################################
#Config variables
my $SCRIPT_PATH = ‚/opt/zimbra/postfix/conf/scripts/’;
my $PERMS_PATH = $SCRIPT_PATH . ‚perms/’;
my $DEBUG_FILE = $SCRIPT_PATH . „allow.log”;
my $INCLUDE = „\@include”;
my $ALLOW_ALL = „allow_all”;
#End Config variables
############################################
my (@allow_emails, @process_files, @files, @tmp, @includes);
my ($email, $file);

#debug Output
open (DEBUG, „>>$DEBUG_FILE”);
*DEBUG = *STDOUT;
opendir(IMD, $PERMS_PATH) || die(„Cannot open directory”);
@files= readdir(IMD);

for $file (@files){
if (!(grep $_ eq $file, @process_files)&& ($file ne „.”) && ($file ne „..”)){
open_file($PERMS_PATH.$file, \@tmp);
for $email (@tmp){
if(($email =~/$INCLUDE/) && !(grep $_ eq $email, @includes)){
push @includes, $email;
#print „include: $email\n”;
}
elsif (($email !~/$ALLOW_ALL/) && ($email!~/$INCLUDE/)&& !(grep $_ eq $email, @allow_emails)){
#print „f: $email\n”;
push @allow_emails, $email;
}
}
push @process_files, $file;
}
}
do{
$file = shift @includes;
@files = split(/=/,$file);
$file = $files[1];
if ((-f $PERMS_PATH.$file) && !(grep $_ eq $file, @process_files)){
open_file($PERMS_PATH.$file, \@tmp);
for $email (@tmp){
if(($email =~/$INCLUDE/) && !(grep $_ eq $email, @includes)){
push @includes, $email;
}
elsif (($email !~/$ALLOW_ALL/)&& ($email !~/$INCLUDE/)&&!(grep $_ eq $email, @allow_emails)){
#print „i: $email\n”;
push @allow_emails, $email;
}
}
push @process_files, $file;
}
}while(scalar @includes);

#print DEBUG „\nAllow Emails:\n”;              #DEBUG
for (@allow_emails){
print DEBUG „$_\n”;
}
#print DEBUG „\nProcessed Files:\n”;                  #DEBUG
#for (@process_files){
#    print DEBUG „|$_|\n”;
#}
close (DEBUG);
exit;

##############
#SUBS
########################################################
sub open_file {
my $path = shift;
my $emails = shift;
#print DEBUG „openfile()!! \nPath: $path\n”;
open FILE, $path or die „Can’t open @_: $@!\n”;
while (<FILE>){
if („$_” ne „\n”){
s/\s+/ /g;                    #clean white spaces
s/^\s//;               #clean white spaces
s/\s$//;               #clean white spaces
s/#.*//;               #ignore comments by erasing them
next if /^(\s)*$/;     #skip blank lines
chomp;                 #remove trailing newline characters
push @{$emails}, $_;
}
}
close FILE;
}