#-*- perl -*- # # Copyright (C) 2003,2004 Ken'ichi Fukamachi # All rights reserved. This program is free software; you can # redistribute it and/or modify it under the same terms as Perl itself. # # $FML: Sendmail.pm,v 1.2 2004/01/22 15:01:02 fukachan Exp $ # package FML::MTA::Control::Sendmail; use strict; use vars qw(@ISA @EXPORT @EXPORT_OK $AUTOLOAD); use Carp; my $debug = 0; =head1 NAME FML::MTA::Control::Sendmail - handle sendmail specific configurations =head1 SYNOPSIS set up aliases and virtual maps for sendmail. =head1 DESCRIPTION =head1 METHODS =cut # BUGS #XXX-TODO: We should check "Tfml" in sendmail.cf in installation. # Descriptions: install new alias entries. # Arguments: OBJ($self) # OBJ($curproc) HASH_REF($params) HASH_REF($optargs) # Side Effects: update aliases # Return Value: none sub sendmail_install_alias { my ($self, $curproc, $params, $optargs) = @_; $self->postfix_install_alias($curproc, $params, $optargs); } # Descriptions: remove alias. # Arguments: OBJ($self) # OBJ($curproc) HASH_REF($params) HASH_REF($optargs) # Side Effects: update aliases # Return Value: none sub sendmail_remove_alias { my ($self, $curproc, $params, $optargs) = @_; $self->postfix_remove_alias($curproc, $params, $optargs); } # Descriptions: regenerate aliases.db. # Arguments: OBJ($self) # OBJ($curproc) HASH_REF($params) HASH_REF($optargs) # Side Effects: update aliases # Return Value: none sub sendmail_update_alias { my ($self, $curproc, $params, $optargs) = @_; my $config = $curproc->config(); my $prog = $config->{ path_sendmail }; my $alias = $config->{ mail_aliases_file }; $curproc->ui_message("updating $alias database"); if (-x $prog) { system "$prog -bi -oA$alias"; } else { warn("sendmail='$prog' not found"); } } # Descriptions: find key in aliases. # Arguments: OBJ($self) # OBJ($curproc) HASH_REF($params) HASH_REF($optargs) # Side Effects: none # Return Value: NUM(1 or 0) sub sendmail_find_key_in_alias_maps { my ($self, $curproc, $params, $optargs) = @_; $self->postfix_find_key_in_alias_maps($curproc, $params, $optargs); } # Descriptions: get { key => value } in aliases. # Arguments: OBJ($self) # OBJ($curproc) HASH_REF($params) HASH_REF($optargs) # Side Effects: none # Return Value: HASH_REF sub sendmail_get_aliases_as_hash_ref { my ($self, $curproc, $params, $optargs) = @_; $self->postfix_get_aliases_as_hash_ref($curproc, $params, $optargs); } # Descriptions: return alias_maps as ARRAY_REF. # Arguments: OBJ($self) # OBJ($curproc) HASH_REF($params) HASH_REF($optargs) # Side Effects: none # Return Value: ARRAY_REF sub sendmail_alias_maps { my ($self, $curproc, $params, $optargs) = @_; # XXX-TODO: NOT IMPLEMENTED. return []; } # Descriptions: install configuration templates. # Arguments: OBJ($self) # OBJ($curproc) HASH_REF($params) HASH_REF($optargs) # Side Effects: create include* # Return Value: none sub sendmail_setup { my ($self, $curproc, $params, $optargs) = @_; $self->postfix_setup($curproc, $params, $optargs); } # Descriptions: rewrite $params. # Arguments: OBJ($self) # OBJ($curproc) HASH_REF($params) HASH_REF($optargs) # Side Effects: update $params # Return Value: none sub _sendmail_rewrite_virtual_params { my ($self, $curproc, $params, $optargs) = @_; # XXX-TODO remove this. } # Descriptions: install sendmail virtual_maps. # Arguments: OBJ($self) # OBJ($curproc) HASH_REF($params) HASH_REF($optargs) # Side Effects: install/udpate sendmail virtual_maps and the .db # Return Value: none sub sendmail_install_virtual_map { my ($self, $curproc, $params, $optargs) = @_; my $template_dir = $curproc->template_files_dir_for_newml(); my $config = $curproc->config(); my $ml_name = $config->{ ml_name }; my $ml_domain = $config->{ ml_domain }; use File::Spec; my $virtual = $config->{ sendmail_virtual_map_file }; my $src = File::Spec->catfile($template_dir, 'postfix_virtual'); my $dst = $virtual . "." . $$; $curproc->ui_message("updating $virtual"); # at the first time unless( -f $virtual) { use FileHandle; my $fh = new FileHandle ">> $virtual"; if (defined $fh) { print $fh "#\n"; print $fh "# you need to specify $ml_domain "; print $fh "as a destination in sendmail.cf.\n"; print $fh "#\n"; $fh->close(); } } $self->_install($src, $dst, $params); use File::Utils qw(append); append($dst, $virtual); unlink $dst; } # Descriptions: remove sendmail virtual_maps. # Arguments: OBJ($self) # OBJ($curproc) HASH_REF($params) HASH_REF($optargs) # Side Effects: remove/udpate sendmail virtual_maps and the .db # Return Value: none sub sendmail_remove_virtual_map { my ($self, $curproc, $params, $optargs) = @_; my $config = $curproc->config(); my $map = $config->{ sendmail_virtual_map_file }; my $key = $params->{ ml_name }; my $p = { key => $key, map => $map, }; $self->_remove_postfix_style_virtual($curproc, $params, $optargs, $p); } # Descriptions: regenerate virtual.db. # Arguments: OBJ($self) # OBJ($curproc) HASH_REF($params) HASH_REF($optargs) # Side Effects: update aliases # Return Value: none sub sendmail_update_virtual_map { my ($self, $curproc, $params, $optargs) = @_; my $config = $curproc->config(); my $makemap = $config->{ path_makemap }; my $virtual = $config->{ sendmail_virtual_map_file }; # XXX-TODO: NOT IMPLEMENTED if (-f $virtual) { $curproc->ui_message("updating $virtual database"); # XXX-TODO: oops, hash HARD CODED. if (-x $makemap) { system "$makemap hash $virtual < $virtual"; } else { warn("makemap='$makemap' not found"); } } } =head1 UTILITIES =head2 sendmail_supported_map_types get map types supported by makemap. =cut # Descriptions: get map types supported by makemap. # Arguments: OBJ($self) # OBJ($curproc) HASH_REF($params) HASH_REF($optargs) # Side Effects: none # Return Value: ARRAY_REF sub sendmail_supported_map_types { my ($self, $curproc, $params, $optargs) = @_; my $config = $curproc->config(); my $makemap = $config->{ path_makemap }; if (-x $makemap) { my $buf = `$makemap -l`; chomp $buf; my @maps = split(/\s+/, $buf); return \@maps; } else { return []; } } =head1 CODING STYLE See C on fml coding style guide. =head1 AUTHOR Ken'ichi Fukamachi =head1 COPYRIGHT Copyright (C) 2003,2004 Ken'ichi Fukamachi All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 HISTORY FML::MTA::Control first appeared in fml8 mailing list driver package. See C for more details. =cut 1;