Mail-Salsa
view release on metacpan or search on metacpan
my @args = ("hash", "$virtusertable\.db");
exec("makemap", @args) or die("Can't exec program: $!");
}
}
exit();
}
#---rmlistfiles-------------------------------------------------------------
sub rmlistfiles {
my $dirs = shift;
my $list = shift;
print "Clean mailing list directories and files:\n";
my ($name, $domain) = split(/\@/, $list);
for my $dir (@{$dirs}) {
$dir =~ s/\/+$//;
$dir =~ /\/salsa\/?/ or die("$!\n");
unless(-d $dir) {
print "The directory \"$dir\" not exists!\n";
next;
}
opendir(DIRECTORY, $dir) or die("Can't opendir $dir: $!\n");
while(defined(my $file = readdir(DIRECTORY))) {
next if($file =~ /^\.\.?$/);
$file eq $domain or next;
(-d "$dir/$file") or next;
my $path = join("/", $dir, $domain, $name);
(-d $path) or next;
opendir(DIR, $path) or die("Can't opendir $path: $!\n");
while(defined(my $file = readdir(DIR))) {
next if($file =~ /^\.\.?$/);
unlink("$path/$file") or die("Couldn't unlink file $path/$file: $!");
print "The file \"$path/$file\" has been removed...\n";
}
closedir(DIR);
rmdir($path) or die("Couldn't remove dir $path: $!");
print "The directory \"$path\" has been removed...\n";
$path =~ s/\/[^\/]+$//;
my $count = 0;
opendir(DIR, $path) or die("Can't opendir $path: $!\n");
while(defined(my $file = readdir(DIR))) {
next if($file =~ /^\.\.?$/);
$count++;
}
closedir(DIR);
unless($count) {
rmdir($path) or die("Couldn't remove dir $path: $!");
print "The directory \"$path\" has been removed...\n";
}
}
closedir(DIRECTORY);
}
return();
}
#---update_file-------------------------------------------------------------
sub update_file {
my $file = shift;
my $callback = shift;
die("The file \"$file\.lock\" already exists: $!") if(-e "$file\.lock");
my $notexist = 1;
open(FILE, "<", $file) or die("$!");
flock(FILE, LOCK_EX);
open(UPDATE, ">", "$file\.lock") or die("$!");
select(UPDATE);
while(<FILE>) {
if($notexist == 1 || $notexist == 3) {
my $res = $callback->($notexist);
if($res == 1) { next; }
elsif($res == 2) { last; }
}
print UPDATE $_;
}
$notexist = 0 if($notexist == 3);
close(UPDATE);
flock(FILE, LOCK_UN);
close(FILE);
if($notexist) { unlink("$file\.lock") or die("$!"); }
else { rename("$file\.lock", $file) or die("$!"); }
select(STDOUT);
return($notexist);
}
#---update_aliases----------------------------------------------------------
sub update_aliases {
my $list = shift;
my $file = shift;
my $personalized = shift;
my ($name, $domain) = split(/\@/, $list);
my $pattern = "\^$name\\\_at_$domain\\\: +\\\"[^\\\"]+ (P[a-z]+)\\\"\\s\$";
my $type = $personalized eq "yes" ? "Personalize" : "Post";
my $callback = sub {
if(/$pattern/) {
my $oldtype = $1;
if($type eq $oldtype) {
$_[0] = 2;
return(2);
} else {
s/$oldtype(?=\")/$type/;
$_[0] = 0;
}
}
return(0);
};
return(&update_file($file, $callback));
}
#---upadte_vutable----------------------------------------------------------
sub update_vutable {
my $list = shift;
my $file = shift;
my $owner = shift;
my ($name, $domain) = split(/\@/, $list);
my $pattern = "\^$name-owner\\\@$domain\[ \\t\]\+(\[\^\\\@\]\+\\\@\[\^\\\@\]\+)\\s\$";
my $callback = sub {
if(/$pattern/) {
if($1 eq $owner) {
$_[0] = 2;
return(2);
} else {
$_[0] = 0;
$_ = "$name-owner\@$domain\t$owner\n";
}
}
return(0);
};
return(&update_file($file, $callback));
}
#---remove_mlist------------------------------------------------------------
sub remove_mlist {
my $file = shift;
my $type = shift;
my $list = shift;
my ($name, $domain) = split(/\@/, $list);
my %pattern = (
'aliases' => "\^$name\-\?\[\^_\]\*_at_$domain\: \+",
'vtable' => "\^$name\-\?\[\^\@\]\*\@$domain\[ \\t\]\+"
);
my $callback = sub {
if(/$pattern{$type}/) {
$_[0] = 3;
return(1);
}
return(0);
};
return(&update_file($file, $callback));
}
#---add_mlist---------------------------------------------------------------
sub add_mlist {
my $file = shift;
my $type = shift;
my $list = shift;
my $owner = shift;
my $personalized = shift || "no";
my ($name, $domain) = split(/\@/, $list);
my $exist = 0;
my %pattern = (
'aliases' => "\^$name\_at_$domain\:\[ \\t\]\+",
'vtable' => "\^$list\[ \\t\]\+",
( run in 0.598 second using v1.01-cache-2.11-cpan-39bf76dae61 )