|
|
|
@ -1628,6 +1628,8 @@ static bool proxy_alive(ckpool_t *ckp, proxy_instance_t *proxi, connsock_t *cs,
|
|
|
|
|
/* Has this proxy already been reconnected? */ |
|
|
|
|
if (cs->fd > 0) |
|
|
|
|
return true; |
|
|
|
|
if (proxi->disabled) |
|
|
|
|
return false; |
|
|
|
|
if (!extract_sockaddr(proxi->url, &cs->url, &cs->port)) { |
|
|
|
|
LOGWARNING("Failed to extract address from %s", proxi->url); |
|
|
|
|
goto out; |
|
|
|
@ -1861,8 +1863,8 @@ static bool subproxies_alive(proxy_instance_t *proxy)
|
|
|
|
|
static void *proxy_recv(void *arg) |
|
|
|
|
{ |
|
|
|
|
proxy_instance_t *proxi = (proxy_instance_t *)arg; |
|
|
|
|
proxy_instance_t *subproxy, *tmp; |
|
|
|
|
connsock_t *cs = &proxi->cs; |
|
|
|
|
proxy_instance_t *subproxy; |
|
|
|
|
ckpool_t *ckp = proxi->ckp; |
|
|
|
|
gdata_t *gdata = ckp->data; |
|
|
|
|
struct epoll_event event; |
|
|
|
@ -1963,17 +1965,6 @@ static void *proxy_recv(void *arg)
|
|
|
|
|
} while ((ret = read_socket_line(cs, 0)) > 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
HASH_ITER(sh, proxi->subproxies, subproxy, tmp) { |
|
|
|
|
subproxy->disabled = true; |
|
|
|
|
send_stratifier_deadproxy(ckp, subproxy->id, subproxy->subid); |
|
|
|
|
if (subproxy->cs.fd > 0) { |
|
|
|
|
epoll_ctl(epfd, EPOLL_CTL_DEL, subproxy->cs.fd, NULL); |
|
|
|
|
Close(subproxy->cs.fd); |
|
|
|
|
} |
|
|
|
|
HASH_DELETE(sh, proxi->subproxies, subproxy); |
|
|
|
|
} |
|
|
|
|
mutex_unlock(&proxi->proxy_lock); |
|
|
|
|
|
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -2193,6 +2184,41 @@ out:
|
|
|
|
|
send_api_response(val, sockd); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void parse_ableproxy(ckpool_t *ckp, gdata_t *gdata, const int sockd, |
|
|
|
|
const char *buf, bool disable) |
|
|
|
|
{ |
|
|
|
|
proxy_instance_t *proxy; |
|
|
|
|
|
|
|
|
|
json_error_t err_val; |
|
|
|
|
json_t *val = NULL; |
|
|
|
|
int id = -1; |
|
|
|
|
|
|
|
|
|
val = json_loads(buf, 0, &err_val); |
|
|
|
|
if (unlikely(!val)) { |
|
|
|
|
val = json_encode_errormsg(&err_val); |
|
|
|
|
goto out; |
|
|
|
|
} |
|
|
|
|
json_get_int(&id, val, "id"); |
|
|
|
|
proxy = proxy_by_id(gdata, id); |
|
|
|
|
if (!proxy) { |
|
|
|
|
val = json_errormsg("Proxy id %d not found", id); |
|
|
|
|
goto out; |
|
|
|
|
} |
|
|
|
|
JSON_CPACK(val, "{si,ss,ss,ss}", "id", proxy->id, "url", proxy->url, |
|
|
|
|
"auth", proxy->auth, "pass", proxy->pass); |
|
|
|
|
if (proxy->disabled != disable) { |
|
|
|
|
proxy->disabled = disable; |
|
|
|
|
LOGNOTICE("%sabling proxy %d", disable ? "Dis" : "En", id); |
|
|
|
|
} |
|
|
|
|
if (disable) { |
|
|
|
|
disable_subproxy(gdata, proxy, proxy); |
|
|
|
|
reconnect_generator(ckp); |
|
|
|
|
} else |
|
|
|
|
reconnect_proxy(proxy); |
|
|
|
|
out: |
|
|
|
|
send_api_response(val, sockd); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int proxy_loop(proc_instance_t *pi) |
|
|
|
|
{ |
|
|
|
|
proxy_instance_t *proxi = NULL, *cproxy; |
|
|
|
@ -2263,6 +2289,10 @@ retry:
|
|
|
|
|
parse_addproxy(ckp, gdata, sockd, buf + 9); |
|
|
|
|
} else if (cmdmatch(buf, "delproxy")) { |
|
|
|
|
parse_delproxy(ckp, gdata, sockd, buf + 9); |
|
|
|
|
} else if (cmdmatch(buf, "enableproxy")) { |
|
|
|
|
parse_ableproxy(ckp, gdata, sockd, buf + 12, false); |
|
|
|
|
} else if (cmdmatch(buf, "disableproxy")) { |
|
|
|
|
parse_ableproxy(ckp, gdata, sockd, buf + 13, true); |
|
|
|
|
} else if (cmdmatch(buf, "shutdown")) { |
|
|
|
|
ret = 0; |
|
|
|
|
goto out; |
|
|
|
|