Here's an example of a thread that scries ames for the IP address & port of a ship and nicely prints it:


/- spider
/+ strandio
=, strand=strand:spider
=, strand-fail=strand-fail:libstrand:spider
++ process-lanes
|= [target=@p lanes=(list lane:ames)]
=/ m (strand ,~)
^- form:m
?~ `(list lane:ames)`lanes
%- (slog leaf+"No route for {(scow %p target)}." ~)
(pure:m ~)
=/ lroute (skip lanes |=(a=lane:ames -.a))
?~ lroute
%- (slog leaf+"No direct route for {(scow %p target)}." ~)
(pure:m ~)
=/ ip +:(scow %if p.i.lroute)
=/ port (skip (scow %ud (cut 5 [1 1] p.i.lroute)) |=(a=@tD =(a '.')))
%- (slog leaf+"{ip}:{port}" ~)
(pure:m ~)
^- thread:spider
|= arg=vase
=/ m (strand ,vase)
^- form:m
=/ utarget !< (unit @p) arg
?~ utarget
(strand-fail %no-arg ~)
=/ target u.utarget
;< lanes=(list lane:ames) bind:m (scry:strandio (list lane:ames) /ax//peers/(scot %p target)/forward-lane)
;< ~ bind:m (process-lanes target lanes)
(pure:m !>(~))

Note: Pretty useless on a fake ship.

Save as ted/get-ip.hoon in the %base desk, |commit %base, and run it with -get-ip ~bitbet-bolbel. You should see something like:


Here we use the strandio function scry which takes an argument of [mold path] where:

  • mold is the return type of the scry
  • path is the scry path formatted like:
    1. vane letter and care
    2. desk if scrying arvo or agent if scrying a gall agent
    3. rest of path

In our case the mold is (list lane:ames) and the path is /ax//peers/(scot %p target)/forward-lane like:

;< lanes=(list lane:ames) bind:m (scry:strandio (list lane:ames) /ax//peers/(scot %p target)/forward-lane)

After that we just process the result in ++ process-lanes and print it.