sieve-migrate.pl
changeset 6 9d3800a5e930
equal deleted inserted replaced
5:7864deb8c879 6:9d3800a5e930
       
     1 #! /usr/bin/perl
       
     2 
       
     3 my $usage = << '#';
       
     4 Usage: $ME [options]
       
     5     --dry	    dry run ($opt_dry)
       
     6     --listscripts   listscripts on source server ($opt_list)
       
     7 #
       
     8 
       
     9 use strict;
       
    10 use warnings;
       
    11 use feature ':5.10';
       
    12 use File::Basename;
       
    13 use Net::Sieve;
       
    14 use Smart::Comments;
       
    15 use Getopt::Long;
       
    16 
       
    17 my $ME = basename $0;
       
    18 
       
    19 my $user = 'root';
       
    20 my $password = 'x';
       
    21 
       
    22 my $opt_dry = 1;
       
    23 my $opt_listscripts = 0;
       
    24 
       
    25 GetOptions(
       
    26     'dry'	    =>	\$opt_dry,
       
    27     'listscripts'   =>	\$opt_listscripts,
       
    28 ) or die eval "\"$usage\"";
       
    29     
       
    30 
       
    31 my @users = <>;
       
    32 foreach my $auser (@users) {
       
    33     chomp($auser);
       
    34 
       
    35     ### migrating sieve rules for user: $auser
       
    36     my $pop = connect_as($auser, 'localhost');
       
    37     my $pu =  connect_as($auser, 'localhost:2001'); # forwarded port via ssh
       
    38 
       
    39     copy_scripts( $pu, $pop );
       
    40     
       
    41     # TODO: do not seem to work properly
       
    42     #$pop->sfinish();
       
    43     #$pu->sfinish();
       
    44 
       
    45 }
       
    46 
       
    47 
       
    48 ## --------------------------------------------------------------------- 
       
    49 
       
    50 sub clean_scripts {
       
    51     my $sieve = shift;
       
    52     
       
    53     foreach my $script ($sieve->list()) {
       
    54 	### deleting script: $script->{name}
       
    55 	$sieve->delete( $script->{name} ) if not $opt_dry;
       
    56     }
       
    57 }
       
    58 
       
    59 
       
    60 sub copy_scripts {
       
    61     my $src = shift;
       
    62     my $dst = shift;
       
    63 
       
    64     my $copied = 0;
       
    65 
       
    66     foreach my $script ($src->list()) {
       
    67 	my $content = $src->get( $script->{name} );
       
    68 	my $is_active = $script->{status};
       
    69 
       
    70 	next if length($content) == 0;
       
    71 
       
    72 	$dst->put( $script->{name}, $content) or
       
    73 	    die "$ME: error on migrating script...\n";
       
    74 
       
    75 	if ($is_active) {
       
    76 	    $dst->activate( $script->{name} ) or
       
    77 		die "$ME: error on activating script...\n";
       
    78 	}
       
    79 
       
    80 	$copied++;
       
    81     }
       
    82 
       
    83     say "migrated $copied scriptes";
       
    84 }
       
    85 
       
    86 
       
    87 sub connect_as {
       
    88     my ($authuser, $server) = @_;
       
    89 
       
    90     my $sieve = Net::Sieve->new(    server => (split(':', $server))[0],
       
    91 				    user => $user,
       
    92 				    port => (split(':', $server))[1] || 2000,
       
    93 				    authzid => $authuser,
       
    94 				    password => $password,
       
    95     ) or die "$ME: cannot connect to server $server\n";
       
    96     return $sieve;
       
    97 }
       
    98 
       
    99 
       
   100 sub has_scripts {
       
   101     my $sieve = shift;
       
   102 
       
   103     if ($sieve->list()) {
       
   104 	return 1;
       
   105     }
       
   106     else {
       
   107 	return 0;
       
   108     }
       
   109 }
       
   110 
       
   111 
       
   112 # vim: sw=4 sts=4 aw