mirror of
https://github.com/urbit/shrub.git
synced 2024-12-23 19:05:48 +03:00
216 lines
6.0 KiB
Plaintext
216 lines
6.0 KiB
Plaintext
/- spider, dns
|
|
/+ threadio
|
|
=, thread=thread:spider
|
|
::
|
|
:: types and boilerplate
|
|
::
|
|
=> |%
|
|
++ collector-app `dock`[~zod %dns-collector]
|
|
+$ app-state
|
|
$: %0
|
|
requested=(unit address:dns)
|
|
completed=(unit binding:dns)
|
|
==
|
|
--
|
|
::
|
|
=< ^- imp:spider
|
|
|= [=bowl:spider vase]
|
|
=/ m (thread ,vase)
|
|
^- form:m
|
|
~& > 'Entering dns loop'
|
|
;< ~ bind:m
|
|
%- (main-loop:threadio ,app-state)
|
|
:~ handle-dns-auto
|
|
handle-dns-address
|
|
handle-diff
|
|
::
|
|
|= state=app-state
|
|
=/ m (thread ,app-state)
|
|
^- form:m
|
|
;< ~ bind:m
|
|
(rewatch:threadio /sub collector-app /(scot %p our.bowl))
|
|
(pure:m state)
|
|
==
|
|
(pure:m *vase)
|
|
::
|
|
:: monadic helpers (XX move to threadio?)
|
|
::
|
|
=> |%
|
|
++ request
|
|
|= =hiss:eyre
|
|
=/ m (thread ,(unit httr:eyre))
|
|
^- form:m
|
|
;< ~ bind:m (send-request:threadio (hiss-to-request:html hiss))
|
|
take-maybe-sigh:threadio
|
|
::
|
|
:: +self-check-http: confirm our availability at .host on port 80
|
|
::
|
|
:: XX needs better success/failure predicates
|
|
:: XX bind route to self and handle request inside tx?
|
|
::
|
|
++ self-check-http
|
|
|= [=host:eyre max=@ud]
|
|
=/ m (thread ,?)
|
|
^- form:m
|
|
:: XX also scry into eyre
|
|
:: q:.^(hart:eyre %e /(scot %p our)/host/real)
|
|
=/ =hiss:eyre
|
|
=/ url=purl:eyre
|
|
[[sec=| por=~ host] [ext=`~.udon path=/static] query=~]
|
|
[url %get ~ ~]
|
|
=/ try=@ud 0
|
|
|- ^- form:m
|
|
=* loop $
|
|
?: =(try max)
|
|
(pure:m |)
|
|
;< ~ bind:m (backoff:threadio try ~h1)
|
|
;< rep=(unit httr:eyre) bind:m (request hiss)
|
|
?: ?& ?=(^ rep)
|
|
|(=(200 p.u.rep) =(307 p.u.rep))
|
|
==
|
|
(pure:m &)
|
|
?. ?| ?=(~ rep)
|
|
=(504 p.u.rep)
|
|
==
|
|
(pure:m |)
|
|
loop(try +(try))
|
|
::
|
|
++ app-message
|
|
|= [app=term =cord =tang]
|
|
=/ m (thread ,~)
|
|
^- form:m
|
|
=/ msg=tape :(weld (trip app) ": " (trip cord))
|
|
;< ~ bind:m (flog-text:threadio msg)
|
|
(flog-tang:threadio tang)
|
|
--
|
|
::
|
|
:: application actions
|
|
::
|
|
=> |%
|
|
:: +turf-confirm-install: self check and install domain
|
|
::
|
|
++ turf-confirm-install
|
|
|= =turf
|
|
=/ m (thread ,?)
|
|
^- form:m
|
|
;< good=? bind:m (self-check-http &+turf 5)
|
|
?. good
|
|
(pure:m |)
|
|
;< ~ bind:m (install-domain:threadio turf)
|
|
(pure:m &)
|
|
::
|
|
:: +galaxy-domains
|
|
::
|
|
++ galaxy-domains
|
|
=/ m (thread ,~)
|
|
^- form:m
|
|
;< our=@p bind:m get-our:threadio
|
|
;< now=@da bind:m get-time:threadio
|
|
=/ ames-domains=(list turf)
|
|
.^((list turf) %j /(scot %p our)/turf/(scot %da now))
|
|
|- ^- form:m
|
|
=* loop $
|
|
?~ ames-domains
|
|
(pure:m ~)
|
|
=/ =turf
|
|
(weld i.ames-domains /(crip +:(scow %p our)))
|
|
;< good=? bind:m (turf-confirm-install turf)
|
|
=/ msg=(pair cord tang)
|
|
?: good
|
|
[(cat 3 'confirmed access via ' (en-turf:html turf)) ~]
|
|
:- (cat 3 'unable to access via ' (en-turf:html turf))
|
|
:~ leaf+"XX check via nslookup"
|
|
leaf+"XX confirm port 80"
|
|
==
|
|
;< ~ bind:m (app-message %dns msg)
|
|
loop(ames-domains t.ames-domains)
|
|
::
|
|
:: +request-by-ip
|
|
::
|
|
++ request-by-ip
|
|
|= if=@if
|
|
=/ m (thread ,?)
|
|
^- form:m
|
|
;< good=? bind:m (self-check-http |+if 5)
|
|
?. good
|
|
:: XX details
|
|
~& %bail-early
|
|
(pure:m |)
|
|
;< ~ bind:m (poke:threadio collector-app %dns-address !>([%if if]))
|
|
=/ msg=cord
|
|
(cat 3 'request for DNS sent to ' (scot %p p:collector-app))
|
|
;< ~ bind:m (app-message %dns msg ~)
|
|
;< our=@p bind:m get-our:threadio
|
|
;< ~ bind:m (watch:threadio /sub collector-app /(scot %p our))
|
|
=/ msg=cord
|
|
(cat 3 'awaiting response from ' (scot %p p:collector-app))
|
|
;< ~ bind:m (app-message %dns msg ~)
|
|
(pure:m &)
|
|
--
|
|
::
|
|
|%
|
|
++ handle-dns-auto
|
|
|= state=app-state
|
|
=/ m (thread ,app-state)
|
|
^- form:m
|
|
;< =vase bind:m
|
|
((handle:threadio ,vase) (take-poke:threadio %dns-auto))
|
|
;< our=ship bind:m get-our:threadio
|
|
?. ?=(%czar (clan:title our))
|
|
~& %not-galaxy
|
|
(pure:m state)
|
|
;< ~ bind:m galaxy-domains
|
|
(pure:m state)
|
|
::
|
|
++ handle-dns-address
|
|
|= state=app-state
|
|
=/ m (thread ,app-state)
|
|
^- form:m
|
|
~& %stuff
|
|
;< =vase bind:m
|
|
((handle:threadio ,vase) (take-poke:threadio %dns-address))
|
|
=/ adr !<(address:dns vase)
|
|
~& [%dns-stuff adr]
|
|
;< our=ship bind:m get-our:threadio
|
|
=/ rac (clan:title our)
|
|
?. ?=(?(%king %duke) rac)
|
|
~| [%dns-collector-bind-invalid rac] !!
|
|
?: (reserved:eyre if.adr)
|
|
~| [%dns-collector-reserved-address if.adr] !!
|
|
;< requested=? bind:m (request-by-ip if.adr)
|
|
:: XX save failure?
|
|
::
|
|
~? =(requested.state (some adr))
|
|
%re-requesting
|
|
=? requested.state requested
|
|
(some adr)
|
|
(pure:m state)
|
|
::
|
|
++ handle-diff
|
|
|= state=app-state
|
|
=/ m (thread ,app-state)
|
|
^- form:m
|
|
;< our=ship bind:m get-our:threadio
|
|
;< =cage bind:m
|
|
((handle:threadio ,cage) (take-fact:threadio /(scot %p our)))
|
|
?> ?=(%dns-binding p.cage)
|
|
=/ =binding:dns !<(binding:dns q.cage)
|
|
?~ requested.state
|
|
~| %unexpected-binding-wat-do !!
|
|
?. =(u.requested.state address.binding)
|
|
~| %mismatch-binding-wat-do !!
|
|
;< good=? bind:m (turf-confirm-install turf.binding)
|
|
=/ msg=(pair cord tang)
|
|
?: good
|
|
[(cat 3 'confirmed access via ' (en-turf:html turf.binding)) ~]
|
|
:- (cat 3 'unable to access via ' (en-turf:html turf.binding))
|
|
:~ leaf+"XX check via nslookup"
|
|
leaf+"XX confirm port 80"
|
|
==
|
|
;< ~ bind:m (app-message %dns msg)
|
|
=? completed.state good (some binding)
|
|
:: XX save failure?s
|
|
:: XX unsubscribe?
|
|
(pure:m state)
|
|
--
|