#-*- perl -*- # # Copyright (C) 2002,2003,2004,2005,2006 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: Qmail.pm,v 1.8 2006/02/04 08:10:08 fukachan Exp $ # package FML::MTA::Control::Qmail; use strict; use vars qw(@ISA @EXPORT @EXPORT_OK $AUTOLOAD); use Carp; my $debug = 0; =head1 NAME FML::MTA::Control::Qmail - handle qmail specific configurations. =head1 SYNOPSIS set up aliases and virtual maps for qmail. =head1 DESCRIPTION =head1 METHODS =cut # Descriptions: udummy. qmail not needs installation of alias files. # Arguments: OBJ($self) OBJ($curproc) HASH_REF($params) HASH_REF($optargs) # Side Effects: update aliases # Return Value: none sub qmail_install_alias { my ($self, $curproc, $params, $optargs) = @_; my $config = $curproc->config(); my $template_dir = $curproc->newml_command_template_files_dir(); my $ml_home_dir = $params->{ ml_home_dir }; use File::Spec; my $qmail_template_files = $config->get_as_array_ref('newml_command_qmail_template_files'); my $fml_owner_home_dir = $config->{ fml_owner_home_dir }; my $ml_name = $config->{ ml_name }; my $ml_domain = $config->{ ml_domain }; $ml_domain =~ s/\./:/g; for my $file (@$qmail_template_files) { # XXX-TODO: we should define dot-qmail file name generator as method. my $xfile = $file; $xfile =~ s/dot-/\./; $xfile =~ s/dot-/\./; $xfile =~ s/qmail/qmail-$ml_domain-$ml_name/; my $src = File::Spec->catfile($template_dir, $file); my $dst = File::Spec->catfile($fml_owner_home_dir, $xfile); $curproc->ui_message("creating $dst"); $self->_install($src, $dst, $params); } my $virtual_domain_conf = $config->{ qmail_virtualdomains_file }; unless (-f $virtual_domain_conf) { if (0) { $curproc->ui_message(" XXX We assume $ml_domain:fml-$ml_domain"); $curproc->ui_message(" XXX in $virtual_domain_conf"); } } } # Descriptions: remove .qmail-$ml* files (remove aliases). # Arguments: OBJ($self) OBJ($curproc) HASH_REF($params) HASH_REF($optargs) # Side Effects: update aliases # Return Value: none sub qmail_delete_alias { my ($self, $curproc, $params, $optargs) = @_; my $config = $curproc->config(); my $template_dir = $curproc->newml_command_template_files_dir(); my $ml_home_dir = $params->{ ml_home_dir }; use File::Spec; my $qmail_template_files = $config->get_as_array_ref('newml_command_qmail_template_files'); my $fml_owner_home_dir = $config->{ fml_owner_home_dir }; my $ml_name = $config->{ ml_name }; my $ml_domain = $config->{ ml_domain }; $ml_domain =~ s/\./:/g; for my $file (@$qmail_template_files) { my $xfile = $file; $xfile =~ s/dot-/\./; $xfile =~ s/dot-/\./; $xfile =~ s/qmail/qmail-$ml_domain-$ml_name/; my $src = File::Spec->catfile($template_dir, $file); my $dst = File::Spec->catfile($fml_owner_home_dir, $xfile); if (-f $dst) { $curproc->ui_message("removing $dst"); unlink $dst || do { my $s = "failed to remove $dst"; $curproc->ui_message("error: $s"); $curproc->logerror($s); }; } } } # Descriptions: dummy (update alias). # Arguments: OBJ($self) OBJ($curproc) HASH_REF($params) HASH_REF($optargs) # Side Effects: update aliases # Return Value: none sub qmail_update_alias { my ($self, $curproc, $params, $optargs) = @_; 0; } # Descriptions: dummy (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 qmail_find_key_in_alias_maps { my ($self, $curproc, $params, $optargs) = @_; # XXX-TODO: implement this! 0; } # 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 qmail_get_aliases_as_hash_ref { my ($self, $curproc, $params, $optargs) = @_; # XXX-TODO: implement this! 0; } # 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 qmail_alias_maps { my ($self, $curproc, $params, $optargs) = @_; # XXX-TODO: implement this! 0; } # Descriptions: create ~/.qmail-* files. # Arguments: OBJ($self) OBJ($curproc) HASH_REF($params) HASH_REF($optargs) # Side Effects: creates ~/.qmail-XXX # Return Value: none sub qmail_setup { my ($self, $curproc, $params, $optargs) = @_; 0; } # Descriptions: prepare a template for qmail/control/virtualdomains # for example: rule of a virtual domain for "nuinui.net" # nuinui.net:fml-.nuinui.net # Arguments: OBJ($self) OBJ($curproc) HASH_REF($params) # bugs: we cannot update /var/qmail/control/virtualdomains # since it needs root priviledge. # So, we can only update our templates for qmail. # Side Effects: update template not /var/qmail/control/virtualdomains # Return Value: none sub qmail_install_virtual_map { my ($self, $curproc, $params) = @_; my $fmlowner = $curproc->fml_owner(); my $config = $curproc->config(); my $ml_domain = $config->{ ml_domain }; my $virtual = $config->{ qmail_virtual_map_file }; # 1. check the current template file firstly my $found = 0; my $fh = new FileHandle $virtual; if (defined $fh) { my $buf; LINE: while ($buf = <$fh>) { $found = 1 if $buf =~ /^$ml_domain:/i; last LINE if $found; } $fh->close(); } # 2. if not found unless ($found) { $curproc->ui_message("updating $virtual"); my $fh = new FileHandle ">> $virtual"; if (defined $fh) { print $fh "$ml_domain:$fmlowner-$ml_domain\n"; $fh->close(); } } else { $curproc->ui_message("skip updating $virtual"); } } # Descriptions: dummy. # Arguments: OBJ($self) HASH_REF($args) # Side Effects: none # Return Value: none sub qmail_delete_virtual_map { 0; } # Descriptions: dummy. # Arguments: OBJ($self) HASH_REF($args) # Side Effects: none # Return Value: none sub qmail_update_virtual_map { 0; } =head1 CODING STYLE See C on fml coding style guide. =head1 AUTHOR Ken'ichi Fukamachi =head1 COPYRIGHT Copyright (C) 2002,2003,2004,2005,2006 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;