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.

340 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>&copy; 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;
} 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 ****************/