diff -ur a/luci/cluster/fence-macros b/luci/cluster/fence-macros --- a/luci/cluster/fence-macros 2010-08-31 15:41:22.000000000 -0400 +++ b/luci/cluster/fence-macros 2010-08-31 16:23:09.000000000 -0400 @@ -186,6 +186,10 @@ <tal:block metal:use-macro="here/fence-macros/macros/fence-form-ilo" /> </tal:block> + <tal:block tal:condition="python: cur_fence_type == 'fence_ilo_mp'"> + <tal:block metal:use-macro="here/fence-macros/macros/fence-form-ilo_mp" /> + </tal:block> + <tal:block tal:condition="python: cur_fence_type == 'fence_drac'"> <tal:block metal:use-macro="here/fence-macros/macros/fence-form-drac" /> </tal:block> @@ -357,6 +361,7 @@ <option name="fence_gnbd" value="fence_gnbd">GNBD</option> <option name="fence_egenera" value="fence_egenera">Egenera SAN Controller</option> <option name="fence_ilo" value="fence_ilo">HP iLO</option> + <option name="fence_ilo_mp" value="fence_ilo_mp">HP iLO MP</option> <option name="fence_rsa" value="fence_rsa">IBM RSA II</option> <option name="fence_rsb" value="fence_rsb">Fujitsu Siemens RSB</option> <option name="fence_bladecenter" value="fence_bladecenter">IBM Blade Center</option> @@ -682,6 +687,100 @@ </div> </div> +<div metal:define-macro="fence-form-ilo_mp" + tal:attributes="id cur_fencedev/name | nothing"> + + <div id="fence_ilo_mp" class="fencedev"> + <table> + <tr> + <td><strong class="cluster">Fence Type</strong></td> + <td>HP iLO MP</td> + </tr> + <tr> + <td>Name</td> + <td> + <input name="name" type="text" + tal:attributes="value cur_fencedev/name | nothing" /> + </td> + </tr> + <tr> + <td>Hostname</td> + <td> + <input name="ipaddr" type="text" + tal:attributes="value cur_fencedev/ipaddr | nothing" /> + </td> + </tr> + <tr> + <td>IP port (optional)</td> + <td> + <input name="ipport" type="text" class="text" + tal:attributes="value cur_fencedev/ipport | nothing" /> + </td> + </tr> + <tr> + <td>Login</td> + <td> + <input name="login" type="text" + tal:attributes="value cur_fencedev/login | nothing" /> + </td> + </tr> + <tr> + <td>Password</td> + <td> + <input name="passwd" type="password" autocomplete="off" + tal:attributes="value cur_fencedev/passwd | nothing" /> + </td> + </tr> + <tr> + <td> + <span title="Full path to a script to generate fence password">Password Script (optional)</span> + </td> + <td> + <input type="text" name="passwd_script" + tal:attributes=" + value cur_fencedev/passwd_script | nothing" /> + </td> + </tr> + <tr tal:condition="exists:clusterinfo/has_fence_ssh"> + <td> + <span title="Enable SSH operation">Use SSH</span> + </td> + <td> + <input tal:condition="exists:cur_fencedev" + type="checkbox" name="secure" + tal:attributes=" + checked python:(cur_fencedev and cur_fencedev.has_key('secure') and (cur_fencedev['secure'] == '1' or cur_fencedev['secure'].lower() == 'true')) and 'checked' or ''" /> + <input tal:condition="not:exists:cur_fencedev" + type="checkbox" name="secure" /> + </td> + </tr> + <tr> + <td>Force command prompt</td> + <td> + <input type="text" class="text" name="cmd_prompt" + tal:attributes="value cur_fencedev/cmd_prompt | nothing" /> + </td> + </tr> + <tr> + <td>Power wait (seconds)</td> + <td> + <input type="text" name="power_wait" + tal:attributes=" + value cur_fencedev/power_wait | nothing" /> + </td> + </tr> + </table> + + <tal:block tal:condition="exists: cur_fencedev"> + <input type="hidden" name="existing_device" value="1" /> + <input type="hidden" name="orig_name" + tal:attributes="value cur_fencedev/name | nothing" /> + </tal:block> + + <input type="hidden" name="fence_type" value="fence_ilo_mp" /> + </div> +</div> + <div metal:define-macro="fence-form-drac" tal:attributes="id cur_fencedev/name | nothing"> @@ -1941,6 +2040,7 @@ <tal:block metal:use-macro="here/fence-macros/macros/fence-form-mcdata" /> <tal:block metal:use-macro="here/fence-macros/macros/fence-form-wti" /> <tal:block metal:use-macro="here/fence-macros/macros/fence-form-ilo" /> + <tal:block metal:use-macro="here/fence-macros/macros/fence-form-ilo_mp" /> <tal:block metal:use-macro="here/fence-macros/macros/fence-form-drac" /> <tal:block metal:use-macro="here/fence-macros/macros/fence-form-rsa" /> <tal:block metal:use-macro="here/fence-macros/macros/fence-form-rsb" /> diff -ur a/luci/cluster/validate_fence.js b/luci/cluster/validate_fence.js --- a/luci/cluster/validate_fence.js 2010-08-31 15:41:22.000000000 -0400 +++ b/luci/cluster/validate_fence.js 2010-08-31 16:23:09.000000000 -0400 @@ -33,6 +33,7 @@ fence_validator['egenera'] = [ 'cserver' ]; fence_validator['gnbd'] = [ 'servers' ]; fence_validator['ilo'] = [ 'hostname', 'login', 'passwd', 'passwd_script', 'secure' ]; +fence_validator['ilo_mp'] = [ 'hostname', 'login', 'passwd', 'passwd_script', 'secure', 'ipport', 'secure', 'cmd_prompt' ]; fence_validator['ipmilan'] = [ 'ipaddr', 'login', 'passwd', 'passwd_script', 'lanplus', 'auth' ]; fence_validator['manual'] = []; fence_validator['mcdata'] = [ 'ipaddr', 'login', 'passwd', 'passwd_script' ]; diff -ur a/luci/site/luci/Extensions/ClusterModel/FenceDeviceAttr.py b/luci/site/luci/Extensions/ClusterModel/FenceDeviceAttr.py --- a/luci/site/luci/Extensions/ClusterModel/FenceDeviceAttr.py 2010-08-31 16:00:31.000000000 -0400 +++ b/luci/site/luci/Extensions/ClusterModel/FenceDeviceAttr.py 2010-08-31 16:23:09.000000000 -0400 @@ -25,6 +25,7 @@ 'fence_xvm': 'Virtual Machine Fencing', 'fence_scsi': 'SCSI Reservation', 'fence_ilo': 'HP iLO Device', + 'fence_ilo_mp': 'HP iLO MP', 'fence_ipmilan': 'IPMI Lan', 'fence_drac': 'Dell DRAC', 'fence_rsa': 'IBM RSA II Device', @@ -52,6 +53,7 @@ 'fence_vmware': True, 'fence_cisco_mds': True, 'fence_ilo': False, + 'fence_ilo_mp': False, 'fence_ipmilan': False, 'fence_drac': False, 'fence_rsa': False, @@ -136,6 +138,8 @@ ( 'name' ), 'fence_ilo': ( 'name', 'hostname', 'login', 'passwd' ), + 'fence_ilo_mp': + ( 'name', 'ipaddr', 'login', 'passwd', 'ipport', 'secure', 'cmd_prompt' ), 'fence_ipmilan': ( 'name', 'ipaddr', 'login', 'passwd', 'lanplus', 'auth' ), 'fence_drac': diff -ur a/luci/site/luci/Extensions/FenceHandler.py b/luci/site/luci/Extensions/FenceHandler.py --- a/luci/site/luci/Extensions/FenceHandler.py 2010-08-31 16:00:51.000000000 -0400 +++ b/luci/site/luci/Extensions/FenceHandler.py 2010-08-31 16:23:09.000000000 -0400 @@ -1273,6 +1273,106 @@ return errors +def val_ilo_mp_fd(form, fencedev): + errors = list() + + try: + hostname = form['ipaddr'].strip() + if not hostname: + raise Exception, 'blank' + fencedev.addAttribute('ipaddr', hostname) + except Exception, e: + errors.append(FD_PROVIDE_HOSTNAME) + + try: + log = form['login'].strip() + if not log: + raise Exception, 'blank' + fencedev.addAttribute('login', log) + except Exception, e: + errors.append(FD_PROVIDE_LOGIN) + + try: + power_wait = form['power_wait'].strip() + if power_wait: + power_wait = int(power_wait) + if power_wait < 0: + raise ValueError + except (KeyError, AttributeError), e: + power_wait = None + except Exception, e: + power_wait = None + errors.append('An invalid value for power_wait was given: "%s"' % form['power_wait']) + if power_wait: + fencedev.addAttribute('power_wait', str(power_wait)) + else: + fencedev.removeAttribute('power_wait') + + has_passwd = False + try: + pwd = form['passwd'].strip() + if not pwd: + # Allow passwords that consist of only spaces. + if not form.has_key('passwd') or form['passwd'] == '': + raise Exception, 'blank' + else: + pwd = form['passwd'] + fencedev.addAttribute('passwd', pwd) + has_passwd = True + except Exception, e: + try: + fencedev.removeAttribute('passwd') + except: + pass + + try: + pwd_script = form['passwd_script'].strip() + if not pwd_script: + raise Exception, 'blank' + fencedev.addAttribute('passwd_script', pwd_script) + has_passwd = True + except Exception, e: + try: + fencedev.removeAttribute('passwd_script') + except: + pass + + if not has_passwd: + errors.append(FD_PROVIDE_PASSWD) + + use_ssh = form.has_key('secure') and (form['secure'] == '1' or form['secure'].lower() == 'true') + if use_ssh: + fencedev.addAttribute('secure', '1') + else: + fencedev.removeAttribute('secure') + + try: + ipport = form['ipport'].strip() + if ipport: + ipport = int(ipport) + if ipport < 1 or ipport & 0xffff != ipport: + raise ValueError + except (KeyError, AttributeError), e: + ipport = None + except Exception, e: + ipport = None + errors.append('An invalid value for ipport was given: "%s"' % form['ipport']) + if ipport: + fencedev.addAttribute('ipport', str(ipport)) + else: + fencedev.removeAttribute('ipport') + + try: + cmd_prompt = form['cmd_prompt'].strip() + except Exception, e: + cmd_prompt = None + if cmd_prompt: + fencedev.addAttribute('cmd_prompt', cmd_prompt) + else: + fencedev.removeAttribute('cmd_prompt') + + return errors + FD_VALIDATE = { 'fence_apc': val_apc_fd, 'fence_wti': val_wti_fd, @@ -1290,6 +1390,7 @@ 'fence_xvm': val_noop_fd, 'fence_scsi': val_noop_fd, 'fence_ilo': val_ilo_fd, + 'fence_ilo_mp': val_ilo_mp_fd, 'fence_ipmilan': val_ipmilan_fd, 'fence_drac': val_drac_fd, 'fence_drac5': val_drac_fd, @@ -1628,6 +1729,7 @@ 'fence_cisco_mds': val_cisco_mds_fi, 'fence_vmware': val_vmware_fi, 'fence_ilo': val_noop_fi, + 'fence_ilo_mp': val_noop_fi, 'fence_ipmilan': val_noop_fi, 'fence_drac': val_noop_fi, 'fence_drac5': val_noop_fi,