#!/usr/bin/perl use strict; use blib; use File::Spec; use Cwd; use Test::More tests => 8; use constant IP => '127.0.0.1'; use Nmap::Parser; my $np = new Nmap::Parser; can_ok( $np, 'cache_scan' ); can_ok( $np, 'parsescan' ); my $nmap_path = find_nmap(); SKIP: { skip '[Nmap-Parser] Could not find nmap executable in path', 6 if ( $nmap_path eq '' ); ok( $nmap_path, "Exe Path: $nmap_path" ); skip "[Nmap-Parser] No self scanning with MSWin32", 4 if ( $^O eq 'MSWin32' || $^O =~ /cygwin/ ); ok( $np->parsescan( $nmap_path, '-p 1-80', IP ), 'Running parsescan against ' . IP ); #if everything passed we can do another scan using the new cache_scan() function skip "[Nmap-Parser] Current user does not have read/write permissions in this directory.", 3 unless ( -w '.' && -r '.' ); my $cache_file = 'cache.' . ( rand(10000) % 10000 ) . '.xml'; $np->cache_scan($cache_file); ok( $np->parsescan( $nmap_path, '-p 1-80', IP ), 'Running parsescan /w cache enabled against ' . IP ); ok( -s $cache_file, 'Testing if cache file was created and written' ); ok( $np->parsefile($cache_file), 'Verifying cache file is nmap xml compatible.' ); is( unlink($cache_file), 1, 'Unlinking created cache file' ); } sub find_nmap { #I think I borrowed this from someone (or from a Cookbook) my $exe_to_find = 'nmap'; $exe_to_find =~ s/\.exe//; local ($_); local (*DIR); for my $dir ( File::Spec->path() ) { opendir( DIR, $dir ) || next; my @files = ( readdir(DIR) ); closedir(DIR); my $path; for my $file (@files) { $file =~ s/\.exe$//; next unless ( $file eq $exe_to_find ); $path = File::Spec->catfile( $dir, $file ); # Should symbolic link be considered? Helps me on cygwin but ... next unless -r $path && ( -x _ || -l _ ); return $path; last DIR; } } }