CGI/Perl Guide | Learning Center | Forums | Advertise | Login
Site Search: in

  Main Index MAIN
INDEX
Search Posts SEARCH
POSTS
Who's Online WHO'S
ONLINE
Log in LOG
IN

Home: Perl Programming Help: Beginner:
migrating aliases & groups from SME7 to Zimbra using a perl script

 



agarrett5
New User

May 15, 2014, 12:42 AM

Post #1 of 3 (2718 views)
migrating aliases & groups from SME7 to Zimbra using a perl script Can't Post

Hi,

I am trying to migrate SME aliases from SME7 server install to latest version of Zimbra OSE (8.0.7). Zimbra is sitting on top of Ubuntu server 12.04.

I have downloaded a script from the research I have done to find out how to do this, but when the script is run I get errors.

The Script is run on the SME box to create zmprov commands to run on Zimbra server

The errors I get are:


Quote
perl -w aliascript.pl
Name "main::alias" used only once: possible typo at aliascript.pl line 143 (#1)
(W once) Typographical errors often show up as unique variable names.
If you had a good reason for having a unique name, then just mention it
again somehow to suppress the message. The our declaration is
provided for this purpose.

NOTE: This warning detects symbols that have been used only once so $c, @c,
%c, *c, &c, sub c{}, c(), and c (the filehandle or format) are considered
the same; if a program uses $c only once but also uses any of the others it
will not trigger this warning.

Name "main:u" used only once: possible typo at aliascript.pl line 150 (#1)


The script that I am running is:


Code
#!/usr/bin/perl 
use diagnostics;
################################################## ##############################
# $Id: aliases2zmprov,v 1.4 2007/03/07 22:18:56 dlbewley Exp $
#-------------------------------------------------------------------------------
# Description:
# Tool to create commands suitable for zmprov from a unix aliases file.
#
# Handles the case of an :include: construct.
# - Comments in include file are parsed as follows
# - "Foo" goes in LDAP description attribute, "Bar" in the displayname.
# # Description: foo
# # Name: Bar
#
# Handles the case of remote and multiple recipients by making a dist list.
# - A Zimbra alias must be associated with exactly one Zimbra account.
# - A Zimbra distribution list may contain users on remote hosts.
#
# See Also:
# http://wiki.zimbra.com/index.php?title=Bulk_Create
#
# Usage:
# ./aliases2zmprov /etc/aliases 1> aliases.zmp 2> aliases.err
# zmprov < aliases.zmp
#
################################################## ##############################

my @CNAME_SKIP= qw( ftp news postmaster root webmaster );
my @ALIAS_SKIP= qw( abuse mailer-daemon postmaster );
my @DISTRIBUTION_LISTS;
my $DOMAIN = 'abacuscover.com';
my $SOURCE_HOST = 'eserver';

use File::Basename;

while(<>) {
chomp;
s/#.*$//; # skip comments
next if /^\s*$/; # skip blank lines

my ($description,$display_name,@cnames);
my ($alias,$cname) = split(/:/,$_,2);

$alias =~ s/\s*//g;
# scrutinize the aliases
if (grep /^$alias$/, @ALIAS_SKIP) {
warn "skipping alias $alias -> $cname";
next;
}

$cname =~ s/\s*//g; # remove all spaces

# scrutinize the canonical names
if ($cname =~ m/:include:/) {
(($description, $display_name, $cnames_ref) =
parse_include($cname)) || next;
@cnames = @{$cnames_ref};
}
if ($cname =~ m/,/) {
# multiple recipients make this a list instead of an
alias
@cnames = split(/,/,$cname);
}

# if more than one cname then it is a dist list
if (length($cnames[0])) {
print "\n";
print "createDistributionList $alias\@$DOMAIN\n";
push (@DISTRIBUTION_LISTS, $alias);
if ($display_name) {
print "modifyDistributionList $alias\@$DOMAIN
displayname \"$display_name\"\n";
$display_name = undef;
}
if ($description) {
print "modifyDistributionList $alias\@$DOMAIN
description \"$description\"\n";
$description = undef;
}
foreach my $member (@cnames) {
# skip aliases to certain users
if (grep /^$member$/, @CNAME_SKIP) {
warn "skipping cname $member <- $alias";
next; # go to next member
}
# A Zimbra distribution list may contain users on
remote hosts.
if ($member =~ m/\@/) {
print "addDistributionListMember
$alias\@$DOMAIN $member\n";
} else {
print "addDistributionListMember
$alias\@$DOMAIN $member\@$DOMAIN\n";
}
}
print "\n";
@cnames=();
next; # go to next line of aliases file
}

# skip aliases to certain users
if (grep /^$cname$/, @CNAME_SKIP) {
warn "skipping cname $cname <- $alias";
next;
}
if ($cname =~ m/\/|\|/) {
# alias to a file or a program. don't try to
accomodate
warn "WARNING skipping cname $cname <- $alias it is a
file or pipe";
next;
}

# A Zimbra alias must be associated with exactly one
Zimbra account.
if ($cname =~ m/\@/) {
# alias to remote host. this could be created as a
dist list with 1 member
# that seems undersirable though.
print "\n";
print "createDistributionList $alias\@$DOMAIN\n";
print "addDistributionListMember $alias\@$DOMAIN
$cname\n";
print "\n";
next; # go to next line of aliases file
}
# is the cname a distribution_list already?
if (grep /^$cname$/, @DISTRIBUTION_LISTS) {
print "addDistributionListAlias $cname\@$DOMAIN
$alias\@$DOMAIN\n";
}
# are we sure that account $cname\@$DOMAIN exists?
else {
print "addAccountAlias $cname\@$DOMAIN
$alias\@$DOMAIN\n";
}
}

# read an included alias file. commens with Name: and
Description:
# are placed into LDAP attributes for the list
sub parse_include {
my $cname = shift;
my @cnames;
# need to pull in contents of file and make a dist
# list instead of an alias
my $fullfile = $cname;
$fullfile =~ s/:include://;
my ($file,$path) = fileparse($fullfile);
if (! -e $file) {
warn "WARNING skipping $alias -> $cname Please run
'scp $SOURCE_HOST:$fullfile .'";
return; # go to next line of aliases file
} else {
# process include file
open(F,$file) || warn "Can not read $file";
while (<F>) {
chomp;
(m/#\s*Department:*\s*(.*)/) && ($ou = $1); #
can't make use of this in zmprov mdl
if (m/#\s*Description:*\s*(.*)/) {
$description = $1;
$description =~ s/"/'/g; # don't blow our
command line
}
if (m/#\s*Name:*\s*(.*)/) {
$display_name = $1;
$display_name =~ s/"/'/g; # don't blow our
command line
}
s/#.*$//; # skip comments
next if /^\s*$/; # skip blank lines
push @cnames, $_;
}
}
return $description, $display_name, \@cnames;
}


I am assuming theres something within this I need to change as regards to tailoring it to the SME install? I'm not a coder at best of times! I suspect its something very simple I am missing here. Looks to me like theres a couple of things that need declaring.


(This post was edited by FishMonger on May 15, 2014, 6:11 AM)


Laurent_R
Veteran / Moderator

May 15, 2014, 6:02 AM

Post #2 of 3 (2609 views)
Re: [agarrett5] migrating aliases & groups from SME7 to Zimbra using a perl script [In reply to] Can't Post

Please post your code within code tags, not quote tags in order to retain the formatting. As it is displayed now, it is diffcult to read and it is not possible to know on which line you got this warning.


FishMonger
Veteran / Moderator

May 15, 2014, 6:35 AM

Post #3 of 3 (2593 views)
Re: [agarrett5] migrating aliases & groups from SME7 to Zimbra using a perl script [In reply to] Can't Post

I added the code tags for you, but due the the way it was originally posted, the formatting/indentation was lost.

I went ahead and ran it through perltidy and corrected a few line wraps. Here's the properly formatted version with the problem lines highlighted.

Code
#!/usr/bin/perl 
use diagnostics;
################################################## ##############################
# $Id: aliases2zmprov,v 1.4 2007/03/07 22:18:56 dlbewley Exp $
#-------------------------------------------------------------------------------
# Description:
# Tool to create commands suitable for zmprov from a unix aliases file.
#
# Handles the case of an :include: construct.
# - Comments in include file are parsed as follows
# - "Foo" goes in LDAP description attribute, "Bar" in the displayname.
# # Description: foo
# # Name: Bar
#
# Handles the case of remote and multiple recipients by making a dist list.
# - A Zimbra alias must be associated with exactly one Zimbra account.
# - A Zimbra distribution list may contain users on remote hosts.
#
# See Also:
# http://wiki.zimbra.com/index.php?title=Bulk_Create
#
# Usage:
# ./aliases2zmprov /etc/aliases 1> aliases.zmp 2> aliases.err
# zmprov < aliases.zmp
#
################################################## ##############################

my @CNAME_SKIP = qw( ftp news postmaster root webmaster );
my @ALIAS_SKIP = qw( abuse mailer-daemon postmaster );
my @DISTRIBUTION_LISTS;
my $DOMAIN = 'abacuscover.com';
my $SOURCE_HOST = 'eserver';

use File::Basename;

while (<>) {
chomp;
s/#.*$//; # skip comments
next if /^\s*$/; # skip blank lines

my ( $description, $display_name, @cnames );
my ( $alias, $cname ) = split( /:/, $_, 2 );

$alias =~ s/\s*//g;

# scrutinize the aliases
if ( grep /^$alias$/, @ALIAS_SKIP ) {
warn "skipping alias $alias -> $cname";
next;
}

$cname =~ s/\s*//g; # remove all spaces

# scrutinize the canonical names
if ( $cname =~ m/:include:/ ) {
( ( $description, $display_name, $cnames_ref ) = parse_include($cname) )
|| next;
@cnames = @{$cnames_ref};
}
if ( $cname =~ m/,/ ) {

# multiple recipients make this a list instead of an alias
@cnames = split( /,/, $cname );
}

# if more than one cname then it is a dist list
if ( length( $cnames[0] ) ) {
print "\n";
print "createDistributionList $alias\@$DOMAIN\n";
push( @DISTRIBUTION_LISTS, $alias );
if ($display_name) {
print "modifyDistributionList $alias\@$DOMAIN displayname \"$display_name\"\n";
$display_name = undef;
}
if ($description) {
print "modifyDistributionList $alias\@$DOMAIN description \"$description\"\n";
$description = undef;
}
foreach my $member (@cnames) {

# skip aliases to certain users
if ( grep /^$member$/, @CNAME_SKIP ) {
warn "skipping cname $member <- $alias";
next; # go to next member
}

# A Zimbra distribution list may contain users on remote hosts.
if ( $member =~ m/\@/ ) {
print "addDistributionListMember $alias\@$DOMAIN $member\n";
}
else {
print "addDistributionListMember $alias\@$DOMAIN $member\@$DOMAIN\n";
}
}
print "\n";
@cnames = ();
next; # go to next line of aliases file
}

# skip aliases to certain users
if ( grep /^$cname$/, @CNAME_SKIP ) {
warn "skipping cname $cname <- $alias";
next;
}
if ( $cname =~ m/\/|\|/ ) {

# alias to a file or a program. don't try to accomodate
warn "WARNING skipping cname $cname <- $alias it is a file or pipe";
next;
}

# A Zimbra alias must be associated with exactly one Zimbra account.
if ( $cname =~ m/\@/ ) {

# alias to remote host. this could be created as a dist list with 1 member
# that seems undersirable though.
print "\n";
print "createDistributionList $alias\@$DOMAIN\n";
print "addDistributionListMember $alias\@$DOMAIN $cname\n";
print "\n";
next; # go to next line of aliases file
}

# is the cname a distribution_list already?
if ( grep /^$cname$/, @DISTRIBUTION_LISTS ) {
print "addDistributionListAlias $cname\@$DOMAIN $alias\@$DOMAIN\n";
}

# are we sure that account $cname\@$DOMAIN exists?
else {
print "addAccountAlias $cname\@$DOMAIN $alias\@$DOMAIN\n";
}
}

# read an included alias file. commens with Name: and Description:
# are placed into LDAP attributes for the list
sub parse_include {
my $cname = shift;
my @cnames;

# need to pull in contents of file and make a dist
# list instead of an alias
my $fullfile = $cname;
$fullfile =~ s/:include://;
my ( $file, $path ) = fileparse($fullfile);
if ( !-e $file ) {
warn "WARNING skipping $alias -> $cname Please run 'scp $SOURCE_HOST:$fullfile .'";
return; # go to next line of aliases file
}
else {
# process include file
open( F, $file ) || warn "Can not read $file";
while (<F>) {
chomp;
(m/#\s*Department:*\s*(.*)/)
&& ( $ou = $1 ); # can't make use of this in zmprov mdl
if (m/#\s*Description:*\s*(.*)/) {
$description = $1;
$description =~ s/"/'/g; # don't blow our command line
}
if (m/#\s*Name:*\s*(.*)/) {
$display_name = $1;
$display_name =~ s/"/'/g; # don't blow our command line
}
s/#.*$//; # skip comments
next if /^\s*$/; # skip blank lines
push @cnames, $_;
}
}
return $description, $display_name, \@cnames;
}


Those lines are producing warnings, not errors and the diagnostics pragma is outputting more detailed warnings than normally seen.

 
 


Search for (options) Powered by Gossamer Forum v.1.2.0

Web Applications & Managed Hosting Powered by Gossamer Threads
Visit our Mailing List Archives