Page Menu
Home
ClusterLabs Projects
Search
Configure Global Search
Log In
Files
F2825258
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
20 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/tools/haresources2cib.py.in b/tools/haresources2cib.py.in
index 7aee7a4959..274ca83469 100755
--- a/tools/haresources2cib.py.in
+++ b/tools/haresources2cib.py.in
@@ -1,517 +1,519 @@
#!@PYTHON@
'''haresources2cib.py.in, convert the haresources file of heartbeat 1.x
to cib.xml for heartbeat 2.x
'''
__copyright__='''
Author: Huang Zhen <zhenhltc@cn.ibm.com>
Copyright (C) 2005 International Business Machines
'''
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
import sys,string,os
import xml.dom.minidom
using_ocf = 1
using_mon = 1
enable_stonith = False
ocf_ra_setting = {
"apache" :{"params":["configfile","httpd","port","statusurl","options","testregex"],"time":["120s","60s"]},
"IPaddr" :{"params":["ip","nic","cidr_netmask","broadcast","iflabel","lvs_support","local_stop_script","local_start_script","ARP_INTERVAL_MS","ARP_REPEAT","ARP_BACKGROUND","ARP_NETMASK"],"time":["5s","5s"]},
"IPaddr2" :{"params":["ip","nic","cidr_netmask","broadcast","iflabel","lvs_support","mac","clusterip_hash","arp_interval","arp_count","arp_bg","arp_mac"],"time":["5s","5s"]},
"db2" :{"params":["instance","admin"],"time":["120s","60s"]},
"oracle" :{"params":["sid","home","user","ipcrm"],"time":["120s","60s"]},
"oralsnr" :{"params":["sid","home","user","listener"],"time":["120s","60s"]},
"AudibleAlarm":{"params":["nodelist"],"time":["120s","60s"]},
"Delay" :{"params":["startdelay","stopdelay","mondelay"],"time":["120s","60s"]},
"Filesystem":{"params":["device","directory","fstype","options","ocfs2_cluster","ocfs2_configfs"],"time":["120s","60s"]},
"ICP" :{"params":["driveid","device"],"time":["120s","60s"]},
"IPsrcaddr" :{"params":["ipaddress"],"time":["5s","5s"]},
"IPv6addr" :{"params":["ipv6addr"],"time":["5s","5s"]},
"LinuxSCSI" :{"params":["scsi"],"time":["120s","60s"]},
"LVM" :{"params":["volgrpname"],"time":["120s","60s"]},
"MailTo" :{"params":["email","subject"],"time":["120s","60s"]},
"portblock" :{"params":["protocol","portno","action"],"time":["120s","60s"]},
- "Raid1" :{"params":["raidconf","raiddev"],"time":["120s","60s"]},
+ "Raid1" :{"params":["raidconf","raiddev","homehost"],"time":["120s","60s"]},
"ServeRAID" :{"params":["serveraid","mergegroup"],"time":["120s","60s"]},
"WinPopup" :{"params":["hostfile"],"time":["120s","60s"]},
"Xinetd" :{"params":["service"],"time":["120s","60s"]},
"ClusterMon" :{"params":["user","update","extra_options","pidfile","htmlfile"],"time":["120s","60s"]},
"Dummy" :{"params":["state"],"time":["120s","60s"]},
"EvmsSCC" :{"params":[],"time":["120s","60s"]},
"Evmsd" :{"params":[],"time":["120s","60s"]},
"ManageRAID" :{"params":["raidname"],"time":["120s","60s"]},
"ManageVE" :{"params":["veid"],"time":["120s","60s"]},
- "Pure-FTPd" :{"params":["script","conffile"],"time":["120s","60s"]},
+ "Pure-FTPd" :{"params":["script","conffile","daemon_type","pidfile"],"time":["120s","60s"]},
"SAPDatabase" :{"params":["SID","DIR_EXECUTABLE","DBTYPE","NETSERVICENAME","DBJ2EE_ONLY","DIR_BOOTSTRAP","DIR_SECSTORE"],"time":["120s","60s"]},
"SAPInstance" :{"params":["InstanceName","DIR_EXECUTABLE","DIR_PROFILE","START_PROFILE"],"time":["120s","60s"]},
"SendArp" :{"params":["ip","nic"],"time":["120s","60s"]},
"Stateful" :{"params":["state"],"time":["120s","60s"]},
"SysInfo" :{"params":["pidfile","delay"],"time":["120s","60s"]},
"VIPArip" :{"params":["ip","nic"],"time":["120s","60s"]},
"WAS" :{"params":["config","port"],"time":["120s","60s"]},
"WAS6" :{"params":["profile"],"time":["120s","60s"]},
"Xen" :{"params":["xmfile"],"time":["120s","60s"]},
"drbd" :{"params":["drbd_resource","drbdconf","clone_overrides_hostname","clone_max","clone_node_max","master_max","master_node_max"],"time":["120s","60s"]},
"eDir88" :{"params":["eDir_config_file","eDir_monitor_ldap","eDir_monitor_idm","eDir_jvm_initial_heap","eDir_jvm_max_heap","eDir_jvm_options"],"time":["120s","60s"]},
"ids" :{"params":["informixdir","informixserver","onconfig","dbname","sqltestquery"],"time":["120s","60s"]},
- "mysql" :{"params":["binary","config","datadir","user","group","test_table","test_user","test_passwd","enable_creation"],"time":["120s","60s"]},
+ "iscsi" :{"params":["portal","target","discovery_type","iscsiadm"],"time":["120s","60s"]},
+ "mysql" :{"params":["binary","config","datadir","user","group","log","pid","socket","test_table","test_user","test_passwd","enable_creation","additional_parameters"],"time":["120s","60s"]},
"o2cb" :{"params":["netdev","port","ocfs2_cluster"],"time":["120s","60s"]},
- "pgsql" :{"params":[],"time":["120s","60s"]},
+ "pgsql" :{"params":["pgctl","start_opt","ctl_opt","psql","pgdata","pgdba","pghost","pgport","pgdb","logfile","stop_escalate"],"time":["120s","60s"]},
"pingd" :{"params":["pidfile","user","dampen","set","name","section","multiplier","host_list"],"time":["120s","60s"]},
- "rsyncd" :{"params":["binpath","conffile","bwlimit"],"time":["120s","60s"]}
+ "rsyncd" :{"params":["binpath","conffile","bwlimit"],"time":["120s","60s"]},
+ "tomcat" :{"params":["tomcat_name","script_log","tomcat_stop_timeout","tomcat_suspend_trialcount","tomcat_user","statusurl","java_home","catalina_home","catalina_pid"],"time":["120s","60s"]}
}
config_defaults = [
"symmetric-cluster=true",
"no-quorum-policy=stop",
"default-resource-stickiness=0",
"default-resource-failure-stickiness=0",
"stonith-enabled=false",
"stonith-action=reboot",
"startup-fencing=true",
"stop-orphan-resources=true",
"stop-orphan-actions=true",
"remove-after-stop=false",
"short-resource-names=true",
"transition-idle-timeout=5min",
"default-action-timeout=15s",
"is-managed-default=true",
"cluster-delay=60s",
"pe-error-series-max=-1",
"pe-warn-series-max=-1",
"pe-input-series-max=-1",
]
def create_cib() :
doc = xml.dom.minidom.Document()
cib = doc.createElement("cib")
doc.appendChild(cib)
configuration = doc.createElement("configuration")
cib.appendChild(configuration)
cib.setAttribute("admin_epoch","0")
cib.setAttribute("epoch","0")
cib.setAttribute("num_updates","0")
crm_config = doc.createElement("crm_config")
configuration.appendChild(crm_config)
option_set = doc.createElement("cluster_property_set")
option_set.setAttribute("id","cib-bootstrap-options")
crm_config.appendChild(option_set)
attr_list = doc.createElement("attributes")
option_set.appendChild(attr_list)
for option in config_defaults:
option_details = string.split(option, '=')
nvpair = doc.createElement("nvpair")
attr_list.appendChild(nvpair)
nvpair.setAttribute("id", "cib-bootstrap-options-"+option_details[0])
nvpair.setAttribute("name", option_details[0])
nvpair.setAttribute("value", option_details[1])
if option_details[0] == "stonith_enabled" and enable_stonith:
nvpair.setAttribute("value", "true")
configuration.appendChild(doc.createElement("nodes"))
resources = doc.createElement("resources")
configuration.appendChild(resources)
constraints = doc.createElement("constraints")
configuration.appendChild(constraints)
status = doc.createElement("status")
cib.appendChild(status)
return doc, resources, constraints
def get_ra_class(type) :
if os.path.exists("@HB_RA_DIR@"+"/"+type) :
return "heartbeat"
if os.path.exists("@INITDIR@"+"/"+type) :
return "lsb"
sys.stderr.write(type+" is an unknown Resource Agent. " \
"Please refer to http://www.linux-ha.org/ResourceAgent\n")
return "UNKNOWN"
def cib_resource(doc,user_res_id,index, rsc):
id, type, params = None, None, None
#if no parameters in rsc, like "apache", "192.168.0.11"
if string.find(rsc, "::") == -1 :
#if there is a IP address in rsc, like "192.168.0.11"
if len(string.split(string.split(rsc,'/')[0],'.')) == 4 :
type = "IPaddr"
params = [rsc]
#no IP address, like "apache"
else :
type = rsc
#else there have "::" in rsc,
#like "IPaddr::192.168.0.11", "IPaddr2::192.168.0.11"
else :
if string.find(rsc, "IPaddr") == 0 :
type = string.split(rsc, "::")[0]
params = [string.split(rsc, "::")[1]]
else :
fields = string.split(rsc,"::")
type = fields[0]
params = fields[1:]
if user_res_id == "" :
if type == "IPaddr" :
id = type+"_"+string.replace(string.split(params[0],'/')[0],'.','_')
else :
id = type+"_"+str(index)
else :
id = user_res_id
resource = doc.createElement("primitive")
resource.setAttribute("id",id)
resource.setAttribute("type",type)
if using_ocf and type in ocf_ra_setting:
resource.setAttribute("class","ocf")
else :
ra_class = get_ra_class(type)
resource.setAttribute("class",ra_class)
resource.setAttribute("provider","heartbeat")
if using_mon :
operations = doc.createElement("operations")
resource.appendChild(operations)
mon_op = doc.createElement("op")
operations.appendChild(mon_op)
mon_op.setAttribute("id", id + "_mon")
mon_op.setAttribute("name","monitor")
interval = "120s"
timeout = "60s"
if using_ocf and type in ocf_ra_setting :
interval = ocf_ra_setting[type]["time"][0]
timeout = ocf_ra_setting[type]["time"][1]
mon_op.setAttribute("interval", interval)
mon_op.setAttribute("timeout", timeout)
if params != None and len(params) != 0:
instance_attributes = doc.createElement("instance_attributes")
instance_attributes.setAttribute("id", id + "_inst_attr")
resource.appendChild(instance_attributes)
attributes = doc.createElement("attributes")
instance_attributes.appendChild(attributes)
if using_ocf and type in ocf_ra_setting :
if type in ["IPaddr", "IPaddr2"] :
unsort = string.split(params[0], "/")
params = [None, None, None, None]
#ip
params[0] = unsort[0]
for param in unsort[1:] :
if len(string.split(param, ".")) == 4 :
#broadcast
params[3] = param
break
try :
int(param)
#netmask bits
params[1] = param
except ValueError:
#nic
params[2] = param
for i in range(0,len(params)) :
if params[i] == None :
continue
nvpair = doc.createElement("nvpair")
name = ocf_ra_setting[type]["params"][i]
nvpair.setAttribute("id",id + "_attr_" + str(i))
nvpair.setAttribute("name",name)
if i == len(ocf_ra_setting[type]["params"]) - 1 :
nvpair.setAttribute("value",string.join(params[i:]))
attributes.appendChild(nvpair)
break
else :
nvpair.setAttribute("value",str(params[i]))
attributes.appendChild(nvpair)
else :
i = 1
for param in params :
nvpair = doc.createElement("nvpair")
nvpair.setAttribute("id",id + "_attr_" + str(i))
nvpair.setAttribute("name",str(i))
nvpair.setAttribute("value",str(param))
attributes.appendChild(nvpair)
i += 1
return id, resource
def cib_rsc_order(doc, args):
rsc_order = doc.createElement("rsc_order")
rsc_order.setAttribute("id","rsc_order_"+args[0]+"_"+args[3])
rsc_order.setAttribute("from",args[0])
rsc_order.setAttribute("action",args[1])
rsc_order.setAttribute("type",args[2])
rsc_order.setAttribute("to",args[3])
rsc_order.setAttribute("symmetrical","true")
return rsc_order
def cib_rsc_colocation(doc, args):
if len(args) != 3 :
sys.stderr.write("rsc_colocation: bad usage\n")
return
rsc_colocation = doc.createElement("rsc_colocation")
rsc_colocation.setAttribute("id","rsc_colocation_"+args[0]+"_"+args[1])
rsc_colocation.setAttribute("from",args[0])
rsc_colocation.setAttribute("to",args[1])
rsc_colocation.setAttribute("score",args[2])
return rsc_colocation
def cib_rsc_location(doc, id, node):
rsc_location = doc.createElement("rsc_location")
rsc_location.setAttribute("id","rsc_location_"+id)
rsc_location.setAttribute("rsc",id)
rule = doc.createElement("rule")
rule.setAttribute("id","prefered_location_"+id)
rule.setAttribute("score","100")
rsc_location.appendChild(rule)
expression = doc.createElement("expression")
expression.setAttribute("id","prefered_location_"+id+"_expr")
expression.setAttribute("attribute","#uname")
expression.setAttribute("operation","eq")
expression.setAttribute("value", node)
rule.appendChild(expression)
return rsc_location
def cib_resource_group(doc, id):
resource_group = doc.createElement("group")
resource_group.setAttribute("id",id)
return resource_group
def cib_resource_clone(doc, id, clone_max, clone_node_max):
resource_clone = doc.createElement("clone")
resource_clone.setAttribute("id",id)
instance_attributes = doc.createElement("instance_attributes")
instance_attributes.setAttribute("id", id + "_inst_attr")
resource_clone.appendChild(instance_attributes)
attributes = doc.createElement("attributes")
instance_attributes.appendChild(attributes)
nvpair = doc.createElement("nvpair")
nvpair.setAttribute("id",id + "_attr_1")
nvpair.setAttribute("name", "clone_max")
nvpair.setAttribute("value", str(clone_max))
attributes.appendChild(nvpair)
nvpair = doc.createElement("nvpair")
nvpair.setAttribute("id",id + "_attr_2")
nvpair.setAttribute("name", "clone_node_max")
nvpair.setAttribute("value", str(clone_node_max))
attributes.appendChild(nvpair)
return resource_clone
def add_resource(cib,user_res_id,index,node,rsc):
id,resource = cib_resource(cib[0],user_res_id,index,rsc)
cib[1].appendChild(resource)
rsc_location = cib_rsc_location(cib[0],id,node)
cib[2].appendChild(rsc_location)
def add_resource_group(cib,user_res_id,index,node,rscs):
if user_res_id == "" :
groupid = "group_"+str(group_index)
else :
groupid = user_res_id
resource_group = cib_resource_group(cib[0],groupid)
cib[1].appendChild(resource_group)
for rsc in rscs :
rid,resource = cib_resource(cib[0],"",index,rsc)
resource_group.appendChild(resource)
index += 1
rsc_location = cib_rsc_location(cib[0],groupid,node)
cib[2].appendChild(rsc_location)
def add_clone(cib,user_res_id, index,rsc) :
if user_res_id == "" :
cloneid = "clone_"+str(index)
else :
cloneid = user_res_id
clone = cib_resource_clone(cib[0], cloneid, node_num, 1)
cib[1].appendChild(clone)
id,resource = cib_resource(cib[0],"",index,rsc)
clone.appendChild(resource)
def add_stonith_clone(cib, index, params, node_num) :
clone = cib_resource_clone(cib[0], "clone_"+str(index), node_num, 1)
cib[1].appendChild(clone)
id, stonith = cib_stonith(cib[0], index, params)
clone.appendChild(stonith)
def cib_stonith(doc, index, params):
id = "stonith_"+str(index)
resource = doc.createElement("primitive")
resource.setAttribute("id",id)
resource.setAttribute("type",params[1])
resource.setAttribute("class","stonith")
resource.setAttribute("provider","heartbeat")
if using_mon :
operations = doc.createElement("operations")
resource.appendChild(operations)
mon_op = doc.createElement("op")
operations.appendChild(mon_op)
mon_op.setAttribute("id", id + "_mon")
mon_op.setAttribute("name","monitor")
mon_op.setAttribute("interval", "5s")
mon_op.setAttribute("timeout", "20s")
mon_op.setAttribute("prereq", "nothing")
start_op = doc.createElement("op")
operations.appendChild(start_op)
start_op.setAttribute("id", id + "_start")
start_op.setAttribute("name","start")
start_op.setAttribute("timeout", "20s")
start_op.setAttribute("prereq", "nothing")
if len(params) > 2 :
instance_attributes = doc.createElement("instance_attributes")
instance_attributes.setAttribute("id", id + "_inst_attr")
resource.appendChild(instance_attributes)
attributes = doc.createElement("attributes")
instance_attributes.appendChild(attributes)
names = string.split(os.popen("stonith -n -t "+params[1]).readline())
for i in range(2, len(params)) :
nvpair = doc.createElement("nvpair")
nvpair.setAttribute("id", id + "_attr_" + str(i))
nvpair.setAttribute("name", names[i-2])
nvpair.setAttribute("value", params[i])
attributes.appendChild(nvpair)
return id, resource
def add_stonith_host(cib, stonith_host, index, node_num) :
params = string.split(stonith_host)[1:]
if params[0] == "*" :
add_stonith_clone(cib, index, params, node_num)
else :
id, resource = cib_stonith(cib[0], index, params)
cib[1].appendChild(resource)
stonith_location = cib_rsc_location(cib[0],id,params[0])
cib[2].appendChild(stonith_location)
def get_directive_list(config, directive) :
directive_list = []
for line in config :
line = line.lstrip()
if len (line) == 0 or line[0] == "#" :
continue
if string.split(line)[0] == directive :
directive_list.append(line)
return directive_list
if __name__=="__main__" :
resource_file = "@HA_HBCONF_DIR@/haresources"
config_file = "@HA_HBCONF_DIR@/ha.cf"
target_file = "@HA_VARLIBDIR@/heartbeat/crm/cib.xml"
to_stdout = False
# Process arguments...
skipthis = None
args = sys.argv[1:]
for i in range(0, len(args)) :
if skipthis :
skipthis = None
continue
elif args[i] == "--no-ocf" :
using_ocf = 0
elif args[i] == "--stdout" :
to_stdout = True
elif args[i] == "--no-monitor" :
using_mon = 0
elif args[i] == "--config" or args[i] == "-c" :
skipthis = True
config_file = args[i+1]
elif args[i] == "--help" or args[i] == "-h" :
print "usage: " + sys.argv[0] \
+ " [--no-ocf]"\
+ " [--stdout]"\
+ " [--no-monitor]"\
+ " [--config|-c configfile]"\
+ " [--help|-h]"\
+ " [resourcefile]"
sys.exit(1)
else:
resource_file = args[i]
config = open(config_file, "r").readlines()
node_list = get_directive_list(config, "node")
node_num = 0
for nodes in node_list :
node_num += len(string.split(nodes)) -1
stonith_host_list = get_directive_list(config, "stonith_host")
if len(stonith_host_list) != 0 :
enable_stonith = True
file = open(resource_file, "r")
cib = create_cib()
pre_line = ""
id_index = 1
group_index = 1
for line in file.readlines() :
line = string.strip(line)
if len (line) == 0 :
continue
if line[0] == '#' and string.find(line,"#rsc_order") != 0 and string.find(line,"#rsc_colocation") != 0 :
continue
if line[-1] == '\\' :
pre_line += line[:-1] + " "
continue
else :
line = pre_line + line
pre_line = ""
fields = string.split(line)
if fields[len(fields)-1][0] == '#' :
user_res_id = fields[len(fields)-1][1:]
fields.pop()
else :
user_res_id = ""
if fields[0] == "#rsc_order" and len(fields) == 5 :
rsc_order = cib_rsc_order(cib[0],fields[1:])
cib[2].appendChild(rsc_order)
elif fields[0] == "#rsc_colocation" and len(fields) == 4 :
rsc_colocation = cib_rsc_colocation(cib[0],fields[1:])
cib[2].appendChild(rsc_colocation)
elif string.find(user_res_id, "clone:") == 0 :
add_clone(cib, user_res_id[len("clone:"):], group_index, fields[1])
group_index += 10
id_index += 1
elif len(fields) == 2 :
add_resource(cib, user_res_id, id_index, fields[0], fields[1])
id_index += 1
elif len(fields) > 2 :
add_resource_group(cib, user_res_id, group_index, fields[0], fields[1:])
group_index += 10
id_index += len(fields)
else :
sys.stderr.write("can not parse this line:"+line+"\n")
if enable_stonith :
for stonith_host in stonith_host_list :
add_stonith_host(cib, stonith_host, id_index, node_num)
id_index += 1
if to_stdout :
print cib[0].toprettyxml()
elif os.access(target_file, os.F_OK) or os.access(target_file+".sig", os.F_OK) :
sys.stderr.write("cib.xml or cib.xml.sig exist in @HA_VARLIBDIR@/heartbeat/crm/\n")
sys.stderr.write("please remove them before generating new cib.xml\n")
else :
cib_file = open(target_file, "w")
cib_file.write(cib[0].toprettyxml())
cib_file.close()
os.system("chown @HA_CCMUSER@.@HA_APIGROUP@ "+target_file)
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, Jan 25, 11:57 AM (1 d, 20 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1322466
Default Alt Text
(20 KB)
Attached To
Mode
rP Pacemaker
Attached
Detach File
Event Timeline
Log In to Comment