rev 1512 - in trunk/siesta: bin messages

[prev] [thread] [next] [lurker] [Date index for 2004/04/07]

From: simon
Subject: rev 1512 - in trunk/siesta: bin messages
Date: 16:54 on 07 Apr 2004
Author: simon
Date: 2004-04-07 16:54:18 +0100 (Wed, 07 Apr 2004)
New Revision: 1512

Added:
   trunk/siesta/messages/bandito
   trunk/siesta/messages/generate_setup
Modified:
   trunk/siesta/bin/bandito
   trunk/siesta/messages/backup
Log:
Make bandito generate shell scripts and take Digests into account


Modified: trunk/siesta/bin/bandito
===================================================================
--- trunk/siesta/bin/bandito	2004-04-06 17:01:19 UTC (rev 1511)
+++ trunk/siesta/bin/bandito	2004-04-07 15:54:18 UTC (rev 1512)
@@ -1,36 +1,35 @@
 #!/usr/local/bin/perl -w
 
-use strict; 
-use Siesta; 
-use Siesta::List; 
-use Siesta::Member; 
+use strict;
+use Siesta::Config;
+my $old_archive_dir;
+BEGIN {
+    while (@ARGV) {
+         if (@ARGV && $ARGV[0] eq '-a') {
+             shift;
+             $old_archive_dir = shift;
+         } elsif (@ARGV && $ARGV[0] eq '-f') {
+             shift;
+            $config->load_from( shift );
+         } else {
+             last;
+         }
+     }
+ }
 
+
+use Siesta;
+use Siesta::List;
+use Siesta::Member;
 use Python::Serialise::Marshal; 
 use Email::Folder;
 use Email::LocalDelivery;
 use POSIX qw/strftime/;
+use UNIVERSAL::require;
+use String::ShellQuote qw( shell_quote );
 
-my $old_archive_dir;
 
-BEGIN {
-     while (@ARGV) {
-        
-        if (@ARGV && $ARGV[0] eq '-a') {
-            shift;
-            $old_archive_dir = shift;
-        } elsif (@ARGV && $ARGV[0] eq '-f') {
-            shift;
-            $Siesta::Config::CONFIG_FILE = shift;
-        } else {
-            last;
-        }
 
-    }
-}
-use Siesta::Config;
-
-
-
 =pod
 
 =head1 NAME
@@ -120,154 +119,181 @@
 my $file = shift || die "You must pass a mailman config.db\n";
 my $pr   = Python::Serialise::Marshal->new($file) || die "Couldn't open $file\n";
 
-
 my $data = $pr->load();
 
+use YAML;
+print Dump $data;
+exit;
 
 (my $list_name   = $data->{private_archive_file_dir}) =~ s!.+/([^/]+).mbox$!$1!;
-my $owner        = Siesta::Member->find_or_create({ email => $data->{owner}->[0] });
+my $owner        = $data->{owner}->[0];
 my $post_address = $list_name.'@'.$data->{host_name};
 my $return_path  = $list_name.'-bounce@'.$data->{host_name};
 
-print "Creating a new list '$list_name' ...\n";
-print "\towner is '$owner'\n";
-print "\tpost address is '$post_address'\n";
-print "\treturn path is '$return_path'\n";
-print "\n\n";
+print STDERR "Creating a new list '$list_name' ...\n";
+print STDERR "\towner is '$owner'\n";
+print STDERR "\tpost address is '$post_address'\n";
+print STDERR "\treturn path is '$return_path'\n";
+print STDERR "\n\n";
 
-# create the new list
-my $list = Siesta::List->new (
-    name  => $list_name,
-    owner => $owner,
+
+my $list = {
+    name         => $list_name,
+    owner        => $owner,
     post_address => $post_address,
     return_path  => $return_path, 
+    queues       => [ 'sub' , 'unsub', 'post' ],
+    members      => [],
+};
 
-) or die "Failed to create a new list\n";
+print STDERR "Adding plugins : ";
+# TODO there;s a problem with Archive and Digest
+my @plugins = qw(Debounce MembersOnly Moderated ListHeaders ReplyTo SubjectTag MessageFooter Send +NoMail);
+print STDERR join ", ", @plugins;
+print STDERR "\n\n";
 
+my %plugins;
+foreach my $name (@plugins) {
+        my $plugin = {};
 
-# make the new members
-print "Adding new members : \n";
-foreach my $email (keys %{$data->{passwords}}) {
-    print "$email ";
-    my $member = Siesta::Member->find_or_create({ email => $email });
-    my $nomail = ($data->{user_options}->{$email} & $flags{'DisableDelivery'} == $flags{'DisableDelivery'});
-    #$member->nomail($nomail);
-    #$member->password($data->{passwords}->{$email});
-	$member->update;
-    $list->add_member( $member );    
+        $plugin->{name}     = $name;
+        $plugin->{personal} = $plugin->{name} =~ s/^\+//;
 
-
-
+        $plugins{$name}     = bless $plugin, 'Siesta::FakePlugin';        
 }
-print "\n\n";
 
+print STDERR "Setting options :\n";
+# reply to
+my $reply_to      = $data->{'reply_goes_to_list'} || 0;
+print STDERR "ReplyTo => $reply_to\n";
+$plugins{'ReplyTo'}->{pref}->{munge}    = $reply_to;
 
 
-print "Adding plugins : ";
-# first qet the sub and unsub queues out of the way
-$list->set_plugins( sub   => qw(Subscribe)   );
-$list->set_plugins( unsub => qw(UnSubscribe) );
-
-my @plugins = qw(Debounce MembersOnly Moderated ListHeaders ReplyTo SubjectTag MessageFooter Send Archive);
-print join ", ", @plugins;
-print "\n\n";
-$list->set_plugins( post => @plugins );
-
-# now get them out again
-my %plugins = map { $_->name => $_ } $list->plugins;
-
-print "Setting options :\n";
-# reply to 
-my $reply_to      = $data->{'reply_goes_to_list'};
-   $reply_to      = 0 unless defined $reply_to;
-print "ReplyTo => $reply_to\n";
-$plugins{'ReplyTo'}->pref('munge',$reply_to);
-
-
 # members only
-my $members_only  = $data->{'member_posting_only'};
-   $members_only  = 0 unless defined $members_only;
+my $members_only  = $data->{'member_posting_only'} || 0;
+print STDERR "MembersOnly => $members_only\n";
+$plugins{'MembersOnly'}->{pref}->{approve}          = $members_only;
+$plugins{'MembersOnly'}->{pref}->{tell_user}        = 1;
+$plugins{'MembersOnly'}->{pref}->{allowed_posters}  = join " ", @{$data->{posters}};
 
-print "MembersOnly => $members_only\n";
-$plugins{'MembersOnly'}->pref('approve', $members_only);
-$plugins{'MembersOnly'}->pref('tell_user', 1);
-$plugins{'MembersOnly'}->pref('allowed_posters', join " ", @{$data->{posters}});
 
-
 # set the subject line
-my $subject_munge = $data->{'subject_prefix'};
-   $subject_munge = "" unless defined $subject_munge;
-print "SubjectTag => $subject_munge\n";
+my $subject = $data->{'subject_prefix'}; $subject = "" unless defined $subject;
+print STDERR "SubjectTag => $subject\n";
+$plugins{'SubjectTag'}->{pref}->{subjecttag} = $subject;
 
+
 # whether or not it's moderated
-my $moderated     = $data->{'moderated'};
-   $moderated     = 0 unless defined $moderated;
-print "Moderated => $moderated\n";
-$plugins{'Moderated'}->pref('moderated', $moderated);
-$plugins{'Moderated'}->pref('tell_user', 1);  
+my $moderated     = $data->{'moderated'} || 0;
 
+print STDERR "Moderated => $moderated\n";
+$plugins{'Moderated'}->{pref}->{moderated} = $moderated;
+$plugins{'Moderated'}->{pref}->{tell_user} = 1;
 
+
 # the message footer
+print STDERR "MessageFooter => ", $data->{'description'},"\n";
 my $footer = $data->{'msg_footer'};
 if ($footer && $footer !~ /^\s+$/m) {
     $footer =~ s!%\(([^\)]+)\)!\[% $1 %\]!gm;
-    $plugins{'MessageFooter'}->pref('footer',$footer);
+    $plugins{'MessageFooter'}->{pref}->{footer} = $footer;
 }
 
 foreach my $key (qw(info description web_page_url host_name cgiext)) {
     my $val = $data->{$key};
-    $plugins{'MessageFooter'}->pref($key, $val)
+    $plugins{'MessageFooter'}->{pref}->{$key} = $val
             if ($val && $val !~ /^\s+$/m);
 
 }
-$plugins{'MessageFooter'}->pref('description',$data->{'description'});
-print "MessageFooter => ",$data->{'description'},"\n";
 
 
-# now copy across the archives
 
-# where are we going to get the mails from
-my $in     = $old_archive_dir || $data->{'public_archive_file_dir'};
+$list->{plugins}->{post}  = [ values %plugins ];
 
+# now add the sub and unsub ones
+$list->{plugins}->{sub}   = [ bless { name => 'Subscribe'   }, 'Siesta::FakePlugin' ];
+$list->{plugins}->{unsub} = [ bless { name => 'UnSubscribe' }, 'Siesta::FakePlugin' ];
 
-unless (-e $in) {   
-    warn "No such file or dir '$in'\n";
-    goto FAIL;
+
+
+
+# make the new members
+my @members;
+print STDERR "Adding new members : \n";
+foreach my $email (keys %{$data->{passwords}}) {
+    print STDERR "$email ";
+    
+    my $member = { email => $email, columns => ['email'], lists => [ $list_name ] };
+    my $nomail = (($data->{user_options}->{$email} & $flags{'DisableDelivery'}) == $flags{'DisableDelivery'});
+        
+
+    $plugins{'+NoMail'}->{$email}->{pref}->{nomail} = $nomail;
+
+    # we have no per list passwords
+    # $member->password($data->{passwords}->{$email});
+
+    push @members, $member; 
 }
 
-my $folder;
+foreach my $email (keys  %{$data->{digest_member}}) {
+    $plugins{'+Digest'}->{$email}->{pref}->{digest} = 1;
+}
 
-unless($folder = Email::Folder->new($in)) {
-    warn "Couldn't open '$in' to read archives from\n";
-    goto FAIL;
+
+$list->{members} = \@members;
+
+print Siesta->bake('bandito', 
+                   'members' => \@members,
+                   'lists'   => [ bless $list, 'Siesta::FakeList' ],
+                   'shellq'  => sub { my $val = shift || return; return shell_quote($val) },
+            );
+
+
+
+
+print STDERR "\n\n";
+
+
+
+package Siesta::FakePlugin;
+
+sub member {
+        my ($self, $member) = @_;
+
+        $self->{_current_member} = $member->{email};
 }
 
-# work out where to stick them
-my $name = $list->name;
-my $path = "$Siesta::Config::ARCHIVE/$name/";
+sub pref {
+        my ($self, $key) = @_;
 
-unless (-e $path) {
-    warn "No such file or dir '$in'\n";
-    goto FAIL;
+
+        my $member = $self->{_current_member};
+
+        if ($member) {
+                return $self->{$member}->{pref}->{$key};
+        } else {
+                return $self->{pref}->{$key};
+        }
 }
 
+sub options {
+        my $self = shift;
 
-# and then deliver each one
-foreach my $mail ($folder->messages()) {
-    unless (Email::LocalDelivery->deliver( $mail->as_string, $path )) {
-        warn "local delivery into '$path' failed - couldn't copy archives from '$in'\n";
-        goto FAIL;
-    }
+        my $class = "Siesta::Plugin::".$self->{name};
+
+        $class->require;
+
+
+        return $class->options;
 }
 
-# yay!
-print "Successfully copied archives from '$in' to '$path'\n";
+package Siesta::FakeList;
 
-# erk
-FAIL:
 
+sub plugins {
+        my ($self, $queue) = @_;
+        return $self->{plugins}->{$queue};
+}
 
-print "\n\nNow paste this into your aliases file :\n\n\n"; 
-print $list->alias("bandito (the Siesta config stealing tool)");
+1;
 
-

Modified: trunk/siesta/messages/backup
===================================================================
--- trunk/siesta/messages/backup	2004-04-06 17:01:19 UTC (rev 1511)
+++ trunk/siesta/messages/backup	2004-04-07 15:54:18 UTC (rev 1512)
@@ -4,51 +4,6 @@
 # report bugs to the siesta-dev team
 # http://siesta.unixbeard.net
 
-###
-# First create the database
-###
-nacho create-database
+[% INCLUDE generate_setup %]
 
-###
-# Then, let's create users ...
-###
-[% FOREACH member = members %]
-# [% member.email %]
-nacho create-member [% member.email %]
-    [%- FOREACH col = member.columns -%]
-        [%- IF col != 'email' && col != 'id' %]
-nacho modify-member [% member.email %] [% col %] [% shellq( member.$col ) %]
-        [%- END -%] 
-    [%- END -%]
-[% END %]
 
-###
-# Finally we create the lists, add the plugins
-# and set the plugin prefs for the list and each user
-###
-[% FOREACH list = lists %]
-
-# [% list.name %]
-nacho create-list [% list.name %] [% list.owner.email %] [% list.post_address %] [% list.return_path %]
-    [%- FOREACH queue  = list.queues %] 
-
-nacho set-plugins [% list.name %] [% queue %] [%- FOREACH plugin = list.plugins( queue ) -%] [% plugin.personal ? '+' : '' %][% plugin.name %][% END -%]
-        [%- FOREACH plugin = list.plugins( queue ) -%]
-            [%- FOREACH key = plugin.options.keys %] 
-nacho modify-plugin [% plugin.name %] [% list.name %] [% shellq( key ) %] [% shellq( plugin.pref( key ) ) %]
-            [%- END -%]
-
-            [%- IF plugin.personal -%]
-                [%- FOREACH member = list.members -%][% x = plugin.member( member ) %]
-                    [%- FOREACH key = plugin.options.keys %]
-                        [%- val = plugin.pref( key ) %]
-                        [%- IF val != plugin.options.$key.default %]
-nacho modify-plugin [% plugin.name %] [% list.name %] [% shellq( key ) %] [% shellq( plugin.pref( key ) )%] [% member.email %] 
-                        [%- END -%]
-                    [%- END -%]
-                [%- END -%]
-            [% END %]
-        [%- END -%]
-
-    [%- END -%]
-[%- END -%]

Added: trunk/siesta/messages/bandito
===================================================================
--- trunk/siesta/messages/bandito	2004-04-06 17:01:19 UTC (rev 1511)
+++ trunk/siesta/messages/bandito	2004-04-07 15:54:18 UTC (rev 1512)
@@ -0,0 +1,10 @@
+#!/bin/sh
+[% USE Date %]
+# 
+# Import script for [% lists.0.name %] 
+#
+# This script was generated by 'bandito' on [% Date.format %]
+#
+# report bugs to the Siesta dev team (http://siesta.unixbeard.net)
+
+[% INCLUDE generate_setup %]

Added: trunk/siesta/messages/generate_setup
===================================================================
--- trunk/siesta/messages/generate_setup	2004-04-06 17:01:19 UTC (rev 1511)
+++ trunk/siesta/messages/generate_setup	2004-04-07 15:54:18 UTC (rev 1512)
@@ -0,0 +1,57 @@
+###
+# First create the database
+###
+nacho create-database
+
+###
+# Then, let's create users ...
+###
+[% FOREACH member = members %]
+# [% member.email %]
+nacho create-member [% member.email %]
+    [%- FOREACH col = member.columns -%]
+        [%- IF col != 'email' && col != 'id' %]
+nacho modify-member [% member.email %] [% col %] [% shellq( member.$col ) %]
+        [%- END -%] 
+    [%- END %]
+    [%- FOREACH list = member.lists %]
+nacho add-member [% list %] [% member.email %]
+    [%- END %]
+[% END %]
+
+###
+# Finally we create the lists, add the plugins
+# and set the plugin prefs for the list and each user
+###
+[% FOREACH list = lists %]
+
+# [% list.name %]
+nacho create-list [% list.name %] [% list.owner.email %] [% list.post_address %] [% list.return_path %]
+
+    [%- FOREACH queue  = list.queues %] 
+nacho set-plugins [% list.name %] [% queue %] [%- FOREACH plugin = list.plugins( queue ) -%] [% plugin.personal ? '+' : '' %][% plugin.name %][% END %]
+
+        [%- FOREACH plugin = list.plugins( queue ) -%]
+
+            [%- IF !plugin.personal -%]
+                [%- FOREACH key = plugin.options.keys %]
+                    [%- val = plugin.pref( key ) -%]
+                    [%- IF val %]
+nacho modify-plugin [% plugin.name %] [% list.name %] [% shellq( key ) %] [% shellq( val ) %]
+                    [%- END -%]
+                [%- END -%]
+
+            [%- ELSE # plugin.personal -%]
+                [%- FOREACH member = list.members -%][% x = plugin.member( member ) %]
+                    [%- FOREACH key = plugin.options.keys %]
+                        [%- val = plugin.pref( key ) %]
+                        [%- IF val && val != plugin.options.$key.default %]
+nacho modify-plugin [% plugin.name %] [% list.name %] [% shellq( key ) %] [% shellq( plugin.pref( key ) )%] [% member.email %] 
+                        [%- END -%]
+                    [%- END -%]
+                [%- END -%]
+            [% END %]
+        [%- END -%]
+
+    [%- END -%]
+[%- END -%]

Generated at 13:57 on 01 Jul 2004 by mariachi 0.52