/[notice-sender]/jifty-dbi/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

Contents of /jifty-dbi/sender.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 91 - (show annotations)
Mon Dec 18 19:38:50 2006 UTC (17 years, 4 months ago) by dpavlin
File MIME type: text/plain
File size: 7311 byte(s)
make experimental branch for Jifty::DBI test
1 #!/usr/bin/perl -w
2
3 use strict;
4 use blib;
5 use Nos 0.7;
6 use Getopt::Long;
7 use Pod::Usage;
8
9 =head1 NAME
10
11 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
30
31 my $debug = 0;
32 my $verbose = 0;
33 my $opt;
34
35 my $result = GetOptions(
36 "create=s" => \$opt->{'create'},
37 "drop=s" => \$opt->{'drop'},
38 "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,
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?";
66
67 my $lists = $loader->find_class('lists');
68 my $users = $loader->find_class('users');
69 my $user_list = $loader->find_class('user_list');
70 my $messages = $loader->find_class('messages');
71 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 =cut
146
147 } elsif (defined($list_name = $opt->{'list'})) {
148
149 my @lists;
150
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
164
165 =item --add=list_name
166
167 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;
180
181 while(<>) {
182 chomp;
183 next if (/^#/ || /^\s*$/);
184 my ($email, $name) = split(/\s+/,$_, 2);
185 $added++ if ($nos->add_member_to_list( email => $email, name => $name, list => $list_name ));
186 }
187
188 print "list ",$list->name," has $added users\n";
189
190
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," 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 $nos->send_queued_messages(
286 list => $list_name,
287 driver => $opt->{'email_send_driver'},
288 sleep => $opt->{'sleep'},
289 );
290
291
292 =item --inbox=list_name
293
294 Feed incomming message back into notice sender.
295
296 =cut
297
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
310
311 } else {
312 pod2usage(-verbose=>0);
313 }
314
315 =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
339
340 Dobrica Pavlinusic <dpavlin@rot13.org>
341
342 =cut
343

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.26