Re: migrate_sieve.pl on twiki

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Nov 30, 2006 at 08:30:20AM -0800, Andrew Morgan wrote:
...
> I have copies of everything but the migrate_sieve.pl script.  Do you have 
> a copy of that script still?
> 
Attached..

> I found a website (http://panther.inf.elte.hu/linux/user_mbox2cyrus/) that
> appears to have copies of all the scripts including migrate_sieve.pl, but 
> I get an Access Denied error when I try to download them.  :)
> 
How handy.

> My local copies of these scripts are at:
> 
>   http://oregonstate.edu/~morgan/cyrus/
> 

-- 
Louis Kowolowski	KE7BAX			louisk@xxxxxxxxxxxxxxxxx
Cryptomonkeys:                      http://www.cryptomonkeys.com/~louisk

Warning:  Do not point laser at remaining eye!
#!/usr/bin/perl -w
#
# Migrates a single user's .procmailrc, .vacation.msg, and .forward to 
# .sieve
#

if ($#ARGV < 0) {
	print "Usage: $0 username\n";
	print "  Migrates username's .procmailrc, .vacation.msg, and .forward to .sieve\n";
	exit(-1);
}

my $username = $ARGV[0];


# Verify that user exists on system
if (! defined(getpwnam($username))) {
	print "ERROR: username '$username' not found\n";
	exit(-1);
}


# Get for later
my ($uid, $gid, $homedir) = (getpwnam($username))[2,3,7];


# Sieve hash for holding info
my %sievehash = (
		'forward' => "",
		'sa' => 0,
		'outofoffice' => "",
		'filters' => [ ]
		);


# Build .sieve file from .forward, .procmailrc, and .vacation.msg
$hasfw = 0;
$haspm = 0;
$hassa = 0;
$hasbitbucket = 0;
$hasvacation = 0;

if (-l "$homedir/.forward") {
	# Soft link, don't handle
}
elsif (-f "$homedir/.forward") {
	open(IN, "$homedir/.forward");
	$fw = <IN>;
	close(IN);
	chomp $fw;
	if ($fw =~ /^\s*[^\@\s]+\@[^\s]+\s*$/) {
		$hasfw = 1;
		# Strip trailing CR
		$fw =~ s/\r//g;
	}
	if ($fw =~ /^\/dev\/null$/) {
		$hasfw = 1;
		$hasbitbucket = 1;
	}
	if ($fw =~ /^\\$username, "\|.*vacation $username"/) {
		$hasvacation = 1;
	}

	if ($hasfw == 0 and $hasvacation == 0) {
		print "Couldn't parse .forward file for $username\n";
	}
}

if (-l "$homedir/.procmailrc") {
	# Soft link, don't handle
}
elsif (-f "$homedir/.procmailrc") {
	if (open(IN, "$homedir/.procmailrc")) {
		while(<IN>) {
			chomp;
			next unless (/^\* /);
			if (/^\* \^From:\.\*(.*)/) {
				$addr = $1;
				$dest = <IN>;
				chomp $dest;
				push @addrs, "$addr:$dest";
				$haspm = 1;
			}
			if (/^\* \^X-Spam-Status:.*/) {
				$haspm = 1;
				$hassa = 1;
			}
		}
		close(IN);
	}
}

# Generate an appropriate .sieve file
# skip the procmail stuff if they have a .forward
if ($hasfw == 1) {
	open(SIEVE, "> $homedir/.sieve");
	if ($hasbitbucket == 0) {
		print "Forward file email address: $fw\n";
		print SIEVE "redirect \"$fw\";\n";
	}
	else {
		print "Forwarding to /dev/null\n";
		print SIEVE "discard;\n";
	}

	close(SIEVE);

	# Set perms and ownership
	chown($uid, $gid, "$homedir/.sieve");
	chmod(0644, "$homedir/.sieve");

	# Done, stop, exit
	exit();
}

if ($haspm == 1 or $hasvacation == 1) {
	open(SIEVE, "> $homedir/.sieve");
#	open(SIEVE, "> /private/tools/logs/sieve.$username");
	print SIEVE "# Generated by ONID migration script\n";
	print SIEVE "# Modifying this file by hand will make it unreadable by the ONID web tools\n";
	if ($hasvacation == 1) {
		print SIEVE "require [ \"fileinto\", \"vacation\" ];\n\n";
	}
	else {
		print SIEVE "require [ \"fileinto\" ];\n\n";
	}

	# Put Spam Assassin first
	if ($hassa == 1) {
		print "Spam Assassin Enabled\n";
		print SIEVE "# Spam Assassin\n";
		print SIEVE "if header :contains \"X-Spam-Flag\" \"YES\" { fileinto \"INBOX.junk-mail\"; }\n\n";
	}

	# Then outofoffice
	if ($hasvacation == 1 and -f "$homedir/.vacation.msg") {
		print "Vacation found\n";
		open(IN, "$homedir/.vacation.msg");
		while(<IN>) {
			next if (/^From: /);
			next if (/^Subject: /);
			$outofofficemsg .= $_;
		}
		close(IN);
		print SIEVE "# Out of Office\n";
		print SIEVE "vacation :days 7 :subject \"Out of office\" \"\n";
		print SIEVE $outofofficemsg;
		print SIEVE "\n\";\n\n";
	}

	# Then mail filters
	foreach $tmp (@addrs) {
		print "Mail filter found: $tmp\n";
		($addr,$dest) = split(/:/,$tmp);
		if ($dest eq "/dev/null") {
			$dest = "discard;";
		}
		else {
			$dest = "fileinto \"INBOX." . $dest . "\";";
		}
		print SIEVE "if header :contains \"From\" \"$addr\" { $dest }\n\n";
	}

	# Close and set perms and ownership
	close(SIEVE);
	chown($uid, $gid, "$homedir/.sieve");
	chmod(0644, "$homedir/.sieve");
}

Attachment: pgpNKg5kP9QjT.pgp
Description: PGP signature

----
Cyrus Home Page: http://cyrusimap.web.cmu.edu/
Cyrus Wiki/FAQ: http://cyrusimap.web.cmu.edu/twiki
List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html

[Index of Archives]     [Cyrus SASL]     [Squirrel Mail]     [Asterisk PBX]     [Video For Linux]     [Photo]     [Yosemite News]     [gtk]     [KDE]     [Gimp on Windows]     [Steve's Art]

  Powered by Linux