/[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 6 by dpavlin, Sat May 14 12:31:27 2005 UTC revision 93 by dpavlin, Tue Dec 19 15:04:05 2006 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 lib 'lib';
5    use Nos 0.9;
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 SYNOPSIS
14    
15     sender.pl --create=mylist
16     sender.pl --drop=mylist
17     sender.pl --add=mylist members.txt
18     sender.pl --delete=mylist members.txt
19     sender.pl --list[=mylist]
20     sender.pl --queue[=mylist message.txt]
21     sender.pl --send=mylist
22     sender.pl --help
23     sender.pl --man
24    
25    =head1 OPTIONS
26    
27    =over 20
28    
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"  => \$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 $message_list = $loader->find_class('message_list');  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]
139    
140    List all available lists and users on them.
141    
142    Optional value is name of list. With it, this option will produce just users
143    on that list.
144    
145  if ($list_opt) {  =cut
146          foreach my $list ($lists->retrieve_all) {  
147                  print $list->name,"\n";  } elsif (defined($list_name = $opt->{'list'})) {
148                  foreach my $user_on_list ($user_list->search(list_id => $list->id)) {  
149                          my $user = $users->retrieve( id => $user_on_list->user_id );          my @lists;
150                          print "\t",$user->full_name," <", $user->email, ">\n";  
151            if ($list_name ne '') {
152                    @lists = $lists->search( name=> $list_name )->first || die "can't find list $list_name";
153            } else {
154                    @lists = $lists->retrieve_all;
155            }
156    
157            foreach my $list (@lists) {
158                    print $list->name,": ",$list->from_addr," <",$list->email,">\n";
159                    foreach my $u ($nos->list_members( list => $list->name )) {
160                            print "\t",$u->{'name'}, " <", $u->{'email'}, ">",( $u->{'ext_id'} ? ' ['.$u->{'ext_id'}.']' : '' ),"\n";
161                  }                  }
162          }          }
163  } elsif ($add_opt) {  
164          #my $noticer = $loader->find_class('Noticer') || die "can't find my class!";  
165          my $list = $lists->find_or_create({  =item --add=list_name
166                  name => $add_opt,  
167          }) || die "can't add list $add_opt\n";  Add users to list. Users are stored in file (which can be supplied as
168    argument) or read from C<STDIN>. List should be in following format:
169    
170     email@example.com      Optional full name of person
171     dpavlin@rot13.org      Dobrica Pavlinusic
172    
173    =cut
174    
175    } elsif ($list_name = $opt->{'add'}) {
176    
177            my $list = $nos->_get_list($list_name) || die "can't find list $list_name\n";
178    
179          my $added = 0;          my $added = 0;
180    
# Line 60  if ($list_opt) { Line 182  if ($list_opt) {
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++;  
         }  
   
         foreach my $c_name ($loader->tables) {  
                 my $c = $loader->find_class($c_name)|| die "can't find $c_name";  
                 $c->dbi_commit();  
186          }          }
187    
188          print "list ",$list->name," has $added users\n";          print "list ",$list->name," has $added users\n";
189    
 } elsif ($queue_opt) {  
         my $this_list = $lists->search(  
                 name => $queue_opt,  
         )->first || die "can't find list $queue_opt";  
190    
191          my $message_text;  =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(<>) {          while(<>) {
204                  $message_text .= $_;                  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," lost $deleted users\n";
211    
212    
213    =item --queue[=list_name]
214    
215    Queue message for later delivery. Message can be read from file (specified as
216    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
222    
223    } elsif (defined($list_name = $opt->{'queue'})) {
224    
225            if ($list_name ne '') {
226                    # add message to list queue
227    
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                    verbose => 1,
290            );
291    
         my $this_message = $messages->find_or_create({  
                 message => $message_text  
         }) || die "can't insert message";  
292    
293          $this_message->dbi_commit();  =item --inbox=list_name
294    
295          $message_list->find_or_create({  Feed incomming message back into notice sender.
296                  message_id => $this_message->id,  
297                  list_id => $this_list->id,  =cut
298          }) || die "can't add message ",$this_message->id," to list ",$this_list->id, ": ",$this_list->name;  
299    } elsif ($list_name = $opt->{'inbox'}) {
300    
301            my $message;
302            while(<>) {
303                    $message .= $_;
304            }
305    
306            $nos->inbox_message(
307                    list => $list_name,
308                    message => $message,
309            ) || die "can't receive message for list $list_name";
310    
         print "added message ",$this_message->id, " to list ",$this_list->name,"\n";  
311    
312  } else  {  } else  {
313          die $0.'          pod2usage(-verbose=>0);
         --list                          show all lists and users  
         --add=name_of_list < users.txt  add users (email@example.com full name)  
         --queue=name_of_list < message  queue message for sending to list  
         --debug  
 ';  
314  }  }
315    
316    =back
317    
318    
319    
320    =head2 Helper options
321    
322    =over 20
323    
324    =item --debug
325    
326    Turn on debugging output from C<Class::DBI>
327    
328    =item --verbose
329    
330    Dump more info on screen.
331    
332    =back
333    
334    =head1 DESCRIPTION
335    
336    This command will use notice-sender C<Nos.pm> module directly to make modifications on lists
337    or with C<--inbox> option server as incomming mail filter.
338    
339    =head1 AUTHOR
340    
341    Dobrica Pavlinusic <dpavlin@rot13.org>
342    
343    =cut
344    

Legend:
Removed from v.6  
changed lines
  Added in v.93

  ViewVC Help
Powered by ViewVC 1.1.26