You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
342 lines
13 KiB
C
342 lines
13 KiB
C
/******************************************************************************
|
|
* file include/cmd.h
|
|
* author YuLiang
|
|
* version 1.0.0
|
|
* date 09-Oct-2021
|
|
* brief This file provides all the headers of the command functions.
|
|
|
|
******************************************************************************
|
|
* Attention
|
|
*
|
|
* <h2><center>© COPYRIGHT(c) 2021 LandPower</center></h2>
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without modification,
|
|
* are permitted provided that the following conditions are met:
|
|
* 1. Redistributions of source code must retain the above copyright notice,
|
|
* this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
* this list of conditions and the following disclaimer in the documentation
|
|
* and/or other materials provided with the distribution.
|
|
* 3. Neither the name of LandPower nor the names of its contributors may be used to
|
|
* endorse or promote products derived from this software without specific
|
|
* prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
******************************************************************************/
|
|
|
|
#ifndef _CMD_H_
|
|
#define _CMD_H_
|
|
|
|
/* Includes ------------------------------------------------------------------*/
|
|
#include "array.h"
|
|
#include "vty.h"
|
|
|
|
/* Define --------------------------------------------------------------------*/
|
|
/* 命令行最大参数个数. */
|
|
#define CMD_ARGC_MAX 16
|
|
|
|
/* rang检查数字最大位数. */
|
|
#define DECIMAL_STRLEN_MAX 10
|
|
#define INIT_MATCHARR_SIZE 10
|
|
#define COMPLETE_BUF_SIZE 256
|
|
|
|
#define IPV6_ADDR_STR "0123456789abcdefABCDEF:.%"
|
|
#define IPV6_PREFIX_STR "0123456789abcdefABCDEF:.%/"
|
|
#define STATE_START 1
|
|
#define STATE_COLON 2
|
|
#define STATE_DOUBLE 3
|
|
#define STATE_ADDR 4
|
|
#define STATE_DOT 5
|
|
#define STATE_SLASH 6
|
|
#define STATE_MASK 7
|
|
|
|
/* 命令行返回值. */
|
|
#define CMD_SUCCESS 0
|
|
#define CMD_WARNING 1
|
|
#define CMD_ERR_NO_MATCH 2
|
|
#define CMD_ERR_AMBIGUOUS 3
|
|
#define CMD_ERR_INCOMPLETE 4
|
|
#define CMD_ERR_EXEED_ARGC_MAX 5
|
|
#define CMD_ERR_NOTHING_TODO 6
|
|
#define CMD_COMPLETE_FULL_MATCH 7
|
|
#define CMD_COMPLETE_MATCH 8
|
|
#define CMD_COMPLETE_LIST_MATCH 9
|
|
#define CMD_SUCCESS_DAEMON 10
|
|
|
|
#define CONF_BACKUP_EXT ".sav"
|
|
|
|
#define CL_COPYRIGHT "Copyright 2017-2018 LandPower."
|
|
|
|
/* Common descriptions. */
|
|
#define SHOW_STR "Show running system information\n"
|
|
#define IP_STR "IP information\n"
|
|
#define IPV6_STR "IPv6 information\n"
|
|
#define NO_STR "Negate a command or set its defaults\n"
|
|
#define REDIST_STR "Redistribute information from another routing protocol\n"
|
|
#define CLEAR_STR "Reset functions\n"
|
|
#define RIP_STR "RIP information\n"
|
|
#define BGP_STR "BGP information\n"
|
|
#define OSPF_STR "OSPF information\n"
|
|
#define NEIGHBOR_STR "Specify neighbor router\n"
|
|
#define DEBUG_STR "Debugging functions (see also 'undebug')\n"
|
|
#define UNDEBUG_STR "Disable debugging functions (see also 'debug')\n"
|
|
#define ROUTER_STR "Enable a routing process\n"
|
|
#define AS_STR "AS number\n"
|
|
#define MBGP_STR "MBGP information\n"
|
|
#define MATCH_STR "Match values from routing table\n"
|
|
#define SET_STR "Set values in destination routing protocol\n"
|
|
#define OUT_STR "Filter outgoing routing updates\n"
|
|
#define IN_STR "Filter incoming routing updates\n"
|
|
#define V4NOTATION_STR "specify by IPv4 address notation(e.g. 0.0.0.0)\n"
|
|
#define OSPF6_NUMBER_STR "Specify by number\n"
|
|
#define INTERFACE_STR "Interface infomation\n"
|
|
#define IFNAME_STR "Interface name(e.g. ep0)\n"
|
|
#define IP6_STR "IPv6 Information\n"
|
|
#define OSPF6_STR "Open Shortest Path First (OSPF) for IPv6\n"
|
|
#define OSPF6_ROUTER_STR "Enable a routing process\n"
|
|
#define OSPF6_INSTANCE_STR "<1-65535> Instance ID\n"
|
|
#define SECONDS_STR "<1-65535> Seconds\n"
|
|
#define ROUTE_STR "Routing Table\n"
|
|
#define PREFIX_LIST_STR "Build a prefix list\n"
|
|
|
|
/* Some macroes */
|
|
#define CMD_OPTION(S) ('[' == (S[0]))
|
|
#define CMD_VARIABLE(S) (((S[0]) >= 'A' && (S[0]) <= 'Z') || ('<' == (S[0])))
|
|
#define CMD_VARARG(S) ('.' ==(S[0]))
|
|
#define CMD_RANGE(S) ('<' == (S[0]))
|
|
#define CMD_IPV4(S) (0 == strcmp((S), "A.B.C.D"))
|
|
#define CMD_IPV4_PREFIX(S) (0 == strcmp((S), "A.B.C.D/M"))
|
|
#define CMD_IPV6(S) (0 == strcmp((S), "X:X::X:X"))
|
|
#define CMD_IPV6_PREFIX(S) (0 == strcmp((S), "X:X::X:X/M"))
|
|
|
|
#define DEV_INFO_DEFAULT_IP "192.168.1.110"
|
|
#define DEV_INFO_DEFAULT_MASK "255.255.255.0"
|
|
#define DEV_INFO_DEFAULT_GW "192.168.1.1"
|
|
|
|
#define DEVICE_RUN_PATH "/home/gis"
|
|
#define SAVE_STA_CFG_BAK_FILE 1
|
|
#define SAVE_DEV_CFG_BAK_FILE 2
|
|
|
|
/* Exported types ------------------------------------------------------------*/
|
|
enum
|
|
{
|
|
CMD_ATTR_DEPRECATED = 1,
|
|
CMD_ATTR_HIDDEN,
|
|
};
|
|
|
|
/* 匹配结果类型. */
|
|
typedef enum
|
|
{
|
|
no_match,
|
|
extend_match,
|
|
ipv4_prefix_match,
|
|
ipv4_match,
|
|
ipv6_prefix_match,
|
|
ipv6_match,
|
|
range_match,
|
|
vararg_match,
|
|
partly_match,
|
|
exact_match
|
|
} MATCH_TYPE_E;
|
|
|
|
/* 用于定义命令的宏. */
|
|
#define CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attrs, dnum) \
|
|
cmd_element_t cmdname = \
|
|
{ \
|
|
.string = cmdstr, \
|
|
.func = funcname, \
|
|
.doc = helpstr, \
|
|
.attr = attrs, \
|
|
.daemon = dnum, \
|
|
};
|
|
|
|
#define CMD_FUNC_DECL(funcname) \
|
|
static int funcname(cmd_element_t *, vty_t *, int, const char *[]);
|
|
|
|
#define CMD_FUNC_TEXT(funcname) \
|
|
static int funcname \
|
|
(cmd_element_t *self __attribute__ ((unused)), \
|
|
vty_t *vty __attribute__ ((unused)), \
|
|
int argc __attribute__ ((unused)), \
|
|
const char *argv[] __attribute__ ((unused)))
|
|
|
|
/* CMD for vty command interafce. Little bit hacky ;-). */
|
|
#define CMD(funcname, cmdname, cmdstr, helpstr) \
|
|
CMD_FUNC_DECL(funcname) \
|
|
CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, 0) \
|
|
CMD_FUNC_TEXT(funcname)
|
|
|
|
#define CMD_ATTR(funcname, cmdname, cmdstr, helpstr, attr) \
|
|
CMD_FUNC_DECL(funcname) \
|
|
CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, 0) \
|
|
CMD_FUNC_TEXT(funcname)
|
|
|
|
#define CMD_HIDDEN(funcname, cmdname, cmdstr, helpstr) \
|
|
CMD_ATTR(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN)
|
|
|
|
#define CMD_DEPRECATED(funcname, cmdname, cmdstr, helpstr) \
|
|
CMD_ATTR(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_DEPRECATED) \
|
|
|
|
/* ALIAS macro which define existing command's alias. */
|
|
#define ALIAS(funcname, cmdname, cmdstr, helpstr) \
|
|
CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, 0)
|
|
|
|
#define ALIAS_ATTR(funcname, cmdname, cmdstr, helpstr, attr) \
|
|
CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, 0)
|
|
|
|
#define ALIAS_HIDDEN(funcname, cmdname, cmdstr, helpstr) \
|
|
CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN, 0)
|
|
|
|
#define ALIAS_DEPRECATED(funcname, cmdname, cmdstr, helpstr) \
|
|
CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_DEPRECATED, 0)
|
|
|
|
/* 命令行模式节点宏 */
|
|
typedef enum
|
|
{
|
|
USERNAME_NODE, /* Username node. Default mode of vty interface. */
|
|
PASSWORD_NODE, /* Password node. */
|
|
ENABLE_NODE, /* Enable node. */
|
|
CONFIG_NODE, /* Config node. Default mode of config file. */
|
|
PORT_NODE, /* Port node. */
|
|
COMMON_NODE, /* Common node. Cmd is common to other node. */
|
|
NODES_COUNT
|
|
} NODE_TYPE_E;
|
|
|
|
/* config节点配置优先级 */
|
|
typedef enum
|
|
{
|
|
CONFIG_PRI_CSG = 0,
|
|
CONFIG_PRI_DAU,
|
|
CONFIG_PRI_PD,
|
|
CONFIG_PRI_COUNT
|
|
} CONFIG_PRI_E;
|
|
|
|
/* Host configuration variable */
|
|
typedef struct
|
|
{
|
|
uint32_t id_minor; /* 设备id */
|
|
uint16_t id_major; /* 设备型号代码. */
|
|
uint8_t mac[MAC_ADDR_LEN]; /* System mac. */
|
|
char host_ip[INET_ADDRSTRLEN]; /* host ip string. */
|
|
char host_mask[INET_ADDRSTRLEN];/* host mask string. */
|
|
char host_gw[INET_ADDRSTRLEN]; /* host gw string. */
|
|
uint32_t factory_date; /* 出厂日期. */
|
|
uint32_t deployment_date; /* 部署日期. */
|
|
char dev_type[FILE_NAME_LEN]; /* 设备型号字符串. */
|
|
} device_info_t;
|
|
|
|
/* Host configuration variable */
|
|
typedef struct
|
|
{
|
|
char name[FILE_NAME_LEN]; /* Host name of this router. */
|
|
int lines; /* System wide terminal lines. */
|
|
char *version; /* 版本号. */
|
|
char *compile; /* 编译时间. */
|
|
char configfile[FILE_NAME_LEN]; /* config file name of this host */
|
|
char bannerfile[FILE_NAME_LEN]; /* Banner configuration file name. */
|
|
} host_t;
|
|
|
|
/* Structure of command element. */
|
|
typedef struct _cmd_element
|
|
{
|
|
const char *string; /* Command specification by string */
|
|
const char *doc; /* Documentation of this command */
|
|
array_t *strs; /* Pointing out each description array */
|
|
unsigned int str_size; /* Command index count */
|
|
int (*func)(struct _cmd_element*, vty_t*, int, const char *[]);
|
|
int daemon; /* Daemon to which this command belong */
|
|
char *config; /* Configuration string */
|
|
array_t *sub_cfg; /* Sub configuration string */
|
|
unsigned char attr; /* Command attributes */
|
|
} cmd_element_t;
|
|
|
|
/* Command description structure. */
|
|
typedef struct
|
|
{
|
|
char *cmd; /* Command string. */
|
|
char *str; /* Command's description. */
|
|
} desc_t;
|
|
|
|
/* 用于命令行模式节点注册配置保存函数 */
|
|
typedef int cmd_save_config_f(vty_t*);
|
|
|
|
/* 命令行模式节点结构体 */
|
|
typedef struct
|
|
{
|
|
uint32_t node; /* Node index. */
|
|
uint32_t up_node; /* Upper level node index. */
|
|
uint8_t param_num; /* Prompt param num. */
|
|
char *prompt; /* Prompt character at vty interface. */
|
|
cmd_save_config_f *func; /* Node's configuration write function */
|
|
array_t *cmds; /* Array of this node's command list. */
|
|
array_t *configs; /* 配置函数数组. */
|
|
} cmd_node_t;
|
|
|
|
typedef struct
|
|
{
|
|
uint32_t node; /* Node index. */
|
|
uint32_t param_num; /* Prompt param num. */
|
|
char cmd[504]; /* 结构体正好是 512byte. */
|
|
} vtycmd_head_t;
|
|
|
|
typedef struct
|
|
{
|
|
vtycmd_head_t buf_read;
|
|
vtycmd_head_t buf_write;
|
|
int socket;
|
|
pthread_mutex_t wr_mutex; /* buf of mutex*/
|
|
pthread_mutex_t rd_mutex; /* buf of mutex*/
|
|
} vtycmd_t;
|
|
|
|
|
|
/* Exported macro ------------------------------------------------------------*/
|
|
|
|
/* Extern global variables ---------------------------------------------------*/
|
|
extern host_t host;
|
|
extern device_info_t device_info;
|
|
extern array_t *cmd_nodes;
|
|
extern int8_t is_system_init;
|
|
|
|
/* Extern functions ----------------------------------------------------------*/
|
|
static inline cmd_node_t *cmd_node_get(NODE_TYPE_E ntype)
|
|
{
|
|
return (cmd_node_t *)array_lookup(cmd_nodes, ntype);
|
|
}
|
|
|
|
extern void cmd_init(void);
|
|
extern int32_t cmd_execute(vty_t *vty);
|
|
extern const char *cmd_prompt(NODE_TYPE_E ntype);
|
|
extern array_t *cmd_strs_create(const char *string);
|
|
extern void cmd_strs_free(array_t *a);
|
|
extern void cmd_sort_node(void);
|
|
extern void cmd_install_node(cmd_node_t *node, cmd_save_config_f *func);
|
|
extern array_t *cmd_describe_command (array_t *cmd_line, vty_t *vty, int32_t *status);
|
|
extern char **cmd_complete_command(array_t *vline, vty_t *vty, int32_t *status);
|
|
extern void cmd_install_element(NODE_TYPE_E ntype, cmd_element_t *cmd);
|
|
extern int32_t cmd_config_node_config_register(int32_t pri, cmd_save_config_f *func);
|
|
extern void vtysh_init(void);
|
|
extern char *vtysh_prompt (void);
|
|
extern int vtysh_rl_question(void);
|
|
extern int vtysh_rl_completion(void);
|
|
extern char *vtysh_completion_entry_function(const char *ignore, int invoking_key);
|
|
extern void vtysh_config_recovery(void);
|
|
extern void vtysh_device_save(void);
|
|
extern void vtysh_eth0_save(void);
|
|
extern int32_t vtysh_config_save(void);
|
|
extern int32_t vtysh_host_addr_set(char *addr, char *mask);
|
|
extern int32_t vtysh_gateway_set(char *gateway);
|
|
extern void vtysh_shell_init(void);
|
|
|
|
#endif
|
|
/************************ (C) COPYRIGHT LandPower ***** END OF FILE ****************/
|