#!/usr/local/bin/perl # TODO: Require either email or phone #=============================================================================# # # # This CGI script submits feedback to the transportation feedback board. # # # #=============================================================================# # # # Both old and new feedback files must be world-writeable. # # # #=============================================================================# # Author: Don Thomson # #=============================================================================# use strict; use CGI; use CGI::Carp qw(fatalsToBrowser confess); use IO::File; my($Feedback_Dir, $Feedback_File, $Mail_To, $Test, $Title, %Fields, %Streets); my $SEND_MAIL = 1; my $TRANSPORTATION_DIR = 'transportation'; my $NO_STREET = '--- No Street ---'; #=============================================================================# # Main body # #=============================================================================# my $q = new CGI; initialize(); print $q->header; print $q->start_html(-title=>$Title, -bgcolor=>'#FFFFCC', -link=>'#008000', -vlink=>'#800080'), "\n"; display_file('header.html'); if ($q->param('submit')) { submit_form(); } else { display_form(); } display_file('footer.shtml', '/; } print $new_fh $q->hr, "\n", $q->p, "\n", $q->table("\n", $q->TR("\n", label('date', 1, 1), $q->td(date_param($q->param('date'))), "\n", ), "\n", $q->TR("\n", label('time', 1, 1), $q->td(trim_whitespace( $q->param('time'))), "\n", ), "\n", $q->TR("\n", label('description', 1, 1), $q->td(trim_whitespace( $q->param('description'))), "\n", ), "\n", empty_param('street1') ? '' : $q->TR("\n", label('street1', 1, 1), $q->td(street_param('street1')), "\n", ) . "\n", empty_param('street2') ? '' : $q->TR("\n", label('street2', 1, 1), $q->td(street_param('street2')), "\n", ) . "\n", empty_param('location') ? '' : $q->TR("\n", label('location', 1, 1), $q->td(trim_whitespace( $q->param('location'))), "\n", ) . "\n", ), "\n", $q->p({-align=>'right'}, $q->font({-size=>'-1'}, $date_time), "\n", ), "\n\n"; while ($line = ) { print $new_fh $line; } close $new_fh; system("/bin/cp $new_feedback_file $old_feedback_file") && die "Can't copy '$new_feedback_file' to '$old_feedback_file' ($!)"; if ($SEND_MAIL) { my $sendmail = '/usr/lib/sendmail -t'; open(MAIL, "| $sendmail") || die "Can't fork $sendmail: $!\n"; print MAIL "To: $Mail_To\n", "Subject: Transportation Feedback Submission\n\n", "Transportation Feedback Submission\n\n", ' (Submitted: ', $date_time, ' from: "', $q->remote_host, '")', "\n"; foreach my $field (sort { $Fields{$a}{order} <=> $Fields{$b}{order} } keys %Fields) { next if empty_param($field); $label = $Fields{$field}{label}; $label = uc $label; if ($sub = $Fields{$field}{str_sub}) # Call sub to construct # string { $value = &$sub($field); } else { $value = trim_whitespace($q->param($field)); } $newline = $Fields{$field}{newline}; $label .= ': '; $label .= "\n\n" if $newline; print MAIL "\n", $label, $value; print MAIL "\n" if $value !~ /\n$/; } close(MAIL); } } #=============================================================================# # Determine whether this parameter is empty # #=============================================================================# sub empty_param { my($param) = @_; my $val = $q->param($param); my $empty; if ($param eq 'street1' || $param eq 'street2') { $empty = $Streets{$val} eq $NO_STREET; } elsif (! $Fields{$param}{composite}) { $empty = trim_whitespace($val) eq ''; } return $empty; } #=============================================================================# # Trim leading and trailing whitespace from string # #=============================================================================# sub trim_whitespace { my($str) = @_; $str =~ s/^\s+|\s+$//g; return $str; } #=============================================================================# # Create formatted date/time string from time value # #=============================================================================# sub date_time { my($time) = @_; my @MONTHS = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); my @DAYS = qw(Sun Mon Tue Wed Thu Fri Sat); my($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime($time); return sprintf("%s-%02d-%d (%s) %02d:%02d", $MONTHS[$mon], $mday, $year + 1900, $DAYS[$wday], $hour, $min); } #=============================================================================# # Build a set of month/date selection popup menus # #=============================================================================# sub date_popup_menu { my($param_name) = @_; my %month_names = ( 1 => 'January', 2 => 'February', 3 => 'March', 4 => 'April', 5 => 'May', 6 => 'June', 7 => 'July', 8 => 'August', 9 => 'September', 10 => 'October', 11 => 'November', 12 => 'December', ); my($current_day, $current_month, $current_year) = (localtime)[3, 4, 5]; $current_year += 1900; $current_month += 1; my $month_button = $q->popup_menu(-name=>join('_', $param_name, 'month'), -values=>[1..12], -labels=>\%month_names, -default=>$current_month); my $day_button = $q->popup_menu(-name=>join('_', $param_name, 'day'), -values=>[1..31], -default=>$current_day); my $year_button = $q->popup_menu(-name=>join('_', $param_name, 'year'), -values=>[$current_year .. $current_year + 1], -default=>$current_year); return $month_button . $day_button . $year_button; } #=============================================================================# # Convert args from pop-up dates to DD-MON-YY format # #=============================================================================# sub date_param { my $param_name = 'date'; return sprintf "%02d/%d/%d", $q->param(join('_', $param_name, 'month')), $q->param(join('_', $param_name, 'day')), $q->param(join('_', $param_name, 'year')); } #=============================================================================# # Get street name # #=============================================================================# sub street_param { my($param) = @_; my $street = $Streets{$q->param($param)}; }