HylaFAX The world's
most advanced open source fax server
|
|
[
Date Prev][
Date Next][
Thread Prev][
Thread Next]
[
Date Index]
[
Thread Index]
Re: Viewing received faxes via http browser
-----BEGIN PGP SIGNED MESSAGE-----
On Wed, 22 Oct 1997, Uri Shkolnik wrote:
> I'm running Hylafax 4p1 on SunOS4.1.4, I want to enabled users to view
> faxes with Netscape/Internet Explorer etc. via my Intranet web site.
>
> Does anybody have a working system like this?
YES! Moo-ha-ha! There was a script published called "faxstat.pl" for
exactly this use. I enclose it below. For additional questions, ask
the list and feel free to CC: me.
#!/usr/local/bin/perl -wT
=head1 NAME
faxstat.pl - CGI interface to interrogating HylaFAX server
=head1 SYNOPSIS
http://www/cgi-bin/faxstat.pl
http://www/cgi-bin/faxstat.pl?FAXSERVER=localhostname.net
http://www/cgi-bin/faxstat.pl?j=2000
http://www/cgi-bin/faxstat.pl?ps=docq%2Fdoc17777.ps
http://www/cgi-bin/faxstat.pl?fax=recvq%2Ffax00009.fax
http://www/cgi-bin/faxstat.pl?d=2000
=head1 DESCRIPTION
C<faxstat.pl> implements a web interface to querying a HylaFAX server,
in a manner similar to L<faxstat(1)>.
With no HTTP parameters, an HTML page is generated listing faxes in the
sendq (queued, not yet sent), the doneq (queued and sent), and the
recvq (faxes received).
With a C<j=nnnn> parameter, an HTML page is generated containing all the
job info for job nnnn.
With a C<ps=xxx> parameter, the script attempts to access the document named xxx
and serve it as content type application/postscript
With a C<fax=xxx> parameter, the script attempts to access the document named xxx
and serve is as content type image/fax
With a C<d=nnnn> parameter, the script attempts to delete the pending (or
completed) job nnnn.
=head2 Other HTTP parameters
=over 4
=item FAXSERVER
FAXSERVER may be used with any of the above to nominate the host which
the script should attempt to query. In practice it might be easier to
edit the code.
=item debug
The value of the C<debug> parameter will be passed to the C<debug>
method of the C<Net::FTP> object used internally. Note that debugging
is to STDERR so will probably appear in your server log
=back
=head1 BUGS
There is no way to contact the HylaFAX server as a particular
(authenticated) user, other than by relying on the www server to do
authentication and to require no passwords on the hylafax server.
That sucks.
Doesn't read the system hyla.conf file for FAXSERVER
=head1 AUTHOR
Phil Abercrombie <phil@mcs.vuw.ac.nz>, September 1997
=cut
#';# emacs
# <PJA> 19-Sep-1997
# Added POD
use CGI;
use Config;
use Net::FTP;
my $cgi = new CGI;
$FAXSERVER = $cgi->param("FAXSERVER")||"localhostname.com";
$HYLAFAX = 4559;
eval{&main};
if ($@)
{
my $a=$@;
print CGI->header,CGI->start_html("Error"), "<P>", join ("<BR>", split "\n", "$a"), CGI->end_html;
die $a
}
sub main
{
my $hfax = new Net::FTP $FAXSERVER, Port=>$HYLAFAX
or die "Can't connect to host $FAXSERVER";
$hfax->debug($cgi->param("debug"));
$hfax->login(CGI->remote_user)
or die "Can't login to host $FAXSERVER";
$hfax->binary;
if ($cgi->param("ps"))
{
&psinfo($hfax, $cgi->param("ps"))
}
elsif ($cgi->param("tiff"))
{
&tiffinfo($hfax, $cgi->param("tiff"))
}
elsif ($cgi->param("d"))
{
&killjob($hfax, $cgi->param("d"))
}
elsif ($cgi->param("j"))
{
&jobinfo($hfax, $cgi->param("j"))
}
else
{
&faxstat($hfax)
}
}
sub list ($@)
{
my $hfax = shift;
my $cx = $hfax->list(@_) || die $hfax->message;
my @results;
# <PJA> 19-Sep-1997
# handle continuation lines correctly
while(<$cx>)
{
if($results[$#results]=~ /\\\n$/)
{
$results[$#results].=$_;
}
else
{
push(@results,$_);
}
}
$cx->close;
@results;
}
sub list_jobs($@)
{
my $hfax = shift;
map do { my %d; @d{"a".."z","A".."Z"}=split /$;/; \%d }, list $hfax, @_;
}
sub faxstat
{
my $hfax = shift;
my $jobfmt = join "$;", map "%$_", "a".."z", "A".."Z";
print CGI->header;
print CGI->start_html("Fax System Status");
print "<H1>Fax System Status</H1>\n";
my @status = map [split(/:/)], list $hfax, "status";
$hfax->quot("JOBFMT","\"$jobfmt\"") or die $hfax->message;
my @send = list_jobs $hfax, "sendq";
$hfax->quot("JOBFMT","\"$jobfmt\"");
die $hfax->message unless $hfax->ok;
my @done = list_jobs $hfax, "doneq";
$hfax->quot("RCVFMT","\"$jobfmt\"");
die $hfax->message unless $hfax->ok;
my @recv = list_jobs $hfax, "recvq";
print "<H2>Status</H2><TABLE BORDER>\n";
for(@status)
{
for($_->[1])
{
if (/job (\d+)/)
{
$cgi->param(j=>$1);
my $surl = $cgi->self_url;
s!job (\d+)!job <A href="$surl">$1</a>!g;
$cgi->delete("j");
}
}
print "<TR>", map( "<TD>$_</TD>", @$_), "</TR>\n";
}
print "</TABLE>\n";
&show_outq( "Jobs in Send Queue", @send );
&show_outq( "Jobs in Done Queue", @done );
&show_inq( "Jobs in Receive Queue", @recv );
print CGI->end_html;
}
sub show_outq
{
my $title = shift;
my @jobs = @_;
if (@jobs)
{
print qq{<H2>$title</H2>\n<TABLE BORDER>\n};
print "<TR>",map "<TH>$_</TH>",
"Job", "Sender", "To","Dials","Pages","Status";
print "</TR>\n";
for(@jobs)
{
my $k;
for $k (keys %$_){$_->{$k} ||= " "};
$_->{"e"} =~ s/^\+644/+64 4 /;
$_->{"s"} =~ s/ / /g;
$cgi->param(j=>$_->{j});
my $self = $cgi->self_url;
print <<JOB;
<TR>
<TD><A HREF="$self">$_->{j}</a></TD>
<TD><A HREF="mailto:$_->{M}">$_->{M}</a></TD>
<TD><TT>$_->{e}</TT></TD>
<TD>$_->{D}</TD>
<TD>$_->{P}</TD>
<TD>$_->{"s"}</TD>
</TR>
JOB
;
}
print "</TABLE>\n";
}
}
sub show_inq
{
my $title = shift;
my @jobs = @_;
my $self = $cgi->self_url;
if (@jobs)
{
print qq{<H2>$title</H2>\n<TABLE BORDER>\n};
print "<TR>",map "<TH>$_</TH>",
"Filename", "Sender/TSI", "Pages","Received@";
print "</TR>\n";
for(@jobs)
{
$cgi->param(tiff=>"recvq/$_->{f}");
my $myself = $cgi->self_url;
print <<JOB;
<TR>
<TD><A HREF="$myself">$_->{f}</a></TD>
<TD><TT>$_->{"s"}</TT></TD>
<TD>$_->{p}$_->{z}</TD>
<TD>$_->{t}</TD>
</TR>
JOB
;
}
print "</TABLE>\n";
}
}
sub jobinfo
{
my $hfax = shift;
my $job = shift;
my $cx;
my $self = CGI->script_name;
print CGI->header;
print CGI->start_html("Fax Job Info");
print "<H1>Job Info for job $job</H1>\n";
$cx = $hfax->retr( "sendq/q$job" ) || $hfax->retr( "doneq/q$job" ) || die $hfax->message;
my @job;
while(<$cx>)
{
if(@job && $job[$#job] =~ s/\\$/<BR>/)
{
$job[$#job] .= $_;
}
else
{
push(@job,$_);
}
}
die "No job info available" unless @job;
$cx->close or die "Data connection error";
$cgi->param(d=>$job);
my $myself=$cgi->self_url;
print qq{<A HREF="$myself">Delete Me</A>\n};
$cgi->delete('d');
print "<TABLE BORDER>\n";
for (@job)
{
chomp;
$cgi->delete("ps","tiff");
my ($key,$val)=split(/:/,$_,2);
$val = localtime($val) if $key eq 'tts' || $key =~ /time$/;
if ($key =~ /postscript|tiff|fax/)
{
my $param = ($& eq "postscript")?"ps":"tiff";
my ($ref) = ($val =~ m!(docq/\S+)!);
$cgi->param($param,$ref);
my $myself = $cgi->self_url;
$val =~ s!docq/\S+!<a href="$myself">$&</a>!;
}
print "<TR><TD>$key</TD><TD>$val</TD></TR>\n";
}
print "</TABLE>\n";
print CGI->end_html;
}
sub psinfo
{
my $hfax = shift;
my $psfile = shift;
$cx = $hfax->retr( $psfile ) || die $hfax->message;
my @job=<$cx>;
$cx->close or die "Data connection error";
print CGI->header( "application/postscript" );
print @job;
}
sub tiffinfo
{
my $hfax = shift;
my $tiff = shift;
$cx = $hfax->retr( $tiff ) || die $hfax->message;
my @job=<$cx>;
$cx->close or die "Data connection error";
print CGI->header( "image/fax" );
print @job;
}
sub killjob
{
my $hfax = shift;
my $job = shift;
$hfax->quot( "JSUSP", $job );
my ($mess,$ok)=($hfax->message, $hfax->ok);
$hfax->quot( "JDELE", $job );
die "$mess\n".$hfax->message unless $hfax->ok;
print CGI->redirect( $cgi->self_url );
}
-----BEGIN PGP SIGNATURE-----
Version: 2.6.2
iQCVAwUBNE4kUT/+ItycgIJRAQGoygQAl2bkHLmUV4dBO+acXprYaQO98NUvW99D
aLzIDQ55df30EUnlUlty8tiplh5QY86KLN97xAsvVk+LupAsqc8hKjWBwYdbgNkp
uj5y/Qsp1a6flWcxOtzOXhAE6lyEH0/uiIVYLSOk/mlRQCVfqU+5JYtez2B3MJEY
By/mqq+tLtk=
=cHVV
-----END PGP SIGNATURE-----