18.07.2014 13:24, Jan Friesse wrote: > Vladislav, > patch is almost perfect, but I have one nitpick. Can you please replace > sequence of > > fprintf(stderr, ...) > exit(errno) > > by calling err (err.h, see man errx). This will reduce 2 lines to 1 line > and remove need to call strerror. Yes, but ... CONFORMING TO These functions are nonstandard BSD extensions. ... > > Thanks, > Honza > > >> Allow it to create keyfile not in the hardcoded location. >> Drop root checks. >> Minor cosmetic fixes to the man-page. >> >> Signed-off-by: Vladislav Bogdanov <bubble@xxxxxxxxxxxxx> >> --- >> man/corosync-keygen.8 | 29 +++++++++++++++++--------- >> tools/corosync-keygen.c | 51 >> +++++++++++++++++++++------------------------- >> 2 files changed, 42 insertions(+), 38 deletions(-) >> >> diff --git a/man/corosync-keygen.8 b/man/corosync-keygen.8 >> index 5dc3f45..5aaae93 100644 >> --- a/man/corosync-keygen.8 >> +++ b/man/corosync-keygen.8 >> @@ -35,45 +35,47 @@ >> .SH NAME >> corosync-keygen \- Generate an authentication key for Corosync. >> .SH SYNOPSIS >> -.B "corosync-keygen [\-l]" >> +.B "corosync-keygen [\-k <filename>] [\-l]" >> .SH DESCRIPTION >> >> If you want to configure corosync to use cryptographic techniques to >> ensure authenticity >> -.br >> and privacy of the messages, you will need to generate a private key. >> .PP >> .B corosync-keygen >> -creates this key and writes it to /etc/corosync/authkey. >> +creates this key and writes it to /etc/corosync/authkey or to file >> specified by >> +-k option. >> .PP >> This private key must be copied to every processor in the cluster. >> If the >> -.br >> private key isn't the same for every node, those nodes with >> nonmatching private >> -.br >> keys will not be able to join the same configuration. >> .PP >> Copy the key to some security transportable storage or use ssh to >> transmit the >> -.br >> key from node to node. Then install the key with the command: >> .PP >> unix#: install -D --group=0 --owner=0 --mode=0400 >> /path_to_authkey/authkey /etc/corosync/authkey >> .PP >> If a message "Invalid digest" appears from the corosync executive, >> the keys >> -.br >> are not consistent between processors. >> .PP >> .B Note: corosync-keygen >> will ask for user input to assist in generating entropy unless the >> -l option is used. >> .SH OPTIONS >> .TP >> +.B -k <filename> >> +This specifies the fully qualified path to the shared key to create. >> +.br >> +The default is /etc/corosync/authkey. >> +.TP >> .B -l >> Use a less secure random data source that will not require user >> input to help generate >> -.br >> -entropy. This may be useful when this utility is used from a script. >> +entropy. This may be useful when this utility is used from a script >> or hardware random number >> +generator is not available (f.e. in virtual machine). >> + >> .SH EXAMPLES >> .TP >> Generate the key. >> .PP >> -$ corosync-keygen >> +# corosync-keygen >> .br >> Corosync Cluster Engine Authentication key generator. >> .br >> @@ -81,6 +83,13 @@ Gathering 1024 bits for key from /dev/random. >> .br >> Press keys on your keyboard to generate entropy. >> .br >> +.PP >> +$ corosync-keygen -l -k /tmp/authkey >> +.br >> +Corosync Cluster Engine Authentication key generator. >> +.br >> +Writing corosync key to /tmp/authkey. >> +.br >> .SH SEE ALSO >> .BR corosync_overview (8), >> .BR corosync.conf (5), >> diff --git a/tools/corosync-keygen.c b/tools/corosync-keygen.c >> index 71ea9d8..112ebaf 100644 >> --- a/tools/corosync-keygen.c >> +++ b/tools/corosync-keygen.c >> @@ -40,16 +40,19 @@ >> #include <unistd.h> >> #include <fcntl.h> >> #include <errno.h> >> +#include <string.h> >> #include <getopt.h> >> #include <sys/types.h> >> #include <sys/stat.h> >> >> #include <netinet/in.h> >> >> -#define KEYFILE COROSYSCONFDIR "/authkey" >> +#define DEFAULT_KEYFILE COROSYSCONFDIR "/authkey" >> >> static const char usage[] = >> - "Usage: corosync-keygen [-l]\n" >> + "Usage: corosync-keygen [-k <keyfile>] [-l]\n" >> + " -k / --key-file=<filename> - Write to the specified >> keyfile\n" >> + " instead of the default " DEFAULT_KEYFILE ".\n" >> " -l / --less-secure - Use a less secure random number >> source\n" >> " (/dev/urandom) that is guaranteed not to require >> user\n" >> " input for entropy. This can be used when this\n" >> @@ -60,6 +63,7 @@ int main (int argc, char *argv[]) >> { >> int authkey_fd; >> int random_fd; >> + char *keyfile = NULL; >> unsigned char key[128]; >> ssize_t res; >> ssize_t bytes_read; >> @@ -67,14 +71,18 @@ int main (int argc, char *argv[]) >> int option_index; >> int less_secure = 0; >> static struct option long_options[] = { >> - { "less-secure", no_argument, NULL, 'l' }, >> - { "help", no_argument, NULL, 'h' }, >> - { 0, 0, NULL, 0 }, >> + { "key-file", required_argument, NULL, 'k' }, >> + { "less-secure", no_argument, NULL, 'l' }, >> + { "help", no_argument, NULL, 'h' }, >> + { 0, 0, NULL, 0 }, >> }; >> >> - while ((c = getopt_long (argc, argv, "lh", >> + while ((c = getopt_long (argc, argv, "k:lh", >> long_options, &option_index)) != -1) { >> switch (c) { >> + case 'k': >> + keyfile = optarg; >> + break; >> case 'l': >> less_secure = 1; >> break; >> @@ -89,18 +97,13 @@ int main (int argc, char *argv[]) >> } >> >> printf ("Corosync Cluster Engine Authentication key generator.\n"); >> - if (geteuid() != 0) { >> - printf ("Error: Authorization key must be generated as root >> user.\n"); >> - exit (errno); >> - } >> - if (mkdir (COROSYSCONFDIR, 0700)) { >> - if (errno != EEXIST) { >> - perror ("Failed to create directory: " COROSYSCONFDIR); >> - exit (errno); >> - } >> + >> + if (!keyfile) { >> + keyfile = (char *)DEFAULT_KEYFILE; >> } >> >> if (less_secure) { >> + printf ("Gathering %lu bits for key from /dev/urandom.\n", >> (unsigned long)(sizeof (key) * 8)); >> random_fd = open ("/dev/urandom", O_RDONLY); >> } else { >> printf ("Gathering %lu bits for key from /dev/random.\n", >> (unsigned long)(sizeof (key) * 8)); >> @@ -134,17 +137,9 @@ retry_read: >> /* >> * Open key >> */ >> - authkey_fd = open (KEYFILE, O_CREAT|O_WRONLY, 600); >> + authkey_fd = open (keyfile, O_CREAT|O_WRONLY, 0600); >> if (authkey_fd == -1) { >> - perror ("Could not create " KEYFILE); >> - exit (errno); >> - } >> - /* >> - * Set security of authorization key to uid = 0 gid = 0 mode = 0400 >> - */ >> - res = fchown (authkey_fd, 0, 0); >> - if (res == -1) { >> - perror ("Could not fchown key to uid 0 and gid 0\n"); >> + fprintf (stderr, "Could not create %s: %s", keyfile, >> strerror(errno)); >> exit (errno); >> } >> if (fchmod (authkey_fd, 0400)) { >> @@ -152,19 +147,19 @@ retry_read: >> exit (errno); >> } >> >> - printf ("Writing corosync key to " KEYFILE ".\n"); >> + printf ("Writing corosync key to %s.\n", keyfile); >> >> /* >> * Write key >> */ >> res = write (authkey_fd, key, sizeof (key)); >> if (res != sizeof (key)) { >> - perror ("Could not write " KEYFILE); >> + fprintf (stderr, "Could not write %s: %s", keyfile, >> strerror(errno)); >> exit (errno); >> } >> >> if (close (authkey_fd)) { >> - perror ("Could not write " KEYFILE); >> + fprintf (stderr, "Could not close %s: %s", keyfile, >> strerror(errno)); >> exit (errno); >> } >> >> > _______________________________________________ discuss mailing list discuss@xxxxxxxxxxxx http://lists.corosync.org/mailman/listinfo/discuss