Changed the way iscsiadm displays usage help about its commands. Rather than simply displaying each possible mode along with its options on a single line, the user can now ask help for each mode separately which describes the various options and also provides some examples.
Signed-off-by: Vivek Subbarao <[email protected]> --- open-iscsi/usr/iscsiadm.c 2011-07-09 23:27:17.963424339 +0530 +++ open-iscsi-test/usr/iscsiadm.c 2011-07-22 22:19:16.452456354 +0530 @@ -103,24 +103,201 @@ static struct option const long_options[ }; static char *short_options = "RlDVhm:p:P:T:H:I:U:k:L:d:r:n:v:o:sSt:u"; -static void usage(int status) -{ - if (status != 0) - fprintf(stderr, "Try `%s --help' for more information.\n", - program_name); - else { - printf("\ -iscsiadm -m discoverydb [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p ip:port -I ifaceN ... [ -Dl ] ] | [ [ -p ip:port -t type] \ -[ -o operation ] [ -n name ] [ -v value ] [ -lD ] ] \n\ -iscsiadm -m discovery [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p ip:port -I ifaceN ... [ -l ] ] | [ [ -p ip:port ] [ -l | -D ] ] \n\ -iiscsiadm -m node [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ -S ] [ [ -T targetname -p ip:port -I ifaceN ] [ -l | -u | -R | -s] ] \ -[ [ -o operation ] [ -n name ] [ -v value ] ]\n\ -iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P printlevel] [ -r sessionid | sysfsdir [ -R | -u | -s ] [ -o operation ] [ -n name ] [ -v value ] ]\n\ -iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename ] [ [ -o operation ] [ -n name ] [ -v value ] ]\n\ -iscsiadm -m fw [ -l ]\n\ -iscsiadm -m host [ -P printlevel ] [ -H hostno ]\n\ -iscsiadm -k priority\n"); +/* + * Global defines for all iscsiadm command line options. + */ +#define CMD_LINE_OPTION_MODE (1<<0) +#define CMD_LINE_OPTION_PORTAL (1<<1) +#define CMD_LINE_OPTION_TGTNAME (1<<2) +#define CMD_LINE_OPTION_IFACE (1<<3) +#define CMD_LINE_OPTION_OP (1<<4) +#define CMD_LINE_OPTION_TYPE (1<<5) +#define CMD_LINE_OPTION_NAME (1<<6) +#define CMD_LINE_OPTION_VALUE (1<<7) +#define CMD_LINE_OPTION_HOST (1<<8) +#define CMD_LINE_OPTION_SID (1<<9) +#define CMD_LINE_OPTION_RESCAN (1<<10) +#define CMD_LINE_OPTION_PRINT (1<<11) +#define CMD_LINE_OPTION_DSCVR (1<<12) +#define CMD_LINE_OPTION_LOGIN (1<<13) +#define CMD_LINE_OPTION_LOGINALL (1<<14) +#define CMD_LINE_OPTION_LOGOUT (1<<15) +#define CMD_LINE_OPTION_LOGOUTALL (1<<16) +#define CMD_LINE_OPTION_STATS (1<<17) +#define CMD_LINE_OPTION_KILLISCSID (1<<18) +#define CMD_LINE_OPTION_DEBUG (1<<19) +#define CMD_LINE_OPTION_SHOW (1<<20) +#define CMD_LINE_OPTION_VERSION (1<<21) +#define CMD_LINE_OPTION_HELP (1<<22) + +static void print_option_help(unsigned int options) +{ + printf("Options\tDescription\n"); + printf("-------\t-----------\n"); + + if (options & CMD_LINE_OPTION_PORTAL) + printf("-p\tPortal in ip:port format. If only ip address is specified\n\tthen the value 3260 is assumed for the port.\n"); + if (options & CMD_LINE_OPTION_TGTNAME) + printf("-T\tIqn name of the target.\n"); + if (options & CMD_LINE_OPTION_IFACE) + printf("-I\tInterface to use for the operation. This is the name of file\n\tin /etc/iscsi/ifaces/ directory. Multiple interfaces can be specified.\n"); + if (options & CMD_LINE_OPTION_OP) + printf("-o\tOne of the new, delete, update, show or nonpersistent operations.\n"); + if (options & CMD_LINE_OPTION_TYPE) + printf("-t\tType of discovery. Sendtargets, slp, isns or fw.\n"); + if (options & CMD_LINE_OPTION_NAME) + printf("-n\tName of the field to use in the update operation.\n"); + if (options & CMD_LINE_OPTION_VALUE) + printf("-v\tValue to use for the specified field in the update operation.\n"); + if (options & CMD_LINE_OPTION_HOST) + printf("-H\tSCSI host to use for the operation.\n"); + if (options & CMD_LINE_OPTION_SID) + printf("-r\tSession ID to use. This is either a positive integer or a sysfs\n\tpath like /sys/devices/platform/hostH/sessionS/targetH:B:I\n"); + if (options & CMD_LINE_OPTION_RESCAN) + printf("-R\tRescan all sessions if no SID is specified, else scan only that session.\n"); + if (options & CMD_LINE_OPTION_PRINT) + printf("-P\tLevel of information output. 0 to display a single line\n\tand 1 to display detailed information in tree format.\n"); + if (options & CMD_LINE_OPTION_DSCVR) + printf("-D\tDiscover targets.\n"); + if (options & CMD_LINE_OPTION_LOGIN) + printf("-l\tLogin to the discovered or specified target.\n"); + if (options & CMD_LINE_OPTION_LOGINALL) + printf("-L\tLogin to all sessions with the specified node or connection startup value\n\tor all session if all is passed.\n"); + if (options & CMD_LINE_OPTION_LOGOUT) + printf("-u\tLogout of the specified node or session.\n"); + if (options & CMD_LINE_OPTION_LOGOUTALL) + printf("-U\tLogout of all sessions with the specified node or connection startup value\n\tor all sessions if all is passed.\n"); + if (options & CMD_LINE_OPTION_STATS) + printf("-s\tDisplay session statistics\n"); + if (options & CMD_LINE_OPTION_DEBUG) + printf("-d\tPrint debugging information. Valid values are 0 to 8.\n"); + if (options & CMD_LINE_OPTION_KILLISCSID) + printf("-k\tKill iscsid.\n"); + if (options & CMD_LINE_OPTION_SHOW) + printf("-S\tShow masked values during information display.\n"); + if (options & CMD_LINE_OPTION_HELP) + printf("-h\tDisplay this help.\n"); + if (options & CMD_LINE_OPTION_VERSION) + printf("-v\tDisplay iscsiadm version.\n"); +} + + +static void usage(int status, int mode) +{ + unsigned int options = 0; + + if ((status != 0) || (mode == -1)) + { + printf("\nIscsiadm supports the following modes. The user should enter atleast one of them.\nFor help about a particular mode, enter 'iscsiadm \ +-m mode -h'.\n\n"); + printf("discoverydb\ndiscovery [DEPRECATED]\nnode\nsession\niface\nfw\nhost\n\n"); + printf("NOTE: To kill iscsid, use 'iscsiadm -k priority' with a priority of 0.\n\n"); + } + else + { + printf("\n"); + switch (mode) + { + case MODE_DISCOVERYDB: + printf("iscsiadm -m discoverydb [options...]\n\n"); + options = CMD_LINE_OPTION_PORTAL | CMD_LINE_OPTION_IFACE | CMD_LINE_OPTION_OP \ + | CMD_LINE_OPTION_TYPE | CMD_LINE_OPTION_NAME | CMD_LINE_OPTION_VALUE \ + | CMD_LINE_OPTION_PRINT | CMD_LINE_OPTION_DSCVR | CMD_LINE_OPTION_LOGIN \ + | CMD_LINE_OPTION_DEBUG | CMD_LINE_OPTION_HELP; + print_option_help(options); + printf("\nExample:\n\tTo discover a target\n"); + printf("\t\tiscsiadm -m discoverydb -t st -p 192.168.1.2:3260 -D\n"); + printf("\tTo discover and login\n"); + printf("\t\tiscsiadm -m discoverydb -t st -p 192.168.1.2:3260 -Dl\n"); + printf("\tTo specify an interface during discovery and login\n"); + printf("\t\tiscsiadm -m discoverydb -t st -p 192.168.1.2:3260 -I eth0 -Dl\n"); + printf("\tTo add or delete a record\n"); + printf("\t\tiscsiadm -m discoverydb -t st -p 192.168.1.2:3260 -o new/delete\n"); + printf("\tTo update a record\n"); + printf("\t\tiscsiadm -m discoverydb -t st -p 192.168.1.2:3260 -o update \n\t\t-n discovery.startup\ + -v manual\n"); + printf("\tTo display records from discovery database\n"); + printf("\t\tiscsiadm -m discoverydb\n\n"); + break; + + case MODE_DISCOVERY: + printf("iscsiadm -m discovery [options...]\n\n"); + options = CMD_LINE_OPTION_PORTAL | CMD_LINE_OPTION_IFACE | CMD_LINE_OPTION_OP \ + | CMD_LINE_OPTION_TYPE | CMD_LINE_OPTION_PRINT | CMD_LINE_OPTION_DSCVR \ + | CMD_LINE_OPTION_LOGIN | CMD_LINE_OPTION_DEBUG | CMD_LINE_OPTION_HELP; + print_option_help(options); + printf("\nExample:\n\tTo discover a target\n"); + printf("\t\tiscsiadm -m discovery -t slp -p 192.168.1.1:3260 -D\n"); + printf("\tTo discover and login to a target\n"); + printf("\t\tiscsiadm -m discovery -t slp -p 192.168.1.1:3260 -Dl\n"); + printf("\tTo specify an interface\n"); + printf("\t\tiscsiadm -m discovery -t slp -p 192.168.1.1:3260 -I eth0\n\n"); + break; + + case MODE_NODE: + printf("iscsiadm -m node [options...]\n\n"); + options = CMD_LINE_OPTION_PORTAL | CMD_LINE_OPTION_DEBUG | CMD_LINE_OPTION_PRINT \ + | CMD_LINE_OPTION_LOGINALL | CMD_LINE_OPTION_LOGOUTALL | CMD_LINE_OPTION_SHOW \ + | CMD_LINE_OPTION_TGTNAME | CMD_LINE_OPTION_IFACE | CMD_LINE_OPTION_LOGIN \ + | CMD_LINE_OPTION_RESCAN | CMD_LINE_OPTION_STATS | CMD_LINE_OPTION_HELP \ + | CMD_LINE_OPTION_LOGOUT | CMD_LINE_OPTION_OP | CMD_LINE_OPTION_NAME \ + | CMD_LINE_OPTION_VALUE; + print_option_help(options); + printf("\nExample:\n\tTo login to a target\n"); + printf("\t\tiscsiadm -m node -T iqn.2005-06.com.mydomain.openiscsi:test1 -p 192.168.1.2:3260 -l\n"); + printf("\tTo login to all targets with node or connection startup type as manual\n"); + printf("\t\tiscsiadm -m node -L manual\n"); + printf("\tTo logout of all targets with node or connection startup type as automatic\n"); + printf("\t\tiscsiadm -m node -U automatic\n"); + printf("\tTo rescan the session passing through a target\n"); + printf("\t\tiscsiadm -m node -T iqn.2005-06.com.mydomain.openiscsi.test1 -p 192.168.1.2:3260 -R\n"); + printf("\tTo display statistics about a session passing through a target\n"); + printf("\t\tiscsiadm -m node -T iqn.2005-06.com.mydomain.openiscsi:test1 -p 192.168.1.2:3260 -s\n"); + printf("\tTo add a new node record\n"); + printf("\t\tiscsiadm -m node -T iqn.2005-06.com.mydomain.openiscsi:test1 -p 192.168.1.2:3260 -o new\n\n"); + break; + + case MODE_SESSION: + printf("iscsiadm -m session [options...]\n\n"); + options = CMD_LINE_OPTION_HELP | CMD_LINE_OPTION_DEBUG | CMD_LINE_OPTION_PRINT | CMD_LINE_OPTION_SID \ + | CMD_LINE_OPTION_RESCAN | CMD_LINE_OPTION_LOGOUT | CMD_LINE_OPTION_STATS \ + | CMD_LINE_OPTION_OP | CMD_LINE_OPTION_NAME | CMD_LINE_OPTION_VALUE; + print_option_help(options); + printf("\nExample:\n\tTo logout of a session\n"); + printf("\t\tiscsiadm -m session -r 1 -u\n"); + printf("\tTo delete a session record\n"); + printf("\t\tiscsiadm -m session -r 2 -o delete\n\n"); + break; + + case MODE_IFACE: + printf("iscsiadm -m iface [options...]\n\n"); + options = CMD_LINE_OPTION_HELP | CMD_LINE_OPTION_DEBUG | CMD_LINE_OPTION_PRINT \ + | CMD_LINE_OPTION_IFACE | CMD_LINE_OPTION_OP | CMD_LINE_OPTION_NAME | CMD_LINE_OPTION_VALUE; + print_option_help(options); + printf("\nExample:\n\tTo add a iface record\n"); + printf("\t\tiscsiadm -m iface -I eth1 -o new\n\n"); + break; + + case MODE_FW: + printf("iscsiadm -m fw [options...]\n\n"); + options = CMD_LINE_OPTION_LOGIN; + print_option_help(options); + printf("\n"); + break; + + case MODE_HOST: + printf("iscsiadm -m host [options...]\n\n"); + options = CMD_LINE_OPTION_PRINT | CMD_LINE_OPTION_HOST; + print_option_help(options); + printf("\n"); + break; + + deafult: + printf("Invalid mode\n\n"); + } + printf("SEE MAN PAGE FOR MODE DETAILS\n\n"); } + exit(status); } @@ -370,7 +547,7 @@ logout_by_startup(char *mode) if (!mode || !(!strcmp(mode, "automatic") || !strcmp(mode, "all") || !strcmp(mode,"manual"))) { log_error("Invalid logoutall option %s.", mode); - usage(ISCSI_ERR_INVAL); + usage(ISCSI_ERR_INVAL, 0); return ISCSI_ERR_INVAL; } @@ -440,7 +617,7 @@ login_by_startup(char *mode) if (!mode || !(!strcmp(mode, "automatic") || !strcmp(mode, "all") || !strcmp(mode,"manual") || !strcmp(mode, "onboot"))) { log_error("Invalid loginall option %s.", mode); - usage(ISCSI_ERR_INVAL); + usage(ISCSI_ERR_INVAL, 0); return ISCSI_ERR_INVAL; } @@ -2071,7 +2248,7 @@ main(int argc, char **argv) ISCSI_VERSION_STR); return 0; case 'h': - usage(0); + usage(0, mode); } } @@ -2087,7 +2264,7 @@ main(int argc, char **argv) } if (mode < 0) - usage(ISCSI_ERR_INVAL); + usage(ISCSI_ERR_INVAL, 0); if (mode == MODE_FW) { if ((rc = verify_mode_params(argc, argv, "ml", 0))) { -- You received this message because you are subscribed to the Google Groups "open-iscsi" group. To view this discussion on the web visit https://groups.google.com/d/msg/open-iscsi/-/fII1WGV_lpIJ. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/open-iscsi?hl=en.
