⚡ add tool for getting property tree from fgfs
by using --httpd in fgfs
This commit is contained in:
parent
2ea9e03522
commit
433743f790
|
@ -1,22 +1,22 @@
|
||||||
use std.dylib;
|
use std.dylib;
|
||||||
|
|
||||||
var socket=func(){
|
var socket = func() {
|
||||||
var lib=dylib.dlopen("libnasock"~(os.platform()=="windows"?".dll":".so"));
|
var lib = dylib.dlopen("libnasock"~(os.platform()=="windows"? ".dll":".so"));
|
||||||
|
|
||||||
var sock=lib.nas_socket;
|
var sock = lib.nas_socket;
|
||||||
var closesocket=lib.nas_closesocket;
|
var closesocket = lib.nas_closesocket;
|
||||||
var shutdown=lib.nas_shutdown;
|
var shutdown = lib.nas_shutdown;
|
||||||
var bind=lib.nas_bind;
|
var bind = lib.nas_bind;
|
||||||
var listen=lib.nas_listen;
|
var listen = lib.nas_listen;
|
||||||
var connect=lib.nas_connect;
|
var connect = lib.nas_connect;
|
||||||
var accept=lib.nas_accept;
|
var accept = lib.nas_accept;
|
||||||
var send=lib.nas_send;
|
var send = lib.nas_send;
|
||||||
var sendto=lib.nas_sendto;
|
var sendto = lib.nas_sendto;
|
||||||
var recv=lib.nas_recv;
|
var recv = lib.nas_recv;
|
||||||
var recvfrom=lib.nas_recvfrom;
|
var recvfrom = lib.nas_recvfrom;
|
||||||
var errno=lib.nas_errno;
|
var errno = lib.nas_errno;
|
||||||
|
|
||||||
var (invoke,invoke_i,invoke_ii,invoke_iii,invoke_iiii,invoke_iiiii)=(
|
var (invoke, invoke_i, invoke_ii, invoke_iii, invoke_iiii, invoke_iiiii) = (
|
||||||
dylib.limitcall(0),
|
dylib.limitcall(0),
|
||||||
dylib.limitcall(1),
|
dylib.limitcall(1),
|
||||||
dylib.limitcall(2),
|
dylib.limitcall(2),
|
||||||
|
@ -26,36 +26,37 @@ var socket=func(){
|
||||||
);
|
);
|
||||||
return {
|
return {
|
||||||
AF_UNSPEC:0,
|
AF_UNSPEC:0,
|
||||||
AF_UNIX:1,
|
AF_UNIX: 1,
|
||||||
AF_INET:2,
|
AF_INET: 2,
|
||||||
AF_IMPLINK:3,
|
AF_IMPLINK: 3,
|
||||||
AF_PUP:4,
|
AF_PUP: 4,
|
||||||
AF_CHAOS:5,
|
AF_CHAOS: 5,
|
||||||
AF_IPX:6,
|
AF_IPX: 6,
|
||||||
AF_NS:6,
|
AF_NS: 6,
|
||||||
AF_ISO:7,
|
AF_ISO: 7,
|
||||||
AF_OSI:7,
|
AF_OSI: 7,
|
||||||
AF_ECMA:8,
|
AF_ECMA: 8,
|
||||||
AF_DATAKIT:9,
|
AF_DATAKIT: 9,
|
||||||
AF_CCITT:10,
|
AF_CCITT: 10,
|
||||||
AF_SNA:11,
|
AF_SNA: 11,
|
||||||
AF_DECnet:12,
|
AF_DECnet: 12,
|
||||||
AF_DLI:13,
|
AF_DLI: 13,
|
||||||
AF_LAT:14,
|
AF_LAT: 14,
|
||||||
AF_HYLINK:15,
|
AF_HYLINK: 15,
|
||||||
AF_APPLETALK:16,
|
AF_APPLETALK: 16,
|
||||||
AF_NETBIOS:17,
|
AF_NETBIOS: 17,
|
||||||
AF_VOICEVIEW:18,
|
AF_VOICEVIEW: 18,
|
||||||
AF_FIREFOX:19,
|
AF_FIREFOX: 19,
|
||||||
AF_UNKNOWN1:20,
|
AF_UNKNOWN1: 20,
|
||||||
AF_BAN:21,
|
AF_BAN: 21,
|
||||||
AF_MAX:22,
|
AF_MAX: 22,
|
||||||
|
|
||||||
SOCK_STREAM:1,
|
SOCKET_ERROR: -1,
|
||||||
SOCK_DGRAM:2,
|
SOCK_STREAM: 1,
|
||||||
SOCK_RAW:3,
|
SOCK_DGRAM: 2,
|
||||||
SOCK_RDM:4,
|
SOCK_RAW: 3,
|
||||||
SOCK_SEQPACKET:5,
|
SOCK_RDM: 4,
|
||||||
|
SOCK_SEQPACKET: 5,
|
||||||
|
|
||||||
IPPROTO_IP:0,IPPROTO_ICMP:1,IPPROTO_IGMP:2,IPPROTO_GGP:3,
|
IPPROTO_IP:0,IPPROTO_ICMP:1,IPPROTO_IGMP:2,IPPROTO_GGP:3,
|
||||||
IPPROTO_TCP:6,IPPROTO_PUP:12,IPPROTO_UDP:17,IPPROTO_IDP:22,
|
IPPROTO_TCP:6,IPPROTO_PUP:12,IPPROTO_UDP:17,IPPROTO_IDP:22,
|
||||||
|
@ -69,49 +70,49 @@ var socket=func(){
|
||||||
IPPORT_EFSSERVER:520,IPPORT_BIFFUDP:512,IPPORT_WHOSERVER:513,IPPORT_ROUTESERVER:520,
|
IPPORT_EFSSERVER:520,IPPORT_BIFFUDP:512,IPPORT_WHOSERVER:513,IPPORT_ROUTESERVER:520,
|
||||||
IPPORT_RESERVED:1024,
|
IPPORT_RESERVED:1024,
|
||||||
|
|
||||||
SHUT_RD :0x00,
|
SHUT_RD : 0x00,
|
||||||
SHUT_WR :0x01,
|
SHUT_WR : 0x01,
|
||||||
SHUT_RDWR:0x02,
|
SHUT_RDWR: 0x02,
|
||||||
|
|
||||||
MSG_OOB:0x1,
|
MSG_OOB: 0x1,
|
||||||
MSG_PEEK:0x2,
|
MSG_PEEK: 0x2,
|
||||||
MSG_DONTROUTE:0x4,
|
MSG_DONTROUTE: 0x4,
|
||||||
MSG_DONTWAIT:0x40,
|
MSG_DONTWAIT: 0x40,
|
||||||
|
|
||||||
socket:func(af,type,proto = 0){
|
socket: func(af, type, proto = 0) {
|
||||||
return invoke_iii(sock,af,type,proto);
|
return invoke_iii(sock, af, type, proto);
|
||||||
},
|
},
|
||||||
closesocket:func(sd){
|
closesocket: func(sd) {
|
||||||
return invoke_i(closesocket,sd);
|
return invoke_i(closesocket, sd);
|
||||||
},
|
},
|
||||||
shutdown: func(sd,how){
|
shutdown: func(sd, how) {
|
||||||
return invoke_ii(shutdown,sd,how);
|
return invoke_ii(shutdown, sd, how);
|
||||||
},
|
},
|
||||||
bind: func(sd,ip,port){
|
bind: func(sd, ip, port) {
|
||||||
return invoke_iii(bind,sd,ip,port);
|
return invoke_iii(bind, sd, ip, port);
|
||||||
},
|
},
|
||||||
listen: func(sd,backlog){
|
listen: func(sd, backlog) {
|
||||||
return invoke_ii(listen,sd,backlog);
|
return invoke_ii(listen, sd, backlog);
|
||||||
},
|
},
|
||||||
connect: func(sd,hostname,port){
|
connect: func(sd, hostname, port) {
|
||||||
return invoke_iii(connect,sd,hostname,port);
|
return invoke_iii(connect, sd, hostname, port);
|
||||||
},
|
},
|
||||||
accept: func(sd){
|
accept: func(sd) {
|
||||||
return invoke_i(accept,sd);
|
return invoke_i(accept, sd);
|
||||||
},
|
},
|
||||||
send: func(sd,buff,flags=0){
|
send: func(sd, buff, flags = 0) {
|
||||||
return invoke_iii(send,sd,buff,flags);
|
return invoke_iii(send, sd, buff, flags);
|
||||||
},
|
},
|
||||||
sendto: func(sd,hostname,port,buff,flags=0){
|
sendto: func(sd, hostname, port, buff, flags = 0) {
|
||||||
return invoke_iiiii(sendto,sd,hostname,port,buff,flags);
|
return invoke_iiiii(sendto, sd, hostname, port, buff, flags);
|
||||||
},
|
},
|
||||||
recv: func(sd,len,flags=0){
|
recv: func(sd, len, flags = 0) {
|
||||||
return invoke_iii(recv,sd,len,flags);
|
return invoke_iii(recv, sd, len, flags);
|
||||||
},
|
},
|
||||||
recvfrom: func(sd,len,flags=0){
|
recvfrom: func(sd, len, flags = 0) {
|
||||||
return invoke_iii(recvfrom,sd,len,flags);
|
return invoke_iii(recvfrom, sd, len, flags);
|
||||||
},
|
},
|
||||||
errno: func(){
|
errno: func() {
|
||||||
return invoke(errno);
|
return invoke(errno);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -184,7 +184,7 @@ var nas_recv(var* args, usize size, gc* ngc) {
|
||||||
var res = ngc->temp = ngc->alloc(vm_hash);
|
var res = ngc->temp = ngc->alloc(vm_hash);
|
||||||
auto& hash = res.hash().elems;
|
auto& hash = res.hash().elems;
|
||||||
char* buf = new char[static_cast<int>(args[1].num())];
|
char* buf = new char[static_cast<int>(args[1].num())];
|
||||||
auto recvsize = recv(args[0].num(), buf,args[1].num(), args[2].num());
|
auto recvsize = recv(args[0].num(), buf, args[1].num(), args[2].num());
|
||||||
hash["size"] = var::num(static_cast<double>(recvsize));
|
hash["size"] = var::num(static_cast<double>(recvsize));
|
||||||
buf[recvsize>=0? recvsize:0] = 0;
|
buf[recvsize>=0? recvsize:0] = 0;
|
||||||
hash["str"] = ngc->newstr(buf);
|
hash["str"] = ngc->newstr(buf);
|
||||||
|
|
19
std/json.nas
19
std/json.nas
|
@ -27,8 +27,10 @@ var _j_content = [
|
||||||
"identifier"
|
"identifier"
|
||||||
];
|
];
|
||||||
|
|
||||||
var parse = func() {
|
var _parse_error = 0;
|
||||||
|
|
||||||
|
var parse = func() {
|
||||||
|
_parse_error = 0;
|
||||||
var text = "";
|
var text = "";
|
||||||
var line = 1;
|
var line = 1;
|
||||||
var text_size = 0;
|
var text_size = 0;
|
||||||
|
@ -75,6 +77,7 @@ var parse = func() {
|
||||||
init();
|
init();
|
||||||
if (!size(str)) {
|
if (!size(str)) {
|
||||||
println("json::parse: empty string");
|
println("json::parse: empty string");
|
||||||
|
_parse_error += 1;
|
||||||
str = "[]";
|
str = "[]";
|
||||||
}
|
}
|
||||||
text = str;
|
text = str;
|
||||||
|
@ -156,6 +159,7 @@ var parse = func() {
|
||||||
var match = func(type) {
|
var match = func(type) {
|
||||||
if(token.type!=type) {
|
if(token.type!=type) {
|
||||||
println("json::parse: line ",line,": expect ",_j_content[type]," but get `",token.content,"`.");
|
println("json::parse: line ",line,": expect ",_j_content[type]," but get `",token.content,"`.");
|
||||||
|
_parse_error += 1;
|
||||||
}
|
}
|
||||||
next();
|
next();
|
||||||
return;
|
return;
|
||||||
|
@ -224,6 +228,7 @@ var parse = func() {
|
||||||
return func(source) {
|
return func(source) {
|
||||||
if(typeof(source)!="str") {
|
if(typeof(source)!="str") {
|
||||||
println("json::parse: must use string but get", typeof(str));
|
println("json::parse: must use string but get", typeof(str));
|
||||||
|
_parse_error += 1;
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -296,4 +301,16 @@ var stringify = func(object) {
|
||||||
hgen(object);
|
hgen(object);
|
||||||
}
|
}
|
||||||
return s;
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
var get_error = func() {
|
||||||
|
return _parse_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
var check_error = func() {
|
||||||
|
if (_parse_error==0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
println("json: encounter ", _parse_error, " error(s), stop.");
|
||||||
|
exit(-1);
|
||||||
}
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
# used to get property tree from fgfs by httpd
|
||||||
|
# use --httpd=5500 to start fgfs
|
||||||
|
# and use this script to get property tree
|
||||||
|
# 2023/11/06 ValKmjolnir
|
||||||
|
|
||||||
|
use module.libsock;
|
||||||
|
use std.json;
|
||||||
|
|
||||||
|
var socket = libsock.socket;
|
||||||
|
var sd = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP);
|
||||||
|
|
||||||
|
while((var err = socket.connect(sd, "127.0.0.1", 5500))==socket.SOCKET_ERROR) {
|
||||||
|
println("[", os.time(), "] connect to 127.0.0.1:5500 failed: ", socket.errno());
|
||||||
|
unix.sleep(1);
|
||||||
|
}
|
||||||
|
println("[", os.time(), "] connect to 127.0.0.1:5500 succeeded");
|
||||||
|
|
||||||
|
|
||||||
|
var header = "GET /json/ HTTP/1.1\n\r\n";
|
||||||
|
var res = socket.send(sd, header);
|
||||||
|
var message = socket.recv(sd, 1024);
|
||||||
|
|
||||||
|
var total_source = message.str;
|
||||||
|
var total_size = message.size;
|
||||||
|
|
||||||
|
while(message.size==1024) {
|
||||||
|
message = socket.recv(sd, 1024);
|
||||||
|
total_source ~= message.str;
|
||||||
|
total_size += message.size;
|
||||||
|
}
|
||||||
|
|
||||||
|
socket.closesocket(sd);
|
||||||
|
|
||||||
|
var A3E_position = find("{", total_source);
|
||||||
|
var end_0_position = find("0\r\n\r\n", total_source);
|
||||||
|
var props = substr(total_source, A3E_position, end_0_position-A3E_position);
|
||||||
|
props = json.parse(props);
|
||||||
|
json.check_error();
|
||||||
|
|
||||||
|
var dfs = func(tree, indent = "") {
|
||||||
|
println(indent, "---------");
|
||||||
|
println(indent, "path : \"", tree.path, "\"");
|
||||||
|
println(indent, "name : \"", tree.name, "\"");
|
||||||
|
println(indent, "index : \"", tree.index, "\"");
|
||||||
|
println(indent, "type : \"", tree.type, "\"");
|
||||||
|
println(indent, "nChildren : \"", tree.nChildren, "\"");
|
||||||
|
println(indent, "---------");
|
||||||
|
|
||||||
|
if (contains(tree, "children")) {
|
||||||
|
println(indent, "children :");
|
||||||
|
foreach(var i; tree.children) {
|
||||||
|
dfs(i, indent~" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dfs(props);
|
Loading…
Reference in New Issue