summaryrefslogtreecommitdiffstats
path: root/include/stonith/stonith.h
blob: 93fbaacb8b9c874f7be4408c89209c5d06651fb0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
/*
 *	S hoot
 *	T he
 *	O ther
 *	N ode
 *	I n
 *	T he
 *	H ead
 *
 *	Cause the other machine to reboot or die - now.
 *
 *	We guarantee that when we report that the machine has been
 *	rebooted, then it has been (barring misconfiguration or hardware
 *	errors)
 *
 *	A machine which we have STONITHed won't do anything more to its
 *	peripherials etc. until it goes through the reboot cycle.
 */

/*
 *
 * Copyright (c) 2000 Alan Robertson <alanr@unix.sh>
 * Copyright (c) 2004 International Business Machines, Inc.
 *
 * Author: Alan Robertson
 *
 * 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
 *
 */

#ifndef __STONITH_H
#	define __STONITH_H
#include <glib.h>
#include <ctype.h>

#include <pils/plugin.h>
#define	STONITH_VERS	2

/*
 *	Return codes from "Stonith" operations
 */

#define	S_OK		0	/* Machine correctly reset	*/
#define	S_BADCONFIG	1	/* Bad config info given	*/
#define	S_ACCESS	2	/* Can't access STONITH device	*/
				/* (login/passwd problem?)	*/
#define	S_INVAL		3	/* Bad/illegal argument		*/
#define	S_BADHOST	4	/* Bad/illegal host/node name	*/
#define	S_RESETFAIL	5	/* Reset failed			*/
#define	S_TIMEOUT	6	/* Timed out in the dialogues	*/
#define	S_ISOFF		7	/* Can't reboot: Outlet is off	*/
#define	S_OOPS		8	/* Something strange happened	*/

typedef struct stonith {
	char *	stype;
}Stonith;

/* An array of StonithNVpairs is terminated by a NULL s_name */
typedef struct {
	char *	s_name;
	char *	s_value;
}StonithNVpair;

/*
 *	Operation requested by reset_req()
 */
#define	ST_GENERIC_RESET	1 /* Reset the machine any way you can */
#define	ST_POWERON		2 /* Power the node on */
#define	ST_POWEROFF		3 /* Power the node off */
/*
 *	Type of information requested by the get_info() call
 */
#define ST_CONF_XML	1	/* XML config info */
#define ST_DEVICEID	2	/* Device Type Identification */
#define ST_DEVICENAME	3	/* Unique Individual Device Identification */
				/* (only after stonith_set_config() call) */
#define ST_DEVICEDESCR	4	/* Device Description text */
#define ST_DEVICEURL	5	/* Manufacturer/Device URL */

extern PILPluginUniv *StonithPIsys;

char **	stonith_types(void);	/* NULL-terminated list */
				/* valid until next call of stonith_types() */
Stonith*stonith_new(const char * type);
void	stonith_delete(Stonith *);

const char * const *	stonith_get_confignames	(Stonith* s);
				/* static/global return */
				/* Return number and list of valid s_names */

const char*			/* static/global return - lots of things! */
	stonith_get_info	(Stonith* s, int infotype);

void	stonith_set_debug	(Stonith* s, int debuglevel);
void	stonith_set_log		(Stonith* s
				, PILLogFun);
			
int	stonith_set_config	(Stonith* s, StonithNVpair* list);
int	stonith_set_config_file(Stonith* s, const char * configname);
				/* uses get_confignames to determine which 
				 * names to look for in file configname, which
				 * is passed in by the -F option */
int	stonith_set_config_info(Stonith* s, const char * info);
				/* uses get_confignames to determine which 
				 * names to look for in string info, which
				 * is passed in by the -p option */
	/*
	 * Must call stonith_set_config() before calling functions below...
	 */
char**	stonith_get_hostlist	(Stonith* s);
void	stonith_free_hostlist	(char** hostlist);
int	stonith_get_status	(Stonith* s);
int	stonith_req_reset	(Stonith* s, int operation, const char* node);

StonithNVpair* stonith_env_to_NVpair(Stonith* s);

/* Stonith 1 compatibility:  Convert string to an NVpair set */
StonithNVpair*
	stonith1_compat_string_to_NVpair(Stonith* s, const char * str);
StonithNVpair*
	stonith_ghash_to_NVpair(GHashTable* stringtable);
void	free_NVpair(StonithNVpair*); /* Free result from above 2 functions */
void strdown(char *str); /* simple replacement for g_strdown */

/*
 * The ST_DEVICEID info call is intended to return the type of the Stonith
 * device.  Note that it may return a different result once it has attempted
 * to talk to the device (like after a status() call).  This is because
 * a given STONITH module may be able to talk to more than one kind of
 * model of STONITH device, and can't tell which type is out there
 * to until it talks to it.  For example, Baytech 3, Baytech 5 and
 * Baytech 5a are all supported by one module, and this module actually
 * captures the particular model number after it talks to it.
 *
 * The ST_DEVICEDESCR info call is intended to return information identifying
 * the type of STONITH device supported by this STONITH object.  This is so
 * users can tell if they have this kind of device or not.
 *
 * SHOULD THIS BE IN THE XML SO IT CAN BE SUPPLIED IN SEVERAL LANGUAGES??
 * But, this would mean the STONITH command would have to parse XML.
 * Sigh...  I'd rather not...  Or maybe it can be supplied duplicately
 * in the XML if that is thought to be desirable...
 *
 * The ST_DEVICEURL info call is intended to return the URL of a web site
 * related to the device in question.  This might be the manufacturer,
 * a pointer to the product line, or the individual product itself.
 *
 * A good way for a GUI to work which configures STONITH devices would be to
 * use the result of the stonith_types() call in a pulldown menu.
 *
 * Once the type is selected, create a Stonith object of the selected type.
 * One can then create a dialog box to create the configuration info for the
 * device using return from the ST_CONF_XML info call to direct the
 * GUI in what information to ask for to fill up the StonithNVpair
 * argument to the stonith_set_config() call.  This information would then
 * be prompted for according to the XML information, and then put into
 * a NULL-terminated array of StonithNVpair objects.
 *
 * Once this has been done, it can be tested for syntactic
 * validity with stonith_set_config().
 *
 * If it passes set_config(), it can be further validated using status()
 * which will then actually try and talk to the STONITH device.  If status()
 * returns S_OK, then communication with the device was successfully
 * established.
 *
 * Normally that would mean that logins, passwords, device names, and IP
 * addresses, etc. have been validated as required by the particular device.
 *
 * At this point, you can ask the device which machines it knows how to reset
 * using the stonith_get_hostlist() function.
 *
 */

#endif /*__STONITH_H*/