#! /local/bin/perl -w # # managesieve_sync 1.0 # # Written by # Kjetil Torgrim Homme # University of Oslo, 2006 # # Released into the public domain. use strict; use Cyrus::SIEVE::managesieve; use Getopt::Std; use Data::Dumper; my $defaultadmin = 'cyrus'; sub usage { print STDERR "$0 [options] USER SOURCESERVER DESTINATIONSERVER\n"; print STDERR "Options are:\n"; print STDERR "\t-p FILE\n"; print STDERR "\t-a ADMINUSER (default '$defaultadmin')\n"; exit (64); } sub read_password_file { my ($admin, $file) = @_; open(PW, $file) || die "$file: $!\n"; while () { chomp; next if /^#/; next if /^\s*$/; if (/\t/) { my ($user, $pw) = split(/\t/); if ($user eq $admin) { close(PW); return $pw; } } else { close(PW); return $_; } } close(PW); die "$file: No password found for $admin\n"; } sub read_password_tty { my ($admin) = @_; print "Enter password for $admin: "; system("stty -echo"); my $pw = ; chomp($pw); print "\n"; system("stty echo"); $pw; } sub connect_sieve { my ($server, $username, $password) = @_; my $handle = sieve_get_handle($server, sub {$username}, sub {"cyrus"}, sub {$password}, sub {""}); unless (defined $handle) { die "$server: ", sieve_get_global_error(); } return $handle; } sub script_list { my ($conn) = @_; my %list = (); my $res = sieve_list($conn, sub {$list{$_[0]} = $_[1]}); die("script_list: ", sieve_get_error($conn)) unless $res == 0; return \%list; } our($opt_a, $opt_p, $opt_v); getopts('a:p:v') || usage(); usage() unless @ARGV == 3; my $admin = defined $opt_a ? $opt_a : $defaultadmin; my $adminpwd = defined $opt_p ? read_password_file($admin, $opt_p) : read_password_tty($admin); my ($user, $srcname, $destname) = @ARGV; my $verbose = defined $opt_v; my $src = connect_sieve($srcname, $user, $adminpwd); my $dest = connect_sieve($destname, $user, $adminpwd); my $scripts = script_list($src); for my $scriptname (keys %{$scripts}) { my $script = ""; my $res = sieve_get($src, $scriptname, $script); printf("Downloaded %s %s, %d bytes\n", $scripts->{$scriptname} ? "activated" : "inactive", $scriptname, length($script)) if $verbose; die("sieve_get: ", sieve_get_error($src)) unless $res == 0; $res = sieve_put($dest, $scriptname, $script); die("sieve_put: ", sieve_get_error($dest)) unless $res == 0; if ($scripts->{$scriptname}) { $res = sieve_activate($dest, $scriptname); die("sieve_activate: ", sieve_get_error($dest)) unless $res == 0; } }