network_control_server.ncdi 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. include_guard "network_control_server"
  2. template network_control_server {
  3. alias("_arg0") socket_path;
  4. alias("_arg1") template_list_port_forwardings;
  5. alias("_arg2") template_add_port_forwarding;
  6. alias("_arg3") template_remove_port_forwarding;
  7. # Start request server.
  8. sys.request_server({"unix", socket_path}, "network_control_server__request_handler", {});
  9. }
  10. template network_control_server__request_handler {
  11. alias("_caller") server;
  12. value(_request.data) data;
  13. try("network_control_server__try", {});
  14. _request->reply({"error", "Bad request."});
  15. _request->finish();
  16. }
  17. template network_control_server__try {
  18. alias("_caller._request") request;
  19. alias("_caller.server") server;
  20. alias("_caller.data") data;
  21. val_equal(data.type, "list") a1;
  22. _try->assert(a1);
  23. num_greater_equal(data.length, "1") a2;
  24. _try->assert(a2);
  25. data->get("0") request_cmd;
  26. val_equal(request_cmd, "list-port-forwardings") is_list_port_forwardings;
  27. val_equal(request_cmd, "add-port-forwarding") is_add_port_forwarding;
  28. val_equal(request_cmd, "remove-port-forwarding") is_remove_port_forwarding;
  29. or(is_add_port_forwarding, is_remove_port_forwarding) is_add_remove_port_forwarding;
  30. If (is_list_port_forwardings) {
  31. num_equal(data.length, "1") a3;
  32. _try->assert(a3);
  33. call_with_caller_target(server.template_list_port_forwardings, {}, "server._caller") call;
  34. request->reply({"ok", call.port_forwardings});
  35. }
  36. Elif (is_add_remove_port_forwarding) {
  37. num_equal(data.length, "5") a4;
  38. _try->assert(a4);
  39. data->get("1") req_protocol;
  40. data->get("2") req_port_start;
  41. data->get("3") req_port_end;
  42. data->get("4") req_dest_addr;
  43. val_equal(req_protocol, "tcp") is_tcp;
  44. val_equal(req_protocol, "udp") is_udp;
  45. or(is_tcp, is_udp) a5;
  46. _try->assert(a5);
  47. parse_number(req_port_start) port_start;
  48. _try->assert(port_start.succeeded);
  49. parse_number(req_port_end) port_end;
  50. _try->assert(port_end.succeeded);
  51. num_lesser_equal(port_start, port_end) a6;
  52. _try->assert(a6);
  53. parse_ipv4_addr(req_dest_addr) dest_addr;
  54. _try->assert(dest_addr.succeeded);
  55. If (is_add_port_forwarding) {
  56. call_with_caller_target(server.template_add_port_forwarding, {req_protocol, port_start, port_end, dest_addr}, "server._caller") call;
  57. If (call.succeeded) {
  58. request->reply({"ok", "Port forwarding added."});
  59. } Else {
  60. request->reply({"error", call.error_text});
  61. };
  62. } Else {
  63. call_with_caller_target(server.template_remove_port_forwarding, {req_protocol, port_start, port_end, dest_addr}, "server._caller") call;
  64. If (call.succeeded) {
  65. request->reply({"ok", "Port forwarding removed."});
  66. } Else {
  67. request->reply({"error", call.error_text});
  68. };
  69. };
  70. }
  71. Else {
  72. _try->assert("false");
  73. };
  74. request->finish();
  75. }