diff options
| author | Donald Sharp <sharpd@cumulusnetworks.com> | 2017-03-08 07:38:21 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-03-08 07:38:21 -0500 |
| commit | 790c77ed025f2d71d0aed1f0183bbedbbc1799e6 (patch) | |
| tree | 08ce899248d37a102c3be14136ec7103c59b37a8 /zebra/main.c | |
| parent | ae6ba9ba043652bde3b0000f5299eff31d351ee3 (diff) | |
| parent | 2fcc7988ea09b8505c0fbf134ecffe98e4c026b6 (diff) | |
Merge pull request #261 from opensourcerouting/lib_cleanup
startup, option parsing & logging refactor
Diffstat (limited to 'zebra/main.c')
| -rw-r--r-- | zebra/main.c | 213 |
1 files changed, 41 insertions, 172 deletions
diff --git a/zebra/main.c b/zebra/main.c index b72ce84cd6..b70ce7eda7 100644 --- a/zebra/main.c +++ b/zebra/main.c @@ -35,7 +35,7 @@ #include "privs.h" #include "sigevent.h" #include "vrf.h" -#include "sockopt.h" +#include "libfrr.h" #include "zebra/rib.h" #include "zebra/zserv.h" @@ -60,9 +60,6 @@ struct zebra_t zebrad = /* process id. */ pid_t pid; -/* VTY Socket prefix */ -char vty_sock_path[MAXPATHLEN] = ZEBRA_VTYSH_PATH; - /* Pacify zclient.o in libfrr, which expects this variable. */ struct thread_master *master; @@ -81,30 +78,18 @@ u_int32_t nl_rcvbufsize = 4194304; #endif /* HAVE_NETLINK */ /* Command line options. */ -#define OPTION_VTYSOCK 1000 struct option longopts[] = { { "batch", no_argument, NULL, 'b'}, - { "daemon", no_argument, NULL, 'd'}, { "allow_delete", no_argument, NULL, 'a'}, { "keep_kernel", no_argument, NULL, 'k'}, { "fpm_format", required_argument, NULL, 'F'}, - { "config_file", required_argument, NULL, 'f'}, - { "pid_file", required_argument, NULL, 'i'}, { "socket", required_argument, NULL, 'z'}, - { "help", no_argument, NULL, 'h'}, - { "vty_addr", required_argument, NULL, 'A'}, - { "vty_port", required_argument, NULL, 'P'}, - { "vty_socket", required_argument, NULL, OPTION_VTYSOCK }, { "ecmp", required_argument, NULL, 'e'}, { "retain", no_argument, NULL, 'r'}, - { "dryrun", no_argument, NULL, 'C'}, #ifdef HAVE_NETLINK { "nl-bufsize", required_argument, NULL, 's'}, #endif /* HAVE_NETLINK */ - { "user", required_argument, NULL, 'u'}, - { "group", required_argument, NULL, 'g'}, - { "version", no_argument, NULL, 'v'}, { 0 } }; @@ -130,54 +115,8 @@ struct zebra_privs_t zserv_privs = .cap_num_i = 0 }; -/* Default configuration file path. */ -char config_default[] = SYSCONFDIR DEFAULT_CONFIG_FILE; - -/* Process ID saved for use by init system */ -const char *pid_file = PATH_ZEBRA_PID; - unsigned int multipath_num = MULTIPATH_NUM; -/* Help information display. */ -static void -usage (char *progname, int status) -{ - if (status != 0) - fprintf (stderr, "Try `%s --help' for more information.\n", progname); - else - { - printf ("Usage : %s [OPTION...]\n\n"\ - "Daemon which manages kernel routing table management and "\ - "redistribution between different routing protocols.\n\n"\ - "-b, --batch Runs in batch mode\n"\ - "-d, --daemon Runs in daemon mode\n"\ - "-a, --allow_delete Allow other processes to delete Quagga Routes\n" \ - "-f, --config_file Set configuration file name\n"\ - "-F, --fpm_format Set fpm format to 'netlink' or 'protobuf'\n"\ - "-i, --pid_file Set process identifier file name\n"\ - "-z, --socket Set path of zebra socket\n"\ - "-k, --keep_kernel Don't delete old routes which installed by "\ - "zebra.\n"\ - "-C, --dryrun Check configuration for validity and exit\n"\ - "-A, --vty_addr Set vty's bind address\n"\ - "-P, --vty_port Set vty's port number\n"\ - " --vty_socket Override vty socket path\n"\ - "-r, --retain When program terminates, retain added route "\ - "by zebra.\n"\ - "-u, --user User to run as\n"\ - "-g, --group Group to run as\n", progname); -#ifdef HAVE_NETLINK - printf ("-s, --nl-bufsize Set netlink receive buffer size\n"); -#endif /* HAVE_NETLINK */ - printf ("-v, --version Print program version\n"\ - "-h, --help Display this help and exit\n"\ - "\n"\ - "Report bugs to %s\n", FRR_BUG_ADDRESS); - } - - exit (status); -} - /* SIGHUP handler. */ static void sighup (void) @@ -229,8 +168,7 @@ sigint (void) work_queue_free (zebrad.lsp_process_q); meta_queue_free (zebrad.mq); thread_master_free (zebrad.master); - if (zlog_default) - closezlog (zlog_default); + closezlog (); exit (0); } @@ -239,7 +177,7 @@ sigint (void) static void sigusr1 (void) { - zlog_rotate (NULL); + zlog_rotate(); } struct quagga_signal_t zebra_signals[] = @@ -262,44 +200,49 @@ struct quagga_signal_t zebra_signals[] = }, }; +FRR_DAEMON_INFO(zebra, ZEBRA, + .vty_port = ZEBRA_VTY_PORT, + .flags = FRR_NO_ZCLIENT, + + .proghelp = "Daemon which manages kernel routing table management " + "and\nredistribution between different routing protocols.", + + .signals = zebra_signals, + .n_signals = array_size(zebra_signals), + + .privs = &zserv_privs, +) + /* Main startup routine. */ int main (int argc, char **argv) { - char *p; - char *vty_addr = NULL; - int vty_port = ZEBRA_VTY_PORT; - int dryrun = 0; - int batch_mode = 0; - int daemon_mode = 0; - char *config_file = NULL; - char *progname; - struct thread thread; + // int batch_mode = 0; char *zserv_path = NULL; char *fpm_format = NULL; - /* Set umask before anything for security */ - umask (0027); + frr_preinit(&zebra_di, argc, argv); - /* preserve my name */ - progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]); - - zlog_default = openzlog (progname, ZLOG_ZEBRA, 0, - LOG_CONS|LOG_NDELAY|LOG_PID, LOG_DAEMON); - zprivs_init (&zserv_privs); -#if defined(HAVE_CUMULUS) - zlog_set_level (NULL, ZLOG_DEST_SYSLOG, zlog_default->default_lvl); + frr_opt_add("bakF:z:e:r" +#ifdef HAVE_NETLINK + "s:" #endif + , longopts, + " -b, --batch Runs in batch mode\n" + " -a, --allow_delete Allow other processes to delete Quagga Routes\n" + " -F, --fpm_format Set fpm format to 'netlink' or 'protobuf'\n" + " -z, --socket Set path of zebra socket\n" + " -e, --ecmp Specify ECMP to use.\n" + " -k, --keep_kernel Don't delete old routes which installed by zebra.\n" + " -r, --retain When program terminates, retain added route by zebra.\n" +#ifdef HAVE_NETLINK + " -s, --nl-bufsize Set netlink receive buffer size\n" +#endif /* HAVE_NETLINK */ + ); - while (1) + while (1) { - int opt; - -#ifdef HAVE_NETLINK - opt = getopt_long (argc, argv, "bdakf:F:i:z:hA:P:ru:g:vs:C", longopts, 0); -#else - opt = getopt_long (argc, argv, "bdakf:F:i:z:hA:P:ru:g:vC", longopts, 0); -#endif /* HAVE_NETLINK */ + int opt = frr_getopt(argc, argv, NULL); if (opt == EOF) break; @@ -309,9 +252,7 @@ main (int argc, char **argv) case 0: break; case 'b': - batch_mode = 1; - case 'd': - daemon_mode = 1; + // batch_mode = 1; break; case 'a': allow_delete = 1; @@ -319,18 +260,9 @@ main (int argc, char **argv) case 'k': keep_kernel_mode = 1; break; - case 'C': - dryrun = 1; - break; - case 'f': - config_file = optarg; - break; case 'F': fpm_format = optarg; break; - case 'A': - vty_addr = optarg; - break; case 'e': multipath_num = atoi (optarg); if (multipath_num > MULTIPATH_NUM || multipath_num <= 0) @@ -339,27 +271,9 @@ main (int argc, char **argv) return 1; } break; - case 'i': - pid_file = optarg; - break; case 'z': zserv_path = optarg; break; - case 'P': - /* Deal with atoi() returning 0 on failure, and zebra not - listening on zebra port... */ - if (strcmp(optarg, "0") == 0) - { - vty_port = 0; - break; - } - vty_port = atoi (optarg); - if (vty_port <= 0 || vty_port > 0xffff) - vty_port = ZEBRA_VTY_PORT; - break; - case OPTION_VTYSOCK: - set_socket_path(vty_sock_path, ZEBRA_VTYSH_PATH, optarg, sizeof (vty_sock_path)); - break; case 'r': retain_mode = 1; break; @@ -368,34 +282,14 @@ main (int argc, char **argv) nl_rcvbufsize = atoi (optarg); break; #endif /* HAVE_NETLINK */ - case 'u': - zserv_privs.user = optarg; - break; - case 'g': - zserv_privs.group = optarg; - break; - case 'v': - print_version (progname); - exit (0); - break; - case 'h': - usage (progname, 0); - break; default: - usage (progname, 1); + frr_help_exit (1); break; } } - /* Make master thread emulator. */ - zebrad.master = thread_master_create (); - - /* Vty related initialize. */ - signal_init (zebrad.master, array_size(zebra_signals), zebra_signals); - cmd_init (1); vty_config_lockless (); - vty_init (zebrad.master); - memory_init (); + zebrad.master = frr_init(); /* Zebra related initialize. */ zebra_init (); @@ -443,29 +337,11 @@ main (int argc, char **argv) * The notifications from kernel will show originating PID equal * to that after daemon() completes (if ever called). */ - vty_read_config (config_file, config_default); + frr_config_fork(); - /* Don't start execution if we are in dry-run mode */ - if (dryrun) - return(0); - - /* Clean up rib. */ + /* Clean up rib -- before fork (?) */ /* rib_weed_tables (); */ - /* Exit when zebra is working in batch mode. */ - if (batch_mode) - exit (0); - - /* Daemonize. */ - if (daemon_mode && daemon (0, 0) < 0) - { - zlog_err("Zebra daemon failed: %s", strerror(errno)); - exit (1); - } - - /* Output pid of zebra. */ - pid_output (pid_file); - /* After we have successfully acquired the pidfile, we can be sure * about being the only copy of zebra process, which is submitting * changes to the FIB. @@ -483,14 +359,7 @@ main (int argc, char **argv) /* This must be done only after locking pidfile (bug #403). */ zebra_zserv_socket_init (zserv_path); - /* Make vty server socket. */ - vty_serv_sock (vty_addr, vty_port, vty_sock_path); - - /* Print banner. */ - zlog_notice ("Zebra %s starting: vty@%d", FRR_VERSION, vty_port); - - while (thread_fetch (zebrad.master, &thread)) - thread_call (&thread); + frr_run (zebrad.master); /* Not reached... */ return 0; |
