/[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

Contents of /trunk/sender.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 72 - (show annotations)
Mon Aug 22 20:24:04 2005 UTC (18 years, 8 months ago) by dpavlin
File MIME type: text/plain
File size: 7025 byte(s)
great API change: list options are now create_list and drop_list

1 #!/usr/bin/perl -w
2
3 use strict;
4 use blib;
5 use Nos 0.7;
6 use Getopt::Long;
7
8 =head1 NAME
9
10 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
31
32 my $debug = 0;
33 my $verbose = 0;
34 my $opt;
35
36 my $result = GetOptions(
37 "create=s" => \$opt->{'create'},
38 "drop=s" => \$opt->{'drop'},
39 "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,
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 dsn => 'dbi:Pg:dbname=notices',
55 user => 'dpavlin',
56 passwd => '',
57 debug => $debug,
58 verbose => $verbose,
59 );
60
61 my $loader = $nos->{'loader'} || die "can't find loader?";
62
63 my $lists = $loader->find_class('lists');
64 my $users = $loader->find_class('users');
65 my $user_list = $loader->find_class('user_list');
66 my $messages = $loader->find_class('messages');
67 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 =cut
123
124 } elsif ($list_name = $opt->{'drop'}) {
125
126 my $id = $nos->drop_list(
127 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
160
161 =item --add=list_name
162
163 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;
176
177 while(<>) {
178 chomp;
179 next if (/^#/ || /^\s*$/);
180 my ($email, $name) = split(/\s+/,$_, 2);
181 $added++ if ($nos->add_member_to_list( email => $email, name => $name, list => $list_name ));
182 }
183
184 print "list ",$list->name," has $added users\n";
185
186
187 =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(<>) {
200 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
257
258 =item --send[=list_name]
259
260 Send e-mails waiting in queue, or with optional argument, just send messages
261 for single list.
262
263 Optional argument C<--driver=smtp> forces sending using SMTP server at
264 localhost (127.0.0.1).
265
266 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
306
307 } else {
308 die "see perldoc $0 for help\n";
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

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.26