Thanks for the help John. I have made the changes you suggested and managed to get everything working properly. One more question though that is completely different, how do I allow users to specify switches on the command line in any order to be used in my program. For example, I want the syntax to be ./ipcheck.pl <ip> <port> {options specified in any order}. I know I can get the value for the ip using $ip=$ARGV[0] and port using $port=$ARGV[1] but how would I get the remaining options?
Example to help clarify: ./ipcheck 10.10.10.1 80 -n -a -r where -n -a -r are options in no particular order, 10.10.10.1 is the ip and 80 is the port. On Sun, Nov 30, 2008 at 11:17 PM, John W. Krahn <[EMAIL PROTECTED]> wrote: > blake askew wrote: > >> I am new to perl and attempting to write a script that will do a reverse >> dns >> lookup on an ip, store this result into a file, then read the file in >> order >> to do a whois lookup. The whois lookup answer should also be written to a >> seperate file. I have the reverse dns lookup working, but when I also call >> my whois subroutine, nothing is written to file for the the reverse dns (I >> get a file size of 0). Can someone tell me where I am going wrong here? >> >> >> #!/usr/bin/perl >> > > use warnings; > use strict; > > # >> # repeat outbound connection check >> # usage: ./ipcheck.pl <ip> >> # ARGV[0] = ip address >> >> # required for reverse DNS lookup, whois >> # to install, as root run: perl -MCPAN -e 'install Net::<module_name>' >> use strict; >> use Net::DNS; >> use Net::IP; >> use Net::ParseWhois; >> >> #check for user input and print usage instructions if nothing is supplied >> if (@ARGV <= 0) >> > > An array can never have a value less than 0. > > > { >> die ("Usage: ./ipcheck.pl <ip> <options>:\n"); >> } >> >> # get ip address from command line input >> my $ip = $ARGV[0]; >> >> print ("Creating results file $ip-results.txt\n"); >> #call file creation subroutine >> #&createfile; >> >> print ("Attempting reverse DNS lookup\n"); >> # call reverse DNS lookup subroutine >> &reversedns; >> > > The proper form for calling a subroutine in perl is: > > reversedns(); > > > print ("Attempting whois lookup\n"); >> #call whois subroutine >> &whois; >> >> print ("Program executed successfully"); >> # >> >> -----------------------------subroutines------------------------------------------ >> >> # create file subroutine >> sub createfile { >> >> # opens the <ip>-results.txt file to write the resuls to. Prints error >> message if file cannot be opened >> # prints results to the dir thescript is ran from >> open (RESULTS, ">$ip-results.txt") || die ("Could not open results file"); >> > > You should include the $! variable in the error message so you know *why* > it failed. You might also want to include the file name so you know which > file could not be opened. > > > } >> >> # reverse dns subroutine >> sub reversedns { >> >> #open file to write to <ip>-results-reverse-dns.txt >> open (RESULTSDNS, ">$ip-results-reverse-dns.txt") || die ("Could not >> open results file"); >> > > See advice above for previous open(). > > > #gets the ip address from the command line >> my $ip = $ARGV[0]; >> >> # Creates a resolver for resolving the reverse DNS lookup. >> my $res = Net::DNS::Resolver->new; >> >> # Creates an IP object. >> my $target= new Net::IP($ip) or die("Unable to ip object for $ip\n"); >> >> # create the reverse lookup DNS name >> # octets in the IP address need to be reversed). >> my $target_IP = join('.', reverse split(/\./, >> $target->ip())).".in-addr.arpa"; >> >> # Perform a query on the produced name. (note we want the PTR records >> for the name). >> my $q = $res->query("$target_IP", "PTR"); >> > > perldoc -q quoting > > > if($q) >> { >> # If the query on the produced name is valid then get the >> answer. >> my $r = ($q->answer)[0]; >> >> # If the query returns a result other than the PTR record, >> print error and die. >> if($r->type ne "PTR") >> { >> die ("Error: query returned result other than PTR >> record"); >> } >> >> # prints the answer to file (<ip>-results-reverse-dns.txt) >> print RESULTSDNS ($r->rdatastr."\n"); >> # close file when done writing >> #close (RESULTSDNS); >> } >> } >> >> # whois subroutine >> sub whois { >> >> # open file to read in reverse dns answer >> open (RESULTSRDNS, "$ip-results-reverse-dns.txt") || die ("Could not >> open reverse dns results file to read in reverse dns answer"); >> > > See advice above for previous open(). > > > # read in reverse dns answer to use as domain variable from >> <ip>-results.txt >> my @domain = <RESULTSRDNS>; >> >> # closes the file when done reading >> close (RESULTSRDNS); >> >> while (my @domain == "") >> > > You are creating a new empty @domain variable and then comparing it > numerically to a string so inside this while loop @domain will always be > empty and the loop will never end. > > > { >> >> #open the file to write to >> open (RESULTSWHOIS, ">$ip-results-whois.txt") || die ("Could not open >> temp results file for writing whois information"); >> > > See advice above for previous open(). > > > my $soa_domain; >> >> FIND_SOA: { >> my $res = new Net::DNS::Resolver; >> >> my $q = $res->send(@domain, "SOA"); >> >> for my $sec (qw(answer authority)) >> { >> my $meth = $q->can($sec) or next; >> >> for my $rec ($meth->($q)) >> { >> next unless $rec->isa('Net::DNS::RR::SOA'); >> >> $soa_domain = $rec->name; >> >> last FIND_SOA if $soa_domain; >> } >> } >> } >> >> #die "Couldn't find SOA for $domain\n" unless defined $soa_domain; >> $soa_domain ||= @domain; >> > > If $soa_domain is 0 or empty you are assigning it the number of elements of > @domain? > > > > my $whois = new Net::ParseWhois::Domain($soa_domain); >> warn "Couldn't connect to Whois server$/", next unless $whois; >> warn "No Whois match for $soa_domain$/", next unless $whois->ok; >> >> # print out whois match >> print RESULTSWHOIS ("Whois Information:\n"); >> print RESULTSWHOIS "Whois Server: ", $whois->whois_server, $/; >> print RESULTSWHOIS $/; >> >> print RESULTSWHOIS "Registrar: ", $whois->registrar, $/; >> print RESULTSWHOIS "Domain: ", $whois->domain, $/; >> print RESULTSWHOIS "Name: ", $whois->name, $/; >> print RESULTSWHOIS "Tag: ", $whois->tag, $/; >> print RESULTSWHOIS $/; >> >> print RESULTSWHOIS "Address:", $/; >> print RESULTSWHOIS "\t", $_, $/ for $whois->address; >> print RESULTSWHOIS $/; >> >> print RESULTSWHOIS "Country: ", $whois->country, $/; >> print RESULTSWHOIS $/; >> >> print RESULTSWHOIS "Name Servers:", $/; >> printf RESULTSWHOIS "\t%s (%s)$/", @$_ for @{$whois->servers}; >> print RESULTSWHOIS $/; >> >> if (my $c = $whois->contacts) >> { >> print RESULTSWHOIS "Contacts:", $/; >> for my $t (sort keys %$c) >> { >> print RESULTSWHOIS " " x 4, $t, ":", $/; >> print RESULTSWHOIS "\t", $_, $/ for @{$c->{$t}}; >> } >> print RESULTSWHOIS $/; >> } >> >> print RESULTSWHOIS "Record created: ", $whois->record_created, $/; >> print RESULTSWHOIS "Record updated: ", $whois->record_updated, $/; >> print RESULTSWHOIS "Record expires: ", $whois->record_expires, $/; >> >> print RESULTSWHOIS "=" x 76, $/ if @ARGV; >> > > Why are you using $/ instead of "\n"? > > > # close the file when done writing >> close (RESULTSWHOIS); >> } >> } >> > > > John > -- > Perl isn't a toolbox, but a small machine shop where you > can special-order certain sorts of tools at low cost and > in short order. -- Larry Wall > > -- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > http://learn.perl.org/ > > >