--- /dev/null
+module("luci.controller.cjdns", package.seeall)
+
+cjdns = require "cjdns/init"
+dkjson = require "dkjson"
+
+function index()
+ if not nixio.fs.access("/etc/config/cjdns") then
+ return
+ end
+
+ entry({"admin", "services", "cjdns"},
+ cbi("cjdns/overview"), _("cjdns")).dependent = true
+
+ entry({"admin", "services", "cjdns", "overview"},
+ cbi("cjdns/overview"), _("Overview"), 1).leaf = false
+
+ entry({"admin", "services", "cjdns", "peering"},
+ cbi("cjdns/peering"), _("Peers"), 2).leaf = false
+
+ entry({"admin", "services", "cjdns", "iptunnel"},
+ cbi("cjdns/iptunnel"), _("IP Tunnel"), 3).leaf = false
+
+ entry({"admin", "services", "cjdns", "settings"},
+ cbi("cjdns/settings"), _("Settings"), 4).leaf = false
+
+ entry({"admin", "services", "cjdns", "cjdrouteconf"},
+ cbi("cjdns/cjdrouteconf"), _("cjdroute.conf"), 5).leaf = false
+
+ entry({"admin", "services", "cjdns", "peers"}, call("act_peers")).leaf = true
+ entry({"admin", "services", "cjdns", "ping"}, call("act_ping")).leaf = true
+end
+
+function act_peers()
+ require("cjdns/uci")
+ admin = cjdns.uci.makeInterface()
+
+ local page = 0
+ local peers = {}
+
+ while page do
+ local response, err = admin:auth({
+ q = "InterfaceController_peerStats",
+ page = page
+ })
+
+ if err or response.error then
+ luci.http.status(502, "Bad Gateway")
+ luci.http.prepare_content("application/json")
+ luci.http.write_json({ err = err, response = response })
+ return
+ end
+
+ for i,peer in pairs(response.peers) do
+ peer.ipv6 = publictoip6(peer.publicKey)
+ if peer.user == nil then
+ peer.user = ''
+ uci.cursor():foreach("cjdns", "udp_peer", function(udp_peer)
+ if peer.publicKey == udp_peer.public_key then
+ peer.user = udp_peer.user
+ end
+ end)
+ end
+ peers[#peers + 1] = peer
+ end
+
+ if response.more then
+ page = page + 1
+ else
+ page = nil
+ end
+ end
+
+ luci.http.status(200, "OK")
+ luci.http.prepare_content("application/json")
+ luci.http.write_json(peers)
+end
+
+function act_ping()
+ require("cjdns/uci")
+ admin = cjdns.uci.makeInterface()
+
+ local response, err = admin:auth({
+ q = "SwitchPinger_ping",
+ path = luci.http.formvalue("label"),
+ timeout = tonumber(luci.http.formvalue("timeout"))
+ })
+
+ if err or response.error then
+ luci.http.status(502, "Bad Gateway")
+ luci.http.prepare_content("application/json")
+ luci.http.write_json({ err = err, response = response })
+ return
+ end
+
+ luci.http.status(200, "OK")
+ luci.http.prepare_content("application/json")
+ luci.http.write_json(response)
+end
+
+function publictoip6(publicKey)
+ local process = io.popen("/usr/bin/publictoip6 " .. publicKey, "r")
+ local ipv6 = process:read()
+ process:close()
+ return ipv6
+end