webroar 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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");