#!/usr/bin/perl -Imodules

use Spider::Easyspider;	
use Spider::Easymirror;	
use Spider::Parser;
use Getopt::Long;
use Tie::File;
use Proc::Fork;
use Cwd;

################## BUGS ####################

unlink "links.txt";		# aus &linktiefe_scanner_threads()
system("clear");
system("cls");

# Hole übergebene Parameter
GetOptions (	"config=s"	=> \$config,   
	 );  

if (!defined($config)) {

	print "\nHELP: perl $0 --config=easyspider.cfg \n";
	exit;

} 

# generiere neues spider objekt
my $spider = Spider::Easyspider->new($config);

# todo: alle variablen, die nur einen wert zurückgeben auf die chomp() - anwenden
my $url 	= $spider->cfg_url;
my $follow_flag = $spider->cfg_followlinks;
my $store	= $spider->cfg_storelocal;
my $pagecount 	= $spider->cfg_pages;
my $lang 	= $spider->cfg_lang;
my $dir_depth 	= $spider->verzeichnistiefe($url);
my $link_depth 	= $spider->cfg_ldepth;
my $path_depth 	= $spider->cfg_pdepth;
my $debug 	= $spider->cfg_debug;
my $output 	= $spider->cfg_output;
my $OS		= $spider->cfg_os;
my $tmp		= $spider->cfg_tmp;
my $pdf_convert	= $spider->cfg_pdfconverter;
my $doc_convert	= $spider->cfg_docconverter;
my $link_count;

my $html 	= $spider->http_get($url);
my $filetype 	= $spider->is_filetype($url);
my @links 	= $spider->get_links($html, $url);	# url muss angegeben werden, damit aus relativen absulute links gemacht werdn können
my %metakeys 	= $spider->get_metakeys($html);
my @title 	= $spider->get_title($html);
my @raw_head 	= $spider->rawget_head($html);
my @head 	= $spider->get_head($html);
my @raw_body 	= $spider->rawget_body($html);
my @body 	= $spider->get_body($html);
my $hostname	= $spider->get_hostname($url);

######### chomp()- Reigen eröffnen #######
chomp($lang, $store, $hostname, $tmp, $OS, $pdf_convert, $doc_convert);

# als output wird zz in reinem text gespeichert
# die starturl wird noch nicht gespeichert -> kein bug!!
# nur die folgenden daten werden erfasst

&linktiefe_scanner_nothreads($url, "spider", $link_depth, @links);

exit;

############ Subroutine zur Bearbeitung der Linktiefe, kann nicht als OO implementiert werden -> zu großer aufwand
# Aufgabe: &linktiefe_scanner: Scanne starturl von linktiefe 0 bis $depth, folge externen links /(nicht) 
# Rückgabe: 1

sub linktiefe_scanner_nothreads {

	# url | spider/mirror or spider mirror | INT | @links
	my ($starturl, $flag, $depth, @links) = @_;
	my $i,$link, $working_link;
	
#	tie @tied_links, 'Tie::File', "links.txt" or die "&linktiefe() - Cannot create File:!\n";

	for ($i = 0; $i <= $depth ; $i++) {
		
		foreach $link (@links) {
			push(@working_links, "$i $link");
		}

		undef @links; # free memory
		
		# links aus tiefe X = 0 in getied array @tied_links speichern
		push(@tied_links, @working_links);
		
		# Start: für jeden link aus dem an &linktiefe übergeben link tue ...
		foreach $working_link (@working_links){
			
			if ($pagecount == $link_count) {
				
				print "Maximale Anzahl zu scannende Links erreicht - beende mich!\n" if ($lang eq "DE");
				print "Maximum number of links to scan reached - exiting!\n" if ($lang eq "EN");
				exit;
			
			};
			
			$link_count++;
					
			# splitte die einträge auf in [INT] [URL]
			my ($tmp_depth, $tmp_url) = split(' ', $working_link);

			# bestimme die gleichheit der zwei urls
			my $is_same = $spider->is_same_host($starturl, $tmp_url);
				
			#
			# dont follow foreign links
			#
			if ( ($follow_flag == "0") && ($is_same == "1") ) {
				
				next if ($tmp_url =~ /javascript/);
				next if ($tmp_url !~ /^http/);
				
				($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
				$year = $year + 1900;
				$mon = $mon + 1;
				
				print "$year.$mon.$mday $hour:$min:$sec [Link: $link_count][Depth:$i] Scanne $tmp_url\n" if ($lang eq "DE");
				print "$year.$mon.$mday $hour:$min:$sec [Link: $link_count][Depth:$i] Scanning $tmp_url\n" if ($lang eq "EN");
				
				push(@tmp_links, &CLIENT_get_links($tmp_url, $i, $link_count, $flag));	
			
			#
			# if we should follow foreign links
			#
			} elsif ($follow_flag == "1"){

				next if ($tmp_url =~ /javascript/);
				next if ($tmp_url !~ /^http/);
				
				($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
				$year = $year + 1900;
				$mon = $mon + 1;
				
				print "$year.$mon.$mday $hour:$min:$sec [Link: $link_count][Depth:$i] Scanne $tmp_url\n" if ($lang eq "DE");
				print "$year.$mon.$mday $hour:$min:$sec [Link: $link_count][Depth:$i] Scanning $tmp_url\n" if ($lang eq "EN");
				
				push(@tmp_links, &CLIENT_get_links($tmp_url, $i, $link_count, $flag));	
			
			} else { 
				#
				# never reached -> wenn configurationsdatei stimmt
				#	
			}

		} # foreach $working_link (@working_links){}

		# Algorithmus:	1.)löschen @working_links mit links aus tiefe X für $i
		#				2.)speichere @tmp_links mit Links aus tiefe x+1 in getied array @tied_links für durchgang $i
		#				3.)speichere @tmp_links mit links x+1 als neue @working_links für $i+1
		#				4.)lösche @tmp_links und gib speicher frei 
		#				5.)führe 1.) aus für $i+1 mit link depth $i+1

		undef @working_links; # free memory
#		push (@tied_links, @tmp_links);
		push (@working_links, @tmp_links);
		undef @tmp_links;

	} #for ($i = 0; $i <= $depth ; $i++) {}

#	untie @tied_links;
	return 1;

} # sub linktiefe_scanner_nothreads { }
############ Subroutine zur Bearbeitung der Linktiefe, kann nicht als OO implementiert werden -> zu großer aufwand


############# Subroutine zum Eprint "$store\n";insammeln von Links für übergebene URL: Start
# Aufgabe: &CLIENT_get_links_nothreads - erstelle neues Objekt und hole für übergebene url die links
# Rückgabe: @links mit links

sub CLIENT_get_links {
	
	my ($url, $current_depth, $linkanzahl, $flag) = @_;
	my ($obj_spider, $html, @links, $link);
	my $dir_done = "0";
	
	next if ($url !~ /^http/);

	tie @emails, 'Tie::File', "emails/real.emails.txt" or warn "&linktiefe() - Cannot create File:!\n";
	tie @maybe_emails, 'Tie::File', "emails/maybe.emails.txt" or warn "&linktiefe() - Cannot create File:!\n";
	
	my $spider = Spider::Easyspider->new($config);
	my $html =  $spider->http_get($url);
	my @links = $spider->get_links($html, $url);

	foreach $link (@links) {
		$link = "$current_depth " . $link;
	}

	@content = split('<', $html);
	
	foreach $line (@content){
		
		if ($line =~ m/([A-Z0-9]+[._]?){1,}[A-Z0-9]+\@(([A-Z0-9]+[-]?){1,}[A-Z0-9]+\.){1,}[A-Z]{2,4}$/ig ) {
                	print "Good email: $line\n";
			push(@emails, $line);
		} elsif ( $line =~ m/ AT /g ) {
                	print "Maybe email: $line\n";
			push(@maybe_emails, $line);
        	} elsif ($line =~ m/NOSPAM/ig) {
			print "Maybe email: $line\n";
			push(@maybe_emails, $line);
		} elsif ($line =~ m/\[at\]/ig) {
			print "Maybe Mail: $line\n";
			push(@maybe_emails, $line);
		} elsif ($line =~ m/\[dot\]/ig) {
			print "Maybe Mail: $line\n";
			push(@maybe_emails, $line);
		} elsif ($line =~ m/DOT/g) {
			print "Maybe Mail: $line\n";
			push(@maybe_emails, $line);
		} elsif ($line =~ m/\@\@/ig) {
			print "Maybe Mail: $line\n";
			push(@maybe_emails, $line);
		}

	}
	
	untie @emails;
	untie @maybe_emails;
	return @links;
	
} # sub CLIENT_get_links_nothreads {}
############# Subroutine zum Einsammeln von Links für übergebene URL: Start
