1 |
apollock |
1 |
#!/usr/bin/perl |
2 |
|
|
# |
3 |
|
|
# printfax.pl 1.5.0, last changed 2000/03/22 |
4 |
|
|
# |
5 |
|
|
################################################################### |
6 |
|
|
# |
7 |
|
|
# Copyright (C) 2000 Horst F <horstf@gmx.de> |
8 |
|
|
# |
9 |
|
|
# This program is free software; you can redistribute it and/or |
10 |
|
|
# modify it under the terms of the GNU General Public License as |
11 |
|
|
# published by the Free Software Foundation; either version 2 of |
12 |
|
|
# the License, or (at your option) any later version. |
13 |
|
|
# |
14 |
|
|
# This program is distributed in the hope that it will be useful, |
15 |
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 |
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
17 |
|
|
# General Public License for more details. |
18 |
|
|
# |
19 |
|
|
# You should have received a copy of the GNU General Public License |
20 |
|
|
# along with this program; if not, write to the Free Software |
21 |
|
|
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
22 |
|
|
# |
23 |
|
|
################################################################### |
24 |
|
|
# |
25 |
|
|
# based on the script by |
26 |
|
|
# Heiko Schlittermann <heiko@lotte.sax.de> |
27 |
|
|
# added some modifications by |
28 |
|
|
# Don Hayward <don@marinelab.sarasota.fl.us> |
29 |
|
|
# Simon Hyde <shyde@poboxes.com> |
30 |
|
|
# Helmut Lichtenberg <heli@tzv.fal.de> |
31 |
|
|
# Ondrejicka Stefan <ondrej@idata.sk> |
32 |
|
|
# Bryan Halvorson <bryan@pkgplus.com> |
33 |
|
|
# |
34 |
|
|
# NOTE: I'm neither a perl nor network expert (as well |
35 |
|
|
# English isn't my natural language too) |
36 |
|
|
# |
37 |
|
|
##### |
38 |
|
|
# This script is intended to be used in conjunction with |
39 |
|
|
# ``Winsock Respond Daemon'' written by "Horst F" <horstf@gmx.de> |
40 |
|
|
# |
41 |
|
|
# You can download the current version from |
42 |
|
|
# http://www.boerde.de/~horstf/ |
43 |
|
|
# |
44 |
|
|
# called from smb.conf: |
45 |
|
|
# print command = ( /usr/bin/printfax.pl %I %s %U %m; rm %s ) & |
46 |
|
|
# |
47 |
|
|
# History (changes since 1996/10/28/): |
48 |
|
|
# [1996/10/28] |
49 |
|
|
# - one script for all perl versions since 5.0 (or earlier?) |
50 |
|
|
# (joining the scripts for 5.002 and for earlier versions) |
51 |
|
|
# - replace of 'localhost' with call of hostname(), hope |
52 |
|
|
# this fixes the problem with SunOS |
53 |
|
|
# [1996/10/29 1.3.2] |
54 |
|
|
# - the use of hostname() doesn't solve the problem with SunOS, |
55 |
|
|
# the problem was gethostbyname, but now it works |
56 |
|
|
# - start version numbering, now it's 1.3.2 |
57 |
|
|
# [1997/09/22 1.3.3] |
58 |
|
|
# - minor bug fix: |
59 |
|
|
# use "require/import" instead of "use Sys::Hostname" because |
60 |
|
|
# "use" includes a file at compile time and so it includes |
61 |
|
|
# Sys::Hostname every time, not only for perl version < 5.002 |
62 |
|
|
# [1997/10/29 1.3.4] |
63 |
|
|
# - reading faxnumbers from file in user's home dir or everywhere |
64 |
|
|
# - added debug output |
65 |
|
|
# [1998/01/26 1.3.5] |
66 |
|
|
# - report errors with winpopup |
67 |
|
|
# - additional faxspool arguments in configuration section |
68 |
|
|
# - optional faxnumber preprocessing |
69 |
|
|
# [1999/02/19 1.4.0] |
70 |
|
|
# - allows '*' in faxnumber now |
71 |
|
|
# - missing smbclient don't breaks the use of multiple faxnumbers |
72 |
|
|
# - added support for Hylafax (untested) |
73 |
|
|
# [1999/07/01 1.4.1] |
74 |
|
|
# - avoid winpopup timeout (seen with WinNT) |
75 |
|
|
# [1999/12/05 1.4.2] |
76 |
|
|
# - bug fix: use '-d' switch for hylafax when no faxreceiver given |
77 |
|
|
# [2000/03/22 1.5.0] |
78 |
|
|
# - added support for Windows NT Terminal Server |
79 |
|
|
# - added workaround for the double connection problem |
80 |
|
|
# - added additional logging features |
81 |
|
|
#### |
82 |
|
|
|
83 |
|
|
require 5.0; # Don't know if required include files exist |
84 |
|
|
# in earlier versions |
85 |
|
|
use strict; |
86 |
|
|
no strict "refs"; |
87 |
|
|
use Socket; |
88 |
|
|
|
89 |
|
|
# this is only required for perl versions below 5.002 |
90 |
|
|
if ( $] < 5.002 ) { |
91 |
|
|
require Sys::Hostname; |
92 |
|
|
import Sys::Hostname; |
93 |
|
|
} |
94 |
|
|
|
95 |
|
|
my($last, $tmp); |
96 |
|
|
|
97 |
|
|
### |
98 |
|
|
### CONFIGURATION Section |
99 |
|
|
### |
100 |
|
|
|
101 |
|
|
my($port, $usedelay, $defaultdelay, $acct, $faxspool, $smbclient, |
102 |
|
|
$logsmbhostname, $usesmbuser, $msg_to, $msg_ignored, |
103 |
|
|
$msg_spooled, $msg_failed, $debug, $allowfile, $filechar, |
104 |
|
|
$version, $nosendondebug, @faxspool_args, $msg_norespond, |
105 |
|
|
$msg_strangeerr, $intl_with, $unillegal, $unillegalnumbers, |
106 |
|
|
$termserver_ip, $ts_user, %respond_port, $minfaxsize, |
107 |
|
|
$cmdlinefmt); |
108 |
|
|
|
109 |
|
|
### printfax.pl version string |
110 |
|
|
$version = 'printfax.pl 1.5.0'; |
111 |
|
|
|
112 |
|
|
### The default port we'll connect to RESPOND |
113 |
|
|
$port = 5555; |
114 |
|
|
|
115 |
|
|
### Use delay |
116 |
|
|
$usedelay = 1; |
117 |
|
|
|
118 |
|
|
### Default delay for delayed faxes |
119 |
|
|
$defaultdelay = '18:00'; |
120 |
|
|
|
121 |
|
|
### The log file we'll write the accounting information to |
122 |
|
|
### (It has to be writeable by the user samba is running as for faxes) |
123 |
|
|
$acct = '/var/spool/fax/outgoing/printfax.log'; |
124 |
|
|
|
125 |
|
|
### Format of commandline |
126 |
|
|
$cmdlinefmt='mgetty'; |
127 |
|
|
# $cmdlinefmt='hylafax'; |
128 |
|
|
|
129 |
|
|
### The faxspoolprogram |
130 |
|
|
### for mgetty+sendfax: |
131 |
|
|
$faxspool = '/usr/bin/faxspool'; |
132 |
|
|
### for hylafax: |
133 |
|
|
# $faxspool = '/usr/bin/sendfax'; |
134 |
|
|
|
135 |
|
|
### Additional faxspool args (e.g. header, coverpage) |
136 |
|
|
### empty: |
137 |
|
|
@faxspool_args = qw(); |
138 |
|
|
### for mgetty+sendfax with a special header: |
139 |
|
|
# @faxspool_args = qw( -h /usr/local/etc/mgetty+sendfax/faxheader.smb ); |
140 |
|
|
### for hylafax with send email when job is done or requeued and use |
141 |
|
|
### a4 sized paper: |
142 |
|
|
# @faxspool_args = qw(-D -R -s a4); |
143 |
|
|
|
144 |
|
|
### The smbclient program, sender is the faxsystem. |
145 |
|
|
### Set to "" if you don't want to use smbclient |
146 |
|
|
$smbclient = '/usr/bin/smbclient -U FAX'; |
147 |
|
|
#$smbclient = ''; |
148 |
|
|
|
149 |
|
|
### The secure path for binaries searched |
150 |
|
|
### (faxspool makes usage of the PATH environment!) |
151 |
|
|
$ENV{PATH} = '/usr/local/bin:/usr/bin:/bin' . |
152 |
|
|
':/usr/local/sbin:/usr/sbin:/sbin' . |
153 |
|
|
':/usr/X11R6/bin'; |
154 |
|
|
|
155 |
|
|
### Use smb hostname for logging, set to 0 for inet hostname |
156 |
|
|
### (ip address will be logged in both cases) |
157 |
|
|
$logsmbhostname = 1; |
158 |
|
|
|
159 |
|
|
### use smbuser for returning mail, ignore what the user types in |
160 |
|
|
### (smbuser will be allways used for logging) |
161 |
|
|
$usesmbuser = 0; |
162 |
|
|
|
163 |
|
|
### Preprocess faxnumbers, disable it if you use faxspool aliases |
164 |
|
|
# this replaces a leading '+', "" for no replace |
165 |
|
|
$intl_with = ""; |
166 |
|
|
# delete all non numbers |
167 |
|
|
$unillegal = 0; |
168 |
|
|
# delete all non numbers, if faxnum contains only numbers and these characters |
169 |
|
|
# "" for no delete |
170 |
|
|
$unillegalnumbers = "()/-"; |
171 |
|
|
|
172 |
|
|
### messages for smbclient |
173 |
|
|
### English: |
174 |
|
|
$msg_to = "to"; |
175 |
|
|
$msg_ignored = "ignored"; |
176 |
|
|
$msg_spooled = "spooled"; |
177 |
|
|
$msg_failed = "failed"; |
178 |
|
|
$msg_norespond = "You doesn't have started RESPOND\nLaunch RESPOND and try again\n"; |
179 |
|
|
$msg_strangeerr = "Some serverside error\nTry again or contact administrator\n"; |
180 |
|
|
### German: |
181 |
|
|
# $msg_to = "an"; |
182 |
|
|
# $msg_ignored = "ignoriert"; |
183 |
|
|
# $msg_spooled = "gespoolt"; |
184 |
|
|
# $msg_failed = "fehlgeschlagen"; |
185 |
|
|
# $msg_norespond = "Respond laeuft nicht.\nBitte Respond starten und nochmal versuchen.\n"; |
186 |
|
|
# $msg_strangeerr = "Fehler im Faxserver.\nBitte den Administrator benachrichtigen.\n"; |
187 |
|
|
|
188 |
|
|
### allow file for faxnumbers |
189 |
|
|
$allowfile = 1; |
190 |
|
|
$filechar = '@'; |
191 |
|
|
|
192 |
|
|
### set $debug to 1 for debug messages and $nosendondebug to 1 if |
193 |
|
|
### you don't want to spool files on debug |
194 |
|
|
### debug messages go to syslog (or stderr, if called from commandline) |
195 |
|
|
$debug = 0; |
196 |
|
|
$nosendondebug = 1; |
197 |
|
|
|
198 |
|
|
### NT Terminal server and Win2000 sends out bogus print requests with |
199 |
|
|
### short files. Treat requests with files less than this size as bogus. |
200 |
|
|
$minfaxsize = "100"; |
201 |
|
|
|
202 |
|
|
### extra config info for NT Terminal server. |
203 |
|
|
### If you don't have an NT terminal server you can safely ignore this |
204 |
|
|
### section. Currently only one terminal server is supported. |
205 |
|
|
|
206 |
|
|
# IP address of the terminal server, leave empty if you have none |
207 |
|
|
# $termserver_ip = "192.168.101.171"; |
208 |
|
|
$termserver_ip = ""; |
209 |
|
|
|
210 |
|
|
# Array of user-port assignments |
211 |
|
|
# If a request comes from the terminal server from one of the |
212 |
|
|
# users in the array the assigned port will be used instead of the |
213 |
|
|
# default port to connect to Respond |
214 |
|
|
%respond_port = ( |
215 |
|
|
# Samples |
216 |
|
|
# "me", "5556", |
217 |
|
|
# "myself", "5557", |
218 |
|
|
# "and_I", "5558" |
219 |
|
|
); |
220 |
|
|
|
221 |
|
|
### |
222 |
|
|
### NOTHING else to configure |
223 |
|
|
### |
224 |
|
|
|
225 |
|
|
### Message buffer for smbclient (to avoid timeout) |
226 |
|
|
my($messagebuffer); |
227 |
|
|
$messagebuffer = ''; |
228 |
|
|
|
229 |
|
|
### Append a message to message buffer |
230 |
|
|
sub smbmessage { |
231 |
|
|
$messagebuffer .= "@_"; |
232 |
|
|
} |
233 |
|
|
|
234 |
|
|
### Send message buffer to windows client |
235 |
|
|
my($smbhost); |
236 |
|
|
sub sendmessage { |
237 |
|
|
if ($messagebuffer && $smbclient && (!$debug || ($debug && ! -t STDERR))) { |
238 |
|
|
open(SF,"|$smbclient -M $smbhost") || ($smbclient = ""); |
239 |
|
|
$last = select(SF); $| = 1; select($last); |
240 |
|
|
printf SF "$messagebuffer"; |
241 |
|
|
close(SF); |
242 |
|
|
} |
243 |
|
|
} |
244 |
|
|
|
245 |
|
|
### Error functions |
246 |
|
|
|
247 |
|
|
sub norespond { |
248 |
|
|
if ($smbclient) { |
249 |
|
|
&smbmessage("$msg_norespond"); |
250 |
|
|
&sendmessage(); |
251 |
|
|
} |
252 |
|
|
die "@_"; |
253 |
|
|
} |
254 |
|
|
|
255 |
|
|
sub strangeerr { |
256 |
|
|
if ($smbclient) { |
257 |
|
|
&smbmessage("$msg_strangeerr"); |
258 |
|
|
&sendmessage(); |
259 |
|
|
} |
260 |
|
|
die "@_"; |
261 |
|
|
} |
262 |
|
|
|
263 |
|
|
sub silenterr { |
264 |
|
|
die "@_"; |
265 |
|
|
} |
266 |
|
|
|
267 |
|
|
### If called non interactivly ... use the logger to report errors |
268 |
|
|
### in syslog |
269 |
|
|
|
270 |
|
|
-t STDERR |
271 |
|
|
|| open(STDERR, "|logger -itprintfax") |
272 |
|
|
|| die "$0\[$$]: Can't open logger: $!\n"; |
273 |
|
|
|
274 |
|
|
|
275 |
|
|
### Make STDERR unbuffered |
276 |
|
|
$last = select(STDERR); $| = 1; |
277 |
|
|
select($last); |
278 |
|
|
|
279 |
|
|
if ($debug) { |
280 |
|
|
print STDERR "$version started with: ", join(" ",@ARGV), "\n"; |
281 |
|
|
} |
282 |
|
|
|
283 |
|
|
### COMMAND line processing |
284 |
|
|
my($remote_ip, $faxfile, $smbuser, $faxfname); |
285 |
|
|
|
286 |
|
|
# 1.: The ip address (smb.conf: %I) |
287 |
|
|
$remote_ip = $ARGV[0]; |
288 |
|
|
# 2.: The name of the faxfile with path (%s) |
289 |
|
|
$faxfile = $ARGV[1]; |
290 |
|
|
# 3.: The samba session setup user (%U) |
291 |
|
|
# used for accounting and if RESPOND doesn't return the user name |
292 |
|
|
$smbuser = $ARGV[2]; |
293 |
|
|
# 4.: The NetBIOS hostname (%m) |
294 |
|
|
$smbhost = $ARGV[3]; |
295 |
|
|
|
296 |
|
|
# Strip any domain from smbhost if required |
297 |
|
|
# (sometimes %m gets the full qualified internet name) |
298 |
|
|
$smbhost =~ s/^([^.]+).*$/$1/; |
299 |
|
|
|
300 |
|
|
# Strip path from filename |
301 |
|
|
($faxfname = $faxfile) =~ s|.*/||; |
302 |
|
|
|
303 |
|
|
### Check on the file that samba handed us |
304 |
|
|
if (!(-f $faxfile)) { |
305 |
|
|
&strangeerr( "$0\[$$]: Fax file given on the command line doesn't exist.\n"); |
306 |
|
|
} |
307 |
|
|
if (-z $faxfile) { |
308 |
|
|
&silenterr( "$0\[$$]: Fax file given on the command line is zero length.\n"); |
309 |
|
|
} |
310 |
|
|
if ((-s $faxfile) < $minfaxsize) { |
311 |
|
|
&silenterr( "$0\[$$]: Fax file size is less than $minfaxsize.\n"); |
312 |
|
|
} |
313 |
|
|
|
314 |
|
|
### See if we're talking to a user on a terminal server |
315 |
|
|
if ($remote_ip eq $termserver_ip) { |
316 |
|
|
# get the user name |
317 |
|
|
$ts_user = $smbuser; |
318 |
|
|
$ts_user =~ tr/A-Z/a-z/; |
319 |
|
|
|
320 |
|
|
# if the terminal server user has a different port number |
321 |
|
|
# assigned to the respond program, reset $port to match it. |
322 |
|
|
if ($respond_port{$ts_user}) { |
323 |
|
|
$port = $respond_port{$ts_user}; |
324 |
|
|
} |
325 |
|
|
if ($debug) { |
326 |
|
|
print STDERR "User $ts_user is on a Terminal Server. Using port $port for respond.\n"; |
327 |
|
|
} |
328 |
|
|
} |
329 |
|
|
|
330 |
|
|
|
331 |
|
|
### Check config |
332 |
|
|
if (($cmdlinefmt ne 'hylafax') && ($cmdlinefmt ne 'mgetty')) { |
333 |
|
|
&strangeerr( "$0\[$$]: Illegal value for cmdlinefmt: $cmdlinefmt\n"); |
334 |
|
|
} |
335 |
|
|
|
336 |
|
|
### Establish the socket connection |
337 |
|
|
my($ip_remote, $remote, $proto); |
338 |
|
|
$proto = getprotobyname('tcp'); |
339 |
|
|
|
340 |
|
|
# Since version 5.002 perl uses new ipc method |
341 |
|
|
if ( $] < 5.002 ) { |
342 |
|
|
# This is for perl versions below 5.002 |
343 |
|
|
|
344 |
|
|
my($ip_local, $local); |
345 |
|
|
$ip_local = (gethostbyname(hostname()))[4]; |
346 |
|
|
$local = &Socket::sockaddr_in(AF_INET, 0, unpack('C4', $ip_local)); |
347 |
|
|
|
348 |
|
|
# This does not work on some systems (gethostbyname doesn't work properly): |
349 |
|
|
# $ip_remote = (gethostbyname($remote_ip))[4] || |
350 |
|
|
# &strangeerr("$0\[$$]: No such host: $remote_ip\n"); |
351 |
|
|
# $remote = &Socket::sockaddr_in(AF_INET, $port, unpack('C4', $ip_remote)); |
352 |
|
|
|
353 |
|
|
# so we use this: |
354 |
|
|
$remote = &Socket::sockaddr_in(AF_INET, $port, split(/\./, $remote_ip)); |
355 |
|
|
|
356 |
|
|
if ($debug) { |
357 |
|
|
print STDERR "trying to connect to $remote_ip as ", |
358 |
|
|
join ('.', unpack('C4', $ip_local)), "\n"; |
359 |
|
|
} |
360 |
|
|
|
361 |
|
|
socket(S, AF_INET, SOCK_STREAM, $proto) |
362 |
|
|
|| &strangeerr("$0\[$$]: Can't get socket: $!\n"); |
363 |
|
|
|
364 |
|
|
bind(S, $local) || &strangeerr("$0\[$$]: Can't bind socket: $!\n"); |
365 |
|
|
|
366 |
|
|
} else { |
367 |
|
|
# This must be used since perl version 5.002 |
368 |
|
|
|
369 |
|
|
# This seams to work: |
370 |
|
|
$ip_remote = inet_aton($remote_ip) || &strangeerr("$0\[$$]: No host: $remote_ip\n"); |
371 |
|
|
$remote = sockaddr_in($port, $ip_remote); |
372 |
|
|
|
373 |
|
|
# if not, try this: |
374 |
|
|
# $remote = sockaddr_in($port, pack('C4', split(/\./, $remote_ip))); |
375 |
|
|
|
376 |
|
|
if ($debug) { |
377 |
|
|
print STDERR "trying to connect to $remote_ip\n"; |
378 |
|
|
} |
379 |
|
|
|
380 |
|
|
socket(S, PF_INET, SOCK_STREAM, $proto) |
381 |
|
|
|| &strangeerr("$0\[$$]: Can't get socket: $!\n"); |
382 |
|
|
|
383 |
|
|
} |
384 |
|
|
connect(S, $remote) || &norespond("$0\[$$]: Can't connect to $remote_ip: $!\n"); |
385 |
|
|
|
386 |
|
|
|
387 |
|
|
if ($debug) { |
388 |
|
|
print STDERR "connected\n"; |
389 |
|
|
} |
390 |
|
|
|
391 |
|
|
### Get the needed information |
392 |
|
|
my($faxnum, $user, $faxreceiver, $fullname, $delayed); |
393 |
|
|
|
394 |
|
|
# Read FaxNr, User, Receivers name and Users fullname |
395 |
|
|
# as well as strip trailing \n or \r |
396 |
|
|
($faxnum = <S>) =~ tr/\r\n//d; |
397 |
|
|
($user = <S>) =~ tr/\r\n//d; |
398 |
|
|
($faxreceiver = <S>) =~ tr/\r\n//d; |
399 |
|
|
($fullname = <S>) =~ tr/\r\n//d; |
400 |
|
|
($delayed = <S>) =~ tr/\r\n//d; |
401 |
|
|
|
402 |
|
|
if ($debug) { |
403 |
|
|
print STDERR "got faxnumber: $faxnum\n"; |
404 |
|
|
print STDERR "got receiver : $faxreceiver\n"; |
405 |
|
|
print STDERR "got sender : $user\n"; |
406 |
|
|
print STDERR "got fullname : $fullname\n"; |
407 |
|
|
print STDERR "got delay : $delayed\n"; |
408 |
|
|
} |
409 |
|
|
|
410 |
|
|
# use default delay if respond's delay checkbox checked |
411 |
|
|
if ( $delayed eq 'delayed' ) { $delayed = $defaultdelay; } |
412 |
|
|
|
413 |
|
|
# Close the query connection |
414 |
|
|
close(S); |
415 |
|
|
|
416 |
|
|
# use samba user if no user is given |
417 |
|
|
$user = $smbuser unless $user; |
418 |
|
|
|
419 |
|
|
# allways use smbuser (look in the configuration section) |
420 |
|
|
$user = $smbuser if $usesmbuser; |
421 |
|
|
|
422 |
|
|
# user needs to lowercased too |
423 |
|
|
$user =~ tr/A-Z/a-z/; |
424 |
|
|
|
425 |
|
|
my(@faxnums, $gcos); |
426 |
|
|
|
427 |
|
|
# split space or comma delimited faxnums (for more then one receiver) |
428 |
|
|
@faxnums = split(/[ ,]+/, $faxnum); |
429 |
|
|
|
430 |
|
|
|
431 |
|
|
# Retrieve additional information about the user (here: the users |
432 |
|
|
# fullname) and the date |
433 |
|
|
|
434 |
|
|
# Extract fullname from /etc/passwd |
435 |
|
|
# only if we didn't get it from respond |
436 |
|
|
$fullname =~ s/^ *(.*) *$/\1/; |
437 |
|
|
if ( ! $fullname ) { |
438 |
|
|
$gcos = (getpwnam($user))[6]; |
439 |
|
|
$fullname = (split(/,/, $gcos))[0]; |
440 |
|
|
} |
441 |
|
|
$fullname = $user unless $fullname; |
442 |
|
|
|
443 |
|
|
### OK, do accounting |
444 |
|
|
|
445 |
|
|
# What says the clock? |
446 |
|
|
my($s, $m, $h, $dy, $mo, $yr); |
447 |
|
|
($s, $m, $h, $dy, $mo, $yr) = (localtime(time))[0..5]; |
448 |
|
|
$mo++; # month is 0 based. |
449 |
|
|
|
450 |
|
|
my($host, $faxdest); |
451 |
|
|
|
452 |
|
|
# Log smb or inet hostname (look in the configuration section) |
453 |
|
|
if ( $logsmbhostname ) { |
454 |
|
|
|
455 |
|
|
# Use the NetBIOS name for accounting: |
456 |
|
|
$host = "$smbhost($remote_ip)"; |
457 |
|
|
|
458 |
|
|
# Uppercase looks more NetBIOS like :-) |
459 |
|
|
# uncomment if you don't want this |
460 |
|
|
$host =~ tr/a-z/A-Z/; |
461 |
|
|
|
462 |
|
|
} else { |
463 |
|
|
|
464 |
|
|
# Use the internet name for accounting: |
465 |
|
|
$host = (gethostbyaddr(pack('C4', split(/\./, $remote_ip)),AF_INET))[0]; |
466 |
|
|
|
467 |
|
|
# Strip domains from name |
468 |
|
|
$host =~ s/^([^.]+).*$/$1/; |
469 |
|
|
$host = ($host) ? "$host($remote_ip)" : $remote_ip; |
470 |
|
|
|
471 |
|
|
} |
472 |
|
|
|
473 |
|
|
# Open the accounting file |
474 |
|
|
open(ACCT, ">>$acct") || &strangeerr("$0\[$$]: Can't open `$acct': $!\n"); |
475 |
|
|
|
476 |
|
|
# Make it unbuffered |
477 |
|
|
$last = select(ACCT); $| = 1; |
478 |
|
|
select($last); |
479 |
|
|
|
480 |
|
|
|
481 |
|
|
# If no faxnum is given it's assumed that cancelling the fax is ok. |
482 |
|
|
scalar(@faxnums) || do { |
483 |
|
|
printf ACCT "[%02d/%02d/%02d] %02d:%02d:%02d Fax from $host by $smbuser", |
484 |
|
|
$mo, $dy, $yr, $h, $m, $s; |
485 |
|
|
if ( $faxreceiver ) { |
486 |
|
|
print ACCT " to $faxreceiver"; |
487 |
|
|
$faxdest = " " . $msg_to . " $faxreceiver"; |
488 |
|
|
} |
489 |
|
|
print ACCT " cancelled\n"; |
490 |
|
|
if ($smbclient) { |
491 |
|
|
&smbmessage("Fax $faxfname$faxdest $msg_ignored\n"); |
492 |
|
|
&sendmessage(); |
493 |
|
|
} |
494 |
|
|
close(ACCT); |
495 |
|
|
if ($debug) { |
496 |
|
|
print STDERR "No faxnumbers given. Fax cancelled. Aborting\n"; |
497 |
|
|
} |
498 |
|
|
exit 0; |
499 |
|
|
}; |
500 |
|
|
|
501 |
|
|
### Spool it |
502 |
|
|
|
503 |
|
|
my(@fixargs, @faxargs, $fnum, $retval); |
504 |
|
|
|
505 |
|
|
# Arguments for faxspool call |
506 |
|
|
# --- Change this for other fax programs |
507 |
|
|
if ($cmdlinefmt eq 'hylafax') { |
508 |
|
|
@fixargs = ("-f",$user,"-r", $fullname); |
509 |
|
|
} elsif ($cmdlinefmt eq 'mgetty') { |
510 |
|
|
@fixargs = ("-q","-f","$user","-F","$fullname"); |
511 |
|
|
} |
512 |
|
|
@fixargs = (@fixargs,@faxspool_args) if @faxspool_args; |
513 |
|
|
|
514 |
|
|
# set delay if required |
515 |
|
|
if ( ($delayed ne '') && $usedelay ) { |
516 |
|
|
# Additional argument for faxspool call |
517 |
|
|
# --- Change this for other fax programs |
518 |
|
|
if ($cmdlinefmt eq 'hylafax') { |
519 |
|
|
push(@fixargs,"-a",$delayed); |
520 |
|
|
} elsif ($cmdlinefmt eq 'mgetty') { |
521 |
|
|
@fixargs = (@fixargs,"-t","$delayed"); |
522 |
|
|
} |
523 |
|
|
} |
524 |
|
|
|
525 |
|
|
# do the "faxnumbers in a file" handling |
526 |
|
|
|
527 |
|
|
my(@newfaxnums, @numfiles1, @numfiles2, @files, $file, $fnum2); |
528 |
|
|
|
529 |
|
|
if ($allowfile) { |
530 |
|
|
|
531 |
|
|
# seperate between faxnumbers and filenames |
532 |
|
|
foreach $fnum (@faxnums) { |
533 |
|
|
if (substr($fnum,0,1) eq $filechar ) { |
534 |
|
|
push(@numfiles1, $fnum); |
535 |
|
|
} else { |
536 |
|
|
push(@newfaxnums, $fnum); |
537 |
|
|
} |
538 |
|
|
} |
539 |
|
|
@faxnums = @newfaxnums; |
540 |
|
|
|
541 |
|
|
# now process the file(s), a file can contain other filenames |
542 |
|
|
while (scalar(@numfiles1)) { |
543 |
|
|
foreach $fnum (@numfiles1) { |
544 |
|
|
$file = substr($fnum, 1); |
545 |
|
|
|
546 |
|
|
# Don't read a file twice (avoid endless loop)! |
547 |
|
|
next if scalar(grep($_ eq $file, @files)); |
548 |
|
|
push(@files, $file); |
549 |
|
|
|
550 |
|
|
# Get user's home dir, if path is not absolute |
551 |
|
|
if (substr($file,0,1) ne '/') { |
552 |
|
|
$file = (getpwnam($smbuser))[7] . "/$file"; |
553 |
|
|
} |
554 |
|
|
|
555 |
|
|
# Read a file |
556 |
|
|
|
557 |
|
|
if ($debug) { |
558 |
|
|
print STDERR "read file $file - "; |
559 |
|
|
} |
560 |
|
|
|
561 |
|
|
if (open(NUMBERS,"<$file")) { |
562 |
|
|
while (<NUMBERS>) { |
563 |
|
|
|
564 |
|
|
# remove \r and \n |
565 |
|
|
tr/\r\n//d; |
566 |
|
|
|
567 |
|
|
# remove trailing blanks |
568 |
|
|
s/^ *(.*) *$/$1/; |
569 |
|
|
|
570 |
|
|
# ignore comments |
571 |
|
|
next if /^#/; |
572 |
|
|
|
573 |
|
|
# separate between faxnumbers and filenames |
574 |
|
|
foreach $fnum2 (split(/[ ,]+/)) { |
575 |
|
|
if (substr($fnum2,0,1) eq $filechar) { |
576 |
|
|
push(@numfiles2, $fnum2); |
577 |
|
|
} else { |
578 |
|
|
push(@faxnums, $fnum2); |
579 |
|
|
} |
580 |
|
|
} |
581 |
|
|
} |
582 |
|
|
close(NUMBERS); |
583 |
|
|
|
584 |
|
|
if ($debug) { |
585 |
|
|
print STDERR "ok\n", |
586 |
|
|
} |
587 |
|
|
|
588 |
|
|
} elsif ($debug) { |
589 |
|
|
print STDERR "failed\n"; |
590 |
|
|
} |
591 |
|
|
} |
592 |
|
|
|
593 |
|
|
# recurse files |
594 |
|
|
@numfiles1 = @numfiles2; |
595 |
|
|
@numfiles2 = (); |
596 |
|
|
|
597 |
|
|
} |
598 |
|
|
} |
599 |
|
|
|
600 |
|
|
# preprocess faxnumbers |
601 |
|
|
if ( $intl_with || $unillegal || $unillegalnumbers) { |
602 |
|
|
for($tmp=0; $tmp<scalar(@faxnums); $tmp++) { |
603 |
|
|
$faxnums[$tmp] =~ s/^\+/$intl_with/ if $intl_with; |
604 |
|
|
if ( $unillegalnumbers ) { |
605 |
|
|
$_ = $faxnums[$tmp]; |
606 |
|
|
# remove separator chars |
607 |
|
|
eval "tr[$unillegalnumbers][]d;"; |
608 |
|
|
$faxnums[$tmp] = $_ if tr/*0-9// == length; |
609 |
|
|
} else { |
610 |
|
|
# remove all except digits and * |
611 |
|
|
$faxnums[$tmp] =~ tr/*0-9//cd if $unillegal; |
612 |
|
|
} |
613 |
|
|
} |
614 |
|
|
} |
615 |
|
|
# delete duplicate faxnumbers |
616 |
|
|
@newfaxnums = sort(@faxnums); |
617 |
|
|
@faxnums = (); |
618 |
|
|
$fnum2 = ""; |
619 |
|
|
while ($fnum = shift(@newfaxnums)) { |
620 |
|
|
push(@faxnums, $fnum) if ($fnum ne $fnum2); |
621 |
|
|
$fnum2 = $fnum; |
622 |
|
|
} |
623 |
|
|
|
624 |
|
|
|
625 |
|
|
# Spool it once for every number in $faxnum |
626 |
|
|
foreach $fnum (@faxnums) { |
627 |
|
|
printf ACCT "[%02d/%02d/%02d] %02d:%02d:%02d Fax from $host by $smbuser ", |
628 |
|
|
$mo, $dy, $yr, $h, $m, $s; |
629 |
|
|
|
630 |
|
|
# Build faxspool arguments from above arguments, number and file |
631 |
|
|
# --- Change this for other fax programs |
632 |
|
|
if( $cmdlinefmt eq 'hylafax' ) { |
633 |
|
|
if ( $faxreceiver ) { |
634 |
|
|
# Add receivers name to faxspool arguments |
635 |
|
|
@faxargs = (@fixargs,"-d",$faxreceiver . '@'. $fnum,$faxfile); |
636 |
|
|
} else { |
637 |
|
|
@faxargs = (@fixargs,"-d",$fnum,$faxfile); |
638 |
|
|
} |
639 |
|
|
} elsif ( $cmdlinefmt eq 'mgetty' ) { |
640 |
|
|
@faxargs = (@fixargs,$fnum,$faxfile); |
641 |
|
|
if ( $faxreceiver ) { |
642 |
|
|
# Add receivers name to faxspool arguments |
643 |
|
|
@faxargs = ("-D","$faxreceiver",@faxargs); |
644 |
|
|
} |
645 |
|
|
} else { |
646 |
|
|
@faxargs = (@fixargs,$fnum,$faxfile); |
647 |
|
|
} |
648 |
|
|
|
649 |
|
|
if ( $faxreceiver ) { |
650 |
|
|
print ACCT "to $faxreceiver ($fnum)"; |
651 |
|
|
$faxdest = "$faxreceiver ($fnum)"; |
652 |
|
|
} else { |
653 |
|
|
print ACCT "to $fnum"; |
654 |
|
|
$faxdest = "$fnum"; |
655 |
|
|
} |
656 |
|
|
|
657 |
|
|
# Call the fax spooler |
658 |
|
|
if ($debug) { |
659 |
|
|
print STDERR "simulate " if ($nosendondebug); |
660 |
|
|
print STDERR "call: $faxspool ", join(" ", @faxargs), "\n"; |
661 |
|
|
} |
662 |
|
|
if (!$debug || ($debug && !$nosendondebug)) { |
663 |
|
|
system($faxspool, @faxargs); |
664 |
|
|
} |
665 |
|
|
|
666 |
|
|
|
667 |
|
|
# Report the state to the logfile |
668 |
|
|
$retval = $?; |
669 |
|
|
if ($debug && !$nosendondebug) { |
670 |
|
|
print STDERR "spooling "; |
671 |
|
|
print STDERR ($retval == 0) ? "succeeded\n" : "failed\n"; |
672 |
|
|
} |
673 |
|
|
print ACCT (($retval == 0) ? " spooled\n" : " failed\n"); |
674 |
|
|
if ($smbclient) { |
675 |
|
|
&smbmessage("Fax $faxfname $msg_to $faxdest " ); |
676 |
|
|
&smbmessage(($retval == 0) ? $msg_spooled : $msg_failed ); |
677 |
|
|
&smbmessage("\n"); |
678 |
|
|
} |
679 |
|
|
} |
680 |
|
|
|
681 |
|
|
### Done |
682 |
|
|
if ($smbclient) { |
683 |
|
|
&sendmessage(); |
684 |
|
|
} |
685 |
|
|
close(ACCT); |
686 |
|
|
exit 0; |