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.
- 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");
|