⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drac3.c

📁 linux集群服务器软件代码包
💻 C
字号:
/* $Id: drac3.c,v 1.11 2005/01/31 09:45:31 sunjd Exp $ *//* * Stonith module for Dell DRACIII (Dell Remote Access Card) * * Copyright (C) 2003 Alfa21 Outsourcing * Copyright (C) 2003 Roberto Moreda <moreda@alfa21.com> * Tiny bits Copyright 2005 International Business Machines * Significantly Mangled by Sun Jiang Dong <sunjd@cn.ibm.com>, IBM, 2005 * * (Using snippets of other stonith modules code) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. *  * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Lesser General Public License for more details. *  * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA * */#define DEVICE  "Dell DRAC III Card"#include "stonith_plugin_common.h"#include <curl/curl.h>#include "drac3_command.h"#define PIL_PLUGIN              drac3#define PIL_PLUGIN_S            "drac3"#define PIL_PLUGINLICENSE       LICENSE_LGPL#define PIL_PLUGINLICENSEURL    URL_LGPL#include <pils/plugin.h>#include "stonith_signal.h"static StonithPlugin *	drac3_new(void);static void	drac3_destroy(StonithPlugin *);static const char ** drac3_get_confignames(StonithPlugin *);static int	drac3_set_config(StonithPlugin *, StonithNVpair *);static const char * drac3_getinfo(StonithPlugin * s, int InfoType);static int	drac3_status(StonithPlugin * );static int	drac3_reset_req(StonithPlugin * s, int request, const char * host);static char **	drac3_hostlist(StonithPlugin  *);static struct stonith_ops drac3Ops ={	drac3_new,		/* Create new STONITH object	*/	drac3_destroy,		/* Destroy STONITH object	*/	drac3_getinfo,		/* Return STONITH info string	*/	drac3_get_confignames,	/* Return configuration parameters */	drac3_set_config,	/* Set configuration */	drac3_status,		/* Return STONITH device status	*/	drac3_reset_req,	/* Request a reset */	drac3_hostlist,		/* Return list of supported hosts */};PIL_PLUGIN_BOILERPLATE2("1.0", Debug)static const PILPluginImports*  PluginImports;static PILPlugin*               OurPlugin;static PILInterface*		OurInterface;static StonithImports*		OurImports;static void*			interfprivate;PIL_rcPIL_PLUGIN_INIT(PILPlugin*us, const PILPluginImports* imports);PIL_rcPIL_PLUGIN_INIT(PILPlugin*us, const PILPluginImports* imports){	/* Force the compiler to do a little type checking */	(void)(PILPluginInitFun)PIL_PLUGIN_INIT;	PluginImports = imports;	OurPlugin = us;	/* Register ourself as a plugin */	imports->register_plugin(us, &OurPIExports);  	/*  Register our interface implementation */ 	return imports->register_interface(us, PIL_PLUGINTYPE_S	,	PIL_PLUGIN_S	,	&drac3Ops	,	NULL		/*close */	,	&OurInterface	,	(void*)&OurImports	,	&interfprivate); }#define BUFLEN	1024#define ST_HOST "host"struct pluginDevice {	StonithPlugin sp;	const char *pluginid;	CURL *curl;	int config;	char *host;	char *user;	char *pass;};static const char *pluginid = DEVICE;static const char *NOTpluginID = "destroyed (Dell DRAC III Card)";/* ------------------------------------------------------------------ *//* STONITH PLUGIN API                                                 *//* ------------------------------------------------------------------ */static StonithPlugin *drac3_new(void){	struct pluginDevice *drac3d = MALLOCT(struct pluginDevice);	if (drac3d == NULL) {			LOG(PIL_CRIT, "out of memory");			return(NULL);	}	memset(drac3d, 0, sizeof(*drac3d));	drac3d->pluginid = pluginid;	drac3d->curl = NULL;	drac3d->config = 0;	drac3d->host = NULL;	drac3d->user = NULL;	drac3d->pass = NULL;	drac3d->sp.s_ops = &drac3Ops;	return (&(drac3d->sp));}/* ------------------------------------------------------------------ */static voiddrac3_destroy(StonithPlugin * s){	struct pluginDevice *drac3d;	VOIDERRIFWRONGDEV(s);	drac3d = (struct pluginDevice *) s;	drac3d->pluginid = NOTpluginID;	/* release curl connection */	if (drac3d->curl != NULL) {		drac3Logout(drac3d->curl, drac3d->host);		curl_easy_cleanup(drac3d->curl);		drac3d->curl = NULL;	}	if (drac3d->host != NULL) {			FREE(drac3d->host);			drac3d->host = NULL;	}	if (drac3d->user != NULL) {			FREE(drac3d->user);			drac3d->user = NULL;	}	if (drac3d->pass != NULL) {			FREE(drac3d->pass);			drac3d->pass = NULL;	}	/* release stonith-object itself */	FREE(drac3d);}/* ------------------------------------------------------------------ */static const char **drac3_get_confignames(StonithPlugin * s){	static const char * ret[] = {ST_HOST, ST_LOGIN, ST_PASSWD, NULL};	return ret;}/* ------------------------------------------------------------------ */static intdrac3_set_config(StonithPlugin * s, StonithNVpair * list){	struct pluginDevice* sd = (struct pluginDevice *)s;	int		rc;	StonithNamesToGet	namestoget [] =	{	{ST_HOST,	NULL}	,	{ST_LOGIN,	NULL}	,	{ST_PASSWD,	NULL}	,	{NULL,		NULL}	};	ERRIFWRONGDEV(s, S_OOPS);	if (sd->sp.isconfigured) {		return S_OOPS;	}	if ((rc=OurImports->GetAllValues(namestoget, list)) != S_OK) {		return rc;	}	sd->host = namestoget[0].s_value;	sd->user = namestoget[1].s_value;	sd->pass = namestoget[2].s_value;	sd->config = 1;	return(S_OK);}/* ------------------------------------------------------------------ */const char *drac3_getinfo(StonithPlugin * s, int reqtype){	struct pluginDevice *drac3d;	const char *ret = NULL;	ERRIFWRONGDEV(s,NULL);	drac3d = (struct pluginDevice *) s;	switch (reqtype) {		case ST_DEVICEID:			ret = drac3d->pluginid;			break;		case ST_DEVICEDESCR:			ret = _("Dell DRACIII (via HTTPS)\n"				"The Dell Remote Access Controller accepts XML commands over HTTPS");			break;		case ST_DEVICEURL:			ret = _("http://www.dell.com/us/en/biz/topics/power_ps2q02-bell.htm");			break;		default:			ret = NULL;			break;	}	return(ret);}/* ------------------------------------------------------------------ */intdrac3_status(StonithPlugin  *s){	struct pluginDevice *drac3d;	ERRIFNOTCONFIGED(s,S_OOPS);	drac3d = (struct pluginDevice *) s;	if (drac3VerifyLogin(drac3d->curl, drac3d->host)) {		if (drac3Login(drac3d->curl, drac3d->host,		                drac3d->user, drac3d->pass)) {		 	LOG(PIL_CRIT, "%s: cannot log into %s at %s", 							__FUNCTION__,							DEVICE,							drac3d->host);		 	return(S_ACCESS);		}	}	if (drac3GetSysInfo(drac3d->curl, drac3d->host)) 		return(S_ACCESS);	else		return(S_OK);}/* ------------------------------------------------------------------ */intdrac3_reset_req(StonithPlugin * s, int request, const char *host){	struct pluginDevice *drac3d;	int rc = S_OK;	ERRIFNOTCONFIGED(s,S_OOPS);	drac3d = (struct pluginDevice *) s;	if (drac3VerifyLogin(drac3d->curl, drac3d->host)) {		if (drac3Login(drac3d->curl, drac3d->host,		                drac3d->user, drac3d->pass)) {		 	LOG(PIL_CRIT, "%s: cannot log into %s at %s", 							__FUNCTION__,							DEVICE,							drac3d->host);		 	return(S_ACCESS);		}	}	switch(request) {#if defined(ST_POWERON) && defined(ST_POWEROFF)		case ST_POWERON:		case ST_POWEROFF:			/* TODO... */#endif		case ST_GENERIC_RESET:			if (drac3PowerCycle(drac3d->curl, drac3d->host))				rc = S_ACCESS;			break;		default:			rc = S_INVAL;			break;	}	return(rc);}/* ------------------------------------------------------------------ */char **drac3_hostlist(StonithPlugin * s){	struct pluginDevice *drac3d;	char **hl;	ERRIFNOTCONFIGED(s,NULL);	drac3d = (struct pluginDevice *) s;	hl = (char **)MALLOC(2*sizeof(char*));	if (hl == NULL) {		LOG(PIL_CRIT, "%s: out of memory", __FUNCTION__);	} else {		hl[1]=NULL;		hl[0]=STRDUP(drac3d->host);		if (hl[0]) {			LOG(PIL_CRIT, "%s: out of memory", __FUNCTION__);			FREE(hl);			hl = NULL;		}		g_strdown(hl[0]);	}	return(hl);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -