Blame src/client/conf-system.c

Packit e9ba0d
/* -*- mode: c; c-file-style: "openbsd" -*- */
Packit e9ba0d
/*
Packit e9ba0d
 * Copyright (c) 2013 Vincent Bernat <bernat@luffy.cx>
Packit e9ba0d
 *
Packit e9ba0d
 * Permission to use, copy, modify, and/or distribute this software for any
Packit e9ba0d
 * purpose with or without fee is hereby granted, provided that the above
Packit e9ba0d
 * copyright notice and this permission notice appear in all copies.
Packit e9ba0d
 *
Packit e9ba0d
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
Packit e9ba0d
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
Packit e9ba0d
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
Packit e9ba0d
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
Packit e9ba0d
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
Packit e9ba0d
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Packit e9ba0d
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Packit e9ba0d
 */
Packit e9ba0d
Packit e9ba0d
#include <unistd.h>
Packit e9ba0d
#include <string.h>
Packit e9ba0d
#include <sys/utsname.h>
Packit e9ba0d
Packit e9ba0d
#include "client.h"
Packit e9ba0d
#include "../log.h"
Packit e9ba0d
Packit e9ba0d
static int
Packit e9ba0d
cmd_iface_pattern(struct lldpctl_conn_t *conn, struct writer *w,
Packit e9ba0d
    struct cmd_env *env, void *arg)
Packit e9ba0d
{
Packit e9ba0d
	log_debug("lldpctl", "set iface pattern");
Packit e9ba0d
Packit e9ba0d
	lldpctl_atom_t *config = lldpctl_get_configuration(conn);
Packit e9ba0d
	if (config == NULL) {
Packit e9ba0d
		log_warnx("lldpctl", "unable to get configuration from lldpd. %s",
Packit e9ba0d
		    lldpctl_last_strerror(conn));
Packit e9ba0d
		return 0;
Packit e9ba0d
	}
Packit e9ba0d
Packit e9ba0d
	const char *value = cmdenv_get(env, "iface-pattern");
Packit e9ba0d
	if (lldpctl_atom_set_str(config,
Packit e9ba0d
		lldpctl_k_config_iface_pattern,
Packit e9ba0d
		value) == NULL) {
Packit e9ba0d
		log_warnx("lldpctl", "unable to set iface-pattern. %s",
Packit e9ba0d
		    lldpctl_last_strerror(conn));
Packit e9ba0d
		lldpctl_atom_dec_ref(config);
Packit e9ba0d
		return 0;
Packit e9ba0d
	}
Packit e9ba0d
	log_info("lldpctl", "iface-pattern set to new value %s",
Packit e9ba0d
	    value?value:"(none)");
Packit e9ba0d
	lldpctl_atom_dec_ref(config);
Packit e9ba0d
	return 1;
Packit e9ba0d
}
Packit e9ba0d
Packit e9ba0d
static int
Packit e9ba0d
cmd_perm_iface_pattern(struct lldpctl_conn_t *conn, struct writer *w,
Packit e9ba0d
    struct cmd_env *env, void *arg)
Packit e9ba0d
{
Packit e9ba0d
	log_debug("lldpctl", "set permanent iface pattern");
Packit e9ba0d
Packit e9ba0d
	lldpctl_atom_t *config = lldpctl_get_configuration(conn);
Packit e9ba0d
	if (config == NULL) {
Packit e9ba0d
		log_warnx("lldpctl", "unable to get configuration from lldpd. %s",
Packit e9ba0d
		    lldpctl_last_strerror(conn));
Packit e9ba0d
		return 0;
Packit e9ba0d
	}
Packit e9ba0d
Packit e9ba0d
	const char *value = cmdenv_get(env, "iface-pattern");
Packit e9ba0d
	if (lldpctl_atom_set_str(config,
Packit e9ba0d
		lldpctl_k_config_perm_iface_pattern,
Packit e9ba0d
		value) == NULL) {
Packit e9ba0d
		log_warnx("lldpctl", "unable to set permanent iface pattern. %s",
Packit e9ba0d
		    lldpctl_last_strerror(conn));
Packit e9ba0d
		lldpctl_atom_dec_ref(config);
Packit e9ba0d
		return 0;
Packit e9ba0d
	}
Packit e9ba0d
	log_info("lldpctl", "permanent iface pattern set to new value %s",
Packit e9ba0d
	    value?value:"(none)");
Packit e9ba0d
	lldpctl_atom_dec_ref(config);
Packit e9ba0d
	return 1;
Packit e9ba0d
}
Packit e9ba0d
Packit e9ba0d
static int
Packit e9ba0d
cmd_iface_promisc(struct lldpctl_conn_t *conn, struct writer *w,
Packit e9ba0d
    struct cmd_env *env, void *arg)
Packit e9ba0d
{
Packit e9ba0d
	lldpctl_atom_t *config = lldpctl_get_configuration(conn);
Packit e9ba0d
	if (config == NULL) {
Packit e9ba0d
		log_warnx("lldpctl", "unable to get configuration from lldpd. %s",
Packit e9ba0d
		    lldpctl_last_strerror(conn));
Packit e9ba0d
		return 0;
Packit e9ba0d
	}
Packit e9ba0d
	if (lldpctl_atom_set_int(config,
Packit e9ba0d
		lldpctl_k_config_iface_promisc,
Packit e9ba0d
		arg?1:0) == NULL) {
Packit e9ba0d
		log_warnx("lldpctl", "unable to %s promiscuous mode: %s",
Packit e9ba0d
		    arg?"enable":"disable",
Packit e9ba0d
		    lldpctl_last_strerror(conn));
Packit e9ba0d
		lldpctl_atom_dec_ref(config);
Packit e9ba0d
		return 0;
Packit e9ba0d
	}
Packit e9ba0d
	log_info("lldpctl", "interface promiscuous mode %s",
Packit e9ba0d
	    arg?"enabled":"disabled");
Packit e9ba0d
	lldpctl_atom_dec_ref(config);
Packit e9ba0d
	return 1;
Packit e9ba0d
}
Packit e9ba0d
Packit e9ba0d
static int
Packit e9ba0d
cmd_system_description(struct lldpctl_conn_t *conn, struct writer *w,
Packit e9ba0d
    struct cmd_env *env, void *arg)
Packit e9ba0d
{
Packit e9ba0d
	int platform = 0;
Packit e9ba0d
	const char *what = arg;
Packit e9ba0d
	const char *value;
Packit e9ba0d
	if (!strcmp(what, "system")) {
Packit e9ba0d
		value = cmdenv_get(env, "description");
Packit e9ba0d
	} else {
Packit e9ba0d
		value = cmdenv_get(env, "platform");
Packit e9ba0d
		platform = 1;
Packit e9ba0d
	}
Packit e9ba0d
	log_debug("lldpctl", "set %s description", what);
Packit e9ba0d
	lldpctl_atom_t *config = lldpctl_get_configuration(conn);
Packit e9ba0d
	if (config == NULL) {
Packit e9ba0d
		log_warnx("lldpctl", "unable to get configuration from lldpd. %s",
Packit e9ba0d
		    lldpctl_last_strerror(conn));
Packit e9ba0d
		return 0;
Packit e9ba0d
	}
Packit e9ba0d
	if (lldpctl_atom_set_str(config,
Packit e9ba0d
		platform?lldpctl_k_config_platform:lldpctl_k_config_description,
Packit e9ba0d
		value) == NULL) {
Packit e9ba0d
		log_warnx("lldpctl", "unable to set description. %s",
Packit e9ba0d
		    lldpctl_last_strerror(conn));
Packit e9ba0d
		lldpctl_atom_dec_ref(config);
Packit e9ba0d
		return 0;
Packit e9ba0d
	}
Packit e9ba0d
	log_info("lldpctl", "description set to new value %s",
Packit e9ba0d
	    value?value:"(none)");
Packit e9ba0d
	lldpctl_atom_dec_ref(config);
Packit e9ba0d
	return 1;
Packit e9ba0d
}
Packit e9ba0d
Packit e9ba0d
static int
Packit e9ba0d
cmd_system_chassisid(struct lldpctl_conn_t *conn, struct writer *w,
Packit e9ba0d
    struct cmd_env *env, void *arg)
Packit e9ba0d
{
Packit e9ba0d
	const char *value;
Packit e9ba0d
	value = cmdenv_get(env, "description");
Packit e9ba0d
	log_debug("lldpctl", "set chassis ID");
Packit e9ba0d
	lldpctl_atom_t *config = lldpctl_get_configuration(conn);
Packit e9ba0d
	if (config == NULL) {
Packit e9ba0d
		log_warnx("lldpctl", "unable to get configuration from lldpd. %s",
Packit e9ba0d
		    lldpctl_last_strerror(conn));
Packit e9ba0d
		return 0;
Packit e9ba0d
	}
Packit e9ba0d
	if (lldpctl_atom_set_str(config,
Packit e9ba0d
	    lldpctl_k_config_cid_string,
Packit e9ba0d
	    value) == NULL) {
Packit e9ba0d
		log_warnx("lldpctl", "unable to set chassis ID. %s",
Packit e9ba0d
		    lldpctl_last_strerror(conn));
Packit e9ba0d
		lldpctl_atom_dec_ref(config);
Packit e9ba0d
		return 0;
Packit e9ba0d
	}
Packit e9ba0d
	log_info("lldpctl", "chassis ID set to new value %s",
Packit e9ba0d
	    value?value:"(none)");
Packit e9ba0d
	lldpctl_atom_dec_ref(config);
Packit e9ba0d
	return 1;
Packit e9ba0d
}
Packit e9ba0d
Packit e9ba0d
static int
Packit e9ba0d
cmd_management(struct lldpctl_conn_t *conn, struct writer *w,
Packit e9ba0d
    struct cmd_env *env, void *arg)
Packit e9ba0d
{
Packit e9ba0d
	log_debug("lldpctl", "set management pattern");
Packit e9ba0d
Packit e9ba0d
	lldpctl_atom_t *config = lldpctl_get_configuration(conn);
Packit e9ba0d
	if (config == NULL) {
Packit e9ba0d
		log_warnx("lldpctl", "unable to get configuration from lldpd. %s",
Packit e9ba0d
		    lldpctl_last_strerror(conn));
Packit e9ba0d
		return 0;
Packit e9ba0d
	}
Packit e9ba0d
Packit e9ba0d
	const char *value = cmdenv_get(env, "management-pattern");
Packit e9ba0d
	if (lldpctl_atom_set_str(config,
Packit e9ba0d
		lldpctl_k_config_mgmt_pattern, value) == NULL) {
Packit e9ba0d
		log_warnx("lldpctl", "unable to set management pattern. %s",
Packit e9ba0d
		    lldpctl_last_strerror(conn));
Packit e9ba0d
		lldpctl_atom_dec_ref(config);
Packit e9ba0d
		return 0;
Packit e9ba0d
	}
Packit e9ba0d
	log_info("lldpctl", "management pattaren set to new value %s",
Packit e9ba0d
	    value?value:"(none)");
Packit e9ba0d
	lldpctl_atom_dec_ref(config);
Packit e9ba0d
	return 1;
Packit e9ba0d
}
Packit e9ba0d
Packit e9ba0d
static int
Packit e9ba0d
cmd_hostname(struct lldpctl_conn_t *conn, struct writer *w,
Packit e9ba0d
    struct cmd_env *env, void *arg)
Packit e9ba0d
{
Packit e9ba0d
	struct utsname un;
Packit e9ba0d
	log_debug("lldpctl", "set system name");
Packit e9ba0d
Packit e9ba0d
	lldpctl_atom_t *config = lldpctl_get_configuration(conn);
Packit e9ba0d
	if (config == NULL) {
Packit e9ba0d
		log_warnx("lldpctl", "unable to get configuration from lldpd. %s",
Packit e9ba0d
		    lldpctl_last_strerror(conn));
Packit e9ba0d
		return 0;
Packit e9ba0d
	}
Packit e9ba0d
Packit e9ba0d
	const char *value = cmdenv_get(env, "hostname");
Packit e9ba0d
	if (value && strlen(value) == 1 && value[0] == '.') {
Packit e9ba0d
		if (uname(&un) < 0) {
Packit e9ba0d
			log_warn("lldpctl", "cannot get node name");
Packit e9ba0d
			return 0;
Packit e9ba0d
		}
Packit e9ba0d
		value = un.nodename;
Packit e9ba0d
	}
Packit e9ba0d
	if (lldpctl_atom_set_str(config,
Packit e9ba0d
		lldpctl_k_config_hostname, value) == NULL) {
Packit e9ba0d
		log_warnx("lldpctl", "unable to set system name. %s",
Packit e9ba0d
		    lldpctl_last_strerror(conn));
Packit e9ba0d
		lldpctl_atom_dec_ref(config);
Packit e9ba0d
		return 0;
Packit e9ba0d
	}
Packit e9ba0d
	log_info("lldpctl", "system name set to new value %s",
Packit e9ba0d
	    value?value:"(none)");
Packit e9ba0d
	lldpctl_atom_dec_ref(config);
Packit e9ba0d
	return 1;
Packit e9ba0d
}
Packit e9ba0d
Packit e9ba0d
static int
Packit e9ba0d
cmd_update_descriptions(struct lldpctl_conn_t *conn, struct writer *w,
Packit e9ba0d
    struct cmd_env *env, void *arg)
Packit e9ba0d
{
Packit e9ba0d
	lldpctl_atom_t *config = lldpctl_get_configuration(conn);
Packit e9ba0d
	if (config == NULL) {
Packit e9ba0d
		log_warnx("lldpctl", "unable to get configuration from lldpd. %s",
Packit e9ba0d
		    lldpctl_last_strerror(conn));
Packit e9ba0d
		return 0;
Packit e9ba0d
	}
Packit e9ba0d
	if (lldpctl_atom_set_int(config,
Packit e9ba0d
		lldpctl_k_config_ifdescr_update,
Packit e9ba0d
		arg?1:0) == NULL) {
Packit e9ba0d
		log_warnx("lldpctl", "unable to %s interface description update: %s",
Packit e9ba0d
		    arg?"enable":"disable",
Packit e9ba0d
		    lldpctl_last_strerror(conn));
Packit e9ba0d
		lldpctl_atom_dec_ref(config);
Packit e9ba0d
		return 0;
Packit e9ba0d
	}
Packit e9ba0d
	log_info("lldpctl", "interface description update %s",
Packit e9ba0d
	    arg?"enabled":"disabled");
Packit e9ba0d
	lldpctl_atom_dec_ref(config);
Packit e9ba0d
	return 1;
Packit e9ba0d
}
Packit e9ba0d
Packit e9ba0d
static int
Packit e9ba0d
cmd_bondslave_srcmac_type(struct lldpctl_conn_t *conn, struct writer *w,
Packit e9ba0d
    struct cmd_env *env, void *arg)
Packit e9ba0d
{
Packit e9ba0d
	char *value_str;
Packit e9ba0d
	int value = -1;
Packit e9ba0d
Packit e9ba0d
	log_debug("lldpctl", "bond slave src mac");
Packit e9ba0d
Packit e9ba0d
	lldpctl_atom_t *config = lldpctl_get_configuration(conn);
Packit e9ba0d
	if (config == NULL) {
Packit e9ba0d
		log_warnx("lldpctl",
Packit e9ba0d
			"unable to get configuration from lldpd. %s",
Packit e9ba0d
			lldpctl_last_strerror(conn));
Packit e9ba0d
		return 0;
Packit e9ba0d
	}
Packit e9ba0d
Packit e9ba0d
	value_str = arg;
Packit e9ba0d
	for (lldpctl_map_t *b_map =
Packit e9ba0d
		lldpctl_key_get_map(lldpctl_k_config_bond_slave_src_mac_type);
Packit e9ba0d
		b_map->string; b_map++) {
Packit e9ba0d
		if (!strcmp(b_map->string, value_str)) {
Packit e9ba0d
			value = b_map->value;
Packit e9ba0d
			break;
Packit e9ba0d
		}
Packit e9ba0d
	}
Packit e9ba0d
Packit e9ba0d
	if (value == -1) {
Packit e9ba0d
		log_warnx("lldpctl", "invalid value");
Packit e9ba0d
		return 0;
Packit e9ba0d
	}
Packit e9ba0d
Packit e9ba0d
	if (lldpctl_atom_set_int(config,
Packit e9ba0d
		lldpctl_k_config_bond_slave_src_mac_type, value) == NULL) {
Packit e9ba0d
		log_warnx("lldpctl", "unable to set bond slave src mac type."
Packit e9ba0d
			" %s", lldpctl_last_strerror(conn));
Packit e9ba0d
		lldpctl_atom_dec_ref(config);
Packit e9ba0d
		return 0;
Packit e9ba0d
	}
Packit e9ba0d
Packit e9ba0d
	log_info("lldpctl", "bond slave src mac set to new value: %s",
Packit e9ba0d
	    value_str);
Packit e9ba0d
	lldpctl_atom_dec_ref(config);
Packit e9ba0d
Packit e9ba0d
	return 1;
Packit e9ba0d
}
Packit e9ba0d
Packit e9ba0d
/**
Packit e9ba0d
 * Register `configure system bond-slave-src-mac-type`
Packit e9ba0d
 */
Packit e9ba0d
static void
Packit e9ba0d
register_commands_srcmac_type(struct cmd_node *configure)
Packit e9ba0d
{
Packit e9ba0d
	struct cmd_node *bond_slave_src_mac_type =
Packit e9ba0d
		commands_new(configure,
Packit e9ba0d
			"bond-slave-src-mac-type",
Packit e9ba0d
			"Set LLDP bond slave source MAC type",
Packit e9ba0d
			NULL, NULL, NULL);
Packit e9ba0d
Packit e9ba0d
	for (lldpctl_map_t *b_map =
Packit e9ba0d
		lldpctl_key_get_map(lldpctl_k_config_bond_slave_src_mac_type);
Packit e9ba0d
		b_map->string; b_map++) {
Packit e9ba0d
		if (!strcmp(b_map->string, "real")) {
Packit e9ba0d
			commands_new(
Packit e9ba0d
				commands_new(bond_slave_src_mac_type,
Packit e9ba0d
					b_map->string, "Real mac",
Packit e9ba0d
					NULL, NULL, NULL),
Packit e9ba0d
					NEWLINE, NULL,
Packit e9ba0d
					NULL, cmd_bondslave_srcmac_type,
Packit e9ba0d
					b_map->string);
Packit e9ba0d
		} else if (!strcmp(b_map->string, "zero")) {
Packit e9ba0d
			commands_new(
Packit e9ba0d
				commands_new(bond_slave_src_mac_type,
Packit e9ba0d
					b_map->string, "All zero mac",
Packit e9ba0d
					NULL, NULL, NULL),
Packit e9ba0d
					NEWLINE, NULL,
Packit e9ba0d
					NULL, cmd_bondslave_srcmac_type,
Packit e9ba0d
					b_map->string);
Packit e9ba0d
		} else if (!strcmp(b_map->string, "fixed")) {
Packit e9ba0d
			commands_new(
Packit e9ba0d
				commands_new(bond_slave_src_mac_type,
Packit e9ba0d
					b_map->string, "Fixed value (3Com card)",
Packit e9ba0d
					NULL, NULL, NULL),
Packit e9ba0d
					NEWLINE, NULL,
Packit e9ba0d
					NULL, cmd_bondslave_srcmac_type,
Packit e9ba0d
					b_map->string);
Packit e9ba0d
		} else if (!strcmp(b_map->string, "local")) {
Packit e9ba0d
			commands_new(
Packit e9ba0d
				commands_new(bond_slave_src_mac_type,
Packit e9ba0d
					b_map->string, "Real Mac with locally "
Packit e9ba0d
					"administered bit set",
Packit e9ba0d
					NULL, NULL, NULL),
Packit e9ba0d
					NEWLINE, NULL,
Packit e9ba0d
					NULL, cmd_bondslave_srcmac_type,
Packit e9ba0d
					b_map->string);
Packit e9ba0d
		}
Packit e9ba0d
	}
Packit e9ba0d
}
Packit e9ba0d
Packit e9ba0d
/**
Packit e9ba0d
 * Register `configure system` commands.
Packit e9ba0d
 *
Packit e9ba0d
 * Those are the commands to configure protocol-independant stuff.
Packit e9ba0d
 */
Packit e9ba0d
void
Packit e9ba0d
register_commands_configure_system(struct cmd_node *configure,
Packit e9ba0d
    struct cmd_node *unconfigure)
Packit e9ba0d
{
Packit e9ba0d
	struct cmd_node *configure_system = commands_new(
Packit e9ba0d
		configure,
Packit e9ba0d
		"system", "System configuration",
Packit e9ba0d
		cmd_check_no_env, NULL, "ports");
Packit e9ba0d
	struct cmd_node *unconfigure_system = commands_new(
Packit e9ba0d
		unconfigure,
Packit e9ba0d
		"system", "System configuration",
Packit e9ba0d
		cmd_check_no_env, NULL, "ports");
Packit e9ba0d
	struct cmd_node *configure_interface = commands_new(
Packit e9ba0d
		configure_system,
Packit e9ba0d
		"interface", "Interface related items",
Packit e9ba0d
		NULL, NULL, NULL);
Packit e9ba0d
	struct cmd_node *unconfigure_interface = commands_new(
Packit e9ba0d
		unconfigure_system,
Packit e9ba0d
		"interface", "Interface related items",
Packit e9ba0d
		NULL, NULL, NULL);
Packit e9ba0d
Packit e9ba0d
	commands_new(
Packit e9ba0d
		commands_new(
Packit e9ba0d
			commands_new(configure_system,
Packit e9ba0d
			    "description", "Override chassis description",
Packit e9ba0d
			    NULL, NULL, NULL),
Packit e9ba0d
			NULL, "Chassis description",
Packit e9ba0d
			NULL, cmd_store_env_value, "description"),
Packit e9ba0d
		NEWLINE, "Override chassis description",
Packit e9ba0d
		NULL, cmd_system_description, "system");
Packit e9ba0d
	commands_new(
Packit e9ba0d
		commands_new(unconfigure_system,
Packit e9ba0d
		    "description", "Don't override chassis description",
Packit e9ba0d
		    NULL, NULL, NULL),
Packit e9ba0d
		NEWLINE, "Don't override chassis description",
Packit e9ba0d
		NULL, cmd_system_description, "system");
Packit e9ba0d
Packit e9ba0d
	commands_new(
Packit e9ba0d
		commands_new(
Packit e9ba0d
			commands_new(configure_system,
Packit e9ba0d
			    "chassisid", "Override chassis ID",
Packit e9ba0d
			    NULL, NULL, NULL),
Packit e9ba0d
			NULL, "Chassis ID",
Packit e9ba0d
			NULL, cmd_store_env_value, "description"),
Packit e9ba0d
		NEWLINE, "Override chassis ID",
Packit e9ba0d
		NULL, cmd_system_chassisid, "system");
Packit e9ba0d
	commands_new(
Packit e9ba0d
		commands_new(unconfigure_system,
Packit e9ba0d
		    "chassisid", "Don't override chassis ID",
Packit e9ba0d
		    NULL, NULL, NULL),
Packit e9ba0d
		NEWLINE, "Don't override chassis ID",
Packit e9ba0d
		NULL, cmd_system_chassisid, "system");
Packit e9ba0d
Packit e9ba0d
	commands_new(
Packit e9ba0d
		commands_new(
Packit e9ba0d
			commands_new(configure_system,
Packit e9ba0d
			    "platform", "Override platform description",
Packit e9ba0d
			    NULL, NULL, NULL),
Packit e9ba0d
			NULL, "Platform description (CDP)",
Packit e9ba0d
			NULL, cmd_store_env_value, "platform"),
Packit e9ba0d
		NEWLINE, "Override platform description",
Packit e9ba0d
		NULL, cmd_system_description, "platform");
Packit e9ba0d
	commands_new(
Packit e9ba0d
		commands_new(unconfigure_system,
Packit e9ba0d
		    "platform", "Don't override platform description",
Packit e9ba0d
		    NULL, NULL, NULL),
Packit e9ba0d
		NEWLINE, "Don't override platform description",
Packit e9ba0d
		NULL, cmd_system_description, "platform");
Packit e9ba0d
Packit e9ba0d
	commands_new(
Packit e9ba0d
		commands_new(
Packit e9ba0d
			commands_new(configure_system,
Packit e9ba0d
			    "hostname", "Override system name",
Packit e9ba0d
			    NULL, NULL, NULL),
Packit e9ba0d
			NULL, "System name",
Packit e9ba0d
			NULL, cmd_store_env_value, "hostname"),
Packit e9ba0d
		NEWLINE, "Override system name",
Packit e9ba0d
		NULL, cmd_hostname, NULL);
Packit e9ba0d
	commands_new(
Packit e9ba0d
		commands_new(unconfigure_system,
Packit e9ba0d
		    "hostname", "Don't override system name",
Packit e9ba0d
		    NULL, NULL, NULL),
Packit e9ba0d
		NEWLINE, "Don't override system name",
Packit e9ba0d
		NULL, cmd_hostname, NULL);
Packit e9ba0d
Packit e9ba0d
	commands_new(
Packit e9ba0d
		commands_new(
Packit e9ba0d
			commands_new(
Packit e9ba0d
				commands_new(
Packit e9ba0d
					commands_new(configure_system,
Packit e9ba0d
					    "ip", "IP related options",
Packit e9ba0d
					    NULL, NULL, NULL),
Packit e9ba0d
					"management", "IP management related options",
Packit e9ba0d
					NULL, NULL, NULL),
Packit e9ba0d
				"pattern", "Set IP management pattern",
Packit e9ba0d
				NULL, NULL, NULL),
Packit e9ba0d
			NULL, "IP management pattern (comma-separated list of wildcards)",
Packit e9ba0d
			NULL, cmd_store_env_value, "management-pattern"),
Packit e9ba0d
		NEWLINE, "Set IP management pattern",
Packit e9ba0d
		NULL, cmd_management, NULL);
Packit e9ba0d
	commands_new(
Packit e9ba0d
		commands_new(
Packit e9ba0d
			commands_new(
Packit e9ba0d
				commands_new(unconfigure_system,
Packit e9ba0d
				    "ip", "IP related options",
Packit e9ba0d
				    NULL, NULL, NULL),
Packit e9ba0d
				"management", "IP management related options",
Packit e9ba0d
				NULL, NULL, NULL),
Packit e9ba0d
			"pattern", "Delete any IP management pattern",
Packit e9ba0d
			NULL, NULL, NULL),
Packit e9ba0d
		NEWLINE, "Delete any IP management pattern",
Packit e9ba0d
		NULL, cmd_management, NULL);
Packit e9ba0d
Packit e9ba0d
        commands_new(
Packit e9ba0d
		commands_new(
Packit e9ba0d
			commands_new(configure_interface,
Packit e9ba0d
			    "pattern", "Set active interface pattern",
Packit e9ba0d
			    NULL, NULL, NULL),
Packit e9ba0d
			NULL, "Interface pattern (comma-separated list of wildcards)",
Packit e9ba0d
			NULL, cmd_store_env_value, "iface-pattern"),
Packit e9ba0d
		NEWLINE, "Set active interface pattern",
Packit e9ba0d
		NULL, cmd_iface_pattern, NULL);
Packit e9ba0d
        commands_new(
Packit e9ba0d
		commands_new(unconfigure_interface,
Packit e9ba0d
		    "pattern", "Delete any interface pattern",
Packit e9ba0d
		    NULL, NULL, NULL),
Packit e9ba0d
		NEWLINE, "Clear interface pattern",
Packit e9ba0d
		NULL, cmd_iface_pattern, NULL);
Packit e9ba0d
Packit e9ba0d
        commands_new(
Packit e9ba0d
		commands_new(
Packit e9ba0d
			commands_new(configure_interface,
Packit e9ba0d
			    "permanent", "Set permanent interface pattern",
Packit e9ba0d
			    NULL, NULL, NULL),
Packit e9ba0d
			NULL, "Permanent interface pattern (comma-separated list of wildcards)",
Packit e9ba0d
			NULL, cmd_store_env_value, "iface-pattern"),
Packit e9ba0d
		NEWLINE, "Set permanent interface pattern",
Packit e9ba0d
		NULL, cmd_perm_iface_pattern, NULL);
Packit e9ba0d
        commands_new(
Packit e9ba0d
		commands_new(unconfigure_interface,
Packit e9ba0d
		    "permanent", "Clear permanent interface pattern",
Packit e9ba0d
		    NULL, NULL, NULL),
Packit e9ba0d
		NEWLINE, "Delete any interface pattern",
Packit e9ba0d
		NULL, cmd_perm_iface_pattern, NULL);
Packit e9ba0d
Packit e9ba0d
	commands_new(
Packit e9ba0d
		commands_new(configure_interface,
Packit e9ba0d
		    "description", "Update interface descriptions with neighbor name",
Packit e9ba0d
		    NULL, NULL, NULL),
Packit e9ba0d
		NEWLINE, "Update interface descriptions with neighbor name",
Packit e9ba0d
		NULL, cmd_update_descriptions, "enable");
Packit e9ba0d
	commands_new(
Packit e9ba0d
		commands_new(unconfigure_interface,
Packit e9ba0d
		    "description", "Don't update interface descriptions with neighbor name",
Packit e9ba0d
		    NULL, NULL, NULL),
Packit e9ba0d
		NEWLINE, "Don't update interface descriptions with neighbor name",
Packit e9ba0d
		NULL, cmd_update_descriptions, NULL);
Packit e9ba0d
Packit e9ba0d
	commands_new(
Packit e9ba0d
		commands_new(configure_interface,
Packit e9ba0d
		    "promiscuous", "Enable promiscuous mode on managed interfaces",
Packit e9ba0d
		    NULL, NULL, NULL),
Packit e9ba0d
		NEWLINE, "Enable promiscuous mode on managed interfaces",
Packit e9ba0d
		NULL, cmd_iface_promisc, "enable");
Packit e9ba0d
	commands_new(
Packit e9ba0d
		commands_new(unconfigure_interface,
Packit e9ba0d
		    "promiscuous", "Don't enable promiscuous mode on managed interfaces",
Packit e9ba0d
		    NULL, NULL, NULL),
Packit e9ba0d
		NEWLINE, "Don't enable promiscuous mode on managed interfaces",
Packit e9ba0d
		NULL, cmd_iface_promisc, NULL);
Packit e9ba0d
Packit e9ba0d
	register_commands_srcmac_type(configure_system);
Packit e9ba0d
}
Packit e9ba0d