#! /usr/bin/perl # # mk_rcpt.pl # # This program creates j-chkmail j-rcpt database entries # from a list of users # # Usage : mk_rcpt.pl -d domain -a default-action file # # Author : Jose-Marcio Martins da Cruz # History : Feb 13, 2007 - 1st version # use strict; use Getopt::Long; my $appli = `basename $0`; chomp $appli; my $action = undef; my $domain = ""; my $default = "USER-UNKNOWN"; my $usage = 0; my $ok = GetOptions('d=s' => \$domain, 'a=s' => \$action, 'h' => \$usage); if ($usage) { usage($appli); exit (0); } my $fname = $ARGV[0]; if (length($domain) == 0 && defined $fname) { if ($fname =~ /(.*)\.relay$/) { $domain = $1; $action = "USER-UNKNOWN" unless defined $action || length($action) == 0; } if ($fname =~ /(.*)\.local$/) { $domain = $1; $action = "LOCAL-NET" unless defined $action || length($action) == 0; } if ($fname =~ /(.*)\.domain$/) { $domain = $1; $action = "DOMAIN-NET" unless defined $action || length($action) == 0; } if ($fname =~ /(.*)\.known$/) { $domain = $1; $action = "KNOWN-NET" unless defined $action || length($action) == 0; } } if (!defined ($domain) || length($domain) == 0) { usage($appli, "Domain not defined !"); exit 1; } print < 0) { printf "CheckRcptDomain:%-43s YES\n", "$domain"; printf "RcptAccess:%-48s %s\n", "$domain", $action; printf "#\n"; } my %USERS = (); $USERS{postmaster} = "OK"; $USERS{abuse} = "OK"; $USERS{root} = "KNOWN-NET"; while (<>) { chomp; next if /^\s*$/; next if /^\s*#/; next if /^\s*@/; ($_, undef) = split "#", $_, 2; my ($user, $spec, undef) = split " ", $_; #if (defined($spec) && $spec =~ /^(intranet|local|domain|friend|known)$/i) { if (defined($spec)) { $spec =~ tr/A-Z/a-z/; $USERS{$user} = $spec; } else { $USERS{$user} = ""; } } # OK : grant access # REJECT : reject all messages for this recipient # LOCAL-NET : accept messages only from LOCAL NETs # DOMAIN-NET : accept messages only from LOCAL NETs # FRIEND-NET : accept messages only from LOCAL NETs # USER-UNKNOWN : This is an user unknown (usually my %SPEC = ("known" => "KNOWN-NET", "local" => "LOCAL-NET", "domain" => "DOMAIN-NET", "friend" => "FRIEND-NET", "known" => "KNOWN-NET", "spamtrap" => "SPAMTRAP", "intranet" =>"KNOWN-NET"); foreach my $user (sort keys %USERS) { my $spec = "OK"; $spec = $USERS{$user} if length($USERS{$user}) > 0; $spec = $SPEC{$spec} if exists $SPEC{$spec}; printf "RcptAccess:%-48s %s\n", "$user\@$domain", $spec; } print <