dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * CDDL HEADER START
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * The contents of this file are subject to the terms of the
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Common Development and Distribution License (the "License").
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * You may not use this file except in compliance with the License.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * or http://www.opensolaris.org/os/licensing.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * See the License for the specific language governing permissions
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * and limitations under the License.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * When distributing Covered Code, include this CDDL HEADER in each
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * If applicable, add the following below this CDDL HEADER, with the
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * fields enclosed by brackets "[]" replaced with your own identifying
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * information: Portions Copyright [yyyy] [name of copyright owner]
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * CDDL HEADER END
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Use is subject to license terms.
33f5ff17089e3a43e6e730bf80384c233123dbd9Milan Jurik * Copyright 2012 Milan Jurik. All rights reserved.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_sgname(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sg_srv_o_arg_t *l = (sg_srv_o_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_srvID(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sg_srv_o_arg_t *l = (sg_srv_o_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) strlcpy(buf, l->sd->sd_srvID, bufsize);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_port(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sg_srv_o_arg_t *l = (sg_srv_o_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_ip(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sg_srv_o_arg_t *l = (sg_srv_o_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ip2str(&l->sd->sd_addr, buf, bufsize, V6_ADDRONLY);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_list_sg_srv_ofmt(char *sgname, ilb_server_data_t *sd, void *arg)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * This function is always called via ilb_walk_servergroups()
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * and so must return libilb errors.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * That's why we need to retain currently unused "h" argument
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_list_sg_srv(ilb_handle_t h, ilb_server_data_t *sd, const char *sgname,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra static ofmt_handle_t oh = (ofmt_handle_t)NULL;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra oerr = ofmt_open(larg->o_str, ofp, oflags, ocols, &oh);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) i_list_sg_srv_ofmt((char *)sgname, sd, arg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ip2str(&sd->sd_addr, ip_str, sizeof (ip_str), 0);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) sprintf(port_str, ":%d-%d", h_minport, h_maxport);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sd->sd_srvID?sd->sd_srvID:"(null)", ip_str, port_str);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_list_sg(ilb_handle_t h, ilb_sg_data_t *sg, void *arg)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ilbadm_list_sg_srv(h, &tmp_srv, sg->sgd_name, arg));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ilb_walk_servers(h, ilbadm_list_sg_srv, sg->sgd_name, arg));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic char *def_fields = "SGNAME,SERVERID,MINPORT,MAXPORT,IP_ADDRESS";
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_show_servergroups(int argc, char *argv[])
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra list_arg_t larg = {0, def_fields, NULL, NULL};
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra while ((c = getopt(argc, argv, optstr)) != -1) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch ((char)c) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ':': ilbadm_err(gettext("missing option argument"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* not reached */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("option -p requires -o"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("option -p requires explicit field"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " names for -o"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_walk_servergroups(h, ilbadm_list_sg, NULL,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_walk_servergroups(h, ilbadm_list_sg,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * The show function returns ILB_STATUS_GENERIC after printing
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * out an error message. So we don't need to print it again.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra s = (ilbadm_servnode_t *)calloc(sizeof (*s), 1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_parse_servrange_list(char *arg, ilbadm_sgroup_t *sgp)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = i_parse_optstring(arg, (void *) sgp, servrange_keys,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra OPT_VALUE_LIST|OPT_IP_RANGE|OPT_PORTS, &count);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_parse_serverIDs(char *arg, ilbadm_sgroup_t *sgp)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = i_parse_optstring(arg, (void *) sgp, serverID_keys,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_mod_sg(ilb_handle_t h, ilbadm_sgroup_t *sgp, ilbadm_cmd_t cmd,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (h == ILB_INVALID_HANDLE && cmd != cmd_enable_server &&
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (cmd == cmd_create_sg || cmd == cmd_add_srv) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_add_server_to_group(h, sgp->sg_name,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("cannot add %s to %s: %s"),
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* if we created the SG, we bail out */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_rem_server_from_group(h, sgp->sg_name,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* if we fail, we tell user and continue */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * list_next returns NULL instead of cycling back to head
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * so we don't have to check for list_head explicitly.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *sgp = sg = (ilbadm_sgroup_t *)calloc(sizeof (*sg), 1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra list_create(&sg->sg_serv_list, sizeof (ilbadm_servnode_t),
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra while ((s = list_remove_head(&sg->sg_serv_list)) != NULL)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_create_servergroup(int argc, char *argv[])
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra while ((c = getopt(argc, argv, ":s:")) != -1) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch ((char)c) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("missing option-argument for"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* not reached */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("missing mandatory arguments - please refer"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " to 'create-servergroup' subcommand"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " description in ilbadm(1M)"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (strlen(argv[optind]) > ILB_SGNAME_SZ - 1) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("servergroup name %s is too long -"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_create_servergroup(h, sg->sg_name);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* we create a servergroup with all servers enabled */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) ilb_destroy_servergroup(h, sg->sg_name);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((rc != ILBADM_OK) && (rc != ILBADM_LIBERR))
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_add_server_to_group(int argc, char **argv)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra while ((c = getopt(argc, argv, ":s:")) != -1) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch ((char)c) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("missing option-argument for"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* not reached */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("missing mandatory arguments - please refer"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " to 'add-server' subcommand description in ilbadm(1M)"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* A server is added enabled */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((rc != ILBADM_OK) && (rc != ILBADM_LIBERR))
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_Xable_server(int argc, char *argv[], ilbadm_cmd_t cmd)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("missing required argument"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " (server specification)"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* enable-server and disable-server only accepts serverids */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = 1; i < argc && rclib == ILB_STATUS_OK; i++) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* to do: check length */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) strlcpy(srv.sd_srvID, argv[i], sizeof (srv.sd_srvID));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* if we can't find a given server ID, just plough on */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((rc != ILBADM_OK) && (rc != ILBADM_LIBERR))
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ilbadm_Xable_server(argc, argv, cmd_disable_server));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ilbadm_Xable_server(argc, argv, cmd_enable_server));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_rem_server_from_group(int argc, char *argv[])
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra while ((c = getopt(argc, argv, ":s:")) != -1) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch ((char)c) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("missing option-argument for"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* not reached */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* we need servergroup name and at least one serverID to remove */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((rc != ILBADM_OK) && (rc != ILBADM_LIBERR))
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_destroy_servergroup(int argc, char *argv[])
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " delete-servergroup groupname"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraexport_srv_spec(ilb_server_data_t *srv, char *buf, const int bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* to do: if service name was given, print that, not number */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra inc = snprintf(buf+len, bufsz, ":%d", h_min);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra inc = snprintf(buf+len, bufsz, ":%d-%d", h_min, h_max);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * this is called by ilb_walk_servers(), therefore we return ilb_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * not ilbadm_status, and retain an unused function argument
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_export_a_srv(ilb_handle_t h, ilb_server_data_t *srv, const char *sgname,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sg_export_arg_t *larg = (sg_export_arg_t *)arg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char linebuf[BUFSZ]; /* XXXms make that dynamic */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, "%s %s\n", linebuf, sgname);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_export_sg(ilb_handle_t h, ilb_sg_data_t *sg, void *arg)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sg_export_arg_t *larg = (sg_export_arg_t *)arg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, "create-servergroup %s\n", sg->sgd_name);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ilb_walk_servers(h, ilbadm_export_a_srv, sg->sgd_name, arg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_export_servergroups(ilb_handle_t h, FILE *fp)