On Wed, 1 Oct 2003, Zach Dennis wrote:

> Ok, silly question.
>
> I am writing a script to determine my router's WAN ip address and then to
> email me once an hour in case it changes. Currently I am running a web
> server at work that returns a page with the client's ip address. I need to
> parse out the info on the page so I can extract the ip address of my router
> when my script/program connects.

check out dyndns.org - they have scripts for just about every router that does
this.

> I am using the html-parser, sgml-parser and formatter ruby libraries
> provided from raa and I have made the changes to the regexp regarding image
> width and height. So I'm good there.
>
> In my test.rb file I say:
> ------------------------------------------------
> h = Net::HTTP.new('www.zachstestip.com' , 80 )
> resp,data = h.get('/index.php' , nil )
>
> w = DumbWriter.new
> f = AbstractFormatter.new(w)
> p = HTMLParser.new(f)
> p.feed(data)
> p.close
> ------------------------------------------------

one thing i might point out here - i myself have spent hours trying to figure
out weird bugs after naming a variable 'p'.  worth a check...

> Here comes the silly part. The function "feed" is inherited by sgml-parser
> to html-parser. It passes "data" along to the sgml-parser function
> "goahead". It prints everything to stdout or stderr( i dont know, but it
> makes it to my screen =), but there is no print, put, etc... etc... call to
> send it there!!! I cant for the life of me determine where in the feed or
> goahead functions are outputting my parsed results from data! This is damn
> silly of me to ask I know, but how is it getting to my CLI?
>
> In the "goahead" function there is a giant while loop. If i place a print or
> puts statement at the right before the loop and right after the loop, then
> nothing is outputted( except for my explicit print/puts statements).

you could also try something like this to track the problem:

  alias __p p
  alias __print print
  alias __puts puts

  def p(*args);STDERR.p(caller.join("\n")); __p(*args);end
  def print(*args);STDERR.print(caller.join("\n")); __print(*args);end
  def puts(*args);STDERR.puts(caller.join("\n")); __puts(*args);end

i'm note sure you'd need all three but...  you get the picture.

-a
  ====================================
  | Ara Howard
  | NOAA Forecast Systems Laboratory
  | Information and Technology Services
  | Data Systems Group
  | R/FST 325 Broadway
  | Boulder, CO 80305-3328
  | Email: ara.t.howard / noaa.gov
  | Phone:  303-497-7238
  | Fax:    303-497-7259
  | The difference between art and science is that science is what we understand
  | well enough to explain to a computer.  Art is everything else.
  |   -- Donald Knuth, "Discover"
  | ~ > /bin/sh -c 'for lang in ruby perl; do $lang -e "print \"\x3a\x2d\x29\x0a\""; done'
  ====================================