webroar 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +48 -1
- data/README +11 -14
- data/Rakefile +1 -1
- data/conf/mime_type.yml +172 -166
- data/conf/server_internal_config.yml +30 -8
- data/doc/user-guide.html +294 -153
- data/doc/user-guide.txt +9 -13
- data/lib/command_runner.rb +1 -0
- data/lib/dependencies.rb +18 -15
- data/lib/installer.rb +115 -50
- data/src/admin_panel/app/controllers/admin_controller.rb +1 -15
- data/src/admin_panel/app/controllers/application_controller.rb +2 -2
- data/src/admin_panel/app/controllers/application_specification_controller.rb +2 -1
- data/src/admin_panel/app/controllers/headers_controller.rb +73 -0
- data/src/admin_panel/app/controllers/mail_specification_controller.rb +10 -0
- data/src/admin_panel/app/controllers/server_specification_controller.rb +14 -0
- data/src/admin_panel/app/helpers/admin_helper.rb +0 -85
- data/src/admin_panel/app/models/app.rb +1 -1
- data/src/admin_panel/app/models/application_specification.rb +33 -25
- data/src/admin_panel/app/models/headers.rb +116 -0
- data/src/admin_panel/app/models/mail_specification.rb +20 -5
- data/src/admin_panel/app/models/server_specification.rb +2 -7
- data/src/admin_panel/app/views/admin/configuration.html.erb +10 -5
- data/src/admin_panel/app/views/exceptions/_exception_list_partial.html.erb +4 -4
- data/src/admin_panel/app/views/graph/_graph_page.html.erb +3 -0
- data/src/admin_panel/app/views/headers/_add_expires_text_box.html.erb +35 -0
- data/src/admin_panel/app/views/headers/_expires_by_type_form.html.erb +65 -0
- data/src/admin_panel/app/views/headers/_headers_table.html.erb +113 -0
- data/src/admin_panel/app/views/mail_specification/_current_spec.html.erb +168 -0
- data/src/admin_panel/app/views/{admin → server_specification}/_add_div.html.erb +1 -1
- data/src/admin_panel/config/initializers/application_constants.rb +6 -0
- data/src/admin_panel/lib/control.rb +6 -3
- data/src/admin_panel/lib/scgi.rb +74 -21
- data/src/admin_panel/lib/yaml_writer.rb +51 -17
- data/src/admin_panel/public/javascripts/application.js +20 -1
- data/src/head/wr_access_log.c +2 -2
- data/src/head/wr_application.c +294 -236
- data/src/head/wr_application.h +8 -8
- data/src/head/wr_configurator.c +451 -517
- data/src/head/wr_configurator.h +10 -115
- data/src/head/wr_connection.c +26 -25
- data/src/head/wr_connection.h +2 -3
- data/src/head/wr_controller.c +110 -93
- data/src/head/wr_controller.h +6 -6
- data/src/head/wr_main.c +31 -24
- data/src/head/wr_request.c +70 -93
- data/src/head/wr_request.h +0 -4
- data/src/head/wr_resolver.c +21 -15
- data/src/head/wr_resolver.h +2 -2
- data/src/head/wr_server.c +36 -26
- data/src/head/wr_server.h +5 -5
- data/src/head/wr_worker.c +551 -512
- data/src/head/wr_worker.h +33 -20
- data/src/helper/wr_config.c +316 -0
- data/src/helper/wr_config.h +235 -0
- data/src/helper/wr_helper.h +1 -5
- data/src/helper/wr_logger.c +4 -4
- data/src/helper/wr_scgi.c +3 -4
- data/src/helper/wr_scgi.h +2 -0
- data/src/helper/wr_string.h +2 -2
- data/src/helper/wr_util.c +3 -1
- data/src/helper/wr_util.h +0 -0
- data/src/helper/wr_yaml_parser.c +30 -0
- data/src/helper/wr_yaml_parser.h +1 -0
- data/src/ruby_lib/exception_tracker/instrumentation/action_controller.rb +2 -1
- data/src/ruby_lib/mailer/smtpmail.rb +7 -4
- data/src/ruby_lib/profiler/instrumentation/action_controller.rb +2 -1
- data/src/ruby_lib/profiler/instrumentation/active_record.rb +3 -0
- data/src/ruby_lib/rack/adapter/rails.rb +14 -7
- data/src/ruby_lib/ruby_interface/client.rb +1 -1
- data/src/ruby_lib/ruby_interface/version.rb +2 -2
- data/src/ruby_lib/webroar_app_loader.rb +4 -2
- data/src/worker/wkr_controller.c +200 -140
- data/src/worker/wkr_http.c +14 -28
- data/src/worker/wkr_http.h +4 -4
- data/src/worker/wkr_http_request.c +12 -11
- data/src/worker/wkr_http_request.h +7 -8
- data/src/worker/wkr_http_response.c +10 -14
- data/src/worker/wkr_http_response.h +0 -1
- data/src/worker/wkr_main.c +74 -140
- data/src/worker/wkr_static.c +295 -108
- data/src/worker/wkr_static.h +20 -7
- data/src/worker/worker.c +245 -70
- data/src/worker/worker.h +46 -34
- data/tasks/compile.rake +128 -175
- data/tasks/test.rake +345 -469
- data/test/spec/webroar_command_spec.rb +23 -0
- metadata +173 -43
- data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/README +0 -34
- data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/Rakefile +0 -13
- data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/init.rb +0 -5
- data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/lib/action_mailer_tls.rb +0 -16
- data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/lib/smtp_tls.rb +0 -123
- data/src/admin_panel/vendor/plugins/action_mailer_optional_tls/test/tls_test.rb +0 -42
- data/src/head/wr_config.h +0 -165
- data/src/ruby_lib/mailer/action_mailer_tls.rb +0 -16
- data/src/ruby_lib/mailer/smtp_tls.rb +0 -123
data/src/head/wr_controller.c
CHANGED
@@ -31,10 +31,17 @@
|
|
31
31
|
* USD: {YES/NO}
|
32
32
|
* PORT: <port> or SOCK_PATH: <sock_path>
|
33
33
|
* PID: <pid>
|
34
|
-
* 2)
|
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
|
-
*
|
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
|
-
*
|
55
|
+
* 5) Remove Application
|
49
56
|
* COMPONENT: APPLICATION
|
50
57
|
* METHOD: ADD
|
51
58
|
**/
|
52
59
|
|
53
|
-
|
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[
|
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
|
-
}
|
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
|
-
|
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
|
-
|
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,
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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(
|
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
|
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
|
-
|
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(
|
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,
|
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
|
-
|
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[
|
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",
|
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(
|
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,
|
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
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
}
|
data/src/head/wr_controller.h
CHANGED
@@ -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
|
-
|
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[
|
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
|
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
|
-
|
30
|
+
void cleanup(wr_svr_t *server) {
|
30
31
|
LOG_FUNCTION
|
31
32
|
|
32
33
|
// Delete 'webroar.sock' file
|
33
|
-
remove(
|
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(
|
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
|
-
|
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[
|
95
|
+
char str[STR_SIZE32];
|
94
96
|
|
95
|
-
int pid_FD=open(
|
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[
|
135
|
+
void *array[Config->Server.stack_trace];
|
134
136
|
size_t size;
|
135
137
|
char **bt_symbols;
|
136
|
-
char bt_string[
|
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,
|
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
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
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
|
-
|
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(
|
230
|
+
set_log_severity(Config->Server.log_level);
|
226
231
|
#endif
|
227
232
|
// Add Admin Panel
|
228
|
-
wr_conf_admin_panel_add(
|
233
|
+
wr_conf_admin_panel_add();
|
229
234
|
|
230
235
|
// Add staic file server
|
231
|
-
wr_conf_static_server_add(
|
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
|
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",
|
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");
|