From: Frédéric Lécaille Date: Thu, 30 Mar 2017 12:18:30 +0000 (+0200) Subject: MINOR: server: Extract the code responsible of copying default-server settings. X-Git-Tag: v1.8-dev2~67 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=58b207cdd54353b9eacc46e9ce23d6ecbf70d68e;p=thirdparty%2Fhaproxy.git MINOR: server: Extract the code responsible of copying default-server settings. This patch moves the code responsible of copying default server settings to a new server instance from parse_server() function to new defsrv_*_cpy() functions which may be used both during server lines parsing and during server templates initializations to come. These defsrv_*_cpy() do not make any reference to anything else than default server settings. --- diff --git a/src/server.c b/src/server.c index 63569cf04e..fb9913133c 100644 --- a/src/server.c +++ b/src/server.c @@ -1575,6 +1575,193 @@ static void display_parser_err(const char *file, int linenum, char **args, int c file, linenum, args[0], args[1], args[cur_arg]); } +static void srv_conn_src_sport_range_cpy(struct server *srv, + struct server *src) +{ + int range_sz; + + range_sz = src->conn_src.sport_range->size; + if (range_sz > 0) { + srv->conn_src.sport_range = port_range_alloc_range(range_sz); + if (srv->conn_src.sport_range != NULL) { + int i; + + for (i = 0; i < range_sz; i++) { + srv->conn_src.sport_range->ports[i] = + src->conn_src.sport_range->ports[i]; + } + } + } +} + +/* + * Copy server connection source settings to server everything needed. + */ +static void srv_conn_src_cpy(struct server *srv, struct server *src) +{ + srv->conn_src.opts = src->conn_src.opts; + srv->conn_src.source_addr = src->conn_src.source_addr; + + /* Source port range copy. */ + if (src->conn_src.sport_range != NULL) + srv_conn_src_sport_range_cpy(srv, src); + +#ifdef CONFIG_HAP_TRANSPARENT + if (src->conn_src.bind_hdr_name != NULL) { + srv->conn_src.bind_hdr_name = strdup(src->conn_src.bind_hdr_name); + srv->conn_src.bind_hdr_len = strlen(src->conn_src.bind_hdr_name); + } + srv->conn_src.bind_hdr_occ = src->conn_src.bind_hdr_occ; + srv->conn_src.tproxy_addr = src->conn_src.tproxy_addr; +#endif + if (src->conn_src.iface_name != NULL) + srv->conn_src.iface_name = strdup(src->conn_src.iface_name); +} + +/* + * Copy server SSL settings to server allocating + * everything needed. + */ +#if defined(USE_OPENSSL) +static void srv_ssl_settings_cpy(struct server *srv, struct server *src) +{ + if (src->ssl_ctx.ca_file != NULL) + srv->ssl_ctx.ca_file = strdup(src->ssl_ctx.ca_file); + if (src->ssl_ctx.crl_file != NULL) + srv->ssl_ctx.crl_file = strdup(src->ssl_ctx.crl_file); + if (src->ssl_ctx.client_crt != NULL) + srv->ssl_ctx.client_crt = strdup(src->ssl_ctx.client_crt); + + srv->ssl_ctx.verify = src->ssl_ctx.verify; + + if (src->ssl_ctx.verify_host != NULL) + srv->ssl_ctx.verify_host = strdup(src->ssl_ctx.verify_host); + if (src->ssl_ctx.ciphers != NULL) + srv->ssl_ctx.ciphers = strdup(src->ssl_ctx.ciphers); + if (src->sni_expr != NULL) + srv->sni_expr = strdup(src->sni_expr); +} +#endif + +/* + * Copy server settings to server allocating + * everything needed. + */ +static void srv_settings_cpy(struct server *srv, struct server *src) +{ + /* Connection source settings copy */ + srv_conn_src_cpy(srv, src); + + srv->pp_opts = src->pp_opts; + if (src->rdr_pfx != NULL) { + srv->rdr_pfx = strdup(src->rdr_pfx); + srv->rdr_len = src->rdr_len; + } + if (src->cookie != NULL) { + srv->cookie = strdup(src->cookie); + srv->cklen = src->cklen; + } + srv->use_ssl = src->use_ssl; + srv->check.addr = srv->agent.addr = src->check.addr; + srv->check.use_ssl = src->check.use_ssl; + srv->check.port = src->check.port; + /* Note: 'flags' field has potentially been already initialized. */ + srv->flags |= src->flags; + srv->do_check = src->do_check; + srv->do_agent = src->do_agent; + if (srv->check.port) + srv->flags |= SRV_F_CHECKPORT; + srv->check.inter = src->check.inter; + srv->check.fastinter = src->check.fastinter; + srv->check.downinter = src->check.downinter; + srv->agent.use_ssl = src->agent.use_ssl; + srv->agent.port = src->agent.port; + if (src->agent.send_string != NULL) + srv->agent.send_string = strdup(src->agent.send_string); + srv->agent.send_string_len = src->agent.send_string_len; + srv->agent.inter = src->agent.inter; + srv->agent.fastinter = src->agent.fastinter; + srv->agent.downinter = src->agent.downinter; + srv->maxqueue = src->maxqueue; + srv->minconn = src->minconn; + srv->maxconn = src->maxconn; + srv->slowstart = src->slowstart; + srv->observe = src->observe; + srv->onerror = src->onerror; + srv->onmarkeddown = src->onmarkeddown; + srv->onmarkedup = src->onmarkedup; + if (src->trackit != NULL) + srv->trackit = strdup(src->trackit); + srv->consecutive_errors_limit = src->consecutive_errors_limit; + srv->uweight = srv->iweight = src->iweight; + + srv->check.send_proxy = src->check.send_proxy; + /* health: up, but will fall down at first failure */ + srv->check.rise = srv->check.health = src->check.rise; + srv->check.fall = src->check.fall; + + /* Here we check if 'disabled' is the default server state */ + if (src->admin & (SRV_ADMF_CMAINT | SRV_ADMF_FMAINT)) { + srv->admin |= SRV_ADMF_CMAINT | SRV_ADMF_FMAINT; + srv->state = SRV_ST_STOPPED; + srv->check.state |= CHK_ST_PAUSED; + srv->check.health = 0; + } + + /* health: up but will fall down at first failure */ + srv->agent.rise = srv->agent.health = src->agent.rise; + srv->agent.fall = src->agent.fall; + + if (src->resolvers_id != NULL) + srv->resolvers_id = strdup(src->resolvers_id); + srv->dns_opts.family_prio = src->dns_opts.family_prio; + if (srv->dns_opts.family_prio == AF_UNSPEC) + srv->dns_opts.family_prio = AF_INET6; + memcpy(srv->dns_opts.pref_net, + src->dns_opts.pref_net, + sizeof srv->dns_opts.pref_net); + srv->dns_opts.pref_net_nb = src->dns_opts.pref_net_nb; + + srv->init_addr_methods = src->init_addr_methods; + srv->init_addr = src->init_addr; +#if defined(USE_OPENSSL) + srv_ssl_settings_cpy(srv, src); +#endif +#ifdef TCP_USER_TIMEOUT + srv->tcp_ut = src->tcp_ut; +#endif +} + +static struct server *new_server(struct proxy *proxy) +{ + struct server *srv; + + srv = calloc(1, sizeof *srv); + if (!srv) + return NULL; + + srv->obj_type = OBJ_TYPE_SERVER; + srv->proxy = proxy; + LIST_INIT(&srv->actconns); + LIST_INIT(&srv->pendconns); + LIST_INIT(&srv->priv_conns); + LIST_INIT(&srv->idle_conns); + LIST_INIT(&srv->safe_conns); + + srv->state = SRV_ST_RUNNING; /* early server setup */ + srv->last_change = now.tv_sec; + + srv->check.status = HCHK_STATUS_INI; + srv->check.server = srv; + srv->check.tcpcheck_rules = &proxy->tcpcheck_rules; + + srv->agent.status = HCHK_STATUS_INI; + srv->agent.server = srv; + srv->xprt = srv->check.xprt = srv->agent.xprt = xprt_get(XPRT_RAW); + + return srv; +} + int parse_server(const char *file, int linenum, char **args, struct proxy *curproxy, struct proxy *defproxy) { struct server *newsrv = NULL; @@ -1617,7 +1804,8 @@ int parse_server(const char *file, int linenum, char **args, struct proxy *curpr struct protocol *proto; struct dns_resolution *curr_resolution; - if ((newsrv = calloc(1, sizeof(*newsrv))) == NULL) { + newsrv = new_server(curproxy); + if (!newsrv) { Alert("parsing [%s:%d] : out of memory.\n", file, linenum); err_code |= ERR_ALERT | ERR_ABORT; goto out; @@ -1626,20 +1814,8 @@ int parse_server(const char *file, int linenum, char **args, struct proxy *curpr /* the servers are linked backwards first */ newsrv->next = curproxy->srv; curproxy->srv = newsrv; - newsrv->proxy = curproxy; newsrv->conf.file = strdup(file); newsrv->conf.line = linenum; - - newsrv->obj_type = OBJ_TYPE_SERVER; - LIST_INIT(&newsrv->actconns); - LIST_INIT(&newsrv->pendconns); - LIST_INIT(&newsrv->priv_conns); - LIST_INIT(&newsrv->idle_conns); - LIST_INIT(&newsrv->safe_conns); - newsrv->flags = 0; - newsrv->admin = 0; - newsrv->state = SRV_ST_RUNNING; /* early server setup */ - newsrv->last_change = now.tv_sec; newsrv->id = strdup(args[1]); /* several ways to check the port component : @@ -1707,7 +1883,6 @@ int parse_server(const char *file, int linenum, char **args, struct proxy *curpr skip_name_resolution: newsrv->addr = *sk; newsrv->svc_port = port; - newsrv->xprt = newsrv->check.xprt = newsrv->agent.xprt = xprt_get(XPRT_RAW); if (!newsrv->hostname && !protocol_by_family(newsrv->addr.ss_family)) { Alert("parsing [%s:%d] : Unknown protocol family %d '%s'\n", @@ -1716,135 +1891,8 @@ int parse_server(const char *file, int linenum, char **args, struct proxy *curpr goto out; } - /* - * In this section we copy default-server connection source settings to - * the new server object connection source - * (newsrv->conn_src <- curproxy->defsrv.conn_src). - */ - newsrv->conn_src.opts = curproxy->defsrv.conn_src.opts; - newsrv->conn_src.source_addr = curproxy->defsrv.conn_src.source_addr; - if (curproxy->defsrv.conn_src.sport_range != NULL) { - int i, def_sport_range_sz; - struct server *default_srv; - - default_srv = &curproxy->defsrv; - def_sport_range_sz = default_srv->conn_src.sport_range->size; - if (def_sport_range_sz > 0) { - newsrv->conn_src.sport_range = port_range_alloc_range(def_sport_range_sz); - if (newsrv->conn_src.sport_range) { - for (i = 0; i < def_sport_range_sz; i++) - newsrv->conn_src.sport_range->ports[i] = default_srv->conn_src.sport_range->ports[i]; - } - } - } -#ifdef CONFIG_HAP_TRANSPARENT - if (curproxy->defsrv.conn_src.bind_hdr_name != NULL) { - newsrv->conn_src.bind_hdr_name = strdup(curproxy->defsrv.conn_src.bind_hdr_name); - newsrv->conn_src.bind_hdr_len = strlen(curproxy->defsrv.conn_src.bind_hdr_name); - } - newsrv->conn_src.bind_hdr_occ = curproxy->defsrv.conn_src.bind_hdr_occ; - newsrv->conn_src.tproxy_addr = curproxy->defsrv.conn_src.tproxy_addr; -#endif - if (curproxy->defsrv.conn_src.iface_name != NULL) - newsrv->conn_src.iface_name = strdup(curproxy->defsrv.conn_src.iface_name); - - newsrv->pp_opts = curproxy->defsrv.pp_opts; - if (curproxy->defsrv.rdr_pfx != NULL) { - newsrv->rdr_pfx = strdup(curproxy->defsrv.rdr_pfx); - newsrv->rdr_len = curproxy->defsrv.rdr_len; - } - if (curproxy->defsrv.cookie != NULL) { - newsrv->cookie = strdup(curproxy->defsrv.cookie); - newsrv->cklen = curproxy->defsrv.cklen; - } - newsrv->use_ssl = curproxy->defsrv.use_ssl; - newsrv->check.addr = newsrv->agent.addr = curproxy->defsrv.check.addr; - newsrv->check.use_ssl = curproxy->defsrv.check.use_ssl; - newsrv->check.port = curproxy->defsrv.check.port; - /* Note: 'flags' field has potentially been already initialized. */ - newsrv->flags |= curproxy->defsrv.flags; - newsrv->do_check = curproxy->defsrv.do_check; - newsrv->do_agent = curproxy->defsrv.do_agent; - if (newsrv->check.port) - newsrv->flags |= SRV_F_CHECKPORT; - newsrv->check.inter = curproxy->defsrv.check.inter; - newsrv->check.fastinter = curproxy->defsrv.check.fastinter; - newsrv->check.downinter = curproxy->defsrv.check.downinter; - newsrv->agent.use_ssl = curproxy->defsrv.agent.use_ssl; - newsrv->agent.port = curproxy->defsrv.agent.port; - if (curproxy->defsrv.agent.send_string != NULL) - newsrv->agent.send_string = strdup(curproxy->defsrv.agent.send_string); - newsrv->agent.send_string_len = curproxy->defsrv.agent.send_string_len; - newsrv->agent.inter = curproxy->defsrv.agent.inter; - newsrv->agent.fastinter = curproxy->defsrv.agent.fastinter; - newsrv->agent.downinter = curproxy->defsrv.agent.downinter; - newsrv->maxqueue = curproxy->defsrv.maxqueue; - newsrv->minconn = curproxy->defsrv.minconn; - newsrv->maxconn = curproxy->defsrv.maxconn; - newsrv->slowstart = curproxy->defsrv.slowstart; - newsrv->observe = curproxy->defsrv.observe; - newsrv->onerror = curproxy->defsrv.onerror; - newsrv->onmarkeddown = curproxy->defsrv.onmarkeddown; - newsrv->onmarkedup = curproxy->defsrv.onmarkedup; - if (curproxy->defsrv.trackit != NULL) - newsrv->trackit = strdup(curproxy->defsrv.trackit); - newsrv->consecutive_errors_limit - = curproxy->defsrv.consecutive_errors_limit; - newsrv->uweight = newsrv->iweight - = curproxy->defsrv.iweight; - - newsrv->check.status = HCHK_STATUS_INI; - newsrv->check.send_proxy = curproxy->defsrv.check.send_proxy; - newsrv->check.rise = curproxy->defsrv.check.rise; - newsrv->check.fall = curproxy->defsrv.check.fall; - newsrv->check.health = newsrv->check.rise; /* up, but will fall down at first failure */ - /* Here we check if 'disabled' is the default server state */ - if (curproxy->defsrv.admin & (SRV_ADMF_CMAINT | SRV_ADMF_FMAINT)) { - newsrv->admin |= SRV_ADMF_CMAINT | SRV_ADMF_FMAINT; - newsrv->state = SRV_ST_STOPPED; - newsrv->check.state |= CHK_ST_PAUSED; - newsrv->check.health = 0; - } - newsrv->check.server = newsrv; - newsrv->check.tcpcheck_rules = &curproxy->tcpcheck_rules; - - newsrv->agent.status = HCHK_STATUS_INI; - newsrv->agent.rise = curproxy->defsrv.agent.rise; - newsrv->agent.fall = curproxy->defsrv.agent.fall; - newsrv->agent.health = newsrv->agent.rise; /* up, but will fall down at first failure */ - newsrv->agent.server = newsrv; - if (curproxy->defsrv.resolvers_id != NULL) - newsrv->resolvers_id = strdup(curproxy->defsrv.resolvers_id); - newsrv->dns_opts.family_prio = curproxy->defsrv.dns_opts.family_prio; - if (newsrv->dns_opts.family_prio == AF_UNSPEC) - newsrv->dns_opts.family_prio = AF_INET6; - memcpy(newsrv->dns_opts.pref_net, - curproxy->defsrv.dns_opts.pref_net, - sizeof(newsrv->dns_opts.pref_net)); - newsrv->dns_opts.pref_net_nb = curproxy->defsrv.dns_opts.pref_net_nb; - newsrv->init_addr_methods = curproxy->defsrv.init_addr_methods; - newsrv->init_addr = curproxy->defsrv.init_addr; -#if defined(USE_OPENSSL) - /* SSL config. */ - if (curproxy->defsrv.ssl_ctx.ca_file != NULL) - newsrv->ssl_ctx.ca_file = strdup(curproxy->defsrv.ssl_ctx.ca_file); - if (curproxy->defsrv.ssl_ctx.crl_file != NULL) - newsrv->ssl_ctx.crl_file = strdup(curproxy->defsrv.ssl_ctx.crl_file); - if (curproxy->defsrv.ssl_ctx.client_crt != NULL) - newsrv->ssl_ctx.client_crt = strdup(curproxy->defsrv.ssl_ctx.client_crt); - newsrv->ssl_ctx.verify = curproxy->defsrv.ssl_ctx.verify; - if (curproxy->defsrv.ssl_ctx.verify_host != NULL) - newsrv->ssl_ctx.verify_host = strdup(curproxy->defsrv.ssl_ctx.verify_host); - if (curproxy->defsrv.ssl_ctx.ciphers != NULL) - newsrv->ssl_ctx.ciphers = strdup(curproxy->defsrv.ssl_ctx.ciphers); - if (curproxy->defsrv.sni_expr != NULL) - newsrv->sni_expr = strdup(curproxy->defsrv.sni_expr); -#endif - -#ifdef TCP_USER_TIMEOUT - newsrv->tcp_ut = curproxy->defsrv.tcp_ut; -#endif - + /* Copy default server settings to new server settings. */ + srv_settings_cpy(newsrv, &curproxy->defsrv); cur_arg = 3; } else { newsrv = &curproxy->defsrv;