14 Commits

Author SHA1 Message Date
KerwinKoo
c31106689a remove curl utils funcs
because of do not get ftp data port by http, remove dependence of Libcurl
2017-08-21 10:01:33 +08:00
KerwinKoo
ce522f5675 using ftp_cfg_proxy_name field name instead of ftp_ctl_proxy_name 2017-08-18 14:53:36 +08:00
KerwinKoo
6bd859747a complate ftp remote data port auto match func 2017-08-17 16:41:37 +08:00
KerwinKoo
7d5f53aebb fix BUG: unconnectted when server_addr is IP address 2017-08-17 15:49:26 +08:00
KerwinKoo
f28efdf2b1 add remote_data_port check from responsed message 2017-08-17 15:25:08 +08:00
KerwinKoo
a9a75c6554 fix npr_proxy_remote_port unmarshal bug 2017-08-17 14:37:51 +08:00
KerwinKoo
26f49d26db add new_proxy_response msg unmarshel 2017-08-17 12:06:21 +08:00
KerwinKoo
508ddd60e0 do not use HTTP mothod to init ftp remote data port 2017-08-17 12:05:46 +08:00
KerwinKoo
08b908273a remove unused semicolon 2017-08-17 11:14:37 +08:00
KerwinKoo
8402967a0e save client 2017-08-09 14:56:48 +08:00
KerwinKoo
a2e4264b01 devtmp 2017-08-09 14:42:43 +08:00
KerwinKoo
ce057a05a7 add url commit 2017-08-08 18:23:18 +08:00
KerwinKoo
7515c15123 add url func into utils 2017-08-08 18:19:40 +08:00
KerwinKoo
60871860ae don't check the remote_data_port
because of xfrps will distribute a ftp_data port for each client, no need direct it activity.
2017-08-08 16:51:56 +08:00
8 changed files with 160 additions and 19 deletions

View File

@@ -54,14 +54,14 @@
#include "zip.h"
#include "common.h"
#include "proxy.h"
#include "utils.h"
#define MAX_OUTPUT (512*1024)
static void drained_writecb(struct bufferevent *bev, void *ctx);
static void xfrp_event_cb(struct bufferevent *bev, short what, void *ctx);
static void
xfrp_read_cb(struct bufferevent *bev, void *ctx)
static void xfrp_read_cb(struct bufferevent *bev, void *ctx)
{
struct proxy *p = (struct proxy *)ctx;
struct bufferevent *partner = p?p->bev:NULL;
@@ -89,8 +89,7 @@ xfrp_read_cb(struct bufferevent *bev, void *ctx)
}
}
static void
drained_writecb(struct bufferevent *bev, void *ctx)
static void drained_writecb(struct bufferevent *bev, void *ctx)
{
struct proxy *p = (struct proxy *)ctx;
struct bufferevent *partner = p?p->bev:NULL;
@@ -103,8 +102,7 @@ drained_writecb(struct bufferevent *bev, void *ctx)
bufferevent_enable(partner, EV_READ);
}
static void
close_on_finished_writecb(struct bufferevent *bev, void *ctx)
static void close_on_finished_writecb(struct bufferevent *bev, void *ctx)
{
struct evbuffer *b = bufferevent_get_output(bev);
@@ -113,8 +111,7 @@ close_on_finished_writecb(struct bufferevent *bev, void *ctx)
}
}
static void
xfrp_event_cb(struct bufferevent *bev, short what, void *ctx)
static void xfrp_event_cb(struct bufferevent *bev, short what, void *ctx)
{
struct proxy *p = (struct proxy *)ctx;
struct bufferevent *partner = p?p->bev:NULL;
@@ -145,6 +142,38 @@ xfrp_event_cb(struct bufferevent *bev, short what, void *ctx)
}
}
// return: 0: init succeed; 1: init failed
// static int init_ftp_data_port(struct proxy_service *ps)
// {
// struct mycurl_string ret_buf;
// if ( ! mycurl_string_init(&ret_buf)) {
// debug(LOG_ERR, "error: ftp data port buffer init failed!");
// return 1;
// }
// char url[1024] = {0};
// struct common_conf *c_conf = get_common_config();
// int state_code = 0;
// double down_size = 0;
// int ret = net_visit(url,
// &ret_buf,
// HTTP_GET,
// NULL,
// 60l,
// &state_code,
// &down_size);
// if (ret) {
// debug(LOG_ERR, "error: ftp remote data port init failed by HTTP GET");
// mycurl_string_free(&ret_buf);
// return 1;
// }
// return 0;
// }
int is_ftp_proxy(const struct proxy_service *ps)
{
if (! ps || ! ps->proxy_type)

View File

@@ -63,6 +63,7 @@ struct proxy_client {
struct proxy_service {
char *proxy_name;
char *proxy_type;
char *ftp_cfg_proxy_name;
int use_encryption;
int use_compression;

View File

@@ -145,13 +145,6 @@ static void dump_proxy_service(const int index, struct proxy_service *ps)
ps->proxy_type = strdup("tcp");
assert(ps->proxy_type);
} else if (strcmp(ps->proxy_type, "ftp") == 0) {
if (ps->remote_data_port <= 0) {
debug(LOG_ERR,
"Proxy [%s] error: remote_data_port must be exist when type is ftp",
ps->proxy_name);
exit(0);
}
new_ftp_data_proxy_service(ps);
}
@@ -183,6 +176,7 @@ static struct proxy_service *new_proxy_service(const char *name)
assert(c_conf);
ps->proxy_name = strdup(name);
ps->ftp_cfg_proxy_name = NULL;
assert(ps->proxy_name);
ps->proxy_type = NULL;
@@ -217,6 +211,9 @@ static void new_ftp_data_proxy_service(struct proxy_service *ftp_ps)
"cannot create ftp data proxy service, it should not happenned!");
exit(0);
}
ps->ftp_cfg_proxy_name = strdup(ftp_ps->proxy_name);
assert(ps->ftp_cfg_proxy_name);
ps->proxy_type = strdup("tcp");
ps->remote_port = ftp_ps->remote_data_port;
@@ -318,6 +315,8 @@ static int common_handler(void *user, const char *section, const char *name, con
debug(LOG_ERR, "error: server_addr [%s] is invalid!", value);
exit(0);
}
if (is_valid_ip_address(value))
set_common_server_ip(value);
} else if (MATCH("common", "server_port")) {
config->server_port = atoi(value);
} else if (MATCH("common", "http_proxy")) {
@@ -387,7 +386,7 @@ static void init_common_conf(struct common_conf *config)
// because of assert it will never return NULL
char *get_ftp_data_proxy_name(const char *ftp_proxy_name)
{
char *ftp_tail_data_name = FTP_DATA_PROXY_SUFFIX;
char *ftp_tail_data_name = FTP_RMT_CTL_PROXY_SUFFIX;
char *ftp_data_proxy_name = (char *)calloc(1,
strlen(ftp_proxy_name)+strlen(ftp_tail_data_name)+1);
assert(ftp_data_proxy_name);

View File

@@ -29,7 +29,7 @@
#include "client.h"
#include "common.h"
#define FTP_DATA_PROXY_SUFFIX "_ftp_data_proxy"
#define FTP_RMT_CTL_PROXY_SUFFIX "_ftp_remote_ctl_proxy"
struct base_conf{
char *name;

View File

@@ -122,7 +122,7 @@ static void new_client_connect()
struct proxy_client *client = new_proxy_client();
struct common_conf *c_conf = get_common_config();
assert(c_conf);
client->base = main_ctl->connect_base;;
client->base = main_ctl->connect_base;
struct bufferevent *bev = connect_server(client->base, c_conf->server_addr, c_conf->server_port);
if (!bev) {
debug(LOG_DEBUG, "Connect server [%s:%d] failed", c_conf->server_addr, c_conf->server_port);
@@ -354,6 +354,50 @@ static void hb_sender_cb(evutil_socket_t fd, short event, void *arg)
set_ticker_ping_timer(main_ctl->ticker_ping);
}
// return: 0: raw succeed 1: raw failed
static int proxy_service_resp_raw(struct new_proxy_response *npr)
{
if (npr->error && strlen(npr->error) > 2) {
debug(LOG_ERR, "error: new proxy response error_field:%s", npr->error);
return 1;
}
if ((! npr->proxy_name) || (strlen(npr->proxy_name) <= 0)) {
debug(LOG_ERR, "error: new proxy response proxy name unmarshal failed!");
return 1;
}
struct proxy_service *ps = NULL;
ps = get_proxy_service(npr->proxy_name);
if (! ps) {
debug(LOG_ERR, "error: proxy_name responsed by TypeNewProxyResp not found!");
return 1;
}
if (! ps->proxy_type) {
debug(LOG_ERR, "error: proxy_type is NULL, it should be never happend!");
return 1;
}
if (ps->ftp_cfg_proxy_name) {
struct proxy_service *main_ps = get_proxy_service(ps->ftp_cfg_proxy_name);
if (main_ps) {
debug(LOG_DEBUG, "find main ftp proxy service name [%s]", main_ps->proxy_name);
} else {
debug(LOG_ERR, "error: cannot find main ftp proxy service!");
return 1;
}
if (npr->remote_port <= 0) {
debug(LOG_ERR, "error: ftp remote_data_port [%d] that request from server is invalid!", npr->remote_port);
return 1;
}
main_ps->remote_data_port = npr->remote_port;
}
return 0;
}
static void
raw_message(struct message *msg, struct bufferevent *bev, struct proxy_client *client)
{
@@ -406,7 +450,24 @@ raw_message(struct message *msg, struct bufferevent *bev, struct proxy_client *c
break;
case TypeNewProxyResp:
break;
{
if (msg->data_p == NULL) {
debug(LOG_ERR,
"recved TypeNewProxyResp but no data, it should be never happend!");
break;
}
struct new_proxy_response *npr = new_proxy_resp_unmarshal(msg->data_p);
if (npr == NULL) {
debug(LOG_ERR, "new proxy response buffer unmarshal faild!");
return;
}
proxy_service_resp_raw(npr);
SAFE_FREE(npr);
break;
}
case TypeStartWorkConn:
sr = start_work_conn_resp_unmarshal(msg->data_p);

38
msg.c
View File

@@ -242,6 +242,44 @@ int new_work_conn_marshal(const struct work_conn *work_c, char **msg)
return nret;
}
// result returned of this func need be free
struct new_proxy_response *new_proxy_resp_unmarshal(const char *jres)
{
struct json_object *j_np_res = json_tokener_parse(jres);
if (is_error(j_np_res))
return NULL;
struct new_proxy_response *npr = calloc(1, sizeof(struct new_proxy_response));
assert(npr);
struct json_object *npr_run_id = NULL;
if (! json_object_object_get_ex(j_np_res, "run_id", &npr_run_id))
goto END_ERROR;
npr->run_id = strdup(json_object_get_string(npr_run_id));
assert(npr->run_id);
struct json_object *npr_proxy_remote_port = NULL;
if (! json_object_object_get_ex(j_np_res, "remote_port", &npr_proxy_remote_port))
goto END_ERROR;
npr->remote_port = json_object_get_int(npr_proxy_remote_port);
struct json_object *npr_proxy_name = NULL;
if (! json_object_object_get_ex(j_np_res, "proxy_name", &npr_proxy_name))
goto END_ERROR;
npr->proxy_name = strdup(json_object_get_string(npr_proxy_name));
assert(npr->proxy_name);
struct json_object *npr_error = NULL;
if(! json_object_object_get_ex(j_np_res, "error", &npr_error))
goto END_ERROR;
npr->error = strdup(json_object_get_string(npr_error));
assert(npr->error);
END_ERROR:
json_object_put(j_np_res);
return npr;
}
// login_resp_unmarshal NEED FREE
struct login_resp *login_resp_unmarshal(const char *jres)
{

8
msg.h
View File

@@ -67,6 +67,13 @@ struct control_response {
char *msg;
};
struct new_proxy_response {
char *run_id;
char *proxy_name;
char *error;
int remote_port;
};
struct work_conn {
char *run_id;
};
@@ -91,6 +98,7 @@ size_t pack(struct message *req_msg, unsigned char **ret_buf);
struct message *unpack(unsigned char *recv_msg, const ushort len);
// tranlate control request to json string
struct new_proxy_response *new_proxy_resp_unmarshal(const char *jres);
struct login_resp *login_resp_unmarshal(const char *jres);
struct start_work_conn_resp *start_work_conn_resp_unmarshal(const char *resp_msg);

View File

@@ -1,6 +1,11 @@
#ifndef _UTILS_H_
#define _UTILS_H_
struct mycurl_string {
char *ptr;
size_t len;
};
void s_sleep(unsigned int s, unsigned int u);
// is_valid_ip_address: