#! /usr/bin/perl # # Purpose: # FlowTracker.cgi creates the FlowTracker web page for inputting # selection criteria. # # Description: # # FlowTracker.cgi will create an form for accepting parameters to control # the filtering and selection of Netflow data in the generation of a # FlowTracker set of graphs. # # Input arguments: # Name Description # ----------------------------------------------------------------------- # none # # Modification history: # Author Date Vers. Description # ----------------------------------------------------------------------- # J. Loiacono 07/04/2006 3.0 Original version. # J. Loiacono 12/25/2006 3.1 Added listing of Archived trackings # J. Loiacono 02/14/2007 3.2 Changes to incoporate Groups # #$Author$ #$Date$ #$Header$ # ########################################################################### # # BEGIN EXECUTABLE STATEMENTS # use FlowViewer_Configuration; use FlowViewer_Utilities; if ($debug_tracker eq "Y") { open (DEBUG,">$work_directory/DEBUG_TRACKER"); } print "Content-type:text/html\n\n"; print "\n"; print "\n"; print "\n"; print "FlowTracker $version\n"; print "\n"; print "\n"; print "\n"; print ""; print "
\n"; print "
\n";

# Create a Tracker directory if it doesn't exist

if (!-e $tracker_directory) { 

        mkdir($tracker_directory,$html_dir_perms) || die "cannot mkdir $tracker_directory: $!";   
        chmod $html_dir_perms, $tracker_directory;

	$group_directory = "$tracker_directory/GROUPS";
        mkdir($group_directory,$html_dir_perms) || die "cannot mkdir $group_directory: $!";   
        chmod $html_dir_perms, $group_directory;

	print "
";
	print "\n";
        print "      The directory for storing Tracking files has been created:\n\n"; 
        print "      $tracker_directory\n\n"; 
        print "      Please ensure this directory has adequate permissions for your\n"; 
        print "      web server process owner (e.g., 'apache') to write into it.\n\n"; 
	print "
";

	$new_directory = 1;
}

# Copy image into Tracker directory 
      
$copy_command = "cp $cgi_bin_directory/FlowTracker.png $tracker_directory"; 
system($copy_command); 

# Create directory to keep Tracker filter files, if it doesn't exist already
      
if (!-e $filter_directory) {  

        mkdir($filter_directory,$filter_dir_perms) || die "Cannot mkdir Tracker filter directory: $filter_directory: $!";  
        chmod $filter_dir_perms, $filter_directory;

	print "
";
        print "      The directory for storing Tracking Filter files has been created:\n\n"; 
        print "      $filter_directory\n\n"; 
        print "      Please ensure this directory has adequate permissions for your\n"; 
        print "      web server process owner (e.g., 'apache') to write into it.\n\n"; 
	print "
";

	$new_directory = 1;
} 

# Create directory to keep Tracker RRDtool files, if it doesn't exist already
      
if (!-e $rrdtool_directory) {  

        mkdir($rrdtool_directory,$rrd_dir_perms) || die "Cannot mkdir Tracker RRDtool directory: $rrdtool_directory: $!";  
        chmod $rrd_dir_perms, $rrdtool_directory;

	print "
";
        print "      The directory for storing Tracking RRDtool files has been created:\n\n"; 
        print "      $rrdtool_directory\n\n"; 
        print "      Please ensure this directory has adequate permissions for your\n"; 
        print "      web server process owner (e.g., 'apache') to write into it.\n\n"; 
	print "
"; $new_directory = 1; } if ($new_directory) { print "
";
        print "      RETURN\n";
	print "
"; exit; } $query_string = $ENV{'QUERY_STRING'}; if ($query_string ne "") { $query_string =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/ge ; chop $query_string; @fields = split(/&/,$query_string); foreach $input_field (@fields) { ($field,$field_value) = split(/=/,$input_field); if ($field eq "device_name") { $selected_device_name = $field_value; } if ($field eq "start_date") { $start_date = $field_value; } if ($field eq "start_time") { $start_time = $field_value; } if ($field eq "end_date") { $end_date = $field_value; } if ($field eq "end_time") { $end_time = $field_value; } if ($field eq "source_addresses") { $source_address = $field_value; } if ($field eq "source_ports") { $source_port = $field_value; } if ($field eq "source_ifs") { $source_if = $field_value; } if ($field eq "source_ases") { $source_as = $field_value; } if ($field eq "dest_addresses") { $dest_address = $field_value; } if ($field eq "dest_ports") { $dest_port = $field_value; } if ($field eq "dest_ifs") { $dest_if = $field_value; } if ($field eq "dest_ases") { $dest_as = $field_value; } if ($field eq "protocols") { $protocols = $field_value; } if ($field eq "tos_fields") { $tos_fields = $field_value; } if ($field eq "tcp_flags") { $tcp_flags = $field_value; } if ($field eq "tracking_label") { $tracking_label = $field_value; } if ($field eq "general_comment") { $general_comment = $field_value; } } } # Create the header portion of the FlowTracker webpage print "Filter Criteria:\n\n"; print "
"; if ($devices[0] ne "") { print " Device: "; } print " Protocol: TCP Flag: TOS Field: (e.g., -0x0b/0x0F)\n"; print "\n"; print " Source IP: (e.g., 192.168.16.0/22) Source Port: Source Interface: Source AS: \n"; print "\n"; print " Dest IP: (or, e.g., www.abc.com) Dest Port: Dest Interface: Dest AS: \n"; print "\n"; print "
Note: Multiple field entries, separated by commas, are permitted in the fields above.\n A minus sign (-) will negate an entry (e.g. -1776 for AS, would mean any AS but 1776)
"; print "
"; # Output FlowTracker specific fields print "Tracking Parameters:\n\n"; print " Tracking Set Label: "; print " Tracking Type: "; print "\n\n"; print " General Comment: "; print "\n\n"; print "
"; print "\n"; print " \;\n\n"; print "
"; print "
"; # List each existing tracking for revision, removal purposes print "Individual Trackings:\n\n"; @filters = <$filter_directory/*>; @filters = sort(@filters); foreach $filter_file (@filters) { $tracking_file = $filter_file; $tracking_file =~ s#.*/##; open (FILTERS,"<$filter_file"); while () { chop; $key = substr($_,0,8); if ($key eq " input: ") { ($input,$field,$field_value) = split(/: /); if ($field eq "tracking_label") { $filter_label = $field_value; $filter_file = "$filter_directory/$tracking_file"; ($tracking_prefix,$tracking_suffix) = split(/\./,$tracking_file); $html_file = "$tracker_short/$tracking_prefix/index.html"; $file_label = $filter_label; $file_label =~ s/ /~/g; $filter_label_out = $filter_label; $length = length($filter_label_out); for ($i=$length;$i<=80;$i++) { $filter_label_out .= " "; } $tracking_link = "$filter_label_out"; $revise_link = "Revise"; $remove_link = "Remove"; if ($tracking_suffix eq "archive") { $num_archive++; $stop_link = "Restart"; $revise_link = ""; $archive_link = $tracking_link ."^^". $revise_link ."^^". $stop_link ."^^". $remove_link; $archive_links{$num_archive} = $archive_link; next; } elsif ($tracking_suffix eq "grp") { $num_group++; $revise_link = "Revise"; $stop_link = "Archive"; $group_link = $tracking_link ."^^". $revise_link ."^^". $stop_link ."^^". $remove_link; $group_links{$num_group} = $group_link; next; } else { $stop_link = "Archive"; } printf " %-56s %-8s %-8s %-8s\n", $tracking_link, $revise_link, $stop_link, $remove_link; } else { next; } } } } if ($num_group > 0) { print "\nGroup Trackings:\n\n"; @sorted_groups = sort (keys %group_links); foreach $num_archive (@sorted_groups) { ($tracking_link,$revise_link,$stop_link,$remove_link) = split(/\^\^/,$group_links{$num_archive}); printf " %-56s %-6s %-8s %-8s\n", $tracking_link, $revise_link, $stop_link, $remove_link; } } if ($num_archive > 0) { print "\nArchived Trackings:\n\n"; @sorted_archives = sort (keys %archive_links); foreach $num_archive (@sorted_archives) { ($tracking_link,$revise_link,$stop_link,$remove_link) = split(/\^\^/,$archive_links{$num_archive}); printf " %-56s %-6s %-8s %-8s\n", $tracking_link, $revise_link, $stop_link, $remove_link; } } print "
"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n";