diff --git a/ipmitool/debian/patches/ipmitool-1.8.18-rflash.patch b/ipmitool/debian/patches/ipmitool-1.8.18-rflash.patch new file mode 120000 index 0000000..eb8a8d0 --- /dev/null +++ b/ipmitool/debian/patches/ipmitool-1.8.18-rflash.patch @@ -0,0 +1 @@ +../../ipmitool-1.8.18-rflash.patch \ No newline at end of file diff --git a/ipmitool/debian/patches/ipmitool-1.8.18-saneretry.patch b/ipmitool/debian/patches/ipmitool-1.8.18-saneretry.patch new file mode 120000 index 0000000..5bd6c71 --- /dev/null +++ b/ipmitool/debian/patches/ipmitool-1.8.18-saneretry.patch @@ -0,0 +1 @@ +../../ipmitool-1.8.18-saneretry.patch \ No newline at end of file diff --git a/ipmitool/debian/patches/ipmitool-1.8.18-signal.patch b/ipmitool/debian/patches/ipmitool-1.8.18-signal.patch new file mode 120000 index 0000000..4ff9f2d --- /dev/null +++ b/ipmitool/debian/patches/ipmitool-1.8.18-signal.patch @@ -0,0 +1 @@ +../../ipmitool-1.8.18-signal.patch \ No newline at end of file diff --git a/ipmitool/ipmitool-1.8.18-rflash.patch b/ipmitool/ipmitool-1.8.18-rflash.patch new file mode 100644 index 0000000..edc907a --- /dev/null +++ b/ipmitool/ipmitool-1.8.18-rflash.patch @@ -0,0 +1,21 @@ +--- ./ipmitool-1.8.18/lib/ipmi_hpmfwupg.c 2016-06-29 14:01:49.000000000 -0400 ++++ ./ipmitool-1.8.18-rflash/lib/ipmi_hpmfwupg.c 2017-05-30 13:32:44.751054806 -0400 +@@ -730,18 +730,6 @@ + lprintf(LOG_NOTICE, "\n Upgrade undesirable at this moment"); + return HPMFWUPG_ERROR; + } +- /* Get confimation from the user if he wants to continue when +- * service affected during upgrade +- */ +- if (!(option & COMPARE_MODE) +- && (pFwupgCtx->targetCap.GlobalCapabilities.bitField.servAffectDuringUpg == 1 +- || pImageHeader->imageCapabilities.bitField.servAffected == 1)) { +- if (HpmGetUserInput("\nServices may be affected during upgrade. Do you wish to continue? (y/n): ")) { +- rc = HPMFWUPG_SUCCESS; +- } else { +- return HPMFWUPG_ERROR; +- } +- } + } + /* Get the general properties of each component present in image */ + for (componentId = HPMFWUPG_COMPONENT_ID_0; diff --git a/ipmitool/ipmitool-1.8.18-saneretry.patch b/ipmitool/ipmitool-1.8.18-saneretry.patch new file mode 100644 index 0000000..5cab24b --- /dev/null +++ b/ipmitool/ipmitool-1.8.18-saneretry.patch @@ -0,0 +1,50 @@ +--- ./ipmitool-1.8.18/lib/ipmi_sol.c 2016-06-29 14:06:29.000000000 -0400 ++++ ./ipmitool-1.8.18-saneretry/lib/ipmi_sol.c 2017-05-30 13:41:12.462969340 -0400 +@@ -76,7 +76,6 @@ + #define SOL_PARAMETER_SOL_PAYLOAD_CHANNEL 0x07 + #define SOL_PARAMETER_SOL_PAYLOAD_PORT 0x08 + +-#define MAX_SOL_RETRY 6 + + const struct valstr sol_parameter_vals[] = { + { SOL_PARAMETER_SET_IN_PROGRESS, "Set In Progress (0)" }, +@@ -1535,7 +1534,6 @@ + int retval; + int buffer_size = intf->session->sol_data.max_inbound_payload_size; + int keepAliveRet = 0; +- int retrySol = 0; + + /* Subtract SOL header from max_inbound_payload_size */ + if (buffer_size > 4) +@@ -1572,29 +1570,8 @@ + + if (keepAliveRet != 0) + { +- /* +- * Retrying the keep Alive before declaring a communication +- * lost state with the IPMC. Helpful when the payload is +- * reset and brings down the connection temporarily. Otherwise, +- * if we send getDevice Id to check the status of IPMC during +- * this down time when the connection is restarting, SOL will +- * exit even though the IPMC is available and the session is open. +- */ +- if (retrySol == MAX_SOL_RETRY) +- { +- /* no response to Get Device ID keepalive message */ +- bShouldExit = 1; +- continue; +- } +- else +- { +- retrySol++; +- } +- } +- else +- { +- /* if the keep Alive is successful reset retries to zero */ +- retrySol = 0; ++ bShouldExit = 1; ++ continue; + } + } /* !oem="i82571spt" */ + /* Wait up to half a second */ diff --git a/ipmitool/ipmitool-1.8.18-signal.patch b/ipmitool/ipmitool-1.8.18-signal.patch new file mode 100644 index 0000000..1481471 --- /dev/null +++ b/ipmitool/ipmitool-1.8.18-signal.patch @@ -0,0 +1,135 @@ +--- ./ipmitool-1.8.18/lib/ipmi_main.c 2016-07-31 02:56:33.000000000 -0400 ++++ ./ipmitool-1.8.18-signal/lib/ipmi_main.c 2017-05-30 14:04:11.798264910 -0400 +@@ -92,6 +92,7 @@ + + extern int verbose; + extern int csv_output; ++extern int sol_activated; + extern const struct valstr ipmi_privlvl_vals[]; + extern const struct valstr ipmi_authtype_session_vals[]; + +@@ -271,24 +272,30 @@ + if (cmdlist != NULL) + ipmi_cmd_print(cmdlist); + } +-/* ipmi_catch_sigint - Handle the interrupt signal (Ctrl-C), close the +- * interface, and exit ipmitool with error (-1) ++/* ipmi_catch_sig - Handle the interrupt signal (Ctrl-C),TERM signal, ++ * and HUP signal. Close the interface, and exit ++ * ipmitool with error (-1) + * +- * This insures that the IOL session gets freed +- * for other callers. ++ * This insures that the IOL session gets freed ++ * for other callers. + * + * returns -1 + */ +-void ipmi_catch_sigint() ++void ipmi_catch_sig(const int sig) + { +- if (ipmi_main_intf != NULL) { +- printf("\nSIGN INT: Close Interface %s\n",ipmi_main_intf->desc); +- /* reduce retry count to a single retry */ +- ipmi_main_intf->ssn_params.retry = 1; +- /* close interface */ +- ipmi_main_intf->close(ipmi_main_intf); ++ if (sol_activated == 1) { ++ printf("\nSIGN %s: Deactivate sol session\r\n",strsignal(sig)); ++ sol_activated = 0; ++ } else { ++ if (ipmi_main_intf != NULL) { ++ printf("\nSIGN %s: Close Interface %s\n",strsignal(sig), ipmi_main_intf->desc); ++ /* reduce retry count to a single retry */ ++ ipmi_main_intf->ssn_params.retry = 1; ++ /* close interface */ ++ ipmi_main_intf->close(ipmi_main_intf); ++ } ++ exit(-1); + } +- exit(-1); + } + + static uint8_t +@@ -357,7 +364,9 @@ + /* save program name */ + progname = strrchr(argv[0], '/'); + progname = ((progname == NULL) ? argv[0] : progname+1); +- signal(SIGINT, ipmi_catch_sigint); ++ signal(SIGINT, ipmi_catch_sig); ++ signal(SIGTERM, ipmi_catch_sig); ++ signal(SIGHUP, ipmi_catch_sig); + memset(kgkey, 0, sizeof(kgkey)); + + while ((argflag = getopt(argc, (char **)argv, OPTION_STRING)) != -1) +--- ./ipmitool-1.8.18/lib/ipmi_sol.c 2016-06-29 14:06:29.000000000 -0400 ++++ ./ipmitool-1.8.18-signal/lib/ipmi_sol.c 2017-05-30 14:28:55.503571252 -0400 +@@ -46,6 +46,7 @@ + #include + #include + #include ++#include + + #if defined(HAVE_CONFIG_H) + # include +@@ -99,6 +100,7 @@ + static int _use_sol_for_keepalive = 0; + + extern int verbose; ++int sol_activated = 0; + + /* + * ipmi_sol_payload_access +@@ -1558,6 +1560,12 @@ + FD_SET(0, &read_fds); + FD_SET(intf->fd, &read_fds); + ++ if (sol_activated == 0) { ++ bBmcClosedSession = 0; ++ keepAliveRet = 0; ++ break; ++ } ++ + if (!ipmi_oem_active(intf,"i82571spt")) + { + /* Send periodic keepalive packet */ +@@ -1668,22 +1676,24 @@ + } + + leave_raw_mode(); ++ ipmi_sol_deactivate(intf, instance); + + if (keepAliveRet != 0) + { + lprintf(LOG_ERR, "Error: No response to keepalive - Terminating session"); +- /* attempt to clean up anyway */ +- ipmi_sol_deactivate(intf, instance); +- exit(1); ++ return -1; + } + + if (bBmcClosedSession) + { + lprintf(LOG_ERR, "SOL session closed by BMC"); +- exit(1); ++ return -1; ++ } ++ else if (sol_activated == 0) ++ { ++ lprintf(LOG_ERR, "SOL session closed by signal"); ++ return -1; + } +- else +- ipmi_sol_deactivate(intf, instance); + + return 0; + } +@@ -1768,6 +1778,8 @@ + data[4] = 0x00; /* reserved */ + data[5] = 0x00; /* reserved */ + ++ /* Make sure deactivate code sent to BMC no matter what the status is */ ++ sol_activated = 1; + rsp = intf->sendrecv(intf, &req); + + if (NULL != rsp) { diff --git a/ipmitool/ipmitool-1.8.18.tar.gz b/ipmitool/ipmitool-1.8.18.tar.gz new file mode 100644 index 0000000..260dda1 Binary files /dev/null and b/ipmitool/ipmitool-1.8.18.tar.gz differ