Beispiel #1
0
// журнал
cli_result_t parse4journal ( void *Journal, int argc, char **argv )
{
    cli_arg_t JournalArgs[] = 
    {
        { "journal_file", 0, CLI_OPTIONAL_ARG, CLI_REQUIRED_VAL, __parse4journal_file, Journal },
        { "journal_flashback", 0, CLI_OPTIONAL_ARG, CLI_REQUIRED_VAL, __parse4journal_flashback, Journal },
        CLI_LAST_ARG
    };
    
    return cli_parse ( JournalArgs, argc, argv );
}
Beispiel #2
0
// разбор флагов
static
cli_result_t parse4flag ( void *Flags, int argc, char **argv )
{
    cli_arg_t FlagArgs[] = 
    {
        { "verbose", 0, CLI_OPTIONAL_ARG, CLI_NO_VAL, parse4flag_verbose, Flags },
        { "protocol", 0, CLI_OPTIONAL_ARG, CLI_NO_VAL, parse4flag_protocol, Flags },
        { "debug", 0, CLI_OPTIONAL_ARG, CLI_NO_VAL, parse4flag_debug, Flags },
        CLI_LAST_ARG
    };
    
    return cli_parse ( FlagArgs, argc, argv );
}
Beispiel #3
0
static int multiple_in_flags()
{
  const char *argv[] = {"exec_filename", "--force", "in_filename", "-o", "out_filename", "other_in_filename"};
  int argc = 6;
  cli_parse(argc, argv);

  mu_assert(
    strcmp(options->in_filename, "other_in_filename") == 0 &&
    strcmp(options->out_filename, "out_filename") == 0 &&
    options->gnuplot == 0 &&
    options->force == 1 &&
    options->quiet == 0
  );
}
Beispiel #4
0
static int valid_mixed_flags()
{
  const char *argv[] = {"exec_filename", "--force", "in_filename", "-g"};
  int argc = 4;
  cli_parse(argc, argv);

  mu_assert(
    strcmp(options->in_filename, "in_filename") == 0 &&
    options->out_filename == NULL &&
    options->gnuplot == 1 &&
    options->force == 1 &&
    options->quiet == 0
  );
}
Beispiel #5
0
static int valid_simple_flags()
{
  const char *argv[] = {"exec_filename", "-f", "-q", "--out", "out_filename"};
  int argc = 5;
  cli_parse(argc, argv);

  mu_assert(
    options->in_filename == NULL &&
    strcmp(options->out_filename, "out_filename") == 0 &&
    options->gnuplot == 0 &&
    options->force == 1 &&
    options->quiet == 1
  );
}
Beispiel #6
0
Datei: cli.c Projekt: yubo/bird
static void
cli_command(struct cli *c)
{
  struct config f;
  int res;

  if (config->cli_debug > 1)
    log(L_TRACE "CLI: %s", c->rx_buf);
  bzero(&f, sizeof(f));
  f.mem = c->parser_pool;
  cf_read_hook = cli_cmd_read_hook;
  cli_rh_pos = c->rx_buf;
  cli_rh_len = strlen(c->rx_buf);
  cli_rh_trick_flag = 0;
  this_cli = c;
  lp_flush(c->parser_pool);
  res = cli_parse(&f);
  if (!res)
    cli_printf(c, 9001, f.err_msg);
}
Beispiel #7
0
int
main(int argc, char * const argv[])
{
    struct qnetd_instance instance;
    struct qnetd_advanced_settings advanced_settings;
    char *host_addr;
    uint16_t host_port;
    int foreground;
    int debug_log;
    int bump_log_priority;
    enum tlv_tls_supported tls_supported;
    int client_cert_required;
    size_t max_clients;
    PRIntn address_family;
    int lock_file;
    int another_instance_running;

    if (qnetd_advanced_settings_init(&advanced_settings) != 0) {
        errx(1, "Can't alloc memory for advanced settings");
    }

    cli_parse(argc, argv, &host_addr, &host_port, &foreground, &debug_log, &bump_log_priority,
              &tls_supported, &client_cert_required, &max_clients, &address_family, &advanced_settings);

    if (foreground) {
        qnetd_log_init(QNETD_LOG_TARGET_STDERR);
    } else {
        qnetd_log_init(QNETD_LOG_TARGET_SYSLOG);
    }

    qnetd_log_set_debug(debug_log);
    qnetd_log_set_priority_bump(bump_log_priority);

    /*
     * Daemonize
     */
    if (!foreground) {
        utils_tty_detach();
    }

    if ((lock_file = utils_flock(advanced_settings.lock_file, getpid(),
                                 &another_instance_running)) == -1) {
        if (another_instance_running) {
            qnetd_log(LOG_ERR, "Another instance is running");
        } else {
            qnetd_log_err(LOG_ERR, "Can't acquire lock");
        }

        exit(1);
    }

    qnetd_log(LOG_DEBUG, "Initializing nss");
    if (nss_sock_init_nss((tls_supported != TLV_TLS_UNSUPPORTED ?
                           advanced_settings.nss_db_dir : NULL)) != 0) {
        qnetd_err_nss();
    }

    if (SSL_ConfigServerSessionIDCache(0, 0, 0, NULL) != SECSuccess) {
        qnetd_err_nss();
    }

    if (qnetd_instance_init(&instance, tls_supported, client_cert_required,
                            max_clients, &advanced_settings) == -1) {
        qnetd_log(LOG_ERR, "Can't initialize qnetd");
        exit(1);
    }
    instance.host_addr = host_addr;
    instance.host_port = host_port;

    if (tls_supported != TLV_TLS_UNSUPPORTED && qnetd_instance_init_certs(&instance) == -1) {
        qnetd_err_nss();
    }

    qnetd_log(LOG_DEBUG, "Initializing local socket");
    if (qnetd_ipc_init(&instance) != 0) {
        return (1);
    }

    qnetd_log(LOG_DEBUG, "Creating listening socket");
    instance.server.socket = nss_sock_create_listen_socket(instance.host_addr,
                             instance.host_port, address_family);
    if (instance.server.socket == NULL) {
        qnetd_err_nss();
    }

    if (nss_sock_set_non_blocking(instance.server.socket) != 0) {
        qnetd_err_nss();
    }

    if (PR_Listen(instance.server.socket, instance.advanced_settings->listen_backlog) !=
            PR_SUCCESS) {
        qnetd_err_nss();
    }

    global_instance = &instance;
    signal_handlers_register();

    qnetd_log(LOG_DEBUG, "Registering algorithms");
    if (qnetd_algorithm_register_all() != 0) {
        exit(1);
    }

    qnetd_log(LOG_DEBUG, "QNetd ready to provide service");
    /*
     * MAIN LOOP
     */
    while (qnetd_poll(&instance) == 0) {
    }

    /*
     * Cleanup
     */
    qnetd_ipc_destroy(&instance);

    if (PR_Close(instance.server.socket) != PR_SUCCESS) {
        qnetd_warn_nss();
    }

    CERT_DestroyCertificate(instance.server.cert);
    SECKEY_DestroyPrivateKey(instance.server.private_key);

    SSL_ClearSessionCache();

    SSL_ShutdownServerSessionIDCache();

    qnetd_instance_destroy(&instance);

    qnetd_advanced_settings_destroy(&advanced_settings);

    if (NSS_Shutdown() != SECSuccess) {
        qnetd_warn_nss();
    }

    if (PR_Cleanup() != PR_SUCCESS) {
        qnetd_warn_nss();
    }

    qnetd_log_close();

    return (0);
}
Beispiel #8
0
int
main(int argc, char * const argv[])
{
	struct qdevice_instance instance;
	struct qdevice_advanced_settings advanced_settings;
	int foreground;
	int force_debug;
	int lock_file;
	int another_instance_running;

	if (qdevice_advanced_settings_init(&advanced_settings) != 0) {
		errx(1, "Can't alloc memory for advanced settings");
	}

	cli_parse(argc, argv, &foreground, &force_debug, &advanced_settings);

	qdevice_instance_init(&instance, &advanced_settings);

	qdevice_cmap_init(&instance);
	qdevice_log_init(&instance, force_debug);

	/*
	 * Daemonize
	 */
	if (!foreground) {
		utils_tty_detach();
	}

	if ((lock_file = utils_flock(advanced_settings.lock_file, getpid(),
	    &another_instance_running)) == -1) {
		if (another_instance_running) {
			qdevice_log(LOG_ERR, "Another instance is running");
		} else {
			qdevice_log_err(LOG_ERR, "Can't acquire lock");
		}

		exit(1);
	}

	qdevice_log(LOG_DEBUG, "Initializing votequorum");
	qdevice_votequorum_init(&instance);

	qdevice_log(LOG_DEBUG, "Initializing local socket");
	if (qdevice_ipc_init(&instance) != 0) {
		return (1);
	}

	qdevice_log(LOG_DEBUG, "Registering qdevice models");
	qdevice_model_register_all();

	qdevice_log(LOG_DEBUG, "Configuring qdevice");
	if (qdevice_instance_configure_from_cmap(&instance) != 0) {
		return (1);
	}

	qdevice_log(LOG_DEBUG, "Configuring master_wins");
	if (qdevice_votequorum_master_wins(&instance, (advanced_settings.master_wins ==
	    QDEVICE_ADVANCED_SETTINGS_MASTER_WINS_FORCE_ON ? 1 : 0)) != 0) {
		return (1);
	}

	qdevice_log(LOG_DEBUG, "Getting configuration node list");
	if (qdevice_cmap_store_config_node_list(&instance) != 0) {
		return (1);
	}

	qdevice_log(LOG_DEBUG, "Initializing qdevice model");
	if (qdevice_model_init(&instance) != 0) {
		return (1);
	}

	qdevice_log(LOG_DEBUG, "Initializing cmap tracking");
	if (qdevice_cmap_add_track(&instance) != 0) {
		return (1);
	}

	qdevice_log(LOG_DEBUG, "Waiting for ring id");
	if (qdevice_votequorum_wait_for_ring_id(&instance) != 0) {
		return (1);
	}

	global_instance = &instance;
	signal_handlers_register();

	qdevice_log(LOG_DEBUG, "Running qdevice model");
	if (qdevice_model_run(&instance) != 0) {
		return (1);
	}

	qdevice_log(LOG_DEBUG, "Removing cmap tracking");
	if (qdevice_cmap_del_track(&instance) != 0) {
		return (1);
	}

	qdevice_log(LOG_DEBUG, "Destroying qdevice model");
	qdevice_model_destroy(&instance);

	qdevice_ipc_destroy(&instance);

	qdevice_votequorum_destroy(&instance);
	qdevice_cmap_destroy(&instance);
	qdevice_log_close(&instance);
	qdevice_instance_destroy(&instance);
	qdevice_advanced_settings_destroy(&advanced_settings);

	return (0);
}
Beispiel #9
0
/********************************************************************
* FUNCTION agt_cli_process_input
*
* Process the param line parameters against the hardwired
* parmset for the netconfd program
*
* INPUTS:
*    argc == argument count
*    argv == array of command line argument strings
*    agt_profile == agent profile struct to fill in
*    showver == address of version return quick-exit status
*    showhelpmode == address of help return quick-exit status
*
* OUTPUTS:
*    *agt_profile is filled in, with parms gathered or defaults
*    *showver == TRUE if user requsted version quick-exit mode
*    *showhelpmode == requested help mode 
*                     (none, breief, normal, full)
*
* RETURNS:
*    NO_ERR if all goes well
*********************************************************************/
status_t
    agt_cli_process_input (int argc,
                           char *argv[],
                           agt_profile_t *agt_profile,
                           boolean *showver,
                           help_mode_t *showhelpmode)
{
    ncx_module_t          *mod;
    obj_template_t        *obj;
    val_value_t           *valset, *val;
    FILE                  *fp;
    status_t               res;
    boolean                test;

#ifdef DEBUG
    if (!argv || !agt_profile || !showver || !showhelpmode) {
        return SET_ERROR(ERR_INTERNAL_PTR);
    }
#endif

    *showver = FALSE;
    *showhelpmode = HELP_MODE_NONE;

    /* find the parmset definition in the registry */
    obj = NULL;
    mod = ncx_find_module(AGT_CLI_MODULE, NULL);
    if (mod) {
        obj = ncx_find_object(mod, AGT_CLI_CONTAINER);
    }
    if (!obj) {
        log_error("\nError: netconfd module with CLI definitions not loaded");
        return ERR_NCX_NOT_FOUND;
    }

    /* parse the command line against the object template */
    res = NO_ERR;
    valset = NULL;
    if (argc > 0) {
        valset = cli_parse(NULL,
                           argc, 
                           argv, 
                           obj,
                           FULLTEST, 
                           PLAINMODE, 
                           TRUE, 
                           CLI_MODE_PROGRAM,
                           &res);
        if (res != NO_ERR) {
            if (valset) {
                val_free_value(valset);
            }
            return res;
        }
    }

    if (valset != NULL) {
        /* transfer the parmset values */
        set_server_profile(valset, agt_profile);

        /* next get any params from the conf file */
        val = val_find_child(valset, 
                             AGT_CLI_MODULE, 
                             NCX_EL_CONFIG);
        if (val) {
            if (val->res == NO_ERR) {
                /* try the specified config location */
                agt_profile->agt_conffile = VAL_STR(val);
                res = conf_parse_val_from_filespec(VAL_STR(val), 
                                                   valset, 
                                                   TRUE, 
                                                   TRUE);
                if (res != NO_ERR) {
                    val_free_value(valset);
                    return res;
                } else {
                    /* transfer the parmset values again */
                    set_server_profile(valset, agt_profile);
                }
            }
        } else {
            fp = fopen((const char *)AGT_DEF_CONF_FILE, "r");
            if (fp != NULL) {
                fclose(fp);

                /* use default config location */
                res = conf_parse_val_from_filespec(AGT_DEF_CONF_FILE, 
                                                   valset, 
                                                   TRUE, 
                                                   TRUE);
                if (res != NO_ERR) {
                    val_free_value(valset);
                    return res;
                } else {
                    /* transfer the parmset values again */
                    set_server_profile(valset, agt_profile);
                }
            }
        }

        /* set the logging control parameters */
        val_set_logging_parms(valset);

        /* audit-log-append param */
        val = val_find_child(valset, 
                             AGT_CLI_MODULE, 
                             NCX_EL_AUDIT_LOG_APPEND);
        if (val && val->res == NO_ERR) {
            test = TRUE;
        } else {
            test = FALSE;
        }

        /* audit-log param */
        val = val_find_child(valset, AGT_CLI_MODULE, NCX_EL_AUDIT_LOG);
        if (val && val->res == NO_ERR) {
            xmlChar *filespec = ncx_get_source(VAL_STR(val), &res);
            if (filespec == NULL) {
                log_error("\nError: get source for audit log failed");
                return res;
            }
            res = log_audit_open((const char *)filespec, test, TRUE);
            if (res == NO_ERR) {
                if (LOGDEBUG) {
                    log_debug("\nAudit log '%s' opened for %s",
                              filespec,
                              (test) ? "append" : "write");
                }
            } else {
                log_error("\nError: open audit log '%s' failed",
                          filespec);
            }
            m__free(filespec);
            if (res != NO_ERR) {
                return res;
            }
        }

        /* set the file search path parms */
        res = val_set_path_parms(valset);
        if (res != NO_ERR) {
            return res;
        }

        /* set the warning control parameters */
        res = val_set_warning_parms(valset);
        if (res != NO_ERR) {
            return res;
        }

        /* set the feature code generation parameters */
        res = val_set_feature_parms(valset);
        if (res != NO_ERR) {
            return res;
        }

        /* check the subdirs parameter */
        res = val_set_subdirs_parm(valset);
        if (res != NO_ERR) {
            return res;
        }

        /* check the protocols parameter */
        res = val_set_protocols_parm(valset);
        if (res != NO_ERR) {
            return res;
        }

        /* check the system-sorted param */
        val = val_find_child(valset, AGT_CLI_MODULE, NCX_EL_SYSTEM_SORTED);
        if (val && val->res == NO_ERR) {
            agt_profile->agt_system_sorted = VAL_BOOL(val);
        }

        /* version param handled externally */

        /* check if version mode requested */
        val = val_find_child(valset, AGT_CLI_MODULE, NCX_EL_VERSION);
        *showver = (val) ? TRUE : FALSE;

        /* check if help mode requested */
        val = val_find_child(valset, AGT_CLI_MODULE, NCX_EL_HELP);
        if (val) {
            *showhelpmode = HELP_MODE_NORMAL;

            /* help submode parameter (brief/normal/full) */
            val = val_find_child(valset, AGT_CLI_MODULE, NCX_EL_BRIEF);
            if (val) {
                *showhelpmode = HELP_MODE_BRIEF;
            } else {
                /* full parameter */
                val = val_find_child(valset, AGT_CLI_MODULE, NCX_EL_FULL);
                if (val) {
                    *showhelpmode = HELP_MODE_FULL;
                }
            }
        }
    }

    /* cleanup and exit
     * handoff the malloced 'valset' memory here 
     */
    cli_val = valset;

    return res;

} /* agt_cli_process_input */
Beispiel #10
0
int
main(int argc, char * const argv[])
{
	enum qnetd_tool_operation operation;
	int verbose;
	char *cluster_name;
	char *socket_path;
	int sock_fd;
	FILE *sock;
	struct dynar send_str;
	int res;
	int exit_code;

	exit_code = QNETD_TOOL_EXIT_CODE_NO_ERROR;

	cli_parse(argc, argv, &operation, &verbose, &cluster_name, &socket_path);

	dynar_init(&send_str, QNETD_DEFAULT_IPC_MAX_RECEIVE_SIZE);

	sock_fd = unix_socket_client_create(socket_path, 0);
	if (sock_fd == -1) {
		err(QNETD_TOOL_EXIT_CODE_SOCKET_CONNECT,
		    "Can't connect to qnetd socket (is QNetd running?)");
	}

	sock = fdopen(sock_fd, "w+t");
	if (sock == NULL) {
		err(QNETD_TOOL_EXIT_CODE_INTERNAL_ERROR, "Can't open QNetd socket fd");
	}

	if (store_command(&send_str, operation, verbose, cluster_name) != 0) {
		errx(QNETD_TOOL_EXIT_CODE_INTERNAL_ERROR, "Can't store command");
	}

	if (fprintf(sock, "%s", dynar_data(&send_str)) != strlen(dynar_data(&send_str)) ||
	    fflush(sock) != 0) {
		errx(QNETD_TOOL_EXIT_CODE_INTERNAL_ERROR, "Can't send command");
	}

	res = read_ipc_reply(sock);
	switch (res) {
	case -1:
		errx(QNETD_TOOL_EXIT_CODE_INTERNAL_ERROR, "Internal error during IPC status line read");
		break;
	case 0:
		break;
	case 1:
		exit_code = QNETD_TOOL_EXIT_CODE_QNETD_RETURNED_ERROR;
		break;
	case 2:
		errx(QNETD_TOOL_EXIT_CODE_SOCKET_CONNECT, "Unknown status line returned by IPC server");
		break;
	}

	if (fclose(sock) != 0) {
		warn("Can't close QNetd socket");
	}

	free(cluster_name);
	free(socket_path);
	dynar_destroy(&send_str);

	return (exit_code);
}