From a6da4e0855b2c0367f1a9a25f803b161145c37d9 Mon Sep 17 00:00:00 2001 From: Henry Ault Date: Sat, 25 Apr 2015 11:23:34 -0700 Subject: [PATCH] digocean api --- main/app/do/core.hook | 128 ++++++++++++++++++++++++++++++++++++++ main/pub/do/fab/hymn.hook | 29 +++++++++ main/pub/do/src/main.css | 0 main/pub/do/src/main.js | 46 ++++++++++++++ 4 files changed, 203 insertions(+) create mode 100644 main/app/do/core.hook create mode 100644 main/pub/do/fab/hymn.hook create mode 100644 main/pub/do/src/main.css create mode 100644 main/pub/do/src/main.js diff --git a/main/app/do/core.hook b/main/app/do/core.hook new file mode 100644 index 000000000..5634a6679 --- /dev/null +++ b/main/app/do/core.hook @@ -0,0 +1,128 @@ +:: digital ocean fleet management +:: +:::: + :: +/? 310 +:: +:: +:::: sivtyv-barnel + :: + ::id=@ud name=@t memory=@ud vcpu=@ud disk=@ud locked=@f created=@t status=@t backup-ids=json snapshot-ids=json features=json region=json image=json size=json size-slug=@t networks=json kernel=json next-backup-window=@t]) + +!: +|% +++ droplet ,~ +++ axle ,[ke=keys toke=tokens drops=(list droplet)] +++ keys ,[authc=(unit ,@t) client-secret=(unit ,@t)] +++ tokens ,[access=@t refresh=@t] +++ droplet (unit ,@) +++ move ,[bone (mold note gift)] +++ note +$: %e + %them +(unit hiss) +== +++ gift +$% [%nice ~] + [%rush %json json] +== +++ sign +$: %e +$% [%thou p=httr] +== == + + +-- +!: +|_ [hid=hide vat=axle] +++ auth-queries + :~ 'grant_type'^'authorization_code' + 'code'^(need authc.ke.vat) + :- 'client_id' + 'd8f46b95af38c1ab3d78ad34c2157a6959c23eb0eb5d8e393f650f08e6a75c6f' + 'redirect_uri'^'http://localhost:8443/main/pub/do/fab' + == +++ httpreq + |= $: ost=bone pour-path=wire + domain=(list cord) end-point=path + req-type=$?(%get %post) headers=math + queries=quay + == + ^- move + =+ ^- parsed-url=purl + :+ ^= host-port :: ++hart + :+ security=%.y + port=~ + host=[%.y [path=[%com domain]]] + endpoint=[extensions=~ point=end-point] :: ++pork, + q-strings=queries :: ++quay + =+ ^- request=hiss :: cast to hiss + :- parsed-url + [req-type headers ~] :: post + :^ ost %pass pour-path + :+ %e %them + `(unit hiss)`[~ request] +++ prep ,_`. :: wipe state when app code is changed +:: +++ peer + |= [ost=bone you=ship pax=path] + ^- [(list move) _+>.$] + :_ +>.$ + [ost %give %rush %json ~]~ +:: +++ poke-oauth2-code + |= [ost=bone you=ship code=cord] + ^- [(list move) _+>.$] + =. authc.ke.vat + [~ code] + =+ ath=(need authc.ke.vat) + :_ +>.$ + [ost %give %nice ~]~ +:: +++ poke-client-secret + |= [ost=bone you=ship secret=cord] + ^- [(list move) _+>.$] + ~& 'pokeclientsecret' + =. client-secret.ke.vat + [~ secret] + ~& client-secret.ke.vat + :_ +>.$ + :_ [ost %give %nice ~]~ + %^ httpreq ost /auth + :^ ~[%digitalocean %cloud] `path`/v1/oauth/token + %post + :- ~ `quay`['client_secret'^(need client-secret.ke.vat) auth-queries] +:: +++ pour + |= [ost=bone pour-path=path resp=sign] + ^- [(list move) _+>.$] + ?+ -.pour-path !! + %auth + =+ body=(rash q:(need r.p.+.resp) apex:poja) + =+ [ac re]=(need ((ot 'access_token'^so 'refresh_token'^so ~):jo body)) + =: access.toke.vat ac + refresh.toke.vat re + == + ~& toke.vat + :_ +>.$ + :- [ost %give %nice ~] + [(list-droplets ost)]~ + :: + %list + :_ +>.$ + =+ parsed=(rash q:(need r.p.+.resp) apex:poja) + =+ dar=((ot droplets/(ar some) ~):jo parsed) + ~& [dar/dar] + [ost %give %nice ~]~ + == +++ list-droplets + |= os=bone + =+ ^= lis :* + os /list + ~[%digitalocean %api] /v2/droplets + %get + (mo ['Content-Type' 'application/json' ~] ['Authorization' (cat 3 'Bearer ' access.toke.vat) ~] ~) + ~ + == + (httpreq lis) +-- diff --git a/main/pub/do/fab/hymn.hook b/main/pub/do/fab/hymn.hook new file mode 100644 index 000000000..420020867 --- /dev/null +++ b/main/pub/do/fab/hymn.hook @@ -0,0 +1,29 @@ +:: +:::: + :: +/? 310 +/= gas /$ fuel +:: +:::: + :: + !: +^- manx + +=+ authcode=(~(get by qix.gas) %'code') +;html + ;head + ;script@"/~/at/main/lib/urb.js"; + ;script: urb.appl = 'do' + ;script@"https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"; + ;script@"https://cdnjs.cloudflare.com/ajax/libs/react/0.12.2/react.js"; + ::;link/"/main/pub/do/src/main.css"(rel "stylesheet"); + ;title: DO Instance Tracker + == + ;body + ;* ?~ authcode ~ + :_ ~ + ;script: authcode='{(trip u.authcode)}'; console.log(authcode) + ;div#container; + ;script@"/main/pub/do/src/main.js"; + == +== diff --git a/main/pub/do/src/main.css b/main/pub/do/src/main.css new file mode 100644 index 000000000..e69de29bb diff --git a/main/pub/do/src/main.js b/main/pub/do/src/main.js new file mode 100644 index 000000000..d07ecba8b --- /dev/null +++ b/main/pub/do/src/main.js @@ -0,0 +1,46 @@ +recl = React.createClass +div = React.DOM.div +a = React.DOM.a +b = React.DOM.button +input = React.DOM.input + +Page = recl({ + handleClick: function(){ + if(window.authcode.length !== ''){ + urb.send({ + appl: "do", + data: window.authcode, + mark: "oauth2-code"}) + } else { console.log("nocode") } + }, + + sendSecret: function(){ + if($('#appsecret').val()) { + urb.send({appl: "do", + data: $('#appsecret').val(), + mark: "client-secret" + }) + } + }, + + render: function(){ + href = "https://cloud.digitalocean.com/v1/oauth/authorize?client_id=d8f46b95af38c1ab3d78ad34c2157a6959c23eb0eb5d8e393f650f08e6a75c6f&redirect_uri=http%3A%2F%2Flocalhost%3A8443%2Fmain%2Fpub%2Fdo%2Ffab&response_type=code&redirect_uri=http://localhost:8443/main/pub/do/fab&scope=read+write" + return (div({}, [ + div({}, + a({href:href},[ + "get authcode", + b({onClick:this.handleClick}, "Send Authcode") + ]) + ), + div({}, [ + input({id:"appsecret"}, + b({onClick:this.sendSecret}, "Send Secret")) + ]) + ]) + ) + } +}) + +mounted = React.render(Page({}), $("#container")[0]) +urb.bind("/", function(err,d) { +return})