1 module handlers; 2 3 import app; 4 import vibe.vibe; 5 import libyggdrasil.libyggdrasil; 6 import std.net.curl; 7 import std.json; 8 import std.stdio; 9 import std.socket; 10 import std.string; 11 import collector; 12 13 void home(HTTPServerRequest request, HTTPServerResponse response) 14 { 15 /* Render the template */ 16 response.render!("index.dt"); 17 } 18 19 20 private string[] getKeys() 21 { 22 return d.getKeys(); 23 } 24 25 void peerlist(HTTPServerRequest request, HTTPServerResponse response) 26 { 27 /* Fetch the peers list from Arceliar's node */ 28 string[] peers = d.getKeys(); 29 30 ulong offset = to!(ulong)(request.query["offset"]); 31 peers = peers[offset..offset+10]; 32 33 /* Fetch node names */ 34 Address testNode = parseAddress("201:6c56:f9d5:b7a5:8f42:b1ab:9e0e:5169", 9090); 35 YggdrasilPeer yggPeer = new YggdrasilPeer(testNode); 36 37 /* Render the template */ 38 Collector collector = d; 39 response.render!("peerlist.dt", peers, collector, yggPeer, offset); 40 } 41 42 void peerinfo(HTTPServerRequest request, HTTPServerResponse response) 43 { 44 /* Fetch the key */ 45 /* TODO: Validate the key */ 46 string key = request.query["key"]; 47 48 Address testNode = parseAddress("201:6c56:f9d5:b7a5:8f42:b1ab:9e0e:5169", 9090); 49 YggdrasilPeer yggPeer = new YggdrasilPeer(testNode); 50 51 /* Fetch the node */ 52 YggdrasilNode yggNode = yggPeer.fetchNode(key); 53 54 /* Fetch the NodeInfo */ 55 NodeInfo nodeInfo = yggNode.getNodeInfo(); 56 57 string ip, name, group, country, operator, nodeInfoJSON; 58 59 if(nodeInfo) 60 { 61 /* TODO: Fix up yggdraisl library for this */ 62 ip = "nodeInfo.getAddress();"; 63 name = nodeInfo.getName(); 64 group = nodeInfo.getGroup(); 65 country = nodeInfo.getLocation(); 66 operator = nodeInfo.getContact(); 67 68 nodeInfoJSON = nodeInfo.getFullJSON().toPrettyString(); 69 70 writeln(request); 71 } 72 73 74 //response.writeBody(to!(string)(request)); 75 76 Collector collector = d; 77 78 /* Render the template */ 79 response.render!("peerinfo.dt", key, ip, name, group, operator, country, nodeInfoJSON, collector); 80 } 81 82 void buildinfo(HTTPServerRequest request, HTTPServerResponse response) 83 { 84 /* Fetch the key */ 85 /* TODO: Validate the key */ 86 string key = request.query["key"]; 87 88 Address testNode = parseAddress("201:6c56:f9d5:b7a5:8f42:b1ab:9e0e:5169", 9090); 89 YggdrasilPeer yggPeer = new YggdrasilPeer(testNode); 90 91 /* Fetch the node */ 92 YggdrasilNode yggNode = yggPeer.fetchNode(key); 93 94 /* Fetch the NodeInfo */ 95 NodeInfo nodeInfo = yggNode.getNodeInfo(); 96 JSONValue nodeinfo = nodeInfo.getFullJSON(); 97 98 string name = nodeinfo["buildname"].str(); 99 string platform = nodeinfo["buildplatform"].str(); 100 string arch = nodeinfo["buildarch"].str(); 101 string _version = nodeinfo["buildversion"].str(); 102 103 //response.writeBody(to!(string)(request)); 104 105 106 /* Render the template */ 107 response.render!("buildinfo.dt", key, name, platform, arch, _version); 108 } 109 110 void builddb(HTTPServerRequest request, HTTPServerResponse response) 111 { 112 /* Render the template */ 113 Collector collector = d; 114 response.render!("builddb.dt", collector); 115 } 116 117 void about(HTTPServerRequest request, HTTPServerResponse response) 118 { 119 /* Render the template */ 120 response.render!("about.dt", app.sourceCodeLink, app.moneroAddress, app._version); 121 } 122 123 void error(HTTPServerRequest request, HTTPServerResponse response, HTTPServerErrorInfo error) 124 { 125 /* Render the template */ 126 response.render!("error.dt", error); 127 } 128 129 130 /** 131 * API Handler 132 * 133 * This handles all requests in `/api/*` 134 */ 135 void apiHandler(HTTPServerRequest request, HTTPServerResponse response) 136 { 137 JSONValue resp; 138 139 /* Path */ 140 writeln(request.path); 141 142 143 resp["name"] = d.getPlatforms(); 144 response.writeBody(resp.toString()); 145 } 146 147 /** 148 * API Handlers below 149 */ 150 151 /** 152 * Handler for `/api/builddb` 153 * 154 * This returns buid information in the format: 155 * 156 * platforms: [ 157 { name: ' ', count: 0}, 158 ], 159 archs: [ 160 { name: ' ', count: 0}, 161 ], 162 versions: [ 163 { name: ' ', count: 0}, 164 ], 165 */ 166 void getbuilddb(HTTPServerRequest request, HTTPServerResponse response) 167 { 168 /* JSON response */ 169 JSONValue responseJSON; 170 171 172 /* Get all the platforms */ 173 JSONValue[] platformBlocks; 174 string[] platforms = d.getPlatforms(); 175 foreach(string platform; platforms) 176 { 177 JSONValue platformBlock; 178 platformBlock["name"] = platform; 179 platformBlock["count"] = d.getPlatformCount(platform); 180 181 platformBlocks ~= platformBlock; 182 } 183 responseJSON["platforms"] = platformBlocks; 184 185 /* Get all the architectures */ 186 JSONValue[] archBlocks; 187 string[] archs = d.getArchs(); 188 foreach(string arch; archs) 189 { 190 JSONValue archBlock; 191 archBlock["name"] = arch; 192 archBlock["count"] = d.getArchCount(arch); 193 194 archBlocks ~= archBlock; 195 } 196 responseJSON["archs"] = archBlocks; 197 198 /* Get all the versions */ 199 JSONValue[] versionBlocks; 200 string[] versions = d.getVersions(); 201 foreach(string _version; versions) 202 { 203 JSONValue versionBlock; 204 versionBlock["name"] = _version; 205 versionBlock["count"] = d.getVersionCount(_version); 206 207 versionBlocks ~= versionBlock; 208 } 209 responseJSON["versions"] = versionBlocks; 210 211 writeln(responseJSON); 212 213 /* Write back response */ 214 response.writeBody(responseJSON.toString()); 215 } 216 217 void getpeerinfo(HTTPServerRequest request, HTTPServerResponse response) 218 { 219 /* JSON response */ 220 JSONValue responseJSON; 221 222 223 224 /* Fetch the key */ 225 /* TODO: Validate the key */ 226 string key = request.query["key"]; 227 228 /* Fetch the NodeInfo */ 229 NodeInfo nodeInfo = d.getNodeInfo(key); 230 231 232 if(nodeInfo) 233 { 234 /* Set the response */ 235 JSONValue nodeInfoBlock; 236 nodeInfoBlock["name"] = nodeInfo.getName(); 237 nodeInfoBlock["domain"] = nodeInfo.getGroup(); 238 nodeInfoBlock["location"] = nodeInfo.getLocation(); 239 nodeInfoBlock["contact"] = nodeInfo.getContact(); 240 nodeInfoBlock["nodeinfo"] = nodeInfo.getFullJSON(); 241 responseJSON["response"] = nodeInfoBlock; 242 243 244 245 if(nodeInfo.isWellFormed()) 246 { 247 248 249 250 251 252 responseJSON["status"] = "ok"; 253 } 254 else 255 { 256 responseJSON["status"] = "malformed"; 257 } 258 } 259 else 260 { 261 responseJSON["status"] = "timeout"; 262 } 263 264 /* Write back response */ 265 response.writeBody(responseJSON.toString()); 266 } 267 268 /** 269 * Checks if a node is online 270 * 271 * /api/pingnode?key=<key> 272 */ 273 void pingnode(HTTPServerRequest request, HTTPServerResponse response) 274 { 275 /* JSON response */ 276 JSONValue responseJSON; 277 278 /* Fetch the key */ 279 /* TODO: Validate the key */ 280 string key = request.query["key"]; 281 282 Address testNode = parseAddress("201:6c56:f9d5:b7a5:8f42:b1ab:9e0e:5169", 9090); 283 YggdrasilPeer yggPeer = new YggdrasilPeer(testNode); 284 285 /* Fetch the node */ 286 YggdrasilNode yggNode = yggPeer.fetchNode(key); 287 288 /* Ping the node */ 289 responseJSON["online"] = yggNode.ping(); 290 291 /* Write the response */ 292 response.writeBody(responseJSON.toString()); 293 }