Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 592218 Details for
Bug 832181
fence_apc_snmp is missing from luci
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
fix
bz832181.patch (text/plain), 19.02 KB, created by
Ryan McCabe
on 2012-06-15 20:09:47 UTC
(
hide
)
Description:
fix
Filename:
MIME Type:
Creator:
Ryan McCabe
Created:
2012-06-15 20:09:47 UTC
Size:
19.02 KB
patch
obsolete
>commit 35b5e027c26ddd314e11d6f5508505b1a86524ab >Author: root <root@testcluster-node1.(none)> >Date: Fri Jun 15 14:50:03 2012 -0400 > > APC SNMP > >diff --git a/luci/cluster/fence-macros b/luci/cluster/fence-macros >index de78a18..98c40ad 100644 >--- a/luci/cluster/fence-macros >+++ b/luci/cluster/fence-macros >@@ -178,6 +178,10 @@ > <tal:block metal:use-macro="here/fence-macros/macros/fence-form-apc" /> > </tal:block> > >+ <tal:block tal:condition="python: cur_fence_type == 'fence_apc_snmp'"> >+ <tal:block metal:use-macro="here/fence-macros/macros/fence-form-apc-snmp" /> >+ </tal:block> >+ > <tal:block tal:condition="python: cur_fence_type == 'fence_mcdata'"> > <tal:block metal:use-macro="here/fence-macros/macros/fence-form-mcdata" /> > </tal:block> >@@ -354,6 +358,7 @@ > <div metal:define-macro="shared-fence-option-list"> > <option>Select a shared fence device</option> > <option name="fence_apc" value="fence_apc">APC Power Switch</option> >+ <option name="fence_apc_snmp" value="fence_apc_snmp">APC Power Switch (SNMP Interface)</option> > <option name="fence_wti" value="fence_wti">WTI Power Switch</option> > <option name="fence_brocade" value="fence_brocade">Brocade Fabric Switch</option> > <option name="fence_mcdata" value="fence_mcdata">McData SAN Switch</option> >@@ -376,6 +381,7 @@ > <div metal:define-macro="fence-option-list"> > <option>Select a fence device</option> > <option name="fence_apc" value="fence_apc">APC Power Switch</option> >+ <option name="fence_apc_snmp" value="fence_apc_snmp">APC Power Switch (SNMP Interface)</option> > <option name="fence_wti" value="fence_wti">WTI Power Switch</option> > <option name="fence_brocade" value="fence_brocade">Brocade Fabric Switch</option> > <option name="fence_mcdata" value="fence_mcdata">McData SAN Switch</option> >@@ -506,6 +512,205 @@ > </div> > </div> > >+<div metal:define-macro="fence-form-apc-snmp" >+ tal:attributes="id cur_fencedev/name | nothing"> >+ >+ <div id="fence_apc_snmp" class="fencedev"> >+ <table> >+ <tr> >+ <td><strong class="cluster">Fence Type</strong></td> >+ <td>APC Power Switch (SNMP Interface)</td> >+ </tr> >+ <tr> >+ <td>Name</td> >+ <td> >+ <input name="name" type="text" >+ tal:attributes=" >+ disabled cur_fencedev/isShared | nothing; >+ value cur_fencedev/name | nothing" /> >+ </td> >+ </tr> >+ <tr> >+ <td>IP Address</td> >+ <td> >+ <input name="ipaddr" type="text" >+ tal:attributes=" >+ disabled cur_fencedev/isShared | nothing; >+ value cur_fencedev/ipaddr | nothing" /> >+ </td> >+ </tr> >+ <tr> >+ <td>UDP/TCP Port (optional, defaults to 161)</td> >+ <td> >+ <input name="udpport" type="text" class="text" >+ tal:attributes=" >+ disabled cur_fencedev/isShared | nothing; >+ value cur_fencedev/udpport | nothing" /> >+ </td> >+ </tr> >+ <tr> >+ <td>Login</td> >+ <td> >+ <input name="login" type="text" >+ tal:attributes=" >+ disabled cur_fencedev/isShared | nothing; >+ value cur_fencedev/login | nothing" /> >+ </td> >+ </tr> >+ <tr> >+ <td>Password</td> >+ <td> >+ <input name="passwd" type="password" autocomplete="off" >+ tal:attributes=" >+ disabled cur_fencedev/isShared | nothing; >+ 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=" >+ disabled cur_fencedev/isShared | nothing; >+ value cur_fencedev/passwd_script | nothing" /> >+ </td> >+ </tr> >+ <tr> >+ <td>SNMP version</td> >+ <td> >+ <select name="snmp_version" >+ tal:define="snmp_version cur_fencedev/snmp_version | string:default" >+ tal:attributes="disabled cur_fencedev/isShared | nothing"> >+ <option value="" >+ tal:content="string:Default" >+ tal:attributes="selected python: snmp_version == 'default' and 'selected'"/> >+ <option value="1" >+ tal:content="string:1" >+ tal:attributes="selected python: snmp_version == '1' and 'selected'"/> >+ <option value="2c" >+ tal:content="string:2c" >+ tal:attributes="selected python: snmp_version == '2c' and 'selected'"/> >+ <option value="3" >+ tal:content="string:3" >+ tal:attributes="selected python: snmp_version == '3' and 'selected'"/> >+ </select> >+ </td> >+ </tr> >+ <tr> >+ <td>SNMP community</td> >+ <td> >+ <input name="community" type="text" >+ tal:attributes=" >+ disabled cur_fencedev/isShared | nothing; >+ value cur_fencedev/community | nothing" /> >+ </td> >+ </tr> >+ <tr> >+ <td>SNMP security level</td> >+ <td> >+ <select name="snmp_sec_level" >+ tal:define="snmp_sec_level cur_fencedev/snmp_sec_level | string:default" >+ tal:attributes="disabled cur_fencedev/isShared | nothing"> >+ <option value="" >+ tal:content="string:Default" >+ tal:attributes="selected python: snmp_sec_level == 'default' and 'selected'"/> >+ >+ <option value="noAuthNoPriv" >+ tal:content="string:noAuthNoPriv" >+ tal:attributes="selected python: snmp_sec_level == 'noAuthNoPriv' and 'selected'"/> >+ >+ <option value="authNoPriv" >+ tal:content="string:authNoPriv" >+ tal:attributes="selected python: snmp_sec_level == 'authNoPriv' and 'selected'"/> >+ >+ <option value="authPriv" >+ tal:content="string:authPriv" >+ tal:attributes="selected python: snmp_sec_level == 'authPriv' and 'selected'"/> >+ </select> >+ </td> >+ </tr> >+ <tr> >+ <td>SNMP authentication protocol</td> >+ <td> >+ <select name="snmp_auth_prot" >+ tal:define="snmp_auth_prot cur_fencedev/snmp_auth_prot | string:default" >+ tal:attributes="disabled cur_fencedev/isShared | nothing"> >+ <option value="" >+ tal:content="string:Default" >+ tal:attributes="selected python: snmp_auth_prot == 'default' and 'selected'"/> >+ >+ <option value="MD5" >+ tal:content="string:MD5" >+ tal:attributes="selected python: snmp_auth_prot == 'MD5' and 'selected'"/> >+ >+ <option value="SHA" >+ tal:content="string:SHA" >+ tal:attributes="selected python: snmp_auth_prot == 'SHA' and 'selected'"/> >+ </select> >+ </td> >+ </tr> >+ <tr> >+ <td>SNMP privacy protocol</td> >+ <td> >+ <select name="snmp_priv_prot" >+ tal:define="snmp_priv_prot cur_fencedev/snmp_priv_prot | string:default" >+ tal:attributes="disabled cur_fencedev/isShared | nothing"> >+ <option value="" >+ tal:content="string:Default" >+ tal:attributes="selected python: snmp_priv_prot == 'default' and 'selected'"/> >+ <option value="DES" >+ tal:content="string:DES" >+ tal:attributes="selected python: snmp_priv_prot == 'DES' and 'selected'"/> >+ <option value="AES" >+ tal:content="string:AES" >+ tal:attributes="selected python: snmp_priv_prot == 'AES' and 'selected'"/> >+ </select> >+ </td> >+ </tr> >+ <tr> >+ <td>SNMP privacy protocol password</td> >+ <td> >+ <input name="snmp_priv_passwd" type="password" autocomplete="off" >+ tal:attributes=" >+ disabled cur_fencedev/isShared | nothing; >+ value cur_fencedev/snmp_priv_passwd | nothing" /> >+ </td> >+ </tr> >+ <tr> >+ <td> >+ SNMP privacy protocol script >+ </td> >+ <td> >+ <input type="text" name="snmp_priv_passwd_script" >+ tal:attributes=" >+ disabled cur_fencedev/isShared | nothing; >+ value cur_fencedev/snmp_priv_passwd_script | nothing" /> >+ </td> >+ </tr> >+ <tr> >+ <td>Power wait (seconds)</td> >+ <td> >+ <input type="text" name="power_wait" >+ tal:attributes=" >+ disabled cur_fencedev/isShared | nothing; >+ 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="sharable" value="1" /> >+ <input type="hidden" name="fence_type" value="fence_apc_snmp" /> >+ </div> >+</div> >+ > <div metal:define-macro="fence-form-mcdata" > tal:attributes="id cur_fencedev/name | nothing"> > >@@ -2584,6 +2789,7 @@ > > <div metal:define-macro="fence-form-list"> > <tal:block metal:use-macro="here/fence-macros/macros/fence-form-apc" /> >+ <tal:block metal:use-macro="here/fence-macros/macros/fence-form-apc-snmp" /> > <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" /> >@@ -2614,6 +2820,7 @@ > > <div metal:define-macro="shared-fence-form-list"> > <tal:block metal:use-macro="here/fence-macros/macros/fence-form-apc" /> >+ <tal:block metal:use-macro="here/fence-macros/macros/fence-form-apc-snmp" /> > <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-brocade" /> >@@ -2701,6 +2908,45 @@ > </div> > </div> > >+<div metal:define-macro="fence-instance-form-apc-snmp" >+ tal:omit-tag="exists: cur_fence_dev_id"> >+ >+ <div id="fence_apc_snmp_instance" name="fence_apc_snmp" class="fencedev_instance" >+ tal:omit-tag="exists: cur_fence_dev_id"> >+ <table> >+ <tr> >+ <td>Port</td> >+ <td> >+ <input name="port" type="text" >+ tal:attributes="value cur_instance/port | nothing" /> >+ </td> >+ </tr> >+ <tr><td colspan="2"> >+ <div class="hbSubmit"> >+ <tal:block tal:condition="exists:cur_fence_instance_id"> >+ <input type="button" name="remove_fence" >+ value="Remove this instance" >+ tal:attributes="onclick python: 'del_fence_instance(\'' + cur_fence_instance_id + '\')'" /> >+ </tal:block> >+ <tal:block tal:condition="not:exists:cur_fence_instance_id"> >+ <input type="button" name="remove_fence" >+ value="Remove this instance" /> >+ </tal:block> >+ </div> >+ </td></tr> >+ </table> >+ >+ <input type="hidden" name="option" tal:condition="exists:cur_instance" >+ tal:attributes="value cur_instance/option |nothing" /> >+ <input type="hidden" name="fence_type" value="fence_apc_snmp" /> >+ <input type="hidden" name="fence_instance" value="1" /> >+ <input tal:condition="exists: cur_instance" >+ type="hidden" name="existing_instance" value="1" /> >+ <input type="hidden" name="parent_fencedev" >+ tal:attributes="value cur_fence_dev_id | nothing" /> >+ </div> >+</div> >+ > <div metal:define-macro="fence-instance-form-lpar" > tal:omit-tag="exists: cur_fence_dev_id"> > <div id="fence_lpar_instance" name="fence_lpar" class="fencedev_instance" >@@ -3446,6 +3692,8 @@ > <tal:block > metal:use-macro="here/fence-macros/macros/fence-instance-form-apc" /> > <tal:block >+ metal:use-macro="here/fence-macros/macros/fence-instance-form-apc-snmp" /> >+ <tal:block > metal:use-macro="here/fence-macros/macros/fence-instance-form-egenera" /> > <tal:block > metal:use-macro="here/fence-macros/macros/fence-instance-form-lpar" /> >@@ -3492,6 +3740,11 @@ > metal:use-macro="here/fence-macros/macros/fence-instance-form-apc" /> > </tal:block> > >+ <tal:block tal:condition="python: cur_fence_type == 'fence_apc_snmp'"> >+ <tal:block >+ metal:use-macro="here/fence-macros/macros/fence-instance-form-apc-snmp" /> >+ </tal:block> >+ > <tal:block tal:condition="python: cur_fence_type == 'fence_mcdata'"> > <tal:block > metal:use-macro="here/fence-macros/macros/fence-instance-form-mcdata" /> >diff --git a/luci/cluster/validate_fence.js b/luci/cluster/validate_fence.js >index 6040d82..e3962ad 100644 >--- a/luci/cluster/validate_fence.js >+++ b/luci/cluster/validate_fence.js >@@ -9,6 +9,7 @@ > > var fence_inst_validator = []; > fence_inst_validator['apc'] = [ 'port', 'switch', 'secure' ]; >+fence_inst_validator['apc_snmp'] = [ 'port' ]; > fence_inst_validator['bladecenter'] = [ 'blade', 'secure' ]; > fence_inst_validator['brocade'] = [ 'port' ]; > fence_inst_validator['bullpap'] = [ 'domain' ]; >@@ -30,6 +31,7 @@ fence_inst_validator['rhevm'] = [ 'port' ]; > > var fence_validator = []; > fence_validator['apc'] = [ 'ipaddr', 'login', 'passwd', 'passwd_script' ]; >+fence_validator['apc_snmp'] = [ 'ipaddr', 'login', 'passwd', 'passwd_script' ]; > fence_validator['bladecenter'] = [ 'ipaddr', 'login', 'passwd', 'passwd_script' ]; > fence_validator['brocade'] = [ 'ipaddr', 'login', 'passwd', 'passwd_script' ]; > fence_validator['bullpap'] = [ 'ipaddr', 'login', 'passwd', 'passwd_script' ]; >diff --git a/luci/site/luci/Extensions/ClusterModel/FenceDeviceAttr.py b/luci/site/luci/Extensions/ClusterModel/FenceDeviceAttr.py >index 2851a18..89e54cd 100644 >--- a/luci/site/luci/Extensions/ClusterModel/FenceDeviceAttr.py >+++ b/luci/site/luci/Extensions/ClusterModel/FenceDeviceAttr.py >@@ -13,6 +13,7 @@ FENCE_POWER_CONTROLLERS = ( > > FENCE_OPTS = { > 'fence_apc': 'APC Power Device', >+ 'fence_apc_snmp': 'APC Power Device (SNMP Interface)', > 'fence_wti': 'WTI Power Device', > 'fence_brocade': 'Brocade Switch', > 'fence_vixel': 'Vixel SAN Switch', >@@ -42,6 +43,7 @@ FENCE_OPTS = { > > FENCE_SHARED = { > 'fence_apc': True, >+ 'fence_apc_snmp': True, > 'fence_wti': True, > 'fence_brocade': True, > 'fence_vixel': True, >@@ -91,6 +93,7 @@ PRETTY_NAME_ATTRS = { > > FENCE_FI_ATTRS = { > 'fence_apc': ( 'port', 'switch' ), >+ 'fence_apc_snmp': ( 'port' ), > 'fence_wti': ( 'port' ), > 'fence_brocade': ( 'port' ), > 'fence_vixel': ( 'port' ), >@@ -120,6 +123,8 @@ FENCE_FI_ATTRS = { > FENCE_FD_ATTRS = { > 'fence_apc': > ( 'name', 'ipaddr', 'login', 'passwd' ), >+ 'fence_apc_snmp': >+ ( 'name', 'ipaddr', 'login', 'passwd' ), > 'fence_wti': > ( 'name', 'ipaddr', 'passwd' ), > 'fence_brocade': >diff --git a/luci/site/luci/Extensions/FenceHandler.py b/luci/site/luci/Extensions/FenceHandler.py >index fa81de3..ddcb64e 100755 >--- a/luci/site/luci/Extensions/FenceHandler.py >+++ b/luci/site/luci/Extensions/FenceHandler.py >@@ -173,6 +173,176 @@ def val_apc_fd(form, fencedev): > > return errors > >+def val_apc_snmp_fd(form, fencedev): >+ errors = list() >+ >+ try: >+ ip = form['ipaddr'].strip() >+ if not ip: >+ raise Exception, 'blank' >+ fencedev.addAttribute('ipaddr', ip) >+ except Exception, e: >+ errors.append(FD_PROVIDE_IP) >+ >+ 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') >+ >+ try: >+ udpport = form['udpport'].strip() >+ if udpport: >+ udpport = int(udpport) >+ if udpport < 1 or udpport & 0xffff != udpport: >+ raise ValueError >+ except (KeyError, AttributeError), e: >+ udpport = None >+ except Exception, e: >+ udpport = None >+ errors.append('An invalid value for udpport was given: "%s"' % form['udpport']) >+ if udpport: >+ fencedev.addAttribute('udpport', str(udpport)) >+ else: >+ fencedev.removeAttribute('udpport') >+ >+ try: >+ snmp_community = form['community'].strip() >+ except Exception, e: >+ snmp_community = None >+ if snmp_community: >+ fencedev.addAttribute('community', snmp_community) >+ else: >+ fencedev.removeAttribute('community') >+ >+ 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) >+ >+ try: >+ pwd = form['snmp_priv_passwd'].strip() >+ if not pwd: >+ # Allow passwords that consist of only spaces. >+ if not form.has_key('snmp_priv_passwd') or form['snmp_priv_passwd'] == '': >+ raise Exception, 'blank' >+ else: >+ pwd = form['snmp_priv_passwd'] >+ fencedev.addAttribute('snmp_priv_passwd', pwd) >+ has_passwd = True >+ except Exception, e: >+ try: >+ fencedev.removeAttribute('snmp_priv_passwd') >+ except: >+ pass >+ >+ try: >+ pwd_script = form['snmp_priv_passwd_script'].strip() >+ if not pwd_script: >+ raise Exception, 'blank' >+ fencedev.addAttribute('snmp_priv_passwd_script', pwd_script) >+ has_passwd = True >+ except Exception, e: >+ try: >+ fencedev.removeAttribute('snmp_priv_passwd_script') >+ except: >+ pass >+ >+ try: >+ snmp_version = form['snmp_version'].strip() >+ if not snmp_version in ('1', '2c', '3'): >+ snmp_version = None >+ raise Exception, 'blank' >+ fencedev.addAttribute('snmp_version', snmp_version) >+ except Exception, e: >+ try: >+ fencedev.removeAttribute('snmp_version') >+ except: >+ pass >+ >+ try: >+ snmp_sec_level = form['snmp_sec_level'].strip() >+ if not snmp_sec_level in ('noAuthNoPriv', 'authNoPriv', 'authPriv'): >+ snmp_sec_level = None >+ raise Exception, 'blank' >+ fencedev.addAttribute('snmp_sec_level', snmp_sec_level) >+ except Exception, e: >+ try: >+ fencedev.removeAttribute('snmp_sec_level') >+ except: >+ pass >+ >+ try: >+ snmp_auth_prot = form['snmp_auth_prot'].strip() >+ if not snmp_auth_prot in ('MD5', 'SHA'): >+ snmp_auth_prot = None >+ raise Exception, 'blank' >+ fencedev.addAttribute('snmp_auth_prot', snmp_auth_prot) >+ except Exception, e: >+ try: >+ fencedev.removeAttribute('snmp_auth_prot') >+ except: >+ pass >+ >+ try: >+ snmp_priv_prot = form['snmp_priv_prot'].strip() >+ if not snmp_priv_prot in ('DES', 'AES'): >+ snmp_priv_prot = None >+ raise Exception, 'blank' >+ fencedev.addAttribute('snmp_priv_prot', snmp_priv_prot) >+ except Exception, e: >+ try: >+ fencedev.removeAttribute('snmp_priv_prot') >+ except: >+ pass >+ >+ return errors >+ > def val_wti_fd(form, fencedev): > errors = list() > >@@ -1685,6 +1855,7 @@ def val_ilo_mp_fd(form, fencedev): > > FD_VALIDATE = { > 'fence_apc': val_apc_fd, >+ 'fence_apc_snmp': val_apc_snmp_fd, > 'fence_wti': val_wti_fd, > 'fence_brocade': val_brocade_fd, > 'fence_vixel': val_vixel_fd, >@@ -1798,6 +1969,19 @@ def val_apc_fi(form, fenceinst): > > return errors > >+def val_apc_snmp_fi(form, fenceinst): >+ errors = list() >+ >+ try: >+ port = form['port'].strip() >+ if not port: >+ raise Exception, 'blank' >+ fenceinst.addAttribute('port', port) >+ except Exception, e: >+ errors.append(FI_PROVIDE_PORT) >+ >+ return errors >+ > def val_wti_fi(form, fenceinst): > errors = list() > >@@ -2079,6 +2263,7 @@ def val_noop_fi(dummy, _dummy): > > FI_VALIDATE = { > 'fence_apc': val_apc_fi, >+ 'fence_apc_snmp': val_apc_snmp_fi, > 'fence_wti': val_wti_fi, > 'fence_brocade': val_brocade_fi, > 'fence_vixel': val_vixel_fi,
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 832181
: 592218