]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/libfrr.c
Merge pull request #5793 from ton31337/fix/formatting_show_bgp_summary_failed
[mirror_frr.git] / lib / libfrr.c
index 5f292c989c16be7e0a94e5f8bbee30710d87d679..4fb43edff28e3d88b431d173313ad35fab2961d9 100644 (file)
@@ -43,6 +43,7 @@
 #include "debug.h"
 #include "frrcu.h"
 #include "frr_pthread.h"
+#include "defaults.h"
 
 DEFINE_HOOK(frr_late_init, (struct thread_master * tm), (tm))
 DEFINE_KOOH(frr_early_fini, (), ())
@@ -104,6 +105,7 @@ static const struct option lo_always[] = {
        {"version", no_argument, NULL, 'v'},
        {"daemon", no_argument, NULL, 'd'},
        {"module", no_argument, NULL, 'M'},
+       {"profile", required_argument, NULL, 'F'},
        {"vty_socket", required_argument, NULL, OPTION_VTYSOCK},
        {"moduledir", required_argument, NULL, OPTION_MODULEDIR},
        {"log", required_argument, NULL, OPTION_LOG},
@@ -112,11 +114,12 @@ static const struct option lo_always[] = {
        {"command-log-always", no_argument, NULL, OPTION_LOGGING},
        {NULL}};
 static const struct optspec os_always = {
-       "hvdM:",
+       "hvdM:F:",
        "  -h, --help         Display this help and exit\n"
        "  -v, --version      Print program version\n"
        "  -d, --daemon       Runs in daemon mode\n"
        "  -M, --module       Load specified module\n"
+       "  -F, --profile      Use specified configuration profile\n"
        "      --vty_socket   Override vty socket path\n"
        "      --moduledir    Override modules directory\n"
        "      --log          Set Logging to stdout, syslog, or file:<name>\n"
@@ -175,7 +178,6 @@ static const struct optspec os_user = {"u:g:",
                                       "  -g, --group        Group to run as\n",
                                       lo_user};
 
-
 bool frr_zclient_addr(struct sockaddr_storage *sa, socklen_t *sa_len,
                      const char *path)
 {
@@ -390,6 +392,32 @@ static int frr_opt(int opt)
                *modnext = oc;
                modnext = &oc->next;
                break;
+       case 'F':
+               if (!frr_defaults_profile_valid(optarg)) {
+                       const char **p;
+                       FILE *ofd = stderr;
+
+                       if (!strcmp(optarg, "help"))
+                               ofd = stdout;
+                       else
+                               fprintf(stderr,
+                                       "The \"%s\" configuration profile is not valid for this FRR version.\n",
+                                       optarg);
+
+                       fprintf(ofd, "Available profiles are:\n");
+                       for (p = frr_defaults_profiles; *p; p++)
+                               fprintf(ofd, "%s%s\n",
+                                       strcmp(*p, DFLT_NAME) ? "   " : " * ",
+                                       *p);
+
+                       if (ofd == stdout)
+                               exit(0);
+                       fprintf(ofd, "\n");
+                       errors++;
+                       break;
+               }
+               frr_defaults_profile_set(optarg);
+               break;
        case 'i':
                if (di->flags & FRR_NO_CFG_PID_DRY)
                        return 1;
@@ -608,6 +636,7 @@ struct thread_master *frr_init(void)
        dir = di->module_path ? di->module_path : frr_moduledir;
 
        srandom(time(NULL));
+       frr_defaults_apply();
 
        if (di->instance) {
                snprintf(frr_protonameinst, sizeof(frr_protonameinst), "%s[%u]",