/[notice-sender]/trunk/sender.pl
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/sender.pl

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 11 by dpavlin, Sat May 14 18:20:50 2005 UTC revision 73 by dpavlin, Mon Aug 22 20:39:38 2005 UTC
# Line 1  Line 1 
1  #!/usr/bin/perl -w  #!/usr/bin/perl -w
2    
3  use strict;  use strict;
4  use Class::DBI::Loader::Pg;  use blib;
5    use Nos 0.7;
6  use Getopt::Long;  use Getopt::Long;
7  use Data::Dumper;  use Pod::Usage;
8    
9  =head1 NAME  =head1 NAME
10    
11  sender.pl - command line notify sender utility  sender.pl - command line notify sender utility
12    
13  =head1 SYNOPSYS  =head1 SYNOPSIS
14    
15     sender.pl --create=mylist
16     sender.pl --drop=mylist
17   sender.pl --add=mylist members.txt   sender.pl --add=mylist members.txt
18     sender.pl --delete=mylist members.txt
19   sender.pl --list[=mylist]   sender.pl --list[=mylist]
20   sender.pl --queue=mylist message.txt   sender.pl --queue[=mylist message.txt]
21   sender.pl --send=mylist   sender.pl --send=mylist
22     sender.pl --help
23     sender.pl --man
24    
25  =head2 All options  =head1 OPTIONS
26    
27  =over 20  =over 20
28    
 =item --debug  
   
 Turn on debugging output from C<Class::DBI>  
   
29  =cut  =cut
30    
31  my ($list_opt,$debug) = (0,0);  my $debug = 0;
32  my $add_opt;  my $verbose = 0;
33  my $queue_opt;  my $opt;
34    
35  my $result = GetOptions(  my $result = GetOptions(
36          "list:s" => \$list_opt,          "create=s" => \$opt->{'create'},
37          "add=s" => \$add_opt,          "drop=s" => \$opt->{'drop'},
38          "queue=s" => \$queue_opt,          "list:s" => \$opt->{'list'},
39            "add=s" => \$opt->{'add'},
40            "delete=s" => \$opt->{'delete'},
41            "queue:s" => \$opt->{'queue'},
42            "send:s" => \$opt->{'send'},
43            "inbox=s" => \$opt->{'inbox'},
44          "debug" => \$debug,          "debug" => \$debug,
45            "verbose" => \$verbose,
46            "from=s" => \$opt->{'from'},
47            "driver=s" => \$opt->{'email_send_driver'},
48            "sleep=i" => \$opt->{'sleep'},
49            "aliases=s" => \$opt->{'aliases'},
50            "help" => \$opt->{'help'},
51            "man" => \$opt->{'man'}
52    ) || pod2usage(-verbose => 0);
53    
54    pod2usage(-verbose => 1) if ($opt->{'help'});
55    pod2usage(-verbose => 2) if ($opt->{'man'});
56    
57    my $nos = new Nos(
58            dsn => 'dbi:Pg:dbname=notices',
59            user => 'dpavlin',
60            passwd => '',
61            debug => $debug,
62            verbose => $verbose,
63  );  );
64    
65    my $loader = $nos->{'loader'} || die "can't find loader?";
 my $loader = Class::DBI::Loader::Pg->new(  
         debug           => $debug,  
         dsn             => "dbi:Pg:dbname=notices",  
         user            => "dpavlin",  
         password        => "",  
         namespace       => "Noticer",  
 #       additional_classes      => qw/Class::DBI::AbstractSearch/,  
 #       additional_base_classes => qw/My::Stuff/,  
         relationships   => 1,  
 );  
66    
67  my $lists = $loader->find_class('lists');  my $lists = $loader->find_class('lists');
68  my $users = $loader->find_class('users');  my $users = $loader->find_class('users');
69  my $user_list = $loader->find_class('user_list');  my $user_list = $loader->find_class('user_list');
70  my $messages = $loader->find_class('messages');  my $messages = $loader->find_class('messages');
71  my $queue = $loader->find_class('queue');  my $queue = $loader->find_class('queue');
72    my $sent = $loader->find_class('sent');
73    
74    $queue->set_sql( list_queue => qq{
75            SELECT messages.message, messages.date AS date, lists.name AS list
76            FROM queue
77            JOIN messages on message_id = messages.id
78            JOIN lists on list_id = lists.id
79    } );
80    
81    my $list_name;
82    
83    =item --aliases=/full/path/to/aliases
84    
85    Optional parametar C<--aliases> can be used to specify aliases file other
86    than default C</etc/aliases>.
87    
88    =cut
89    
90    my $aliases = $opt->{'aliases'} || '/etc/aliases';
91    
92    
93    =item --create=list_name my-list@example.com
94    
95    Adds new list. You can also feed list name as first line to C<STDIN>.
96    
97    You can also add C<--from='Full name of list'> to specify full name (comment)
98    in outgoing e-mail.
99    
100    =cut
101    
102    if ($list_name = $opt->{'create'}) {
103    
104            my $email = shift @ARGV || <>;
105            chomp($email);
106    
107            die "need e-mail address for list (as argument or on STDIN)\n" unless ($email);
108    
109            my $id = $nos->create_list(
110                    list => $list_name,
111                    from => ($opt->{'from'} || ''),
112                    email => $email,
113                    aliases => $aliases,
114            ) || die "can't add list $list_name\n";
115    
116            print "added list $list_name with ID $id\n";
117    
118    
119    =item --drop=list_name
120    
121    Remove list.
122    
123    Optional parametar C<--aliases='/full/path/to/aliases'> can be used to
124    specify aliases file other than C</etc/aliases>.
125    
126    =cut
127    
128    } elsif ($list_name = $opt->{'drop'}) {
129    
130            my $id = $nos->drop_list(
131                    list => $list_name,
132                    aliases => $aliases,
133            ) || die "can't remove list $list_name\n";
134    
135            print "drop list $list_name with ID $id\n";
136    
137    
138  =item --list[=list_name]  =item --list[=list_name]
139    
140  List all available lists and users on them. Optional value is name of list  List all available lists and users on them.
141  and it will produce users just on that list.  
142    Optional value is name of list. With it, this option will produce just users
143    on that list.
144    
145  =cut  =cut
146    
147  if (defined($list_opt)) {  } elsif (defined($list_name = $opt->{'list'})) {
148    
149          my @lists;          my @lists;
150          if ($list_opt ne '') {  
151                  @lists = $lists->search( name=> $list_opt )->first || die "can't find list $list_opt";          if ($list_name ne '') {
152                    @lists = $lists->search( name=> $list_name )->first || die "can't find list $list_name";
153          } else {          } else {
154                  @lists = $lists->retrieve_all;                  @lists = $lists->retrieve_all;
155          }          }
156    
157          foreach my $list (@lists) {          foreach my $list (@lists) {
158                  print $list->name,"\n";                  print $list->name,": ",$list->from_addr," <",$list->email,">\n";
159                  foreach my $user_on_list ($user_list->search(list_id => $list->id)) {                  foreach my $u ($nos->list_members( list => $list->name )) {
160                          my $user = $users->retrieve( id => $user_on_list->user_id );                          print "\t",$u->{'name'}, " <", $u->{'email'}, ">",( $u->{'ext_id'} ? ' ['.$u->{'ext_id'}.']' : '' ),"\n";
                         print "\t",$user->full_name," <", $user->email, ">\n";  
161                  }                  }
162          }          }
163    
164    
165  =item --add=list_name  =item --add=list_name
166    
167  Add users to list. Users are stored in file (which can be supplied as  Add users to list. Users are stored in file (which can be supplied as
# Line 88  argument) or read from C<STDIN>. List sh Line 172  argument) or read from C<STDIN>. List sh
172    
173  =cut  =cut
174    
175  } elsif ($add_opt) {  } elsif ($list_name = $opt->{'add'}) {
176          #my $noticer = $loader->find_class('Noticer') || die "can't find my class!";  
177          my $list = $lists->find_or_create({          my $list = $nos->_get_list($list_name) || die "can't find list $list_name\n";
                 name => $add_opt,  
         }) || die "can't add list $add_opt\n";  
178    
179          my $added = 0;          my $added = 0;
180    
# Line 100  argument) or read from C<STDIN>. List sh Line 182  argument) or read from C<STDIN>. List sh
182                  chomp;                  chomp;
183                  next if (/^#/ || /^\s*$/);                  next if (/^#/ || /^\s*$/);
184                  my ($email, $name) = split(/\s+/,$_, 2);                  my ($email, $name) = split(/\s+/,$_, 2);
185                  print "# $name <$email>\n";                  $added++ if ($nos->add_member_to_list( email => $email, name => $name, list => $list_name ));
                 my $this_user = $users->find_or_create({  
                         email => $email,  
                         full_name => $name,  
                 }) || die "can't find or create member\n";  
                 my $user_on_list = $user_list->find_or_create({  
                         user_id => $this_user->id,  
                         list_id => $list->id,  
                 }) || die "can't add user to list";  
                 $added++;  
186          }          }
187    
188          foreach my $c_name ($loader->tables) {          print "list ",$list->name," has $added users\n";
189                  my $c = $loader->find_class($c_name)|| die "can't find $c_name";  
190                  $c->dbi_commit();  
191    =item --delete=list_name
192    
193    Delete users from list. User e-mails can be stored in file (which can be
194    supplied as argument) or read from C<STDIN>.
195    
196    =cut
197    } elsif ($list_name = $opt->{'delete'}) {
198    
199            my $list = $nos->_get_list($list_name) || die "can't find list $list_name\n";
200    
201            my $deleted = 0;
202    
203            while(<>) {
204                    chomp;
205                    next if (/^#/ || /^\s*$/);
206                    my $email = $_;
207                    $deleted++ if ($nos->delete_member_from_list( email => $email, list => $list_name ));
208          }          }
209    
210          print "list ",$list->name," has $added users\n";          print "list ",$list->name," lost $deleted users\n";
211    
212  =item --queue=list_name  
213    =item --queue[=list_name]
214    
215  Queue message for later delivery. Message can be read from file (specified as  Queue message for later delivery. Message can be read from file (specified as
216  argument) or read from C<STDIN>.  argument) or read from C<STDIN>.
217    
218    This option without optional parametar will display pending queue. If you
219    add C<--verbose> flag, it will display all messages in queue.
220    
221  =cut  =cut
222    
223  } elsif ($queue_opt) {  } elsif (defined($list_name = $opt->{'queue'})) {
         my $this_list = $lists->search(  
                 name => $queue_opt,  
         )->first || die "can't find list $queue_opt";  
224    
225          my $message_text;          if ($list_name ne '') {
226          while(<>) {                  # add message to list queue
227                  $message_text .= $_;  
228                    my $message_text;
229                    while(<>) {
230                            $message_text .= $_;
231                    }
232    
233                    my $id = $nos->add_message_to_list(
234                            list => $list_name,
235                            message => $message_text,
236                    ) || die "can't add message to list $list_name\n";
237    
238                    print "added message $id to list $list_name\n";
239    
240            } else {
241                    # list messages in queue        
242    
243                    foreach my $m ($queue->retrieve_all) {
244                            next if ($m->all_sent && ! $verbose);
245    
246                            my $l = $m->all_sent ? 'S' : 'Q';
247    
248                            my $date = $m->message_id->date;
249                            $date =~ s/\..+$//;
250                            my $msg = $m->message_id->message;
251                            $msg =~ s/\s+/ /gs;
252    
253                            $l .= sprintf(" %-15s %15s : ", $m->list_id->name, $date);
254                            $l .= substr($msg, 0, 79 - length($l));
255    
256                            print "$l\n";
257                    }
258    
259            }
260    
261    
262    =item --send[=list_name]
263    
264    Send e-mails waiting in queue, or with optional argument, just send messages
265    for single list.
266    
267    Optional argument C<--driver=smtp> forces sending using SMTP server at
268    localhost (127.0.0.1).
269    
270    Optional argument C<--sleep=42> defines that sender will sleep 42 seconds
271    between sending e-mail.
272    
273    =cut
274    
275    } elsif (defined($list_name = $opt->{'send'})) {
276    
277            unless ($opt->{'email_send_driver'}) {
278                    print "WARNING: this will dump debugging output to STDERR\n";
279                    print "enter alternative driver (e.g. smtp): ";
280                    my $d = <STDIN>;
281                    chomp($d);
282                    $opt->{'email_send_driver'} = $d;
283          }          }
284    
285          die "no message" unless ($message_text);          $nos->send_queued_messages(
286                    list => $list_name,
287                    driver => $opt->{'email_send_driver'},
288                    sleep => $opt->{'sleep'},
289            );
290    
         my $this_message = $messages->find_or_create({  
                 message => $message_text  
         }) || die "can't insert message";  
291    
292          $this_message->dbi_commit();  =item --inbox=list_name
293    
294          $queue->find_or_create({  Feed incomming message back into notice sender.
295                  message_id => $this_message->id,  
296                  list_id => $this_list->id,  =cut
297          }) || die "can't add message ",$this_message->id," to list ",$this_list->id, ": ",$this_list->name;  
298    } elsif ($list_name = $opt->{'inbox'}) {
299    
300            my $message;
301            while(<>) {
302                    $message .= $_;
303            }
304    
305            $nos->inbox_message(
306                    list => $list_name,
307                    message => $message,
308            ) || die "can't receive message for list $list_name";
309    
         print "added message ",$this_message->id, " to list ",$this_list->name,"\n";  
310    
311  } else  {  } else  {
312          die "see perldoc $0 for help";          pod2usage(-verbose=>0);
313  }  }
314    
315  =back  =back
316    
317    
318    
319    =head2 Helper options
320    
321    =over 20
322    
323    =item --debug
324    
325    Turn on debugging output from C<Class::DBI>
326    
327    =item --verbose
328    
329    Dump more info on screen.
330    
331    =back
332    
333    =head1 DESCRIPTION
334    
335    This command will use notice-sender C<Nos.pm> module directly to make modifications on lists
336    or with C<--inbox> option server as incomming mail filter.
337    
338  =head1 AUTHOR  =head1 AUTHOR
339    
340  Dobrica Pavlinusic <dpavlin@rot13.org>  Dobrica Pavlinusic <dpavlin@rot13.org>

Legend:
Removed from v.11  
changed lines
  Added in v.73

  ViewVC Help
Powered by ViewVC 1.1.26