...making Linux just a little more fun! | Viewing Faxes on the Web By Mark Nielsen

1. Introduction
2. Setting up Apache 2.0
3. Suggestions for you
4. Conclusion
5. References

### Introduction

The purpose of this article is to describe a simple Perl script I use to manage faxes on my fax server over the web. The method I use is very crude and is only used by myself and one other person in the company I work for, but it works for me. With very little effort, it would be very easy to setup professional scripts to handle faxes from small to very large corporations. I also believe it would be very easy to setup a web interface for other fax systems (if they don't already have it). Personally, I would much rather send and receive faxes over a webpage because then I can access the system (and the faxes) from anywhere in the world.

For my setup, I was using efax, which is not that easy to get along with. For any sane person, I recommend HylaFax or some other alternative (mgetty has some hope).

Please read my other efax article at Linux Focus.

### Configuring Apache 2.0

First, look at how I compiled and then configured Apache 2.0. This is just one installation I did, out of many. No, Php is not running on my webserver even though the config file says I am.

I have a directory, /usr/local/apache2/htdocs/fax, where I put in my Perl script and .htaccess files.

Underneath this directory, I have these directories:

- home -- my faxes go here
- ab -- where other Audioboomerang faxes go.
- source -- where we have the original faxes at.
- display -- the list of faxes yet to be viewed/archived.
- archives -- where the ps and pdf files are archived.

I put a .htaccess in these directories to limit access by people. An example .htaccess is

    AuthName Test
    AuthType Basic
    AuthUserFile /usr/local/apache2/passwords/Passwords

    order deny,allow
    require user mark ted

You can change/add passwords with htpasswd.

Next, the last thing is to create a perl script. Here is my very crude Perl script. If I ever do anything else with it, I will convert it to a Python script first as Python is the next wave for programming (I hope). Python, Zope, Apache, Linux, and PostgreSQL are the top choices for my programming environment. Save it as "fax.pl" and perform a "chmod 755 fax.pl" after saving it.

You can download it or just view it below.

    #!/usr/bin/perl

    use CGI;

    print "Content-type: text/html\n\n\n";

    my $Home = "/usr/local/apache2/htdocs/fax";
    my $Source = "$Home/source";
    my $Archives = "$Home/archives";
    my $AB_Archives = "$Home/ab";
    my $Display = "$Home/display";
    my $Home_Archives = "$Home/home";

    `mkdir -p $Source`;
    `mkdir -p $Archives`;
    `mkdir -p $Display`;
    `rsync -av /var/spool/fax/incoming/fax* $Source`;
    `mkdir -p $AB_Archives`;

    #------------------------------------
    my @Files = <$Source/fax*>;
    foreach my $File (@Files)
      {
    #  print "$File\n";
      my (@Temp) = split(/\//, $File);
      my $File_Name = pop @Temp;
      if (!(-e "$Archives/$File_Name\.pdf"))
        {
        print "<br>Processing new fax: $File\n";
        my $Command = "tiff2ps $File > $Archives/$File_Name\.ps";
    #    print "$Command\n";
        `$Command`;
        my $Command = "/usr/bin/ps2pdf $Archives/$File_Name\.ps $Archives/$File_Name\.pdf";
    #    print "$Command\n";
        `$Command`;
        `cp $Archives/$File_Name\.pdf $Display/$File_Name\.pdf`;

        }
      }

    #---------------------------------------
    my $query = new CGI;
    my $Action = $query->param('action');
    my $File = $query->param('file');
    $File =~ s/[^a-zA-Z0-9\_\.]//g;

    if (!(-e "$Display/$File")) {}
    elsif ($Action eq "archive")
      {
      print "<br>Archiving $File\n";
      `rm -f $Display/$File`;
      }
    elsif ($Action eq "archive2")
      {
      print "<br>Archiving $File\n";
      `cp $Display/$File $AB_Archives/`;
      `rm -f $Display/$File`;
      }
    elsif ($Action eq "archive_home")
      {
      print "<br>Archiving $File\n";
      `cp $Display/$File $Home_Archives/`;
      `rm -f $Display/$File`;
      }

    print qq(<hr><a href="archives/">Archives</a> -- might be password protected.
    <br><a href="home/">Home Archives</a> -- might be password protected.
    <br><a href="ab/">Audioboomerang Archives</a>\n);

    my $Table_Entries = "";
    my @Files = <$Display/fax*>;
    foreach my $File (sort @Files)
      {
      my (@Temp) = split(/\//, $File);
      my $File_Name = pop @Temp;
      my $Link = "<a href='display/$File_Name'>$File_Name</a>";
      my $Delete = "<a href='fax.pl?action=archive&file=$File_Name'>archive file</a>";
      my $AB ="<a href='fax.pl?action=archive2&file=$File_Name'>archive to AB</a>";
      my $Home ="<a href='fax.pl?action=archive_home&file=$File_Name'>archive for Home</a>";

      $Table_Entries .= qq(<tr><td>$Link</td><td>$Delete</td><td>$Home</td><td>$AB</td></tr>\n);
      }

    print "<table border=1><tr><th>View Fax</th><th>Archive the Fax</th>
    <th>Archive to AudioBoomerang</th></tr>\n";
    print $Table_Entries;
    print "</table>\n";

    if (@Files < 1) {print "<h1> No faxes or they are all archived.</h1>\n";}

### Suggestions for you.

1. I normally write in Python 2.2 these days, as this should be rewritten in. I just happened to use Perl because I was testing mod_perl and Apache 2.0.
2. Write a Python script to let people upload PostScript, images, or other file formats that Linux can convert to tiff to send out as faxes. In addition, the Python script should receive the telephone number, cover letter, etc. to make the system flexible.
3. Create a Python/TK or wxPython script which acts as a client program to send and recieve faxes from your Apache 2.0 server. The trick here is that people might have to create a postscript file first to upload faxes or better yet, figure out some way to directly print to the Python Script.
4. When you have a multiple page fax, have the Perl/Python script on the webserver detect and order the pages and merge them into one ps file with psmerge or other tool.
5. Faxes can be pretty sensitive so use the secure service in Apache 2.0 for viewing or sending your faxes.

### Conclusion

I think it is pretty cool, and my boss thinks it is pretty cool. I am going to switch to a different fax service because efax is hard to deal with when sending faxes. My next goal is to make it so I can send faxes through a webpage. I will have to set it up so that you first print your document to a postscript file and then upload it (or upload a graphic image or something else that Linux can convert usign a standard tool).

I am not sure what other fax setups utilize the web, but from my perspective, I always want to have access to my faxes over the web or to send a fax over the web.

### References

1. If this article changes, it will be available here http://www.tcu-inc.com/Articles/31/nielsen.html

Copyright © 2002, Mark Nielsen. Copying license http://www.linuxgazette.com/copying.html
Published in Issue 85 of Linux Gazette, December 2002