diff options
Diffstat (limited to 'usr/src/cmd/dumpadm')
| -rw-r--r-- | usr/src/cmd/dumpadm/Makefile | 8 | ||||
| -rw-r--r-- | usr/src/cmd/dumpadm/dconf.c | 39 | ||||
| -rw-r--r-- | usr/src/cmd/dumpadm/dconf.h | 2 | ||||
| -rw-r--r-- | usr/src/cmd/dumpadm/dumpadm.conf | 11 | ||||
| -rw-r--r-- | usr/src/cmd/dumpadm/main.c | 14 | ||||
| -rw-r--r-- | usr/src/cmd/dumpadm/svc-dumpadm | 14 | 
6 files changed, 78 insertions, 10 deletions
| diff --git a/usr/src/cmd/dumpadm/Makefile b/usr/src/cmd/dumpadm/Makefile index e1303c5d0e..c6b80188fa 100644 --- a/usr/src/cmd/dumpadm/Makefile +++ b/usr/src/cmd/dumpadm/Makefile @@ -26,12 +26,12 @@  PROG = dumpadm  MANIFEST = dumpadm.xml  SVCMETHOD= svc-dumpadm +ETCFILES= dumpadm.conf  OBJS = main.o dconf.o minfree.o utils.o swap.o  SRCS = $(OBJS:.o=.c) - -lint := LINTFLAGS = -mx +ROOTETCFILES= $(ETCFILES:%=$(ROOTETC)/%)  include ../Makefile.cmd @@ -52,13 +52,11 @@ $(PROG): $(OBJS)  	$(LINK.c) -o $@ $(OBJS) $(LDLIBS)  	$(POST_PROCESS) -install: all $(ROOTUSRSBINPROG) $(ROOTMANIFEST) $(ROOTSVCMETHOD) +install: all $(ROOTUSRSBINPROG) $(ROOTMANIFEST) $(ROOTSVCMETHOD) $(ROOTETCFILES)  check: $(CHKMANIFEST)  clean:  	$(RM) $(OBJS) -lint: lint_SRCS -  include ../Makefile.targ diff --git a/usr/src/cmd/dumpadm/dconf.c b/usr/src/cmd/dumpadm/dconf.c index dc5355ba48..6e549afaa7 100644 --- a/usr/src/cmd/dumpadm/dconf.c +++ b/usr/src/cmd/dumpadm/dconf.c @@ -28,6 +28,7 @@  #include <sys/stat.h>  #include <sys/swap.h>  #include <sys/dumpadm.h> +#include <sys/dumphdr.h>  #include <sys/utsname.h>  #include <unistd.h> @@ -539,6 +540,42 @@ dconf_get_dumpsize(dumpconf_t *dcp)  	return (0);  } +int +dconf_set_crypt(dumpconf_t *dcp, const char *keyfile) +{ +	int fd; +	uint8_t key[DUMP_CRYPT_KEYLEN]; + +	if ((fd = open(keyfile, O_RDONLY)) == -1) { +		warn(gettext("failed to open %s"), keyfile); +		return (-1); +	} + +	if (read(fd, key, sizeof (key)) != sizeof (key)) { +		warn(gettext("failed to read %d byte key from %s"), +		    DUMP_CRYPT_KEYLEN, keyfile); +		(void) close(fd); +		return (-1); +	} + +	(void) close(fd); + +	if (ioctl(dcp->dc_dump_fd, DIOCSCRYPTKEY, key) == -1) { +		warn(gettext("failed to set encryption key")); +		return (-1); +	} + +	/* +	 * Reload our config flags as they may have changed. +	 */ +	if ((dcp->dc_cflags = ioctl(dcp->dc_dump_fd, DIOCGETCONF, 0)) == -1) { +		warn(gettext("failed to get kernel dump settings")); +		return (-1); +	} + +	return (0); +} +  void  dconf_print(dumpconf_t *dcp, FILE *fp)  { @@ -580,6 +617,8 @@ dconf_print(dumpconf_t *dcp, FILE *fp)  	(void) fprintf(fp, gettext("   Save compressed: %s\n"),  	    (dcp->dc_csave == DC_UNCOMPRESSED) ? gettext("off") :  	    gettext("on")); +	(void) fprintf(fp, gettext("    Dump encrypted: %s\n"), +	    (dcp->dc_cflags & DUMP_ENCRYPT) ? gettext("yes") : gettext("no"));  }  int diff --git a/usr/src/cmd/dumpadm/dconf.h b/usr/src/cmd/dumpadm/dconf.h index 74920f0def..e2f609cee7 100644 --- a/usr/src/cmd/dumpadm/dconf.h +++ b/usr/src/cmd/dumpadm/dconf.h @@ -21,6 +21,7 @@  /*   * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.   * Copyright 2015 Nexenta Systems, Inc. All rights reserved. + * Copyright 2019 Joyent, Inc.   */  #ifndef	_DCONF_H @@ -73,6 +74,7 @@ extern int dconf_update(dumpconf_t *, int);  extern void dconf_print(dumpconf_t *, FILE *);  extern int dconf_write_uuid(dumpconf_t *);  extern int dconf_get_dumpsize(dumpconf_t *); +extern int dconf_set_crypt(dumpconf_t *, const char *);  extern int dconf_str2device(dumpconf_t *, char *);  extern int dconf_str2savdir(dumpconf_t *, char *); diff --git a/usr/src/cmd/dumpadm/dumpadm.conf b/usr/src/cmd/dumpadm/dumpadm.conf new file mode 100644 index 0000000000..804e1da11a --- /dev/null +++ b/usr/src/cmd/dumpadm/dumpadm.conf @@ -0,0 +1,11 @@ +# +# dumpadm.conf +# +# Configuration parameters for system crash dump. +# Do NOT edit this file by hand -- use dumpadm(1m) instead. +# +DUMPADM_DEVICE=/dev/zvol/dsk/zones/dump +DUMPADM_SAVDIR=/var/crash/volatile +DUMPADM_CONTENT=kernel +DUMPADM_ENABLE=no +DUMPADM_CSAVE=on diff --git a/usr/src/cmd/dumpadm/main.c b/usr/src/cmd/dumpadm/main.c index 07a7dd5207..dccafbba33 100644 --- a/usr/src/cmd/dumpadm/main.c +++ b/usr/src/cmd/dumpadm/main.c @@ -21,6 +21,7 @@  /*   * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.   * Copyright 2015 Nexenta Systems, Inc. All rights reserved. + * Copyright 2019 Joyent, Inc.   */  #include <sys/stat.h> @@ -36,10 +37,10 @@  static const char USAGE[] = "\  Usage: %s [-enuy] [-c kernel | curproc | all ]\n\ -	[-d dump-device | swap | none ] [-m min {k|m|%%} ] [-s savecore-dir]\n\ -	[-r root-dir] [-z on|off]\n"; +	[-d dump-device | swap | none ] [-k key-file] [-m min {k|m|%%} ]\n\ +	[-s savecore-dir] [-r root-dir] [-z on|off]\n"; -static const char OPTS[] = "einuyc:d:m:s:r:z:"; +static const char OPTS[] = "einuyc:d:m:s:r:z:k:";  static const char PATH_DEVICE[] = "/dev/dump";  static const char PATH_CONFIG[] = "/etc/dumpadm.conf"; @@ -57,6 +58,7 @@ main(int argc, char *argv[])  	int dcmode = DC_CURRENT;	/* kernel settings override unless -u */  	int modified = 0;		/* have we modified the dump config? */  	char *minfstr = NULL;		/* string value of -m argument */ +	char *keyfile = NULL;		/* key file for -k argument */  	dumpconf_t dc;			/* current configuration */  	int chrooted = 0;  	int douuid = 0; @@ -136,6 +138,9 @@ main(int argc, char *argv[])  				}  				douuid++;  				break; +			case 'k': +				keyfile = optarg; +				break;  			case 'm':  				minfstr = optarg; @@ -191,6 +196,9 @@ main(int argc, char *argv[])  			return (E_ERROR);  	} +	if (keyfile != NULL && dconf_set_crypt(&dc, keyfile) == -1) +		return (E_ERROR); +  	if (dcmode == DC_OVERRIDE) {  		/*  		 * In override mode, we try to force an update.  If this diff --git a/usr/src/cmd/dumpadm/svc-dumpadm b/usr/src/cmd/dumpadm/svc-dumpadm index 316e075754..488ba8d54d 100644 --- a/usr/src/cmd/dumpadm/svc-dumpadm +++ b/usr/src/cmd/dumpadm/svc-dumpadm @@ -21,6 +21,7 @@  #  #  # Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright 2020 Joyent, Inc.  #  . /lib/svc/share/smf_include.sh @@ -100,7 +101,7 @@ fi  # how to modify the dump settings.  #  if [ -x /usr/sbin/dumpadm ]; then -	/usr/sbin/dumpadm -u || $SMF_EXIT_ERR_CONFIG +	/usr/sbin/dumpadm -u || exit $SMF_EXIT_ERR_CONFIG  else  	echo "WARNING: /usr/sbin/dumpadm is missing or not executable" >& 2  	exit $SMF_EXIT_ERR_CONFIG @@ -113,6 +114,11 @@ else  	exit $SMF_EXIT_ERR_CONFIG  fi +if [[ -f $DUMPADM_SAVDIR/keyfile ]]; then +	/usr/sbin/dumpadm -k $DUMPADM_SAVDIR/keyfile || \ +	exit $SMT_EXIT_ERR_CONFIG +fi +  #  # If the savecore executable is absent then we're done  # @@ -147,11 +153,15 @@ if [ "x$DUMPADM_ENABLE" != xno ]; then  		    mksavedir && /usr/bin/savecore $DUMPADM_SAVDIR &  		fi  	else +		keyarg="" +		[[ -f "$DUMPADM_SAVDIR/keyfile" ]] && \ +			keyarg="-k $DUMPADM_SAVDIR/keyfile" +  		#  		# The dump device couldn't have been dedicated before we  		# ran dumpadm, so we must execute savecore again.  		# -		mksavedir && /usr/bin/savecore $DUMPADM_SAVDIR & +		mksavedir && /usr/bin/savecore $keyarg $DUMPADM_SAVDIR &  	fi  else  		# | 
