webroar 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. data/CHANGELOG +48 -1
  2. data/README +11 -14
  3. data/Rakefile +1 -1
  4. data/conf/mime_type.yml +172 -166
  5. data/conf/server_internal_config.yml +30 -8
  6. data/doc/user-guide.html +294 -153
  7. data/doc/user-guide.txt +9 -13
  8. data/lib/command_runner.rb +1 -0
  9. data/lib/dependencies.rb +18 -15
  10. data/lib/installer.rb +115 -50
  11. data/src/admin_panel/app/controllers/admin_controller.rb +1 -15
  12. data/src/admin_panel/app/controllers/application_controller.rb +2 -2
  13. data/src/admin_panel/app/controllers/application_specification_controller.rb +2 -1
  14. data/src/admin_panel/app/controllers/headers_controller.rb +73 -0
  15. data/src/admin_panel/app/controllers/mail_specification_controller.rb +10 -0
  16. data/src/admin_panel/app/controllers/server_specification_controller.rb +14 -0
  17. data/src/admin_panel/app/helpers/admin_helper.rb +0 -85
  18. data/src/admin_panel/app/models/app.rb +1 -1
  19. data/src/admin_panel/app/models/application_specification.rb +33 -25
  20. data/src/admin_panel/app/models/headers.rb +116 -0
  21. data/src/admin_panel/app/models/mail_specification.rb +20 -5
  22. data/src/admin_panel/app/models/server_specification.rb +2 -7
  23. data/src/admin_panel/app/views/admin/configuration.html.erb +10 -5
  24. data/src/admin_panel/app/views/exceptions/_exception_list_partial.html.erb +4 -4
  25. data/src/admin_panel/app/views/graph/_graph_page.html.erb +3 -0
  26. data/src/admin_panel/app/views/headers/_add_expires_text_box.html.erb +35 -0
  27. data/src/admin_panel/app/views/headers/_expires_by_type_form.html.erb +65 -0
  28. data/src/admin_panel/app/views/headers/_headers_table.html.erb +113 -0
  29. data/src/admin_panel/app/views/mail_specification/_current_spec.html.erb +168 -0
  30. data/src/admin_panel/app/views/{admin → server_specification}/_add_div.html.erb +1 -1
  31. data/src/admin_panel/config/initializers/application_constants.rb +6 -0
  32. data/src/admin_panel/lib/control.rb +6 -3
  33. data/src/admin_panel/lib/scgi.rb +74 -21
  34. data/src/admin_panel/lib/yaml_writer.rb +51 -17
  35. data/src/admin_panel/public/javascripts/application.js +20 -1
  36. data/src/head/wr_access_log.c +2 -2
  37. data/src/head/wr_application.c +294 -236
  38. data/src/head/wr_application.h +8 -8
  39. data/src/head/wr_configurator.c +451 -517
  40. data/src/head/wr_configurator.h +10 -115
  41. data/src/head/wr_connection.c +26 -25
  42. data/src/head/wr_connection.h +2 -3
  43. data/src/head/wr_controller.c +110 -93
  44. data/src/head/wr_controller.h +6 -6
  45. data/src/head/wr_main.c +31 -24
  46. data/src/head/wr_request.c +70 -93
  47. data/src/head/wr_request.h +0 -4
  48. data/src/head/wr_resolver.c +21 -15
  49. data/src/head/wr_resolver.h +2 -2
  50. data/src/head/wr_server.c +36 -26
  51. data/src/head/wr_server.h +5 -5
  52. data/src/head/wr_worker.c +551 -512
  53. data/src/head/wr_worker.h +33 -20
  54. data/src/helper/wr_config.c +316 -0
  55. data/src/helper/wr_config.h +235 -0
  56. data/src/helper/wr_helper.h +1 -5
  57. data/src/helper/wr_logger.c +4 -4
  58. data/src/helper/wr_scgi.c +3 -4
  59. data/src/helper/wr_scgi.h +2 -0
  60. data/src/helper/wr_string.h +2 -2
  61. data/src/helper/wr_util.c +3 -1
  62. data/src/helper/wr_util.h +0 -0
  63. data/src/helper/wr_yaml_parser.c +30 -0
  64. data/src/helper/wr_yaml_parser.h +1 -0
  65. data/src/ruby_lib/exception_tracker/instrumentation/action_controller.rb +2 -1
  66. data/src/ruby_lib/mailer/smtpmail.rb +7 -4
  67. data/src/ruby_lib/profiler/instrumentation/action_controller.rb +2 -1
  68. data/src/ruby_lib/profiler/instrumentation/active_record.rb +3 -0
  69. data/src/ruby_lib/rack/adapter/rails.rb +14 -7
  70. data/src/ruby_lib/ruby_interface/client.rb +1 -1
  71. data/src/ruby_lib/ruby_interface/version.rb +2 -2
  72. data/src/ruby_lib/webroar_app_loader.rb +4 -2
  73. data/src/worker/wkr_controller.c +200 -140
  74. data/src/worker/wkr_http.c +14 -28
  75. data/src/worker/wkr_http.h +4 -4
  76. data/src/worker/wkr_http_request.c +12 -11
  77. data/src/worker/wkr_http_request.h +7 -8
  78. data/src/worker/wkr_http_response.c +10 -14
  79. data/src/worker/wkr_http_response.h +0 -1
  80. data/src/worker/wkr_main.c +74 -140
  81. data/src/worker/wkr_static.c +295 -108
  82. data/src/worker/wkr_static.h +20 -7
  83. data/src/worker/worker.c +245 -70
  84. data/src/worker/worker.h +46 -34
  85. data/tasks/compile.rake +128 -175
  86. data/tasks/test.rake +345 -469
  87. data/test/spec/webroar_command_spec.rb +23 -0
  88. metadata +173 -43
  89. data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/README +0 -34
  90. data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/Rakefile +0 -13
  91. data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/init.rb +0 -5
  92. data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/lib/action_mailer_tls.rb +0 -16
  93. data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/lib/smtp_tls.rb +0 -123
  94. data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/test/tls_test.rb +0 -42
  95. data/src/head/wr_config.h +0 -165
  96. data/src/ruby_lib/mailer/action_mailer_tls.rb +0 -16
  97. data/src/ruby_lib/mailer/smtp_tls.rb +0 -123
@@ -31,10 +31,17 @@
31
31
  * USD: {YES/NO}
32
32
  * PORT: <port> or SOCK_PATH: <sock_path>
33
33
  * PID: <pid>
34
- * 2) Remove Worker
34
+ * 2) Error on adding worker
35
+ * COMPONENT: WORKER
36
+ * METHOD: ERROR
37
+ * APPLICATION: /<baseuri>
38
+ * USD: {YES/NO}
39
+ * PORT: <port> or SOCK_PATH: <sock_path>
40
+ * PID: <pid>
41
+ * 3) Remove Worker
35
42
  * COMPONENT: WORKER
36
43
  * METHOD: REMOVE
37
- * 3) Add Application
44
+ * 4) Add Application
38
45
  * COMPONENT: APPLICATION
39
46
  * METHOD: ADD
40
47
  * APP_NAME: <application name>
@@ -45,16 +52,18 @@
45
52
  * APP_LOG_LEVEL: <logging level> (optional)
46
53
  * APP_MIN_WORKER: <min workers> (optional)
47
54
  * APP_MAX_WORKER: <max workers> (optional)
48
- * 4) Remove Application
55
+ * 5) Remove Application
49
56
  * COMPONENT: APPLICATION
50
57
  * METHOD: ADD
51
58
  **/
52
59
 
53
- static inline wr_ctl_msg_t* wr_ctl_msg_validate(scgi_t* request, wr_ctl_t* ctl) {
60
+ extern config_t *Config;
61
+
62
+ wr_ctl_msg_t* wr_ctl_msg_validate(scgi_t* request, wr_ctl_t* ctl) {
54
63
  LOG_FUNCTION
55
64
  wr_ctl_msg_t* ctl_msg = wr_malloc(wr_ctl_msg_t);
56
65
  char *val;
57
- char error[WR_STR_LEN];
66
+ char error[STR_SIZE64];
58
67
 
59
68
  ctl->type = WR_CTL_MSG_NONE;
60
69
  ctl->scgi = scgi_new();
@@ -71,8 +80,9 @@ static inline wr_ctl_msg_t* wr_ctl_msg_validate(scgi_t* request, wr_ctl_t* ctl)
71
80
  strcpy(error,"METHOD missing.");
72
81
  goto ctl_msg_err;
73
82
  }
74
- scgi_header_add(ctl->scgi, "METHOD", strlen("METHOD"), val, strlen(val));
75
83
 
84
+ scgi_header_add(ctl->scgi, "METHOD", strlen("METHOD"), val, strlen(val));
85
+
76
86
  ctl_msg->msg.app.app_name.str = (char*) scgi_header_value_get(request,"APP_NAME");
77
87
  if(ctl_msg->msg.app.app_name.str == NULL) {
78
88
  strcpy(error,"Application name is missing.");
@@ -86,7 +96,7 @@ static inline wr_ctl_msg_t* wr_ctl_msg_validate(scgi_t* request, wr_ctl_t* ctl)
86
96
  ctl->type = WR_CTL_MSG_APPLICATION_REMOVE;
87
97
  } else if(strcmp(val,"RELOAD")==0) {
88
98
  ctl->type = WR_CTL_MSG_APPLICATION_RELOAD;
89
- } else {
99
+ }else {
90
100
  strcpy(error,"Invalid METHOD.");
91
101
  goto ctl_msg_err;
92
102
  }
@@ -96,7 +106,13 @@ static inline wr_ctl_msg_t* wr_ctl_msg_validate(scgi_t* request, wr_ctl_t* ctl)
96
106
  strcpy(error,"METHOD missing.");
97
107
  goto ctl_msg_err;
98
108
  }
99
- scgi_header_add(ctl->scgi, "METHOD", strlen("METHOD"), val, strlen(val));
109
+
110
+ if(strcmp(val,"ERROR")==0) {
111
+ scgi_header_add(ctl->scgi, "METHOD", strlen("METHOD"), "ACK", strlen("ACK"));
112
+ }else{
113
+ scgi_header_add(ctl->scgi, "METHOD", strlen("METHOD"), val, strlen(val));
114
+ }
115
+
100
116
  // Worker Add
101
117
  if(strcmp(val,"ADD")==0) {
102
118
  ctl->type = WR_CTL_MSG_WORKER_ADD;
@@ -118,7 +134,24 @@ static inline wr_ctl_msg_t* wr_ctl_msg_validate(scgi_t* request, wr_ctl_t* ctl)
118
134
  ctl->type = WR_CTL_MSG_WORKER_REMOVE;
119
135
  } else if(strcmp(val,"PING") == 0) {
120
136
  ctl->type = WR_CTL_MSG_WORKER_PING;
121
- } else {
137
+ } else if(strcmp(val,"CONF_REQ") == 0){
138
+ ctl->type = WR_CTL_MSG_WORKER_CONF_REQ;
139
+ ctl_msg->msg.wkr.app_name.str = (char*) scgi_header_value_get(request,"APPLICATION");
140
+ } else if(strcmp(val,"ERROR") == 0) {
141
+ ctl->type = WR_CTL_MSG_WORKER_ADD_ERROR;
142
+ ctl_msg->msg.wkr.app_name.str = (char*) scgi_header_value_get(request,"APPLICATION");
143
+ ctl_msg->msg.wkr.pid.str = (char*) scgi_header_value_get(request,"PID");
144
+ ctl_msg->msg.wkr.port.str = (char*) scgi_header_value_get(request,"PORT");
145
+ ctl_msg->msg.wkr.sock_path.str = (char*) scgi_header_value_get(request,"SOCK_PATH");
146
+ ctl_msg->msg.wkr.uds.str = (char*) scgi_header_value_get(request,"UDS");
147
+
148
+ if(ctl_msg->msg.wkr.app_name.str == NULL ||
149
+ ctl_msg->msg.wkr.pid.str == NULL ||
150
+ ctl_msg->msg.wkr.uds.str == NULL) {
151
+ strcpy(error,"Missing some headers.");
152
+ goto ctl_msg_err;
153
+ }
154
+ }else {
122
155
  strcpy(error,"Invalid METHOD.");
123
156
  goto ctl_msg_err;
124
157
  }
@@ -136,7 +169,7 @@ ctl_msg_err:
136
169
  return ctl_msg;
137
170
  }
138
171
 
139
- static void wr_ctl_msg_write_cb(struct ev_loop *loop, struct ev_io *w, int revents) {
172
+ void wr_ctl_msg_write_cb(struct ev_loop *loop, struct ev_io *w, int revents) {
140
173
  LOG_FUNCTION
141
174
  if(EV_ERROR & revents) {
142
175
  LOG_ERROR(4,"got error event, returning.");
@@ -144,8 +177,8 @@ static void wr_ctl_msg_write_cb(struct ev_loop *loop, struct ev_io *w, int reven
144
177
  }
145
178
 
146
179
  wr_ctl_t* ctl = (wr_ctl_t*) w->data;
147
-
148
- if(scgi_send(ctl->scgi, w->fd) <= 0){
180
+
181
+ if(scgi_send(ctl->scgi, ctl->fd) <= 0){
149
182
  LOG_ERROR(4,"got error event, returning.");
150
183
  return;
151
184
  }
@@ -153,27 +186,25 @@ static void wr_ctl_msg_write_cb(struct ev_loop *loop, struct ev_io *w, int reven
153
186
  LOG_DEBUG(DEBUG,"Sending control messag %d/%d", ctl->scgi->bytes_sent, ctl->scgi->length);
154
187
  if(ctl->scgi->bytes_sent >= ctl->scgi->length) {
155
188
  ev_io_stop(loop, w);
156
- scgi_free(ctl->scgi);
189
+ if(ctl->destroy_scgi == TRUE){
190
+ scgi_free(ctl->scgi);
191
+ }else{
192
+ ctl->scgi->bytes_sent = 0;
193
+ }
157
194
  ctl->scgi = NULL;
158
- if(ctl->type == WR_CTL_MSG_TYPE_ERROR) {
195
+ ctl->destroy_scgi = TRUE;
196
+ if(ctl->type == WR_CTL_MSG_TYPE_ERROR || ctl->type == WR_CTL_MSG_WORKER_ADD_ERROR) {
159
197
  wr_ctl_free(ctl);
160
198
  }
161
- /*if(control->type == WR_CTL_MSG_WORKER_PING){
162
- ev_io_start(loop, &control->w_read);
163
- }*/
164
199
  }
165
200
  }
166
201
 
167
202
  /** Process Control message */
168
- static inline void wr_ctl_msg_process(scgi_t* request, wr_ctl_t* ctl) {
203
+ void wr_ctl_msg_process(scgi_t* request, wr_ctl_t* ctl) {
169
204
  LOG_FUNCTION
170
205
 
171
206
  wr_ctl_msg_t* ctl_msg = wr_ctl_msg_validate(request, ctl);
172
-
173
- // ctl->type.type = ctl_msg->type;
174
- //ctl->resp_nbytes = 0;
175
- ctl->w_write.data = ctl;
176
- ev_io_init(&(ctl->w_write ), wr_ctl_msg_write_cb, ctl->fd, EV_WRITE);
207
+
177
208
  int flag = 0;
178
209
 
179
210
  switch(ctl->type) {
@@ -195,7 +226,6 @@ static inline void wr_ctl_msg_process(scgi_t* request, wr_ctl_t* ctl) {
195
226
  break;
196
227
  case WR_CTL_MSG_APPLICATION_RELOAD:
197
228
  LOG_DEBUG(DEBUG,"WR_CTL_MSG_APPLICATION_RELOAD");
198
- // wr_ctl_msg_app_reload(ctl_msg, ctl);
199
229
  if(ctl->svr && ctl->svr->on_app_reload)
200
230
  ctl->svr->on_app_reload(ctl, ctl_msg);
201
231
  else
@@ -203,15 +233,20 @@ static inline void wr_ctl_msg_process(scgi_t* request, wr_ctl_t* ctl) {
203
233
  break;
204
234
  case WR_CTL_MSG_WORKER_ADD:
205
235
  LOG_DEBUG(DEBUG,"WR_CTL_MSG_WORKER_ADD");
206
- // wr_ctl_msg_wkr_add(ctl_msg, ctl);
207
236
  if(ctl->svr && ctl->svr->on_wkr_add)
208
237
  ctl->svr->on_wkr_add(ctl, ctl_msg);
209
238
  else
210
239
  flag =1;
211
240
  break;
241
+ case WR_CTL_MSG_WORKER_ADD_ERROR:
242
+ LOG_DEBUG(DEBUG,"WR_CTL_MSG_WORKER_ADD_ERROR");
243
+ if(ctl->svr && ctl->svr->on_wkr_add_error)
244
+ ctl->svr->on_wkr_add_error(ctl, ctl_msg);
245
+ else
246
+ flag =1;
247
+ break;
212
248
  case WR_CTL_MSG_WORKER_REMOVE:
213
249
  LOG_DEBUG(DEBUG,"WR_CTL_MSG_WORKER_REMOVE");
214
- // wr_ctl_msg_wkr_remove(ctl_msg, ctl);
215
250
  if(ctl->svr && ctl->svr->on_wkr_remove)
216
251
  ctl->svr->on_wkr_remove(ctl, ctl_msg);
217
252
  else
@@ -219,13 +254,18 @@ static inline void wr_ctl_msg_process(scgi_t* request, wr_ctl_t* ctl) {
219
254
  break;
220
255
  case WR_CTL_MSG_WORKER_PING:
221
256
  LOG_DEBUG(DEBUG,"WR_CTL_MSG_WORKER_PING");
222
- // scgi_free(ctl_msg->resp);
223
- // wr_wkr_ping_reply(ctl->wkr);
224
257
  if(ctl->svr && ctl->svr->on_wkr_ping)
225
258
  ctl->svr->on_wkr_ping(ctl, ctl_msg);
226
259
  else
227
260
  flag =1;
228
261
  break;
262
+ case WR_CTL_MSG_WORKER_CONF_REQ:
263
+ LOG_DEBUG(DEBUG,"WR_CTL_MSG_WORKER_CONF_REQ");
264
+ if(ctl->svr && ctl->svr->on_wkr_conf_req)
265
+ ctl->svr->on_wkr_conf_req(ctl, ctl_msg);
266
+ else
267
+ flag =1;
268
+ break;
229
269
  case WR_CTL_MSG_TYPE_ERROR:
230
270
  LOG_DEBUG(DEBUG,"WR_CTL_MSG_TYPE_ERROR");
231
271
  wr_ctl_resp_write(ctl);
@@ -243,7 +283,7 @@ static inline void wr_ctl_msg_process(scgi_t* request, wr_ctl_t* ctl) {
243
283
  }
244
284
 
245
285
  /** Read and handle data sent by control port of Workers*/
246
- static void wr_ctl_msg_read_cb(struct ev_loop *loop, struct ev_io *w, int revents) {
286
+ void wr_ctl_msg_read_cb(struct ev_loop *loop, struct ev_io *w, int revents) {
247
287
  LOG_FUNCTION
248
288
  wr_ctl_t* ctl = (wr_ctl_t*) w->data;
249
289
 
@@ -255,14 +295,11 @@ static void wr_ctl_msg_read_cb(struct ev_loop *loop, struct ev_io *w, int revent
255
295
  //Read data
256
296
  int bytesRead = recv(w->fd,
257
297
  ctl->msg + ctl->ctl_nbytes,
258
- WR_MSG_SIZE - ctl->ctl_nbytes,
298
+ STR_SIZE1KB - ctl->ctl_nbytes,
259
299
  0);
260
300
 
261
301
  if(bytesRead <= 0 && ctl && ctl->svr && ctl->svr->is_running) {
262
302
  LOG_ERROR(WARN,"Error receiving contol message port or socket path:%s, fd = %d, bytesRead=%d",strerror(errno), w->fd, bytesRead);
263
- if(ctl->wkr) {
264
- ctl->wkr->state += (WR_WKR_ERROR + WR_WKR_HANG);
265
- }
266
303
  wr_ctl_free(ctl);
267
304
  return;
268
305
  }
@@ -286,12 +323,30 @@ static void wr_ctl_msg_read_cb(struct ev_loop *loop, struct ev_io *w, int revent
286
323
  ctl->ctl_nbytes = 0;
287
324
  }
288
325
 
326
+ wr_ctl_t* wr_ctl_new(wr_svr_t* server) {
327
+ LOG_FUNCTION
328
+ wr_ctl_t* ctl = wr_malloc(wr_ctl_t);
329
+ if(ctl == NULL) {
330
+ LOG_DEBUG(SEVERE, "Error Control object allocation failed. Returning ... ");
331
+ return NULL;
332
+ }
333
+ ctl->svr = server;
334
+ ctl->w_read.data = ctl->w_write.data = ctl;
335
+ ctl->w_read.active = 0;
336
+ ctl->wkr = NULL;
337
+ ctl->app = NULL;
338
+ ctl->ctl_nbytes = 0;
339
+ ctl->fd = -1;
340
+ ctl->destroy_scgi = TRUE;
341
+ return ctl;
342
+ }
343
+
289
344
  /**
290
345
  * This function accept connection from worker.
291
346
  * We need to change it to keep detail of each worker. Currently it is maintaining only latest worker connected.
292
347
  * Its prone produce bug.
293
348
  */
294
- static void wr_ctl_accept_cb(struct ev_loop *loop, struct ev_io *w, int revents) {
349
+ void wr_ctl_accept_cb(struct ev_loop *loop, struct ev_io *w, int revents) {
295
350
  LOG_FUNCTION
296
351
  wr_svr_t* server = (wr_svr_t*) w->data;
297
352
  wr_ctl_t* ctl = NULL;
@@ -302,7 +357,7 @@ static void wr_ctl_accept_cb(struct ev_loop *loop, struct ev_io *w, int revents)
302
357
  }
303
358
 
304
359
  int client_fd;
305
- if(server->ctl->uds) {
360
+ if(Config->Server.flag & SERVER_UDS_SUPPORT) {
306
361
  //Accept connection from Internet socket
307
362
  struct sockaddr_in client_addr;
308
363
  socklen_t client_len = sizeof(client_addr);
@@ -337,14 +392,13 @@ static void wr_ctl_accept_cb(struct ev_loop *loop, struct ev_io *w, int revents)
337
392
  LOG_INFO("Successfully connected with controller client. Read watcher starting...");
338
393
 
339
394
  //Start control read watcher
340
- ctl->w_read.data = ctl;
341
-
342
- ev_io_init(&(ctl->w_read),wr_ctl_msg_read_cb,client_fd,EV_READ);
395
+ ev_io_init(&(ctl->w_read),wr_ctl_msg_read_cb,ctl->fd, EV_READ);
396
+ ev_io_init(&(ctl->w_write),wr_ctl_msg_write_cb,ctl->fd, EV_WRITE);
343
397
  ev_io_start(loop,&(ctl->w_read));
344
398
  }
345
399
 
346
400
  /** Start listening for Workers connect request on Internet socket */
347
- static inline int wr_ctl_init_on_inet_sock(wr_svr_t *server) {
401
+ int wr_ctl_init_on_inet_sock(wr_svr_t *server) {
348
402
  LOG_FUNCTION
349
403
  struct sockaddr_in addr;
350
404
  int len;
@@ -380,7 +434,7 @@ static inline int wr_ctl_init_on_inet_sock(wr_svr_t *server) {
380
434
  return -1;
381
435
  }
382
436
  server->ctl->port = ntohs(addr.sin_port);
383
- FILE *tmp_sock = fopen(WR_TMP_SOCK_FILE,"w");
437
+ FILE *tmp_sock = fopen(Config->Server.File.sock.str,"w");
384
438
  if(tmp_sock) {
385
439
  fprintf(tmp_sock,"%d", server->ctl->port);
386
440
  fclose(tmp_sock);
@@ -389,7 +443,7 @@ static inline int wr_ctl_init_on_inet_sock(wr_svr_t *server) {
389
443
  //determine port to which controller_fd bound
390
444
  LOG_DEBUG(4,"Initializing controller on port %d, FD is=%d",server->ctl->port,server->ctl->fd);
391
445
 
392
- if(listen(server->ctl->fd, WR_REQ_CONN_POOL) < 0 )// TODO: Accept connections only from workers
446
+ if(listen(server->ctl->fd, Config->Request.conn_pool) < 0 )// TODO: Accept connections only from workers
393
447
  {
394
448
  LOG_ERROR(SEVERE,"listen error on port=%d:%s",server->ctl->port,strerror(errno));
395
449
  close_fd(server->ctl->fd);
@@ -399,10 +453,10 @@ static inline int wr_ctl_init_on_inet_sock(wr_svr_t *server) {
399
453
  }
400
454
 
401
455
  /** Start listening for Workers connect request on UNIX domain socket */
402
- static inline int wr_ctl_init_on_uds(wr_svr_t *server) {
456
+ int wr_ctl_init_on_uds(wr_svr_t *server) {
403
457
  LOG_FUNCTION
404
458
  struct sockaddr_un addr;
405
- char sock_path[WR_LONG_STR_LEN];
459
+ char sock_path[STR_SIZE128];
406
460
 
407
461
  if ((server->ctl->fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
408
462
  LOG_ERROR(SEVERE,"Socket opening error:%s",strerror(errno));
@@ -419,12 +473,12 @@ static inline int wr_ctl_init_on_uds(wr_svr_t *server) {
419
473
 
420
474
  /* Preparing unique controller socket path*/
421
475
  pid_t pid=getpid();
422
- sprintf(sock_path,"%s_%d",WR_CTL_SOCK_PATH,pid);
476
+ sprintf(sock_path,"%s_%d",Config->Server.Control.sock_path.str,pid);
423
477
  size_t len = strlen(sock_path);
424
478
 
425
479
  wr_string_new(server->ctl->sock_path, sock_path, len);
426
480
 
427
- FILE *tmp_sock = fopen(WR_TMP_SOCK_FILE,"w");
481
+ FILE *tmp_sock = fopen(Config->Server.File.sock.str,"w");
428
482
  if(tmp_sock) {
429
483
  fprintf(tmp_sock,"%s", server->ctl->sock_path.str);
430
484
  fclose(tmp_sock);
@@ -447,7 +501,7 @@ static inline int wr_ctl_init_on_uds(wr_svr_t *server) {
447
501
  return -1;
448
502
  }
449
503
  LOG_DEBUG(4,"Getting ready to listen on socket path=%s",addr.sun_path);
450
- if(listen(server->ctl->fd, WR_CTL_CONN_POOL) < 0) // TODO: Accept connections only from workers
504
+ if(listen(server->ctl->fd, Config->Server.Control.conn_pool) < 0) // TODO: Accept connections only from workers
451
505
  {
452
506
  LOG_ERROR(SEVERE,"listen() error on socket path=%s:%s",server->ctl->sock_path.str,strerror(errno));
453
507
  close_fd(server->ctl->fd);
@@ -460,22 +514,6 @@ static inline int wr_ctl_init_on_uds(wr_svr_t *server) {
460
514
  /********************************************************
461
515
  * Control Function Definition *
462
516
  ********************************************************/
463
- wr_ctl_t* wr_ctl_new(wr_svr_t* server) {
464
- LOG_FUNCTION
465
- wr_ctl_t* ctl = wr_malloc(wr_ctl_t);
466
- if(ctl == NULL) {
467
- LOG_DEBUG(SEVERE, "Error Control object allocation failed. Returning ... ");
468
- return NULL;
469
- }
470
- ctl->svr = server;
471
- ctl->w_read.active = 0;
472
- ctl->wkr = NULL;
473
- ctl->app = NULL;
474
- ctl->ctl_nbytes = 0;
475
- //ctl->msg_size = 0;
476
- ctl->fd = -1;
477
- return ctl;
478
- }
479
517
 
480
518
  void wr_ctl_free(wr_ctl_t* ctl) {
481
519
  LOG_FUNCTION
@@ -490,31 +528,10 @@ void wr_ctl_free(wr_ctl_t* ctl) {
490
528
  ev_io_stop(ctl->svr->ebb_svr.loop, &ctl->w_read);
491
529
  }
492
530
  if(ctl->wkr) {
493
- wr_wkr_t *worker = ctl->wkr;
494
- // Need to stop ev_io so that all the pending call related to worker turns out to void
495
- if(worker->watcher.active != 0) {
496
- ev_io_stop(worker->ctl->svr->ebb_svr.loop, &worker->watcher);
497
- }
498
- worker->ctl = NULL;
499
- //if head is waiting for PING reply, and worker got killed inbetween, we need to stop time watcher
500
- ev_timer_stop(worker->loop, &worker->t_wait);
501
- //wr_recreate_worker(worker);
502
- wr_req_t * req = worker->req;
503
- //we are killing worker in mid of some processing, render 500 to corresponding req
504
- if(req) {
505
- LOG_ERROR(SEVERE,"Worker %d Hangup. Killing it. Req id = %d, Connection id = %d, Request Path is %s",
506
- worker->id,
507
- req->id, req->conn->id, req->req_uri.str);
508
- req->resp_buf_len = 0;
509
- wr_conn_err_resp(req->conn, WR_HTTP_STATUS_500);
510
-
511
- }
512
- wr_app_t *app = worker->app;
513
- LOG_ERROR(SEVERE,"wr_ctl_free: Remove worker with pid %d.", ctl->wkr->pid);
514
- if(ctl->wkr->state & WR_WKR_ACTIVE)
515
- wr_wkr_remove(ctl->wkr, 1);
516
- else
517
- wr_wkr_free(ctl->wkr);
531
+ wr_app_t *app = ctl->wkr->app;
532
+ ctl->wkr->state = WKR_STATE_ERROR;
533
+ ctl->wkr->ctl = NULL;
534
+ wr_wkr_free(ctl->wkr);
518
535
 
519
536
  //create new worker if required
520
537
  if(app && app->state == WR_APP_ACTIVE){
@@ -534,9 +551,8 @@ int wr_ctl_init(wr_svr_t* server) {
534
551
  int rv;
535
552
 
536
553
  /* Start listening for workers control */
537
- server->ctl->uds = server->conf->uds;
538
-
539
- if(server->ctl->uds) {
554
+
555
+ if(Config->Server.flag & SERVER_UDS_SUPPORT) {
540
556
  // Start listening on UNIX domain socket
541
557
  rv = wr_ctl_init_on_uds(server);
542
558
  if(rv < 0) {
@@ -577,8 +593,7 @@ wr_svr_ctl_t* wr_svr_ctl_new() {
577
593
  ctl->port = -1;
578
594
  wr_string_null(ctl->sock_path);
579
595
  ctl->w_req = NULL;
580
- ctl->uds = -1;
581
-
596
+
582
597
  return ctl;
583
598
  }
584
599
 
@@ -600,7 +615,9 @@ void wr_svr_ctl_free(wr_svr_ctl_t *ctl) {
600
615
  void wr_ctl_resp_write(wr_ctl_t *ctl) {
601
616
  LOG_FUNCTION
602
617
  if(ctl->scgi) {
603
- scgi_build(ctl->scgi);
618
+ if(ctl->destroy_scgi == TRUE){
619
+ scgi_build(ctl->scgi);
620
+ }
604
621
  LOG_DEBUG(DEBUG,"sending control signal response");
605
622
  ev_io_start(ctl->svr->ebb_svr.loop, (&ctl->w_write));
606
623
  }
@@ -42,8 +42,10 @@ typedef enum{
42
42
  WR_CTL_MSG_APPLICATION_ADD,
43
43
  WR_CTL_MSG_APPLICATION_REMOVE,
44
44
  WR_CTL_MSG_WORKER_ADD,
45
- WR_CTL_MSG_WORKER_REMOVE,
45
+ WR_CTL_MSG_WORKER_ADD_ERROR,
46
+ WR_CTL_MSG_WORKER_REMOVE,
46
47
  WR_CTL_MSG_WORKER_PING,
48
+ WR_CTL_MSG_WORKER_CONF_REQ,
47
49
  WR_CTL_MSG_TYPE_ERROR
48
50
  }wr_ctl_msg_type_t;
49
51
 
@@ -65,16 +67,15 @@ struct wr_ctl_s {
65
67
  wr_svr_t *svr; /* Pointer to wr_server_t */
66
68
  wr_wkr_t *wkr; /* Pointer to wr_processsor_t */
67
69
  wr_app_t *app; /* Pointer to wr_app_t, would be used at time of freeing control object */
68
- char msg[WR_MSG_SIZE];
70
+ char msg[STR_SIZE1KB];
69
71
  size_t ctl_nbytes;
70
72
  wr_ctl_msg_type_t type;
71
73
 
72
74
  ev_io w_write;
73
- scgi_t *scgi;
75
+ scgi_t *scgi;
76
+ wr_u_short destroy_scgi;
74
77
  //size_t resp_nbytes;
75
78
  };
76
- /** Create new control structure */
77
- wr_ctl_t* wr_ctl_new(wr_svr_t*);
78
79
  /** Destroy control */
79
80
  void wr_ctl_free(wr_ctl_t*);
80
81
  /** Initialize controller */
@@ -85,7 +86,6 @@ void wr_ctl_resp_write(wr_ctl_t*);
85
86
  /** Server Control structure */
86
87
  struct wr_svr_ctl_s {
87
88
  int fd; /**< Control socket fd */
88
- int uds; /**< Flag for Unix Domain Socket */
89
89
  int port; /**< Control port */
90
90
  wr_str_t sock_path; /**< Control socket path */
91
91
  ev_io* w_req; /**< Accept worker connect request watcher */
data/src/head/wr_main.c CHANGED
@@ -23,14 +23,15 @@
23
23
  #include <execinfo.h>
24
24
 
25
25
  // wr_server object
26
- static wr_svr_t *server;
26
+ static wr_svr_t *server = NULL;
27
+ config_t *Config = NULL;
27
28
 
28
29
  /** Cleanup and destroy the Server */
29
- static inline void cleanup(wr_svr_t *server) {
30
+ void cleanup(wr_svr_t *server) {
30
31
  LOG_FUNCTION
31
32
 
32
33
  // Delete 'webroar.sock' file
33
- remove(WR_TMP_SOCK_FILE);
34
+ remove(Config->Server.File.sock.str);
34
35
 
35
36
  // Stop event loop
36
37
  ev_unloop(server->ebb_svr.loop, EVUNLOOP_ALL);
@@ -39,7 +40,8 @@ static inline void cleanup(wr_svr_t *server) {
39
40
  wr_svr_free(server);
40
41
 
41
42
  // Delete 'webroar.pid' file
42
- remove(WR_PID_FILE);
43
+ remove(Config->Server.File.pid.str);
44
+ wr_server_config_free(Config);
43
45
  LOG_INFO("Shutting down network server. No more request can be served");
44
46
 
45
47
  // Destroy logger object
@@ -47,7 +49,7 @@ static inline void cleanup(wr_svr_t *server) {
47
49
  }
48
50
 
49
51
  /** Daemonize the process */
50
- static inline void daemonize() {
52
+ void daemonize() {
51
53
  LOG_FUNCTION
52
54
  /* Our process ID and Session ID */
53
55
  pid_t pid, sid;
@@ -90,9 +92,9 @@ static inline void daemonize() {
90
92
  LOG_DEBUG(DEBUG,"j=%d",j);
91
93
 
92
94
  //Log current pid
93
- char str[WR_SHORT_STR_LEN];
95
+ char str[STR_SIZE32];
94
96
 
95
- int pid_FD=open(WR_PID_FILE,O_RDWR|O_CREAT,0640);
97
+ int pid_FD=open(Config->Server.File.pid.str,O_RDWR|O_CREAT,0640);
96
98
  LOG_DEBUG(4,"FD for PID is %i",pid_FD);
97
99
 
98
100
  if (pid_FD<0) {
@@ -130,10 +132,10 @@ void sigproc() {
130
132
 
131
133
  /** Handle segmentation fault */
132
134
  void crash_handler(int sig) {
133
- void *array[WR_STACKTRACE_SIZE];
135
+ void *array[Config->Server.stack_trace];
134
136
  size_t size;
135
137
  char **bt_symbols;
136
- char bt_string[WR_STACKTRACE_SIZE * WR_LONG_STR_LEN * 2];
138
+ char bt_string[Config->Server.stack_trace * STR_SIZE256];
137
139
  int i;
138
140
  sigset_t unblock_sig;
139
141
 
@@ -185,7 +187,7 @@ void crash_handler(int sig) {
185
187
  sleep(5);
186
188
 
187
189
  // get void*'s for all entries on the stack
188
- size = backtrace(array, WR_STACKTRACE_SIZE);
190
+ size = backtrace(array, Config->Server.stack_trace);
189
191
  bt_symbols = backtrace_symbols(array, size);
190
192
  strcpy(bt_string, "\n");
191
193
  for(i = 0; i < size; i++) {
@@ -202,33 +204,36 @@ void crash_handler(int sig) {
202
204
 
203
205
  int main(int argc, char *argv[]) {
204
206
  int retval = 0;
205
- wr_conf_t *conf=NULL;
206
- char *WR_ROOT = argv[1];
207
-
208
- //Initialize logger
209
- if(initialize_logger(WR_LOG_FILE, WR_SERVER, WR_VERSION) == 0) {
210
- LOG_DEBUG(DEBUG,"Logging started in %s file",WR_LOG_FILE);
207
+
208
+ Config = wr_server_config_init(argv[1]);
209
+
210
+ if(Config == NULL) return -1;
211
+
212
+ //Initialize logger
213
+ if(initialize_logger(Config->Server.File.log.str, Config->Server.name.str, Config->Server.version.str) == 0) {
214
+ LOG_DEBUG(DEBUG,"Logging started in %s file",Config->Server.File.log.str);
211
215
  } else {
212
216
  printf("Logger initialization failed. Please make sure you have write permission on '/var/log/webroar' directory.");
213
217
  }
214
-
218
+
215
219
  //Allocate and initialize configuration structure
216
- conf = wr_conf_read(WR_ROOT);
217
- if(conf == NULL ) {
220
+ if(wr_conf_read() == FALSE ) {
218
221
  LOG_ERROR(FATAL,"Configuration reading failed.");
219
222
  printf("Server not started.\nProblem with reading the configuration file. Kindly refer the log files for details.\n");
223
+ wr_server_config_free(Config);
220
224
  return -1;
221
225
  }
226
+
222
227
  #ifdef L_DEBUG
223
228
  set_log_severity(DEBUG);
224
229
  #else
225
- set_log_severity(conf->server->log_level);
230
+ set_log_severity(Config->Server.log_level);
226
231
  #endif
227
232
  // Add Admin Panel
228
- wr_conf_admin_panel_add(conf);
233
+ wr_conf_admin_panel_add();
229
234
 
230
235
  // Add staic file server
231
- wr_conf_static_server_add(conf);
236
+ wr_conf_static_server_add();
232
237
 
233
238
  //TODO: Windows Portability?
234
239
  signal(SIGINT, sigproc);
@@ -243,13 +248,14 @@ int main(int argc, char *argv[]) {
243
248
 
244
249
 
245
250
  // Initialize and start the Server to accept requests
246
- retval = wr_svr_init(&server, conf);
251
+ retval = wr_svr_init(&server);
247
252
  if(retval<0) {
248
253
  LOG_ERROR(FATAL,"Initialization of network server failed.");
249
254
  printf("Server not started. Kindly refer the log files for details.\n");
255
+ wr_server_config_free(Config);
250
256
  return retval;
251
257
  }
252
- LOG_INFO("Network server successfully initialized on port %d",server->conf->server->port);
258
+ LOG_INFO("Network server successfully initialized on port %d",Config->Server.port);
253
259
 
254
260
  // Set keep alive flag
255
261
  server->is_running = 1;
@@ -260,6 +266,7 @@ int main(int argc, char *argv[]) {
260
266
  LOG_ERROR(FATAL,"Controller Initialization failed.");
261
267
  printf("Server not started. Kindly refer the log files for details.\n");
262
268
  wr_svr_free(server);
269
+ wr_server_config_free(Config);
263
270
  return retval;
264
271
  }
265
272
  LOG_INFO("Controller initialized");