From b7542b38679016bd469dfc42b919df15c36baa46 Mon Sep 17 00:00:00 2001 From: Marek 'marx' Grac Date: Wed, 27 Aug 2014 13:07:44 +0200 Subject: [PATCH 04/11] fence_zvm: Add support for "on" and "status" Developed by: Neale Ferguson --- fence/agents/zvm/fence_zvm.8 | 4 +- fence/agents/zvm/fence_zvm.c | 286 +++++++++++++++++++++++++++++++++++--- fence/agents/zvm/fence_zvm.h | 1 + fence/agents/zvm/fence_zvmip.8 | 5 +- fence/agents/zvm/fence_zvmip.c | 309 +++++++++++++++++++++++++++++++++++++++-- 5 files changed, 575 insertions(+), 30 deletions(-) diff --git a/fence/agents/zvm/fence_zvm.8 b/fence/agents/zvm/fence_zvm.8 index 0b34e2c..359436e 100644 --- a/fence/agents/zvm/fence_zvm.8 +++ b/fence/agents/zvm/fence_zvm.8 @@ -22,7 +22,7 @@ Vendor URL: http://www.sinenomine.net .SH OPTIONS .TP \fB-o --action\fP -Fencing action: "off" - fence off device; "metadata" - display device metadata +Fencing action: "off" - deactivate virtual machine; "on" - activate virtual machine; "metadata" - display device metadata" - describe fence agent parameters; "status" - state of virtual machine .TP \fB--delay\fP \fIseconds\fP Time to delay fencing action in seconds @@ -52,7 +52,7 @@ forcibly terminated. Currently, this option is ignored. This option is used by fence_node(8) and is ignored by fence_zvm. .TP \fIaction = < action >\fP -Fencing action: "off" - fence off device; "metadata" - display device metadata +Fencing action: "off" - fence off device; "metadata" - display device metadata; "status" - state of device .TP \fIport = < target >\fP Name of virtual machine to recycle. diff --git a/fence/agents/zvm/fence_zvm.c b/fence/agents/zvm/fence_zvm.c index d2fb4a9..2ec4be9 100644 --- a/fence/agents/zvm/fence_zvm.c +++ b/fence/agents/zvm/fence_zvm.c @@ -185,6 +185,240 @@ zvm_smapi_imageRecycle(zvm_driver_t *zvm) } /** + * zvm_smapi_imageDeactivate + * @zvm: z/VM driver information + * + * Deactivates a virtual image + */ +int +zvm_smapi_imageDeactivate(zvm_driver_t *zvm) +{ + struct _inPlist { + int32_t lPlist; + int32_t lFName; + char fName[16]; + int32_t lUser; + int32_t lPass; + int32_t lTarget; + char target[0]; + } __attribute__ ((__packed__)) *inPlist; + struct _deactTime { + int32_t lForceTime; + char forceTime[5]; + } __attribute__ ((__packed__)) *deactTime; + int32_t lInPlist; + struct _outPlist { + smapiOutHeader_t hdr; + int32_t nActive; + int32_t nInActive; + int32_t lFail; + char failArray[0]; + } *outPlist = NULL; + void *pOut = NULL; + int32_t lRsp; + uint32_t reqId; + int rc; + + /* + * Implement any delay + */ + if (zvm->delay > 0) + sleep(zvm->delay); + + lInPlist = sizeof(*inPlist) + strlen(zvm->target) + sizeof(*deactTime); + inPlist = malloc(lInPlist); + if (inPlist != NULL) { + inPlist->lPlist = lInPlist - sizeof(inPlist->lPlist); + inPlist->lFName = sizeof(inPlist->fName); + memcpy(inPlist->fName, Image_Deactivate, sizeof(inPlist->fName)); + deactTime = (void *) ((intptr_t) inPlist + sizeof(*inPlist) + strlen(zvm->target)); + deactTime->lForceTime = sizeof(deactTime->forceTime); + memcpy(deactTime->forceTime, "IMMED", sizeof(deactTime->forceTime)); + inPlist->lUser = inPlist->lPass = 0; + inPlist->lTarget = strlen(zvm->target); + memcpy(inPlist->target, zvm->target, inPlist->lTarget); + if ((rc = zvm_smapi_send(zvm, inPlist, &reqId, lInPlist)) != -1) { + if ((rc = zvm_smapi_recv(zvm, &pOut, &lRsp)) != -1) { + outPlist = pOut; + if (outPlist->hdr.rc == 0) { + syslog(LOG_INFO, "Deactivation of %s successful", + zvm->target); + rc = 0; + } else { + if ((outPlist->hdr.rc == RCERR_IMAGEOP) & + ((outPlist->hdr.reason == RS_NOT_ACTIVE) | + (outPlist->hdr.reason == RS_BEING_DEACT))) { + syslog(LOG_INFO, "Deactivation of %s successful", + zvm->target); + rc = 0; + } else { + rc = outPlist->hdr.rc; + zvm->reason = outPlist->hdr.reason; + (void) zvm_smapi_reportError(inPlist, outPlist); + } + } + } + } + free(inPlist); + free(outPlist); + } else { + syslog(LOG_ERR, "%s - cannot allocate parameter list", __func__); + rc = -1; + } + return(rc); +} + +/** + * zvm_smapi_imageActivate + * @zvm: z/VM driver information + * + * Deactivates a virtual image + */ +int +zvm_smapi_imageActivate(zvm_driver_t *zvm) +{ + struct _inPlist { + int32_t lPlist; + int32_t lFName; + char fName[14]; + int32_t lUser; + int32_t lPass; + int32_t lTarget; + char target[0]; + } __attribute__ ((__packed__)) *inPlist; + int32_t lInPlist; + struct _outPlist { + smapiOutHeader_t hdr; + int32_t nActive; + int32_t nInActive; + int32_t lFail; + char failArray[0]; + } *outPlist = NULL; + void *pOut = NULL; + int32_t lRsp; + uint32_t reqId; + int rc; + + /* + * Implement any delay + */ + if (zvm->delay > 0) + sleep(zvm->delay); + + lInPlist = sizeof(*inPlist) + strlen(zvm->target); + inPlist = malloc(lInPlist); + if (inPlist != NULL) { + inPlist->lPlist = lInPlist - sizeof(inPlist->lPlist); + inPlist->lFName = sizeof(inPlist->fName); + memcpy(inPlist->fName, Image_Activate, sizeof(inPlist->fName)); + inPlist->lUser = inPlist->lPass = 0; + inPlist->lTarget = strlen(zvm->target); + memcpy(inPlist->target, zvm->target, inPlist->lTarget); + if ((rc = zvm_smapi_send(zvm, inPlist, &reqId, lInPlist)) != -1) { + if ((rc = zvm_smapi_recv(zvm, &pOut, &lRsp)) != -1) { + outPlist = pOut; + if (outPlist->hdr.rc == 0) { + syslog(LOG_INFO, "Activation of %s successful", + zvm->target); + rc = 0; + } else { + if ((outPlist->hdr.rc == RCERR_IMAGEOP) & + ((outPlist->hdr.reason == RS_NOT_ACTIVE) | + (outPlist->hdr.reason == RS_BEING_DEACT))) { + syslog(LOG_INFO, "Activation of %s successful", + zvm->target); + rc = 0; + } else { + rc = outPlist->hdr.rc; + zvm->reason = outPlist->hdr.reason; + (void) zvm_smapi_reportError(inPlist, outPlist); + } + } + } + } + free(inPlist); + free(outPlist); + } else { + syslog(LOG_ERR, "%s - cannot allocate parameter list", __func__); + rc = -1; + } + return(rc); +} + +/** + * zvm_smapi_imageQuery + * @zvm: z/VM driver information + * + * Queries the state of a virtual image + */ +int +zvm_smapi_imageQuery(zvm_driver_t *zvm) +{ + struct _inPlist { + int32_t lPlist; + int32_t lFName; + char fName[18]; + int32_t lUser; + int32_t lPass; + int32_t lTarget; + char target[0]; + } __attribute__ ((__packed__)) *inPlist; + int32_t lInPlist; + struct _outPlist { + smapiOutHeader_t hdr; + int32_t lNames; + char nameArray[0]; + } *outPlist = NULL; + void *pOut = NULL; + int32_t lRsp; + uint32_t reqId; + int rc; + + /* + * Implement any delay + */ + if (zvm->delay > 0) + sleep(zvm->delay); + + lInPlist = sizeof(*inPlist) + strlen(zvm->target); + inPlist = malloc(lInPlist); + if (inPlist != NULL) { + inPlist->lPlist = lInPlist - sizeof(inPlist->lPlist); + inPlist->lFName = sizeof(inPlist->fName); + memcpy(inPlist->fName, Image_Status_Query, sizeof(inPlist->fName)); + inPlist->lUser = inPlist->lPass = 0; + inPlist->lTarget = strlen(zvm->target); + memcpy(inPlist->target, zvm->target, inPlist->lTarget); + if ((rc = zvm_smapi_send(zvm, inPlist, &reqId, lInPlist)) != -1) { + if ((rc = zvm_smapi_recv(zvm, &pOut, &lRsp)) != -1) { + outPlist = pOut; + if (outPlist->hdr.rc == 0) { + if (outPlist->hdr.reason == 0) { + syslog(LOG_INFO, "Node %s is active", + zvm->target); + rc = 0; + } else { + syslog(LOG_INFO, "Node %s is inactive", + zvm->target); + rc = 2; + } + } else { + rc = 1; + zvm->reason = outPlist->hdr.reason; + (void) zvm_smapi_reportError(inPlist, outPlist); + } + } + } + free(inPlist); + free(outPlist); + } else { + syslog(LOG_ERR, "%s - cannot allocate parameter list", __func__); + rc = -1; + } + return(rc); +} + +/** * zvm_smapi_send: * @zvm: z/VM driver information * @reqid: Returned request id @@ -414,7 +648,9 @@ zvm_metadata() fprintf (stdout, "\n"); fprintf (stdout, "\t\n"); + fprintf (stdout, "\t\n"); fprintf (stdout, "\t\n"); + fprintf (stdout, "\t\n"); fprintf (stdout, "\n"); fprintf (stdout, "\n"); @@ -463,10 +699,14 @@ get_options_stdin (zvm_driver_t *zvm) if (!strcasecmp (opt, "action")) { if (strcasecmp(arg, "off") == 0) { fence = 0; + } else if (strcasecmp(arg, "on") == 0) { + fence = 1; } else if (strcasecmp(arg, "metadata") == 0) { - fence = 1; - } else { fence = 2; + } else if (strcasecmp(arg, "status") == 0) { + fence = 3; + } else { + fence = 4; } } else if (!strcasecmp (opt, "ipaddr")) { lSrvName = MIN(strlen(arg), sizeof(zvm->smapiSrv)); @@ -497,7 +737,7 @@ get_options_stdin (zvm_driver_t *zvm) zvm->delay = DEFAULT_DELAY; } } else if (!strcasecmp (opt, "help")) { - fence = 2; + fence = 4; } } return(fence); @@ -529,10 +769,14 @@ get_options(int argc, char **argv, zvm_driver_t *zvm) case 'o' : if (strcasecmp(optarg, "off") == 0) { fence = 0; + } else if (strcasecmp(optarg, "on") == 0) { + fence = 1; } else if (strcasecmp(optarg, "metadata") == 0) { - fence = 1; - } else { fence = 2; + } else if (strcasecmp(optarg, "status") == 0) { + fence = 3; + } else { + fence = 4; } break; case 'a' : @@ -562,7 +806,7 @@ get_options(int argc, char **argv, zvm_driver_t *zvm) memcpy(zvm->node, optarg, lSrvNode); break; default : - fence = 2; + fence = 4; } } return(fence); @@ -577,13 +821,13 @@ usage() { fprintf(stderr,"Usage: fence_zvm [options]\n\n" "\tWhere [options] =\n" - "\t-o --action [action] - \"off\", \"metadata\"\n" - "\t--delay [seconds] - Time to delay fencing action in seconds\n" - "\t-n --plug [target] - Name of virtual machine to fence\n" - "\t-a --ip [server] - Name of SMAPI IUCV Request server\n" - "\t-T --timeout [secs] - Time to wait for fence in seconds - currently ignored\n" - "\t--zvmsys [node] - z/VM Node on which SMAPI server lives\n" - "\t-h --help - Display this usage information\n"); + "\t-o --action [action] - \"off\", \"on\", \"metadata\", \"status\"\n" + "\t--delay [seconds] - Time to delay fencing action in seconds\n" + "\t-n --plug [target] - Name of virtual machine to fence\n" + "\t-a --ip [server] - Name of SMAPI IUCV Request server\n" + "\t-T --timeout [secs] - Time to wait for fence in seconds - currently ignored\n" + "\t--zvmsys [node] - z/VM Node on which SMAPI server lives\n" + "\t-h --help - Display this usage information\n"); return(1); } @@ -629,14 +873,22 @@ main(int argc, char **argv) fence = get_options_stdin(&zvm); switch(fence) { - case 0 : + case 0 : // OFF if ((rc = check_parm(&zvm)) == 0) - rc = zvm_smapi_imageRecycle(&zvm); + rc = zvm_smapi_imageDeactivate(&zvm); break; - case 1 : + case 1 : // ON + if ((rc = check_parm(&zvm)) == 0) + rc = zvm_smapi_imageActivate(&zvm); + break; + case 2 : // METADATA rc = zvm_metadata(); break; - case 2 : + case 3 : // STATUS + if ((rc = check_parm(&zvm)) == 0) + rc = zvm_smapi_imageQuery(&zvm); + break; + case 4 : rc = usage(); } closelog(); diff --git a/fence/agents/zvm/fence_zvm.h b/fence/agents/zvm/fence_zvm.h index 6178fa5..ca18e4d 100644 --- a/fence/agents/zvm/fence_zvm.h +++ b/fence/agents/zvm/fence_zvm.h @@ -578,5 +578,6 @@ int zvm_smapi_imageActivate(zvm_driver_t *); int zvm_smapi_imageActiveQuery(zvm_driver_t *); int zvm_smapi_imageDeactivate(zvm_driver_t *); int zvm_smapi_imageRecycle(zvm_driver_t *); +int zvm_smapi_imageQuery(zvm_driver_t *); #endif /* FENCE_ZVM_H */ diff --git a/fence/agents/zvm/fence_zvmip.8 b/fence/agents/zvm/fence_zvmip.8 index 0bf91ae..8217d61 100644 --- a/fence/agents/zvm/fence_zvmip.8 +++ b/fence/agents/zvm/fence_zvmip.8 @@ -22,7 +22,7 @@ Vendor URL: http://www.sinenomine.net .SH OPTIONS .TP \fB-o --action\fP -Fencing action: "off" - fence off device; "metadata" - display device metadata +Fencing action: "off" - deactivate virtual machine; "on" - activate virtual machine; "metadata" - display device metadata" - describe fence agent parameters; "status" - state of virtual machine .TP \fB--delay\fP \fIseconds\fP Time to delay fencing action in seconds @@ -54,6 +54,9 @@ Display usage information \fIagent = < param >\fP This option is used by fence_node(8) and is ignored by fence_zvmip. .TP +\fIaction = < action >\fP +Fencing action: "off" - fence off device; "metadata" - display device metadata; "status" - state of device +.TP \fIplug = < plug >\fP Name of virtual machine to recycle. .TP diff --git a/fence/agents/zvm/fence_zvmip.c b/fence/agents/zvm/fence_zvmip.c index f4dcd1c..94c9e2e 100644 --- a/fence/agents/zvm/fence_zvmip.c +++ b/fence/agents/zvm/fence_zvmip.c @@ -201,6 +201,277 @@ zvm_smapi_imageRecycle(zvm_driver_t *zvm) } /** + * zvm_smapi_imageDeactivate + * @zvm: z/VM driver information + * + * Deactivates a virtual image + */ +int +zvm_smapi_imageDeactivate(zvm_driver_t *zvm) +{ + struct _inPlist { + int32_t lPlist; + int32_t lFName; + char fName[16]; + } __attribute__ ((packed)) *inPlist; + struct _authUser { + int32_t lAuthUser; + char userId[0]; + } __attribute__ ((packed)) *authUser; + struct _authPass { + int32_t lAuthPass; + char password[0]; + } __attribute__ ((packed)) *authPass; + struct _image { + int32_t lTarget; + char target[0]; + } __attribute__ ((packed)) *image; + struct _deactTime { + int32_t lForceTime; + char forceTime[5]; + } __attribute__ ((__packed__)) *deactTime; + int32_t lInPlist; + struct _outPlist { + smapiOutHeader_t hdr; + int32_t nActive; + int32_t nInActive; + int32_t lFail; + char failArray[0]; + } *outPlist = NULL; + void *pOut = NULL; + int32_t lRsp; + uint32_t reqId; + int rc; + + /* + * Implement any delay + */ + if (zvm->delay > 0) + sleep(zvm->delay); + + lInPlist = sizeof(*inPlist) + sizeof(*authUser) + strlen(zvm->authUser) + + sizeof(*authPass) + strlen(zvm->authPass) + sizeof(*image) + + sizeof(*deactTime) + strlen(zvm->target); + inPlist = malloc(lInPlist); + if (inPlist != NULL) { + authUser = (void *) ((uintptr_t) inPlist + sizeof(*inPlist)); + authPass = (void *) ((uintptr_t) authUser + sizeof(*authUser) + + strlen(zvm->authUser)); + image = (void *) ((uintptr_t) authPass + sizeof(*authPass) + + strlen(zvm->authPass)); + deactTime = (void *) ((intptr_t) image + sizeof(*image) + + strlen(zvm->target)); + inPlist->lPlist = lInPlist - sizeof(inPlist->lPlist); + inPlist->lFName = sizeof(inPlist->fName); + memcpy(inPlist->fName, Image_Deactivate, sizeof(inPlist->fName)); + authUser->lAuthUser = strlen(zvm->authUser); + memcpy(authUser->userId, zvm->authUser, strlen(zvm->authUser)); + authPass->lAuthPass = strlen(zvm->authPass); + memcpy(authPass->password, zvm->authPass, strlen(zvm->authPass)); + image->lTarget = strlen(zvm->target); + memcpy(image->target, zvm->target, strlen(zvm->target)); + deactTime->lForceTime = sizeof(deactTime->forceTime); + memcpy(deactTime->forceTime, "IMMED", sizeof(deactTime->forceTime)); + if ((rc = zvm_smapi_send(zvm, inPlist, &reqId, lInPlist)) != -1) { + if ((rc = zvm_smapi_recv(zvm, &pOut, &lRsp)) != -1) { + outPlist = pOut; + if (outPlist->hdr.rc == 0) { + syslog(LOG_INFO, "Deactivation of %s successful", + zvm->target); + rc = 0; + } else { + if ((outPlist->hdr.rc == RCERR_IMAGEOP) & + ((outPlist->hdr.reason == RS_NOT_ACTIVE) | + (outPlist->hdr.reason == RS_BEING_DEACT))) { + syslog(LOG_INFO, "Deactivation of %s successful", + zvm->target); + rc = 0; + } else { + rc = outPlist->hdr.rc; + zvm->reason = outPlist->hdr.reason; + (void) zvm_smapi_reportError(inPlist, outPlist); + } + } + } + } + free(inPlist); + free(outPlist); + } else { + syslog(LOG_ERR, "%s - cannot allocate parameter list", __func__); + rc = -1; + } + return(rc); +} + +/** + * zvm_smapi_imageActivate + * @zvm: z/VM driver information + * + * Deactivates a virtual image + */ +int +zvm_smapi_imageActivate(zvm_driver_t *zvm) +{ + struct _inPlist { + int32_t lPlist; + int32_t lFName; + char fName[14]; + } __attribute__ ((packed)) *inPlist; + struct _authUser { + int32_t lAuthUser; + char userId[0]; + } __attribute__ ((packed)) *authUser; + struct _authPass { + int32_t lAuthPass; + char password[0]; + } __attribute__ ((packed)) *authPass; + struct _image { + int32_t lTarget; + char target[0]; + } __attribute__ ((packed)) *image; + int32_t lInPlist; + struct _outPlist { + smapiOutHeader_t hdr; + int32_t nActive; + int32_t nInActive; + int32_t lFail; + char failArray[0]; + } *outPlist = NULL; + void *pOut = NULL; + int32_t lRsp; + uint32_t reqId; + int rc; + + /* + * Implement any delay + */ + if (zvm->delay > 0) + sleep(zvm->delay); + + lInPlist = sizeof(*inPlist) + sizeof(*authUser) + strlen(zvm->authUser) + + sizeof(*authPass) + strlen(zvm->authPass) + sizeof(*image) + + strlen(zvm->target); + inPlist = malloc(lInPlist); + if (inPlist != NULL) { + authUser = (void *) ((uintptr_t) inPlist + sizeof(*inPlist)); + authPass = (void *) ((uintptr_t) authUser + sizeof(*authUser) + + strlen(zvm->authUser)); + image = (void *) ((uintptr_t) authPass + sizeof(*authPass) + + strlen(zvm->authPass)); + inPlist->lPlist = lInPlist - sizeof(inPlist->lPlist); + inPlist->lFName = sizeof(inPlist->fName); + memcpy(inPlist->fName, Image_Activate, sizeof(inPlist->fName)); + authUser->lAuthUser = strlen(zvm->authUser); + memcpy(authUser->userId, zvm->authUser, strlen(zvm->authUser)); + authPass->lAuthPass = strlen(zvm->authPass); + memcpy(authPass->password, zvm->authPass, strlen(zvm->authPass)); + image->lTarget = strlen(zvm->target); + memcpy(image->target, zvm->target, strlen(zvm->target)); + if ((rc = zvm_smapi_send(zvm, inPlist, &reqId, lInPlist)) != -1) { + if ((rc = zvm_smapi_recv(zvm, &pOut, &lRsp)) != -1) { + outPlist = pOut; + if (outPlist->hdr.rc == 0) { + syslog(LOG_INFO, "Activation of %s successful", + zvm->target); + rc = 0; + } else { + if ((outPlist->hdr.rc == RCERR_IMAGEOP) & + ((outPlist->hdr.reason == RS_NOT_ACTIVE) | + (outPlist->hdr.reason == RS_BEING_DEACT))) { + syslog(LOG_INFO, "Activation of %s successful", + zvm->target); + rc = 0; + } else { + rc = outPlist->hdr.rc; + zvm->reason = outPlist->hdr.reason; + (void) zvm_smapi_reportError(inPlist, outPlist); + } + } + } + } + free(inPlist); + free(outPlist); + } else { + syslog(LOG_ERR, "%s - cannot allocate parameter list", __func__); + rc = -1; + } + return(rc); +} + +/** + * zvm_smapi_imageQuery + * @zvm: z/VM driver information + * + * Queries the state of a virtual image + */ +int +zvm_smapi_imageQuery(zvm_driver_t *zvm) +{ + struct _inPlist { + int32_t lPlist; + int32_t lFName; + char fName[18]; + int32_t lUser; + int32_t lPass; + int32_t lTarget; + char target[0]; + } __attribute__ ((__packed__)) *inPlist; + int32_t lInPlist; + struct _outPlist { + smapiOutHeader_t hdr; + int32_t lNames; + char nameArray[0]; + } *outPlist = NULL; + void *pOut = NULL; + int32_t lRsp; + uint32_t reqId; + int rc; + + /* + * Implement any delay + */ + if (zvm->delay > 0) + sleep(zvm->delay); + + lInPlist = sizeof(*inPlist) + strlen(zvm->target); + inPlist = malloc(lInPlist); + if (inPlist != NULL) { + inPlist->lPlist = lInPlist - sizeof(inPlist->lPlist); + inPlist->lFName = sizeof(inPlist->fName); + memcpy(inPlist->fName, Image_Status_Query, sizeof(inPlist->fName)); + inPlist->lUser = inPlist->lPass = 0; + inPlist->lTarget = strlen(zvm->target); + memcpy(inPlist->target, zvm->target, inPlist->lTarget); + if ((rc = zvm_smapi_send(zvm, inPlist, &reqId, lInPlist)) != -1) { + if ((rc = zvm_smapi_recv(zvm, &pOut, &lRsp)) != -1) { + outPlist = pOut; + if (outPlist->hdr.rc == 0) { + if (outPlist->hdr.reason == 0) { + syslog(LOG_INFO, "Node %s is active", + zvm->target); + rc = 0; + } else { + syslog(LOG_INFO, "Node %s is inactive", + zvm->target); + rc = 2; + } + } else { + rc = 1; + zvm->reason = outPlist->hdr.reason; + (void) zvm_smapi_reportError(inPlist, outPlist); + } + } + } + free(inPlist); + free(outPlist); + } else { + syslog(LOG_ERR, "%s - cannot allocate parameter list", __func__); + rc = -1; + } + return(rc); +} + +/** * zvm_smapi_send: * @zvm: z/VM driver information * @reqid: Returned request id @@ -407,10 +678,14 @@ get_options_stdin (zvm_driver_t *zvm) if (!strcasecmp (opt, "action")) { if (strcasecmp(arg, "off") == 0) { fence = 0; + } else if (strcasecmp(arg, "on") == 0) { + fence = 1; } else if (strcasecmp(arg, "metadata") == 0) { - fence = 1; - } else { fence = 2; + } else if (strcasecmp(arg, "status") == 0) { + fence = 3; + } else { + fence = 4; } } else if (!strcasecmp (opt, "ipaddr")) { lSrvName = MIN(strlen(arg), sizeof(zvm->smapiSrv)-1); @@ -472,10 +747,14 @@ get_options(int argc, char **argv, zvm_driver_t *zvm) case 'o' : if (strcasecmp(optarg, "off") == 0) { fence = 0; + } else if (strcasecmp(optarg, "on") == 0) { + fence = 1; } else if (strcasecmp(optarg, "metadata") == 0) { - fence = 1; - } else { fence = 2; + } else if (strcasecmp(optarg, "status") == 0) { + fence = 3; + } else { + fence = 4; } break; case 'p' : @@ -505,7 +784,7 @@ get_options(int argc, char **argv, zvm_driver_t *zvm) } break; default : - fence = 2; + fence = 4; } } return(fence); @@ -581,7 +860,9 @@ zvm_metadata() fprintf (stdout, "\n"); fprintf (stdout, "\t\n"); + fprintf (stdout, "\t\n"); fprintf (stdout, "\t\n"); + fprintf (stdout, "\t\n"); fprintf (stdout, "\n"); fprintf (stdout, "\n"); @@ -599,7 +880,7 @@ usage() { fprintf(stderr,"Usage: fence_zvmip [options]\n\n" "\tWhere [options] =\n" - "\t-o --action [action] - \"off\", \"metadata\"\n" + "\t-o --action [action] - \"off\", \"on\", \"metadata\", \"status\"\n" "\t--delay [seconds] - Time to delay fencing action in seconds\n" "\t-n --plug [target] - Name of virtual machine to fence\n" "\t-a --ip [server] - IP Name/Address of SMAPI Server\n" @@ -662,14 +943,22 @@ main(int argc, char **argv) fence = get_options_stdin(&zvm); switch(fence) { - case 0 : + case 0 : // OFF if ((rc = check_parm(&zvm)) == 0) - rc = zvm_smapi_imageRecycle(&zvm); + rc = zvm_smapi_imageDeactivate(&zvm); break; - case 1 : + case 1 : // ON + if ((rc = check_parm(&zvm)) == 0) + rc = zvm_smapi_imageActivate(&zvm); + break; + case 2 : // METADATA rc = zvm_metadata(); break; - case 2 : + case 3 : // STATUS + if ((rc = check_parm(&zvm)) == 0) + rc = zvm_smapi_imageQuery(&zvm); + break; + case 4 : rc = usage(); } closelog(); -- 1.8.4.5