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

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

  ViewVC Help
Powered by ViewVC 1.1.26