From f9d3d7e00717073b60e0487a6e901892676f7e2e Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Wed, 28 Sep 2016 11:33:52 -0700 Subject: [PATCH 7/7] Modify dumpon to support netdump configuration An example invocation is: # dumpon -s 10.7.165.133 -g 10.7.160.1 -c 10.7.165.115 em0 --- sbin/dumpon/dumpon.8 | 9 +++++ sbin/dumpon/dumpon.c | 95 +++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 91 insertions(+), 13 deletions(-) diff --git a/sbin/dumpon/dumpon.8 b/sbin/dumpon/dumpon.8 index 6be8090..e4719e7 100644 --- a/sbin/dumpon/dumpon.8 +++ b/sbin/dumpon/dumpon.8 @@ -38,6 +38,12 @@ .Nm .Op Fl v .Ar special_file +.\" Begin Isilon +.Nm +.Op Fl v +.Fl g Ar gateway Fl s Ar server Fl c Ar client +.Ar interface +.\" End Isilon .Nm .Op Fl v .Cm off @@ -136,6 +142,9 @@ boot-time system configuration .Xr rc.conf 5 , .Xr config 8 , .Xr init 8 , +.\" +.Xr netdumpd 8 , +.\" .Xr rc 8 , .Xr savecore 8 , .Xr swapon 8 , diff --git a/sbin/dumpon/dumpon.c b/sbin/dumpon/dumpon.c index b14317b..319e0a3 100644 --- a/sbin/dumpon/dumpon.c +++ b/sbin/dumpon/dumpon.c @@ -56,6 +56,13 @@ __FBSDID("$FreeBSD$"); #include #include +/* Begin Isilon */ +#include +#include +#include +#include +/* End Isilon */ + static int verbose; static void @@ -66,9 +73,10 @@ usage(void) name = getprogname(); fprintf(stderr, "usage: %s [-v] special_file\n" + " %s [-v] -g -s -c \n" " %s [-v] off\n" " %s [-v] -l\n", - name, name, name); + name, name, name, name); /* End Isilon */ exit(EX_USAGE); } @@ -111,11 +119,13 @@ listdumpdev(void) char dumpdev[PATH_MAX]; size_t len; /* Begin Isilon */ + struct netdump_conf ndconf; #ifndef ISI_BINARY const char *sysctlname = "kern.shutdown.dumpdevname"; #else const char *sysctlname = "kern.shutdown.sdumpdevname"; #endif + int fd; /* End Isilon */ len = sizeof(dumpdev); @@ -127,26 +137,46 @@ listdumpdev(void) err(EX_OSERR, "Sysctl get '%s'\n", sysctlname); } } + if (strlen(dumpdev) == 0) + strlcpy(dumpdev, _PATH_DEVNULL, sizeof(dumpdev)); + + /* Begin Isilon */ if (verbose) { - /* Begin Isilon */ printf("kernel " #ifdef ISI_BINARY "stack " #endif "dumps on "); - /* End Isilon */ } - if (strlen(dumpdev) == 0) { - printf("%s\n", _PATH_DEVNULL); - } else { - printf("%s\n", dumpdev); + printf("%s\n", dumpdev); + + /* If netdump is enabled, print the configuration parameters. */ + fd = open(_PATH_NETDUMP, O_RDONLY); + if (fd < 0) { + if (errno != ENOENT) + err(EX_OSERR, "%s", _PATH_NETDUMP); + return; } + if (ioctl(fd, NETDUMPGCONF, &ndconf) != 0) { + if (errno != ENXIO) + err(EX_OSERR, "ioctl(NETDUMPGCONF)"); + close(fd); + return; + } + + printf("server address %s\n", inet_ntoa(ndconf.ndc_server)); + printf("client address %s\n", inet_ntoa(ndconf.ndc_client)); + printf("gateway address %s\n", inet_ntoa(ndconf.ndc_gateway)); + close(fd); + /* End Isilon */ } int main(int argc, char *argv[]) { /* Begin Isilon */ + struct netdump_conf ndconf; + const char *dev, *server, *client, *gateway; #ifndef ISI_BINARY const u_long cmd = DIOCSKERNELDUMP; #else @@ -158,17 +188,29 @@ main(int argc, char *argv[]) u_int u; int do_listdumpdev = 0; - while ((ch = getopt(argc, argv, "lv")) != -1) - switch((char)ch) { + /* Begin Isilon */ + server = client = gateway = NULL; + while ((ch = getopt(argc, argv, "c:g:s:lv")) != -1) + switch ((char)ch) { + case 'c': + client = optarg; + break; + case 'g': + gateway = optarg; + break; case 'l': do_listdumpdev = 1; break; + case 's': + server = optarg; + break; case 'v': verbose = 1; break; default: usage(); } + /* End Isilon */ argc -= optind; argv += optind; @@ -181,8 +223,33 @@ main(int argc, char *argv[]) if (argc != 1) usage(); - if (strcmp(argv[0], "off") != 0) { - fd = open(argv[0], O_RDONLY); + /* Begin Isilon */ + if (server != NULL && client != NULL && gateway != NULL) + dev = _PATH_NETDUMP; + else if (server == NULL && client == NULL && gateway == NULL) + dev = argv[0]; + else + usage(); + /* End Isilon */ + + if (server != NULL) { + if (strlcpy(ndconf.ndc_iface, argv[0], + sizeof(ndconf.ndc_iface)) >= sizeof(ndconf.ndc_iface)) + errx(1, "invalid interface name '%s'", argv[0]); + if (inet_aton(server, &ndconf.ndc_server) == 0) + errx(1, "invalid server address '%s'", server); + if (inet_aton(client, &ndconf.ndc_client) == 0) + errx(1, "invalid client address '%s'", client); + if (inet_aton(gateway, &ndconf.ndc_gateway) == 0) + errx(1, "invalid gateway address '%s'", gateway); + + fd = open(dev, O_RDONLY); + if (fd < 0) + err(EX_OSFILE, "%s", dev); + if (ioctl(fd, NETDUMPSCONF, &ndconf) != 0) + err(EX_OSERR, "ioctl(NETDUMPSCONF)"); + } else if (strcmp(dev, "off") != 0) { + fd = open(dev, O_RDONLY); if (fd < 0) err(EX_OSFILE, "%s", argv[0]); /* Begin Isilon */ @@ -205,6 +272,8 @@ main(int argc, char *argv[]) #endif "dumps on %s\n", argv[0]); /* End Isilon */ + if (i < 0) + err(EX_OSERR, "ioctl(DIOCSKERNELDUMP)"); } else { fd = open(_PATH_DEVNULL, O_RDONLY); if (fd < 0) @@ -219,9 +288,9 @@ main(int argc, char *argv[]) #endif "dumps disabled\n"); /* End Isilon */ + if (i < 0) + err(EX_OSERR, "ioctl(DIOCSKERNELDUMP)"); } - if (i < 0) - err(EX_OSERR, "ioctl(DIOCSKERNELDUMP)"); exit (0); } -- 2.10.1