1. 程式人生 > >Zebra-VTYSH原始碼分析和改造(三):新增定製命令

Zebra-VTYSH原始碼分析和改造(三):新增定製命令

 

一 檢視介紹

由上面幾篇文章分析可見,所有的命令都是包含在node中的,根據Cisco或者H3常見路由器或者交換機的CLI格式可見,一個node就對應著一個檢視(View)。常用的檢視包括:普通檢視,管理檢視,檔案系統檢視,配置檢視,以及介面配置檢視和VLAN檢視等。

在Zebra-VTYSH原始碼中,實現了的有Enable檢視和配置檢視。如下圖所示:

/ # vtysh 

Copyright 2010-2011 IBM Co., Ltd.

CLI> enable 
CLI# 
  clear        Reset functions
  configure    Configuration from vty interface
  copy         Copy from one file to another
  debug        Debugging functions (see also 'undebug')
  disable      Turn off privileged mode command
  end          End current mode and down to previous mode
  exit         Exit current mode and down to previous mode
  list         Print command list
  no           Negate a command or set its defaults
  ping         send echo messages
  quit         Exit current mode and down to previous mode
  show         Show running system information
  start-shell  Start UNIX shell
  telnet       Open a telnet connection
  terminal     Set terminal line parameters
  traceroute   Trace route to destination
  undebug      Disable debugging functions (see also 'debug')
  write        Write running configuration to memory, network, or terminal
CLI# configure terminal 
CLI(config)# 
  access-list    Add an access list entry
  bgp            BGP information
  debug          Debugging functions (see also 'undebug')
  device-config  Device configuration
  dump           Dump packet
  enable         Modify enable password parameters
  end            End current mode and down to previous mode
  exit           Exit current mode and down to previous mode
  hostname       Set system's network name
  interface      Select an interface to configure
  ip             IP information
  ipv6           IPv6 information
  key            Authentication key management
  list           Print command list
  log            Logging control
  no             Negate a command or set its defaults
  password       Assign the terminal connection password
  route-map      Create route-map or enter route-map command mode
  router         Enable a routing process
  system-config  System and management configuration
  username
  write          Write running configuration to memory, network, or terminal
CLI(config)# system-config 
CLI(config-system)# 
  access                   Set CPE access ND flag
  admin-idle-time          Set system idle time
  admin-psw                Set system administrator password
  admin-username           Set system administrator username
  connection-mode          Set network connection mode : static and dynamic
  datetime                 Set date time (format:2000-01-01 00:00:00)
  default-gateway          Set system's network default gateway
  dns-server-1             Set system network DNS server 1
  dns-server-2             Set system network DNS server 2
  exit                     Exit current mode and down to previous mode
  factory-defaults         Restore ALL configure to factory default values( 0: reset all 1: reset with network parameters unchanged)
  hostname                 Set system's network name
  image-upgrade            Upgrade image via ftp method
  ip                       Set system ip address and netmask
  list                     Print command list
  managment-ip-range       Set management IP range and netmask
  managment-ip-range-flag  Set management IP range service flag
  mgr-vlan-id              Set management VLAN ID
  ntpserver                Set NTP server
  quit                     Exit current mode and down to previous mode
  reset                    Reset system
  snmp-refresh-time        Set SNMP service refresh time cycle
  snmp-rwcommunicty        Set SNMP read/write community
  snmp-service             Set SNMP service enable or disable
  snmp-trap-ip1            Set SNMP trap ip 1 address
  snmp-trap-ip2            Set SNMP trap ip 2 address
  snmp-trap1-ip-flag       Set SNMP trap ip 1 service flag(enable/disable)
  snmp-trap2-ip-flag       Set SNMP trap ip 2 service flag(enable/disable)
  ssh                      Set ssh service port and timeout values
  ssh-service              Set ssh service flag
  telnet                   Set telnet PORT
  telnet-service           Set telnet service flag
  timesync                 Set time sync service flag
  timezone                 Set time zone (0:ShangHai,1:ChongQing)
CLI(config-system)# quit
CLI(config)# device-config 
CLI(config-device)# 
  exit                       Exit current mode and down to previous mode
  list                       Print command list
  port-mirror-analysis-port  Device configuration: Set analysis port(1: eth1 2: eth2)
  port-mirror-flag           Device configuration: Enable or disable port mirror service(0:disable,1:enable)
  port-mirror-packet         Device configuration: Set packet type to be mirrored(1:Import & Export 2: Import 3: Export)
  port-mirror-port           Device configuration:Set port to be mirrored
  port1-rate                 Device configuration: set duplex mode and import/export/broadcast/unkown/multicast rate limit.
  port2-rate                 Device configuration: set duplex mode and import/export/broadcast/unkown/multicast rate limit.
  quit                       Exit current mode and down to previous mode
CLI(config-device)# 
CLI(config-device)#

如果想要新增自己的命令,可以在原有的檢視上增加(也就是在原有的node中增加commands),或者新開自己的檢視,然後在新檢視中新增自己的commands。

二 新增命令

進入vtysh目錄中,檢視vtysh_main.c檔案的main函式,也就是和vtysh初始化相關的一切都在這裡,基本上在這裡可以完成你需要的一些基本命令。

在函式vtysh_init_vty()中,有個

/* Initialize command interface. Install basic nodes and commands. */
Void cmd_init (int terminal)

的函式,就是負責初始化command介面,安裝node和命令的。

比如你就可以新增自己的檢視如下:

/*Added by xyang*/
	install_element (CONFIG_NODE, &vtysh_sysconfig_cmd);
	install_element (CONFIG_NODE, &vtysh_devconfig_cmd);

(其中,安裝的system和device配置的檢視)

/*Added by xyang
* system config node*
*/
DEFUN (system_config,
       vtysh_sysconfig_cmd,
       "system-config",
       SYS_CFG_STR
       "\n")
{  
  //vty_out (vty, "testing by xyang.%s", VTY_NEWLINE);

   vty->node = SYSCONFIG_NODE;

  return CMD_SUCCESS;
}
DEFUN (device_config,
       vtysh_devconfig_cmd,
       "device-config",
       DEV_CFG_STR
       "\n")
{  
  
  //vty_out (vty, "testing by xyang.%s", VTY_NEWLINE);

   vty->node = DEVCONFIG_NODE;

  return CMD_SUCCESS;
}
DEFUN定義為:
/* DEFUN for vty command interafce. Little bit hacky ;-). */
#define DEFUN(funcname, cmdname, cmdstr, helpstr) \
  int funcname (struct cmd_element *, struct vty *, int, char **); \
  struct cmd_element cmdname = \
  { \
    cmdstr, \
    funcname, \
    helpstr \
  }; \
  int funcname \
  (struct cmd_element *self, struct vty *vty, int argc, char **argv)

SYSCONFIG_NODE和DEVCONFIG_NODE要新增進enum node_type{}中去。

最後就要在init_cmd的最後加進自己的command了

比如

/*add commands to system config node
  * added by xyang @ 2012-02-01*
  */
  	/*management network settings*/	
  
	install_element (SYSCONFIG_NODE, &vtysh_system_cfg_ip_cmd);//ip and subnet mask

其中,函式指標需要定義先:

DEFUN (vtysh_system_cfg_ip,
	 vtysh_system_cfg_ip_cmd,
	 "ip ADDRESS NETMASK",
	 "Set system ip address and netmask\n")
{
	applyCfg(argv[0],"IPADDR");
	applyCfg(argv[1],"NETMASK");
	system(NETWORK_SETTING_SCRIPT);	
	return CMD_SUCCESS;
}

這樣,基本上完成了新增node和命令的任務了。

其他Zebra-VTYH自帶的命令如果不想要的話刪除掉就行了。

(總完)