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
data/src/head/wr_worker.h CHANGED
@@ -25,24 +25,39 @@
25
25
 
26
26
  /** Worker states */
27
27
  typedef enum{
28
- WR_WKR_CLEAR = 0,
29
- WR_WKR_ACTIVE = 1, //worker is active to service an application
30
- WR_WKR_ERROR = 2,
31
- WR_WKR_CONNECTING = 4,
32
- WR_WKR_REMOVING = 8,
33
- WR_WKR_DISCONNECT = 16,
34
- WR_WKR_PING_SENT = 32, //Sent PING when worker found idle for certain time
35
- WR_WKR_PING_REPLIED = 64, //PING replied, indicating worker is live
36
- WR_WKR_HANG = 128,
37
- WR_WKR_OLD = 256
28
+ WKR_STATE_CONNECTING = 100,
29
+ WKR_STATE_ACTIVE = 200,
30
+ WKR_STATE_INACTIVE = 201,
31
+ WKR_STATE_PINGING = 202,
32
+ WKR_STATE_EXPIRED = 203,
33
+ WKR_STATE_ERROR = 401,
34
+ WKR_STATE_TIMEDOUT = 402,
35
+ WKR_STATE_ERROR_ACK = 403,
36
+ WKR_STATE_HANGUP = 404,
37
+ WKR_STATE_DISCONNECTING = 501
38
38
  }wr_wkr_state_t;
39
39
 
40
+ /** Worker actions */
41
+ typedef enum{
42
+ WKR_ACTION_ADD,
43
+ WKR_ACTION_ADD_TIMEOUT,
44
+ WKR_ACTION_ADD_ERROR,
45
+ WKR_ACTION_REMOVE,
46
+ WKR_ACTION_PING,
47
+ WKR_ACTION_PING_TIMEOUT,
48
+ WKR_ACTION_PING_REPLAY,
49
+ WKR_ACTION_REQ_PROCESSED,
50
+ WKR_ACTION_REQ_PROCESSING,
51
+ WKR_ACTION_ERROR
52
+ }wr_wkr_action_t;
53
+
54
+
40
55
  /** Worker structure */
41
56
  struct wr_wkr_s {
42
- wr_u_short id; /**< Worker index/id */
43
- int state; /**< Worker state */
44
- wr_u_short pid; /**< Worker id */
45
- struct ev_loop *loop;
57
+ wr_u_short id; /**< Worker index/id */
58
+ wr_wkr_state_t state; /**< Worker state */
59
+ wr_u_short pid; /**< Worker id */
60
+ struct ev_loop *loop;
46
61
 
47
62
  int fd; /**< Socket fd */
48
63
  ev_io watcher; /**< watcher */
@@ -50,29 +65,27 @@ struct wr_wkr_s {
50
65
  ev_timer t_wait; /**< idle watcher for worker */
51
66
  wr_u_short trials_done; /**< Number of time we want to send PING before killing */
52
67
 
53
- wr_ctl_t *ctl; /**< Pointer to control structure */
68
+ wr_ctl_t *ctl; /**< Pointer to control structure */
54
69
  wr_req_t *req;
55
70
  wr_app_t *app; /**< Application pointer*/
56
71
  };
57
72
 
58
- /** Create new worker */
59
- wr_wkr_t* wr_wkr_new(wr_ctl_t*);
60
73
  /** Destroy worker */
61
74
  void wr_wkr_free(wr_wkr_t*);
62
75
  /** Remove worker */
63
76
  int wr_wkr_remove(wr_wkr_t*, int);
64
77
  /** Create the Worker */
65
- int wr_wkr_create(wr_svr_t*, wr_app_conf_t*);
78
+ int wr_wkr_create(wr_svr_t*, config_application_list_t*);
66
79
  /** Dispatch the request to Worker process */
67
80
  void wr_wkr_dispatch_req(wr_req_t*);
68
- /** Handle connect request from Worker */
69
- //int wr_wkr_connect(wr_ctl_msg_t*, wr_ctl_t*);
70
81
  /** This would get called when worker reply to PING */
71
82
  //void wr_wkr_ping_reply(wr_wkr_t*);
72
83
  /** Worker add callback */
73
84
  void wr_wkr_add_cb(wr_ctl_t*, const wr_ctl_msg_t*);
74
85
  /** Worker remove callback */
75
86
  void wr_wkr_remove_cb(wr_ctl_t*, const wr_ctl_msg_t*);
87
+ /** Worker Add error callback */
88
+ void wr_wkr_add_error_cb(wr_ctl_t*, const wr_ctl_msg_t*);
76
89
  /** Worker ping callback */
77
90
  void wr_wkr_ping_cb(wr_ctl_t*, const wr_ctl_msg_t*);
78
91
 
@@ -0,0 +1,316 @@
1
+ /* WebROaR - Ruby Application Server - http://webroar.in/
2
+ * Copyright (C) 2009 Goonj LLC
3
+ *
4
+ * This file is part of WebROaR.
5
+ *
6
+ * WebROaR is free software: you can redistribute it and/or modify
7
+ * it under the terms of the GNU General Public License as published by
8
+ * the Free Software Foundation, either version 3 of the License, or
9
+ * (at your option) any later version.
10
+ *
11
+ * WebROaR is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with WebROaR. If not, see <http://www.gnu.org/licenses/>.
18
+ */
19
+
20
+ /*****************************************************************
21
+ * Set Configuration parameters
22
+ *****************************************************************/
23
+
24
+ #include <wr_config.h>
25
+ #include <sys/socket.h>
26
+
27
+ #define SERVER_NAME "WebROaR"
28
+ #define SERVER_VERSION "0.4.0"
29
+
30
+ #define FILE_PATH "FILE_PATH"
31
+ #define CONN_ID "CONNECTION_ID"
32
+ #define REQ_ID "REQ_ID"
33
+ #define RESP_CODE "RESP_CODE"
34
+ #define RESP_CONTENT_LEN "RESP_CONTENT_LEN"
35
+
36
+ int wr_config_server_init(config_t *Config, const char* root_path){
37
+ wr_string_new(Config->Server.Dir.root, root_path, strlen(root_path));
38
+
39
+ Config->Server.Control.conn_pool = 5;
40
+ wr_string_new(Config->Server.Control.sock_path, "/tmp/webroar_controller_sock", strlen("/tmp/webroar_controller_sock"));
41
+
42
+ wr_string_new(Config->Server.File.sock, "/tmp/webroar.sock", strlen("/tmp/webroar.sock"));
43
+ wr_string_new(Config->Server.File.pid, "/var/run/webroar.pid", strlen("/var/run/webroar.pid"));
44
+ wr_string_new(Config->Server.File.high_rss, "/var/run/high_rss.pid", strlen("/var/run/high_rss.pid"));
45
+ wr_string_new(Config->Server.File.log, "webroar.log", strlen("webroar.log"));
46
+ wr_string_dump(Config->Server.File.config, Config->Server.Dir.root);
47
+ wr_string_append(Config->Server.File.config, "/conf/config.yml", strlen("/conf/config.yml"));
48
+ wr_string_dump(Config->Server.File.internal_config, Config->Server.Dir.root);
49
+ wr_string_append(Config->Server.File.internal_config, "/conf/server_internal_config.yml", strlen("/conf/server_internal_config.yml"));
50
+ wr_string_dump(Config->Server.File.worker_bin, Config->Server.Dir.root);
51
+ wr_string_append(Config->Server.File.worker_bin, "/bin/webroar-worker", strlen("/bin/webroar-worker"));
52
+
53
+ wr_string_dump(Config->Server.Dir.admin_panel, Config->Server.Dir.root);
54
+ wr_string_append(Config->Server.Dir.admin_panel, "/admin_panel", strlen("/admin_panel"));
55
+
56
+ Config->Server.Worker.max = 20;
57
+ Config->Server.Worker.pending = 10;
58
+ Config->Server.Worker.add_trials = 3;
59
+ Config->Server.Worker.add_wait = 1800;
60
+ Config->Server.Worker.add_timeout = 25;
61
+ Config->Server.Worker.kill_timeout= 10;
62
+ Config->Server.Worker.idle_time = 60;
63
+ Config->Server.Worker.ping_timeout= 15;
64
+ Config->Server.Worker.ping_trials = 2;
65
+
66
+ #ifdef HAVE_GNUTLS
67
+ Config->Server.SSL.port = 443;
68
+ wr_string_null(Config->Server.SSL.certificate);
69
+ wr_string_null(Config->Server.SSL.key);
70
+ #endif
71
+
72
+ wr_string_new(Config->Server.name, SERVER_NAME, strlen(SERVER_NAME));
73
+ wr_string_new(Config->Server.version, SERVER_VERSION, strlen(SERVER_VERSION));
74
+
75
+ Config->Server.port = 3000;
76
+ Config->Server.log_level = SEVERE;
77
+ // using 'AF_UNIX' macro to identify UDS support.
78
+ #ifdef AF_UNIX
79
+ Config->Server.flag = SERVER_UDS_SUPPORT;
80
+ #else
81
+ Config->Server.flag = 0;
82
+ #endif
83
+ Config->Server.flag |= SERVER_KEEP_ALIVE;
84
+ Config->Server.stack_trace = 50;
85
+
86
+ return TRUE;
87
+ }
88
+
89
+ int wr_config_application_init(config_t *Config){
90
+ Config->Application.Default.max_workers = 4;
91
+ Config->Application.Default.min_workers = 8;
92
+ wr_string_new(Config->Application.Default.env, "production", strlen("production"));
93
+
94
+ wr_string_new(Config->Application.Admin_panel.name, "Admin Panel", strlen("Admin Panel"));
95
+ wr_string_new(Config->Application.Admin_panel.base_uri, "/admin-panel", strlen("/admin-panel"));
96
+
97
+ wr_string_new(Config->Application.Static_server.name, "static-worker", strlen("static-worker"));
98
+ Config->Application.Static_server.min_workers = 4;
99
+ Config->Application.Static_server.max_workers = 8;
100
+
101
+ wr_string_new(Config->Application.analytics_on, "enabled", strlen("enabled"));
102
+ Config->Application.msg_queue_size = 2048;
103
+ Config->Application.max_req_ratio = 1;
104
+ Config->Application.min_req_ratio = 3;
105
+ Config->Application.high_load = 2;
106
+ Config->Application.low_load = 600;
107
+ Config->Application.max_hosts = 16;
108
+
109
+ Config->Application.list = NULL;
110
+
111
+ return TRUE;
112
+ }
113
+
114
+ int wr_config_worker_init(config_t *Config, const char *root_path){
115
+
116
+ wr_u_short root_path_len = strlen(root_path);
117
+
118
+ wr_string_new(Config->Worker.File.config, root_path, root_path_len);
119
+ wr_string_append(Config->Worker.File.config, "/conf/config.yml", strlen("/conf/config.yml"));
120
+ wr_string_new(Config->Worker.File.mime_type, root_path, root_path_len);
121
+ wr_string_append(Config->Worker.File.mime_type, "/conf/mime_type.yml", strlen("/conf/mime_type.yml"));
122
+ wr_string_new(Config->Worker.File.internal_config, root_path, root_path_len);
123
+ wr_string_append(Config->Worker.File.internal_config, "/conf/server_internal_config.yml", strlen("/conf/server_internal_config.yml"));
124
+ wr_string_new(Config->Worker.File.app_loader, root_path, root_path_len);
125
+ wr_string_append(Config->Worker.File.app_loader, "/src/ruby_lib/webroar_app_loader.rb", strlen("/src/ruby_lib/webroar_app_loader.rb"));
126
+
127
+ wr_string_new(Config->Worker.Header.file_path, FILE_PATH, strlen(FILE_PATH));
128
+ wr_string_new(Config->Worker.Header.conn_id, CONN_ID, strlen(CONN_ID));
129
+ wr_string_new(Config->Worker.Header.req_id, REQ_ID, strlen(REQ_ID));
130
+ wr_string_new(Config->Worker.Header.resp_code, RESP_CODE, strlen(RESP_CODE));
131
+ wr_string_new(Config->Worker.Header.resp_content_len, RESP_CONTENT_LEN, strlen(RESP_CONTENT_LEN));
132
+
133
+ wr_string_new(Config->Worker.Server.name, SERVER_NAME, strlen(SERVER_NAME));
134
+ wr_string_new(Config->Worker.Server.version, SERVER_VERSION, strlen(SERVER_VERSION));
135
+
136
+ wr_string_new(Config->Worker.static_server, "static-worker", strlen("static-worker"));
137
+ wr_string_new(Config->Worker.sock_path, "/tmp/webroar_worker_sock", strlen("/tmp/webroar_worker_sock"));
138
+ Config->Worker.stack_tace = 50;
139
+ Config->Worker.max_body_size = 65536;
140
+
141
+ Config->Worker.Compress.lower_limit = 10240; //10KB
142
+ Config->Worker.Compress.upper_limit = 1024*1024; //1MB
143
+
144
+ return TRUE;
145
+ }
146
+
147
+ int wr_config_request_init(config_t *Config){
148
+ Config->Request.prefix_hash = 5381;
149
+ Config->Request.conn_pool = 10;
150
+ Config->Request.max_body_size = 65536;
151
+ Config->Request.max_uri_size = 12288;
152
+ Config->Request.max_path_size = 1024;
153
+ Config->Request.max_frag_size = 1024;
154
+ Config->Request.max_query_size = 1024;
155
+ Config->Request.max_field_size = 256;
156
+ Config->Request.max_value_size = 81920;
157
+ Config->Request.max_header_size = 112640;
158
+ Config->Request.max_header_count= 40;
159
+
160
+ #ifdef L_DEBUG
161
+ wr_string_new(Config->Request.Header.conn_id, CONN_ID, strlen(CONN_ID));
162
+ wr_string_new(Config->Request.Header.req_id, REQ_ID, strlen(REQ_ID));
163
+ #endif
164
+ wr_string_new(Config->Request.Header.file_path, FILE_PATH, strlen(FILE_PATH));
165
+ wr_string_new(Config->Request.Header.resp_code, RESP_CODE, strlen(RESP_CODE));
166
+ wr_string_new(Config->Request.Header.resp_content_len, RESP_CONTENT_LEN, strlen(RESP_CONTENT_LEN));
167
+
168
+ return TRUE;
169
+ }
170
+
171
+ config_t* wr_worker_config_init(const char* root_path){
172
+ config_t *Config;
173
+ if(root_path == NULL) return NULL;
174
+ Config = wr_malloc(config_t);
175
+
176
+ if(Config){
177
+ if(!wr_config_worker_init(Config, root_path)){
178
+ free(Config);
179
+ return NULL;
180
+ }
181
+ }
182
+
183
+ return Config;
184
+ }
185
+
186
+ config_t* wr_server_config_init(const char *root_path){
187
+ config_t *Config;
188
+ wr_u_short retval = TRUE;
189
+
190
+ if(root_path == NULL) return NULL;
191
+ Config = wr_malloc(config_t);
192
+
193
+
194
+ if(Config){
195
+ if(!wr_config_server_init(Config, root_path)) retval = FALSE;
196
+ if(!wr_config_request_init(Config)) retval = FALSE;
197
+ if(! wr_config_application_init(Config)) retval = FALSE;
198
+ }
199
+
200
+ if(retval == FALSE){
201
+ free(Config);
202
+ return NULL;
203
+ }
204
+
205
+ return Config;
206
+ }
207
+
208
+ void wr_config_server_free(config_t *Config){
209
+ wr_string_free(Config->Server.Control.sock_path);
210
+ wr_string_free(Config->Server.File.sock);
211
+ wr_string_free(Config->Server.File.pid);
212
+ wr_string_free(Config->Server.File.high_rss);
213
+ wr_string_free(Config->Server.File.log);
214
+ wr_string_free(Config->Server.File.config);
215
+ wr_string_free(Config->Server.File.internal_config);
216
+ wr_string_free(Config->Server.File.worker_bin);
217
+ wr_string_free(Config->Server.Dir.admin_panel);
218
+ wr_string_free(Config->Server.Dir.root);
219
+ #ifdef HAVE_GNUTLS
220
+ wr_string_free(Config->Server.SSL.certificate);
221
+ wr_string_free(Config->Server.SSL.key);
222
+ #endif
223
+ wr_string_free(Config->Server.name);
224
+ wr_string_free(Config->Server.version);
225
+ }
226
+
227
+ void wr_config_request_free(config_t *Config){
228
+ #ifdef L_DEBUG
229
+ wr_string_free(Config->Request.Header.conn_id);
230
+ wr_string_free(Config->Request.Header.req_id);
231
+ #endif
232
+ wr_string_free(Config->Request.Header.file_path);
233
+ wr_string_free(Config->Request.Header.resp_code);
234
+ wr_string_free(Config->Request.Header.resp_content_len);
235
+ }
236
+
237
+ void wr_config_application_free(config_t *Config){
238
+ wr_string_free(Config->Application.Default.env);
239
+ wr_string_free(Config->Application.Admin_panel.name);
240
+ wr_string_free(Config->Application.Admin_panel.base_uri);
241
+ wr_string_free(Config->Application.Static_server.name);
242
+ wr_string_free(Config->Application.analytics_on);
243
+ wr_application_list_free(Config->Application.list);
244
+ }
245
+
246
+ void wr_config_worker_free(config_t *Config){
247
+ wr_string_free(Config->Worker.File.config);
248
+ wr_string_free(Config->Worker.File.mime_type);
249
+ wr_string_free(Config->Worker.File.internal_config);
250
+ wr_string_free(Config->Worker.File.app_loader);
251
+ wr_string_free(Config->Worker.Header.file_path);
252
+ wr_string_free(Config->Worker.Header.conn_id);
253
+ wr_string_free(Config->Worker.Header.req_id);
254
+ wr_string_free(Config->Worker.Header.resp_code);
255
+ wr_string_free(Config->Worker.Header.resp_content_len);
256
+ wr_string_free(Config->Worker.Server.name);
257
+ wr_string_free(Config->Worker.Server.version);
258
+ wr_string_free(Config->Worker.static_server);
259
+ wr_string_free(Config->Worker.sock_path);
260
+ }
261
+
262
+ void wr_host_list_free(config_host_list_t *list) {
263
+ config_host_list_t *next;
264
+ while(list) {
265
+ next = list->next;
266
+ wr_string_free(list->name);
267
+ free(list);
268
+ list = next;
269
+ }
270
+ }
271
+
272
+ /** Destroy application configuration */
273
+ void wr_application_list_free(config_application_list_t* list){
274
+ LOG_FUNCTION
275
+ config_application_list_t* next;
276
+
277
+ // Iterate applications and destroy each application
278
+ while(list) {
279
+ next = list->next;
280
+ wr_string_free(list->name);
281
+ wr_string_free(list->baseuri);
282
+ wr_string_free(list->path);
283
+ scgi_free(list->scgi);
284
+ wr_host_list_free(list->host_name_list);
285
+ wr_application_list_free(list->new);
286
+ free(list);
287
+ list = next;
288
+ }
289
+ }
290
+
291
+ void wr_server_config_free(config_t *Config){
292
+ if(Config == NULL) return;
293
+ wr_config_server_free(Config);
294
+ wr_config_request_free(Config);
295
+ wr_config_application_free(Config);
296
+ free(Config);
297
+ }
298
+
299
+ void wr_worker_config_free(config_t *Config){
300
+ if(Config == NULL) return;
301
+ wr_config_worker_free(Config);
302
+ free(Config);
303
+ }
304
+
305
+ void wr_set_numeric_value(node_t *root, const char *path, void *value, wr_u_short flag){
306
+ char *str = wr_validate_string(get_node_value(root, path));
307
+ long *lvalue = (long*) value;
308
+ if(str) {
309
+ wr_u_long val = atoi(str);
310
+ if(val > 0){
311
+ *lvalue = val;
312
+ }else if(flag && strcmp(str,"0") == 0){
313
+ *lvalue = 0;
314
+ }
315
+ }
316
+ }
@@ -0,0 +1,235 @@
1
+ /* WebROaR - Ruby Application Server - http://webroar.in/
2
+ * Copyright (C) 2009 Goonj LLC
3
+ *
4
+ * This file is part of WebROaR.
5
+ *
6
+ * WebROaR is free software: you can redistribute it and/or modify
7
+ * it under the terms of the GNU General Public License as published by
8
+ * the Free Software Foundation, either version 3 of the License, or
9
+ * (at your option) any later version.
10
+ *
11
+ * WebROaR is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with WebROaR. If not, see <http://www.gnu.org/licenses/>.
18
+ */
19
+ #ifndef WR_CONFIG_H_
20
+ #define WR_CONFIG_H_
21
+
22
+ #include<wr_string.h>
23
+ #include<wr_macro.h>
24
+ #include<wr_logger.h>
25
+ #include<wr_scgi.h>
26
+ #include<wr_yaml_parser.h>
27
+
28
+ #define TRUE 1
29
+ #define FALSE 0
30
+
31
+ #define STR_SIZE16 16
32
+ #define STR_SIZE32 32
33
+ #define STR_SIZE64 64
34
+ #define STR_SIZE128 128
35
+ #define STR_SIZE256 256
36
+ #define STR_SIZE512 512
37
+ #define STR_SIZE1KB 1024
38
+ #define STR_SIZE10KB 10240
39
+
40
+ #define SERVER_ACCESS_LOG 1
41
+ #define SERVER_SSL_SUPPORT 2
42
+ #define SERVER_UDS_SUPPORT 4
43
+ #define SERVER_KEEP_ALIVE 8
44
+
45
+ typedef struct config_server_s{
46
+
47
+ struct control{
48
+ wr_str_t sock_path;
49
+ wr_u_short conn_pool;
50
+ }Control;
51
+
52
+ struct file{
53
+ wr_str_t log;
54
+ wr_str_t pid;
55
+ wr_str_t config;
56
+ wr_str_t sock;
57
+ wr_str_t high_rss;
58
+ wr_str_t worker_bin;
59
+ wr_str_t internal_config;
60
+ }File;
61
+
62
+ struct dir{
63
+ wr_str_t admin_panel;
64
+ wr_str_t root;
65
+ }Dir;
66
+
67
+ struct worker{
68
+ wr_u_short max;
69
+ wr_u_short pending;
70
+ wr_u_short add_trials;
71
+ wr_u_short add_wait;
72
+ wr_u_short add_timeout;
73
+ wr_u_short kill_timeout;
74
+ wr_u_short idle_time;
75
+ wr_u_short ping_timeout;
76
+ wr_u_short ping_trials;
77
+ }Worker;
78
+
79
+ #ifdef HAVE_GNUTLS
80
+ struct ssl{
81
+ wr_u_int port;
82
+ wr_str_t certificate;
83
+ wr_str_t key;
84
+ }SSL;
85
+ #endif
86
+
87
+ wr_str_t name;
88
+ wr_str_t version;
89
+ wr_u_int port;
90
+
91
+ LOG_SEVERITY log_level;
92
+ wr_u_short flag; // To store different bit level flags like access_log, ssl_support, uds support
93
+ wr_u_short stack_trace;
94
+
95
+ }config_server_t;
96
+
97
+
98
+ typedef struct config_request_s{
99
+ wr_u_short prefix_hash;
100
+ wr_u_short conn_pool;
101
+ wr_u_long max_body_size;
102
+ wr_u_int max_uri_size;
103
+ wr_u_short max_path_size;
104
+ wr_u_short max_frag_size;
105
+ wr_u_short max_query_size;
106
+ wr_u_short max_field_size;
107
+ wr_u_long max_value_size;
108
+ wr_u_long max_header_size;
109
+ wr_u_short max_header_count;
110
+
111
+ struct header{
112
+ #ifdef L_DEBUG
113
+ wr_str_t conn_id;
114
+ wr_str_t req_id;
115
+ #endif
116
+ wr_str_t file_path;
117
+ wr_str_t resp_code;
118
+ wr_str_t resp_content_len;
119
+ }Header;
120
+
121
+ }config_request_t;
122
+
123
+ typedef enum config_host_type_s{
124
+ HOST_TPE_INVALID = 0,
125
+ HOST_TYPE_STATIC = 1,
126
+ HOST_TYPE_WILDCARD_IN_START = 2,
127
+ HOST_TYPE_WILDCARD_IN_END = 4,
128
+ HOST_TYPE_WILDCARD_IN_START_END = 8,
129
+ }config_host_type_t;
130
+
131
+ typedef struct config_host_list_s config_host_list_t;
132
+ struct config_host_list_s {
133
+ wr_str_t name;
134
+ config_host_type_t type;
135
+ config_host_list_t *next;
136
+ };
137
+
138
+ typedef struct config_application_list_s config_application_list_t;
139
+ struct config_application_list_s {
140
+ wr_str_t name; /**< Application name */
141
+ wr_str_t baseuri; /**< Application baseuri */
142
+ wr_str_t path; /**< Application path */
143
+ wr_u_short min_worker; /**< Minimum number of workers required */
144
+ wr_u_short max_worker; /**< Maximum number of workers */
145
+ LOG_SEVERITY log_level; /**< Logging level */
146
+
147
+ scgi_t *scgi;
148
+ config_host_list_t *host_name_list;
149
+ config_application_list_t *new;
150
+ config_application_list_t *next;
151
+ };
152
+
153
+
154
+ typedef struct config_application_s{
155
+
156
+ struct application_default{
157
+ wr_u_short max_workers;
158
+ wr_u_short min_workers;
159
+ wr_str_t env;
160
+ }Default;
161
+
162
+ struct admin_panel{
163
+ wr_str_t name;
164
+ wr_str_t base_uri;
165
+ }Admin_panel;
166
+
167
+ struct static_server{
168
+ wr_str_t name;
169
+ wr_u_short min_workers;
170
+ wr_u_short max_workers;
171
+ }Static_server;
172
+
173
+ wr_str_t analytics_on;
174
+ wr_u_int msg_queue_size;
175
+ wr_u_short max_req_ratio;
176
+ wr_u_short min_req_ratio;
177
+ wr_u_short high_load;
178
+ wr_u_short low_load;
179
+ wr_u_short max_hosts;
180
+
181
+ config_application_list_t *list;
182
+
183
+ }config_application_t;
184
+
185
+ typedef struct config_worker_s{
186
+
187
+ struct worker_file{
188
+ wr_str_t config;
189
+ wr_str_t mime_type;
190
+ wr_str_t internal_config;
191
+ wr_str_t app_loader;
192
+ }File;
193
+
194
+ struct worker_header{
195
+ wr_str_t file_path;
196
+ wr_str_t conn_id;
197
+ wr_str_t req_id;
198
+ wr_str_t resp_code;
199
+ wr_str_t resp_content_len;
200
+ }Header;
201
+
202
+ struct server{
203
+ wr_str_t name;
204
+ wr_str_t version;
205
+ }Server;
206
+
207
+ struct compress{
208
+ wr_u_long lower_limit;
209
+ wr_u_long upper_limit;
210
+ }Compress;
211
+
212
+ wr_str_t static_server;
213
+ wr_str_t sock_path;
214
+ wr_u_short stack_tace;
215
+ wr_u_long max_body_size;
216
+
217
+ }config_worker_t;
218
+
219
+ typedef struct config_s{
220
+ config_server_t Server;
221
+ config_request_t Request;
222
+ config_worker_t Worker;
223
+ config_application_t Application;
224
+ }config_t;
225
+
226
+ config_t* wr_server_config_init(const char* root_path);
227
+ config_t* wr_worker_config_init(const char* root_path);
228
+
229
+ void wr_server_config_free(config_t *Config);
230
+ void wr_worker_config_free(config_t *Config);
231
+ void wr_application_list_free(config_application_list_t* list);
232
+
233
+ void wr_set_numeric_value(node_t *root, const char *path, void *value, wr_u_short flag);
234
+
235
+ #endif /*WR_CONFIG_H_*/
@@ -20,13 +20,9 @@
20
20
  #ifndef WR_HELPER_H_
21
21
  #define WR_HELPER_H_
22
22
 
23
- #include <wr_macro.h>
24
- #include <wr_string.h>
23
+ #include <wr_config.h>
25
24
  #include <wr_queue.h>
26
25
  #include <wr_util.h>
27
- #include <wr_scgi.h>
28
- #include <wr_logger.h>
29
- #include <wr_yaml_parser.h>
30
26
  #include <wr_msg_queue_client.h>
31
27
 
32
28
  #endif /*WR_HELPER_H_*/
@@ -28,8 +28,8 @@
28
28
  #include<time.h>
29
29
  #include<errno.h>
30
30
 
31
- static inline char* get_date_time();
32
- static inline char* get_log_file_path();
31
+ char* get_date_time();
32
+ char* get_log_file_path();
33
33
 
34
34
  //this macro should included in common utility
35
35
  #define null_check(ptr) if (ptr == NULL) \
@@ -51,11 +51,11 @@ void close_logger() {
51
51
  fclose(stderr);
52
52
  }
53
53
 
54
- static inline char* get_log_file_path() {
54
+ char* get_log_file_path() {
55
55
  return log_file_path;
56
56
  }
57
57
 
58
- static inline char* get_date_time() {
58
+ char* get_date_time() {
59
59
  struct tm *now=NULL;
60
60
  time_t time_value=0;
61
61
  char *str;