Annotation of embedaddon/quagga/vtysh/vtysh.c, revision 1.1
1.1 ! misho 1: /* Virtual terminal interface shell.
! 2: * Copyright (C) 2000 Kunihiro Ishiguro
! 3: *
! 4: * This file is part of GNU Zebra.
! 5: *
! 6: * GNU Zebra is free software; you can redistribute it and/or modify it
! 7: * under the terms of the GNU General Public License as published by the
! 8: * Free Software Foundation; either version 2, or (at your option) any
! 9: * later version.
! 10: *
! 11: * GNU Zebra is distributed in the hope that it will be useful, but
! 12: * WITHOUT ANY WARRANTY; without even the implied warranty of
! 13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
! 14: * General Public License for more details.
! 15: *
! 16: * You should have received a copy of the GNU General Public License
! 17: * along with GNU Zebra; see the file COPYING. If not, write to the Free
! 18: * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
! 19: * 02111-1307, USA.
! 20: */
! 21:
! 22: #include <zebra.h>
! 23:
! 24: #include <sys/un.h>
! 25: #include <setjmp.h>
! 26: #include <sys/wait.h>
! 27: #include <sys/resource.h>
! 28: #include <sys/stat.h>
! 29:
! 30: #include <readline/readline.h>
! 31: #include <readline/history.h>
! 32:
! 33: #include "command.h"
! 34: #include "memory.h"
! 35: #include "vtysh/vtysh.h"
! 36: #include "log.h"
! 37: #include "bgpd/bgp_vty.h"
! 38:
! 39: /* Struct VTY. */
! 40: struct vty *vty;
! 41:
! 42: /* VTY shell pager name. */
! 43: char *vtysh_pager_name = NULL;
! 44:
! 45: /* VTY shell client structure. */
! 46: struct vtysh_client
! 47: {
! 48: int fd;
! 49: const char *name;
! 50: int flag;
! 51: const char *path;
! 52: } vtysh_client[] =
! 53: {
! 54: { .fd = -1, .name = "zebra", .flag = VTYSH_ZEBRA, .path = ZEBRA_VTYSH_PATH},
! 55: { .fd = -1, .name = "ripd", .flag = VTYSH_RIPD, .path = RIP_VTYSH_PATH},
! 56: { .fd = -1, .name = "ripngd", .flag = VTYSH_RIPNGD, .path = RIPNG_VTYSH_PATH},
! 57: { .fd = -1, .name = "ospfd", .flag = VTYSH_OSPFD, .path = OSPF_VTYSH_PATH},
! 58: { .fd = -1, .name = "ospf6d", .flag = VTYSH_OSPF6D, .path = OSPF6_VTYSH_PATH},
! 59: { .fd = -1, .name = "bgpd", .flag = VTYSH_BGPD, .path = BGP_VTYSH_PATH},
! 60: { .fd = -1, .name = "isisd", .flag = VTYSH_ISISD, .path = ISIS_VTYSH_PATH},
! 61: };
! 62:
! 63: #define VTYSH_INDEX_MAX (sizeof(vtysh_client)/sizeof(vtysh_client[0]))
! 64:
! 65: /* We need direct access to ripd to implement vtysh_exit_ripd_only. */
! 66: static struct vtysh_client *ripd_client = NULL;
! 67:
! 68:
! 69: /* Using integrated config from Quagga.conf. Default is no. */
! 70: int vtysh_writeconfig_integrated = 0;
! 71:
! 72: extern char config_default[];
! 73:
! 74: static void
! 75: vclient_close (struct vtysh_client *vclient)
! 76: {
! 77: if (vclient->fd >= 0)
! 78: {
! 79: fprintf(stderr,
! 80: "Warning: closing connection to %s because of an I/O error!\n",
! 81: vclient->name);
! 82: close (vclient->fd);
! 83: vclient->fd = -1;
! 84: }
! 85: }
! 86:
! 87: /* Following filled with debug code to trace a problematic condition
! 88: * under load - it SHOULD handle it. */
! 89: #define ERR_WHERE_STRING "vtysh(): vtysh_client_config(): "
! 90: static int
! 91: vtysh_client_config (struct vtysh_client *vclient, char *line)
! 92: {
! 93: int ret;
! 94: char *buf;
! 95: size_t bufsz;
! 96: char *pbuf;
! 97: size_t left;
! 98: char *eoln;
! 99: int nbytes;
! 100: int i;
! 101: int readln;
! 102:
! 103: if (vclient->fd < 0)
! 104: return CMD_SUCCESS;
! 105:
! 106: ret = write (vclient->fd, line, strlen (line) + 1);
! 107: if (ret <= 0)
! 108: {
! 109: vclient_close (vclient);
! 110: return CMD_SUCCESS;
! 111: }
! 112:
! 113: /* Allow enough room for buffer to read more than a few pages from socket. */
! 114: bufsz = 5 * getpagesize() + 1;
! 115: buf = XMALLOC(MTYPE_TMP, bufsz);
! 116: memset(buf, 0, bufsz);
! 117: pbuf = buf;
! 118:
! 119: while (1)
! 120: {
! 121: if (pbuf >= ((buf + bufsz) -1))
! 122: {
! 123: fprintf (stderr, ERR_WHERE_STRING \
! 124: "warning - pbuf beyond buffer end.\n");
! 125: return CMD_WARNING;
! 126: }
! 127:
! 128: readln = (buf + bufsz) - pbuf - 1;
! 129: nbytes = read (vclient->fd, pbuf, readln);
! 130:
! 131: if (nbytes <= 0)
! 132: {
! 133:
! 134: if (errno == EINTR)
! 135: continue;
! 136:
! 137: fprintf(stderr, ERR_WHERE_STRING "(%u)", errno);
! 138: perror("");
! 139:
! 140: if (errno == EAGAIN || errno == EIO)
! 141: continue;
! 142:
! 143: vclient_close (vclient);
! 144: XFREE(MTYPE_TMP, buf);
! 145: return CMD_SUCCESS;
! 146: }
! 147:
! 148: pbuf[nbytes] = '\0';
! 149:
! 150: if (nbytes >= 4)
! 151: {
! 152: i = nbytes - 4;
! 153: if (pbuf[i] == '\0' && pbuf[i + 1] == '\0' && pbuf[i + 2] == '\0')
! 154: {
! 155: ret = pbuf[i + 3];
! 156: break;
! 157: }
! 158: }
! 159: pbuf += nbytes;
! 160:
! 161: /* See if a line exists in buffer, if so parse and consume it, and
! 162: * reset read position. */
! 163: if ((eoln = strrchr(buf, '\n')) == NULL)
! 164: continue;
! 165:
! 166: if (eoln >= ((buf + bufsz) - 1))
! 167: {
! 168: fprintf (stderr, ERR_WHERE_STRING \
! 169: "warning - eoln beyond buffer end.\n");
! 170: }
! 171: vtysh_config_parse(buf);
! 172:
! 173: eoln++;
! 174: left = (size_t)(buf + bufsz - eoln);
! 175: memmove(buf, eoln, left);
! 176: buf[bufsz-1] = '\0';
! 177: pbuf = buf + strlen(buf);
! 178: }
! 179:
! 180: /* Parse anything left in the buffer. */
! 181:
! 182: vtysh_config_parse (buf);
! 183:
! 184: XFREE(MTYPE_TMP, buf);
! 185: return ret;
! 186: }
! 187:
! 188: static int
! 189: vtysh_client_execute (struct vtysh_client *vclient, const char *line, FILE *fp)
! 190: {
! 191: int ret;
! 192: char buf[1001];
! 193: int nbytes;
! 194: int i;
! 195: int numnulls = 0;
! 196:
! 197: if (vclient->fd < 0)
! 198: return CMD_SUCCESS;
! 199:
! 200: ret = write (vclient->fd, line, strlen (line) + 1);
! 201: if (ret <= 0)
! 202: {
! 203: vclient_close (vclient);
! 204: return CMD_SUCCESS;
! 205: }
! 206:
! 207: while (1)
! 208: {
! 209: nbytes = read (vclient->fd, buf, sizeof(buf)-1);
! 210:
! 211: if (nbytes <= 0 && errno != EINTR)
! 212: {
! 213: vclient_close (vclient);
! 214: return CMD_SUCCESS;
! 215: }
! 216:
! 217: if (nbytes > 0)
! 218: {
! 219: if ((numnulls == 3) && (nbytes == 1))
! 220: return buf[0];
! 221:
! 222: buf[nbytes] = '\0';
! 223: fputs (buf, fp);
! 224: fflush (fp);
! 225:
! 226: /* check for trailling \0\0\0<ret code>,
! 227: * even if split across reads
! 228: * (see lib/vty.c::vtysh_read)
! 229: */
! 230: if (nbytes >= 4)
! 231: {
! 232: i = nbytes-4;
! 233: numnulls = 0;
! 234: }
! 235: else
! 236: i = 0;
! 237:
! 238: while (i < nbytes && numnulls < 3)
! 239: {
! 240: if (buf[i++] == '\0')
! 241: numnulls++;
! 242: else
! 243: numnulls = 0;
! 244: }
! 245:
! 246: /* got 3 or more trailing NULs? */
! 247: if ((numnulls >= 3) && (i < nbytes))
! 248: return (buf[nbytes-1]);
! 249: }
! 250: }
! 251: }
! 252:
! 253: void
! 254: vtysh_exit_ripd_only (void)
! 255: {
! 256: if (ripd_client)
! 257: vtysh_client_execute (ripd_client, "exit", stdout);
! 258: }
! 259:
! 260:
! 261: void
! 262: vtysh_pager_init (void)
! 263: {
! 264: char *pager_defined;
! 265:
! 266: pager_defined = getenv ("VTYSH_PAGER");
! 267:
! 268: if (pager_defined)
! 269: vtysh_pager_name = strdup (pager_defined);
! 270: else
! 271: vtysh_pager_name = strdup ("more");
! 272: }
! 273:
! 274: /* Command execution over the vty interface. */
! 275: static int
! 276: vtysh_execute_func (const char *line, int pager)
! 277: {
! 278: int ret, cmd_stat;
! 279: u_int i;
! 280: vector vline;
! 281: struct cmd_element *cmd;
! 282: FILE *fp = NULL;
! 283: int closepager = 0;
! 284: int tried = 0;
! 285: int saved_ret, saved_node;
! 286:
! 287: /* Split readline string up into the vector. */
! 288: vline = cmd_make_strvec (line);
! 289:
! 290: if (vline == NULL)
! 291: return CMD_SUCCESS;
! 292:
! 293: saved_ret = ret = cmd_execute_command (vline, vty, &cmd, 1);
! 294: saved_node = vty->node;
! 295:
! 296: /* If command doesn't succeeded in current node, try to walk up in node tree.
! 297: * Changing vty->node is enough to try it just out without actual walkup in
! 298: * the vtysh. */
! 299: while (ret != CMD_SUCCESS && ret != CMD_SUCCESS_DAEMON && ret != CMD_WARNING
! 300: && vty->node > CONFIG_NODE)
! 301: {
! 302: vty->node = node_parent(vty->node);
! 303: ret = cmd_execute_command (vline, vty, &cmd, 1);
! 304: tried++;
! 305: }
! 306:
! 307: vty->node = saved_node;
! 308:
! 309: /* If command succeeded in any other node than current (tried > 0) we have
! 310: * to move into node in the vtysh where it succeeded. */
! 311: if (ret == CMD_SUCCESS || ret == CMD_SUCCESS_DAEMON || ret == CMD_WARNING)
! 312: {
! 313: if ((saved_node == BGP_VPNV4_NODE || saved_node == BGP_IPV4_NODE
! 314: || saved_node == BGP_IPV6_NODE || saved_node == BGP_IPV4M_NODE
! 315: || saved_node == BGP_IPV6M_NODE)
! 316: && (tried == 1))
! 317: {
! 318: vtysh_execute("exit-address-family");
! 319: }
! 320: else if ((saved_node == KEYCHAIN_KEY_NODE) && (tried == 1))
! 321: {
! 322: vtysh_execute("exit");
! 323: }
! 324: else if (tried)
! 325: {
! 326: vtysh_execute ("end");
! 327: vtysh_execute ("configure terminal");
! 328: }
! 329: }
! 330: /* If command didn't succeed in any node, continue with return value from
! 331: * first try. */
! 332: else if (tried)
! 333: {
! 334: ret = saved_ret;
! 335: }
! 336:
! 337: cmd_free_strvec (vline);
! 338:
! 339: cmd_stat = ret;
! 340: switch (ret)
! 341: {
! 342: case CMD_WARNING:
! 343: if (vty->type == VTY_FILE)
! 344: fprintf (stdout,"Warning...\n");
! 345: break;
! 346: case CMD_ERR_AMBIGUOUS:
! 347: fprintf (stdout,"%% Ambiguous command.\n");
! 348: break;
! 349: case CMD_ERR_NO_MATCH:
! 350: fprintf (stdout,"%% Unknown command.\n");
! 351: break;
! 352: case CMD_ERR_INCOMPLETE:
! 353: fprintf (stdout,"%% Command incomplete.\n");
! 354: break;
! 355: case CMD_SUCCESS_DAEMON:
! 356: {
! 357: /* FIXME: Don't open pager for exit commands. popen() causes problems
! 358: * if exited from vtysh at all. This hack shouldn't cause any problem
! 359: * but is really ugly. */
! 360: if (pager && vtysh_pager_name && (strncmp(line, "exit", 4) != 0))
! 361: {
! 362: fp = popen (vtysh_pager_name, "w");
! 363: if (fp == NULL)
! 364: {
! 365: perror ("popen failed for pager");
! 366: fp = stdout;
! 367: }
! 368: else
! 369: closepager=1;
! 370: }
! 371: else
! 372: fp = stdout;
! 373:
! 374: if (! strcmp(cmd->string,"configure terminal"))
! 375: {
! 376: for (i = 0; i < VTYSH_INDEX_MAX; i++)
! 377: {
! 378: cmd_stat = vtysh_client_execute(&vtysh_client[i], line, fp);
! 379: if (cmd_stat == CMD_WARNING)
! 380: break;
! 381: }
! 382:
! 383: if (cmd_stat)
! 384: {
! 385: line = "end";
! 386: vline = cmd_make_strvec (line);
! 387:
! 388: if (vline == NULL)
! 389: {
! 390: if (pager && vtysh_pager_name && fp && closepager)
! 391: {
! 392: if (pclose (fp) == -1)
! 393: {
! 394: perror ("pclose failed for pager");
! 395: }
! 396: fp = NULL;
! 397: }
! 398: return CMD_SUCCESS;
! 399: }
! 400:
! 401: ret = cmd_execute_command (vline, vty, &cmd, 1);
! 402: cmd_free_strvec (vline);
! 403: if (ret != CMD_SUCCESS_DAEMON)
! 404: break;
! 405: }
! 406: else
! 407: if (cmd->func)
! 408: {
! 409: (*cmd->func) (cmd, vty, 0, NULL);
! 410: break;
! 411: }
! 412: }
! 413:
! 414: cmd_stat = CMD_SUCCESS;
! 415: for (i = 0; i < VTYSH_INDEX_MAX; i++)
! 416: {
! 417: if (cmd->daemon & vtysh_client[i].flag)
! 418: {
! 419: cmd_stat = vtysh_client_execute(&vtysh_client[i], line, fp);
! 420: if (cmd_stat != CMD_SUCCESS)
! 421: break;
! 422: }
! 423: }
! 424: if (cmd_stat != CMD_SUCCESS)
! 425: break;
! 426:
! 427: if (cmd->func)
! 428: (*cmd->func) (cmd, vty, 0, NULL);
! 429: }
! 430: }
! 431: if (pager && vtysh_pager_name && fp && closepager)
! 432: {
! 433: if (pclose (fp) == -1)
! 434: {
! 435: perror ("pclose failed for pager");
! 436: }
! 437: fp = NULL;
! 438: }
! 439: return cmd_stat;
! 440: }
! 441:
! 442: int
! 443: vtysh_execute_no_pager (const char *line)
! 444: {
! 445: return vtysh_execute_func (line, 0);
! 446: }
! 447:
! 448: int
! 449: vtysh_execute (const char *line)
! 450: {
! 451: return vtysh_execute_func (line, 1);
! 452: }
! 453:
! 454: /* Configration make from file. */
! 455: int
! 456: vtysh_config_from_file (struct vty *vty, FILE *fp)
! 457: {
! 458: int ret;
! 459: vector vline;
! 460: struct cmd_element *cmd;
! 461:
! 462: while (fgets (vty->buf, VTY_BUFSIZ, fp))
! 463: {
! 464: if (vty->buf[0] == '!' || vty->buf[1] == '#')
! 465: continue;
! 466:
! 467: vline = cmd_make_strvec (vty->buf);
! 468:
! 469: /* In case of comment line. */
! 470: if (vline == NULL)
! 471: continue;
! 472:
! 473: /* Execute configuration command : this is strict match. */
! 474: ret = cmd_execute_command_strict (vline, vty, &cmd);
! 475:
! 476: /* Try again with setting node to CONFIG_NODE. */
! 477: if (ret != CMD_SUCCESS
! 478: && ret != CMD_SUCCESS_DAEMON
! 479: && ret != CMD_WARNING)
! 480: {
! 481: if (vty->node == KEYCHAIN_KEY_NODE)
! 482: {
! 483: vty->node = KEYCHAIN_NODE;
! 484: vtysh_exit_ripd_only ();
! 485: ret = cmd_execute_command_strict (vline, vty, &cmd);
! 486:
! 487: if (ret != CMD_SUCCESS
! 488: && ret != CMD_SUCCESS_DAEMON
! 489: && ret != CMD_WARNING)
! 490: {
! 491: vtysh_exit_ripd_only ();
! 492: vty->node = CONFIG_NODE;
! 493: ret = cmd_execute_command_strict (vline, vty, &cmd);
! 494: }
! 495: }
! 496: else
! 497: {
! 498: vtysh_execute ("end");
! 499: vtysh_execute ("configure terminal");
! 500: vty->node = CONFIG_NODE;
! 501: ret = cmd_execute_command_strict (vline, vty, &cmd);
! 502: }
! 503: }
! 504:
! 505: cmd_free_strvec (vline);
! 506:
! 507: switch (ret)
! 508: {
! 509: case CMD_WARNING:
! 510: if (vty->type == VTY_FILE)
! 511: fprintf (stdout,"Warning...\n");
! 512: break;
! 513: case CMD_ERR_AMBIGUOUS:
! 514: fprintf (stdout,"%% Ambiguous command.\n");
! 515: break;
! 516: case CMD_ERR_NO_MATCH:
! 517: fprintf (stdout,"%% Unknown command: %s", vty->buf);
! 518: break;
! 519: case CMD_ERR_INCOMPLETE:
! 520: fprintf (stdout,"%% Command incomplete.\n");
! 521: break;
! 522: case CMD_SUCCESS_DAEMON:
! 523: {
! 524: u_int i;
! 525: int cmd_stat = CMD_SUCCESS;
! 526:
! 527: for (i = 0; i < VTYSH_INDEX_MAX; i++)
! 528: {
! 529: if (cmd->daemon & vtysh_client[i].flag)
! 530: {
! 531: cmd_stat = vtysh_client_execute (&vtysh_client[i],
! 532: vty->buf, stdout);
! 533: if (cmd_stat != CMD_SUCCESS)
! 534: break;
! 535: }
! 536: }
! 537: if (cmd_stat != CMD_SUCCESS)
! 538: break;
! 539:
! 540: if (cmd->func)
! 541: (*cmd->func) (cmd, vty, 0, NULL);
! 542: }
! 543: }
! 544: }
! 545: return CMD_SUCCESS;
! 546: }
! 547:
! 548: /* We don't care about the point of the cursor when '?' is typed. */
! 549: int
! 550: vtysh_rl_describe (void)
! 551: {
! 552: int ret;
! 553: unsigned int i;
! 554: vector vline;
! 555: vector describe;
! 556: int width;
! 557: struct desc *desc;
! 558:
! 559: vline = cmd_make_strvec (rl_line_buffer);
! 560:
! 561: /* In case of '> ?'. */
! 562: if (vline == NULL)
! 563: {
! 564: vline = vector_init (1);
! 565: vector_set (vline, '\0');
! 566: }
! 567: else
! 568: if (rl_end && isspace ((int) rl_line_buffer[rl_end - 1]))
! 569: vector_set (vline, '\0');
! 570:
! 571: describe = cmd_describe_command (vline, vty, &ret);
! 572:
! 573: fprintf (stdout,"\n");
! 574:
! 575: /* Ambiguous and no match error. */
! 576: switch (ret)
! 577: {
! 578: case CMD_ERR_AMBIGUOUS:
! 579: cmd_free_strvec (vline);
! 580: fprintf (stdout,"%% Ambiguous command.\n");
! 581: rl_on_new_line ();
! 582: return 0;
! 583: break;
! 584: case CMD_ERR_NO_MATCH:
! 585: cmd_free_strvec (vline);
! 586: fprintf (stdout,"%% There is no matched command.\n");
! 587: rl_on_new_line ();
! 588: return 0;
! 589: break;
! 590: }
! 591:
! 592: /* Get width of command string. */
! 593: width = 0;
! 594: for (i = 0; i < vector_active (describe); i++)
! 595: if ((desc = vector_slot (describe, i)) != NULL)
! 596: {
! 597: int len;
! 598:
! 599: if (desc->cmd[0] == '\0')
! 600: continue;
! 601:
! 602: len = strlen (desc->cmd);
! 603: if (desc->cmd[0] == '.')
! 604: len--;
! 605:
! 606: if (width < len)
! 607: width = len;
! 608: }
! 609:
! 610: for (i = 0; i < vector_active (describe); i++)
! 611: if ((desc = vector_slot (describe, i)) != NULL)
! 612: {
! 613: if (desc->cmd[0] == '\0')
! 614: continue;
! 615:
! 616: if (! desc->str)
! 617: fprintf (stdout," %-s\n",
! 618: desc->cmd[0] == '.' ? desc->cmd + 1 : desc->cmd);
! 619: else
! 620: fprintf (stdout," %-*s %s\n",
! 621: width,
! 622: desc->cmd[0] == '.' ? desc->cmd + 1 : desc->cmd,
! 623: desc->str);
! 624: }
! 625:
! 626: cmd_free_strvec (vline);
! 627: vector_free (describe);
! 628:
! 629: rl_on_new_line();
! 630:
! 631: return 0;
! 632: }
! 633:
! 634: /* Result of cmd_complete_command() call will be stored here
! 635: * and used in new_completion() in order to put the space in
! 636: * correct places only. */
! 637: int complete_status;
! 638:
! 639: static char *
! 640: command_generator (const char *text, int state)
! 641: {
! 642: vector vline;
! 643: static char **matched = NULL;
! 644: static int index = 0;
! 645:
! 646: /* First call. */
! 647: if (! state)
! 648: {
! 649: index = 0;
! 650:
! 651: if (vty->node == AUTH_NODE || vty->node == AUTH_ENABLE_NODE)
! 652: return NULL;
! 653:
! 654: vline = cmd_make_strvec (rl_line_buffer);
! 655: if (vline == NULL)
! 656: return NULL;
! 657:
! 658: if (rl_end && isspace ((int) rl_line_buffer[rl_end - 1]))
! 659: vector_set (vline, '\0');
! 660:
! 661: matched = cmd_complete_command (vline, vty, &complete_status);
! 662: }
! 663:
! 664: if (matched && matched[index])
! 665: return matched[index++];
! 666:
! 667: return NULL;
! 668: }
! 669:
! 670: static char **
! 671: new_completion (char *text, int start, int end)
! 672: {
! 673: char **matches;
! 674:
! 675: matches = rl_completion_matches (text, command_generator);
! 676:
! 677: if (matches)
! 678: {
! 679: rl_point = rl_end;
! 680: if (complete_status == CMD_COMPLETE_FULL_MATCH)
! 681: rl_pending_input = ' ';
! 682: }
! 683:
! 684: return matches;
! 685: }
! 686:
! 687: #if 0
! 688: /* This function is not actually being used. */
! 689: static char **
! 690: vtysh_completion (char *text, int start, int end)
! 691: {
! 692: int ret;
! 693: vector vline;
! 694: char **matched = NULL;
! 695:
! 696: if (vty->node == AUTH_NODE || vty->node == AUTH_ENABLE_NODE)
! 697: return NULL;
! 698:
! 699: vline = cmd_make_strvec (rl_line_buffer);
! 700: if (vline == NULL)
! 701: return NULL;
! 702:
! 703: /* In case of 'help \t'. */
! 704: if (rl_end && isspace ((int) rl_line_buffer[rl_end - 1]))
! 705: vector_set (vline, '\0');
! 706:
! 707: matched = cmd_complete_command (vline, vty, &ret);
! 708:
! 709: cmd_free_strvec (vline);
! 710:
! 711: return (char **) matched;
! 712: }
! 713: #endif
! 714:
! 715: /* Vty node structures. */
! 716: static struct cmd_node bgp_node =
! 717: {
! 718: BGP_NODE,
! 719: "%s(config-router)# ",
! 720: };
! 721:
! 722: static struct cmd_node rip_node =
! 723: {
! 724: RIP_NODE,
! 725: "%s(config-router)# ",
! 726: };
! 727:
! 728: static struct cmd_node isis_node =
! 729: {
! 730: ISIS_NODE,
! 731: "%s(config-router)# ",
! 732: };
! 733:
! 734: static struct cmd_node interface_node =
! 735: {
! 736: INTERFACE_NODE,
! 737: "%s(config-if)# ",
! 738: };
! 739:
! 740: static struct cmd_node rmap_node =
! 741: {
! 742: RMAP_NODE,
! 743: "%s(config-route-map)# "
! 744: };
! 745:
! 746: static struct cmd_node zebra_node =
! 747: {
! 748: ZEBRA_NODE,
! 749: "%s(config-router)# "
! 750: };
! 751:
! 752: static struct cmd_node bgp_vpnv4_node =
! 753: {
! 754: BGP_VPNV4_NODE,
! 755: "%s(config-router-af)# "
! 756: };
! 757:
! 758: static struct cmd_node bgp_ipv4_node =
! 759: {
! 760: BGP_IPV4_NODE,
! 761: "%s(config-router-af)# "
! 762: };
! 763:
! 764: static struct cmd_node bgp_ipv4m_node =
! 765: {
! 766: BGP_IPV4M_NODE,
! 767: "%s(config-router-af)# "
! 768: };
! 769:
! 770: static struct cmd_node bgp_ipv6_node =
! 771: {
! 772: BGP_IPV6_NODE,
! 773: "%s(config-router-af)# "
! 774: };
! 775:
! 776: static struct cmd_node bgp_ipv6m_node =
! 777: {
! 778: BGP_IPV6M_NODE,
! 779: "%s(config-router-af)# "
! 780: };
! 781:
! 782: static struct cmd_node ospf_node =
! 783: {
! 784: OSPF_NODE,
! 785: "%s(config-router)# "
! 786: };
! 787:
! 788: static struct cmd_node ripng_node =
! 789: {
! 790: RIPNG_NODE,
! 791: "%s(config-router)# "
! 792: };
! 793:
! 794: static struct cmd_node ospf6_node =
! 795: {
! 796: OSPF6_NODE,
! 797: "%s(config-ospf6)# "
! 798: };
! 799:
! 800: static struct cmd_node keychain_node =
! 801: {
! 802: KEYCHAIN_NODE,
! 803: "%s(config-keychain)# "
! 804: };
! 805:
! 806: static struct cmd_node keychain_key_node =
! 807: {
! 808: KEYCHAIN_KEY_NODE,
! 809: "%s(config-keychain-key)# "
! 810: };
! 811:
! 812: /* Defined in lib/vty.c */
! 813: extern struct cmd_node vty_node;
! 814:
! 815: /* When '^Z' is received from vty, move down to the enable mode. */
! 816: int
! 817: vtysh_end (void)
! 818: {
! 819: switch (vty->node)
! 820: {
! 821: case VIEW_NODE:
! 822: case ENABLE_NODE:
! 823: /* Nothing to do. */
! 824: break;
! 825: default:
! 826: vty->node = ENABLE_NODE;
! 827: break;
! 828: }
! 829: return CMD_SUCCESS;
! 830: }
! 831:
! 832: DEFUNSH (VTYSH_ALL,
! 833: vtysh_end_all,
! 834: vtysh_end_all_cmd,
! 835: "end",
! 836: "End current mode and change to enable mode\n")
! 837: {
! 838: return vtysh_end ();
! 839: }
! 840:
! 841: DEFUNSH (VTYSH_BGPD,
! 842: router_bgp,
! 843: router_bgp_cmd,
! 844: "router bgp " CMD_AS_RANGE,
! 845: ROUTER_STR
! 846: BGP_STR
! 847: AS_STR)
! 848: {
! 849: vty->node = BGP_NODE;
! 850: return CMD_SUCCESS;
! 851: }
! 852:
! 853: ALIAS_SH (VTYSH_BGPD,
! 854: router_bgp,
! 855: router_bgp_view_cmd,
! 856: "router bgp " CMD_AS_RANGE " view WORD",
! 857: ROUTER_STR
! 858: BGP_STR
! 859: AS_STR
! 860: "BGP view\n"
! 861: "view name\n")
! 862:
! 863: DEFUNSH (VTYSH_BGPD,
! 864: address_family_vpnv4,
! 865: address_family_vpnv4_cmd,
! 866: "address-family vpnv4",
! 867: "Enter Address Family command mode\n"
! 868: "Address family\n")
! 869: {
! 870: vty->node = BGP_VPNV4_NODE;
! 871: return CMD_SUCCESS;
! 872: }
! 873:
! 874: DEFUNSH (VTYSH_BGPD,
! 875: address_family_vpnv4_unicast,
! 876: address_family_vpnv4_unicast_cmd,
! 877: "address-family vpnv4 unicast",
! 878: "Enter Address Family command mode\n"
! 879: "Address family\n"
! 880: "Address Family Modifier\n")
! 881: {
! 882: vty->node = BGP_VPNV4_NODE;
! 883: return CMD_SUCCESS;
! 884: }
! 885:
! 886: DEFUNSH (VTYSH_BGPD,
! 887: address_family_ipv4_unicast,
! 888: address_family_ipv4_unicast_cmd,
! 889: "address-family ipv4 unicast",
! 890: "Enter Address Family command mode\n"
! 891: "Address family\n"
! 892: "Address Family Modifier\n")
! 893: {
! 894: vty->node = BGP_IPV4_NODE;
! 895: return CMD_SUCCESS;
! 896: }
! 897:
! 898: DEFUNSH (VTYSH_BGPD,
! 899: address_family_ipv4_multicast,
! 900: address_family_ipv4_multicast_cmd,
! 901: "address-family ipv4 multicast",
! 902: "Enter Address Family command mode\n"
! 903: "Address family\n"
! 904: "Address Family Modifier\n")
! 905: {
! 906: vty->node = BGP_IPV4M_NODE;
! 907: return CMD_SUCCESS;
! 908: }
! 909:
! 910: DEFUNSH (VTYSH_BGPD,
! 911: address_family_ipv6,
! 912: address_family_ipv6_cmd,
! 913: "address-family ipv6",
! 914: "Enter Address Family command mode\n"
! 915: "Address family\n")
! 916: {
! 917: vty->node = BGP_IPV6_NODE;
! 918: return CMD_SUCCESS;
! 919: }
! 920:
! 921: DEFUNSH (VTYSH_BGPD,
! 922: address_family_ipv6_unicast,
! 923: address_family_ipv6_unicast_cmd,
! 924: "address-family ipv6 unicast",
! 925: "Enter Address Family command mode\n"
! 926: "Address family\n"
! 927: "Address Family Modifier\n")
! 928: {
! 929: vty->node = BGP_IPV6_NODE;
! 930: return CMD_SUCCESS;
! 931: }
! 932:
! 933: DEFUNSH (VTYSH_BGPD,
! 934: address_family_ipv6_multicast,
! 935: address_family_ipv6_multicast_cmd,
! 936: "address-family ipv6 multicast",
! 937: "Enter Address Family command mode\n"
! 938: "Address family\n"
! 939: "Address Family Modifier\n")
! 940: {
! 941: vty->node = BGP_IPV6M_NODE;
! 942: return CMD_SUCCESS;
! 943: }
! 944:
! 945: DEFUNSH (VTYSH_RIPD,
! 946: key_chain,
! 947: key_chain_cmd,
! 948: "key chain WORD",
! 949: "Authentication key management\n"
! 950: "Key-chain management\n"
! 951: "Key-chain name\n")
! 952: {
! 953: vty->node = KEYCHAIN_NODE;
! 954: return CMD_SUCCESS;
! 955: }
! 956:
! 957: DEFUNSH (VTYSH_RIPD,
! 958: key,
! 959: key_cmd,
! 960: "key <0-2147483647>",
! 961: "Configure a key\n"
! 962: "Key identifier number\n")
! 963: {
! 964: vty->node = KEYCHAIN_KEY_NODE;
! 965: return CMD_SUCCESS;
! 966: }
! 967:
! 968: DEFUNSH (VTYSH_RIPD,
! 969: router_rip,
! 970: router_rip_cmd,
! 971: "router rip",
! 972: ROUTER_STR
! 973: "RIP")
! 974: {
! 975: vty->node = RIP_NODE;
! 976: return CMD_SUCCESS;
! 977: }
! 978:
! 979: DEFUNSH (VTYSH_RIPNGD,
! 980: router_ripng,
! 981: router_ripng_cmd,
! 982: "router ripng",
! 983: ROUTER_STR
! 984: "RIPng")
! 985: {
! 986: vty->node = RIPNG_NODE;
! 987: return CMD_SUCCESS;
! 988: }
! 989:
! 990: DEFUNSH (VTYSH_OSPFD,
! 991: router_ospf,
! 992: router_ospf_cmd,
! 993: "router ospf",
! 994: "Enable a routing process\n"
! 995: "Start OSPF configuration\n")
! 996: {
! 997: vty->node = OSPF_NODE;
! 998: return CMD_SUCCESS;
! 999: }
! 1000:
! 1001: DEFUNSH (VTYSH_OSPF6D,
! 1002: router_ospf6,
! 1003: router_ospf6_cmd,
! 1004: "router ospf6",
! 1005: OSPF6_ROUTER_STR
! 1006: OSPF6_STR)
! 1007: {
! 1008: vty->node = OSPF6_NODE;
! 1009: return CMD_SUCCESS;
! 1010: }
! 1011:
! 1012: DEFUNSH (VTYSH_ISISD,
! 1013: router_isis,
! 1014: router_isis_cmd,
! 1015: "router isis WORD",
! 1016: ROUTER_STR
! 1017: "ISO IS-IS\n"
! 1018: "ISO Routing area tag")
! 1019: {
! 1020: vty->node = ISIS_NODE;
! 1021: return CMD_SUCCESS;
! 1022: }
! 1023:
! 1024: DEFUNSH (VTYSH_RMAP,
! 1025: route_map,
! 1026: route_map_cmd,
! 1027: "route-map WORD (deny|permit) <1-65535>",
! 1028: "Create route-map or enter route-map command mode\n"
! 1029: "Route map tag\n"
! 1030: "Route map denies set operations\n"
! 1031: "Route map permits set operations\n"
! 1032: "Sequence to insert to/delete from existing route-map entry\n")
! 1033: {
! 1034: vty->node = RMAP_NODE;
! 1035: return CMD_SUCCESS;
! 1036: }
! 1037:
! 1038: DEFUNSH (VTYSH_ALL,
! 1039: vtysh_line_vty,
! 1040: vtysh_line_vty_cmd,
! 1041: "line vty",
! 1042: "Configure a terminal line\n"
! 1043: "Virtual terminal\n")
! 1044: {
! 1045: vty->node = VTY_NODE;
! 1046: return CMD_SUCCESS;
! 1047: }
! 1048:
! 1049: DEFUNSH (VTYSH_ALL,
! 1050: vtysh_enable,
! 1051: vtysh_enable_cmd,
! 1052: "enable",
! 1053: "Turn on privileged mode command\n")
! 1054: {
! 1055: vty->node = ENABLE_NODE;
! 1056: return CMD_SUCCESS;
! 1057: }
! 1058:
! 1059: DEFUNSH (VTYSH_ALL,
! 1060: vtysh_disable,
! 1061: vtysh_disable_cmd,
! 1062: "disable",
! 1063: "Turn off privileged mode command\n")
! 1064: {
! 1065: if (vty->node == ENABLE_NODE)
! 1066: vty->node = VIEW_NODE;
! 1067: return CMD_SUCCESS;
! 1068: }
! 1069:
! 1070: DEFUNSH (VTYSH_ALL,
! 1071: vtysh_config_terminal,
! 1072: vtysh_config_terminal_cmd,
! 1073: "configure terminal",
! 1074: "Configuration from vty interface\n"
! 1075: "Configuration terminal\n")
! 1076: {
! 1077: vty->node = CONFIG_NODE;
! 1078: return CMD_SUCCESS;
! 1079: }
! 1080:
! 1081: static int
! 1082: vtysh_exit (struct vty *vty)
! 1083: {
! 1084: switch (vty->node)
! 1085: {
! 1086: case VIEW_NODE:
! 1087: case ENABLE_NODE:
! 1088: exit (0);
! 1089: break;
! 1090: case CONFIG_NODE:
! 1091: vty->node = ENABLE_NODE;
! 1092: break;
! 1093: case INTERFACE_NODE:
! 1094: case ZEBRA_NODE:
! 1095: case BGP_NODE:
! 1096: case RIP_NODE:
! 1097: case RIPNG_NODE:
! 1098: case OSPF_NODE:
! 1099: case OSPF6_NODE:
! 1100: case ISIS_NODE:
! 1101: case MASC_NODE:
! 1102: case RMAP_NODE:
! 1103: case VTY_NODE:
! 1104: case KEYCHAIN_NODE:
! 1105: vtysh_execute("end");
! 1106: vtysh_execute("configure terminal");
! 1107: vty->node = CONFIG_NODE;
! 1108: break;
! 1109: case BGP_VPNV4_NODE:
! 1110: case BGP_IPV4_NODE:
! 1111: case BGP_IPV4M_NODE:
! 1112: case BGP_IPV6_NODE:
! 1113: case BGP_IPV6M_NODE:
! 1114: vty->node = BGP_NODE;
! 1115: break;
! 1116: case KEYCHAIN_KEY_NODE:
! 1117: vty->node = KEYCHAIN_NODE;
! 1118: break;
! 1119: default:
! 1120: break;
! 1121: }
! 1122: return CMD_SUCCESS;
! 1123: }
! 1124:
! 1125: DEFUNSH (VTYSH_ALL,
! 1126: vtysh_exit_all,
! 1127: vtysh_exit_all_cmd,
! 1128: "exit",
! 1129: "Exit current mode and down to previous mode\n")
! 1130: {
! 1131: return vtysh_exit (vty);
! 1132: }
! 1133:
! 1134: ALIAS (vtysh_exit_all,
! 1135: vtysh_quit_all_cmd,
! 1136: "quit",
! 1137: "Exit current mode and down to previous mode\n")
! 1138:
! 1139: DEFUNSH (VTYSH_BGPD,
! 1140: exit_address_family,
! 1141: exit_address_family_cmd,
! 1142: "exit-address-family",
! 1143: "Exit from Address Family configuration mode\n")
! 1144: {
! 1145: if (vty->node == BGP_IPV4_NODE
! 1146: || vty->node == BGP_IPV4M_NODE
! 1147: || vty->node == BGP_VPNV4_NODE
! 1148: || vty->node == BGP_IPV6_NODE
! 1149: || vty->node == BGP_IPV6M_NODE)
! 1150: vty->node = BGP_NODE;
! 1151: return CMD_SUCCESS;
! 1152: }
! 1153:
! 1154: DEFUNSH (VTYSH_ZEBRA,
! 1155: vtysh_exit_zebra,
! 1156: vtysh_exit_zebra_cmd,
! 1157: "exit",
! 1158: "Exit current mode and down to previous mode\n")
! 1159: {
! 1160: return vtysh_exit (vty);
! 1161: }
! 1162:
! 1163: ALIAS (vtysh_exit_zebra,
! 1164: vtysh_quit_zebra_cmd,
! 1165: "quit",
! 1166: "Exit current mode and down to previous mode\n")
! 1167:
! 1168: DEFUNSH (VTYSH_RIPD,
! 1169: vtysh_exit_ripd,
! 1170: vtysh_exit_ripd_cmd,
! 1171: "exit",
! 1172: "Exit current mode and down to previous mode\n")
! 1173: {
! 1174: return vtysh_exit (vty);
! 1175: }
! 1176:
! 1177: ALIAS (vtysh_exit_ripd,
! 1178: vtysh_quit_ripd_cmd,
! 1179: "quit",
! 1180: "Exit current mode and down to previous mode\n")
! 1181:
! 1182: DEFUNSH (VTYSH_RIPNGD,
! 1183: vtysh_exit_ripngd,
! 1184: vtysh_exit_ripngd_cmd,
! 1185: "exit",
! 1186: "Exit current mode and down to previous mode\n")
! 1187: {
! 1188: return vtysh_exit (vty);
! 1189: }
! 1190:
! 1191: ALIAS (vtysh_exit_ripngd,
! 1192: vtysh_quit_ripngd_cmd,
! 1193: "quit",
! 1194: "Exit current mode and down to previous mode\n")
! 1195:
! 1196: DEFUNSH (VTYSH_RMAP,
! 1197: vtysh_exit_rmap,
! 1198: vtysh_exit_rmap_cmd,
! 1199: "exit",
! 1200: "Exit current mode and down to previous mode\n")
! 1201: {
! 1202: return vtysh_exit (vty);
! 1203: }
! 1204:
! 1205: ALIAS (vtysh_exit_rmap,
! 1206: vtysh_quit_rmap_cmd,
! 1207: "quit",
! 1208: "Exit current mode and down to previous mode\n")
! 1209:
! 1210: DEFUNSH (VTYSH_BGPD,
! 1211: vtysh_exit_bgpd,
! 1212: vtysh_exit_bgpd_cmd,
! 1213: "exit",
! 1214: "Exit current mode and down to previous mode\n")
! 1215: {
! 1216: return vtysh_exit (vty);
! 1217: }
! 1218:
! 1219: ALIAS (vtysh_exit_bgpd,
! 1220: vtysh_quit_bgpd_cmd,
! 1221: "quit",
! 1222: "Exit current mode and down to previous mode\n")
! 1223:
! 1224: DEFUNSH (VTYSH_OSPFD,
! 1225: vtysh_exit_ospfd,
! 1226: vtysh_exit_ospfd_cmd,
! 1227: "exit",
! 1228: "Exit current mode and down to previous mode\n")
! 1229: {
! 1230: return vtysh_exit (vty);
! 1231: }
! 1232:
! 1233: ALIAS (vtysh_exit_ospfd,
! 1234: vtysh_quit_ospfd_cmd,
! 1235: "quit",
! 1236: "Exit current mode and down to previous mode\n")
! 1237:
! 1238: DEFUNSH (VTYSH_OSPF6D,
! 1239: vtysh_exit_ospf6d,
! 1240: vtysh_exit_ospf6d_cmd,
! 1241: "exit",
! 1242: "Exit current mode and down to previous mode\n")
! 1243: {
! 1244: return vtysh_exit (vty);
! 1245: }
! 1246:
! 1247: ALIAS (vtysh_exit_ospf6d,
! 1248: vtysh_quit_ospf6d_cmd,
! 1249: "quit",
! 1250: "Exit current mode and down to previous mode\n")
! 1251:
! 1252: DEFUNSH (VTYSH_ISISD,
! 1253: vtysh_exit_isisd,
! 1254: vtysh_exit_isisd_cmd,
! 1255: "exit",
! 1256: "Exit current mode and down to previous mode\n")
! 1257: {
! 1258: return vtysh_exit (vty);
! 1259: }
! 1260:
! 1261: ALIAS (vtysh_exit_isisd,
! 1262: vtysh_quit_isisd_cmd,
! 1263: "quit",
! 1264: "Exit current mode and down to previous mode\n")
! 1265:
! 1266: DEFUNSH (VTYSH_ALL,
! 1267: vtysh_exit_line_vty,
! 1268: vtysh_exit_line_vty_cmd,
! 1269: "exit",
! 1270: "Exit current mode and down to previous mode\n")
! 1271: {
! 1272: return vtysh_exit (vty);
! 1273: }
! 1274:
! 1275: ALIAS (vtysh_exit_line_vty,
! 1276: vtysh_quit_line_vty_cmd,
! 1277: "quit",
! 1278: "Exit current mode and down to previous mode\n")
! 1279:
! 1280: DEFUNSH (VTYSH_INTERFACE,
! 1281: vtysh_interface,
! 1282: vtysh_interface_cmd,
! 1283: "interface IFNAME",
! 1284: "Select an interface to configure\n"
! 1285: "Interface's name\n")
! 1286: {
! 1287: vty->node = INTERFACE_NODE;
! 1288: return CMD_SUCCESS;
! 1289: }
! 1290:
! 1291: /* TODO Implement "no interface command in isisd. */
! 1292: DEFSH (VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_OSPFD|VTYSH_OSPF6D,
! 1293: vtysh_no_interface_cmd,
! 1294: "no interface IFNAME",
! 1295: NO_STR
! 1296: "Delete a pseudo interface's configuration\n"
! 1297: "Interface's name\n")
! 1298:
! 1299: /* TODO Implement interface description commands in ripngd, ospf6d
! 1300: * and isisd. */
! 1301: DEFSH (VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_OSPFD,
! 1302: interface_desc_cmd,
! 1303: "description .LINE",
! 1304: "Interface specific description\n"
! 1305: "Characters describing this interface\n")
! 1306:
! 1307: DEFSH (VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_OSPFD,
! 1308: no_interface_desc_cmd,
! 1309: "no description",
! 1310: NO_STR
! 1311: "Interface specific description\n")
! 1312:
! 1313: DEFUNSH (VTYSH_INTERFACE,
! 1314: vtysh_exit_interface,
! 1315: vtysh_exit_interface_cmd,
! 1316: "exit",
! 1317: "Exit current mode and down to previous mode\n")
! 1318: {
! 1319: return vtysh_exit (vty);
! 1320: }
! 1321:
! 1322: ALIAS (vtysh_exit_interface,
! 1323: vtysh_quit_interface_cmd,
! 1324: "quit",
! 1325: "Exit current mode and down to previous mode\n")
! 1326:
! 1327: /* Memory */
! 1328: DEFUN (vtysh_show_memory,
! 1329: vtysh_show_memory_cmd,
! 1330: "show memory",
! 1331: SHOW_STR
! 1332: "Memory statistics\n")
! 1333: {
! 1334: unsigned int i;
! 1335: int ret = CMD_SUCCESS;
! 1336: char line[] = "show memory\n";
! 1337:
! 1338: for (i = 0; i < VTYSH_INDEX_MAX; i++)
! 1339: if ( vtysh_client[i].fd >= 0 )
! 1340: {
! 1341: fprintf (stdout, "Memory statistics for %s:\n",
! 1342: vtysh_client[i].name);
! 1343: ret = vtysh_client_execute (&vtysh_client[i], line, stdout);
! 1344: fprintf (stdout,"\n");
! 1345: }
! 1346:
! 1347: return ret;
! 1348: }
! 1349:
! 1350: /* Logging commands. */
! 1351: DEFUN (vtysh_show_logging,
! 1352: vtysh_show_logging_cmd,
! 1353: "show logging",
! 1354: SHOW_STR
! 1355: "Show current logging configuration\n")
! 1356: {
! 1357: unsigned int i;
! 1358: int ret = CMD_SUCCESS;
! 1359: char line[] = "show logging\n";
! 1360:
! 1361: for (i = 0; i < VTYSH_INDEX_MAX; i++)
! 1362: if ( vtysh_client[i].fd >= 0 )
! 1363: {
! 1364: fprintf (stdout,"Logging configuration for %s:\n",
! 1365: vtysh_client[i].name);
! 1366: ret = vtysh_client_execute (&vtysh_client[i], line, stdout);
! 1367: fprintf (stdout,"\n");
! 1368: }
! 1369:
! 1370: return ret;
! 1371: }
! 1372:
! 1373: DEFUNSH (VTYSH_ALL,
! 1374: vtysh_log_stdout,
! 1375: vtysh_log_stdout_cmd,
! 1376: "log stdout",
! 1377: "Logging control\n"
! 1378: "Set stdout logging level\n")
! 1379: {
! 1380: return CMD_SUCCESS;
! 1381: }
! 1382:
! 1383: DEFUNSH (VTYSH_ALL,
! 1384: vtysh_log_stdout_level,
! 1385: vtysh_log_stdout_level_cmd,
! 1386: "log stdout "LOG_LEVELS,
! 1387: "Logging control\n"
! 1388: "Set stdout logging level\n"
! 1389: LOG_LEVEL_DESC)
! 1390: {
! 1391: return CMD_SUCCESS;
! 1392: }
! 1393:
! 1394: DEFUNSH (VTYSH_ALL,
! 1395: no_vtysh_log_stdout,
! 1396: no_vtysh_log_stdout_cmd,
! 1397: "no log stdout [LEVEL]",
! 1398: NO_STR
! 1399: "Logging control\n"
! 1400: "Cancel logging to stdout\n"
! 1401: "Logging level\n")
! 1402: {
! 1403: return CMD_SUCCESS;
! 1404: }
! 1405:
! 1406: DEFUNSH (VTYSH_ALL,
! 1407: vtysh_log_file,
! 1408: vtysh_log_file_cmd,
! 1409: "log file FILENAME",
! 1410: "Logging control\n"
! 1411: "Logging to file\n"
! 1412: "Logging filename\n")
! 1413: {
! 1414: return CMD_SUCCESS;
! 1415: }
! 1416:
! 1417: DEFUNSH (VTYSH_ALL,
! 1418: vtysh_log_file_level,
! 1419: vtysh_log_file_level_cmd,
! 1420: "log file FILENAME "LOG_LEVELS,
! 1421: "Logging control\n"
! 1422: "Logging to file\n"
! 1423: "Logging filename\n"
! 1424: LOG_LEVEL_DESC)
! 1425: {
! 1426: return CMD_SUCCESS;
! 1427: }
! 1428:
! 1429: DEFUNSH (VTYSH_ALL,
! 1430: no_vtysh_log_file,
! 1431: no_vtysh_log_file_cmd,
! 1432: "no log file [FILENAME]",
! 1433: NO_STR
! 1434: "Logging control\n"
! 1435: "Cancel logging to file\n"
! 1436: "Logging file name\n")
! 1437: {
! 1438: return CMD_SUCCESS;
! 1439: }
! 1440:
! 1441: ALIAS_SH (VTYSH_ALL,
! 1442: no_vtysh_log_file,
! 1443: no_vtysh_log_file_level_cmd,
! 1444: "no log file FILENAME LEVEL",
! 1445: NO_STR
! 1446: "Logging control\n"
! 1447: "Cancel logging to file\n"
! 1448: "Logging file name\n"
! 1449: "Logging level\n")
! 1450:
! 1451: DEFUNSH (VTYSH_ALL,
! 1452: vtysh_log_monitor,
! 1453: vtysh_log_monitor_cmd,
! 1454: "log monitor",
! 1455: "Logging control\n"
! 1456: "Set terminal line (monitor) logging level\n")
! 1457: {
! 1458: return CMD_SUCCESS;
! 1459: }
! 1460:
! 1461: DEFUNSH (VTYSH_ALL,
! 1462: vtysh_log_monitor_level,
! 1463: vtysh_log_monitor_level_cmd,
! 1464: "log monitor "LOG_LEVELS,
! 1465: "Logging control\n"
! 1466: "Set terminal line (monitor) logging level\n"
! 1467: LOG_LEVEL_DESC)
! 1468: {
! 1469: return CMD_SUCCESS;
! 1470: }
! 1471:
! 1472: DEFUNSH (VTYSH_ALL,
! 1473: no_vtysh_log_monitor,
! 1474: no_vtysh_log_monitor_cmd,
! 1475: "no log monitor [LEVEL]",
! 1476: NO_STR
! 1477: "Logging control\n"
! 1478: "Disable terminal line (monitor) logging\n"
! 1479: "Logging level\n")
! 1480: {
! 1481: return CMD_SUCCESS;
! 1482: }
! 1483:
! 1484: DEFUNSH (VTYSH_ALL,
! 1485: vtysh_log_syslog,
! 1486: vtysh_log_syslog_cmd,
! 1487: "log syslog",
! 1488: "Logging control\n"
! 1489: "Set syslog logging level\n")
! 1490: {
! 1491: return CMD_SUCCESS;
! 1492: }
! 1493:
! 1494: DEFUNSH (VTYSH_ALL,
! 1495: vtysh_log_syslog_level,
! 1496: vtysh_log_syslog_level_cmd,
! 1497: "log syslog "LOG_LEVELS,
! 1498: "Logging control\n"
! 1499: "Set syslog logging level\n"
! 1500: LOG_LEVEL_DESC)
! 1501: {
! 1502: return CMD_SUCCESS;
! 1503: }
! 1504:
! 1505: DEFUNSH (VTYSH_ALL,
! 1506: no_vtysh_log_syslog,
! 1507: no_vtysh_log_syslog_cmd,
! 1508: "no log syslog [LEVEL]",
! 1509: NO_STR
! 1510: "Logging control\n"
! 1511: "Cancel logging to syslog\n"
! 1512: "Logging level\n")
! 1513: {
! 1514: return CMD_SUCCESS;
! 1515: }
! 1516:
! 1517: DEFUNSH (VTYSH_ALL,
! 1518: vtysh_log_facility,
! 1519: vtysh_log_facility_cmd,
! 1520: "log facility "LOG_FACILITIES,
! 1521: "Logging control\n"
! 1522: "Facility parameter for syslog messages\n"
! 1523: LOG_FACILITY_DESC)
! 1524:
! 1525: {
! 1526: return CMD_SUCCESS;
! 1527: }
! 1528:
! 1529: DEFUNSH (VTYSH_ALL,
! 1530: no_vtysh_log_facility,
! 1531: no_vtysh_log_facility_cmd,
! 1532: "no log facility [FACILITY]",
! 1533: NO_STR
! 1534: "Logging control\n"
! 1535: "Reset syslog facility to default (daemon)\n"
! 1536: "Syslog facility\n")
! 1537:
! 1538: {
! 1539: return CMD_SUCCESS;
! 1540: }
! 1541:
! 1542: DEFUNSH_DEPRECATED (VTYSH_ALL,
! 1543: vtysh_log_trap,
! 1544: vtysh_log_trap_cmd,
! 1545: "log trap "LOG_LEVELS,
! 1546: "Logging control\n"
! 1547: "(Deprecated) Set logging level and default for all destinations\n"
! 1548: LOG_LEVEL_DESC)
! 1549:
! 1550: {
! 1551: return CMD_SUCCESS;
! 1552: }
! 1553:
! 1554: DEFUNSH_DEPRECATED (VTYSH_ALL,
! 1555: no_vtysh_log_trap,
! 1556: no_vtysh_log_trap_cmd,
! 1557: "no log trap [LEVEL]",
! 1558: NO_STR
! 1559: "Logging control\n"
! 1560: "Permit all logging information\n"
! 1561: "Logging level\n")
! 1562: {
! 1563: return CMD_SUCCESS;
! 1564: }
! 1565:
! 1566: DEFUNSH (VTYSH_ALL,
! 1567: vtysh_log_record_priority,
! 1568: vtysh_log_record_priority_cmd,
! 1569: "log record-priority",
! 1570: "Logging control\n"
! 1571: "Log the priority of the message within the message\n")
! 1572: {
! 1573: return CMD_SUCCESS;
! 1574: }
! 1575:
! 1576: DEFUNSH (VTYSH_ALL,
! 1577: no_vtysh_log_record_priority,
! 1578: no_vtysh_log_record_priority_cmd,
! 1579: "no log record-priority",
! 1580: NO_STR
! 1581: "Logging control\n"
! 1582: "Do not log the priority of the message within the message\n")
! 1583: {
! 1584: return CMD_SUCCESS;
! 1585: }
! 1586:
! 1587: DEFUNSH (VTYSH_ALL,
! 1588: vtysh_log_timestamp_precision,
! 1589: vtysh_log_timestamp_precision_cmd,
! 1590: "log timestamp precision <0-6>",
! 1591: "Logging control\n"
! 1592: "Timestamp configuration\n"
! 1593: "Set the timestamp precision\n"
! 1594: "Number of subsecond digits\n")
! 1595: {
! 1596: return CMD_SUCCESS;
! 1597: }
! 1598:
! 1599: DEFUNSH (VTYSH_ALL,
! 1600: no_vtysh_log_timestamp_precision,
! 1601: no_vtysh_log_timestamp_precision_cmd,
! 1602: "no log timestamp precision",
! 1603: NO_STR
! 1604: "Logging control\n"
! 1605: "Timestamp configuration\n"
! 1606: "Reset the timestamp precision to the default value of 0\n")
! 1607: {
! 1608: return CMD_SUCCESS;
! 1609: }
! 1610:
! 1611: DEFUNSH (VTYSH_ALL,
! 1612: vtysh_service_password_encrypt,
! 1613: vtysh_service_password_encrypt_cmd,
! 1614: "service password-encryption",
! 1615: "Set up miscellaneous service\n"
! 1616: "Enable encrypted passwords\n")
! 1617: {
! 1618: return CMD_SUCCESS;
! 1619: }
! 1620:
! 1621: DEFUNSH (VTYSH_ALL,
! 1622: no_vtysh_service_password_encrypt,
! 1623: no_vtysh_service_password_encrypt_cmd,
! 1624: "no service password-encryption",
! 1625: NO_STR
! 1626: "Set up miscellaneous service\n"
! 1627: "Enable encrypted passwords\n")
! 1628: {
! 1629: return CMD_SUCCESS;
! 1630: }
! 1631:
! 1632: DEFUNSH (VTYSH_ALL,
! 1633: vtysh_config_password,
! 1634: vtysh_password_cmd,
! 1635: "password (8|) WORD",
! 1636: "Assign the terminal connection password\n"
! 1637: "Specifies a HIDDEN password will follow\n"
! 1638: "dummy string \n"
! 1639: "The HIDDEN line password string\n")
! 1640: {
! 1641: return CMD_SUCCESS;
! 1642: }
! 1643:
! 1644: DEFUNSH (VTYSH_ALL,
! 1645: vtysh_password_text,
! 1646: vtysh_password_text_cmd,
! 1647: "password LINE",
! 1648: "Assign the terminal connection password\n"
! 1649: "The UNENCRYPTED (cleartext) line password\n")
! 1650: {
! 1651: return CMD_SUCCESS;
! 1652: }
! 1653:
! 1654: DEFUNSH (VTYSH_ALL,
! 1655: vtysh_config_enable_password,
! 1656: vtysh_enable_password_cmd,
! 1657: "enable password (8|) WORD",
! 1658: "Modify enable password parameters\n"
! 1659: "Assign the privileged level password\n"
! 1660: "Specifies a HIDDEN password will follow\n"
! 1661: "dummy string \n"
! 1662: "The HIDDEN 'enable' password string\n")
! 1663: {
! 1664: return CMD_SUCCESS;
! 1665: }
! 1666:
! 1667: DEFUNSH (VTYSH_ALL,
! 1668: vtysh_enable_password_text,
! 1669: vtysh_enable_password_text_cmd,
! 1670: "enable password LINE",
! 1671: "Modify enable password parameters\n"
! 1672: "Assign the privileged level password\n"
! 1673: "The UNENCRYPTED (cleartext) 'enable' password\n")
! 1674: {
! 1675: return CMD_SUCCESS;
! 1676: }
! 1677:
! 1678: DEFUNSH (VTYSH_ALL,
! 1679: no_vtysh_config_enable_password,
! 1680: no_vtysh_enable_password_cmd,
! 1681: "no enable password",
! 1682: NO_STR
! 1683: "Modify enable password parameters\n"
! 1684: "Assign the privileged level password\n")
! 1685: {
! 1686: return CMD_SUCCESS;
! 1687: }
! 1688:
! 1689: DEFUN (vtysh_write_terminal,
! 1690: vtysh_write_terminal_cmd,
! 1691: "write terminal",
! 1692: "Write running configuration to memory, network, or terminal\n"
! 1693: "Write to terminal\n")
! 1694: {
! 1695: u_int i;
! 1696: int ret;
! 1697: char line[] = "write terminal\n";
! 1698: FILE *fp = NULL;
! 1699:
! 1700: if (vtysh_pager_name)
! 1701: {
! 1702: fp = popen (vtysh_pager_name, "w");
! 1703: if (fp == NULL)
! 1704: {
! 1705: perror ("popen");
! 1706: exit (1);
! 1707: }
! 1708: }
! 1709: else
! 1710: fp = stdout;
! 1711:
! 1712: vty_out (vty, "Building configuration...%s", VTY_NEWLINE);
! 1713: vty_out (vty, "%sCurrent configuration:%s", VTY_NEWLINE,
! 1714: VTY_NEWLINE);
! 1715: vty_out (vty, "!%s", VTY_NEWLINE);
! 1716:
! 1717: for (i = 0; i < VTYSH_INDEX_MAX; i++)
! 1718: ret = vtysh_client_config (&vtysh_client[i], line);
! 1719:
! 1720: /* Integrate vtysh specific configuration. */
! 1721: vtysh_config_write ();
! 1722:
! 1723: vtysh_config_dump (fp);
! 1724:
! 1725: if (vtysh_pager_name && fp)
! 1726: {
! 1727: fflush (fp);
! 1728: if (pclose (fp) == -1)
! 1729: {
! 1730: perror ("pclose");
! 1731: exit (1);
! 1732: }
! 1733: fp = NULL;
! 1734: }
! 1735:
! 1736: vty_out (vty, "end%s", VTY_NEWLINE);
! 1737:
! 1738: return CMD_SUCCESS;
! 1739: }
! 1740:
! 1741: DEFUN (vtysh_integrated_config,
! 1742: vtysh_integrated_config_cmd,
! 1743: "service integrated-vtysh-config",
! 1744: "Set up miscellaneous service\n"
! 1745: "Write configuration into integrated file\n")
! 1746: {
! 1747: vtysh_writeconfig_integrated = 1;
! 1748: return CMD_SUCCESS;
! 1749: }
! 1750:
! 1751: DEFUN (no_vtysh_integrated_config,
! 1752: no_vtysh_integrated_config_cmd,
! 1753: "no service integrated-vtysh-config",
! 1754: NO_STR
! 1755: "Set up miscellaneous service\n"
! 1756: "Write configuration into integrated file\n")
! 1757: {
! 1758: vtysh_writeconfig_integrated = 0;
! 1759: return CMD_SUCCESS;
! 1760: }
! 1761:
! 1762: static int
! 1763: write_config_integrated(void)
! 1764: {
! 1765: u_int i;
! 1766: int ret;
! 1767: char line[] = "write terminal\n";
! 1768: FILE *fp;
! 1769: char *integrate_sav = NULL;
! 1770:
! 1771: integrate_sav = malloc (strlen (integrate_default) +
! 1772: strlen (CONF_BACKUP_EXT) + 1);
! 1773: strcpy (integrate_sav, integrate_default);
! 1774: strcat (integrate_sav, CONF_BACKUP_EXT);
! 1775:
! 1776: fprintf (stdout,"Building Configuration...\n");
! 1777:
! 1778: /* Move current configuration file to backup config file. */
! 1779: unlink (integrate_sav);
! 1780: rename (integrate_default, integrate_sav);
! 1781: free (integrate_sav);
! 1782:
! 1783: fp = fopen (integrate_default, "w");
! 1784: if (fp == NULL)
! 1785: {
! 1786: fprintf (stdout,"%% Can't open configuration file %s.\n",
! 1787: integrate_default);
! 1788: return CMD_SUCCESS;
! 1789: }
! 1790:
! 1791: for (i = 0; i < VTYSH_INDEX_MAX; i++)
! 1792: ret = vtysh_client_config (&vtysh_client[i], line);
! 1793:
! 1794: vtysh_config_dump (fp);
! 1795:
! 1796: fclose (fp);
! 1797:
! 1798: if (chmod (integrate_default, CONFIGFILE_MASK) != 0)
! 1799: {
! 1800: fprintf (stdout,"%% Can't chmod configuration file %s: %s (%d)\n",
! 1801: integrate_default, safe_strerror(errno), errno);
! 1802: return CMD_WARNING;
! 1803: }
! 1804:
! 1805: fprintf(stdout,"Integrated configuration saved to %s\n",integrate_default);
! 1806:
! 1807: fprintf (stdout,"[OK]\n");
! 1808:
! 1809: return CMD_SUCCESS;
! 1810: }
! 1811:
! 1812: DEFUN (vtysh_write_memory,
! 1813: vtysh_write_memory_cmd,
! 1814: "write memory",
! 1815: "Write running configuration to memory, network, or terminal\n"
! 1816: "Write configuration to the file (same as write file)\n")
! 1817: {
! 1818: int ret = CMD_SUCCESS;
! 1819: char line[] = "write memory\n";
! 1820: u_int i;
! 1821:
! 1822: /* If integrated Quagga.conf explicitely set. */
! 1823: if (vtysh_writeconfig_integrated)
! 1824: return write_config_integrated();
! 1825:
! 1826: fprintf (stdout,"Building Configuration...\n");
! 1827:
! 1828: for (i = 0; i < VTYSH_INDEX_MAX; i++)
! 1829: ret = vtysh_client_execute (&vtysh_client[i], line, stdout);
! 1830:
! 1831: fprintf (stdout,"[OK]\n");
! 1832:
! 1833: return ret;
! 1834: }
! 1835:
! 1836: ALIAS (vtysh_write_memory,
! 1837: vtysh_copy_runningconfig_startupconfig_cmd,
! 1838: "copy running-config startup-config",
! 1839: "Copy from one file to another\n"
! 1840: "Copy from current system configuration\n"
! 1841: "Copy to startup configuration\n")
! 1842:
! 1843: ALIAS (vtysh_write_memory,
! 1844: vtysh_write_file_cmd,
! 1845: "write file",
! 1846: "Write running configuration to memory, network, or terminal\n"
! 1847: "Write configuration to the file (same as write memory)\n")
! 1848:
! 1849: ALIAS (vtysh_write_memory,
! 1850: vtysh_write_cmd,
! 1851: "write",
! 1852: "Write running configuration to memory, network, or terminal\n")
! 1853:
! 1854: ALIAS (vtysh_write_terminal,
! 1855: vtysh_show_running_config_cmd,
! 1856: "show running-config",
! 1857: SHOW_STR
! 1858: "Current operating configuration\n")
! 1859:
! 1860: DEFUN (vtysh_terminal_length,
! 1861: vtysh_terminal_length_cmd,
! 1862: "terminal length <0-512>",
! 1863: "Set terminal line parameters\n"
! 1864: "Set number of lines on a screen\n"
! 1865: "Number of lines on screen (0 for no pausing)\n")
! 1866: {
! 1867: int lines;
! 1868: char *endptr = NULL;
! 1869: char default_pager[10];
! 1870:
! 1871: lines = strtol (argv[0], &endptr, 10);
! 1872: if (lines < 0 || lines > 512 || *endptr != '\0')
! 1873: {
! 1874: vty_out (vty, "length is malformed%s", VTY_NEWLINE);
! 1875: return CMD_WARNING;
! 1876: }
! 1877:
! 1878: if (vtysh_pager_name)
! 1879: {
! 1880: free (vtysh_pager_name);
! 1881: vtysh_pager_name = NULL;
! 1882: }
! 1883:
! 1884: if (lines != 0)
! 1885: {
! 1886: snprintf(default_pager, 10, "more -%i", lines);
! 1887: vtysh_pager_name = strdup (default_pager);
! 1888: }
! 1889:
! 1890: return CMD_SUCCESS;
! 1891: }
! 1892:
! 1893: DEFUN (vtysh_terminal_no_length,
! 1894: vtysh_terminal_no_length_cmd,
! 1895: "terminal no length",
! 1896: "Set terminal line parameters\n"
! 1897: NO_STR
! 1898: "Set number of lines on a screen\n")
! 1899: {
! 1900: if (vtysh_pager_name)
! 1901: {
! 1902: free (vtysh_pager_name);
! 1903: vtysh_pager_name = NULL;
! 1904: }
! 1905:
! 1906: vtysh_pager_init();
! 1907: return CMD_SUCCESS;
! 1908: }
! 1909:
! 1910: DEFUN (vtysh_show_daemons,
! 1911: vtysh_show_daemons_cmd,
! 1912: "show daemons",
! 1913: SHOW_STR
! 1914: "Show list of running daemons\n")
! 1915: {
! 1916: u_int i;
! 1917:
! 1918: for (i = 0; i < VTYSH_INDEX_MAX; i++)
! 1919: if ( vtysh_client[i].fd >= 0 )
! 1920: vty_out(vty, " %s", vtysh_client[i].name);
! 1921: vty_out(vty, "%s", VTY_NEWLINE);
! 1922:
! 1923: return CMD_SUCCESS;
! 1924: }
! 1925:
! 1926: /* Execute command in child process. */
! 1927: static int
! 1928: execute_command (const char *command, int argc, const char *arg1,
! 1929: const char *arg2)
! 1930: {
! 1931: int ret;
! 1932: pid_t pid;
! 1933: int status;
! 1934:
! 1935: /* Call fork(). */
! 1936: pid = fork ();
! 1937:
! 1938: if (pid < 0)
! 1939: {
! 1940: /* Failure of fork(). */
! 1941: fprintf (stderr, "Can't fork: %s\n", safe_strerror (errno));
! 1942: exit (1);
! 1943: }
! 1944: else if (pid == 0)
! 1945: {
! 1946: /* This is child process. */
! 1947: switch (argc)
! 1948: {
! 1949: case 0:
! 1950: ret = execlp (command, command, (const char *)NULL);
! 1951: break;
! 1952: case 1:
! 1953: ret = execlp (command, command, arg1, (const char *)NULL);
! 1954: break;
! 1955: case 2:
! 1956: ret = execlp (command, command, arg1, arg2, (const char *)NULL);
! 1957: break;
! 1958: }
! 1959:
! 1960: /* When execlp suceed, this part is not executed. */
! 1961: fprintf (stderr, "Can't execute %s: %s\n", command, safe_strerror (errno));
! 1962: exit (1);
! 1963: }
! 1964: else
! 1965: {
! 1966: /* This is parent. */
! 1967: execute_flag = 1;
! 1968: ret = wait4 (pid, &status, 0, NULL);
! 1969: execute_flag = 0;
! 1970: }
! 1971: return 0;
! 1972: }
! 1973:
! 1974: DEFUN (vtysh_ping,
! 1975: vtysh_ping_cmd,
! 1976: "ping WORD",
! 1977: "Send echo messages\n"
! 1978: "Ping destination address or hostname\n")
! 1979: {
! 1980: execute_command ("ping", 1, argv[0], NULL);
! 1981: return CMD_SUCCESS;
! 1982: }
! 1983:
! 1984: ALIAS (vtysh_ping,
! 1985: vtysh_ping_ip_cmd,
! 1986: "ping ip WORD",
! 1987: "Send echo messages\n"
! 1988: "IP echo\n"
! 1989: "Ping destination address or hostname\n")
! 1990:
! 1991: DEFUN (vtysh_traceroute,
! 1992: vtysh_traceroute_cmd,
! 1993: "traceroute WORD",
! 1994: "Trace route to destination\n"
! 1995: "Trace route to destination address or hostname\n")
! 1996: {
! 1997: execute_command ("traceroute", 1, argv[0], NULL);
! 1998: return CMD_SUCCESS;
! 1999: }
! 2000:
! 2001: ALIAS (vtysh_traceroute,
! 2002: vtysh_traceroute_ip_cmd,
! 2003: "traceroute ip WORD",
! 2004: "Trace route to destination\n"
! 2005: "IP trace\n"
! 2006: "Trace route to destination address or hostname\n")
! 2007:
! 2008: #ifdef HAVE_IPV6
! 2009: DEFUN (vtysh_ping6,
! 2010: vtysh_ping6_cmd,
! 2011: "ping ipv6 WORD",
! 2012: "Send echo messages\n"
! 2013: "IPv6 echo\n"
! 2014: "Ping destination address or hostname\n")
! 2015: {
! 2016: execute_command ("ping6", 1, argv[0], NULL);
! 2017: return CMD_SUCCESS;
! 2018: }
! 2019:
! 2020: DEFUN (vtysh_traceroute6,
! 2021: vtysh_traceroute6_cmd,
! 2022: "traceroute ipv6 WORD",
! 2023: "Trace route to destination\n"
! 2024: "IPv6 trace\n"
! 2025: "Trace route to destination address or hostname\n")
! 2026: {
! 2027: execute_command ("traceroute6", 1, argv[0], NULL);
! 2028: return CMD_SUCCESS;
! 2029: }
! 2030: #endif
! 2031:
! 2032: DEFUN (vtysh_telnet,
! 2033: vtysh_telnet_cmd,
! 2034: "telnet WORD",
! 2035: "Open a telnet connection\n"
! 2036: "IP address or hostname of a remote system\n")
! 2037: {
! 2038: execute_command ("telnet", 1, argv[0], NULL);
! 2039: return CMD_SUCCESS;
! 2040: }
! 2041:
! 2042: DEFUN (vtysh_telnet_port,
! 2043: vtysh_telnet_port_cmd,
! 2044: "telnet WORD PORT",
! 2045: "Open a telnet connection\n"
! 2046: "IP address or hostname of a remote system\n"
! 2047: "TCP Port number\n")
! 2048: {
! 2049: execute_command ("telnet", 2, argv[0], argv[1]);
! 2050: return CMD_SUCCESS;
! 2051: }
! 2052:
! 2053: DEFUN (vtysh_ssh,
! 2054: vtysh_ssh_cmd,
! 2055: "ssh WORD",
! 2056: "Open an ssh connection\n"
! 2057: "[user@]host\n")
! 2058: {
! 2059: execute_command ("ssh", 1, argv[0], NULL);
! 2060: return CMD_SUCCESS;
! 2061: }
! 2062:
! 2063: DEFUN (vtysh_start_shell,
! 2064: vtysh_start_shell_cmd,
! 2065: "start-shell",
! 2066: "Start UNIX shell\n")
! 2067: {
! 2068: execute_command ("sh", 0, NULL, NULL);
! 2069: return CMD_SUCCESS;
! 2070: }
! 2071:
! 2072: DEFUN (vtysh_start_bash,
! 2073: vtysh_start_bash_cmd,
! 2074: "start-shell bash",
! 2075: "Start UNIX shell\n"
! 2076: "Start bash\n")
! 2077: {
! 2078: execute_command ("bash", 0, NULL, NULL);
! 2079: return CMD_SUCCESS;
! 2080: }
! 2081:
! 2082: DEFUN (vtysh_start_zsh,
! 2083: vtysh_start_zsh_cmd,
! 2084: "start-shell zsh",
! 2085: "Start UNIX shell\n"
! 2086: "Start Z shell\n")
! 2087: {
! 2088: execute_command ("zsh", 0, NULL, NULL);
! 2089: return CMD_SUCCESS;
! 2090: }
! 2091:
! 2092: static void
! 2093: vtysh_install_default (enum node_type node)
! 2094: {
! 2095: install_element (node, &config_list_cmd);
! 2096: }
! 2097:
! 2098: /* Making connection to protocol daemon. */
! 2099: static int
! 2100: vtysh_connect (struct vtysh_client *vclient)
! 2101: {
! 2102: int ret;
! 2103: int sock, len;
! 2104: struct sockaddr_un addr;
! 2105: struct stat s_stat;
! 2106:
! 2107: /* Stat socket to see if we have permission to access it. */
! 2108: ret = stat (vclient->path, &s_stat);
! 2109: if (ret < 0 && errno != ENOENT)
! 2110: {
! 2111: fprintf (stderr, "vtysh_connect(%s): stat = %s\n",
! 2112: vclient->path, safe_strerror(errno));
! 2113: exit(1);
! 2114: }
! 2115:
! 2116: if (ret >= 0)
! 2117: {
! 2118: if (! S_ISSOCK(s_stat.st_mode))
! 2119: {
! 2120: fprintf (stderr, "vtysh_connect(%s): Not a socket\n",
! 2121: vclient->path);
! 2122: exit (1);
! 2123: }
! 2124:
! 2125: }
! 2126:
! 2127: sock = socket (AF_UNIX, SOCK_STREAM, 0);
! 2128: if (sock < 0)
! 2129: {
! 2130: #ifdef DEBUG
! 2131: fprintf(stderr, "vtysh_connect(%s): socket = %s\n", vclient->path,
! 2132: safe_strerror(errno));
! 2133: #endif /* DEBUG */
! 2134: return -1;
! 2135: }
! 2136:
! 2137: memset (&addr, 0, sizeof (struct sockaddr_un));
! 2138: addr.sun_family = AF_UNIX;
! 2139: strncpy (addr.sun_path, vclient->path, strlen (vclient->path));
! 2140: #ifdef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN
! 2141: len = addr.sun_len = SUN_LEN(&addr);
! 2142: #else
! 2143: len = sizeof (addr.sun_family) + strlen (addr.sun_path);
! 2144: #endif /* HAVE_STRUCT_SOCKADDR_UN_SUN_LEN */
! 2145:
! 2146: ret = connect (sock, (struct sockaddr *) &addr, len);
! 2147: if (ret < 0)
! 2148: {
! 2149: #ifdef DEBUG
! 2150: fprintf(stderr, "vtysh_connect(%s): connect = %s\n", vclient->path,
! 2151: safe_strerror(errno));
! 2152: #endif /* DEBUG */
! 2153: close (sock);
! 2154: return -1;
! 2155: }
! 2156: vclient->fd = sock;
! 2157:
! 2158: return 0;
! 2159: }
! 2160:
! 2161: int
! 2162: vtysh_connect_all(const char *daemon_name)
! 2163: {
! 2164: u_int i;
! 2165: int rc = 0;
! 2166: int matches = 0;
! 2167:
! 2168: for (i = 0; i < VTYSH_INDEX_MAX; i++)
! 2169: {
! 2170: if (!daemon_name || !strcmp(daemon_name, vtysh_client[i].name))
! 2171: {
! 2172: matches++;
! 2173: if (vtysh_connect(&vtysh_client[i]) == 0)
! 2174: rc++;
! 2175: /* We need direct access to ripd in vtysh_exit_ripd_only. */
! 2176: if (vtysh_client[i].flag == VTYSH_RIPD)
! 2177: ripd_client = &vtysh_client[i];
! 2178: }
! 2179: }
! 2180: if (!matches)
! 2181: fprintf(stderr, "Error: no daemons match name %s!\n", daemon_name);
! 2182: return rc;
! 2183: }
! 2184:
! 2185: /* To disable readline's filename completion. */
! 2186: static char *
! 2187: vtysh_completion_entry_function (const char *ignore, int invoking_key)
! 2188: {
! 2189: return NULL;
! 2190: }
! 2191:
! 2192: void
! 2193: vtysh_readline_init (void)
! 2194: {
! 2195: /* readline related settings. */
! 2196: rl_bind_key ('?', (Function *) vtysh_rl_describe);
! 2197: rl_completion_entry_function = vtysh_completion_entry_function;
! 2198: rl_attempted_completion_function = (CPPFunction *)new_completion;
! 2199: /* do not append space after completion. It will be appended
! 2200: * in new_completion() function explicitly. */
! 2201: rl_completion_append_character = '\0';
! 2202: }
! 2203:
! 2204: char *
! 2205: vtysh_prompt (void)
! 2206: {
! 2207: static struct utsname names;
! 2208: static char buf[100];
! 2209: const char*hostname;
! 2210: extern struct host host;
! 2211:
! 2212: hostname = host.name;
! 2213:
! 2214: if (!hostname)
! 2215: {
! 2216: if (!names.nodename[0])
! 2217: uname (&names);
! 2218: hostname = names.nodename;
! 2219: }
! 2220:
! 2221: snprintf (buf, sizeof buf, cmd_prompt (vty->node), hostname);
! 2222:
! 2223: return buf;
! 2224: }
! 2225:
! 2226: void
! 2227: vtysh_init_vty (void)
! 2228: {
! 2229: /* Make vty structure. */
! 2230: vty = vty_new ();
! 2231: vty->type = VTY_SHELL;
! 2232: vty->node = VIEW_NODE;
! 2233:
! 2234: /* Initialize commands. */
! 2235: cmd_init (0);
! 2236:
! 2237: /* Install nodes. */
! 2238: install_node (&bgp_node, NULL);
! 2239: install_node (&rip_node, NULL);
! 2240: install_node (&interface_node, NULL);
! 2241: install_node (&rmap_node, NULL);
! 2242: install_node (&zebra_node, NULL);
! 2243: install_node (&bgp_vpnv4_node, NULL);
! 2244: install_node (&bgp_ipv4_node, NULL);
! 2245: install_node (&bgp_ipv4m_node, NULL);
! 2246: /* #ifdef HAVE_IPV6 */
! 2247: install_node (&bgp_ipv6_node, NULL);
! 2248: install_node (&bgp_ipv6m_node, NULL);
! 2249: /* #endif */
! 2250: install_node (&ospf_node, NULL);
! 2251: /* #ifdef HAVE_IPV6 */
! 2252: install_node (&ripng_node, NULL);
! 2253: install_node (&ospf6_node, NULL);
! 2254: /* #endif */
! 2255: install_node (&keychain_node, NULL);
! 2256: install_node (&keychain_key_node, NULL);
! 2257: install_node (&isis_node, NULL);
! 2258: install_node (&vty_node, NULL);
! 2259:
! 2260: vtysh_install_default (VIEW_NODE);
! 2261: vtysh_install_default (ENABLE_NODE);
! 2262: vtysh_install_default (CONFIG_NODE);
! 2263: vtysh_install_default (BGP_NODE);
! 2264: vtysh_install_default (RIP_NODE);
! 2265: vtysh_install_default (INTERFACE_NODE);
! 2266: vtysh_install_default (RMAP_NODE);
! 2267: vtysh_install_default (ZEBRA_NODE);
! 2268: vtysh_install_default (BGP_VPNV4_NODE);
! 2269: vtysh_install_default (BGP_IPV4_NODE);
! 2270: vtysh_install_default (BGP_IPV4M_NODE);
! 2271: vtysh_install_default (BGP_IPV6_NODE);
! 2272: vtysh_install_default (BGP_IPV6M_NODE);
! 2273: vtysh_install_default (OSPF_NODE);
! 2274: vtysh_install_default (RIPNG_NODE);
! 2275: vtysh_install_default (OSPF6_NODE);
! 2276: vtysh_install_default (ISIS_NODE);
! 2277: vtysh_install_default (KEYCHAIN_NODE);
! 2278: vtysh_install_default (KEYCHAIN_KEY_NODE);
! 2279: vtysh_install_default (VTY_NODE);
! 2280:
! 2281: install_element (VIEW_NODE, &vtysh_enable_cmd);
! 2282: install_element (ENABLE_NODE, &vtysh_config_terminal_cmd);
! 2283: install_element (ENABLE_NODE, &vtysh_disable_cmd);
! 2284:
! 2285: /* "exit" command. */
! 2286: install_element (VIEW_NODE, &vtysh_exit_all_cmd);
! 2287: install_element (VIEW_NODE, &vtysh_quit_all_cmd);
! 2288: install_element (CONFIG_NODE, &vtysh_exit_all_cmd);
! 2289: /* install_element (CONFIG_NODE, &vtysh_quit_all_cmd); */
! 2290: install_element (ENABLE_NODE, &vtysh_exit_all_cmd);
! 2291: install_element (ENABLE_NODE, &vtysh_quit_all_cmd);
! 2292: install_element (RIP_NODE, &vtysh_exit_ripd_cmd);
! 2293: install_element (RIP_NODE, &vtysh_quit_ripd_cmd);
! 2294: install_element (RIPNG_NODE, &vtysh_exit_ripngd_cmd);
! 2295: install_element (RIPNG_NODE, &vtysh_quit_ripngd_cmd);
! 2296: install_element (OSPF_NODE, &vtysh_exit_ospfd_cmd);
! 2297: install_element (OSPF_NODE, &vtysh_quit_ospfd_cmd);
! 2298: install_element (OSPF6_NODE, &vtysh_exit_ospf6d_cmd);
! 2299: install_element (OSPF6_NODE, &vtysh_quit_ospf6d_cmd);
! 2300: install_element (BGP_NODE, &vtysh_exit_bgpd_cmd);
! 2301: install_element (BGP_NODE, &vtysh_quit_bgpd_cmd);
! 2302: install_element (BGP_VPNV4_NODE, &vtysh_exit_bgpd_cmd);
! 2303: install_element (BGP_VPNV4_NODE, &vtysh_quit_bgpd_cmd);
! 2304: install_element (BGP_IPV4_NODE, &vtysh_exit_bgpd_cmd);
! 2305: install_element (BGP_IPV4_NODE, &vtysh_quit_bgpd_cmd);
! 2306: install_element (BGP_IPV4M_NODE, &vtysh_exit_bgpd_cmd);
! 2307: install_element (BGP_IPV4M_NODE, &vtysh_quit_bgpd_cmd);
! 2308: install_element (BGP_IPV6_NODE, &vtysh_exit_bgpd_cmd);
! 2309: install_element (BGP_IPV6_NODE, &vtysh_quit_bgpd_cmd);
! 2310: install_element (BGP_IPV6M_NODE, &vtysh_exit_bgpd_cmd);
! 2311: install_element (BGP_IPV6M_NODE, &vtysh_quit_bgpd_cmd);
! 2312: install_element (ISIS_NODE, &vtysh_exit_isisd_cmd);
! 2313: install_element (ISIS_NODE, &vtysh_quit_isisd_cmd);
! 2314: install_element (KEYCHAIN_NODE, &vtysh_exit_ripd_cmd);
! 2315: install_element (KEYCHAIN_NODE, &vtysh_quit_ripd_cmd);
! 2316: install_element (KEYCHAIN_KEY_NODE, &vtysh_exit_ripd_cmd);
! 2317: install_element (KEYCHAIN_KEY_NODE, &vtysh_quit_ripd_cmd);
! 2318: install_element (RMAP_NODE, &vtysh_exit_rmap_cmd);
! 2319: install_element (RMAP_NODE, &vtysh_quit_rmap_cmd);
! 2320: install_element (VTY_NODE, &vtysh_exit_line_vty_cmd);
! 2321: install_element (VTY_NODE, &vtysh_quit_line_vty_cmd);
! 2322:
! 2323: /* "end" command. */
! 2324: install_element (CONFIG_NODE, &vtysh_end_all_cmd);
! 2325: install_element (ENABLE_NODE, &vtysh_end_all_cmd);
! 2326: install_element (RIP_NODE, &vtysh_end_all_cmd);
! 2327: install_element (RIPNG_NODE, &vtysh_end_all_cmd);
! 2328: install_element (OSPF_NODE, &vtysh_end_all_cmd);
! 2329: install_element (OSPF6_NODE, &vtysh_end_all_cmd);
! 2330: install_element (BGP_NODE, &vtysh_end_all_cmd);
! 2331: install_element (BGP_IPV4_NODE, &vtysh_end_all_cmd);
! 2332: install_element (BGP_IPV4M_NODE, &vtysh_end_all_cmd);
! 2333: install_element (BGP_VPNV4_NODE, &vtysh_end_all_cmd);
! 2334: install_element (BGP_IPV6_NODE, &vtysh_end_all_cmd);
! 2335: install_element (BGP_IPV6M_NODE, &vtysh_end_all_cmd);
! 2336: install_element (ISIS_NODE, &vtysh_end_all_cmd);
! 2337: install_element (KEYCHAIN_NODE, &vtysh_end_all_cmd);
! 2338: install_element (KEYCHAIN_KEY_NODE, &vtysh_end_all_cmd);
! 2339: install_element (RMAP_NODE, &vtysh_end_all_cmd);
! 2340: install_element (VTY_NODE, &vtysh_end_all_cmd);
! 2341:
! 2342: install_element (INTERFACE_NODE, &interface_desc_cmd);
! 2343: install_element (INTERFACE_NODE, &no_interface_desc_cmd);
! 2344: install_element (INTERFACE_NODE, &vtysh_end_all_cmd);
! 2345: install_element (INTERFACE_NODE, &vtysh_exit_interface_cmd);
! 2346: install_element (INTERFACE_NODE, &vtysh_quit_interface_cmd);
! 2347: install_element (CONFIG_NODE, &router_rip_cmd);
! 2348: #ifdef HAVE_IPV6
! 2349: install_element (CONFIG_NODE, &router_ripng_cmd);
! 2350: #endif
! 2351: install_element (CONFIG_NODE, &router_ospf_cmd);
! 2352: #ifdef HAVE_IPV6
! 2353: install_element (CONFIG_NODE, &router_ospf6_cmd);
! 2354: #endif
! 2355: install_element (CONFIG_NODE, &router_isis_cmd);
! 2356: install_element (CONFIG_NODE, &router_bgp_cmd);
! 2357: install_element (CONFIG_NODE, &router_bgp_view_cmd);
! 2358: install_element (BGP_NODE, &address_family_vpnv4_cmd);
! 2359: install_element (BGP_NODE, &address_family_vpnv4_unicast_cmd);
! 2360: install_element (BGP_NODE, &address_family_ipv4_unicast_cmd);
! 2361: install_element (BGP_NODE, &address_family_ipv4_multicast_cmd);
! 2362: #ifdef HAVE_IPV6
! 2363: install_element (BGP_NODE, &address_family_ipv6_cmd);
! 2364: install_element (BGP_NODE, &address_family_ipv6_unicast_cmd);
! 2365: #endif
! 2366: install_element (BGP_VPNV4_NODE, &exit_address_family_cmd);
! 2367: install_element (BGP_IPV4_NODE, &exit_address_family_cmd);
! 2368: install_element (BGP_IPV4M_NODE, &exit_address_family_cmd);
! 2369: install_element (BGP_IPV6_NODE, &exit_address_family_cmd);
! 2370: install_element (BGP_IPV6M_NODE, &exit_address_family_cmd);
! 2371: install_element (CONFIG_NODE, &key_chain_cmd);
! 2372: install_element (CONFIG_NODE, &route_map_cmd);
! 2373: install_element (CONFIG_NODE, &vtysh_line_vty_cmd);
! 2374: install_element (KEYCHAIN_NODE, &key_cmd);
! 2375: install_element (KEYCHAIN_NODE, &key_chain_cmd);
! 2376: install_element (KEYCHAIN_KEY_NODE, &key_chain_cmd);
! 2377: install_element (CONFIG_NODE, &vtysh_interface_cmd);
! 2378: install_element (CONFIG_NODE, &vtysh_no_interface_cmd);
! 2379: install_element (ENABLE_NODE, &vtysh_show_running_config_cmd);
! 2380: install_element (ENABLE_NODE, &vtysh_copy_runningconfig_startupconfig_cmd);
! 2381: install_element (ENABLE_NODE, &vtysh_write_file_cmd);
! 2382: install_element (ENABLE_NODE, &vtysh_write_cmd);
! 2383:
! 2384: /* "write terminal" command. */
! 2385: install_element (ENABLE_NODE, &vtysh_write_terminal_cmd);
! 2386:
! 2387: install_element (CONFIG_NODE, &vtysh_integrated_config_cmd);
! 2388: install_element (CONFIG_NODE, &no_vtysh_integrated_config_cmd);
! 2389:
! 2390: /* "write memory" command. */
! 2391: install_element (ENABLE_NODE, &vtysh_write_memory_cmd);
! 2392:
! 2393: install_element (VIEW_NODE, &vtysh_terminal_length_cmd);
! 2394: install_element (ENABLE_NODE, &vtysh_terminal_length_cmd);
! 2395: install_element (VIEW_NODE, &vtysh_terminal_no_length_cmd);
! 2396: install_element (ENABLE_NODE, &vtysh_terminal_no_length_cmd);
! 2397: install_element (VIEW_NODE, &vtysh_show_daemons_cmd);
! 2398: install_element (ENABLE_NODE, &vtysh_show_daemons_cmd);
! 2399:
! 2400: install_element (VIEW_NODE, &vtysh_ping_cmd);
! 2401: install_element (VIEW_NODE, &vtysh_ping_ip_cmd);
! 2402: install_element (VIEW_NODE, &vtysh_traceroute_cmd);
! 2403: install_element (VIEW_NODE, &vtysh_traceroute_ip_cmd);
! 2404: #ifdef HAVE_IPV6
! 2405: install_element (VIEW_NODE, &vtysh_ping6_cmd);
! 2406: install_element (VIEW_NODE, &vtysh_traceroute6_cmd);
! 2407: #endif
! 2408: install_element (VIEW_NODE, &vtysh_telnet_cmd);
! 2409: install_element (VIEW_NODE, &vtysh_telnet_port_cmd);
! 2410: install_element (VIEW_NODE, &vtysh_ssh_cmd);
! 2411: install_element (ENABLE_NODE, &vtysh_ping_cmd);
! 2412: install_element (ENABLE_NODE, &vtysh_ping_ip_cmd);
! 2413: install_element (ENABLE_NODE, &vtysh_traceroute_cmd);
! 2414: install_element (ENABLE_NODE, &vtysh_traceroute_ip_cmd);
! 2415: #ifdef HAVE_IPV6
! 2416: install_element (ENABLE_NODE, &vtysh_ping6_cmd);
! 2417: install_element (ENABLE_NODE, &vtysh_traceroute6_cmd);
! 2418: #endif
! 2419: install_element (ENABLE_NODE, &vtysh_telnet_cmd);
! 2420: install_element (ENABLE_NODE, &vtysh_telnet_port_cmd);
! 2421: install_element (ENABLE_NODE, &vtysh_ssh_cmd);
! 2422: install_element (ENABLE_NODE, &vtysh_start_shell_cmd);
! 2423: install_element (ENABLE_NODE, &vtysh_start_bash_cmd);
! 2424: install_element (ENABLE_NODE, &vtysh_start_zsh_cmd);
! 2425:
! 2426: install_element (VIEW_NODE, &vtysh_show_memory_cmd);
! 2427: install_element (ENABLE_NODE, &vtysh_show_memory_cmd);
! 2428:
! 2429: /* Logging */
! 2430: install_element (ENABLE_NODE, &vtysh_show_logging_cmd);
! 2431: install_element (VIEW_NODE, &vtysh_show_logging_cmd);
! 2432: install_element (CONFIG_NODE, &vtysh_log_stdout_cmd);
! 2433: install_element (CONFIG_NODE, &vtysh_log_stdout_level_cmd);
! 2434: install_element (CONFIG_NODE, &no_vtysh_log_stdout_cmd);
! 2435: install_element (CONFIG_NODE, &vtysh_log_file_cmd);
! 2436: install_element (CONFIG_NODE, &vtysh_log_file_level_cmd);
! 2437: install_element (CONFIG_NODE, &no_vtysh_log_file_cmd);
! 2438: install_element (CONFIG_NODE, &no_vtysh_log_file_level_cmd);
! 2439: install_element (CONFIG_NODE, &vtysh_log_monitor_cmd);
! 2440: install_element (CONFIG_NODE, &vtysh_log_monitor_level_cmd);
! 2441: install_element (CONFIG_NODE, &no_vtysh_log_monitor_cmd);
! 2442: install_element (CONFIG_NODE, &vtysh_log_syslog_cmd);
! 2443: install_element (CONFIG_NODE, &vtysh_log_syslog_level_cmd);
! 2444: install_element (CONFIG_NODE, &no_vtysh_log_syslog_cmd);
! 2445: install_element (CONFIG_NODE, &vtysh_log_trap_cmd);
! 2446: install_element (CONFIG_NODE, &no_vtysh_log_trap_cmd);
! 2447: install_element (CONFIG_NODE, &vtysh_log_facility_cmd);
! 2448: install_element (CONFIG_NODE, &no_vtysh_log_facility_cmd);
! 2449: install_element (CONFIG_NODE, &vtysh_log_record_priority_cmd);
! 2450: install_element (CONFIG_NODE, &no_vtysh_log_record_priority_cmd);
! 2451: install_element (CONFIG_NODE, &vtysh_log_timestamp_precision_cmd);
! 2452: install_element (CONFIG_NODE, &no_vtysh_log_timestamp_precision_cmd);
! 2453:
! 2454: install_element (CONFIG_NODE, &vtysh_service_password_encrypt_cmd);
! 2455: install_element (CONFIG_NODE, &no_vtysh_service_password_encrypt_cmd);
! 2456:
! 2457: install_element (CONFIG_NODE, &vtysh_password_cmd);
! 2458: install_element (CONFIG_NODE, &vtysh_password_text_cmd);
! 2459: install_element (CONFIG_NODE, &vtysh_enable_password_cmd);
! 2460: install_element (CONFIG_NODE, &vtysh_enable_password_text_cmd);
! 2461: install_element (CONFIG_NODE, &no_vtysh_enable_password_cmd);
! 2462:
! 2463: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>