#-*- perl -*-
#
# Copyright (C) 2004,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: mergeml.pm,v 1.8 2006/03/04 13:48:29 fukachan Exp $
#
package FML::Command::Admin::mergeml;
use strict;
use vars qw(@ISA @EXPORT @EXPORT_OK $AUTOLOAD);
use Carp;
=head1 NAME
FML::Command::Admin::mergeml - top level dispather of configuration merge.
=head1 SYNOPSIS
use FML::Command::Admin::mergeml
my $ml = new FML::Command::Admin::mergeml;
$ml->process($curproc, $command_context);
=head1 DESCRIPTION
This class is the top level dispather of configuration merging.
It converts fml4 configurations to fml8 ones and
set up fml8 style configurations.
=head1 METHODS
=head2 new()
constructor.
=head2 need_lock()
not need lock in the first time.
=cut
# Descriptions: constructor.
# Arguments: OBJ($self)
# Side Effects: none
# Return Value: OBJ
sub new
{
my ($self) = @_;
my ($type) = ref($self) || $self;
my $me = {};
return bless $me, $type;
}
# Descriptions: not need lock in the first time.
# Arguments: none
# Side Effects: none
# Return Value: NUM( 1 or 0)
sub need_lock { 0;}
=head2 process($curproc, $command_context)
merge other mailing list driver system into fml8.
=cut
# Descriptions: merge other mailing list driver system into fml8.
# Arguments: OBJ($self) OBJ($curproc) OBJ($command_context)
# Side Effects: create mailing list directory,
# install config.cf, include, include-ctl et. al.
# Return Value: none
sub process
{
my ($self, $curproc, $command_context) = @_;
my $config = $curproc->config();
my $options = $command_context->get_options() || [];
my $src_dir = $options->[ 0 ] || '';
# XXX-TODO: can we here use $curproc->ml_*() ?
my $ml_name = $config->{ ml_name };
my $ml_domain = $config->{ ml_domain };
my $ml_home_prefix = $curproc->ml_home_prefix($ml_domain);
my $ml_home_dir = $curproc->ml_home_dir($ml_name, $ml_domain);
my $owner = $config->{ newml_command_ml_admin_default_address }||
$curproc->fml_owner();
my $params = {
ml_name => $ml_name,
ml_domain => $ml_domain,
ml_home_dir => $ml_home_dir,
# old ml_home_dir path (e.g. /var/spool/ml/elena).
src_dir => $src_dir,
# fml4
target_system => "fml4",
};
# mkdir $ml_home_prefix if could.
unless (-d $ml_home_prefix) {
$curproc->mkdir($ml_home_prefix, "mode=public");
}
# fundamental check
croak("\$ml_name is not specified") unless $ml_name;
croak("\$ml_home_dir is not specified") unless $ml_home_dir;
croak("\$ml_home_prefix not exists") unless -d $ml_home_prefix;
# check if $ml_home_prefix is writable
croak("\$ml_home_prefix is not writable") unless -w $ml_home_prefix;
# get and check argument.
croak("specify old \$ml_home_dir") unless $src_dir;
croak("specify directory as an argument") unless -d $src_dir;
# update $ml_home_prefix and $ml_home_dir to expand variables again.
$config->set( 'ml_home_prefix', $ml_home_prefix );
$config->set( 'ml_home_dir', $ml_home_dir );
# XXX-TODO: we should use ui_message() ?
# HERE WE GO!
my $ml_list = "$ml_name\@$ml_domain";
print STDERR "merge configurations at @$options into $ml_list\n";
$self->merge($curproc, $command_context, $params);
}
# Descriptions: merge ML configurations.
# Arguments: OBJ($self)
# OBJ($curproc) OBJ($command_context) HASH_REF($params)
# Side Effects: none
# Return Value: none
sub merge
{
my ($self, $curproc, $command_context, $params) = @_;
my $src_dir = $params->{ src_dir } || undef;
my $system = $params->{ target_system } || undef;
# XXX-TODO: configurable.
use FML::Merge;
my $merge = new FML::Merge $curproc, $params;
$merge->set_target_system($system);
# 1. back up .
$merge->backup_old_config_files();
# 2. fix include*.
$merge->disable_old_include_files();
# 3. run newml --force.
use FML::Command::Admin::newml;
my $ml = new FML::Command::Admin::newml;
$ml->set_force_mode($curproc, $command_context);
$ml->process($curproc, $command_context);
# 4. convert files if needed.
$merge->convert_list_files();
# 5. analyze fml4 configuration and build diff only.
# 6. translate diff into fml8 cf.
$merge->merge_into_config_cf();
# 7. warning.
use File::Basename;
use File::Spec;
my $_dir = dirname($src_dir);
my $i = File::Spec->catfile($_dir, "etc", "fml", "site_init.ph");
if (-f $i) {
print STDERR "WARNING: $i exist.\n";
print STDERR "WARNING: you need to translate site_init.ph by hand.\n";
}
my $f = File::Spec->catfile($_dir, "etc", "fml", "site_force.ph");
if (-f $f) {
print STDERR "WARNING: $f exist.\n";
print STDERR "WARNING: you need to translate site_force.ph by hand.\n";
}
}
=head1 CODING STYLE
See C on fml coding style guide.
=head1 AUTHOR
Ken'ichi Fukamachi
=head1 COPYRIGHT
Copyright (C) 2004,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::Command::Admin::mergeml appeared in fml8 mailing list driver package.
See C for more details.
=cut
1;