Script not able to work on Server 2003

J

Joe

I have PERL scripst that I created on a Windows 2000 Server, that work
great. We switched to a Windows 2003 Server, PERL is installed, but my
script that works on 2000, will not work with the 2003 server. I keep
getting the following error on all my scripts:

"Content-type: text/html

'C:\Inetpub\wwwroot\cgi-bin\Employee_Status\employee_status.cgi'
script produced no output"

Plus, I have tried changing the extension to cgi, and I get the same
error.

Does anyone have any suggestions for me? I'm almost positive it is
something simple, but I am just not seeing it.
 
T

Tad McClellan

Joe said:
I have PERL scripst that I created on a Windows 2000 Server, that work
great. We switched to a Windows 2003 Server, PERL is installed, but my
script that works on 2000, will not work with the 2003 server. I keep
getting the following error on all my scripts:

"Content-type: text/html

'C:\Inetpub\wwwroot\cgi-bin\Employee_Status\employee_status.cgi'
script produced no output"

Plus, I have tried changing the extension to cgi, and I get the same
error.

Does anyone have any suggestions for me? I'm almost positive it is
something simple, but I am just not seeing it.


I'm almost positive it has nothing to do with Perl.

It likely has to do with web server configuration.

Ask in a newsgroup about web servers.
 
J

Joe

Good suggestion, but the one thing I forgot to mention is, another
person wrote scripts a few years ago, and those, basically work out of
the box. His and mine are somewhat identical, but his work and mine
don't.

I have check for differences in coding style, and some we are fairly
close and other note. The big difference from his and mine are that
most of his are links in .asp pages, mine are just straight links.

Possibly it has something to do with the way IIS is calling it. Most
of my scripts do not have much to do with IIS. I'm sorry I'm rabling,
I just been looking at this all weekend.
 
R

Ron Bergin

Good suggestion, but the one thing I forgot to mention is, another
person wrote scripts a few years ago, and those, basically work

Without seeing you coder and knowing how your web server is
configured, it's anyones guess as to the problem/solution.
His and mine are somewhat identical, but his work ....
^^^^^^^^^^^^^^^^^^
That's probably the key. What's the difference between yours and his?
I have check for differences in coding style, and some we are fairly
close and other note. The big difference from his and mine are that
most of his are links in .asp pages, mine are just straight links.

Show us your code. Style is just style, what it's doing is most
important. We may not be able to troubleshoot the asp side, but if we
see your Perl code, we may be able to find the problem/solution.
Possibly it has something to do with the way IIS is calling it.
That may be the case, and if so, we'll probably direct you to posting
in an IIS forum, but without seeing your code, it's impossible to say.
 
J

Joe

Here is my code, I picked one of my shorter scripts:

<code>#!/usr/bin/perl -w

# Joe Ruffino Daily WebOpac.pl
# This program will read in a text file, and print it out
# in table format
# Written: January 30, 2004
# Revised: December 09, 2004, Jan 03, 2005

use CGI qw:)standard :html3);
use CGI::Carp qw(fatalsToBrowser);
use strict;


##########################################################################
# Set Variables
#

my $ip_hold = 0;
my $sec;
my $min;
my $hour;
my $day;
my $month;
my $year;
my $ip_list;
my $monthfind;
my $monthm;
my $countip;

my $stationip;
my $stationname;

my @stationip;
my @stationname;

my $dayopac;
my $daym;
my $dayopacm;
my $dayfind;
my $headerpage;
my $dayflag;
my $namev;
my $one;
my $two;
my $three;
my $monthcurr;
my $monthnow;
my $countin;
my $countout;
my $ip;
my $date;
my $time;
my $firstp;
my $secondp;
my $thirdp;
my $fourthp;
my $firstip;
my @firstip;
my $sn;
my $count;
my $date_month;
my $date_day;
my $date_year;
my $i;
my $ips;
my @Names;
my %Names;
my $ext_ip;
my %seen;
my $countint;
my $totalcnt;
my $totalline;
my $station_name;
my @opacline;
my %count;
my @staionip;
my $line;
my $opac_month;
my $hold_date;
my $date_cnt;
my $ip_day_cnt;
my $day_array;
my $ip_day_cnt;
my $four;
my @ext_line;
my %day_array;
my %letters;
my $tot_ip_cnt;
my $ip_cnt;
my $four;

##########################################################################
# Subroutine for finding the text month when numerical month is given
#
sub dayfind {

#Setup date field
if ($dayopacm eq "01") {
$dayfind = "January"; }

if ($dayopacm eq "02") {
$dayfind = "February"; }

if ($dayopacm eq "03") {
$dayfind = "March"; }

if ($dayopacm eq "04") {
$dayfind = "April"; }

if ($dayopacm eq "05") {
$dayfind = "May"; }

if ($dayopacm eq "06") {
$dayfind = "June"; }

if ($dayopacm eq "07") {
$dayfind = "July"; }

if ($dayopacm eq "08") {
$dayfind = "August"; }

if ($dayopacm eq "09") {
$dayfind = "September"; }

if ($dayopacm eq "10") {
$dayfind = "October"; }

if ($dayopacm eq "11") {
$dayfind = "November"; }

if ($dayopacm eq "12") {
$dayfind = "December"; }
return $dayfind;
}

##########################################################################
# Subroutine for finding the numerical month when text month is given
#
sub monthfind {

#Setup date field
if ($monthm eq "Jan") {
$monthfind = "01"; }

if ($monthm eq "Feb") {
$monthfind = "02"; }

if ($monthm eq "Mar") {
$monthfind = "03"; }

if ($monthm eq "Apr") {
$monthfind = "04"; }

if ($monthm eq "May") {
$monthfind = "05"; }

if ($monthm eq "Jun") {
$monthfind = "06"; }

if ($monthm eq "Jul") {
$monthfind = "07"; }

if ($monthm eq "Aug") {
$monthfind = "08"; }

if ($monthm eq "Sep") {
$monthfind = "09"; }

if ($monthm eq "Oct") {
$monthfind = "10"; }

if ($monthm eq "Nov") {
$monthfind = "11"; }

if ($monthm eq "Dec") {
$monthfind = "12"; }
return $monthfind;
}

##########################################################################
# Find current Time and Date info
#
($sec,$min,$hour,$day,$month,$year) = localtime(time);
$year = $year +1900;

# ignore used for testing
$ip_list = "OpacIP";
# ignore used for testing

##########################################################################
# Open IP file and test data file
# Then split IP file into IP address and Station Name array's
#
open (LISTIN,"ipnew.txt") || die "Cannot Open File ipadd.txt for
reading: $!";

while (<LISTIN>) {
($staionip[$countip], $stationname[$countip]) = split(/\s+/);
$countip++;
}

$stationip = @stationip;
$stationname = $stationname;

close (LISTIN);


##########################################################################
# If a file name has been given, process the file
#

$line = 0;
if (param()) {

# Set filename entered to a variable
my $dayopac = param("dayopac");

# Split file name into month and day by assuming a dash is there
($dayopacm, $daym) = split(/-/, $dayopac);
if ($daym) { # if there is a 2-digit day
$dayflag = "yes";

# find the text month by sending the 2-digit month
$monthfind = dayfind($dayopacm);
if ($monthfind eq "December") {
#$year = $year -1;
}
$headerpage = "Daily Stats for " . $monthfind . " " . $daym . ",
" . $year;
} else {

# if not a day to be procressed, check to see if it is a month
to
# be processed
$dayflag = "no";
$daym = "01";

# Split file name into process name and month by assuming an
# underscore is there
($namev, $monthm) = split(/_/, $dayopac);

# find the 2-digit month by sending the text month
$monthcurr = monthfind($monthm);

# if current month is equal to the month entered
if ($month eq $monthcurr) { # if it is 1 - 9
if ($month > 9) {
$dayopacm = $month; # set current month to month holder
} else {
# set current month to month holder and append a '0
$dayopacm = "0" . $month;
}
} else {
# if not equal set month entered to month holder
$dayopacm = $monthcurr;
}
# Go to subroutine to find the FULL text month
$monthnow = dayfind($dayopacm);
if ($monthnow eq "December") {
$year--;
}
($one, $two, $three, $four) = split(/\\/, $dayopac);

# Set title for HTML Output page using text month that was found
$headerpage = "Monthly Stats for $monthnow $year";
}

$ip_list .= "_" . $monthm .".txt";
open (OPAC_IP, ">$ip_list") || die "$ip_list open failed: $!";

$opac_month = $dayopac . "_" . $year . ".html";
open (OPAC_WEB, ">$opac_month") || die "$ip_list open failed: $!";

# Append .txt to filename given, and open file for reading
$dayopac .= ".txt";
open (OPAC,$dayopac) || die ($dayopac . " open failed: $!");

# Print title on new HTML page and first line
print OPAC_WEB <<END;
<HTML><HEAD>
<META name="description" content="GBPL Titles with Holds">
<META name="robots" content="nofollow">
<TITLE>WebOpac $headerpage</TITLE>
</HEAD>
<CENTER>
<H1>$headerpage</H1>
END

($ip,$date,$time,$sn) = split(/ +/);
$hold_date = $dayopacm . "-" . $daym . "-" . substr(($year - 1900),
1,2);

$countin = 0; # zero out counter for ip numbers used in an
array
$date_cnt = 0;
$ip_day_cnt = 0;

while (<OPAC>) {
chomp;
$countout++; # count number of records processed

($ip,$date,$time,$sn) = split(/ +/);

# If IP is internal, process
if ($ip =~ /192.168.33/) {

# Split IP in to 4 parts using a period
($firstp,$secondp,$thirdp,$fourthp) = split(/\./, $ip);

# If IP is between 1 and 9, append 00 to it
if ($fourthp > 0 && $fourthp < 10) {
$fourthp = "00" . $fourthp;
} else {

# If IP is between 10 and 99, append 0 to it
if ($fourthp > 9 && $fourthp < 100) {
$fourthp = "0" . $fourthp;
}
}
# Assign IP to an array element
$firstip[$countin] = $fourthp;

# Add 1 to array counter
$countin++;
} else {
if ($date ne $hold_date) {
foreach $ip (sort keys %day_array) {
$ip_day_cnt++;
}
$tot_ip_cnt += $ip_day_cnt;
$ext_line[$line] = "<b><i>" . $hold_date . "</b></i> has <b><i>" .
$ip_day_cnt . "</b></i> unique External IPs.<p>";
$date_cnt = 0;
$ip_day_cnt = 0;
%day_array = " ";
$line++;
}
$ext_ip++;
$letters{$ip} = 1;
$day_array{$ip} = 1;
$date_cnt++;
}
$hold_date = $date;
}

foreach $ip (sort keys %day_array) {
$ip_day_cnt++;
}
$tot_ip_cnt += $ip_day_cnt;
$ext_line[$line] = "<b><i>" . $hold_date . "</b></i> has <b><i>" .
$ip_day_cnt . "</b></i> unique External IPs.<p>";

# print OPAC_IP @Names;
close (OPAC_IP);

foreach $ip (sort keys %letters) {
$ip_cnt++;
}

#print "<p>$ip_cnt";
# Set length of array to variable
$countint = @firstip;

# Tally distinctive ips
foreach $ips(@firstip) {
$count{$ips}++;
}

foreach $ips(sort(keys %count)) {
for ($i = 0; $i <= $countip; $i++) {
if ($ips == $staionip[$i]) {
$opacline[$totalcnt] = "The Station <b><i>".$stationname[$i]."</i></
b> with IP <b><i>".$ips. "</i></b> has visited Opac <b><i>".
$count{$ips}."</i></b> times.\n";
$totalcnt++;
if ( $count{$ips} > $ip_hold) {
$ip_hold = $count{$ips};
$station_name = $i;
}
}

}
}
close(OPAC);

if ($countint == 0) { $totalcnt = 0;}

if ($dayflag eq "yes") {
$totalline = "There are <b><i> " . $totalcnt . "</i></b> total
patron stations used for <b><i>" . $monthfind . " " . $daym . "</i></
b>.";
} else {
$totalline = "There are <b><i> " . $totalcnt . "</i></b> total
patron stations used for the Month of <b><i>" . $monthnow . "</i></
b>.";
}
print OPAC_WEB hr();
print OPAC_WEB p("There are <b><i>" . $countint . "</i></b>
internal IP address hits.");
print OPAC_WEB p("There are <b><i>" . $ext_ip . "</i></b> external
IP address hits.");
# print p("There are <b><i>" . ($countout-$countin) . "</i></b>
external IP address hits.");
print OPAC_WEB p("There are <b><i>" . $countout . "</i></b> total
IP address hits.");
print OPAC_WEB p($totalline);
print OPAC_WEB p("The Station <b><i>".
$stationname[$station_name]."</i></b> has the greatest number of hits
of <b><i>".$ip_hold."</i></b> times.");
print OPAC_WEB p("There are <b><i>" . $tot_ip_cnt . "</i></b> Total
unique External IP hits for All Days in <b><i>$monthnow</i></b>.");
print OPAC_WEB p("There are <b><i>" . $ip_cnt . "</i></b> unique
External IP hits for the Month of <b><i>$monthnow</i></b>.");
print OPAC_WEB "<FONT SIZE=\"4\" COLOR=\"#FFFFFF\">";
print OPAC_WEB "<A NAME=\"int\">Internal<\/A><\/font>";
print OPAC_WEB "<A HREF=\"\#ext\">External Hits<\/a> ";
print OPAC_WEB hr();

for ($i = 0; $i <= $totalcnt; $i++) {
print OPAC_WEB p($opacline[$i]);
}
print OPAC_WEB hr();
print OPAC_WEB "<FONT SIZE=\"4\" COLOR=\"#FFFFFF\">";
print OPAC_WEB "<A NAME=\"ext\">External<\/A><\/font>";
print OPAC_WEB "<A HREF=\"\#int\">Internal Hits<\/a>";
print OPAC_WEB p(@ext_line);
print OPAC_WEB hr();
print OPAC_WEB "</center>";

use CGI; print redirect("$opac_month");
} else {

##########################################################################
# If a file name has not been given, process the file, create webpage
to
# ask for it
#
print header, start_html("Monthly WebOpac"), h1("Monthly WebOpac
Report");

print hr();
print start_form();
print p("Day File: ",textfield("dayopac"), "<b> * form should be
WebOpac_(<i>3-letter Month</i></b>)");
# print p("Check Test: ",checkbox("opaccheck"));

print p(submit("Submit Entry"));
print end_form(), hr();
}

print end_html;</code>
 
M

Mumia W.

Here is my code, I picked one of my shorter scripts:

<code>#!/usr/bin/perl -w

# Joe Ruffino Daily WebOpac.pl
# This program will read in a text file, and print it out
# in table format
# Written: January 30, 2004
# Revised: December 09, 2004, Jan 03, 2005

use CGI qw:)standard :html3);
use CGI::Carp qw(fatalsToBrowser);
use strict;


##########################################################################
# Set Variables
#

my $ip_hold = 0;
my $sec;
my $min;
my $hour;
my $day;
my $month;
my $year;
my $ip_list;
my $monthfind;
my $monthm;
my $countip;

my $stationip;
my $stationname;

my @stationip;
my @stationname;

my $dayopac;
my $daym;
my $dayopacm;
my $dayfind;
my $headerpage;
my $dayflag;
my $namev;
my $one;
my $two;
my $three;
my $monthcurr;
my $monthnow;
my $countin;
my $countout;
my $ip;
my $date;
my $time;
my $firstp;
my $secondp;
my $thirdp;
my $fourthp;
my $firstip;
my @firstip;
my $sn;
my $count;
my $date_month;
my $date_day;
my $date_year;
my $i;
my $ips;
my @Names;
my %Names;
my $ext_ip;
my %seen;
my $countint;
my $totalcnt;
my $totalline;
my $station_name;
my @opacline;
my %count;
my @staionip;
my $line;
my $opac_month;
my $hold_date;
my $date_cnt;
my $ip_day_cnt;
my $day_array;
my $ip_day_cnt;
my $four;
my @ext_line;
my %day_array;
my %letters;
my $tot_ip_cnt;
my $ip_cnt;
my $four;

##########################################################################
# Subroutine for finding the text month when numerical month is given
#
sub dayfind {

#Setup date field
if ($dayopacm eq "01") {
$dayfind = "January"; }

if ($dayopacm eq "02") {
$dayfind = "February"; } [...]

Use data to simplify code (untested):

my @monthnames = qw(
January February March April May June
July August September October November December ) ;

my %monthnames;
@monthnames{ @monthnames } = 1 .. @monthnames ;

my %rMonthnames = reverse %monthnames;

sub dayfind {
$dayfind = $monthnames{$dayopacm};
}

sub monthfind {
$monthfind = $rMonthnames{$monthm};
sprintf('%02d', $monthfind);
}

if ($dayopacm eq "03") {
$dayfind = "March"; }

if ($dayopacm eq "04") {
$dayfind = "April"; }

if ($dayopacm eq "05") {
$dayfind = "May"; }

if ($dayopacm eq "06") {
$dayfind = "June"; }

if ($dayopacm eq "07") {
$dayfind = "July"; }

if ($dayopacm eq "08") {
$dayfind = "August"; }

if ($dayopacm eq "09") {
$dayfind = "September"; }

if ($dayopacm eq "10") {
$dayfind = "October"; }

if ($dayopacm eq "11") {
$dayfind = "November"; }

if ($dayopacm eq "12") {
$dayfind = "December"; }
return $dayfind;
}

##########################################################################
# Subroutine for finding the numerical month when text month is given
#
sub monthfind {

#Setup date field
if ($monthm eq "Jan") {
$monthfind = "01"; }

if ($monthm eq "Feb") {
$monthfind = "02"; }

if ($monthm eq "Mar") {
$monthfind = "03"; }

if ($monthm eq "Apr") {
$monthfind = "04"; }

if ($monthm eq "May") {
$monthfind = "05"; }

if ($monthm eq "Jun") {
$monthfind = "06"; }

if ($monthm eq "Jul") {
$monthfind = "07"; }

if ($monthm eq "Aug") {
$monthfind = "08"; }

if ($monthm eq "Sep") {
$monthfind = "09"; }

if ($monthm eq "Oct") {
$monthfind = "10"; }

if ($monthm eq "Nov") {
$monthfind = "11"; }

if ($monthm eq "Dec") {
$monthfind = "12"; }
return $monthfind;
}

##########################################################################
# Find current Time and Date info
#
($sec,$min,$hour,$day,$month,$year) = localtime(time);
$year = $year +1900;

# ignore used for testing
$ip_list = "OpacIP";
# ignore used for testing

##########################################################################
# Open IP file and test data file
# Then split IP file into IP address and Station Name array's
#
open (LISTIN,"ipnew.txt") || die "Cannot Open File ipadd.txt for
reading: $!";

while (<LISTIN>) {
($staionip[$countip], $stationname[$countip]) = split(/\s+/);
$countip++;
}

Huh? Why do you advance the field counter ($countip) each time through
the loop? Now you get both a different record and a different field with
each iteration.
$stationip = @stationip;
$stationname = $stationname;

close (LISTIN);


##########################################################################
# If a file name has been given, process the file
#

$line = 0;
if (param()) {

# Set filename entered to a variable
my $dayopac = param("dayopac");

# Split file name into month and day by assuming a dash is there
($dayopacm, $daym) = split(/-/, $dayopac);
if ($daym) { # if there is a 2-digit day
$dayflag = "yes";

# find the text month by sending the 2-digit month
$monthfind = dayfind($dayopacm);

Dayfind does not use any arguments from its argument list, yet you give
it an argument anyway--why?
if ($monthfind eq "December") {
#$year = $year -1;
}
$headerpage = "Daily Stats for " . $monthfind . " " . $daym . ",
" . $year;
} else {

# if not a day to be procressed, check to see if it is a month
to
# be processed
$dayflag = "no";
$daym = "01";

# Split file name into process name and month by assuming an
# underscore is there
($namev, $monthm) = split(/_/, $dayopac);

# find the 2-digit month by sending the text month
$monthcurr = monthfind($monthm);

# if current month is equal to the month entered
if ($month eq $monthcurr) { # if it is 1 - 9
if ($month > 9) {
$dayopacm = $month; # set current month to month holder
} else {
# set current month to month holder and append a '0
$dayopacm = "0" . $month;
}
} else {
# if not equal set month entered to month holder
$dayopacm = $monthcurr;
}
# Go to subroutine to find the FULL text month
$monthnow = dayfind($dayopacm);
if ($monthnow eq "December") {
$year--;
}
($one, $two, $three, $four) = split(/\\/, $dayopac);

# Set title for HTML Output page using text month that was found
$headerpage = "Monthly Stats for $monthnow $year";
}

$ip_list .= "_" . $monthm .".txt";
open (OPAC_IP, ">$ip_list") || die "$ip_list open failed: $!";

$opac_month = $dayopac . "_" . $year . ".html";
open (OPAC_WEB, ">$opac_month") || die "$ip_list open failed: $!";

# Append .txt to filename given, and open file for reading
$dayopac .= ".txt";
open (OPAC,$dayopac) || die ($dayopac . " open failed: $!");

# Print title on new HTML page and first line
print OPAC_WEB <<END;
<HTML><HEAD>
<META name="description" content="GBPL Titles with Holds">
<META name="robots" content="nofollow">
<TITLE>WebOpac $headerpage</TITLE>
</HEAD>
<CENTER>
<H1>$headerpage</H1>
END

($ip,$date,$time,$sn) = split(/ +/);
$hold_date = $dayopacm . "-" . $daym . "-" . substr(($year - 1900),
1,2);

$countin = 0; # zero out counter for ip numbers used in an
array
$date_cnt = 0;
$ip_day_cnt = 0;

while (<OPAC>) {
chomp;
$countout++; # count number of records processed

($ip,$date,$time,$sn) = split(/ +/);

# If IP is internal, process
if ($ip =~ /192.168.33/) {

# Split IP in to 4 parts using a period
($firstp,$secondp,$thirdp,$fourthp) = split(/\./, $ip);

# If IP is between 1 and 9, append 00 to it
if ($fourthp > 0 && $fourthp < 10) {
$fourthp = "00" . $fourthp;
} else {

# If IP is between 10 and 99, append 0 to it
if ($fourthp > 9 && $fourthp < 100) {
$fourthp = "0" . $fourthp;
}
}
# Assign IP to an array element
$firstip[$countin] = $fourthp;

# Add 1 to array counter
$countin++;
} else {
if ($date ne $hold_date) {
foreach $ip (sort keys %day_array) {
$ip_day_cnt++;
}
$tot_ip_cnt += $ip_day_cnt;
$ext_line[$line] = "<b><i>" . $hold_date . "</b></i> has <b><i>" .
$ip_day_cnt . "</b></i> unique External IPs.<p>";
$date_cnt = 0;
$ip_day_cnt = 0;
%day_array = " ";
$line++;
}
$ext_ip++;
$letters{$ip} = 1;
$day_array{$ip} = 1;
$date_cnt++;
}
$hold_date = $date;
}
[...]

I stopped reading here. The large number of global variables you used
and the large amount of text you posted make it not worth my while to
continue.

Your program is confusing because its functions are 10x the size they
need to be to get the job done, and you went hog-wild with the global
variables.

A debugger is available for Perl, but it'll cost you¹. However, creating
the right environment for the debugger will be a challenge. If you
haven't done so already, read the posting guidelines². They suggest
creating the shortest but runnable program that demonstrates your
problem; ninety per cent of the time, doing so reveals the bug.
 
J

John W. Krahn

Joe said:
Here is my code, I picked one of my shorter scripts:

<code>#!/usr/bin/perl -w

# Joe Ruffino Daily WebOpac.pl
# This program will read in a text file, and print it out
# in table format
# Written: January 30, 2004
# Revised: December 09, 2004, Jan 03, 2005

use CGI qw:)standard :html3);
use CGI::Carp qw(fatalsToBrowser);
use strict;


##########################################################################
# Set Variables
#

You should declare your variables in the smallest scope possible instead of
all here.

[ SNIP ]

##########################################################################
# Subroutine for finding the text month when numerical month is given
#
sub dayfind {

#Setup date field
if ($dayopacm eq "01") {
$dayfind = "January"; }
##########################################################################
# Subroutine for finding the numerical month when text month is given
#
sub monthfind {

#Setup date field
if ($monthm eq "Jan") {
$monthfind = "01"; }

Just use hashes instead of subroutines:

my %dayfind = qw( 01 January 02 February 03 March 04 April 05 May 06 June 07
July 08 August 09 September 10 October 11 November 12 December );

my %monthfind = qw( Jan 01 Feb 02 Mar 03 Apr 04 May 05 Jun 06 Jul 07 Aug 08
Sep 09 Oct 10 Nov 11 Dec 12 );

##########################################################################
# Find current Time and Date info
#
($sec,$min,$hour,$day,$month,$year) = localtime(time);
$year = $year +1900;

You don't use $sec, $min, $hour or $day so:

my ( $month, $year ) = ( localtime )[ 4, 5 ];
$year += 1900;

# ignore used for testing
$ip_list = "OpacIP";
# ignore used for testing

##########################################################################
# Open IP file and test data file
# Then split IP file into IP address and Station Name array's
#
open (LISTIN,"ipnew.txt") || die "Cannot Open File ipadd.txt for
reading: $!";

while (<LISTIN>) {
($staionip[$countip], $stationname[$countip]) = split(/\s+/);
$countip++;
}

$stationip = @stationip;
$stationname = $stationname;

Shouldn't that be:

my $stationip = @stationip;
my $stationname = @stationname;

But you never use the variables $stationip and $stationname anyway.

close (LISTIN);


##########################################################################
# If a file name has been given, process the file
#

$line = 0;
if (param()) {

# Set filename entered to a variable
my $dayopac = param("dayopac");

# Split file name into month and day by assuming a dash is there
($dayopacm, $daym) = split(/-/, $dayopac);
if ($daym) { # if there is a 2-digit day
$dayflag = "yes";

# find the text month by sending the 2-digit month
$monthfind = dayfind($dayopacm);
if ($monthfind eq "December") {
#$year = $year -1;
}
$headerpage = "Daily Stats for " . $monthfind . " " . $daym . ",
" . $year;
} else {

# if not a day to be procressed, check to see if it is a month
to
# be processed
$dayflag = "no";
$daym = "01";

# Split file name into process name and month by assuming an
# underscore is there
($namev, $monthm) = split(/_/, $dayopac);

# find the 2-digit month by sending the text month
$monthcurr = monthfind($monthm);

# if current month is equal to the month entered
if ($month eq $monthcurr) { # if it is 1 - 9
if ($month > 9) {
$dayopacm = $month; # set current month to month holder
} else {
# set current month to month holder and append a '0
$dayopacm = "0" . $month;
}
} else {
# if not equal set month entered to month holder
$dayopacm = $monthcurr;
}

$monthcurr = $monthfind{ ( split /_/, $dayopac )[ 1 ] }
$dayopacm = sprintf '%02d', $month eq $monthcurr ? $month : $monthcurr;

# Go to subroutine to find the FULL text month
$monthnow = dayfind($dayopacm);

$monthnow = $dayfind{ $dayopacm };

if ($monthnow eq "December") {
$year--;
}
($one, $two, $three, $four) = split(/\\/, $dayopac);

You never use these variables anywhere?

# Set title for HTML Output page using text month that was found
$headerpage = "Monthly Stats for $monthnow $year";
}

$ip_list .= "_" . $monthm .".txt";
open (OPAC_IP, ">$ip_list") || die "$ip_list open failed: $!";

$opac_month = $dayopac . "_" . $year . ".html";
open (OPAC_WEB, ">$opac_month") || die "$ip_list open failed: $!";

# Append .txt to filename given, and open file for reading
$dayopac .= ".txt";
open (OPAC,$dayopac) || die ($dayopac . " open failed: $!");

# Print title on new HTML page and first line
print OPAC_WEB <<END;
<HTML><HEAD>
<META name="description" content="GBPL Titles with Holds">
<META name="robots" content="nofollow">
<TITLE>WebOpac $headerpage</TITLE>
</HEAD>
<CENTER>
<H1>$headerpage</H1>
END

($ip,$date,$time,$sn) = split(/ +/);
$hold_date = $dayopacm . "-" . $daym . "-" . substr(($year - 1900),
1,2);

$hold_date = sprintf '%s-%s-%02d', $dayopacm, $daym, $year % 100

$countin = 0; # zero out counter for ip numbers used in an
array
$date_cnt = 0;
$ip_day_cnt = 0;

while (<OPAC>) {
chomp;
$countout++; # count number of records processed

($ip,$date,$time,$sn) = split(/ +/);

# If IP is internal, process
if ($ip =~ /192.168.33/) {
if ( $ip =~ /^192\.168\.33/ ) {

# Split IP in to 4 parts using a period
($firstp,$secondp,$thirdp,$fourthp) = split(/\./, $ip);

You never use $firstp, $secondp and $thirdp so ...

# If IP is between 1 and 9, append 00 to it
if ($fourthp > 0 && $fourthp < 10) {
$fourthp = "00" . $fourthp;
} else {

# If IP is between 10 and 99, append 0 to it
if ($fourthp > 9 && $fourthp < 100) {
$fourthp = "0" . $fourthp;
}
}

$fourthp = sprintf '%03d', ( split /\./, $ip )[ 3 ];

# Assign IP to an array element
$firstip[$countin] = $fourthp;

# Add 1 to array counter
$countin++;
} else {
if ($date ne $hold_date) {
foreach $ip (sort keys %day_array) {
$ip_day_cnt++;
}

$ip_day_cnt += keys %day_array;

$tot_ip_cnt += $ip_day_cnt;
$ext_line[$line] = "<b><i>" . $hold_date . "</b></i> has <b><i>" .
$ip_day_cnt . "</b></i> unique External IPs.<p>";
$date_cnt = 0;
$ip_day_cnt = 0;
%day_array = " ";
$line++;
}
$ext_ip++;
$letters{$ip} = 1;
$day_array{$ip} = 1;
$date_cnt++;
}
$hold_date = $date;
}

foreach $ip (sort keys %day_array) {
$ip_day_cnt++;
}

$ip_day_cnt += keys %day_array;

$tot_ip_cnt += $ip_day_cnt;
$ext_line[$line] = "<b><i>" . $hold_date . "</b></i> has <b><i>" .
$ip_day_cnt . "</b></i> unique External IPs.<p>";

# print OPAC_IP @Names;
close (OPAC_IP);

foreach $ip (sort keys %letters) {
$ip_cnt++;
}

$ip_cnt += keys %letters;

#print "<p>$ip_cnt";
# Set length of array to variable
$countint = @firstip;

# Tally distinctive ips
foreach $ips(@firstip) {
$count{$ips}++;
}

foreach $ips(sort(keys %count)) {
for ($i = 0; $i <= $countip; $i++) {
if ($ips == $staionip[$i]) {
$opacline[$totalcnt] = "The Station <b><i>".$stationname[$i]."</i></
b> with IP <b><i>".$ips. "</i></b> has visited Opac <b><i>".
$count{$ips}."</i></b> times.\n";
$totalcnt++;
if ( $count{$ips} > $ip_hold) {
$ip_hold = $count{$ips};
$station_name = $i;
}
}

}
}
close(OPAC);

if ($countint == 0) { $totalcnt = 0;}

if ($dayflag eq "yes") {
$totalline = "There are <b><i> " . $totalcnt . "</i></b> total
patron stations used for <b><i>" . $monthfind . " " . $daym . "</i></
b>.";
} else {
$totalline = "There are <b><i> " . $totalcnt . "</i></b> total
patron stations used for the Month of <b><i>" . $monthnow . "</i></
b>.";
}
print OPAC_WEB hr();
print OPAC_WEB p("There are <b><i>" . $countint . "</i></b>
internal IP address hits.");
print OPAC_WEB p("There are <b><i>" . $ext_ip . "</i></b> external
IP address hits.");
# print p("There are <b><i>" . ($countout-$countin) . "</i></b>
external IP address hits.");
print OPAC_WEB p("There are <b><i>" . $countout . "</i></b> total
IP address hits.");
print OPAC_WEB p($totalline);
print OPAC_WEB p("The Station <b><i>".
$stationname[$station_name]."</i></b> has the greatest number of hits
of <b><i>".$ip_hold."</i></b> times.");
print OPAC_WEB p("There are <b><i>" . $tot_ip_cnt . "</i></b> Total
unique External IP hits for All Days in <b><i>$monthnow</i></b>.");
print OPAC_WEB p("There are <b><i>" . $ip_cnt . "</i></b> unique
External IP hits for the Month of <b><i>$monthnow</i></b>.");
print OPAC_WEB "<FONT SIZE=\"4\" COLOR=\"#FFFFFF\">";
print OPAC_WEB "<A NAME=\"int\">Internal<\/A><\/font>";
print OPAC_WEB "<A HREF=\"\#ext\">External Hits<\/a> ";
print OPAC_WEB hr();

for ($i = 0; $i <= $totalcnt; $i++) {
print OPAC_WEB p($opacline[$i]);
}
print OPAC_WEB hr();
print OPAC_WEB "<FONT SIZE=\"4\" COLOR=\"#FFFFFF\">";
print OPAC_WEB "<A NAME=\"ext\">External<\/A><\/font>";
print OPAC_WEB "<A HREF=\"\#int\">Internal Hits<\/a>";
print OPAC_WEB p(@ext_line);
print OPAC_WEB hr();
print OPAC_WEB "</center>";

Instead of 21 + $totalcnt calls to print() just print once:

print OPAC_WEB
hr(),
p( "There are <b><i>$countint</i></b> internal IP address hits." ),
p( "There are <b><i>$ext_ip</i></b> external IP address hits." ),
p( "There are <b><i>$countout</i></b> total IP address hits." ),
p( $totalline ),
p( "The Station <b><i>$stationname[$station_name]</i></b> has the
greatest number of hits of <b><i>$ip_hold</i></b> times." ),
p( "There are <b><i>" . $tot_ip_cnt . "</i></b> Total unique External
IP hits for All Days in <b><i>$monthnow</i></b>." ),
p( "There are <b><i>" . $ip_cnt . "</i></b> unique External IP hits
for the Month of <b><i>$monthnow</i></b>." ),
"<FONT SIZE=\"4\" COLOR=\"#FFFFFF\">",
"<A NAME=\"int\">Internal<\/A><\/font>",
"<A HREF=\"\#ext\">External Hits<\/a> ",
hr(),
map( p( $opacline[ $_ ] ), 0 .. $totalcnt ),
hr(),
"<FONT SIZE=\"4\" COLOR=\"#FFFFFF\">",
"<A NAME=\"ext\">External<\/A><\/font>",
"<A HREF=\"\#int\">Internal Hits<\/a>",
p( @ext_line ),
hr(),
use CGI; print redirect("$opac_month");
} else {

##########################################################################
# If a file name has not been given, process the file, create webpage
to
# ask for it
#
print header, start_html("Monthly WebOpac"), h1("Monthly WebOpac
Report");

print hr();
print start_form();
print p("Day File: ",textfield("dayopac"), "<b> * form should be
WebOpac_(<i>3-letter Month</i></b>)");
# print p("Check Test: ",checkbox("opaccheck"));

print p(submit("Submit Entry"));
print end_form(), hr();
}

print end_html;</code>


John
 
B

- Bob -

Here is my code, I picked one of my shorter scripts:

<code>#!/usr/bin/perl -w

# Joe Ruffino Daily WebOpac.pl
# This program will read in a text file, and print it out
# in table format
# Written: January 30, 2004
# Revised: December 09, 2004, Jan 03, 2005

Joe:

I think you problems are simpler than examining your code. At the very
least, you need to check the basics.

Have you tried writing a VERY SIMPLE script and trying to get it to
run? If you get the same error from all of your scripts, then you have
a very basic configuration problem or testing problem. Write something
that just produces the HTML MIME header and some simple hardcoded
output. Test it in the EXACT same way that you are testing your more
complex code. Odds are that it will fail. Find the basic problem with
that an move from there.

One other test that's good to do is to run the program on the server
in a command window. Setting up post parameters can be an issue but
it's a good way to test the server. Simple programs (see above) should
run properly at a command prompt and the output should be exactly what
you get sent to the browser. If it's not, you have a server issue to
look for.

If you don't know how to see raw output back to the browser, ask,
there's a free MS program that will return all the raw output (or you
can use telnet).
 
R

Ron Bergin

John and Mumia have pointed out most of the problems, but here are
some more.

Here is my code, I picked one of my shorter scripts:

<code>#!/usr/bin/perl -w

# Joe Ruffino Daily WebOpac.pl
# This program will read in a text file, and print it out
# in table format
# Written: January 30, 2004
# Revised: December 09, 2004, Jan 03, 2005

use CGI qw:)standard :html3);
use CGI::Carp qw(fatalsToBrowser);
use strict;

##########################################################################
# Set Variables
#

my $ip_hold = 0;
my $sec;
my $min;
my $hour;
my $day;
my $month;
my $year;
my $ip_list;
my $monthfind;
my $monthm;
my $countip;

my $stationip;
my $stationname;

my @stationip;
my @stationname;

my $dayopac;
my $daym;
my $dayopacm;
my $dayfind;
my $headerpage;
my $dayflag;
my $namev;
my $one;
my $two;
my $three;
my $monthcurr;
my $monthnow;
my $countin;
my $countout;
my $ip;
my $date;
my $time;
my $firstp;
my $secondp;
my $thirdp;
my $fourthp;
my $firstip;
my @firstip;
my $sn;
my $count;
my $date_month;
my $date_day;
my $date_year;
my $i;
my $ips;
my @Names;
my %Names;
my $ext_ip;
my %seen;
my $countint;
my $totalcnt;
my $totalline;
my $station_name;
my @opacline;
my %count;
my @staionip;
my $line;
my $opac_month;
my $hold_date;
my $date_cnt;
my $ip_day_cnt;
my $day_array;
my $ip_day_cnt;
my $four;
my @ext_line;
my %day_array;
my %letters;
my $tot_ip_cnt;
my $ip_cnt;
my $four;

##########################################################################
# Subroutine for finding the text month when numerical month is given
#
sub dayfind {

#Setup date field
if ($dayopacm eq "01") {
$dayfind = "January"; }

if ($dayopacm eq "02") {
$dayfind = "February"; }

if ($dayopacm eq "03") {
$dayfind = "March"; }

if ($dayopacm eq "04") {
$dayfind = "April"; }

if ($dayopacm eq "05") {
$dayfind = "May"; }

if ($dayopacm eq "06") {
$dayfind = "June"; }

if ($dayopacm eq "07") {
$dayfind = "July"; }

if ($dayopacm eq "08") {
$dayfind = "August"; }

if ($dayopacm eq "09") {
$dayfind = "September"; }

if ($dayopacm eq "10") {
$dayfind = "October"; }

if ($dayopacm eq "11") {
$dayfind = "November"; }

if ($dayopacm eq "12") {
$dayfind = "December"; }
return $dayfind;

}

##########################################################################
# Subroutine for finding the numerical month when text month is given
#
sub monthfind {

#Setup date field
if ($monthm eq "Jan") {
$monthfind = "01"; }

if ($monthm eq "Feb") {
$monthfind = "02"; }

if ($monthm eq "Mar") {
$monthfind = "03"; }

if ($monthm eq "Apr") {
$monthfind = "04"; }

if ($monthm eq "May") {
$monthfind = "05"; }

if ($monthm eq "Jun") {
$monthfind = "06"; }

if ($monthm eq "Jul") {
$monthfind = "07"; }

if ($monthm eq "Aug") {
$monthfind = "08"; }

if ($monthm eq "Sep") {
$monthfind = "09"; }

if ($monthm eq "Oct") {
$monthfind = "10"; }

if ($monthm eq "Nov") {
$monthfind = "11"; }

if ($monthm eq "Dec") {
$monthfind = "12"; }
return $monthfind;

}

##########################################################################
# Find current Time and Date info
#
($sec,$min,$hour,$day,$month,$year) = localtime(time);
$year = $year +1900;

# ignore used for testing
$ip_list = "OpacIP";
# ignore used for testing

##########################################################################
# Open IP file and test data file
# Then split IP file into IP address and Station Name array's
#
open (LISTIN,"ipnew.txt") || die "Cannot Open File ipadd.txt for
reading: $!";

while (<LISTIN>) {
($staionip[$countip], $stationname[$countip]) = split(/\s+/);
$countip++;

}

$stationip = @stationip;
$stationname = $stationname;

close (LISTIN);

##########################################################################
# If a file name has been given, process the file
#

$line = 0;
if (param()) {

# Set filename entered to a variable
my $dayopac = param("dayopac");

# Split file name into month and day by assuming a dash is there
($dayopacm, $daym) = split(/-/, $dayopac);
if ($daym) { # if there is a 2-digit day
$dayflag = "yes";

# find the text month by sending the 2-digit month
$monthfind = dayfind($dayopacm);
if ($monthfind eq "December") {
#$year = $year -1;
}
$headerpage = "Daily Stats for " . $monthfind . " " . $daym . ",
" . $year;
} else {

# if not a day to be procressed, check to see if it is a month
to
# be processed
$dayflag = "no";
$daym = "01";

# Split file name into process name and month by assuming an
# underscore is there
($namev, $monthm) = split(/_/, $dayopac);

# find the 2-digit month by sending the text month
$monthcurr = monthfind($monthm);

# if current month is equal to the month entered
if ($month eq $monthcurr) { # if it is 1 - 9
if ($month > 9) {
$dayopacm = $month; # set current month to month holder
} else {
# set current month to month holder and append a '0
$dayopacm = "0" . $month;
}
} else {
# if not equal set month entered to month holder
$dayopacm = $monthcurr;
}
# Go to subroutine to find the FULL text month
$monthnow = dayfind($dayopacm);
if ($monthnow eq "December") {
$year--;
}
($one, $two, $three, $four) = split(/\\/, $dayopac);

# Set title for HTML Output page using text month that was found
$headerpage = "Monthly Stats for $monthnow $year";
}

$ip_list .= "_" . $monthm .".txt";
open (OPAC_IP, ">$ip_list") || die "$ip_list open failed: $!";

$opac_month = $dayopac . "_" . $year . ".html";
open (OPAC_WEB, ">$opac_month") || die "$ip_list open failed: $!";

# Append .txt to filename given, and open file for reading
$dayopac .= ".txt";
open (OPAC,$dayopac) || die ($dayopac . " open failed: $!");

# Print title on new HTML page and first line
print OPAC_WEB <<END;

1) You're not specifing the DOCTYPE
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD>
<META name="description" content="GBPL Titles with Holds">
<META name="robots" content="nofollow">
<TITLE>WebOpac $headerpage</TITLE>
</HEAD>

2) You're missing the opening body tag.
3) HTML tags should be in lowercase, not uppercase.
4) The said:
<H1>$headerpage</H1>
END

5) Dynamicaly creating a static html file that you later redirect to
doesn't make sense. Skip the file creation and just output your page.
($ip,$date,$time,$sn) = split(/ +/);
$hold_date = $dayopacm . "-" . $daym . "-" . substr(($year - 1900),
1,2);

$countin = 0; # zero out counter for ip numbers used in an
array
$date_cnt = 0;
$ip_day_cnt = 0;

while (<OPAC>) {
chomp;
$countout++; # count number of records processed

($ip,$date,$time,$sn) = split(/ +/);

# If IP is internal, process
if ($ip =~ /192.168.33/) {

# Split IP in to 4 parts using a period
($firstp,$secondp,$thirdp,$fourthp) = split(/\./, $ip);

# If IP is between 1 and 9, append 00 to it
if ($fourthp > 0 && $fourthp < 10) {
$fourthp = "00" . $fourthp;
} else {

# If IP is between 10 and 99, append 0 to it
if ($fourthp > 9 && $fourthp < 100) {
$fourthp = "0" . $fourthp;
}
}
# Assign IP to an array element
$firstip[$countin] = $fourthp;

# Add 1 to array counter
$countin++;
} else {
if ($date ne $hold_date) {
foreach $ip (sort keys %day_array) {
$ip_day_cnt++;
}
$tot_ip_cnt += $ip_day_cnt;
$ext_line[$line] = "<b><i>" . $hold_date . "</b></i> has <b><i>" .
$ip_day_cnt . "</b></i> unique External IPs.<p>";
$date_cnt = 0;
$ip_day_cnt = 0;
%day_array = " ";
$line++;
}
$ext_ip++;
$letters{$ip} = 1;
$day_array{$ip} = 1;
$date_cnt++;
}
$hold_date = $date;
}

foreach $ip (sort keys %day_array) {
$ip_day_cnt++;}

$tot_ip_cnt += $ip_day_cnt;
$ext_line[$line] = "<b><i>" . $hold_date . "</b></i> has <b><i>" .
$ip_day_cnt . "</b></i> unique External IPs.<p>";

# print OPAC_IP @Names;
close (OPAC_IP);

foreach $ip (sort keys %letters) {
$ip_cnt++;

}

#print "<p>$ip_cnt";
# Set length of array to variable
$countint = @firstip;

# Tally distinctive ips
foreach $ips(@firstip) {
$count{$ips}++;
}

foreach $ips(sort(keys %count)) {
for ($i = 0; $i <= $countip; $i++) {
if ($ips == $staionip[$i]) {
$opacline[$totalcnt] = "The Station <b><i>".$stationname[$i]."</i></
b> with IP <b><i>".$ips. "</i></b> has visited Opac <b><i>".
$count{$ips}."</i></b> times.\n";
$totalcnt++;
if ( $count{$ips} > $ip_hold) {
$ip_hold = $count{$ips};
$station_name = $i;
}
}

}
}
close(OPAC);

if ($countint == 0) { $totalcnt = 0;}

if ($dayflag eq "yes") {
$totalline = "There are <b><i> " . $totalcnt . "</i></b> total
patron stations used for <b><i>" . $monthfind . " " . $daym . "</i></
b>.";
} else {
$totalline = "There are <b><i> " . $totalcnt . "</i></b> total
patron stations used for the Month of <b><i>" . $monthnow . "</i></
b>.";
}
print OPAC_WEB hr();
print OPAC_WEB p("There are <b><i>" . $countint . "</i></b>
internal IP address hits.");
print OPAC_WEB p("There are <b><i>" . $ext_ip . "</i></b> external
IP address hits.");
# print p("There are <b><i>" . ($countout-$countin) . "</i></b>
external IP address hits.");
print OPAC_WEB p("There are <b><i>" . $countout . "</i></b> total
IP address hits.");
print OPAC_WEB p($totalline);
print OPAC_WEB p("The Station <b><i>".
$stationname[$station_name]."</i></b> has the greatest number of hits
of <b><i>".$ip_hold."</i></b> times.");
print OPAC_WEB p("There are <b><i>" . $tot_ip_cnt . "</i></b> Total
unique External IP hits for All Days in <b><i>$monthnow</i></b>.");
print OPAC_WEB p("There are <b><i>" . $ip_cnt . "</i></b> unique
External IP hits for the Month of <b><i>$monthnow</i></b>.");
print OPAC_WEB "<FONT SIZE=\"4\" COLOR=\"#FFFFFF\">";
print OPAC_WEB "<A NAME=\"int\">Internal<\/A><\/font>";
print OPAC_WEB "<A HREF=\"\#ext\">External Hits<\/a> ";
print OPAC_WEB hr();

for ($i = 0; $i <= $totalcnt; $i++) {
print OPAC_WEB p($opacline[$i]);
}
print OPAC_WEB hr();
print OPAC_WEB "<FONT SIZE=\"4\" COLOR=\"#FFFFFF\">";
print OPAC_WEB "<A NAME=\"ext\">External<\/A><\/font>";
print OPAC_WEB "<A HREF=\"\#int\">Internal Hits<\/a>";
print OPAC_WEB p(@ext_line);
print OPAC_WEB hr();
print OPAC_WEB "</center>";

6) You need to learn the different quoting methods so you can avoid
the "leaning tower syndrom".
If you don't need variable interpolation, then use single quotes
instead of double quotes.
e.g. said:
use CGI; print redirect("$opac_month");

7) Why are you tring to load the CGI module for a second time?

8) The redirect is probably why you're getting a blank page. From
what I can tell, you're only passing the filename. When doing a
redirect, you need to specify the full url, which includes the
protocal.

http://search.cpan.org/~lds/CGI.pm-3.29/CGI.pm#GENERATING_A_REDIRECTION_HEADER
 
R

Ron Bergin

I skipped over another important issue, so here it is.

John and Mumia have pointed out most of the problems, but here are
some more.
[snip a bunch]
print OPAC_WEB hr();
print OPAC_WEB "<FONT SIZE=\"4\" COLOR=\"#FFFFFF\">";
print OPAC_WEB "<A NAME=\"ext\">External<\/A><\/font>";
print OPAC_WEB "<A HREF=\"\#int\">Internal Hits<\/a>";
print OPAC_WEB p(@ext_line);
print OPAC_WEB hr();
print OPAC_WEB "</center>";
[snip some more]
use CGI; print redirect("$opac_month");
You're not printing the closing body or html tags.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,997
Messages
2,570,240
Members
46,830
Latest member
HeleneMull

Latest Threads

Top