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
@@ -18,9 +18,10 @@
18
18
  */
19
19
  #include <worker.h>
20
20
  #include <stdlib.h>
21
- #include <wr_logger.h>
22
21
  #include <assert.h>
23
22
 
23
+ extern config_t *Config;
24
+
24
25
  http_req_t* http_req_new() {
25
26
  LOG_FUNCTION
26
27
  http_req_t* req = wr_malloc(http_req_t);
@@ -109,7 +110,7 @@ int http_req_body_read(http_req_t *req, char *buf, int len) {
109
110
  }
110
111
 
111
112
  /** Read SCGI request body in buffer */
112
- static inline void http_req_body_read_in_buff(http_req_t *req, struct ev_loop *loop, struct ev_io *watcher) {
113
+ void http_req_body_read_in_buff(http_req_t *req, struct ev_loop *loop, struct ev_io *watcher) {
113
114
  LOG_FUNCTION
114
115
  ssize_t read = recv(watcher->fd,
115
116
  req->buf + req->scgi_header_len + req->bytes_read,
@@ -136,14 +137,14 @@ static inline void http_req_body_read_in_buff(http_req_t *req, struct ev_loop *l
136
137
  }
137
138
 
138
139
  /** Read SCGI request body in file */
139
- static inline void http_req_body_read_in_file(http_req_t *req, struct ev_loop *loop, struct ev_io *watcher) {
140
+ void http_req_body_read_in_file(http_req_t *req, struct ev_loop *loop, struct ev_io *watcher) {
140
141
  LOG_FUNCTION
141
- char buffer[WR_BUF_SIZE+1];
142
+ char buffer[STR_SIZE10KB+1];
142
143
  ssize_t read, write = 0, rv;
143
144
 
144
145
  read = recv(watcher->fd,
145
146
  buffer,
146
- wr_min(req->req_len - req->bytes_read, WR_BUF_SIZE),
147
+ wr_min(req->req_len - req->bytes_read, STR_SIZE10KB),
147
148
  0);
148
149
 
149
150
  if(read < 0) {
@@ -170,7 +171,7 @@ static inline void http_req_body_read_in_file(http_req_t *req, struct ev_loop *l
170
171
  }
171
172
 
172
173
  /** Read SCGI request body */
173
- static void http_req_body_cb(struct ev_loop *loop, struct ev_io *watcher, int revents) {
174
+ void http_req_body_cb(struct ev_loop *loop, struct ev_io *watcher, int revents) {
174
175
  LOG_FUNCTION
175
176
  wkr_t *w = (wkr_t*) watcher->data;
176
177
  http_req_t *req = w->http->req;
@@ -193,7 +194,7 @@ static void http_req_body_cb(struct ev_loop *loop, struct ev_io *watcher, int re
193
194
  }
194
195
 
195
196
  /** Parse SCGI request */
196
- static inline void parser_req_buf(http_req_t *req, struct ev_loop *loop, struct ev_io *watcher) {
197
+ void parser_req_buf(http_req_t *req, struct ev_loop *loop, struct ev_io *watcher) {
197
198
  LOG_FUNCTION
198
199
  if(req->scgi_header_len == 0) {
199
200
  // Fetch header packet length
@@ -234,7 +235,7 @@ static inline void parser_req_buf(http_req_t *req, struct ev_loop *loop, struct
234
235
  #ifdef L_DEBUG
235
236
  // Fetch Connection id
236
237
  wkr_t *w = (wkr_t*) watcher->data;
237
- scgi_header_t *header = scgi_header_get(req->scgi, WR_CONN_ID);
238
+ scgi_header_t *header = scgi_header_get(req->scgi, Config->Worker.Header.conn_id.str);
238
239
  if(header){
239
240
  w->http->conn_id = atoi(req->scgi->header + req->scgi->start_offset + header->value_offset);
240
241
  }else{
@@ -242,7 +243,7 @@ static inline void parser_req_buf(http_req_t *req, struct ev_loop *loop, struct
242
243
  }
243
244
 
244
245
  // Fetch request id
245
- header = scgi_header_get(req->scgi, WR_REQ_ID);
246
+ header = scgi_header_get(req->scgi, Config->Worker.Header.req_id.str);
246
247
  if(header){
247
248
  w->http->req_id = atoi(req->scgi->header + req->scgi->start_offset + header->value_offset);
248
249
  }else{
@@ -257,7 +258,7 @@ static inline void parser_req_buf(http_req_t *req, struct ev_loop *loop, struct
257
258
  req->bytes_read = 0;
258
259
  http_req_process();
259
260
  } else {
260
- if(req->req_len + req->scgi_header_len > WR_BUF_SIZE) {
261
+ if(req->req_len + req->scgi_header_len > STR_SIZE10KB) {
261
262
  ssize_t write;
262
263
  size_t processed_bytes = 0;
263
264
 
@@ -300,7 +301,7 @@ void http_req_header_cb(struct ev_loop *loop, struct ev_io *watcher, int revents
300
301
 
301
302
  ssize_t read = recv(watcher->fd
302
303
  , req->buf + req->bytes_read
303
- , WR_BUF_SIZE - req->bytes_read
304
+ , STR_SIZE10KB - req->bytes_read
304
305
  , 0
305
306
  );
306
307
  if(read < 0) {
@@ -19,7 +19,6 @@
19
19
  #ifndef WKR_HTTP_REQUEST_H_
20
20
  #define WKR_HTTP_REQUEST_H_
21
21
 
22
- #include <wr_config.h>
23
22
  #include <wr_helper.h>
24
23
  #include <errno.h>
25
24
  #include <ev.h>
@@ -29,13 +28,13 @@ typedef struct http_req_s http_req_t;
29
28
 
30
29
  /******* HTTP Request ******/
31
30
  struct http_req_s {
32
- char buf[WR_BUF_SIZE]; /**< Request buffer */
33
- size_t bytes_read;
34
- scgi_t *scgi; /**< Parsed SCGI request */
35
- FILE *file; /**< File pointer */
36
- char file_name[WR_STR_LEN]; /**< File name */
37
- size_t scgi_header_len; /**< Header packet length */
38
- size_t req_len; /**< Content length */
31
+ char buf[STR_SIZE10KB]; /**< Request buffer */
32
+ size_t bytes_read;
33
+ scgi_t *scgi; /**< Parsed SCGI request */
34
+ FILE *file; /**< File pointer */
35
+ char file_name[STR_SIZE64]; /**< File name */
36
+ size_t scgi_header_len; /**< Header packet length */
37
+ size_t req_len; /**< Content length */
39
38
  };
40
39
 
41
40
  http_req_t* http_req_new();
@@ -18,7 +18,8 @@
18
18
  */
19
19
  #include <worker.h>
20
20
  #include <stdlib.h>
21
- #include <wr_logger.h>
21
+
22
+ extern config_t *Config;
22
23
 
23
24
  http_resp_t* http_resp_new() {
24
25
  LOG_FUNCTION
@@ -83,12 +84,6 @@ void http_resp_set(http_resp_t *rsp) {
83
84
  rsp->scgi = NULL;
84
85
  }
85
86
 
86
- int http_resp_body_add(http_resp_t *rsp, const char* str, size_t len) {
87
- LOG_FUNCTION
88
- wr_buffer_add(rsp->resp_body, str, len);
89
- return 0;
90
- }
91
-
92
87
  int http_resp_process(http_resp_t *rsp) {
93
88
  LOG_FUNCTION
94
89
  rsp->scgi = scgi_new();
@@ -101,10 +96,10 @@ int http_resp_process(http_resp_t *rsp) {
101
96
  size_t len;
102
97
 
103
98
  len = sprintf(str, "%d", rsp->resp_code);
104
- scgi_header_add(rsp->scgi, RESP_CODE, strlen(RESP_CODE), str, len);
99
+ scgi_header_add(rsp->scgi, Config->Worker.Header.resp_code.str, Config->Worker.Header.resp_code.len, str, len);
105
100
 
106
101
  len = sprintf(str, "%d", rsp->resp_body->len);
107
- scgi_header_add(rsp->scgi, RESP_CONTENT_LENGTH, strlen(RESP_CONTENT_LENGTH), str, len);
102
+ scgi_header_add(rsp->scgi, Config->Worker.Header.resp_content_len.str, Config->Worker.Header.resp_content_len.len, str, len);
108
103
 
109
104
  scgi_content_length_add(rsp->scgi, rsp->resp_body->len + rsp->header.len);
110
105
 
@@ -126,14 +121,14 @@ void http_resp_file_write_cb(struct ev_loop* loop, struct ev_io* watcher, int re
126
121
  ssize_t sent;
127
122
 
128
123
  if (rsp->file) {
129
- char buffer[WR_REQ_BODY_MAX_SIZE];
124
+ char buffer[Config->Worker.max_body_size];
130
125
  ssize_t read;
131
126
  int rv = fseek(rsp->file, rsp->bytes_write, SEEK_SET);
132
127
  if (rv < 0) {
133
128
  LOG_ERROR(WARN, "Error reading file:%s", strerror(errno));
134
129
  return;
135
130
  }
136
- read = fread(buffer, 1, WR_REQ_BODY_MAX_SIZE, rsp->file);
131
+ read = fread(buffer, 1, Config->Worker.max_body_size, rsp->file);
137
132
  sent = send(watcher->fd, buffer, read, 0);
138
133
  }
139
134
 
@@ -212,14 +207,14 @@ void http_resp_file_send_cb(struct ev_loop* loop, struct ev_io* watcher, int rev
212
207
  return;
213
208
  }
214
209
  #else
215
- char buffer[WR_REQ_BODY_MAX_SIZE];
210
+ char buffer[Config->Worker.max_body_size];
216
211
  ssize_t read, sent;
217
212
  int rv = fseek(rsp->file, rsp->bytes_write, SEEK_SET);
218
213
  if(rv < 0) {
219
214
  LOG_ERROR(WARN,"Error reading file:%s",strerror(errno));
220
215
  return;
221
216
  }
222
- read = fread(buffer, 1, WR_REQ_BODY_MAX_SIZE, rsp->file);
217
+ read = fread(buffer, 1, Config->Worker.max_body_size, rsp->file);
223
218
  sent = send(watcher->fd, buffer, read, 0);
224
219
  if (sent < 0) {
225
220
  LOG_ERROR(SEVERE, "error in file sending: %s\n", strerror(errno));
@@ -274,7 +269,8 @@ void http_resp_header_write_cb(struct ev_loop* loop, struct ev_io* watcher, int
274
269
  LOG_DEBUG(DEBUG, "http_resp_header_write_cb() starting read watcher. bytes write=%d", rsp->bytes_write);
275
270
  if (rsp->resp_body->len > 0) {
276
271
  rsp->bytes_write = 0;
277
- if (w->http->is_static && w->http->resp->resp_code == 200) {
272
+ if (w->http->stat && w->http->resp->resp_code == 200 &&
273
+ rsp->resp_body->str == NULL) {
278
274
  ev_io_init(watcher, http_resp_file_send_cb, w->req_fd, EV_WRITE);
279
275
  //send_file(w);
280
276
  //ev_io_init(watcher, http_resp_file_write_cb, w->req_fd, EV_WRITE);
@@ -41,7 +41,6 @@ struct http_resp_s {
41
41
  http_resp_t* http_resp_new();
42
42
  void http_resp_free(http_resp_t**);
43
43
  void http_resp_set(http_resp_t*);
44
- int http_resp_body_add(http_resp_t*, const char* , size_t);
45
44
  int http_resp_process(http_resp_t*);
46
45
  void http_resp_scgi_write_cb(struct ev_loop*, struct ev_io*, int);
47
46
 
@@ -23,56 +23,28 @@
23
23
  #include <ruby.h>
24
24
  #include <rubysig.h>
25
25
  #include <execinfo.h>
26
- #ifdef __linux__
27
- #include <sys/prctl.h>
28
- #endif
29
26
 
30
- static wkr_t *worker = NULL;
27
+ #define DEFAULT_LOWER_LIMIT 1024
28
+ #define DEFAULT_UPPER_LIMIT 10485760
29
+
30
+ static wkr_t *worker = NULL;
31
+ config_t *Config = NULL;
31
32
 
32
33
  struct ev_loop *loop; // Event loop
33
34
  struct ev_idle idle_watcher;
34
- int is_alive = 1;
35
-
36
- static int drop_privileges(wkr_t *w) {
37
- change_log_file_owner(w->tmp->uid, w->tmp->gid);
38
- //setting read, effective, saved group and user id
39
- if(setgid(w->tmp->gid)!=0) {
40
- LOG_ERROR(SEVERE,"setegid() failed");
41
- return -1;
42
- }
43
- if(setuid(w->tmp->uid)!=0) {
44
- LOG_ERROR(SEVERE,"seteuid() failed");
45
- return -1;
46
- }
47
-
48
- LOG_DEBUG(DEBUG,"Passed userid=%d and groupid=%d",
49
- w->tmp->uid, w->tmp->gid);
50
- LOG_DEBUG(DEBUG,"effective userid=%d and groupid=%d",geteuid(),getegid());
51
- #ifdef __linux__
52
- int rv = prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
53
- LOG_DEBUG(DEBUG,"prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) = %d", rv);
54
- if (rv < 0) {
55
- LOG_ERROR(SEVERE,"error setting prctl(PR_SET_DUMPABLE, 1, 0, 0, 0), errno = %d, desc = %s", errno, strerror(errno));
56
- }
57
- #endif
58
- return 0;
59
- }
35
+ int is_alive = 1;
60
36
 
61
37
  /** Usage */
62
- static inline void print_usage(char *appname) {
63
- printf("usage: \n%s -a <application_path> [-e <environment>] [-u <cuid >] [-g <cgid>] ",appname);
64
- printf("[-c <control port/sock path>] [-i <uds>] [-t <application_type>] [-n <application_name>] ");
65
- printf("[-p <analytics>] [-r <application baseuri>]\n");
66
- printf("<application_path> = path of rails application. e.g. /home/xyz/rails_projects/app1\n");
67
- printf("<environment> = rails environment. development/production. Default is production.\n");
68
- printf("<cuid> = User id.\n");
69
- printf("<cgid> = Group id.\n");
70
- printf("<control port/sock path> = Control port number (control sock path in case [-i 1])\n");
38
+ void print_usage(char *appname) {
39
+ printf("usage: \n%s [-c <control_port/sock_path>] [-i <uds>] [-n <application_name>]",appname);
40
+ printf("[-l <log_level>] [-f <log_file>] [-o <root_path>] [-k <keep_alive>]\n");
41
+ printf("<control_port/sock_path> = Control port number (control sock path in case [-i 1])\n");
71
42
  printf("<uds> = Unix domain socket flag. Value should be 0 or 1.\n");
72
- printf("<application_type> = Type of application {rails, merb}.\n");
73
43
  printf("<application_name> = Name of application\n");
74
- printf("<analytics> = Analytics flag. Value should be yes or no.\n");
75
- printf("<baseuri> = Application URL baseuri.\n");
44
+ printf("<log_level> = Logging Level\n");
45
+ printf("<log_file> = Name of the log file\n");
46
+ printf("<root_path> = Root directory path\n");
47
+ printf("<keep_alive> = Keep Alive flag value must be 'y'/'n'\n");
76
48
  }
77
49
 
78
50
  void sigproc() {
@@ -83,11 +55,12 @@ void sigproc() {
83
55
 
84
56
  void cleanup() {
85
57
  LOG_FUNCTION
86
- stop_idle_watcher();
58
+ ev_idle_stop(loop, &idle_watcher);
87
59
  LOG_DEBUG(DEBUG,"stoping event loop");
88
60
  ev_unloop(loop,EVUNLOOP_ALL);
89
61
  //TODO: send worker stopping signal
90
62
  worker_free(&worker);
63
+ wr_worker_config_free(Config);
91
64
  LOG_INFO("Worker stopped and exiting gracefully.");
92
65
  close_logger();
93
66
  exit(0);
@@ -95,10 +68,10 @@ void cleanup() {
95
68
 
96
69
  /** Handle segmentation fault */
97
70
  void crash_handler(int sig) {
98
- void *array[WR_STACKTRACE_SIZE];
71
+ void *array[Config->Worker.stack_tace];
99
72
  size_t size;
100
73
  char **bt_symbols;
101
- char bt_string[WR_STACKTRACE_SIZE * WR_LONG_STR_LEN * 2];
74
+ char bt_string[Config->Worker.stack_tace * STR_SIZE256];
102
75
  int i;
103
76
 
104
77
  LOG_ERROR(FATAL, "Got %d signal, trying to create core file.", sig);
@@ -129,7 +102,7 @@ void crash_handler(int sig) {
129
102
  }
130
103
  sleep(5);
131
104
  // get void*'s for all entries on the stack
132
- size = backtrace(array, WR_STACKTRACE_SIZE);
105
+ size = backtrace(array, Config->Worker.stack_tace);
133
106
  bt_symbols = backtrace_symbols(array, size);
134
107
  strcpy(bt_string, "\n");
135
108
  for(i = 0; i < size; i++) {
@@ -142,34 +115,43 @@ void crash_handler(int sig) {
142
115
  cleanup();
143
116
  }
144
117
 
118
+ /** Read and set Worker Configuration **/
119
+ void wr_worker_config_read(){
120
+ LOG_FUNCTION
121
+ node_t *root;
122
+
123
+ LOG_DEBUG(4,"YAML file path %s", Config->Worker.File.internal_config);
124
+ root = yaml_parse(Config->Worker.File.internal_config.str);
125
+
126
+ if(!root) {
127
+ LOG_ERROR(SEVERE, "Config file found with erroneous entries. Please correct it.");
128
+ printf("Config file found with erroneous entries. Please correct it.\n");
129
+ return;
130
+ }
131
+
132
+ wr_set_numeric_value(root, "Worker/maximum_request_body_size", &Config->Worker.max_body_size, FALSE);
133
+ node_free(root);
134
+
135
+ Config->Worker.Compress.lower_limit = DEFAULT_LOWER_LIMIT;
136
+ Config->Worker.Compress.upper_limit = DEFAULT_UPPER_LIMIT;
137
+ }
138
+
145
139
  /** Parse command line arguments */
146
- static inline wkr_tmp_t* parse_args(int argc, char **argv) {
140
+ wkr_tmp_t* parse_args(int argc, char **argv) {
147
141
  int option;
148
142
  extern char *optarg;
149
143
  size_t len;
150
144
  char *str;
151
- int invalid_arg_flag = 0, app_path_flag = 0, log_level = INFO;
145
+ int invalid_arg_flag = 0, log_level = INFO;
152
146
  wkr_tmp_t *tmp = wkr_tmp_new();
153
-
147
+
154
148
  if(tmp == NULL)
155
149
  return NULL;
156
-
157
- while ( (option=getopt(argc,argv,"a:b:e:l:f:g:u:c:i:t:n:o:p:r:k:")) != -1 ) {
150
+
151
+ while ( (option=getopt(argc,argv,"l:f:c:i:n:o:k:")) != -1 ) {
158
152
  str = optarg;
159
153
  len = strlen(str);
160
- switch ( option ) {
161
- case 'a': // Application Path
162
- wr_string_new(tmp->path, str, len);
163
- app_path_flag = 1;
164
- break;
165
- case 'b': // Ruby library path
166
- wr_string_new(tmp->ruby_path, str, len);
167
- tmp->script_path.str = (char*) malloc(sizeof(char)*(tmp->ruby_path.len + 32));
168
- tmp->script_path.len = sprintf(tmp->script_path.str, "%s%swebroar_app_loader.rb", tmp->ruby_path.str, WR_PATH_SEPARATOR);
169
- break;
170
- case 'e': // Application environment
171
- wr_string_new(tmp->env, str, len);
172
- break;
154
+ switch ( option ) {
173
155
  case 'l': // Logging level
174
156
  log_level = atoi(optarg);
175
157
  break;
@@ -177,12 +159,6 @@ static inline wkr_tmp_t* parse_args(int argc, char **argv) {
177
159
  wr_string_free(tmp->log_file);
178
160
  wr_string_new(tmp->log_file, str, len);
179
161
  break;
180
- case 'g': // Group id
181
- tmp->gid = atoi(optarg);
182
- break;
183
- case 'u': // User id
184
- tmp->uid = atoi(optarg);
185
- break;
186
162
  case 'c': // Control path
187
163
  wr_string_new(tmp->ctl_path, str, len);
188
164
  break;
@@ -191,9 +167,6 @@ static inline wkr_tmp_t* parse_args(int argc, char **argv) {
191
167
  tmp->is_uds = TRUE;
192
168
  }
193
169
  break;
194
- case 't': // Application type
195
- wr_string_new(tmp->type, str, len);
196
- break;
197
170
  case 'n': // Application name
198
171
  wr_string_new(tmp->name, str, len);
199
172
  wr_string_free(tmp->log_file);
@@ -203,14 +176,6 @@ static inline wkr_tmp_t* parse_args(int argc, char **argv) {
203
176
  case 'o': // Server root path
204
177
  wr_string_new(tmp->root_path, str, len);
205
178
  break;
206
- case 'r': // Applicaiton base uri
207
- wr_string_new(tmp->resolver, str, len);
208
- break;
209
- case 'p': // Analytics flag
210
- if(strcmp(optarg, "y")==0) {
211
- tmp->profiler = 'y';
212
- }
213
- break;
214
179
  case 'k':
215
180
  if(strcmp(optarg, "n")==0) {
216
181
  tmp->keep_alive = FALSE;
@@ -220,9 +185,12 @@ static inline wkr_tmp_t* parse_args(int argc, char **argv) {
220
185
  invalid_arg_flag++;
221
186
  }
222
187
  }
223
-
188
+
189
+ Config = wr_worker_config_init(tmp->root_path.str);
190
+ wr_worker_config_read();
191
+
224
192
  if(tmp->log_file.str){
225
- initialize_logger(tmp->log_file.str, WR_SERVER, WR_VERSION);
193
+ initialize_logger(tmp->log_file.str, Config->Worker.Server.name.str, Config->Worker.Server.version.str);
226
194
  redirect_standard_io();
227
195
  #ifdef L_DEBUG
228
196
  set_log_severity(DEBUG);
@@ -232,14 +200,16 @@ static inline wkr_tmp_t* parse_args(int argc, char **argv) {
232
200
  }else{
233
201
  perror("Log file is not specified.");
234
202
  }
235
-
236
- if (invalid_arg_flag > 0 || app_path_flag == 0) {
203
+
204
+ if (invalid_arg_flag > 0 || tmp->root_path.str == NULL || Config == NULL) {
237
205
  print_usage(argv[0]);
238
- LOG_ERROR(SEVERE, "Either argument is invalid or application path is not passed.");
206
+ LOG_ERROR(SEVERE, "Either argument is invalid or application/root path is not passed.");
239
207
  wkr_tmp_free(&tmp);
208
+ wr_worker_config_free(Config);
240
209
  return NULL;
241
210
  }
242
- if(strcmp(tmp->name.str, WR_STATIC_FILE_SERVER_NAME) == 0){
211
+
212
+ if(strcmp(tmp->name.str, Config->Worker.static_server.str) == 0){
243
213
  tmp->is_static = 1;
244
214
  }
245
215
  return tmp;
@@ -252,11 +222,6 @@ void start_idle_watcher() {
252
222
  }
253
223
  }
254
224
 
255
- void stop_idle_watcher() {
256
- LOG_FUNCTION
257
- ev_idle_stop(loop, &idle_watcher);
258
- }
259
-
260
225
  void idle_cb (struct ev_loop *loop, struct ev_idle *w, int revents) {
261
226
  LOG_FUNCTION
262
227
  /* Calling libev's blocking call ev_loop() between TRAP_* macros were working on Ruby 1.8,
@@ -264,7 +229,7 @@ void idle_cb (struct ev_loop *loop, struct ev_idle *w, int revents) {
264
229
  */
265
230
  if(rb_thread_alone()) {
266
231
  /* Stop scheduling ruby threads, there is only one! */
267
- stop_idle_watcher();
232
+ ev_idle_stop(loop, &idle_watcher);
268
233
  } else {
269
234
  /* TODO: Found following three api to schedule ruby threads
270
235
  * rb_thread_schedule() was getting called infinitely and eating most of the CPU.
@@ -280,10 +245,16 @@ void idle_cb (struct ev_loop *loop, struct ev_idle *w, int revents) {
280
245
  }
281
246
  }
282
247
 
248
+ void init_idle_watcher(wkr_t *w){
249
+ if(!w->http->stat){
250
+ ev_idle_init (&idle_watcher, idle_cb);
251
+ start_idle_watcher();
252
+ }
253
+ }
254
+
283
255
  int main(int argc, char **argv) {
284
- int retval = 0;
285
256
  wkr_t* w = NULL;
286
-
257
+
287
258
  if(argc == 1) {
288
259
  print_usage(argv[0]);
289
260
  return -1;
@@ -298,70 +269,33 @@ int main(int argc, char **argv) {
298
269
  wkr_tmp_t *tmp = parse_args(argc, argv);
299
270
  if(tmp == NULL)
300
271
  return -1;
301
-
302
272
  loop = ev_default_loop (0);
303
273
 
304
274
  w = worker_new(loop, tmp);
305
- if(w==NULL)
306
- goto err;
307
- worker = w;
308
275
 
309
- LOG_DEBUG(DEBUG,"control path = %s, Application baseuri = %s",
310
- w->tmp->ctl_path.str, w->tmp->resolver.str);
311
-
312
- if((retval = drop_privileges(w))!=0) {
313
- goto err;
314
- }
315
-
316
- w->http = http_new(w);
317
- if(w->http == NULL) {
318
- LOG_ERROR(SEVERE,"unable to load application.");
319
- goto err;
320
- }
321
-
322
- retval = worker_connect(w);
323
- if(retval<0) {
324
- LOG_ERROR(WARN,"Error Initializing Workers.");
325
- retval = -1;
326
- goto err;
276
+ if(w==NULL){
277
+ wr_worker_config_free(Config);
278
+ return -1;
327
279
  }
328
280
 
329
- //loading adapter according to application type
330
- LOG_DEBUG(DEBUG,"ruby lib = %s and webroar_root = %s",
331
- w->tmp->ruby_path.str, w->tmp->root_path.str);
332
- LOG_DEBUG(DEBUG,"path = %s, name = %s, type = %s, environment = %s, baseuri = %s, analytics = %c",
333
- w->tmp->path.str, w->tmp->name.str, w->tmp->type.str,
334
- w->tmp->env.str, w->tmp->resolver.str, w->tmp->profiler);
335
-
336
- LOG_INFO("Successfully loaded rack application=%s with environment=%s",
337
- w->tmp->path.str, w->tmp->env.str);
338
-
281
+ worker = w;
282
+
339
283
  //TODO: Windows Portability?
340
284
  signal(SIGHUP, sigproc); /* catch hangup signal */
341
285
  signal(SIGINT, sigproc);
342
286
  signal(SIGTERM, sigproc);
343
- // signal(SIGCHLD, SIG_IGN);
287
+ // signal(SIGCHLD, SIG_IGN);
344
288
  signal(SIGTSTP, SIG_IGN);
345
289
  signal(SIGTTOU, SIG_IGN);
346
- signal(SIGTTIN, SIG_IGN);
290
+ signal(SIGTTIN, SIG_IGN);
347
291
  signal(SIGPIPE, SIG_IGN);
348
292
 
349
- worker_accept_requests(w);
350
- LOG_INFO("Worker ready for serving requests.");
351
-
352
- if(!w->http->is_static){
353
- ev_idle_init (&idle_watcher, idle_cb);
354
- start_idle_watcher();
355
- }
356
-
357
293
  while(is_alive ==1) {
358
294
  /* TODO: wrapping ev_loop() between TARP_* macros didn't worked in Ruby 1.9 */
359
295
  //TRAP_BEG;
360
296
  ev_loop(loop,EVLOOP_ONESHOT);
361
297
  //TRAP_END;
362
298
  }
363
-
364
- err:
365
299
  cleanup();
366
- return retval;
300
+ return 0;
367
301
  }