envvars.pl

#!/usr/bin/perl

# envvars.pl
# ==========
# (c) Copyright Paul Griffiths 2007
#
# CGI script outputting various environment
# variables.

$templatefile = "template.html";
$title        = "Environment Variables Output";
$heading      = "Environment Variables Output";

# Assign <NONE> to empty environment variables and replace
# HTML special characters with their appropriate character
# entity references.

foreach $var ( keys %ENV ) {
  if ( $ENV{$var} eq "" ) {
    $ENV{$var} = "&lt;NONE&gt;";
  }
  else {
    $ENV{$var} =~ s/</&lt;/g;
    $ENV{$var} =~ s/>/&gt;/g;
    $ENV{$var} =~ s/&/&amp;/g;
    $ENV{$var} =~ s/"/&quot;/g;
  }    
}


# Table of selected environment variables

$mainmatter .= "<h2>Selected Environment Variables</h2>\n\n";
$mainmatter .= "<table style=\"border: 1px solid #000000; border-collapse: collapse; text-align: left;\">\n";
$mainmatter .= "  <tr><th scope=\"row\" style=\"border: 1px solid #000000; padding: 0.5em;\">SCRIPT_NAME</th><td style=\"border: 1px solid #000000; padding: 0.5em;\">$ENV{'SCRIPT_NAME'}</td></tr>\n" if defined $ENV{'SCRIPT_NAME'};
$mainmatter .= "  <tr><th scope=\"row\" style=\"border: 1px solid #000000; padding: 0.5em;\">SERVER_NAME</th><td style=\"border: 1px solid #000000; padding: 0.5em;\">$ENV{'SERVER_NAME'}</td></tr>\n" if defined $ENV{'SERVER_NAME'};
$mainmatter .= "  <tr><th scope=\"row\" style=\"border: 1px solid #000000; padding: 0.5em;\">REQUEST_METHOD</th><td style=\"border: 1px solid #000000; padding: 0.5em;\">$ENV{'REQUEST_METHOD'}</td></tr>\n" if defined $ENV{'REQUEST_METHOD'};
$mainmatter .= "  <tr><th scope=\"row\" style=\"border: 1px solid #000000; padding: 0.5em;\">CONTENT_LENGTH</th><td style=\"border: 1px solid #000000; padding: 0.5em;\">$ENV{'CONTENT_LENGTH'}</td></tr>\n" if defined $ENV{'CONTENT_LENGTH'};
$mainmatter .= "  <tr><th scope=\"row\" style=\"border: 1px solid #000000; padding: 0.5em;\">QUERY_STRING</th><td style=\"border: 1px solid #000000; padding: 0.5em;\">$ENV{'QUERY_STRING'}</td></tr>\n" if defined $ENV{'QUERY_STRING'};
$mainmatter .= "  <tr><th scope=\"row\" style=\"border: 1px solid #000000; padding: 0.5em;\">REMOTE_PORT</th><td style=\"border: 1px solid #000000; padding: 0.5em;\">$ENV{'REMOTE_PORT'}</td></tr>\n" if defined $ENV{'REMOTE_PORT'};
$mainmatter .= "  <tr><th scope=\"row\" style=\"border: 1px solid #000000; padding: 0.5em;\">HTTP_USER_AGENT</th><td style=\"border: 1px solid #000000; padding: 0.5em;\">$ENV{'HTTP_USER_AGENT'}</td></tr>\n" if defined $ENV{'HTTP_USER_AGENT'};
$mainmatter .= "  <tr><th scope=\"row\" style=\"border: 1px solid #000000; padding: 0.5em;\">SERVER_PORT</th><td style=\"border: 1px solid #000000; padding: 0.5em;\">$ENV{'SERVER_PORT'}</td></tr>\n" if defined $ENV{'SERVER_PORT'};
$mainmatter .= "  <tr><th scope=\"row\" style=\"border: 1px solid #000000; padding: 0.5em;\">REMOTE_ADDR</th><td style=\"border: 1px solid #000000; padding: 0.5em;\">$ENV{'REMOTE_ADDR'}</td></tr>\n" if defined $ENV{'REMOTE_ADDR'};
$mainmatter .= "  <tr><th scope=\"row\" style=\"border: 1px solid #000000; padding: 0.5em;\">SERVER_PROTOCOL</th><td style=\"border: 1px solid #000000; padding: 0.5em;\">$ENV{'SERVER_PROTOCOL'}</td></tr>\n" if defined $ENV{'SERVER_PROTOCOL'};
$mainmatter .= "  <tr><th scope=\"row\" style=\"border: 1px solid #000000; padding: 0.5em;\">REQUEST_URI</th><td style=\"border: 1px solid #000000; padding: 0.5em;\">$ENV{'REQUEST_URI'}</td></tr>\n" if defined $ENV{'REQUEST_URI'};
$mainmatter .= "  <tr><th scope=\"row\" style=\"border: 1px solid #000000; padding: 0.5em;\">GATEWAY_INTERFACE</th><td style=\"border: 1px solid #000000; padding: 0.5em;\">$ENV{'GATEWAY_INTERFACE'}</td></tr>\n" if defined $ENV{'GATEWAY_INTERFACE'};
$mainmatter .= "  <tr><th scope=\"row\" style=\"border: 1px solid #000000; padding: 0.5em;\">SERVER_ADDR</th><td style=\"border: 1px solid #000000; padding: 0.5em;\">$ENV{'SERVER_ADDR'}</td></tr>\n" if defined $ENV{'SERVER_ADDR'};
$mainmatter .= "  <tr><th scope=\"row\" style=\"border: 1px solid #000000; padding: 0.5em;\">HTTP_REFERER</th><td style=\"border: 1px solid #000000; padding: 0.5em;\">$ENV{'HTTP_REFERER'}</td></tr>\n" if defined $ENV{'HTTP_REFERER'};
$mainmatter .= "</table>\n\n";


# Further examples of usage

$mainmatter .= "<h2>Further Example of Usage</h2>\n\n";
$mainmatter .= "<p>Your IP address is $ENV{'REMOTE_ADDR'} and your user agent has identified itself as &quot;$ENV{'HTTP_USER_AGENT'}&quot;.</p>\n\n";
$mainmatter .= "<p>The IP address of the server at <a href=\"http://$ENV{'SERVER_NAME'}/\">http://$ENV{'SERVER_NAME'}/</a> is $ENV{'SERVER_ADDR'} and it is listening on port $ENV{'SERVER_PORT'}. You are communicating from port $ENV{'REMOTE_PORT'}.</p>\n\n";
$mainmatter .= "<p>The URI of this script (excluding any query string) is <a href=\"http://$ENV{'SERVER_NAME'}$ENV{'SCRIPT_NAME'}\">http://$ENV{'SERVER_NAME'}$ENV{'SCRIPT_NAME'}</a>.</p>\n\n";
$mainmatter .= "<p>You accessed this script from <a href=\"$ENV{'HTTP_REFERER'}\">$ENV{'HTTP_REFERER'}</a>.</p>\n\n" if defined $ENV{'HTTP_REFERER'};


# Table of all environment variables. This is commented out by
# default, since it is a bad security practice to expose all of
# your server's environment variables to all and sundry. Uncomment
# this section at your own risk to run it on your own server.

# $mainmatter .= "<h2>All Environment Variables</h2>\n\n";
# $mainmatter .= "<table style=\"border: 1px solid #000000; border-collapse: collapse; text-align: left;\">\n";
# foreach $var ( keys %ENV ) {
#   $mainmatter .= "  <tr><th scope=\"row\" style=\"border: 1px solid #000000; padding: 0.5em;\">$var</th><td style=\"border: 1px solid #000000; padding: 0.5em;\">$ENV{$var}</td></tr>\n";
# }
# $mainmatter .= "</table>\n\n";


# Output and explicitly exit

&printHTMLOutputFromTemplate($templatefile, $title, $heading, $mainmatter);

exit 0;


# printHTMLOutputFromTemplate subroutine
#
# Parameters:
#   $_[0] - name of template file
#   $_[1] - title of document (replaces the string <??TITLE??> in the template file
#   $_[2] - main heading of document (replaces the string <??HEADING??> in the template file
#   $_[3] - main matter of document (replaces the string <??MAINMATTER??> in the template file

sub printHTMLOutputFromTemplate {
  die "Not enough parameters specified!\n" unless @_ == 4;
  local($templatefile, $title, $heading, $mainmatter) = @_;  
  open(TEMPLATEFILE, $templatefile) or die "Can't open $templatefile!\n";
  print "Content-Type: text/html\n\n";

  # loop until we reach <??MAINMATTER??> or until end of file

  while ( $templateline = <TEMPLATEFILE> and not $templateline =~ /<\?\?MAINMATTER\?\?>/ ) {
    $templateline =~ s/<\?\?TITLE\?\?>/$title/g;
    $templateline =~ s/<\?\?HEADING\?\?>/$heading/g;
    print "$templateline";
  }
  
  # print main matter and rest of template unless at end of file

  if ( $templateline ) {
    print "$mainmatter";

    while ( $templateline = <TEMPLATEFILE> ) {
      print "$templateline";
    }
  }
  
  close(TEMPLATEFILE);
}