From 86ed03f8adee56c050c73018537371c230a664a6 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 17 Apr 2024 08:50:17 +0200 Subject: Adding upstream version 4.12.1. Signed-off-by: Daniel Baumann --- .gitignore | 75 + Makefile.am | 142 + README.md | 18 + agents/Makefile.am | 123 + agents/aliyun/fence_aliyun.py | 192 + agents/alom/fence_alom.py | 53 + agents/amt/fence_amt.py | 128 + agents/amt_ws/fence_amt_ws.py | 240 + agents/apc/fence_apc.py | 263 + agents/apc_snmp/README | 45 + agents/apc_snmp/fence_apc_snmp.py | 232 + agents/apc_snmp/powernet369.mib | 31109 ++++++++++++++++++++++ agents/autodetect/a.py | 8 + agents/autodetect/autodetect.py | 255 + agents/autodetect/autodetect_test.py | 33 + agents/autodetect/b.py | 2 + agents/autodetect/fence_apc.py | 259 + agents/autodetect/fence_bladecenter.py | 111 + agents/autodetect/fence_brocade.py | 78 + agents/autodetect/fence_ilo_moonshot.py | 69 + agents/autodetect/fence_lpar.py | 159 + agents/autodetect/fencing.py | 1393 + agents/aws/fence_aws.py | 223 + agents/azure_arm/fence_azure_arm.py | 260 + agents/bladecenter/fence_bladecenter.py | 105 + agents/brocade/fence_brocade.py | 72 + agents/cdu/fence_cdu.py | 176 + agents/cisco_mds/fence_cisco_mds.py | 94 + agents/cisco_ucs/fence_cisco_ucs.py | 198 + agents/compute/fence_compute.py | 516 + agents/crosslink/README.md | 44 + agents/crosslink/fence_crosslink.py | 113 + agents/cyberpower_ssh/fence_cyberpower_ssh.py | 70 + agents/docker/fence_docker.py | 161 + agents/drac/fence_drac.py | 62 + agents/drac5/fence_drac5.py | 147 + agents/dummy/fence_dummy.py | 133 + agents/eaton_snmp/README | 20 + agents/eaton_snmp/fence_eaton_snmp.py | 229 + agents/ecloud/fence_ecloud.py | 169 + agents/emerson/fence_emerson.py | 62 + agents/eps/fence_eps.py | 129 + agents/evacuate/fence_evacuate.py | 428 + agents/gce/fence_gce.py | 632 + agents/hds_cb/fence_hds_cb.py | 132 + agents/heuristics_ping/fence_heuristics_ping.py | 198 + agents/hpblade/fence_hpblade.py | 134 + agents/ibm_powervs/fence_ibm_powervs.py | 267 + agents/ibm_vpc/fence_ibm_vpc.py | 316 + agents/ibmblade/fence_ibmblade.py | 72 + agents/ibmz/fence_ibmz.py | 566 + agents/ifmib/README | 45 + agents/ifmib/fence_ifmib.py | 116 + agents/ilo/fence_ilo.py | 143 + agents/ilo_moonshot/fence_ilo_moonshot.py | 65 + agents/ilo_mp/fence_ilo_mp.py | 58 + agents/ilo_ssh/fence_ilo_ssh.py | 77 + agents/intelmodular/fence_intelmodular.py | 86 + agents/ipdu/fence_ipdu.py | 153 + agents/ipmilan/fence_ipmilan.py | 233 + agents/ironic/fence_ironic.py | 130 + agents/kdump/fence_kdump.c | 592 + agents/kdump/fence_kdump_send.8 | 50 + agents/kdump/fence_kdump_send.c | 255 + agents/kdump/list.h | 573 + agents/kdump/message.h | 41 + agents/kdump/options.h | 260 + agents/kdump/version.h | 33 + agents/kubevirt/fence_kubevirt.py | 154 + agents/ldom/fence_ldom.py | 102 + agents/lindy_pdu/fence_lindypdu.py | 206 + agents/lpar/fence_lpar.py | 197 + agents/manual/fence_ack_manual.8 | 39 + agents/manual/fence_ack_manual.in | 37 + agents/mpath/fence_mpath.py | 341 + agents/netio/fence_netio.py | 94 + agents/openstack/fence_openstack.py | 381 + agents/ovh/fence_ovh.py | 164 + agents/powerman/fence_powerman.py | 257 + agents/pve/fence_pve.py | 240 + agents/raritan/fence_raritan.py | 87 + agents/raritan_px3/fence_raritan_px3.py | 195 + agents/rcd_serial/fence_rcd_serial.py | 100 + agents/rcd_serial/rcd_serial_cable_diagram.svg | 276 + agents/redfish/fence_redfish.py | 177 + agents/rhevm/fence_rhevm.py | 249 + agents/rsa/fence_rsa.py | 63 + agents/rsb/fence_rsb.py | 70 + agents/sanbox2/fence_sanbox2.py | 155 + agents/sbd/fence_sbd.py | 435 + agents/scsi/fence_scsi.py | 598 + agents/skalar/fence_skalar.py | 226 + agents/vbox/fence_vbox.py | 135 + agents/virsh/fence_virsh.py | 96 + agents/virt/Makefile.am | 31 + agents/virt/client/Makefile.am | 40 + agents/virt/client/main.c | 198 + agents/virt/client/mcast.c | 393 + agents/virt/client/options.c | 1000 + agents/virt/client/serial.c | 311 + agents/virt/client/tcp.c | 171 + agents/virt/client/vsock.c | 176 + agents/virt/common/Makefile.am | 24 + agents/virt/common/bcast.c | 347 + agents/virt/common/debug.c | 38 + agents/virt/common/fdops.c | 202 + agents/virt/common/ip_lookup.c | 326 + agents/virt/common/log.c | 204 + agents/virt/common/mcast.c | 388 + agents/virt/common/simple_auth.c | 466 + agents/virt/common/tcp.c | 386 + agents/virt/config/Makefile.am | 44 + agents/virt/config/config-stack.h | 38 + agents/virt/config/config.l | 106 + agents/virt/config/config.y | 140 + agents/virt/config/fence_virt.conf | 20 + agents/virt/config/simpleconfig.c | 494 + agents/virt/docs/README | 125 + agents/virt/docs/TODO | 7 + agents/virt/docs/architecture.txt | 16 + agents/virt/docs/fence_virt.txt | 127 + agents/virt/fence_virtd.service.in | 23 + agents/virt/include/bcast.h | 16 + agents/virt/include/client.h | 9 + agents/virt/include/debug.h | 31 + agents/virt/include/fdops.h | 14 + agents/virt/include/history.h | 25 + agents/virt/include/ip_lookup.h | 40 + agents/virt/include/list.h | 84 + agents/virt/include/mcast.h | 32 + agents/virt/include/options.h | 99 + agents/virt/include/server_plugin.h | 130 + agents/virt/include/simple_auth.h | 35 + agents/virt/include/simpleconfig.h | 56 + agents/virt/include/static_map.h | 34 + agents/virt/include/tcp.h | 27 + agents/virt/include/tcp_listener.h | 7 + agents/virt/include/xvm.h | 158 + agents/virt/man/.gitignore | 2 + agents/virt/man/Makefile.am | 28 + agents/virt/man/fence_virt.conf.5 | 335 + agents/virt/man/fence_virtd.8 | 53 + agents/virt/man/fence_xvm.8 | 1 + agents/virt/server/Makefile.am | 79 + agents/virt/server/config.c | 698 + agents/virt/server/cpg-virt.c | 643 + agents/virt/server/cpg.c | 411 + agents/virt/server/cpg.h | 29 + agents/virt/server/daemon_init.c | 215 + agents/virt/server/history.c | 124 + agents/virt/server/libvirt.c | 359 + agents/virt/server/main.c | 281 + agents/virt/server/mcast.c | 622 + agents/virt/server/plugin.c | 417 + agents/virt/server/serial.c | 459 + agents/virt/server/serial.h | 20 + agents/virt/server/static_map.c | 237 + agents/virt/server/tcp.c | 575 + agents/virt/server/uuid-test.c | 66 + agents/virt/server/uuid-test.h | 14 + agents/virt/server/virt-serial.c | 444 + agents/virt/server/virt-sockets.c | 242 + agents/virt/server/virt.c | 630 + agents/virt/server/virt.h | 62 + agents/virt/server/vsock.c | 565 + agents/vmware/fence_vmware.py | 336 + agents/vmware/fence_vmware_helper.pl | 276 + agents/vmware_rest/fence_vmware_rest.py | 229 + agents/vmware_soap/fence_vmware_soap.py | 265 + agents/vmware_vcloud/fence_vmware_vcloud.py | 214 + agents/wti/fence_wti.py | 240 + agents/xenapi/fence_xenapi.py | 221 + agents/zvm/fence_zvm.c | 1056 + agents/zvm/fence_zvm.h | 583 + agents/zvm/fence_zvm_man_page | 88 + agents/zvm/fence_zvmip.c | 1001 + agents/zvm/fence_zvmip.py | 226 + autogen.sh | 4 + configure.ac | 593 + doc/COPYING.applications | 339 + doc/COPYING.libraries | 510 + doc/COPYRIGHT | 86 + doc/FenceAgentAPI.md | 196 + doc/Makefile.am | 6 + doc/README.licence | 33 + fence-agents.pc.in | 7 + fence-agents.spec.in | 1445 + lib/Makefile.am | 34 + lib/XenAPI.py.py | 212 + lib/azure_fence.py.py | 393 + lib/check_used_options.py | 68 + lib/fence.rng.head | 7 + lib/fence.rng.tail | 13 + lib/fence2man.xsl | 78 + lib/fence2rng.xsl | 184 + lib/fence2wiki.xsl | 14 + lib/fencing.py.py | 1748 ++ lib/fencing_snmp.py.py | 128 + lib/metadata.rng | 80 + lib/tests/test_fencing.py | 123 + m4/PKG_CHECK_VAR.m4 | 24 + m4/ac_python_module.m4 | 30 + m4/ax_check_link_flag.m4 | 74 + m4/ax_prog_date.m4 | 137 + m4/ax_pthread.m4 | 485 + make/agentccheck.mk | 32 + make/agentpycheck.mk | 44 + make/fencebuild.mk | 84 + make/fenceman.mk | 11 + make/git-version-gen | 161 + make/gitlog-to-changelog | 191 + make/release.mk | 82 + systemd/Makefile.am | 24 + systemd/fence-agents.conf.in | 1 + tests/actions.d/list.cfg | 2 + tests/actions.d/power-on-off.cfg | 2 + tests/actions.d/sleep.cfg | 2 + tests/actions.d/status.cfg | 2 + tests/data/metadata/fence_aliyun.xml | 138 + tests/data/metadata/fence_alom.xml | 204 + tests/data/metadata/fence_amt.xml | 188 + tests/data/metadata/fence_amt_ws.xml | 170 + tests/data/metadata/fence_apc.xml | 215 + tests/data/metadata/fence_apc_snmp.xml | 225 + tests/data/metadata/fence_aws.xml | 146 + tests/data/metadata/fence_azure_arm.xml | 198 + tests/data/metadata/fence_bladecenter.xml | 215 + tests/data/metadata/fence_brocade.xml | 209 + tests/data/metadata/fence_cdu.xml | 172 + tests/data/metadata/fence_cisco_mds.xml | 223 + tests/data/metadata/fence_cisco_ucs.xml | 197 + tests/data/metadata/fence_compute.xml | 222 + tests/data/metadata/fence_crosslink.xml | 128 + tests/data/metadata/fence_cyberpower_ssh.xml | 206 + tests/data/metadata/fence_docker.xml | 180 + tests/data/metadata/fence_drac.xml | 175 + tests/data/metadata/fence_drac5.xml | 219 + tests/data/metadata/fence_dummy.xml | 115 + tests/data/metadata/fence_eaton_snmp.xml | 224 + tests/data/metadata/fence_ecloud.xml | 123 + tests/data/metadata/fence_emerson.xml | 224 + tests/data/metadata/fence_eps.xml | 175 + tests/data/metadata/fence_evacuate.xml | 218 + tests/data/metadata/fence_gce.xml | 213 + tests/data/metadata/fence_hds_cb.xml | 215 + tests/data/metadata/fence_heuristics_ping.xml | 140 + tests/data/metadata/fence_hpblade.xml | 215 + tests/data/metadata/fence_ibm_powervs.xml | 153 + tests/data/metadata/fence_ibm_vpc.xml | 142 + tests/data/metadata/fence_ibmblade.xml | 224 + tests/data/metadata/fence_ibmz.xml | 198 + tests/data/metadata/fence_idrac.xml | 238 + tests/data/metadata/fence_ifmib.xml | 225 + tests/data/metadata/fence_ilo.xml | 201 + tests/data/metadata/fence_ilo2.xml | 201 + tests/data/metadata/fence_ilo3.xml | 238 + tests/data/metadata/fence_ilo3_ssh.xml | 221 + tests/data/metadata/fence_ilo4.xml | 238 + tests/data/metadata/fence_ilo4_ssh.xml | 221 + tests/data/metadata/fence_ilo5.xml | 238 + tests/data/metadata/fence_ilo5_ssh.xml | 221 + tests/data/metadata/fence_ilo_moonshot.xml | 206 + tests/data/metadata/fence_ilo_mp.xml | 208 + tests/data/metadata/fence_ilo_ssh.xml | 221 + tests/data/metadata/fence_imm.xml | 238 + tests/data/metadata/fence_intelmodular.xml | 226 + tests/data/metadata/fence_ipdu.xml | 224 + tests/data/metadata/fence_ipmilan.xml | 238 + tests/data/metadata/fence_ipmilanplus.xml | 238 + tests/data/metadata/fence_ironic.xml | 177 + tests/data/metadata/fence_kdump.xml | 79 + tests/data/metadata/fence_kubevirt.xml | 138 + tests/data/metadata/fence_ldom.xml | 208 + tests/data/metadata/fence_lindypdu.xml | 229 + tests/data/metadata/fence_lpar.xml | 220 + tests/data/metadata/fence_mpath.xml | 155 + tests/data/metadata/fence_netio.xml | 167 + tests/data/metadata/fence_openstack.xml | 218 + tests/data/metadata/fence_ovh.xml | 152 + tests/data/metadata/fence_powerman.xml | 135 + tests/data/metadata/fence_pve.xml | 215 + tests/data/metadata/fence_raritan.xml | 167 + tests/data/metadata/fence_raritan_px3.xml | 210 + tests/data/metadata/fence_rcd_serial.xml | 111 + tests/data/metadata/fence_redfish.xml | 201 + tests/data/metadata/fence_rhevm.xml | 210 + tests/data/metadata/fence_rsa.xml | 208 + tests/data/metadata/fence_rsb.xml | 208 + tests/data/metadata/fence_sanbox2.xml | 176 + tests/data/metadata/fence_sbd.xml | 135 + tests/data/metadata/fence_scsi.xml | 169 + tests/data/metadata/fence_skalar.xml | 192 + tests/data/metadata/fence_tripplite_snmp.xml | 225 + tests/data/metadata/fence_vbox.xml | 240 + tests/data/metadata/fence_virsh.xml | 227 + tests/data/metadata/fence_virt.xml | 101 + tests/data/metadata/fence_vmware.xml | 217 + tests/data/metadata/fence_vmware_rest.xml | 198 + tests/data/metadata/fence_vmware_soap.xml | 189 + tests/data/metadata/fence_vmware_vcloud.xml | 191 + tests/data/metadata/fence_wti.xml | 210 + tests/data/metadata/fence_xenapi.xml | 153 + tests/data/metadata/fence_zvmip.xml | 225 + tests/devices.d/dummy-with_action.cfg | 9 + tests/devices.d/dummy.cfg | 3 + tests/devices.d/invalid-missing_option.cfg | 4 + tests/devices.d/true-with_action.cfg | 8 + tests/devices.d/true.cfg | 8 + tests/fence_testing.py | 126 + tests/fence_testing_test.py | 70 + tests/test-apc2.py | 17 + tests/test-apc5.py | 17 + tests/test-drac4.py | 15 + tests/test-multi-apc2.py | 17 + tests/test.py | 21 + 315 files changed, 92193 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile.am create mode 100644 README.md create mode 100644 agents/Makefile.am create mode 100644 agents/aliyun/fence_aliyun.py create mode 100644 agents/alom/fence_alom.py create mode 100644 agents/amt/fence_amt.py create mode 100755 agents/amt_ws/fence_amt_ws.py create mode 100644 agents/apc/fence_apc.py create mode 100644 agents/apc_snmp/README create mode 100644 agents/apc_snmp/fence_apc_snmp.py create mode 100644 agents/apc_snmp/powernet369.mib create mode 100644 agents/autodetect/a.py create mode 100755 agents/autodetect/autodetect.py create mode 100755 agents/autodetect/autodetect_test.py create mode 100644 agents/autodetect/b.py create mode 100644 agents/autodetect/fence_apc.py create mode 100644 agents/autodetect/fence_bladecenter.py create mode 100644 agents/autodetect/fence_brocade.py create mode 100644 agents/autodetect/fence_ilo_moonshot.py create mode 100644 agents/autodetect/fence_lpar.py create mode 100644 agents/autodetect/fencing.py create mode 100644 agents/aws/fence_aws.py create mode 100755 agents/azure_arm/fence_azure_arm.py create mode 100644 agents/bladecenter/fence_bladecenter.py create mode 100644 agents/brocade/fence_brocade.py create mode 100644 agents/cdu/fence_cdu.py create mode 100644 agents/cisco_mds/fence_cisco_mds.py create mode 100644 agents/cisco_ucs/fence_cisco_ucs.py create mode 100644 agents/compute/fence_compute.py create mode 100644 agents/crosslink/README.md create mode 100755 agents/crosslink/fence_crosslink.py create mode 100755 agents/cyberpower_ssh/fence_cyberpower_ssh.py create mode 100644 agents/docker/fence_docker.py create mode 100644 agents/drac/fence_drac.py create mode 100644 agents/drac5/fence_drac5.py create mode 100644 agents/dummy/fence_dummy.py create mode 100644 agents/eaton_snmp/README create mode 100644 agents/eaton_snmp/fence_eaton_snmp.py create mode 100644 agents/ecloud/fence_ecloud.py create mode 100644 agents/emerson/fence_emerson.py create mode 100644 agents/eps/fence_eps.py create mode 100644 agents/evacuate/fence_evacuate.py create mode 100644 agents/gce/fence_gce.py create mode 100755 agents/hds_cb/fence_hds_cb.py create mode 100644 agents/heuristics_ping/fence_heuristics_ping.py create mode 100644 agents/hpblade/fence_hpblade.py create mode 100755 agents/ibm_powervs/fence_ibm_powervs.py create mode 100755 agents/ibm_vpc/fence_ibm_vpc.py create mode 100644 agents/ibmblade/fence_ibmblade.py create mode 100644 agents/ibmz/fence_ibmz.py create mode 100644 agents/ifmib/README create mode 100644 agents/ifmib/fence_ifmib.py create mode 100644 agents/ilo/fence_ilo.py create mode 100644 agents/ilo_moonshot/fence_ilo_moonshot.py create mode 100644 agents/ilo_mp/fence_ilo_mp.py create mode 100644 agents/ilo_ssh/fence_ilo_ssh.py create mode 100644 agents/intelmodular/fence_intelmodular.py create mode 100644 agents/ipdu/fence_ipdu.py create mode 100644 agents/ipmilan/fence_ipmilan.py create mode 100644 agents/ironic/fence_ironic.py create mode 100644 agents/kdump/fence_kdump.c create mode 100644 agents/kdump/fence_kdump_send.8 create mode 100644 agents/kdump/fence_kdump_send.c create mode 100644 agents/kdump/list.h create mode 100644 agents/kdump/message.h create mode 100644 agents/kdump/options.h create mode 100644 agents/kdump/version.h create mode 100755 agents/kubevirt/fence_kubevirt.py create mode 100644 agents/ldom/fence_ldom.py create mode 100644 agents/lindy_pdu/fence_lindypdu.py create mode 100644 agents/lpar/fence_lpar.py create mode 100644 agents/manual/fence_ack_manual.8 create mode 100644 agents/manual/fence_ack_manual.in create mode 100644 agents/mpath/fence_mpath.py create mode 100755 agents/netio/fence_netio.py create mode 100644 agents/openstack/fence_openstack.py create mode 100644 agents/ovh/fence_ovh.py create mode 100755 agents/powerman/fence_powerman.py create mode 100755 agents/pve/fence_pve.py create mode 100644 agents/raritan/fence_raritan.py create mode 100644 agents/raritan_px3/fence_raritan_px3.py create mode 100644 agents/rcd_serial/fence_rcd_serial.py create mode 100644 agents/rcd_serial/rcd_serial_cable_diagram.svg create mode 100644 agents/redfish/fence_redfish.py create mode 100644 agents/rhevm/fence_rhevm.py create mode 100644 agents/rsa/fence_rsa.py create mode 100755 agents/rsb/fence_rsb.py create mode 100644 agents/sanbox2/fence_sanbox2.py create mode 100644 agents/sbd/fence_sbd.py create mode 100644 agents/scsi/fence_scsi.py create mode 100644 agents/skalar/fence_skalar.py create mode 100644 agents/vbox/fence_vbox.py create mode 100644 agents/virsh/fence_virsh.py create mode 100644 agents/virt/Makefile.am create mode 100644 agents/virt/client/Makefile.am create mode 100644 agents/virt/client/main.c create mode 100644 agents/virt/client/mcast.c create mode 100644 agents/virt/client/options.c create mode 100644 agents/virt/client/serial.c create mode 100644 agents/virt/client/tcp.c create mode 100644 agents/virt/client/vsock.c create mode 100644 agents/virt/common/Makefile.am create mode 100644 agents/virt/common/bcast.c create mode 100644 agents/virt/common/debug.c create mode 100644 agents/virt/common/fdops.c create mode 100644 agents/virt/common/ip_lookup.c create mode 100644 agents/virt/common/log.c create mode 100644 agents/virt/common/mcast.c create mode 100644 agents/virt/common/simple_auth.c create mode 100644 agents/virt/common/tcp.c create mode 100644 agents/virt/config/Makefile.am create mode 100644 agents/virt/config/config-stack.h create mode 100644 agents/virt/config/config.l create mode 100644 agents/virt/config/config.y create mode 100644 agents/virt/config/fence_virt.conf create mode 100644 agents/virt/config/simpleconfig.c create mode 100644 agents/virt/docs/README create mode 100644 agents/virt/docs/TODO create mode 100644 agents/virt/docs/architecture.txt create mode 100644 agents/virt/docs/fence_virt.txt create mode 100644 agents/virt/fence_virtd.service.in create mode 100644 agents/virt/include/bcast.h create mode 100644 agents/virt/include/client.h create mode 100644 agents/virt/include/debug.h create mode 100644 agents/virt/include/fdops.h create mode 100644 agents/virt/include/history.h create mode 100644 agents/virt/include/ip_lookup.h create mode 100644 agents/virt/include/list.h create mode 100644 agents/virt/include/mcast.h create mode 100644 agents/virt/include/options.h create mode 100644 agents/virt/include/server_plugin.h create mode 100644 agents/virt/include/simple_auth.h create mode 100644 agents/virt/include/simpleconfig.h create mode 100644 agents/virt/include/static_map.h create mode 100644 agents/virt/include/tcp.h create mode 100644 agents/virt/include/tcp_listener.h create mode 100644 agents/virt/include/xvm.h create mode 100644 agents/virt/man/.gitignore create mode 100644 agents/virt/man/Makefile.am create mode 100644 agents/virt/man/fence_virt.conf.5 create mode 100644 agents/virt/man/fence_virtd.8 create mode 100644 agents/virt/man/fence_xvm.8 create mode 100644 agents/virt/server/Makefile.am create mode 100644 agents/virt/server/config.c create mode 100644 agents/virt/server/cpg-virt.c create mode 100644 agents/virt/server/cpg.c create mode 100644 agents/virt/server/cpg.h create mode 100644 agents/virt/server/daemon_init.c create mode 100644 agents/virt/server/history.c create mode 100644 agents/virt/server/libvirt.c create mode 100644 agents/virt/server/main.c create mode 100644 agents/virt/server/mcast.c create mode 100644 agents/virt/server/plugin.c create mode 100644 agents/virt/server/serial.c create mode 100644 agents/virt/server/serial.h create mode 100644 agents/virt/server/static_map.c create mode 100644 agents/virt/server/tcp.c create mode 100644 agents/virt/server/uuid-test.c create mode 100644 agents/virt/server/uuid-test.h create mode 100644 agents/virt/server/virt-serial.c create mode 100644 agents/virt/server/virt-sockets.c create mode 100644 agents/virt/server/virt.c create mode 100644 agents/virt/server/virt.h create mode 100644 agents/virt/server/vsock.c create mode 100644 agents/vmware/fence_vmware.py create mode 100644 agents/vmware/fence_vmware_helper.pl create mode 100644 agents/vmware_rest/fence_vmware_rest.py create mode 100644 agents/vmware_soap/fence_vmware_soap.py create mode 100644 agents/vmware_vcloud/fence_vmware_vcloud.py create mode 100644 agents/wti/fence_wti.py create mode 100644 agents/xenapi/fence_xenapi.py create mode 100644 agents/zvm/fence_zvm.c create mode 100644 agents/zvm/fence_zvm.h create mode 100644 agents/zvm/fence_zvm_man_page create mode 100644 agents/zvm/fence_zvmip.c create mode 100644 agents/zvm/fence_zvmip.py create mode 100755 autogen.sh create mode 100644 configure.ac create mode 100644 doc/COPYING.applications create mode 100644 doc/COPYING.libraries create mode 100644 doc/COPYRIGHT create mode 100644 doc/FenceAgentAPI.md create mode 100644 doc/Makefile.am create mode 100644 doc/README.licence create mode 100644 fence-agents.pc.in create mode 100644 fence-agents.spec.in create mode 100644 lib/Makefile.am create mode 100644 lib/XenAPI.py.py create mode 100644 lib/azure_fence.py.py create mode 100644 lib/check_used_options.py create mode 100644 lib/fence.rng.head create mode 100644 lib/fence.rng.tail create mode 100644 lib/fence2man.xsl create mode 100644 lib/fence2rng.xsl create mode 100644 lib/fence2wiki.xsl create mode 100644 lib/fencing.py.py create mode 100644 lib/fencing_snmp.py.py create mode 100644 lib/metadata.rng create mode 100644 lib/tests/test_fencing.py create mode 100644 m4/PKG_CHECK_VAR.m4 create mode 100644 m4/ac_python_module.m4 create mode 100644 m4/ax_check_link_flag.m4 create mode 100644 m4/ax_prog_date.m4 create mode 100644 m4/ax_pthread.m4 create mode 100644 make/agentccheck.mk create mode 100644 make/agentpycheck.mk create mode 100644 make/fencebuild.mk create mode 100644 make/fenceman.mk create mode 100755 make/git-version-gen create mode 100755 make/gitlog-to-changelog create mode 100644 make/release.mk create mode 100644 systemd/Makefile.am create mode 100644 systemd/fence-agents.conf.in create mode 100644 tests/actions.d/list.cfg create mode 100644 tests/actions.d/power-on-off.cfg create mode 100644 tests/actions.d/sleep.cfg create mode 100644 tests/actions.d/status.cfg create mode 100644 tests/data/metadata/fence_aliyun.xml create mode 100644 tests/data/metadata/fence_alom.xml create mode 100644 tests/data/metadata/fence_amt.xml create mode 100644 tests/data/metadata/fence_amt_ws.xml create mode 100644 tests/data/metadata/fence_apc.xml create mode 100644 tests/data/metadata/fence_apc_snmp.xml create mode 100644 tests/data/metadata/fence_aws.xml create mode 100644 tests/data/metadata/fence_azure_arm.xml create mode 100644 tests/data/metadata/fence_bladecenter.xml create mode 100644 tests/data/metadata/fence_brocade.xml create mode 100644 tests/data/metadata/fence_cdu.xml create mode 100644 tests/data/metadata/fence_cisco_mds.xml create mode 100644 tests/data/metadata/fence_cisco_ucs.xml create mode 100644 tests/data/metadata/fence_compute.xml create mode 100644 tests/data/metadata/fence_crosslink.xml create mode 100644 tests/data/metadata/fence_cyberpower_ssh.xml create mode 100644 tests/data/metadata/fence_docker.xml create mode 100644 tests/data/metadata/fence_drac.xml create mode 100644 tests/data/metadata/fence_drac5.xml create mode 100644 tests/data/metadata/fence_dummy.xml create mode 100644 tests/data/metadata/fence_eaton_snmp.xml create mode 100644 tests/data/metadata/fence_ecloud.xml create mode 100644 tests/data/metadata/fence_emerson.xml create mode 100644 tests/data/metadata/fence_eps.xml create mode 100644 tests/data/metadata/fence_evacuate.xml create mode 100644 tests/data/metadata/fence_gce.xml create mode 100644 tests/data/metadata/fence_hds_cb.xml create mode 100644 tests/data/metadata/fence_heuristics_ping.xml create mode 100644 tests/data/metadata/fence_hpblade.xml create mode 100644 tests/data/metadata/fence_ibm_powervs.xml create mode 100644 tests/data/metadata/fence_ibm_vpc.xml create mode 100644 tests/data/metadata/fence_ibmblade.xml create mode 100644 tests/data/metadata/fence_ibmz.xml create mode 100644 tests/data/metadata/fence_idrac.xml create mode 100644 tests/data/metadata/fence_ifmib.xml create mode 100644 tests/data/metadata/fence_ilo.xml create mode 100644 tests/data/metadata/fence_ilo2.xml create mode 100644 tests/data/metadata/fence_ilo3.xml create mode 100644 tests/data/metadata/fence_ilo3_ssh.xml create mode 100644 tests/data/metadata/fence_ilo4.xml create mode 100644 tests/data/metadata/fence_ilo4_ssh.xml create mode 100644 tests/data/metadata/fence_ilo5.xml create mode 100644 tests/data/metadata/fence_ilo5_ssh.xml create mode 100644 tests/data/metadata/fence_ilo_moonshot.xml create mode 100644 tests/data/metadata/fence_ilo_mp.xml create mode 100644 tests/data/metadata/fence_ilo_ssh.xml create mode 100644 tests/data/metadata/fence_imm.xml create mode 100644 tests/data/metadata/fence_intelmodular.xml create mode 100644 tests/data/metadata/fence_ipdu.xml create mode 100644 tests/data/metadata/fence_ipmilan.xml create mode 100644 tests/data/metadata/fence_ipmilanplus.xml create mode 100644 tests/data/metadata/fence_ironic.xml create mode 100644 tests/data/metadata/fence_kdump.xml create mode 100644 tests/data/metadata/fence_kubevirt.xml create mode 100644 tests/data/metadata/fence_ldom.xml create mode 100644 tests/data/metadata/fence_lindypdu.xml create mode 100644 tests/data/metadata/fence_lpar.xml create mode 100644 tests/data/metadata/fence_mpath.xml create mode 100644 tests/data/metadata/fence_netio.xml create mode 100644 tests/data/metadata/fence_openstack.xml create mode 100644 tests/data/metadata/fence_ovh.xml create mode 100644 tests/data/metadata/fence_powerman.xml create mode 100644 tests/data/metadata/fence_pve.xml create mode 100644 tests/data/metadata/fence_raritan.xml create mode 100644 tests/data/metadata/fence_raritan_px3.xml create mode 100644 tests/data/metadata/fence_rcd_serial.xml create mode 100644 tests/data/metadata/fence_redfish.xml create mode 100644 tests/data/metadata/fence_rhevm.xml create mode 100644 tests/data/metadata/fence_rsa.xml create mode 100644 tests/data/metadata/fence_rsb.xml create mode 100644 tests/data/metadata/fence_sanbox2.xml create mode 100644 tests/data/metadata/fence_sbd.xml create mode 100644 tests/data/metadata/fence_scsi.xml create mode 100644 tests/data/metadata/fence_skalar.xml create mode 100644 tests/data/metadata/fence_tripplite_snmp.xml create mode 100644 tests/data/metadata/fence_vbox.xml create mode 100644 tests/data/metadata/fence_virsh.xml create mode 100644 tests/data/metadata/fence_virt.xml create mode 100644 tests/data/metadata/fence_vmware.xml create mode 100644 tests/data/metadata/fence_vmware_rest.xml create mode 100644 tests/data/metadata/fence_vmware_soap.xml create mode 100644 tests/data/metadata/fence_vmware_vcloud.xml create mode 100644 tests/data/metadata/fence_wti.xml create mode 100644 tests/data/metadata/fence_xenapi.xml create mode 100644 tests/data/metadata/fence_zvmip.xml create mode 100644 tests/devices.d/dummy-with_action.cfg create mode 100644 tests/devices.d/dummy.cfg create mode 100644 tests/devices.d/invalid-missing_option.cfg create mode 100644 tests/devices.d/true-with_action.cfg create mode 100644 tests/devices.d/true.cfg create mode 100755 tests/fence_testing.py create mode 100755 tests/fence_testing_test.py create mode 100755 tests/test-apc2.py create mode 100755 tests/test-apc5.py create mode 100755 tests/test-drac4.py create mode 100755 tests/test-multi-apc2.py create mode 100755 tests/test.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0ac1c6a --- /dev/null +++ b/.gitignore @@ -0,0 +1,75 @@ +*.orig +*.rej +*.swp +Makefile.in +aclocal.m4 +autoconf +autoheader +autom4te.cache +automake +autoscan.log +compile +configure +configure.scan +config.guess +config.log +config.sub +config.status +Makefile +depcomp +install-sh +libtoolize +ltmain.sh +libtool +make/stamp-h1 + +# ignore "libtoolized" m4 files, but keep our (enumerated) ones +/m4/* +!/m4/ac_python_module.m4 +!/m4/ax*.m4 + +# make/release.mk related litter +/.tarball-version +/tag-* + +make/config.h* +missing +*.pc +.deps +.libs +*.o +*.la +*.lo +lib/*.py* +lib/__pycache__ +!lib/*.py.py +!lib/check_used_options.py +agents/*/fence_* +agents/*/.dirstamp +!agents/*/fence_*.py +!agents/*/fence_*.c +!agents/*/fence_*.h +!agents/kdump/fence_kdump_send.8 +!agents/manual/fence_ack_manual.8 +!agents/zvm/fence_zvm_man_page +.fence*.tmp +fence-agents* +.version +tests/devices.d/* + +y.tab.* +*.o +*.lo +*.la +.deps +.libs +.*version +*.swp +agents/virt/client/fence_virt +agents/virt/client/fence_xvm +agents/virt/common/libfence_virt.a +agents/virt/config/config.c +agents/virt/config/libsimpleconfig.a +agents/virt/fence_virtd.service +agents/virt/server/fence_virtd +fence-virt-* diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..a4cd64c --- /dev/null +++ b/Makefile.am @@ -0,0 +1,142 @@ +pkgconfigdir = $(datadir)/pkgconfig +pkgconfig_DATA = $(PACKAGE_NAME).pc + +SPEC = $(PACKAGE_NAME).spec + +EXTRA_DIST = autogen.sh make/fencebuild.mk \ + .version make/release.mk \ + make/git-version-gen make/gitlog-to-changelog tests \ + $(pkgconfig_DATA).in $(SPEC).in + +AUTOMAKE_OPTIONS = foreign + +MAINTAINERCLEANFILES = Makefile.in aclocal.m4 configure depcomp \ + config.guess config.sub missing install-sh \ + autoheader automake autoconf libtool libtoolize \ + ltmain.sh compile make/config.h.in \ + make/config.h.in~ autoscan.log \ + configure.scan + +TARFILES = $(PACKAGE_NAME)-$(VERSION).tar.bz2 \ + $(PACKAGE_NAME)-$(VERSION).tar.gz \ + $(PACKAGE_NAME)-$(VERSION).tar.xz + +ACLOCAL_AMFLAGS = -I m4 + +SUBDIRS = lib agents doc systemd + +.PHONY: $(SUBDIRS) + +agents: lib + +doc: agents + +install-exec-local: + $(INSTALL) -d $(DESTDIR)/$(LOGDIR) + $(INSTALL) -d $(DESTDIR)/$(CLUSTERVARRUN) + $(INSTALL) -d -m 1755 $(DESTDIR)$(FENCETMPDIR) + +uninstall-local: + rmdir $(DESTDIR)/$(LOGDIR) || :; + rmdir $(DESTDIR)/$(CLUSTERVARRUN) || :; + +BUILT_SOURCES = .version +.version: + echo $(VERSION) > $@-t && mv $@-t $@ + +dist-hook: gen-ChangeLog + echo $(VERSION) > $(distdir)/.tarball-version + +gen_start_date = 2000-01-01 +.PHONY: gen-ChangeLog +gen-ChangeLog: + if test -d .git; then \ + $(top_srcdir)/make/gitlog-to-changelog \ + --since=$(gen_start_date) > $(distdir)/cl-t; \ + rm -f $(distdir)/ChangeLog; \ + mv $(distdir)/cl-t $(distdir)/ChangeLog; \ + fi + +# this will get rid of "libtoolized" m4 files +maintainer-clean-local: + rm -rf $(filter-out \ + $(top_srcdir)/m4/ax_check_link_flag.m4 \ + $(top_srcdir)/m4/ax_prog_date.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/ac_python_module.m4 \ + $(top_srcdir)/m4/PKG_CHECK_VAR.m4, \ + $(wildcard $(top_srcdir)/m4/*.m4)) + +## make rpm/srpm section. +$(SPEC): $(SPEC).in + rm -f $@-t $@ + date="$(shell LC_ALL=C date "+%a %b %d %Y")" && \ + specver="1" && \ + rcver="" && \ + dirty="" && \ + alphatag="" && \ + numcomm="" && \ + ver="$(VERSION)" && \ + if echo $$ver | grep -q -- "-dirty$$"; then \ + dirty="dirty" && \ + echo VERSION IS DIRTY && \ + ver=`echo $$ver | sed -e "s/-dirty$$//"`; \ + fi && \ + echo $$ver && \ + if echo $$ver | grep -q -- "-"; then \ + alphatag=`echo $$ver | sed -e "s/.*-//"` && \ + echo VERSION HAS ALPHATAG && \ + ver=`echo $$ver | sed -e "s/-.*//"`; \ + fi && \ + echo $$ver && \ + if [ -n "$$alphatag" ]; then \ + echo VERSION HAS NUMCOMMITS && \ + numcomm=`echo $$ver | sed -e 's/.*\.//'` && \ + ver=`echo $$ver | sed -e 's/.'$$numcomm'$$//'`; \ + fi && \ + if echo $$ver | grep -q "\.[[:digit:]]rc[[:digit:]]"; then \ + rpmver=`echo $$ver | sed -e "s/rc[[:digit:]].*//g"` && \ + rcver=`echo $$ver | sed -e "s/.*\(rc[[:digit:]]\).*/\1/g"` && \ + specver="0"; \ + else \ + rpmver=$$ver; \ + fi && \ + echo $$rpmver $$rcver && \ + sed \ + -e "s#@version@#$$rpmver#g" \ + -e "s#@alphatag@#$$alphatag#g" \ + -e "s#@numcomm@#$$numcomm#g" \ + -e "s#@dirty@#$$dirty#g" \ + -e "s#@date@#$$date#g" \ + -e "s#@specver@#$$specver#g" \ + -e "s#@rcver@#$$rcver#g" \ + -e "s#@rgmanager@#$(RGMANAGER)#g" \ + -e "s#@linux-ha@#$(LINUX_HA)#g" \ + -e "s#@compat-habindir@#$(COMPAT_HABINDIR)#g" \ + $< > $@-t; \ + if [ -z "$$dirty" ]; then sed -i -e "s#%glo.*dirty.*##g" $@-t; fi; \ + if [ -z "$$alphatag" ]; then sed -i -e "s#%glo.*alphatag.*##g" $@-t; fi; \ + if [ -z "$$numcomm" ]; then sed -i -e "s#%glo.*numcomm.*##g" $@-t; fi; \ + if [ -z "$$rcver" ]; then sed -i -e "s#%glo.*rcver.*##g" $@-t; fi + chmod a-w $@-t + mv $@-t $@ + +$(TARFILES): + $(MAKE) dist + +RPMBUILDOPTS = --define "_sourcedir $(abs_builddir)" \ + --define "_specdir $(abs_builddir)" \ + --define "_builddir $(abs_builddir)" \ + --define "_srcrpmdir $(abs_builddir)" \ + --define "_rpmdir $(abs_builddir)" + +srpm: clean + $(MAKE) $(SPEC) $(TARFILES) + rpmbuild $(RPMBUILDOPTS) --nodeps -bs $(SPEC) + +rpm: clean + $(MAKE) $(SPEC) $(TARFILES) + PYTHON="$(PYTHON)" rpmbuild $(RPMBUILDOPTS) -ba $(SPEC) + +clean-generic: + rm -rf $(SPEC) $(TARFILES) $(PACKAGE_NAME)-$(VERSION) *.rpm diff --git a/README.md b/README.md new file mode 100644 index 0000000..d9fcb94 --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# Fence agents + +Fence agents were developed as device "drivers" which are able to prevent computers from destroying data on shared storage. Their aim is to isolate a corrupted computer, using one of three methods: + + * Power - A computer that is switched off cannot corrupt data, but it is important to not do a "soft-reboot" as we won't know if this is possible. This also works for virtual machines when the fence device is a hypervisor. + * Network - Switches can prevent routing to a given computer, so even if a computer is powered on it won't be able to harm the data. + * Configuration - Fibre-channel switches or SCSI devices allow us to limit who can write to managed disks. + +Fence agents do not use configuration files, as configuration management is outside of their scope. All of the configuration has to be specified either as command-line arguments or lines of standard input (see the complete list for more info). + +Because many fence agents are quite similar to each other, a fencing library (in Python) was developed. Please use it for further development. Creating or modifying a new fence agent should be quite simple using this library. + +## Where can I find more information? + +* [ClusterLabs website](http://www.clusterlabs.org/) +* [User and developer documentation](https://github.com/ClusterLabs/fence-agents/tree/master/doc/FenceAgentAPI.md) +* Mailing lists for [users](http://oss.clusterlabs.org/mailman/listinfo/users) and [developers](http://oss.clusterlabs.org/mailman/listinfo/developers) +* #clusterlabs IRC channel on [freenode](http://freenode.net/) diff --git a/agents/Makefile.am b/agents/Makefile.am new file mode 100644 index 0000000..88e0c60 --- /dev/null +++ b/agents/Makefile.am @@ -0,0 +1,123 @@ +MAINTAINERCLEANFILES = Makefile.in + +TARGET = $(AGENTS_LIST:%.py=%) + +SRC = $(TARGET:=.py) + +CLEAN_TARGET_ADDITIONAL = kdump/fence_kdump_send manual/fence_ack_manual */*.o + +EXTRA_DIST = $(SRC) + +sbin_PROGRAMS = +sbin_SCRIPTS = $(TARGET) +libexec_PROGRAMS = + +noinst_HEADERS = kdump/list.h kdump/message.h kdump/options.h kdump/version.h zvm/fence_zvm.h + +man_MANS = $(sbin_SCRIPTS:=.8) +dist_man_MANS = + +EXTRA_SCRIPTS = + +if BUILD_FENCE_VIRT +SUBDIRS = virt +endif + +if BUILD_FENCE_KDUMP +sbin_PROGRAMS += kdump/fence_kdump +libexec_PROGRAMS += kdump/fence_kdump_send + +man_MANS += kdump/fence_kdump.8 +dist_man_MANS += kdump/fence_kdump_send.8 + +kdump_fence_kdump_SOURCES = kdump/fence_kdump.c +kdump_fence_kdump_CFLAGS = -D_GNU_SOURCE -Ikdump $(AM_CFLAGS) -Wno-cast-align + +kdump_fence_kdump_send_SOURCES = kdump/fence_kdump_send.c +kdump_fence_kdump_send_CFLAGS = -D_GNU_SOURCE -Ikdump $(AM_CFLAGS) -Wno-cast-align +endif + +if BUILD_FENCE_MANUAL +EXTRA_DIST += manual/fence_ack_manual.in manual/fence_ack_manual.8 + +sbin_SCRIPTS += manual/fence_ack_manual +endif + +if BUILD_FENCE_ZVM +EXTRA_DIST += zvm/fence_zvm_man_page + +sbin_PROGRAMS += zvm/fence_zvm + +man_MANS += zvm/fence_zvm.8 + +zvm_fence_zvm_SOURCES = zvm/fence_zvm.c +zvm_fence_zvm_CFLAGS = -D_GNU_SOURCE -Izvm $(AM_CFLAGS) +endif + +if BUILD_FENCE_MPATH +mpathdatadir = $(CLUSTERDATA) +mpathdata_SCRIPTS = mpath/fence_mpath_check mpath/fence_mpath_check_hardreboot +endif + +if BUILD_FENCE_SCSI +scsidatadir = $(CLUSTERDATA) +scsidata_SCRIPTS = scsi/fence_scsi_check scsi/fence_scsi_check_hardreboot +endif + +FENCE_TEST_ARGS = \ +login=test\n\ +passwd=test\n\ +ipaddr=test\n\ +port=1\n\ +managed=1\n\ +devices=test\n\ +session_url=http://test\n\ +email=test@test.te\n\ +ping_targets=localhost + +manual/fence_ack_manual: manual/fence_ack_manual.in + mkdir -p $(@D) + cat $^ | sed \ + -e 's#@clustervarrun@#${CLUSTERVARRUN}#g' \ + > $@ + +mpath/fence_mpath_check: mpath/fence_mpath + cp $^ $@ + +mpath/fence_mpath_check_hardreboot: mpath/fence_mpath + cp $^ $@ + +scsi/fence_scsi_check: scsi/fence_scsi + cp $^ $@ + +scsi/fence_scsi_check_hardreboot: scsi/fence_scsi + cp $^ $@ + +kdump/fence_kdump.8: kdump/fence_kdump $(top_srcdir)/lib/fence2man.xsl + set -e && \ + ./$(@:%.8=%) -o metadata > $(@D)/.$(@F).tmp && \ + xmllint --noout --relaxng $(top_srcdir)/lib/metadata.rng $(@D)/.$(@F).tmp && \ + xsltproc $(top_srcdir)/lib/fence2man.xsl $(@D)/.$(@F).tmp > $@ + xsltproc $(top_srcdir)/lib/fence2wiki.xsl $(@D)/.$(@F).tmp | grep -v ' $(@D)/$(@F:%.8=%.wiki) + +kdump/fence_kdump_send.8: + true + +manual/fence_ack_manual.8: + true + +zvm/fence_zvm.8: zvm/fence_zvm + cp $(top_srcdir)/agents/zvm/fence_zvm_man_page $(@D)/fence_zvm.8 + +cisco_mds/fence_cisco_mds.delay-check: cisco_mds/fence_cisco_mds + $(eval INPUT=$(subst .delay-check,,$@)) + FENCE_TEST_ARGS_CISCO_MDS=$$(printf '$(FENCE_TEST_ARGS)' | sed 's#port=1#port=fc1/1#'); \ + test `PYTHONPATH=$(abs_top_srcdir)/lib:$(abs_top_builddir)/lib /usr/bin/time -p \ + sh -c "printf 'delay=10\n $$FENCE_TEST_ARGS_CISCO_MDS' | $(PYTHON) ./$(INPUT)" 2>&1 |\ + awk -F"[. ]" -vOFS= '/real/ {print $$2,$$3}'` -ge 1000 || ( \ + PYTHONPATH=$(abs_top_srcdir)/lib:$(abs_top_builddir)/lib /usr/bin/time -p \ + sh -c "printf "delay=0\n $$FENCE_TEST_ARGS_CISCO_MDS" | $(PYTHON) ./$(INPUT)"; false ) + +include $(top_srcdir)/make/fencebuild.mk +include $(top_srcdir)/make/fenceman.mk +include $(top_srcdir)/make/agentpycheck.mk diff --git a/agents/aliyun/fence_aliyun.py b/agents/aliyun/fence_aliyun.py new file mode 100644 index 0000000..1e9c790 --- /dev/null +++ b/agents/aliyun/fence_aliyun.py @@ -0,0 +1,192 @@ +#!@PYTHON@ -tt + +import sys +import logging +import atexit +import json + +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail_usage, run_delay + + +try: + from aliyunsdkcore import client + from aliyunsdkcore.auth.credentials import EcsRamRoleCredential + from aliyunsdkcore.profile import region_provider +except ImportError as e: + logging.warn("The 'aliyunsdkcore' module has been not installed or is unavailable, try to execute the command 'pip install aliyun-python-sdk-core --upgrade' to solve. error: %s" % e) + + +try: + from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest + from aliyunsdkecs.request.v20140526.StartInstanceRequest import StartInstanceRequest + from aliyunsdkecs.request.v20140526.StopInstanceRequest import StopInstanceRequest + from aliyunsdkecs.request.v20140526.RebootInstanceRequest import RebootInstanceRequest +except ImportError as e: + logging.warn("The 'aliyunsdkecs' module has been not installed or is unavailable, try to execute the command 'pip install aliyun-python-sdk-ecs --upgrade' to solve. error: %s" % e) + + +def _send_request(conn, request): + logging.debug("send request action: %s" % request.get_action_name()) + request.set_accept_format('json') + try: + response_str = conn.do_action_with_exception(request) + except Exception as e: + fail_usage("Failed: send request failed: Error: %s" % e) + + response_detail = json.loads(response_str) + logging.debug("reponse: %s" % response_detail) + return response_detail + +def start_instance(conn, instance_id): + logging.debug("start instance %s" % instance_id) + request = StartInstanceRequest() + request.set_InstanceId(instance_id) + _send_request(conn, request) + +def stop_instance(conn, instance_id): + logging.debug("stop instance %s" % instance_id) + request = StopInstanceRequest() + request.set_InstanceId(instance_id) + request.set_ForceStop('true') + _send_request(conn, request) + +def reboot_instance(conn, instance_id): + logging.debug("reboot instance %s" % instance_id) + request = RebootInstanceRequest() + request.set_InstanceId(instance_id) + request.set_ForceStop('true') + _send_request(conn, request) + +def get_status(conn, instance_id): + logging.debug("get instance %s status" % instance_id) + request = DescribeInstancesRequest() + request.set_InstanceIds(json.dumps([instance_id])) + response = _send_request(conn, request) + instance_status = None + if response is not None: + instance_list = response.get('Instances').get('Instance') + for item in instance_list: + instance_status = item.get('Status') + return instance_status + +def get_nodes_list(conn, options): + logging.debug("start to get nodes list") + result = {} + request = DescribeInstancesRequest() + request.set_PageSize(100) + response = _send_request(conn, request) + if response is not None: + instance_list = response.get('Instances').get('Instance') + for item in instance_list: + instance_id = item.get('InstanceId') + instance_name = item.get('InstanceName') + result[instance_id] = (instance_name, None) + logging.debug("get nodes list: %s" % result) + return result + +def get_power_status(conn, options): + logging.debug("start to get power(%s) status" % options["--plug"]) + state = get_status(conn, options["--plug"]) + + if state == "Running": + status = "on" + elif state == "Stopped": + status = "off" + else: + status = "unknown" + logging.debug("the power(%s) status is %s" % (options["--plug"], status)) + return status + +def set_power_status(conn, options): + logging.info("start to set power(%s) status to %s" % (options["--plug"], options["--action"])) + + if (options["--action"]=="off"): + stop_instance(conn, options["--plug"]) + elif (options["--action"]=="on"): + start_instance(conn, options["--plug"]) + elif (options["--action"]=="reboot"): + reboot_instance(conn, options["--plug"]) + +def define_new_opts(): + all_opt["region"] = { + "getopt" : "r:", + "longopt" : "region", + "help" : "-r, --region=[name] Region, e.g. cn-hangzhou", + "shortdesc" : "Region.", + "required" : "0", + "order" : 2 + } + all_opt["access_key"] = { + "getopt" : "a:", + "longopt" : "access-key", + "help" : "-a, --access-key=[name] Access Key", + "shortdesc" : "Access Key.", + "required" : "0", + "order" : 3 + } + all_opt["secret_key"] = { + "getopt" : "s:", + "longopt" : "secret-key", + "help" : "-s, --secret-key=[name] Secret Key", + "shortdesc" : "Secret Key.", + "required" : "0", + "order" : 4 + } + all_opt["ram_role"] = { + "getopt": ":", + "longopt": "ram-role", + "help": "--ram-role=[name] Ram Role", + "shortdesc": "Ram Role.", + "required": "0", + "order": 5 + } + +# Main agent method +def main(): + conn = None + + device_opt = ["port", "no_password", "region", "access_key", "secret_key", "ram_role"] + + atexit.register(atexit_handler) + + define_new_opts() + + all_opt["power_timeout"]["default"] = "60" + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for Aliyun (Aliyun Web Services)" + docs["longdesc"] = "fence_aliyun is an I/O Fencing agent for Aliyun" + docs["vendorurl"] = "http://www.aliyun.com" + show_docs(options, docs) + + run_delay(options) + + if "--region" in options: + region = options["--region"] + if "--access-key" in options and "--secret-key" in options: + access_key = options["--access-key"] + secret_key = options["--secret-key"] + conn = client.AcsClient(access_key, secret_key, region) + elif "--ram-role" in options: + ram_role = options["--ram-role"] + role = EcsRamRoleCredential(ram_role) + conn = client.AcsClient(region_id=region, credential=role) + else: + fail_usage("Failed: User credentials are not set. Please set the Access Key and the Secret Key, or configure the RAM role.") + + # Use intranet endpoint to access ECS service + try: + region_provider.modify_point('Ecs', region, 'ecs.%s.aliyuncs.com' % region) + except Exception as e: + logging.warn("Failed: failed to modify endpoint to 'ecs.%s.aliyuncs.com': %s" % (region, e)) + + # Operate the fencing device + result = fence_action(conn, options, set_power_status, get_power_status, get_nodes_list) + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/alom/fence_alom.py b/agents/alom/fence_alom.py new file mode 100644 index 0000000..7b03dc2 --- /dev/null +++ b/agents/alom/fence_alom.py @@ -0,0 +1,53 @@ +#!@PYTHON@ -tt + +# The Following Agent Has Been Tested On: +# +# Sun(tm) Advanced Lights Out Manager CMT v1.6.1 +# as found on SUN T2000 Niagara + +import sys, re, time +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * + +def get_power_status(conn, options): + conn.send_eol("showplatform") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + status = re.search("standby", conn.before.lower()) + result = (status != None and "off" or "on") + + return result + +def set_power_status(conn, options): + cmd_line = (options["--action"] == "on" and "poweron" or "poweroff -f -y") + conn.send_eol(cmd_line) + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + # Get the machine some time between poweron and poweroff + time.sleep(int(options["--power-timeout"])) + +def main(): + device_opt = ["ipaddr", "login", "passwd", "cmd_prompt", "secure"] + + atexit.register(atexit_handler) + + all_opt["secure"]["default"] = "1" + all_opt["cmd_prompt"]["default"] = [r"sc\>\ "] + + options = check_input(device_opt, process_input(device_opt)) + options["telnet_over_ssh"] = 1 + + docs = {} + docs["shortdesc"] = "Fence agent for Sun ALOM" + docs["longdesc"] = "fence_alom is an I/O Fencing \ +agent which can be used with ALOM connected machines." + docs["vendorurl"] = "http://www.sun.com" + show_docs(options, docs) + + # Operate the fencing device + conn = fence_login(options) + result = fence_action(conn, options, set_power_status, get_power_status, None) + fence_logout(conn, "logout") + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/amt/fence_amt.py b/agents/amt/fence_amt.py new file mode 100644 index 0000000..feec6e3 --- /dev/null +++ b/agents/amt/fence_amt.py @@ -0,0 +1,128 @@ +#!@PYTHON@ -tt + +import sys, re, os +import atexit +from pipes import quote +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail_usage, is_executable, run_command, run_delay + +def get_power_status(_, options): + output = amt_run_command(options, create_command(options, "status")) + match = re.search('Powerstate:[\\s]*(..)', str(output)) + status = match.group(1) if match else None + + if status == None: + return "fail" + elif status == "S0": # SO = on; S3 = sleep; S5 = off + return "on" + else: + return "off" + +def set_power_status(_, options): + amt_run_command(options, create_command(options, options["--action"])) + return + +def reboot_cycle(_, options): + (status, _, _) = run_command(options, create_command(options, "cycle")) + return not bool(status) + +def amt_run_command(options, command, timeout=None): + env = os.environ.copy() + + x = quote(options["--password"]) + x = x[:-1] if x.endswith("'") else x + x = x[1:] if x.startswith("'") else x + env["AMT_PASSWORD"] = x + + # This is needed because setting the AMT_PASSWORD env + # variable only works when no pipe is involved. E.g.: + # - Broken: + # $ AMT_PASSWORD='foobar' echo 'y' | /usr/bin/amttool nuc2 powerdown + # 401 Unauthorized at /usr/bin/amttool line 129. + # - Working: + # $ AMT_PASSWORD='foobar' sh -c "(echo 'y' | /usr/bin/amttool nuc2 powerdown)" + # execute: powerdown + # result: pt_status: success + newcommand = "sh -c \"(%s)\"" % command + return run_command(options, newcommand, timeout, env) + +def create_command(options, action): + cmd = options["--amttool-path"] + + # --ip / -a + cmd += " " + options["--ip"] + + # --action / -o + if action == "status": + cmd += " info" + elif action == "on": + cmd = "echo \"y\"|" + cmd + cmd += " powerup" + elif action == "off": + cmd = "echo \"y\"|" + cmd + cmd += " powerdown" + elif action == "cycle": + cmd = "echo \"y\"|" + cmd + cmd += " powercycle" + if action in ["on", "off", "cycle"] and "--boot-option" in options: + cmd += options["--boot-option"] + + # --use-sudo / -d + if "--use-sudo" in options: + cmd = options["--sudo-path"] + " " + cmd + + return cmd + +def define_new_opts(): + all_opt["boot_option"] = { + "getopt" : "b:", + "longopt" : "boot-option", + "help" : "-b, --boot-option=[option] " + "Change the default boot behavior of the machine. (pxe|hd|hdsafe|cd|diag)", + "required" : "0", + "shortdesc" : "Change the default boot behavior of the machine.", + "choices" : ["pxe", "hd", "hdsafe", "cd", "diag"], + "order" : 1 + } + all_opt["amttool_path"] = { + "getopt" : ":", + "longopt" : "amttool-path", + "help" : "--amttool-path=[path] Path to amttool binary", + "required" : "0", + "shortdesc" : "Path to amttool binary", + "default" : "@AMTTOOL_PATH@", + "order": 200 + } + +def main(): + atexit.register(atexit_handler) + + device_opt = ["ipaddr", "no_login", "passwd", "boot_option", "no_port", + "sudo", "amttool_path", "method"] + + define_new_opts() + + all_opt["ipport"]["default"] = "16994" + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for AMT" + docs["longdesc"] = "fence_amt is an I/O Fencing agent \ +which can be used with Intel AMT. This agent calls support software amttool\ +(http://www.kraxel.org/cgit/amtterm/)." + docs["vendorurl"] = "http://www.intel.com/" + show_docs(options, docs) + + run_delay(options) + + if not is_executable(options["--amttool-path"]): + fail_usage("Amttool not found or not accessible") + + result = fence_action(None, options, set_power_status, get_power_status, None, reboot_cycle) + + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/amt_ws/fence_amt_ws.py b/agents/amt_ws/fence_amt_ws.py new file mode 100755 index 0000000..5e7452a --- /dev/null +++ b/agents/amt_ws/fence_amt_ws.py @@ -0,0 +1,240 @@ +#!@PYTHON@ -tt + +# +# Fence agent for Intel AMT (WS) based on code from the openstack/ironic project: +# https://github.com/openstack/ironic/blob/master/ironic/drivers/modules/amt/power.py +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# + +import sys +import atexit +import logging +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import run_delay, fail_usage, fail, EC_STATUS + +from xml.etree import ElementTree + +try: + import pywsman +except ImportError: + pass + +POWER_ON='2' +POWER_OFF='8' +POWER_CYCLE='10' + +RET_SUCCESS = '0' + +CIM_PowerManagementService = ('http://schemas.dmtf.org/wbem/wscim/1/' + 'cim-schema/2/CIM_PowerManagementService') +CIM_ComputerSystem = ('http://schemas.dmtf.org/wbem/wscim/' + '1/cim-schema/2/CIM_ComputerSystem') +CIM_AssociatedPowerManagementService = ('http://schemas.dmtf.org/wbem/wscim/' + '1/cim-schema/2/' + 'CIM_AssociatedPowerManagementService') + +CIM_BootConfigSetting = ('http://schemas.dmtf.org/wbem/wscim/' + '1/cim-schema/2/CIM_BootConfigSetting') +CIM_BootSourceSetting = ('http://schemas.dmtf.org/wbem/wscim/' + '1/cim-schema/2/CIM_BootSourceSetting') + + +def xml_find(doc, namespace, item): + if doc is None: + return + tree = ElementTree.fromstring(doc.root().string()) + query = ('.//{%(namespace)s}%(item)s' % {'namespace': namespace, + 'item': item}) + return tree.find(query) + +def _generate_power_action_input(action): + method_input = "RequestPowerStateChange_INPUT" + address = 'http://schemas.xmlsoap.org/ws/2004/08/addressing' + anonymous = ('http://schemas.xmlsoap.org/ws/2004/08/addressing/' + 'role/anonymous') + wsman = 'http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd' + namespace = CIM_PowerManagementService + + doc = pywsman.XmlDoc(method_input) + root = doc.root() + root.set_ns(namespace) + root.add(namespace, 'PowerState', action) + + child = root.add(namespace, 'ManagedElement', None) + child.add(address, 'Address', anonymous) + + grand_child = child.add(address, 'ReferenceParameters', None) + grand_child.add(wsman, 'ResourceURI', CIM_ComputerSystem) + + g_grand_child = grand_child.add(wsman, 'SelectorSet', None) + g_g_grand_child = g_grand_child.add(wsman, 'Selector', 'ManagedSystem') + g_g_grand_child.attr_add(wsman, 'Name', 'Name') + return doc + +def get_power_status(_, options): + client = pywsman.Client(options["--ip"], int(options["--ipport"]), \ + '/wsman', 'http', 'admin', options["--password"]) + namespace = CIM_AssociatedPowerManagementService + client_options = pywsman.ClientOptions() + doc = client.get(client_options, namespace) + _SOAP_ENVELOPE = 'http://www.w3.org/2003/05/soap-envelope' + item = 'Fault' + fault = xml_find(doc, _SOAP_ENVELOPE, item) + if fault is not None: + logging.error("Failed to get power state for: %s port:%s", \ + options["--ip"], options["--ipport"]) + fail(EC_STATUS) + + item = "PowerState" + try: power_state = xml_find(doc, namespace, item).text + except AttributeError: + logging.error("Failed to get power state for: %s port:%s", \ + options["--ip"], options["--ipport"]) + fail(EC_STATUS) + if power_state == POWER_ON: + return "on" + elif power_state == POWER_OFF: + return "off" + else: + fail(EC_STATUS) + +def set_power_status(_, options): + client = pywsman.Client(options["--ip"], int(options["--ipport"]), \ + '/wsman', 'http', 'admin', options["--password"]) + + method = 'RequestPowerStateChange' + client_options = pywsman.ClientOptions() + client_options.add_selector('Name', 'Intel(r) AMT Power Management Service') + + if options["--action"] == "on": + target_state = POWER_ON + elif options["--action"] == "off": + target_state = POWER_OFF + elif options["--action"] == "reboot": + target_state = POWER_CYCLE + if options["--action"] in ["on", "off", "reboot"] \ + and "--boot-option" in options: + set_boot_order(_, client, options) + + doc = _generate_power_action_input(target_state) + client_doc = client.invoke(client_options, CIM_PowerManagementService, \ + method, doc) + item = "ReturnValue" + return_value = xml_find(client_doc, CIM_PowerManagementService, item).text + if return_value != RET_SUCCESS: + logging.error("Failed to set power state: %s for: %s", \ + options["--action"], options["--ip"]) + fail(EC_STATUS) + +def set_boot_order(_, client, options): + method_input = "ChangeBootOrder_INPUT" + address = 'http://schemas.xmlsoap.org/ws/2004/08/addressing' + anonymous = ('http://schemas.xmlsoap.org/ws/2004/08/addressing/' + 'role/anonymous') + wsman = 'http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd' + namespace = CIM_BootConfigSetting + + if options["--boot-option"] == "PXE": + device = "Intel(r) AMT: Force PXE Boot" + elif options["--boot-option"] in ["HD", "HDSAFE"]: + device = "Intel(r) AMT: Force Hard-drive Boot" + elif options["--boot-option"] == "CD": + device = "Intel(r) AMT: Force CD/DVD Boot" + elif options["--boot-option"] == "DIAG": + device = "Intel(r) AMT: Force Diagnostic Boot" + else: + logging.error('Boot device: %s not supported.', \ + options["--boot-option"]) + return + + method = 'ChangeBootOrder' + client_options = pywsman.ClientOptions() + client_options.add_selector('InstanceID', \ + 'Intel(r) AMT: Boot Configuration 0') + + doc = pywsman.XmlDoc(method_input) + root = doc.root() + root.set_ns(namespace) + + child = root.add(namespace, 'Source', None) + child.add(address, 'Address', anonymous) + + grand_child = child.add(address, 'ReferenceParameters', None) + grand_child.add(wsman, 'ResourceURI', CIM_BootSourceSetting) + + g_grand_child = grand_child.add(wsman, 'SelectorSet', None) + g_g_grand_child = g_grand_child.add(wsman, 'Selector', device) + g_g_grand_child.attr_add(wsman, 'Name', 'InstanceID') + if options["--boot-option"] == "hdsafe": + g_g_grand_child = g_grand_child.add(wsman, 'Selector', 'True') + g_g_grand_child.attr_add(wsman, 'Name', 'UseSafeMode') + + client_doc = client.invoke(client_options, CIM_BootConfigSetting, \ + method, doc) + item = "ReturnValue" + return_value = xml_find(client_doc, CIM_BootConfigSetting, item).text + if return_value != RET_SUCCESS: + logging.error("Failed to set boot device to: %s for: %s", \ + options["--boot-option"], options["--ip"]) + fail(EC_STATUS) + +def reboot_cycle(_, options): + status = set_power_status(_, options) + return not bool(status) + +def define_new_opts(): + all_opt["boot_option"] = { + "getopt" : "b:", + "longopt" : "boot-option", + "help" : "-b, --boot-option=[option] " + "Change the default boot behavior of the\n" + " machine." + " (pxe|hd|hdsafe|cd|diag)", + "required" : "0", + "shortdesc" : "Change the default boot behavior of the machine.", + "choices" : ["pxe", "hd", "hdsafe", "cd", "diag"], + "order" : 1 + } + +def main(): + atexit.register(atexit_handler) + + device_opt = ["ipaddr", "no_login", "passwd", "boot_option", "no_port", + "method"] + + define_new_opts() + + all_opt["ipport"]["default"] = "16992" + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for AMT (WS)" + docs["longdesc"] = "fence_amt_ws is an I/O Fencing agent \ +which can be used with Intel AMT (WS). This agent requires \ +the pywsman Python library which is included in OpenWSMAN. \ +(http://openwsman.github.io/)." + docs["vendorurl"] = "http://www.intel.com/" + show_docs(options, docs) + + run_delay(options) + + result = fence_action(None, options, set_power_status, get_power_status, \ + None, reboot_cycle) + + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/apc/fence_apc.py b/agents/apc/fence_apc.py new file mode 100644 index 0000000..3ea0f37 --- /dev/null +++ b/agents/apc/fence_apc.py @@ -0,0 +1,263 @@ +#!@PYTHON@ -tt + +##### +## +## The Following Agent Has Been Tested On: +## +## Model Firmware +## +---------------------------------------------+ +## AP7951 AOS v2.7.0, PDU APP v2.7.3 +## AP7941 AOS v3.5.7, PDU APP v3.5.6 +## AP9606 AOS v2.5.4, PDU APP v2.7.3 +## +## @note: ssh is very slow on AP79XX devices protocol (1) and +## cipher (des/blowfish) have to be defined +##### + +import sys, re, time +import logging +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, fail_usage, EC_STATUS + +# Fix for connection timed out issue in: +# https://bugzilla.redhat.com/show_bug.cgi?id=1342584 +TIMEDOUT_DELAY = 0.5 + +def get_power_status(conn, options): + exp_result = 0 + outlets = {} + + conn.send_eol("1") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + version = 0 + admin = 0 + switch = 0 + + if None != re.compile('.* MasterSwitch plus.*', re.IGNORECASE | re.S).match(conn.before): + switch = 1 + if None != re.compile('.* MasterSwitch plus 2', re.IGNORECASE | re.S).match(conn.before): + if "--switch" not in options: + fail_usage("Failed: You have to enter physical switch number") + else: + if "--switch" not in options: + options["--switch"] = "1" + + if None == re.compile('.*Outlet Management.*', re.IGNORECASE | re.S).match(conn.before): + version = 2 + else: + version = 3 + + if None == re.compile('.*Outlet Control/Configuration.*', re.IGNORECASE | re.S).match(conn.before): + admin = 0 + else: + admin = 1 + + if switch == 0: + if version == 2: + if admin == 0: + conn.send_eol("2") + else: + conn.send_eol("3") + else: + conn.send_eol("2") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + conn.send_eol("1") + else: + conn.send_eol(options["--switch"]) + + while True: + exp_result = conn.log_expect( + ["Press "] + options["--command-prompt"], int(options["--shell-timeout"])) + lines = conn.before.split("\n") + show_re = re.compile(r'(^|\x0D)\s*(\d+)- (.*?)\s+(ON|OFF)\s*') + for line in lines: + res = show_re.search(line) + if res != None: + outlets[res.group(2)] = (res.group(3), res.group(4)) + time.sleep(TIMEDOUT_DELAY) + conn.send_eol("") + if exp_result != 0: + break + conn.send(chr(0o3)) + conn.log_expect("- Logout", int(options["--shell-timeout"])) + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + if ["list", "monitor"].count(options["--action"]) == 1: + return outlets + else: + try: + (_, status) = outlets[options["--plug"]] + return status.lower().strip() + except KeyError as e: + logging.error("Failed: {}".format(str(e))) + fail(EC_STATUS) + +def set_power_status(conn, options): + action = { + 'on' : "1", + 'off': "2" + }[options["--action"]] + + conn.send_eol("1") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + version = 0 + admin2 = 0 + admin3 = 0 + switch = 0 + + if None != re.compile('.* MasterSwitch plus.*', re.IGNORECASE | re.S).match(conn.before): + switch = 1 + ## MasterSwitch has different schema for on/off actions + action = { + 'on' : "1", + 'off': "3" + }[options["--action"]] + if None != re.compile('.* MasterSwitch plus 2', re.IGNORECASE | re.S).match(conn.before): + if "--switch" not in options: + fail_usage("Failed: You have to enter physical switch number") + else: + if "--switch" not in options: + options["--switch"] = 1 + + if None == re.compile('.*Outlet Management.*', re.IGNORECASE | re.S).match(conn.before): + version = 2 + else: + version = 3 + + if None == re.compile('.*Outlet Control/Configuration.*', re.IGNORECASE | re.S).match(conn.before): + admin2 = 0 + else: + admin2 = 1 + + if switch == 0: + if version == 2: + if admin2 == 0: + conn.send_eol("2") + else: + conn.send_eol("3") + else: + conn.send_eol("2") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + if None == re.compile('.*2- Outlet Restriction.*', re.IGNORECASE | re.S).match(conn.before): + admin3 = 0 + else: + admin3 = 1 + conn.send_eol("1") + else: + conn.send_eol(options["--switch"]) + + while 0 == conn.log_expect( + ["Press "] + options["--command-prompt"], int(options["--shell-timeout"])): + time.sleep(TIMEDOUT_DELAY) + conn.send_eol("") + + conn.send_eol(options["--plug"]+"") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + if switch == 0: + if admin2 == 1: + conn.send_eol("1") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + if admin3 == 1: + conn.send_eol("1") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + else: + conn.send_eol("1") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + conn.send_eol(action) + conn.log_expect("Enter 'YES' to continue or to cancel :", int(options["--shell-timeout"])) + conn.send_eol("YES") + conn.log_expect("Press to continue...", int(options["--power-timeout"])) + time.sleep(TIMEDOUT_DELAY) + conn.send_eol("") + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + conn.send(chr(0o3)) + conn.log_expect("- Logout", int(options["--shell-timeout"])) + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + +def get_power_status5(conn, options): + outlets = {} + + conn.send_eol("olStatus all") + + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + lines = conn.before.split("\n") + + show_re = re.compile(r'^\s*(\d+): (.*): (On|Off)\s*$', re.IGNORECASE) + + for line in lines: + res = show_re.search(line) + if res != None: + outlets[res.group(1)] = (res.group(2), res.group(3)) + + if ["list", "monitor"].count(options["--action"]) == 1: + return outlets + else: + try: + (_, status) = outlets[options["--plug"]] + return status.lower().strip() + except KeyError as e: + logging.error("Failed: {}".format(str(e))) + fail(EC_STATUS) + +def set_power_status5(conn, options): + action = { + 'on' : "olOn", + 'off': "olOff" + }[options["--action"]] + + conn.send_eol(action + " " + options["--plug"]) + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + +def main(): + device_opt = ["ipaddr", "login", "passwd", "cmd_prompt", "secure", \ + "port", "switch", "telnet"] + + atexit.register(atexit_handler) + + all_opt["cmd_prompt"]["default"] = ["\n>", "\napc>"] + all_opt["ssh_options"]["default"] = "-1 -c blowfish" + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for APC over telnet/ssh" + docs["longdesc"] = "fence_apc is an I/O Fencing agent \ +which can be used with the APC network power switch. It logs into device \ +via telnet/ssh and reboots a specified outlet. Lengthy telnet/ssh connections \ +should be avoided while a GFS cluster is running because the connection \ +will block any necessary fencing actions." + docs["vendorurl"] = "http://www.apc.com" + show_docs(options, docs) + + ## Support for --plug [switch]:[plug] notation that was used before + if (("--plug" in options) == 1) and (-1 != options["--plug"].find(":")): + (switch, plug) = options["--plug"].split(":", 1) + options["--switch"] = switch + options["--plug"] = plug + + ## + ## Operate the fencing device + #### + conn = fence_login(options) + + ## Detect firmware version (ASCII menu vs command-line interface) + ## and continue with proper action + #### + result = -1 + firmware_version = re.compile(r'\s*v(\d)*\.').search(conn.before) + if (firmware_version != None) and (firmware_version.group(1) in [ "5", "6", "7" ]): + result = fence_action(conn, options, set_power_status5, get_power_status5, get_power_status5) + else: + result = fence_action(conn, options, set_power_status, get_power_status, get_power_status) + + fence_logout(conn, "4") + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/apc_snmp/README b/agents/apc_snmp/README new file mode 100644 index 0000000..75aa37a --- /dev/null +++ b/agents/apc_snmp/README @@ -0,0 +1,45 @@ +This is an snmp based fence agent for APC power switches to be used +with RHEL4 Red Hat Cluster Suite. + +The reasons to use this agent rather than the current fence_apc agent are: +1) This script has been tested with EVERY powerswitch that APC currently +makes. +2) It will work on many older models that are no longer supported by APC. +I have been told that it even works with the AP9200 switch. Older switches +usually don't do well with the fence_apc script. +3) This agent works with large power switches that have more than 8 outlets. +The fence_apc script will also, in the next update -- this script will work for you now. + +If feedback on this beta version of the agent is good, and if ganged switches +can be supported, then this agent may replace fence_apc. + +In order to use this agent, you will need to have net-snmp-utils installed +on every node in your cluster. net-snmp-utils is scheduled for inclusion +in the base RHEL distribution for Update 4, and is yummable in FC5. + +After net-snmp-utils is installed, there will be a directory named: +/usr/share/snmp/mibs/ + +Place the accompanying powernet369.mib file in this directory. + +To use the agent, cp the agent to the /sbin directory on every +cluster node. The interface for the fence_apc_snmp agent is identical to +the existing fence_apc agent, so if you are using APC for fencing in +your cluster, you *could* backup your current fence_apc agent, and +rename this agent from fence_apc_snmp to fence_apc, and it should just work. + +NOTE: The fence_apc_snmp agent does not yet support ganged or 'daisy-chained' +APC switches. + +If you would rather not copy over your fence_apc agent, you can still use +the fence_apc_snmp agent by dropping it into /sbin on every node, and then +defining a in the cluster.conf file with agent="fence_apc_snmp" +as an attribute, and use it that way. Note, please, that the GUI does +not support this agent yet, and you will have to edit your cluster.conf +by hand and then propagate it yourself. If you need help with this, email +me on linux-cluster or at the address below. + +Big thanks to Nate Straz who laid the foundation for this agent. + +Please let me know how this agent works. +--Jim Parsons - jparsons@redhat.com diff --git a/agents/apc_snmp/fence_apc_snmp.py b/agents/apc_snmp/fence_apc_snmp.py new file mode 100644 index 0000000..cd60166 --- /dev/null +++ b/agents/apc_snmp/fence_apc_snmp.py @@ -0,0 +1,232 @@ +#!@PYTHON@ -tt + +# The Following agent has been tested on: +# - APC Switched Rack PDU - SNMP v1 +# (MB:v3.7.0 PF:v2.7.0 PN:apc_hw02_aos_270.bin AF1:v2.7.3 +# AN1:apc_hw02_aos_270.bin AF1:v2.7.3 AN1:apc_hw02_rpdu_273.bin MN:AP7930 HR:B2) +# - APC Web/SNMP Management Card - SNMP v1 and v3 (noAuthNoPrivacy,authNoPrivacy, authPrivacy) +# (MB:v3.8.6 PF:v3.5.8 PN:apc_hw02_aos_358.bin AF1:v3.5.7 +# AN1:apc_hw02_aos_358.bin AF1:v3.5.7 AN1:apc_hw02_rpdu_357.bin MN:AP7900 HR:B2) +# - APC Switched Rack PDU - SNMP v1 +# (MB:v3.7.0 PF:v2.7.0 PN:apc_hw02_aos_270.bin AF1:v2.7.3 +# AN1:apc_hw02_rpdu_273.bin MN:AP7951 HR:B2) +# - Tripplite PDUMH20HVNET 12.04.0055 - SNMP v1, v2c, v3 +# - Tripplite PDU15NETLX 15.5.4 - SNMP v1, v2c, v3 + +import sys +import atexit +import logging +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail_usage +from fencing_snmp import FencingSnmp + +### CONSTANTS ### +# oid defining fence device +OID_SYS_OBJECT_ID = '.1.3.6.1.2.1.1.2.0' + +### GLOBAL VARIABLES ### +# Device - see ApcRPDU, ApcMSP, ApcMS, TripplitePDU, TrippliteLXPDU +device = None + +# Port ID +port_id = None +# Switch ID +switch_id = None + +# Classes describing Device params +class TripplitePDU(object): + # Rack PDU + status_oid = '.1.3.6.1.4.1.850.10.2.3.5.1.2.1.%d' + control_oid = '.1.3.6.1.4.1.850.10.2.3.5.1.4.1.%d' + outlet_table_oid = '.1.3.6.1.4.1.850.10.2.3.5.1.5' + ident_str = "Tripplite" + state_on = 2 + state_off = 1 + turn_on = 2 + turn_off = 1 + has_switches = False + +class TrippliteLXPDU(object): + # WEBCARDLX-based PDU + status_oid = '.1.3.6.1.4.1.850.1.1.3.2.3.3.1.1.4.1.%d' + control_oid = '.1.3.6.1.4.1.850.1.1.3.2.3.3.1.1.6.1.%d' + outlet_table_oid = '.1.3.6.1.4.1.850.1.1.3.2.3.3.1.1.2.1' + ident_str = "Tripplite LX" + state_on = 2 + state_off = 1 + turn_on = 2 + turn_off = 1 + has_switches = False + +class ApcRPDU(object): + # Rack PDU + status_oid = '.1.3.6.1.4.1.318.1.1.12.3.5.1.1.4.%d' + control_oid = '.1.3.6.1.4.1.318.1.1.12.3.3.1.1.4.%d' + outlet_table_oid = '.1.3.6.1.4.1.318.1.1.12.3.5.1.1.2' + ident_str = "APC rPDU" + state_on = 1 + state_off = 2 + turn_on = 1 + turn_off = 2 + has_switches = False + +class ApcMSP(object): + # Master Switch+ + status_oid = '.1.3.6.1.4.1.318.1.1.6.7.1.1.5.%d.1.%d' + control_oid = '.1.3.6.1.4.1.318.1.1.6.5.1.1.5.%d.1.%d' + outlet_table_oid = '.1.3.6.1.4.1.318.1.1.6.7.1.1.4' + ident_str = "APC Master Switch+" + state_on = 1 + state_off = 2 + turn_on = 1 + turn_off = 3 + has_switches = True + +class ApcMS(object): + # Master Switch - seems oldest, but supported on every APC PDU + status_oid = '.1.3.6.1.4.1.318.1.1.4.4.2.1.3.%d' + control_oid = '.1.3.6.1.4.1.318.1.1.4.4.2.1.3.%d' + outlet_table_oid = '.1.3.6.1.4.1.318.1.1.4.4.2.1.4' + ident_str = "APC Master Switch (fallback)" + state_on = 1 + state_off = 2 + turn_on = 1 + turn_off = 2 + has_switches = False + +class ApcMS6(object): + # Master Switch with 6.x firmware + status_oid = '.1.3.6.1.4.1.318.1.1.4.4.2.1.3.%d' + control_oid = '.1.3.6.1.4.1.318.1.1.12.3.3.1.1.4.%d' + outlet_table_oid = '1.3.6.1.4.1.318.1.1.4.4.2.1.4' + ident_str = "APC Master Switch with firmware v6.x" + state_on = 1 + state_off = 2 + turn_on = 1 + turn_off = 2 + has_switches = False + +### FUNCTIONS ### +def apc_set_device(conn): + global device + + agents_dir = {'.1.3.6.1.4.1.318.1.3.4.5':ApcRPDU, + '.1.3.6.1.4.1.318.1.3.4.4':ApcMSP, + '.1.3.6.1.4.1.850.1':TripplitePDU, + '.1.3.6.1.4.1.850.1.1.1':TrippliteLXPDU, + '.1.3.6.1.4.1.318.1.3.4.6':ApcMS6, + None:ApcMS} + + # First resolve type of APC + apc_type = conn.walk(OID_SYS_OBJECT_ID) + + if not ((len(apc_type) == 1) and (apc_type[0][1] in agents_dir)): + apc_type = [[None, None]] + + device = agents_dir[apc_type[0][1]] + + logging.debug("Trying %s"%(device.ident_str)) + +def apc_resolv_port_id(conn, options): + global port_id, switch_id + + if device == None: + apc_set_device(conn) + + # Now we resolv port_id/switch_id + if (options["--plug"].isdigit()) and ((not device.has_switches) or (options["--switch"].isdigit())): + port_id = int(options["--plug"]) + + if device.has_switches: + switch_id = int(options["--switch"]) + else: + table = conn.walk(device.outlet_table_oid, 30) + + for x in table: + if x[1].strip('"') == options["--plug"]: + t = x[0].split('.') + if device.has_switches: + port_id = int(t[len(t)-1]) + switch_id = int(t[len(t)-3]) + else: + port_id = int(t[len(t)-1]) + + if port_id == None: + fail_usage("Can't find port with name %s!"%(options["--plug"])) + +def get_power_status(conn, options): + if port_id == None: + apc_resolv_port_id(conn, options) + + oid = ((device.has_switches) and device.status_oid%(switch_id, port_id) or device.status_oid%(port_id)) + + (oid, status) = conn.get(oid) + return status == str(device.state_on) and "on" or "off" + +def set_power_status(conn, options): + if port_id == None: + apc_resolv_port_id(conn, options) + + oid = ((device.has_switches) and device.control_oid%(switch_id, port_id) or device.control_oid%(port_id)) + + conn.set(oid, (options["--action"] == "on" and device.turn_on or device.turn_off)) + + +def get_outlets_status(conn, options): + result = {} + + if device == None: + apc_set_device(conn) + + res_ports = conn.walk(device.outlet_table_oid, 30) + + for x in res_ports: + t = x[0].split('.') + + port_num = ((device.has_switches) and "%s:%s"%(t[len(t)-3], t[len(t)-1]) or "%s"%(t[len(t)-1])) + + port_name = x[1].strip('"') + port_status = "" + result[port_num] = (port_name, port_status) + + return result + +# Main agent method +def main(): + device_opt = ["ipaddr", "login", "passwd", "no_login", "no_password", \ + "port", "snmp_version", "snmp"] + + atexit.register(atexit_handler) + + all_opt["snmp_version"]["default"] = "1" + all_opt["community"]["default"] = "private" + + options = check_input(device_opt, process_input(device_opt)) + + ## Support for -n [switch]:[plug] notation that was used before + if ("--plug" in options) and (-1 != options["--plug"].find(":")): + (switch, plug) = options["--plug"].split(":", 1) + if switch.isdigit() and plug.isdigit(): + options["--switch"] = switch + options["--plug"] = plug + + if "--switch" not in options: + options["--switch"] = "1" + + docs = {} + docs["shortdesc"] = "Fence agent for APC, Tripplite PDU over SNMP" + docs["longdesc"] = "fence_apc_snmp is an I/O Fencing agent \ +which can be used with the APC network power switch or Tripplite PDU devices.\ +It logs into a device via SNMP and reboots a specified outlet. It supports \ +SNMP v1, v2c, v3 with all combinations of authenticity/privacy settings." + docs["vendorurl"] = "http://www.apc.com" + docs["symlink"] = [("fence_tripplite_snmp", "Fence agent for Tripplife over SNMP")] + show_docs(options, docs) + + # Operate the fencing device + result = fence_action(FencingSnmp(options), options, set_power_status, get_power_status, get_outlets_status) + + sys.exit(result) +if __name__ == "__main__": + main() diff --git a/agents/apc_snmp/powernet369.mib b/agents/apc_snmp/powernet369.mib new file mode 100644 index 0000000..ab948f8 --- /dev/null +++ b/agents/apc_snmp/powernet369.mib @@ -0,0 +1,31109 @@ +-- ************************************************************************* +-- AMERICAN POWER CONVERSION PowerNet-MIB +-- ************************************************************************* +-- Copyright (c) 2005 American Power Conversion, Inc. +-- PowerNet is a Trademark of American Power Conversion Corp. +-- +-- Title: APC TOP LEVEL PowerNet MIB +-- +-- Version : 3.6.9 +-- +-- Generated by script: tomib.awk +-- +-- Input File: powernetPS.mib +-- +-- Created: Wednesday, January, 26, 2005 +-- +-- Revision History: +-- ************************************************************************* + +-- - v3.2.0 Added functionality for MasterSwitch Plus +-- - v3.3.0 Added functionality for MX28B (dcDM3) and 3-phase UPS +-- - v3.3.2 New traps for Symmetra PX UPS +-- 07/15/01 - v3.4.0 Added transfer switch +-- - v3.4.3 Added functionality for External and Integrated Environmental Monitor +-- 06/14/02 - v3.4.4 Added dcmim2(Siemens) branch, Battery Manager(Reading) traps, and +-- Psx Traps for PDU and RM-PDU and Netlock branch/traps +-- 06/18/02 - v3.5.0a Sync Control Group support +-- 08/06/02 - v3.5.0a Environmental Management System branch/traps +-- 09/16/02 - v3.5.0b Fixed some odds/ends ... going to RM-PDU for MS additions +-- 09/25/02 - v3.5.0c MS3 additions +-- 11/05/02 - v3.5.0e More Environmental Management System/A-Link devices(ARU) +-- 11/22/02 - v3.5.0g Added General APC device status OID +-- 11/27/02 - v3.5.0h Wrapped up MS3 ((Controlled or Metered) Rack PDU) changes +-- 12/26/02 - v3.5.1a Changed MS3 name again, Controlled to Switched Rack PDU +-- 01/07/03 - v3.6.0a Added OIDs/Traps for UPS Switchable Outlet Groups. +-- 01/09/03 - Adding the General APC device discovery OIDs (hidden) +-- 01/28/03 - v3.6.0c Made some small trap pair fixes for Switched Rack PDU (MS3) +-- 02/13/03 - v3.6.0d Mods from the review and some EMS fixes. +-- Added OID for the new 20kVA Symmetra 3 Phase type. +-- Added OIDs to upsAdvConfig for Symmetra type UPSs. +-- Added upsDiagnostics branch OID for Symmetra module information. +-- 04/05/03 - v3.6.2 Added OID for the new Smart-UPS 7500 and 10000 types. +-- 06/04/03 - v3.6.3 Added OIDs/Traps for AirFM. +-- 06/24/03 - v3.6.4 Moved some AirFM temps and humidities from system level to module level. +-- 10/24/03 - v3.6.4a Added OIDs/Traps for xPDU. +-- 10/27/03 - v3.6.4f Added AirPA OIDs. +-- 11/03/03 - v3.6.4g Merge of 3.6.4e and 3.6.4f +-- 11/07/03 - v3.6.4h Additional review corrections +-- 12/01/03 - v3.6.5a Added group OIDs for Air FM. Added C & F OIDs for Air PA setpoint. +-- 12/19/03 - v3.6.5b Review corrections. +-- 02/23/04 - v3.6.5c Added Modbus to experimental and multiple CB(bank) rPDU support +-- 05/05/04 - v3.6.6 Adding EMS status OID and trap for H/W issues, redefined duplicate +-- trap #228 (to ARU Device config change) and minor clean-up +-- 05/12/04 - v3.6.7a Added Air FM alarm status OIDs. +-- 06/03/04 - v3.6.7b Added UPS Config for Simple Signal Shutdowns and Number of External +-- batteries. Added Mute option to the UPS Config Audible Alarm. +-- 07/12/04 - v3.6.7d Removed Air FM alarm status OIDs due to delay in release. +-- 07/14/04 - v3.6.7d Added a detailed description to the UPSAdvConfigAlarm OID +-- 07/14/04 - v3.6.7e Added Custom Event traps +-- 08/04/04 - v3.6.7 Tag for final builds, see v3.6.7 beta build notes for changes +-- 08/26/04 - v3.6.8a Added new traps for UPS internal over temperature fault and cleared. +-- 09/01/04 - v3.6.8b Adding new thresholds for EMS probe config & status +-- 09/08/04 - v3.6.8c Corrections from MIB review. +-- 09/30/04 - v3.6.8d Added new traps for AIS ^F Message events. +-- 10/21/04 - v3.6.8e EMS. Added missing traps and new Rate functionality. +-- 10/22/04 - v3.6.8f Added resetNetworkLeaveModeAndRestart option to the mcontrolRestartAgent OID. +-- 10/28/04 - v3.6.8g Updated EMS sections from mib committee review. +-- 11/22/04 - v3.6.8 Tag for final build. +-- 12/02/04 - v3.6.9a Added OIDs and traps for BMS-HVA. +-- 12/20/04 - v3.6.9c corrections to xPDU. +-- 12/20/04 - v3.6.9c added OIDs and traps for xATS. +-- 01/03/05 - v3.6.9d removed traps for xATS. +-- 01/03/05 - v3.6.9e correction to xATS entries, that removed underscores (mib browser incompatibility) +-- 01/07/05 - v3.6.9f +-- 01/14/05 - v3.6.9g add xPDU OIDs and traps and some corrections. +-- 01/14/05 - v3.6.9g modifications to xATS OIDs and traps. + +-- ************************************************************************* +-- ************************************************************************* +-- PowerNet-MIB { iso org(3) dod(6) internet(1) private(4) +-- enterprises(1) apc(318) } + +PowerNet-MIB DEFINITIONS ::= BEGIN + +IMPORTS + enterprises, IpAddress, Gauge, TimeTicks FROM RFC1155-SMI + DisplayString FROM RFC1213-MIB + OBJECT-TYPE FROM RFC-1212 + TRAP-TYPE FROM RFC-1215; + +apc OBJECT IDENTIFIER ::= { enterprises 318 } + +products OBJECT IDENTIFIER ::= { apc 1 } +apcmgmt OBJECT IDENTIFIER ::= { apc 2 } + +hardware OBJECT IDENTIFIER ::= { products 1 } +software OBJECT IDENTIFIER ::= { products 2 } +system OBJECT IDENTIFIER ::= { products 3 } +experimental OBJECT IDENTIFIER ::= { products 4 } + +mconfig OBJECT IDENTIFIER ::= { apcmgmt 1 } +mcontrol OBJECT IDENTIFIER ::= { apcmgmt 2 } +mtrapargs OBJECT IDENTIFIER ::= { apcmgmt 3 } +mfiletransfer OBJECT IDENTIFIER ::= { apcmgmt 4 } + +mconfigClock OBJECT IDENTIFIER ::= { mconfig 6 } + +mfiletransferStatus OBJECT IDENTIFIER ::= { mfiletransfer 1 } +mfiletransferConfig OBJECT IDENTIFIER ::= { mfiletransfer 2 } +mfiletransferControl OBJECT IDENTIFIER ::= { mfiletransfer 3 } + +mfiletransferConfigSettings OBJECT IDENTIFIER ::= { mfiletransferConfig 1 } +mfiletransferConfigTFTP OBJECT IDENTIFIER ::= { mfiletransferConfig 2 } +mfiletransferConfigFTP OBJECT IDENTIFIER ::= { mfiletransferConfig 3 } + +ups OBJECT IDENTIFIER ::= { hardware 1 } +measureUps OBJECT IDENTIFIER ::= { hardware 2 } +miniSNMPadapter OBJECT IDENTIFIER ::= { hardware 3 } +masterswitch OBJECT IDENTIFIER ::= { hardware 4 } +masterswitchVM OBJECT IDENTIFIER ::= { hardware 5 } +masterswitchMSP OBJECT IDENTIFIER ::= { hardware 6 } +dcDM3 OBJECT IDENTIFIER ::= { hardware 7 } +automaticTransferSwitch OBJECT IDENTIFIER ::= { hardware 8 } +dc2 OBJECT IDENTIFIER ::= { hardware 9 } +environmentalMonitor OBJECT IDENTIFIER ::= { hardware 10 } +netlock OBJECT IDENTIFIER ::= { hardware 11 } +rPDU OBJECT IDENTIFIER ::= { hardware 12 } +airConditioners OBJECT IDENTIFIER ::= { hardware 13 } +rARU OBJECT IDENTIFIER ::= { hardware 14 } +xPDU OBJECT IDENTIFIER ::= { hardware 15 } +battMan OBJECT IDENTIFIER ::= { hardware 16 } +xATS OBJECT IDENTIFIER ::= { hardware 17 } +generator OBJECT IDENTIFIER ::= { hardware 18 } + +powerNetSubAgent OBJECT IDENTIFIER ::= { software 1 } + +powerNetSoftwareSystem OBJECT IDENTIFIER ::= { powerNetSubAgent 1 } +powerNetSoftwareConfig OBJECT IDENTIFIER ::= { powerNetSubAgent 2 } + +backUPS OBJECT IDENTIFIER ::= { system 1 } +smartUPS OBJECT IDENTIFIER ::= { system 2 } +matrixUPS OBJECT IDENTIFIER ::= { system 3 } +masterSwitch OBJECT IDENTIFIER ::= { system 4 } +symmetraUPS OBJECT IDENTIFIER ::= { system 5 } +dp100E OBJECT IDENTIFIER ::= { system 6 } +dp300E OBJECT IDENTIFIER ::= { system 7 } +monitors OBJECT IDENTIFIER ::= { system 8 } +redundantSwitch OBJECT IDENTIFIER ::= { system 9 } +dcPower OBJECT IDENTIFIER ::= { system 10 } +automaticXferSwitch OBJECT IDENTIFIER ::= { system 11 } +netLock OBJECT IDENTIFIER ::= { system 12 } +symmetra3PhaseUPS OBJECT IDENTIFIER ::= { system 13 } +networkAir OBJECT IDENTIFIER ::= { system 14 } +infraXurePDU OBJECT IDENTIFIER ::= { system 15 } +ais5000UPS OBJECT IDENTIFIER ::= { system 16 } +smartUPS3Phase OBJECT IDENTIFIER ::= { system 17 } +battManager OBJECT IDENTIFIER ::= { system 18 } +infraXureATS OBJECT IDENTIFIER ::= { system 19 } + +battManIdent OBJECT IDENTIFIER ::= { battMan 1 } +battManSystemCalib OBJECT IDENTIFIER ::= { battMan 2 } +battManUnitCalib OBJECT IDENTIFIER ::= { battMan 3 } +battManStringCalib OBJECT IDENTIFIER ::= { battMan 4 } +battManBatteryCalib OBJECT IDENTIFIER ::= { battMan 5 } +battManConfig OBJECT IDENTIFIER ::= { battMan 6 } +battManAlarm OBJECT IDENTIFIER ::= { battMan 7 } +battManSystemStatus OBJECT IDENTIFIER ::= { battMan 8 } +battManStringStatus OBJECT IDENTIFIER ::= { battMan 9 } +battManBatteryStatus OBJECT IDENTIFIER ::= { battMan 10 } +battManInputContactStatus OBJECT IDENTIFIER ::= { battMan 11 } +battManControl OBJECT IDENTIFIER ::= { battMan 12 } +battManTestResults OBJECT IDENTIFIER ::= { battMan 13 } + +xPDUIdent OBJECT IDENTIFIER ::= { xPDU 1 } +xPDUDevice OBJECT IDENTIFIER ::= { xPDU 2 } +xPDUACMonitoringPoint OBJECT IDENTIFIER ::= { xPDU 3 } +xPDUCircuitBreakers OBJECT IDENTIFIER ::= { xPDU 4 } +xPDUInputContacts OBJECT IDENTIFIER ::= { xPDU 5 } +xPDUOutputRelays OBJECT IDENTIFIER ::= { xPDU 6 } +xPDUMiscGroup OBJECT IDENTIFIER ::= { xPDU 7 } + +xPDUMainInput OBJECT IDENTIFIER ::= { xPDUACMonitoringPoint 1 } +xPDUBypassInput OBJECT IDENTIFIER ::= { xPDUACMonitoringPoint 2 } +xPDUUPSInput OBJECT IDENTIFIER ::= { xPDUACMonitoringPoint 3 } +xPDUSystemOutput OBJECT IDENTIFIER ::= { xPDUACMonitoringPoint 4 } +xPDUGroundMonitorPoint OBJECT IDENTIFIER ::= { xPDUACMonitoringPoint 5 } + +xPDUSystemBreakers OBJECT IDENTIFIER ::= { xPDUCircuitBreakers 1 } +xPDUBranchBreakers OBJECT IDENTIFIER ::= { xPDUCircuitBreakers 2 } + +xATSIdent OBJECT IDENTIFIER ::= { xATS 1 } +xATSDevice OBJECT IDENTIFIER ::= { xATS 2 } +xATSSwitch OBJECT IDENTIFIER ::= { xATS 3 } +xATSACMonitoringPoint OBJECT IDENTIFIER ::= { xATS 4 } +xATSTesting OBJECT IDENTIFIER ::= { xATS 5 } +xATSInputContacts OBJECT IDENTIFIER ::= { xATS 6 } +xATSOutputRelays OBJECT IDENTIFIER ::= { xATS 7 } +xATSMisc OBJECT IDENTIFIER ::= { xATS 8 } + +xATSSwitchStatus OBJECT IDENTIFIER ::= { xATSSwitch 1 } +xATSSwitchSettings OBJECT IDENTIFIER ::= { xATSSwitch 2 } +xATSSwitchTimers OBJECT IDENTIFIER ::= { xATSSwitch 3 } +xATSSwitchBlockMap OBJECT IDENTIFIER ::= { xATSSwitch 4 } +xATSSwitchStatistics OBJECT IDENTIFIER ::= { xATSSwitch 5 } + +xATSSource1 OBJECT IDENTIFIER ::= { xATSACMonitoringPoint 1 } +xATSSource2 OBJECT IDENTIFIER ::= { xATSACMonitoringPoint 2 } +xATSSystemOutput OBJECT IDENTIFIER ::= { xATSACMonitoringPoint 3 } + +xATSTestingStatus OBJECT IDENTIFIER ::= { xATSTesting 1 } +xATSTestingResults OBJECT IDENTIFIER ::= { xATSTesting 2 } +xATSTestingSchedule OBJECT IDENTIFIER ::= { xATSTesting 3 } +xATSTestingSimulatePowerFail OBJECT IDENTIFIER ::= { xATSTesting 4 } + +xATSGenerator OBJECT IDENTIFIER ::= { generator 1 } + +xATSGeneratorIdent OBJECT IDENTIFIER ::= { xATSGenerator 1 } +xATSGeneratorStatus OBJECT IDENTIFIER ::= { xATSGenerator 2 } +xATSGeneratorAdvStatus OBJECT IDENTIFIER ::= { xATSGenerator 3 } +xATSGeneratorOutput OBJECT IDENTIFIER ::= { xATSGenerator 4 } +xATSGeneratorSettings OBJECT IDENTIFIER ::= { xATSGenerator 5 } +xATSGeneratorService OBJECT IDENTIFIER ::= { xATSGenerator 6 } +xATSGeneratorFuelSystem OBJECT IDENTIFIER ::= { xATSGenerator 7 } + + +smartUPS250 OBJECT IDENTIFIER ::= { smartUPS 1 } +smartUPS400 OBJECT IDENTIFIER ::= { smartUPS 2 } +smartUPS600 OBJECT IDENTIFIER ::= { smartUPS 3 } +smartUPS900 OBJECT IDENTIFIER ::= { smartUPS 4 } +smartUPS1250 OBJECT IDENTIFIER ::= { smartUPS 5 } +smartUPS2000 OBJECT IDENTIFIER ::= { smartUPS 6 } + +smartUPS450 OBJECT IDENTIFIER ::= { smartUPS 7 } +smartUPS700 OBJECT IDENTIFIER ::= { smartUPS 8 } +smartUPS1000 OBJECT IDENTIFIER ::= { smartUPS 9 } +smartUPS1400 OBJECT IDENTIFIER ::= { smartUPS 10 } +smartUPS2200 OBJECT IDENTIFIER ::= { smartUPS 11 } +smartUPS3000 OBJECT IDENTIFIER ::= { smartUPS 12 } +smartUPS5000 OBJECT IDENTIFIER ::= { smartUPS 13 } +smartUPS7500 OBJECT IDENTIFIER ::= { smartUPS 14 } +smartUPS10000 OBJECT IDENTIFIER ::= { smartUPS 15 } +smartUPS1500 OBJECT IDENTIFIER ::= { smartUPS 16 } + +matrixUPS3000 OBJECT IDENTIFIER ::= { matrixUPS 1 } +matrixUPS5000 OBJECT IDENTIFIER ::= { matrixUPS 2 } + +masterSwitchV1 OBJECT IDENTIFIER ::= { masterSwitch 1} +masterSwitchV2 OBJECT IDENTIFIER ::= { masterSwitch 2} +masterSwitchVM OBJECT IDENTIFIER ::= { masterSwitch 3} +masterSwitchMSP OBJECT IDENTIFIER ::= { masterSwitch 4} +masterSwitchrPDU OBJECT IDENTIFIER ::= { masterSwitch 5} + +symmetraUPS4kVA OBJECT IDENTIFIER ::= { symmetraUPS 1 } +symmetraUPS8kVA OBJECT IDENTIFIER ::= { symmetraUPS 2 } +symmetraUPS12kVA OBJECT IDENTIFIER ::= { symmetraUPS 3 } +symmetraUPS16kVA OBJECT IDENTIFIER ::= { symmetraUPS 4 } + +environmental OBJECT IDENTIFIER ::= { monitors 1 } +environmentalMgtSystem OBJECT IDENTIFIER ::= { monitors 2 } +emu2 OBJECT IDENTIFIER ::= { monitors 3 } + +dm3 OBJECT IDENTIFIER ::= { dcPower 1 } +dcmim2 OBJECT IDENTIFIER ::= { dcPower 2 } + +symmetra3PhaseUPS40kVA OBJECT IDENTIFIER ::= { symmetra3PhaseUPS 1 } +symmetra3PhaseUPS60kVA OBJECT IDENTIFIER ::= { symmetra3PhaseUPS 2 } +symmetra3PhaseUPS80kVA OBJECT IDENTIFIER ::= { symmetra3PhaseUPS 3 } +symmetra3PhaseUPS20kVA OBJECT IDENTIFIER ::= { symmetra3PhaseUPS 4 } + +airFMSeries OBJECT IDENTIFIER ::= { networkAir 1 } +rackAirRemovalUnit OBJECT IDENTIFIER ::= { networkAir 2 } +airPASeries OBJECT IDENTIFIER ::= { networkAir 3 } + +ais5000UPS10kVA OBJECT IDENTIFIER ::= { ais5000UPS 1 } +ais5000UPS20kVA OBJECT IDENTIFIER ::= { ais5000UPS 2 } +ais5000UPS30kVA OBJECT IDENTIFIER ::= { ais5000UPS 3 } +ais5000UPS40kVA OBJECT IDENTIFIER ::= { ais5000UPS 4 } +ais5000UPS60kVA OBJECT IDENTIFIER ::= { ais5000UPS 5 } +ais5000UPS80kVA OBJECT IDENTIFIER ::= { ais5000UPS 6 } +ais5000UPS100kVA OBJECT IDENTIFIER ::= { ais5000UPS 7 } + +smartUPS3Phase10kVA OBJECT IDENTIFIER ::= { smartUPS3Phase 1 } +smartUPS3Phase15kVA OBJECT IDENTIFIER ::= { smartUPS3Phase 2 } +smartUPS3Phase20kVA OBJECT IDENTIFIER ::= { smartUPS3Phase 3 } +smartUPS3Phase30kVA OBJECT IDENTIFIER ::= { smartUPS3Phase 4 } +smartUPS3Phase40kVA OBJECT IDENTIFIER ::= { smartUPS3Phase 5 } + +upsIdent OBJECT IDENTIFIER ::= { ups 1 } +upsBattery OBJECT IDENTIFIER ::= { ups 2 } +upsInput OBJECT IDENTIFIER ::= { ups 3 } +upsOutput OBJECT IDENTIFIER ::= { ups 4 } +upsConfig OBJECT IDENTIFIER ::= { ups 5 } +upsControl OBJECT IDENTIFIER ::= { ups 6 } +upsTest OBJECT IDENTIFIER ::= { ups 7 } +upsComm OBJECT IDENTIFIER ::= { ups 8 } +upsPhase OBJECT IDENTIFIER ::= { ups 9 } +upsSyncCtrlGroup OBJECT IDENTIFIER ::= { ups 10 } +upsState OBJECT IDENTIFIER ::= { ups 11 } +upsOutletGroups OBJECT IDENTIFIER ::= { ups 12 } +upsDiagnostics OBJECT IDENTIFIER ::= { ups 13 } + +upsBasicIdent OBJECT IDENTIFIER ::= { upsIdent 1 } +upsAdvIdent OBJECT IDENTIFIER ::= { upsIdent 2 } + +upsBasicBattery OBJECT IDENTIFIER ::= { upsBattery 1 } +upsAdvBattery OBJECT IDENTIFIER ::= { upsBattery 2 } + +upsBasicInput OBJECT IDENTIFIER ::= { upsInput 1 } +upsAdvInput OBJECT IDENTIFIER ::= { upsInput 2 } + +upsBasicOutput OBJECT IDENTIFIER ::= { upsOutput 1 } +upsAdvOutput OBJECT IDENTIFIER ::= { upsOutput 2 } + +upsBasicConfig OBJECT IDENTIFIER ::= { upsConfig 1 } +upsAdvConfig OBJECT IDENTIFIER ::= { upsConfig 2 } + +upsBasicControl OBJECT IDENTIFIER ::= { upsControl 1 } +upsAdvControl OBJECT IDENTIFIER ::= { upsControl 2 } + +upsBasicTest OBJECT IDENTIFIER ::= { upsTest 1 } +upsAdvTest OBJECT IDENTIFIER ::= { upsTest 2 } + +upsPhaseResetValues OBJECT IDENTIFIER ::= { upsPhase 1 } +upsPhaseInput OBJECT IDENTIFIER ::= { upsPhase 2 } +upsPhaseOutput OBJECT IDENTIFIER ::= { upsPhase 3 } + +upsSyncCtrlGroupConfig OBJECT IDENTIFIER ::= { upsSyncCtrlGroup 1 } +upsSyncCtrlGroupStatus OBJECT IDENTIFIER ::= { upsSyncCtrlGroup 2 } + +upsBasicState OBJECT IDENTIFIER ::= { upsState 1 } +upsAdvState OBJECT IDENTIFIER ::= { upsState 2 } + +upsOutletGroupStatus OBJECT IDENTIFIER ::= { upsOutletGroups 1 } +upsOutletGroupConfig OBJECT IDENTIFIER ::= { upsOutletGroups 2 } +upsOutletGroupControl OBJECT IDENTIFIER ::= { upsOutletGroups 3 } + +upsDiagnosticIM OBJECT IDENTIFIER ::= { upsDiagnostics 1 } +upsDiagnosticPowerModules OBJECT IDENTIFIER ::= { upsDiagnostics 2 } +upsDiagnosticBatteries OBJECT IDENTIFIER ::= { upsDiagnostics 3 } +upsDiagnosticSubsystem OBJECT IDENTIFIER ::= { upsDiagnostics 4 } +upsDiagnosticExternalDevices OBJECT IDENTIFIER ::= { upsDiagnostics 5 } +upsDiagnosticComBus OBJECT IDENTIFIER ::= { upsDiagnostics 6 } + +upsDiagSwitchGear OBJECT IDENTIFIER ::= { upsDiagnosticExternalDevices 1 } +upsDiagMCCBBox OBJECT IDENTIFIER ::= { upsDiagnosticExternalDevices 2 } +upsDiagTransformer OBJECT IDENTIFIER ::= { upsDiagnosticExternalDevices 3 } + +mUpsEnviron OBJECT IDENTIFIER ::= { measureUps 1 } +mUpsContact OBJECT IDENTIFIER ::= { measureUps 2 } + +serialPort OBJECT IDENTIFIER ::= { miniSNMPadapter 1} + +serialPort1 OBJECT IDENTIFIER ::= { serialPort 1} +serialPort2 OBJECT IDENTIFIER ::= { serialPort 2} + +serialPort2Config OBJECT IDENTIFIER ::= { serialPort2 1} +serialPort2Control OBJECT IDENTIFIER ::= { serialPort2 2} + +sPDUIdent OBJECT IDENTIFIER ::= { masterswitch 1 } +sPDUMasterControl OBJECT IDENTIFIER ::= { masterswitch 2 } +sPDUMasterConfig OBJECT IDENTIFIER ::= { masterswitch 3 } +sPDUOutletControl OBJECT IDENTIFIER ::= { masterswitch 4 } +sPDUOutletConfig OBJECT IDENTIFIER ::= { masterswitch 5 } + +sPDUIdentVM OBJECT IDENTIFIER ::= { masterswitchVM 1 } +sPDUMasterControlVM OBJECT IDENTIFIER ::= { masterswitchVM 2 } +sPDUMasterConfigVM OBJECT IDENTIFIER ::= { masterswitchVM 3 } +sPDUMasterStatusVM OBJECT IDENTIFIER ::= { masterswitchVM 4 } +sPDUOutletControlVM OBJECT IDENTIFIER ::= { masterswitchVM 5 } +sPDUOutletConfigVM OBJECT IDENTIFIER ::= { masterswitchVM 6 } +sPDUOutletStatusVM OBJECT IDENTIFIER ::= { masterswitchVM 7 } + +sPDUIdentMSP OBJECT IDENTIFIER ::= { masterswitchMSP 1 } +sPDUMasterControlMSP OBJECT IDENTIFIER ::= { masterswitchMSP 2 } +sPDUMasterConfigMSP OBJECT IDENTIFIER ::= { masterswitchMSP 3 } +sPDUMasterStatusMSP OBJECT IDENTIFIER ::= { masterswitchMSP 4 } +sPDUOutletControlMSP OBJECT IDENTIFIER ::= { masterswitchMSP 5 } +sPDUOutletConfigMSP OBJECT IDENTIFIER ::= { masterswitchMSP 6 } +sPDUOutletStatusMSP OBJECT IDENTIFIER ::= { masterswitchMSP 7 } + +sPDUOutletConfigMSPall OBJECT IDENTIFIER ::= { sPDUOutletConfigMSP 1 } +sPDUOutletConfigMSPgs OBJECT IDENTIFIER ::= { sPDUOutletConfigMSP 2 } +sPDUOutletConfigMSPannun OBJECT IDENTIFIER ::= { sPDUOutletConfigMSP 3 } +sPDUOutletConfigMSPmups OBJECT IDENTIFIER ::= { sPDUOutletConfigMSP 4 } + +rPDUIdent OBJECT IDENTIFIER ::= { rPDU 1 } +rPDULoad OBJECT IDENTIFIER ::= { rPDU 2 } +rPDUOutlet OBJECT IDENTIFIER ::= { rPDU 3 } +rPDUPowerSupply OBJECT IDENTIFIER ::= { rPDU 4 } + +rPDULoadDevice OBJECT IDENTIFIER ::= { rPDULoad 1 } +rPDULoadPhaseConfig OBJECT IDENTIFIER ::= { rPDULoad 2 } +rPDULoadStatus OBJECT IDENTIFIER ::= { rPDULoad 3 } +rPDULoadBankConfig OBJECT IDENTIFIER ::= { rPDULoad 4 } + +rPDUOutletDevice OBJECT IDENTIFIER ::= { rPDUOutlet 1 } +rPDUOutletPhase OBJECT IDENTIFIER ::= { rPDUOutlet 2 } +rPDUOutletControl OBJECT IDENTIFIER ::= { rPDUOutlet 3 } +rPDUOutletConfig OBJECT IDENTIFIER ::= { rPDUOutlet 4 } +rPDUOutletStatus OBJECT IDENTIFIER ::= { rPDUOutlet 5 } +rPDUOutletBank OBJECT IDENTIFIER ::= { rPDUOutlet 6 } + +rPDUPowerSupplyDevice OBJECT IDENTIFIER ::= { rPDUPowerSupply 1 } + +dm3Ident OBJECT IDENTIFIER ::= { dcDM3 1 } +dm3Config OBJECT IDENTIFIER ::= { dcDM3 2 } +dm3Status OBJECT IDENTIFIER ::= { dcDM3 3 } + +dm3IdentSystem OBJECT IDENTIFIER ::= { dm3Ident 1} + +dm3ConfigSystem OBJECT IDENTIFIER ::= { dm3Config 1 } +dm3ConfigLVD OBJECT IDENTIFIER ::= { dm3Config 2 } +dm3ConfigBattery OBJECT IDENTIFIER ::= { dm3Config 3 } +dm3ConfigPowerModules OBJECT IDENTIFIER ::= { dm3Config 4 } +dm3ConfigRelays OBJECT IDENTIFIER ::= { dm3Config 5 } +dm3ConfigDistribution OBJECT IDENTIFIER ::= { dm3Config 6 } + +dm3ConfigRectifier OBJECT IDENTIFIER ::= { dm3ConfigPowerModules 1 } +dm3ConfigConverter OBJECT IDENTIFIER ::= { dm3ConfigPowerModules 2 } + +dm3ConfigRectThresh OBJECT IDENTIFIER ::= { dm3ConfigRectifier 1 } +dm3ConfigRectAlarms OBJECT IDENTIFIER ::= { dm3ConfigRectifier 2 } + +dm3ConfigConvThresh OBJECT IDENTIFIER ::= { dm3ConfigConverter 1 } +dm3ConfigConvAlarms OBJECT IDENTIFIER ::= { dm3ConfigConverter 2 } + +dm3ConfigOutputRelays OBJECT IDENTIFIER ::= { dm3ConfigRelays 1 } +dm3ConfigInputRelays OBJECT IDENTIFIER ::= { dm3ConfigRelays 2 } + +dm3ConfigBreakers OBJECT IDENTIFIER ::= { dm3ConfigDistribution 1 } +dm3ConfigFuses OBJECT IDENTIFIER ::= { dm3ConfigDistribution 2 } + +dm3StatusSystem OBJECT IDENTIFIER ::= { dm3Status 1 } +dm3StatusAlarms OBJECT IDENTIFIER ::= { dm3Status 2 } +dm3StatusBattery OBJECT IDENTIFIER ::= { dm3Status 3 } +dm3StatusOEM OBJECT IDENTIFIER ::= { dm3Status 4 } +dm3StatusLVD OBJECT IDENTIFIER ::= { dm3Status 5 } +dm3StatusPowerModules OBJECT IDENTIFIER ::= { dm3Status 6 } +dm3StatusRelays OBJECT IDENTIFIER ::= { dm3Status 7 } +dm3StatusDistribution OBJECT IDENTIFIER ::= { dm3Status 8 } + +dm3StatusRectifier OBJECT IDENTIFIER ::= { dm3StatusPowerModules 1 } +dm3StatusConverter OBJECT IDENTIFIER ::= { dm3StatusPowerModules 2 } + +dm3StatusOutputRelays OBJECT IDENTIFIER ::= { dm3StatusRelays 1 } +dm3StatusInputRelays OBJECT IDENTIFIER ::= { dm3StatusRelays 2 } + +dm3StatusBreakers OBJECT IDENTIFIER ::= { dm3StatusDistribution 1 } +dm3StatusFuses OBJECT IDENTIFIER ::= { dm3StatusDistribution 2 } + +atsIdent OBJECT IDENTIFIER ::= { automaticTransferSwitch 1 } +atsCalibration OBJECT IDENTIFIER ::= { automaticTransferSwitch 2 } +atsControl OBJECT IDENTIFIER ::= { automaticTransferSwitch 3 } +atsConfig OBJECT IDENTIFIER ::= { automaticTransferSwitch 4 } +atsStatus OBJECT IDENTIFIER ::= { automaticTransferSwitch 5 } + +atsCalibrationInput OBJECT IDENTIFIER ::= { atsCalibration 1 } +atsCalibrationPowerSupply OBJECT IDENTIFIER ::= { atsCalibration 2 } +atsCalibrationOutput OBJECT IDENTIFIER ::= { atsCalibration 3 } + +atsStatusDeviceStatus OBJECT IDENTIFIER ::= { atsStatus 1 } +atsStatusResetValues OBJECT IDENTIFIER ::= { atsStatus 2 } +atsStatusInput OBJECT IDENTIFIER ::= { atsStatus 3 } +atsStatusOutput OBJECT IDENTIFIER ::= { atsStatus 4 } + +dcmim2Ident OBJECT IDENTIFIER ::= { dc2 1 } +dcmim2Control OBJECT IDENTIFIER ::= { dc2 2 } +dcmim2Config OBJECT IDENTIFIER ::= { dc2 3 } +dcmim2Status OBJECT IDENTIFIER ::= { dc2 4 } + +dcmim2IdentSystem OBJECT IDENTIFIER ::= { dcmim2Ident 1 } + +dcmim2ControlSystem OBJECT IDENTIFIER ::= { dcmim2Control 1 } + +dcmim2ConfigSystem OBJECT IDENTIFIER ::= { dcmim2Config 1 } +dcmim2ConfigBattery OBJECT IDENTIFIER ::= { dcmim2Config 2 } +dcmim2ConfigLVD OBJECT IDENTIFIER ::= { dcmim2Config 3 } + +dcmim2StatusSystem OBJECT IDENTIFIER ::= { dcmim2Status 1 } +dcmim2StatusRectifier OBJECT IDENTIFIER ::= { dcmim2Status 2 } +dcmim2StatusBattery OBJECT IDENTIFIER ::= { dcmim2Status 3 } +dcmim2StatusLVD OBJECT IDENTIFIER ::= { dcmim2Status 4 } +dcmim2StatusAlarms OBJECT IDENTIFIER ::= { dcmim2Status 5 } + +external OBJECT IDENTIFIER ::= { environmentalMonitor 1 } +integrated OBJECT IDENTIFIER ::= { environmentalMonitor 2 } +envMgtSystem OBJECT IDENTIFIER ::= { environmentalMonitor 3 } + +emIdent OBJECT IDENTIFIER ::= { external 1 } +emConfig OBJECT IDENTIFIER ::= { external 2 } +emStatus OBJECT IDENTIFIER ::= { external 3 } + +iemIdent OBJECT IDENTIFIER ::= { integrated 1 } +iemConfig OBJECT IDENTIFIER ::= { integrated 2 } +iemStatus OBJECT IDENTIFIER ::= { integrated 3 } + +emsIdent OBJECT IDENTIFIER ::= { envMgtSystem 1 } + +emsOutputRelayControl OBJECT IDENTIFIER ::= { envMgtSystem 2 } +emsOutletControl OBJECT IDENTIFIER ::= { envMgtSystem 3 } +emsSensorControl OBJECT IDENTIFIER ::= { envMgtSystem 4 } +emsAlarmDeviceControl OBJECT IDENTIFIER ::= { envMgtSystem 5 } + +emsConfig OBJECT IDENTIFIER ::= { envMgtSystem 6 } +emsProbeConfig OBJECT IDENTIFIER ::= { envMgtSystem 7 } +emsInputContactConfig OBJECT IDENTIFIER ::= { envMgtSystem 8 } +emsOutputRelayConfig OBJECT IDENTIFIER ::= { envMgtSystem 9 } +emsOutletConfig OBJECT IDENTIFIER ::= { envMgtSystem 10 } +emsSensorConfig OBJECT IDENTIFIER ::= { envMgtSystem 11 } + +emsStatus OBJECT IDENTIFIER ::= { envMgtSystem 12 } +emsProbeStatus OBJECT IDENTIFIER ::= { envMgtSystem 13 } +emsInputContactStatus OBJECT IDENTIFIER ::= { envMgtSystem 14 } +emsOutputRelayStatus OBJECT IDENTIFIER ::= { envMgtSystem 15 } +emsOutletStatus OBJECT IDENTIFIER ::= { envMgtSystem 16 } +emsAlarmDeviceStatus OBJECT IDENTIFIER ::= { envMgtSystem 17 } +emsSensorStatus OBJECT IDENTIFIER ::= { envMgtSystem 18 } + +nlIdent OBJECT IDENTIFIER ::= { netlock 1 } +nlStatus OBJECT IDENTIFIER ::= { netlock 2 } + +airFM OBJECT IDENTIFIER ::= { airConditioners 1 } +airFMIdent OBJECT IDENTIFIER ::= { airFM 1 } +airFMStatus OBJECT IDENTIFIER ::= { airFM 2 } +airFMGroup OBJECT IDENTIFIER ::= { airFM 3 } + +airPA OBJECT IDENTIFIER ::= { airConditioners 2 } +airPAIdent OBJECT IDENTIFIER ::= { airPA 1 } +airPAStatus OBJECT IDENTIFIER ::= { airPA 2 } + +rARUIdent OBJECT IDENTIFIER ::= { rARU 1 } +rARUConfig OBJECT IDENTIFIER ::= { rARU 2 } +rARUStatus OBJECT IDENTIFIER ::= { rARU 3 } + + +-- object types + +-- the products group +-- the experimental group + + + +-- the apcmgmt group +-- the mconfig group + +mconfigNumTrapReceivers OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of managers to send traps to." + ::= { mconfig 1 } + +mconfigTrapReceiverTable OBJECT-TYPE + SYNTAX SEQUENCE OF MconfigTrapReceiverEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of managers to send traps to. The number of + entries is given by the value of mconfigNumTrapReceivers. + Maximum number of Trap Receivers is four." + ::= { mconfig 2 } + +mconfigTrapReceiverEntry OBJECT-TYPE + SYNTAX MconfigTrapReceiverEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The managers to send traps to." + INDEX { trapIndex} + ::= { mconfigTrapReceiverTable 1 } + +MconfigTrapReceiverEntry ::= + SEQUENCE { + trapIndex + INTEGER, + receiverAddr + IpAddress, + communityString + DisplayString, + severity + INTEGER, + acceptThisReceiver + INTEGER, + receiveTrapType + INTEGER + } + +trapIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to a trap receiver entry." + ::= { mconfigTrapReceiverEntry 1 } + +receiverAddr OBJECT-TYPE + SYNTAX IpAddress + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The IP address of the manager to send a trap to." + ::= { mconfigTrapReceiverEntry 2 } + +communityString OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The community name to use in the trap when + sent to the manager." + ::= { mconfigTrapReceiverEntry 3 } + +severity OBJECT-TYPE + SYNTAX INTEGER { + information(1), + warning(2), + severe(3) + } + ACCESS read-only + STATUS obsolete + DESCRIPTION + "The severity threshold of traps to send to the manager. + traps are labeled in severity as informational(1), warning(2), + severe(3). Only traps of equal or greater severity than + this value are sent to the manager." + ::= { mconfigTrapReceiverEntry 4 } + +acceptThisReceiver OBJECT-TYPE + SYNTAX INTEGER { + yes (1), + no (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "An entry will become active if yes, and will + be deleted if no." + ::= { mconfigTrapReceiverEntry 5 } + + +receiveTrapType OBJECT-TYPE + SYNTAX INTEGER { + powernet (1), + ietf (2), + both (3) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The node in this entry will receive traps defined in APC + PowerNet MIB, if this OID is set to yes." + ::= { mconfigTrapReceiverEntry 6 } + +mconfigBOOTPEnabled OBJECT-TYPE + SYNTAX INTEGER { + yes (1), + no (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The value of yes(1) indicates the PowerNet Adapter is configured to + obtain its IP configuration parameters from a BOOTP server. + + The value of no(2) indicates adapter will assume IP configuration parameters + values saved in adapter's eeprom, which was originally configured at local + console." + ::= { mconfig 3 } + +mconfigTFTPServerIP OBJECT-TYPE + SYNTAX IpAddress + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The IP address of TFTP server. If mconfigBOOTPEnabled is yes(1), then this IP address + is provided by BOOTP server and not allowed to be modified; otherwise, this IP address + can be modified. + + Before using TFTP to load new code image, the image file should be placed in proper + directory of the specified TFTP server. This OID is only supported by AP9605, AP9205, + and AP9603 PowerNet SNMP Adapters." + ::= { mconfig 4 } + +newCodeAuthentViaTFTP OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + validNewAgentCodeImage (2), + sameAgentCodeImage (3), + invalidAgentCodeImage (4) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Once mcontrolRestartAgent is set to loadAndExecuteNewAgent (3), PowerNet adapter will + start to load the remote image file, for authentication only, instead of saving the code + into flash memory. Only if a validNewAgentCodeImage (1) is found will the agent reboot + the PowerNet adapter and invoke the loader to load and save new code into the flash memory. + Otherwise, the current agent code will continue to run. + + This OID shows the result of the above authentication process. + validNewAgentCodeImage (1) means the code image on TFTP server + is a valid APC agent code and is different version from the current agent. + Once agent identifies this, loader will start to update flash memory with + the new agent code. + + sameAgentCodeImage (2) means the code image on TFTP server is exactly the + same as the currently running agent. Currently running agent will not invoke + loader to load the same again. + + invalidAgentCodeImage (3) means the code image on TFTP server is NOT a valid + APC agent code. Thus, current agent will not load it into the flash memory. + + The value of this OID will be associated with TRAP codeImageAuthentDone. + This OID is only supported by AP9605, AP9205, and AP9603 PowerNet SNMP Adapters." + + ::= { mconfig 5 } + +mconfigClockDate OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The current date in the mm/dd/yyyy format. Example: 01/01/2000." + ::= { mconfigClock 1 } + +mconfigClockTime OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The current time in the hh:mm:ss am/pm format. Example: 12:00:00 am." + ::= { mconfigClock 2 } + +mcontrolRestartAgent OBJECT-TYPE + SYNTAX INTEGER { + restartCurrentAgent (1), + continueCurrentAgent (2), + loadAndExecuteNewAgent (3), + restartWithoutAgent (4), + resetNetworkAndRestart (5), + resetNetworkLeaveModeAndRestart (6) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to restartCurrentAgent (1) will restart the same SNMP + agent code currently saved in flash memory. Setting this OID to + loadAndExecuteNewAgent (3) will enable adapter to load a new agent code + into the flash memory and start to execute this new agent code. + Bootp/tftp is the default protocol. loadAndExecuteNewAgent is only + supported by AP9605, AP9205, and AP9603 PowerNet SNMP Adapters. Setting + this OID to restartWithoutAgent (4) will restart the system and not + start the agent. The subsequent time the system restarts the agent will + also automatically restart. Setting this OID to + resetNetworkAndRestart (5) will set the Boot Mode, IP Address, Subnet + Mask, and Default Gateway to defaults, expire any existing DHCP lease + and then restart the system. Setting this OID to + resetNetworkLeaveModeAndRestart (6) will leave the Boot Mode at the + current setting, set the IP Address, Subnet Mask, and Default Gateway to + defaults, expire any existing DHCP lease and then restart the system." + + ::= { mcontrol 1 } + +-- The mtrapargs group +-- These OIDs allows APC traps to be sent with additional arguments +-- which may not be defined in the APC MIB. + +mtrapargsInteger OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID allows APC traps to be sent with an integer argument + that my not be defined in the APC MIB. + + A get of this OID will return 0." + ::= { mtrapargs 1 } + +mtrapargsIpAddress OBJECT-TYPE + SYNTAX IpAddress + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID allows APC traps to be sent with an IP address argument + that my not be defined in the APC MIB. + + A get of this OID will return 0.0.0.0." + ::= { mtrapargs 2 } + +mtrapargsString OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID allows APC traps to be sent with an octet string argument + that my not be defined in the APC MIB. + + A get of this OID will return a NULL string." + ::= { mtrapargs 3 } + +mtrapargsGauge OBJECT-TYPE + SYNTAX Gauge + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID allows APC traps to be sent with a Gauge argument + that my not be defined in the APC MIB. + + A get of this OID will return 0." + ::= { mtrapargs 4 } + +mtrapargsTimeTicks OBJECT-TYPE + SYNTAX TimeTicks + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID allows APC traps to be sent with a TimeTicks argument + that my not be defined in the APC MIB. + + A get of this OID will return 0." + ::= { mtrapargs 5 } + +mtrapargsInteger02 OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID allows APC traps to be sent with an integer argument + that my not be defined in the APC MIB. + + A get of this OID will return 0." + ::= { mtrapargs 6 } + +mtrapargsInteger03 OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID allows APC traps to be sent with an integer argument + that my not be defined in the APC MIB. + + A get of this OID will return 0." + ::= { mtrapargs 7 } + +mtrapargsIpAddress02 OBJECT-TYPE + SYNTAX IpAddress + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID allows APC traps to be sent with an IP address argument + that my not be defined in the APC MIB. + + A get of this OID will return 0.0.0.0." + ::= { mtrapargs 8 } + +mtrapargsIpAddress03 OBJECT-TYPE + SYNTAX IpAddress + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID allows APC traps to be sent with an IP address argument + that my not be defined in the APC MIB. + + A get of this OID will return 0.0.0.0." + ::= { mtrapargs 9 } + +mtrapargsString02 OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID allows APC traps to be sent with an octet string argument + that my not be defined in the APC MIB. + + A get of this OID will return a NULL string." + ::= { mtrapargs 10 } + +mtrapargsString03 OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID allows APC traps to be sent with an octet string argument + that my not be defined in the APC MIB. + + A get of this OID will return a NULL string." + ::= { mtrapargs 11 } + +mtrapargsGauge02 OBJECT-TYPE + SYNTAX Gauge + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID allows APC traps to be sent with a Gauge argument + that my not be defined in the APC MIB. + + A get of this OID will return 0." + ::= { mtrapargs 12 } + +mtrapargsGauge03 OBJECT-TYPE + SYNTAX Gauge + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID allows APC traps to be sent with a Gauge argument + that my not be defined in the APC MIB. + + A get of this OID will return 0." + ::= { mtrapargs 13 } + +mtrapargsTimeTicks02 OBJECT-TYPE + SYNTAX TimeTicks + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID allows APC traps to be sent with a TimeTicks argument + that my not be defined in the APC MIB. + + A get of this OID will return 0." + ::= { mtrapargs 14 } + +mtrapargsTimeTicks03 OBJECT-TYPE + SYNTAX TimeTicks + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID allows APC traps to be sent with a TimeTicks argument + that my not be defined in the APC MIB. + + A get of this OID will return 0." + ::= { mtrapargs 15 } + +-- the mfiletransfer group +-- the mfiletransferStatus group +mfiletransferStatusLastTransferResult OBJECT-TYPE + SYNTAX INTEGER { + lastFileTransferResultSuccessful (1), + lastFileTransferResultNotAvailable (2), + lastFileTransferResultFailureUnknown (3), + lastFileTransferResultFailureServerInaccessible (4), + lastFileTransferResultFailureServerAccessDenied (5), + lastFileTransferResultFailureFileNotFound (6), + lastFileTransferResultFailureFileTypeUnknown (7), + lastFileTransferResultFailureFileCorrupted (8) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Once mfiletransferControlInitiateFileTransfer is set to a value other than doNotInitiateFileTransfer + a file transfer of mfiletransferConfigSettingsFilename will be attempted from either a TFTP or FTP + server. + + This OID shows the last attempted file transfer result. + lastFileTransferResultSuccessful (1) means the file transfer was successful. + lastFileTransferResultNotAvailable (2) means that there have been no previous file transfers. + lastFileTransferResultFailureUnknown (3) means that the last file transfer failed for an unknown reason. + lastFileTransferResultFailureServerInaccessible (4) means that the TFTP or FTP server could not be found on the network. + lastFileTransferResultFailureServerAccessDenied (5) means that the TFTP or FTP server denied access. + lastFileTransferResultFailureFileNotFound (6) means that the file could not be located. + lastFileTransferResultFailureFileTypeUnknown (7) means the file was examined, but the contents were unknown. + lastFileTransferResultFailureFileCorrupt (8) means the transferred file was corrupt." + + ::= { mfiletransferStatus 1 } + +-- the mfiletransferConfig group +-- the mfiletransferConfigSettings group + +mfiletransferConfigSettingsFilename OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The path and name of the file to transfer using the mfiletransferControlInitiateFileTransfer OID. + If the file to transfer exists in the default server directory then the path may be omitted." + + ::= { mfiletransferConfigSettings 1 } + +-- the mfiletransferConfigTFTP group + +mfiletransferConfigTFTPServerAddress OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The IP Address in dotted decimal notation of the TFTP server involved in the file transfer." + + ::= { mfiletransferConfigTFTP 1 } + +-- the mfiletransferConfigFTP group + +mfiletransferConfigFTPServerAddress OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The IP Address in dotted decimal notation of the FTP server involved in the file transfer." + + ::= { mfiletransferConfigFTP 1 } + +mfiletransferConfigFTPServerUser OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The user identification for logging into the FTP server specified with mfiletransferConfigFTPServerAddress." + + ::= { mfiletransferConfigFTP 2 } + +mfiletransferConfigFTPServerPassword OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The password for logging into the FTP server specified with mfiletransferConfigFTPServerAddress." + + ::= { mfiletransferConfigFTP 3 } + +-- the mfiletransferControl group + +mfiletransferControlInitiateFileTransfer OBJECT-TYPE + SYNTAX INTEGER { + doNotInitiateFileTransfer (1), + initiateFileTransferDownloadViaTFTP (2), + initiateFileTransferDownloadViaFTP (3) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to doNotInitiateFileTransfer (1) will do nothing. + + Setting this OID to initiateFileTransferDownloadViaTFTP (2) will attempt to transfer the file named in + mfiletransferConfigSettingsFilename from the TFTP Server identified in mfiletransferConfigTFTPAddress. + + Setting this OID to initiateFileTransferDownloadViaFTP (3) will attempt to transfer the file named in + mfiletransferConfigSettingsFilename from the FTP Server identified in mfiletransferConfigFTPAddress + using mfiletransferConfigFTPUser and mfiletransferConfigFTPPassword for the FTP Server login process." + + ::= { mfiletransferControl 1 } + +-- the battManIdent group + +battManIdentProductName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the battery manager." + ::= { battManIdent 1 } + +battManIdentHardwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The battery manager network interface hardware revision. + This value is set at the factory." + ::= { battManIdent 2 } + +battManIdentFirmwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The battery manager network interface firmware revision. + This value is set at the factory and can change with firmware update." + ::= { battManIdent 3 } + +battManIdentDateOfManufacture OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The date the battery manager was manufactured in mm/dd/yyyy format. + This value is set at the factory." + ::= { battManIdent 4 } + +battManIdentModelNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The battery manager model number character string. + This value is set at the factory." + ::= { battManIdent 5 } + +battManIdentSerialNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The battery manager serial number character string. + This value is set at the factory." + ::= { battManIdent 6 } + +-- the battManCalib group +-- system calibration + +battManOhmicValueCorrectionFactor OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The system ohmic value correction factor in percent." + ::= { battManSystemCalib 1 } + +-- unit calibration + +battManUnitCalibTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of entries in the battManUnitCalibTable." + ::= { battManUnitCalib 1 } + +battManUnitCalibTable OBJECT-TYPE + SYNTAX SEQUENCE OF BattManUnitCalibTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for getting calibration information from each unit in the system." + ::= { battManUnitCalib 2 } + +battManUnitCalibTableEntry OBJECT-TYPE + SYNTAX BattManUnitCalibTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The unit to get data from." + INDEX { battManUnitCalibIndex } + ::= { battManUnitCalibTable 1 } + +BattManUnitCalibTableEntry ::= + SEQUENCE { + battManUnitCalibIndex INTEGER, + battManUnitSerialNumber DisplayString, + battManBatteryVoltageZeroCalib INTEGER, + battManBatteryVoltageSpanCalib INTEGER + } + +battManUnitCalibIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Index of unit calibration entries in the table." + ::= { battManUnitCalibTableEntry 1 } + +battManUnitSerialNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The serial number of the unit." + ::= { battManUnitCalibTableEntry 2 } + +battManBatteryVoltageZeroCalib OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The unit battery voltage zero calibration in millivolts." + ::= { battManUnitCalibTableEntry 3 } + +battManBatteryVoltageSpanCalib OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The unit battery voltage span calibration in percent." + ::= { battManUnitCalibTableEntry 4 } + +-- string calibration table + +battManStringCalibTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of entries in the battManStringCalibTable." + ::= { battManStringCalib 1 } + +battManStringCalibTable OBJECT-TYPE + SYNTAX SEQUENCE OF BattManStringCalibTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for getting calibration information from each string in the system." + ::= { battManStringCalib 2 } + +battManStringCalibTableEntry OBJECT-TYPE + SYNTAX BattManStringCalibTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The string to get data from." + INDEX { battManStringCalibIndex } + ::= { battManStringCalibTable 1 } + +BattManStringCalibTableEntry ::= + SEQUENCE { + battManStringCalibIndex INTEGER, + battManDCCurrentZeroCalib INTEGER, + battManACCurrentZeroCalib INTEGER, + battManProbeRange INTEGER + } + +battManStringCalibIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Index of string calibration entries in the table." + ::= { battManStringCalibTableEntry 1 } + +battManDCCurrentZeroCalib OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The string DC current zero calibration in tenths of amps." + ::= { battManStringCalibTableEntry 2 } + +battManACCurrentZeroCalib OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The string AC current zero calibration in tenths of amps." + ::= { battManStringCalibTableEntry 3 } + +battManProbeRange OBJECT-TYPE + SYNTAX INTEGER { + amps1000 (1), + amps500 (2), + amps100 (3) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The string probe range in amps." + ::= { battManStringCalibTableEntry 4 } + +--string 1 battery calibration table + +battManString1BatteryCalibTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of entries in the battManString1BatteryCalibTable." + ::= { battManBatteryCalib 1 } + +battManString1BatteryCalibTable OBJECT-TYPE + SYNTAX SEQUENCE OF BattManString1BatteryCalibTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for getting calibration information from each battery in String 1." + ::= { battManBatteryCalib 2 } + +battManString1BatteryCalibTableEntry OBJECT-TYPE + SYNTAX BattManString1BatteryCalibTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The string to get data from." + INDEX { battManString1BatteryCalibIndex } + ::= { battManString1BatteryCalibTable 1 } + +BattManString1BatteryCalibTableEntry ::= + SEQUENCE { + battManString1BatteryCalibIndex INTEGER, + battManString1BatteryInterTierOhmicValue INTEGER + } + +battManString1BatteryCalibIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Index of battery calibration entries in the table." + ::= { battManString1BatteryCalibTableEntry 1 } + +battManString1BatteryInterTierOhmicValue OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The battery inter-tier ohmic value in ohms. This corresponds to the ohmic + value for the positive terminal of the battery." + ::= { battManString1BatteryCalibTableEntry 2 } + +--string 2 battery calibration table + +battManString2BatteryCalibTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of entries in the battManString2BatteryCalibTable." + ::= { battManBatteryCalib 3 } + +battManString2BatteryCalibTable OBJECT-TYPE + SYNTAX SEQUENCE OF BattManString2BatteryCalibTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for getting calibration information from each battery in String 2." + ::= { battManBatteryCalib 4 } + +battManString2BatteryCalibTableEntry OBJECT-TYPE + SYNTAX BattManString2BatteryCalibTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The string to get data from." + INDEX { battManString2BatteryCalibIndex } + ::= { battManString2BatteryCalibTable 1 } + +BattManString2BatteryCalibTableEntry ::= + SEQUENCE { + battManString2BatteryCalibIndex INTEGER, + battManString2BatteryInterTierOhmicValue INTEGER + } + +battManString2BatteryCalibIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Index of battery calibration entries in the table." + ::= { battManString2BatteryCalibTableEntry 1 } + +battManString2BatteryInterTierOhmicValue OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The battery inter-tier ohmic value in ohms." + ::= { battManString2BatteryCalibTableEntry 2 } + +-- the battManConfig group + +battManConfigApplication OBJECT-TYPE + SYNTAX INTEGER { + silcon (1), + other (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The type of application the battery manager is installed on: + Silcon(1) Silcon UPS or + Other(2) Other UPS/Charger." + ::= { battManConfig 1 } + +battManConfigBatteryChemistry OBJECT-TYPE + SYNTAX INTEGER { + leadAcid (1), + nickel-Cadmium (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The battery chemistry of the monitored batteries: + LeadAcid(1) Lead Acid or + Nickel-Cadmium(2) Nickel-Cadmium." + ::= { battManConfig 2 } + +battManConfigBatteryAHCapacity OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The amp hour capacity of the monitored batteries 5-2000 AH." + ::= { battManConfig 3 } + +battManConfigNumberofStrings OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The number of strings in the battery manager system (1 - 2 Silcon)/(1 Other)." + ::= { battManConfig 4 } + +battManConfigBatteriesperString OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The number of batteries per string." + ::= { battManConfig 5 } + +battManConfigCellsperBattery OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The number of cells per battery (1 - 6 for lead-acid, 1 - 2 for NiCd." + ::= { battManConfig 6 } + +battManConfigMinCellVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The minimum battery cell voltage alarm limit in millivolts DC." + ::= { battManConfig 7 } + +battManConfigMaxCellVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The maximum battery cell voltage alarm limit in millivolts DC." + ::= { battManConfig 8 } + +battManConfigMaxPilotTempF OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The maximum pilot battery temperature alarm limit in tenths of degrees Fahrenheit." + ::= { battManConfig 9 } + +battManConfigMaxPilotTempC OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The maximum pilot battery temperature alarm limit in tenths of degrees Celcius." + ::= { battManConfig 10 } + +battManConfigMaxAmbientTempF OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The maximum ambient temperature alarm limit in tenths of degrees Fahrenheit." + ::= { battManConfig 11 } + +battManConfigMaxAmbientTempC OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The maximum ambient temperature alarm limit in tenths of degrees Celcius." + ::= { battManConfig 12 } + +battManConfigMinAmbientTempF OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The Minimum Ambient Temperature alarm limit in tenths of degrees Fahrenheit." + ::= { battManConfig 13 } + +battManConfigMinAmbientTempC OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The Minimum Ambient Temperature alarm limit in tenths of degrees Celcius." + ::= { battManConfig 14 } + +battManConfigMaxRippleCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The maximum ripple current alarm limit for the monitored battery + strings in percent of AH capacity." + ::= { battManConfig 15 } + +battManConfigMaxCurrentAcceptanceDeviation OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The maximum current acceptance deviation alarm limit in percentage." + ::= { battManConfig 16 } + +battManConfigMonitorWireLength OBJECT-TYPE + SYNTAX INTEGER { + fiftyFeetOrLess (1), + moreThanFiftyFeet (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The monitor wire length: + fiftyFeetOrLess (1) indicates that the wire length is less than or equal to 50 feet. + moreThanFiftyFeet (2) indicates that the wire length is greater than 50 feet." + ::= { battManConfig 17 } + +battManConfigDischargeVoltageAlarmLevel OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The discharge voltage alarm level in percent." + ::= { battManConfig 18 } + +battManConfigAutoAnnunciatorReset OBJECT-TYPE + SYNTAX INTEGER { + disabled (1), + enabled (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The annunciator output signal reset method: + disabled(1) means the annunciator signal output will be reset when the reset button is pressed. + enabled(2) means the annunciator will stop signalling when all alarm conditions clear." + ::= { battManConfig 19 } + +-- the battManAlarm group + +battManAlarmManagementController OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The Management Controller Alarm is : + normal(1) no alarm condtions identified + alarm(2) an alarm condition exits." + ::= { battManAlarm 1 } + +battManAlarmBatteries OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The Batteries Alarm is : + normal(1) no alarm condtions identified + alarm(2) an alarm condition exits." + ::= { battManAlarm 2 } + +battManAlarmCharger OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The Charger Alarm is : + normal(1) no alarm condtions identified + alarm(2) an alarm condition exits." + ::= { battManAlarm 3 } + +battManAlarmEnvironment OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The Environment Alarm is : + normal(1) no alarm condtions identified + alarm(2) an alarm condition exits." + ::= { battManAlarm 4 } + +-- the battManSystemStatus group + +-- These are system wide parameters + +battManSystemAmbientTempC OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system ambient temperture in tenths of degrees Celcius." + ::= { battManSystemStatus 1 } + +battManSystemAmbientTempF OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system ambient temperture in tenths of degrees Fahrenheit." + ::= { battManSystemStatus 2 } + +battManSystemPilotTempC OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system pilot temperature in tenths of degrees Celcius." + ::= { battManSystemStatus 3 } + +battManSystemPilotTempF OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system pilot temperature in tenths of degrees Fahrenheit." + ::= { battManSystemStatus 4 } + +battManSystemAmbientHighTempAlarm OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates that the system has a high temperature alarm." + ::= { battManSystemStatus 5 } + +battManSystemAmbientLowTempAlarm OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates that the system has a low temperature alarm." + ::= { battManSystemStatus 6 } + +battManSystemPilotBatteryHighTempAlarm OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates that the system has a pilot battery high temperature alarm." + ::= { battManSystemStatus 7 } + +battManSystemPilotProbeDisconnected OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates that the system pilot probe is disconnected." + ::= { battManSystemStatus 8 } + +battManSystemAmbientProbeDisconnected OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates that the system ambient probe is disconnected." + ::= { battManSystemStatus 9 } + +-- This is a table of input contact parameters + +battManInputContactTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of entries in the battManContactTable." + ::= { battManInputContactStatus 1 } + +battManInputContactTable OBJECT-TYPE + SYNTAX SEQUENCE OF BattManInputContactTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for getting information from each contact + in the system. " + ::= { battManInputContactStatus 2 } + +battManInputContactTableEntry OBJECT-TYPE + SYNTAX BattManInputContactTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The contact to get data from." + INDEX { battManInputContactIndex } + ::= { battManInputContactTable 1 } + +BattManInputContactTableEntry ::= + SEQUENCE { + battManInputContactIndex INTEGER, + battManInputContactName DisplayString, + battManInputContactAlarmState INTEGER, + battManInputContactState INTEGER, + battManInputContactNormalState INTEGER, + battManInputContactAlarmDelay INTEGER + } + +battManInputContactIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Index of contact entries in the table." + ::= { battManInputContactTableEntry 1 } + +battManInputContactName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the input contact." + ::= { battManInputContactTableEntry 2 } + +battManInputContactAlarmState OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates that the alarm condition is active for this contact." + ::= { battManInputContactTableEntry 3 } + +battManInputContactState OBJECT-TYPE + SYNTAX INTEGER { + open (1), + closed (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to open(1), the input contact is in the open state. + When set to closed(2), the input contact is in the closed state." + ::= { battManInputContactTableEntry 4 } + +battManInputContactNormalState OBJECT-TYPE + SYNTAX INTEGER { + open (1), + closed (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to open(1), the input contact is normally open. + When set to closed(2), the input contact is normally closed." + ::= { battManInputContactTableEntry 5 } + +battManInputContactAlarmDelay OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The alarm delay time in seconds." + ::= { battManInputContactTableEntry 6 } + +-- This is a table of battery string parameters + +battManStringTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of entries in the battManStringTable." + ::= { battManStringStatus 1 } + +battManStringTable OBJECT-TYPE + SYNTAX SEQUENCE OF BattManStringTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for getting information from each string + in the system. " + ::= { battManStringStatus 2 } + +battManStringTableEntry OBJECT-TYPE + SYNTAX BattManStringTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The string to get data from." + INDEX { battManStringIndex } + ::= { battManStringTable 1 } + +BattManStringTableEntry ::= + SEQUENCE { + battManStringIndex INTEGER, + battManStringCurrent INTEGER, + battManStringRippleCurrent INTEGER, + battManStringChargerHighVoltageAlarm INTEGER, + battManStringChargerLowVoltageAlarm INTEGER, + battManStringCurrentProbeDisconnected INTEGER, + battManStringOnBattery INTEGER + } + +battManStringIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Index of string entries in the table." + ::= { battManStringTableEntry 1 } + +battManStringCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The string current in tenths of Amps." + ::= { battManStringTableEntry 2 } + +battManStringRippleCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The string ripple current in tenths of Amps." + ::= { battManStringTableEntry 3 } + +battManStringChargerHighVoltageAlarm OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates that the string charger has a high voltage alarm." + ::= { battManStringTableEntry 4 } + +battManStringChargerLowVoltageAlarm OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates that the string charger has a low voltage alarm." + ::= { battManStringTableEntry 5 } + +battManStringCurrentProbeDisconnected OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates that the string charger probe is disconnected." + ::= { battManStringTableEntry 6 } + +battManStringOnBattery OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates that the string is in the on-battery state." + ::= { battManStringTableEntry 7 } + +-- the battManString1BatteryStatus group + +battManString1BatteryTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of entries in the battManString1BatteryStatusTable." + ::= { battManBatteryStatus 1 } + +battManString1BatteryTable OBJECT-TYPE + SYNTAX SEQUENCE OF BattManString1BatteryTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for getting information from each string + in the system. " + ::= { battManBatteryStatus 2 } + +battManString1BatteryTableEntry OBJECT-TYPE + SYNTAX BattManString1BatteryTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The string to get data from." + INDEX { battManString1BatteryIndex } + ::= { battManString1BatteryTable 1 } + +BattManString1BatteryTableEntry ::= + SEQUENCE { + battManString1BatteryIndex INTEGER, + battManString1BatteryVoltage INTEGER, + battManString1BatteryLowestVoltage INTEGER, + battManString1BatteryCellShorted INTEGER, + battManString1BatteryOpenFuseOrConnection INTEGER, + battManString1BatteryLowCapacity INTEGER, + battManString1BatteryHighOhmicValue INTEGER, + battManString1BatteryThermalRunaway INTEGER, + battManString1BatteryDryout INTEGER + } + +battManString1BatteryIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Index of string entries in the table." + ::= { battManString1BatteryTableEntry 1 } + +battManString1BatteryVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The battery voltage in milli VDC." + ::= { battManString1BatteryTableEntry 2 } + +battManString1BatteryLowestVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The lowest battery discharge voltage during the last power event in milli VDC." + ::= { battManString1BatteryTableEntry 3 } + +battManString1BatteryCellShorted OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates that a battery cell is shorted." + ::= { battManString1BatteryTableEntry 4 } + +battManString1BatteryOpenFuseOrConnection OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates that a fuse or connection is open." + ::= { battManString1BatteryTableEntry 5 } + +battManString1BatteryLowCapacity OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates a battery has low capacity." + ::= { battManString1BatteryTableEntry 6 } + +battManString1BatteryHighOhmicValue OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates a battery has a high ohmic value." + ::= { battManString1BatteryTableEntry 7 } + +battManString1BatteryThermalRunaway OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates a battery has a thermal runaway condition." + ::= { battManString1BatteryTableEntry 8 } + +battManString1BatteryDryout OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates a battery has a dryout condition." + ::= { battManString1BatteryTableEntry 9 } + +-- the battManString2BatteryStatus group + +battManString2BatteryTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of entries in the battManString2BatteryStatusTable." + ::= { battManBatteryStatus 3 } + +battManString2BatteryTable OBJECT-TYPE + SYNTAX SEQUENCE OF BattManString2BatteryTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for getting information from each string + in the system. " + ::= { battManBatteryStatus 4 } + +battManString2BatteryTableEntry OBJECT-TYPE + SYNTAX BattManString2BatteryTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The string to get data from." + INDEX { battManString2BatteryIndex } + ::= { battManString2BatteryTable 1 } + +BattManString2BatteryTableEntry ::= + SEQUENCE { + battManString2BatteryIndex INTEGER, + battManString2BatteryVoltage INTEGER, + battManString2BatteryLowestVoltage INTEGER, + battManString2BatteryCellShorted INTEGER, + battManString2BatteryOpenFuseOrConnection INTEGER, + battManString2BatteryLowCapacity INTEGER, + battManString2BatteryHighOhmicValue INTEGER, + battManString2BatteryThermalRunaway INTEGER, + battManString2BatteryDryout INTEGER + } + +battManString2BatteryIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Index of string entries in the table." + ::= { battManString2BatteryTableEntry 1 } + +battManString2BatteryVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The battery voltage in milli VDC." + ::= { battManString2BatteryTableEntry 2 } + +battManString2BatteryLowestVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The lowest battery discharge voltage during the last power event in milli VDC." + ::= { battManString2BatteryTableEntry 3 } + +battManString2BatteryCellShorted OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates that a battery cell is shorted." + ::= { battManString2BatteryTableEntry 4 } + +battManString2BatteryOpenFuseOrConnection OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates that a fuse or connection is open." + ::= { battManString2BatteryTableEntry 5 } + +battManString2BatteryLowCapacity OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates a battery has low capacity." + ::= { battManString2BatteryTableEntry 6 } + +battManString2BatteryHighOhmicValue OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates a battery has a high ohmic value." + ::= { battManString2BatteryTableEntry 7 } + +battManString2BatteryThermalRunaway OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates a battery has a thermal runaway condition." + ::= { battManString2BatteryTableEntry 8 } + +battManString2BatteryDryout OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + alarm (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When set to alarm(2), indicates a battery has a dryout condition." + ::= { battManString2BatteryTableEntry 9 } + +-- battery manager control group +battManRemoteAnnunciatorReset OBJECT-TYPE + SYNTAX INTEGER { + noOperation (1), + reset (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to reset(2) will reset the user interface annunciator. + Getting this OID will do nothing and return the noOperation(1) value." + ::= { battManControl 1 } + +battManResetChargeCurrentDeviationBenchmark OBJECT-TYPE + SYNTAX INTEGER { + noOperation (1), + reset (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to reset(2) will reset the charge current deviation benchmark. + Getting this OID will do nothing and return the noOperation(1) value." + ::= { battManControl 2 } + +battManResetLowestDischargeVoltages OBJECT-TYPE + SYNTAX INTEGER { + noOperation (1), + reset (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to reset(2) will reset the lowest discharge voltages. + Getting this OID will do nothing and return the noOperation(1) value." + ::= { battManControl 3 } + +-- the battManTestResults group + +--string 1 test results table + +battManString1OhmicValueLastDischargeInfo OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Informational text showing the date/time, load, and pilot temperature for the string + during the last discharge when ohmic values were recorded." + ::= { battManTestResults 1 } + +battManString1OhmicValueTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of entries in the battManString1OhmicValueTable." + ::= { battManTestResults 2 } + +battManString1OhmicValueTable OBJECT-TYPE + SYNTAX SEQUENCE OF BattManString1OhmicValueTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for getting ohmic value information from each battery in String 1." + ::= { battManTestResults 3 } + +battManString1OhmicValueTableEntry OBJECT-TYPE + SYNTAX BattManString1OhmicValueTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The string to get data from." + INDEX { battManString1OhmicValueIndex } + ::= { battManString1OhmicValueTable 1 } + +BattManString1OhmicValueTableEntry ::= + SEQUENCE { + battManString1OhmicValueIndex INTEGER, + battManString1OhmicValueData INTEGER + } + +battManString1OhmicValueIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The battery number." + ::= { battManString1OhmicValueTableEntry 1 } + +battManString1OhmicValueData OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The battery inter-tier ohmic value in ohms. + Note: Negative values are invalid and may indicate faulty calibration + of ohmic value correction factors." + ::= { battManString1OhmicValueTableEntry 2 } + +battManString1ResponseTestChangeTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of entries in the battManString1ResponseTestChangeTable." + ::= { battManTestResults 4 } + +battManString1ResponseTestChangeTable OBJECT-TYPE + SYNTAX SEQUENCE OF BattManString1ResponseTestChangeTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for getting response test change information from each battery in String 1." + ::= { battManTestResults 5 } + +battManString1ResponseTestChangeTableEntry OBJECT-TYPE + SYNTAX BattManString1ResponseTestChangeTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The string to get data from." + INDEX { battManString1ResponseTestChangeIndex } + ::= { battManString1ResponseTestChangeTable 1 } + +BattManString1ResponseTestChangeTableEntry ::= + SEQUENCE { + battManString1ResponseTestChangeIndex INTEGER, + battManString1ResponseTestChangeData INTEGER + } + +battManString1ResponseTestChangeIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Index of the entries in the table." + ::= { battManString1ResponseTestChangeTableEntry 1 } + +battManString1ResponseTestChangeData OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The battery response test change in percent." + ::= { battManString1ResponseTestChangeTableEntry 2 } + +battManString2OhmicValueLastDischargeInfo OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Informational text showing the date/time, load, and pilot temperature for the string + during the last discharge when ohmic values were recorded." + ::= { battManTestResults 6 } + +battManString2OhmicValueTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of entries in the battManString2OhmicValueTable." + ::= { battManTestResults 7 } + +battManString2OhmicValueTable OBJECT-TYPE + SYNTAX SEQUENCE OF BattManString2OhmicValueTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for getting ohmic value information from each battery in String 1." + ::= { battManTestResults 8 } + +battManString2OhmicValueTableEntry OBJECT-TYPE + SYNTAX BattManString2OhmicValueTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The string to get data from." + INDEX { battManString2OhmicValueIndex } + ::= { battManString2OhmicValueTable 1 } + +BattManString2OhmicValueTableEntry ::= + SEQUENCE { + battManString2OhmicValueIndex INTEGER, + battManString2OhmicValueData INTEGER + } + +battManString2OhmicValueIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Index of battery calibration entries in the table." + ::= { battManString2OhmicValueTableEntry 1 } + +battManString2OhmicValueData OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The battery inter-tier ohmic value in ohms. + Note: Negative values are invalid and may indicate faulty calibration + of ohmic value correction factors." + ::= { battManString2OhmicValueTableEntry 2 } + +battManString2ResponseTestChangeTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of entries in the battManString2ResponseTestChangeTable." + ::= { battManTestResults 9 } + +battManString2ResponseTestChangeTable OBJECT-TYPE + SYNTAX SEQUENCE OF BattManString2ResponseTestChangeTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for getting response test change information from each battery in String 1." + ::= { battManTestResults 10 } + +battManString2ResponseTestChangeTableEntry OBJECT-TYPE + SYNTAX BattManString2ResponseTestChangeTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The string to get data from." + INDEX { battManString2ResponseTestChangeIndex } + ::= { battManString2ResponseTestChangeTable 1 } + +BattManString2ResponseTestChangeTableEntry ::= + SEQUENCE { + battManString2ResponseTestChangeIndex INTEGER, + battManString2ResponseTestChangeData INTEGER + } + +battManString2ResponseTestChangeIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Index of the entries in the table." + ::= { battManString2ResponseTestChangeTableEntry 1 } + +battManString2ResponseTestChangeData OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The battery response test change in percent." + ::= { battManString2ResponseTestChangeTableEntry 2 } + +-- the xPDUIdent group + +xPDUIdentProductName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the PDU." + ::= { xPDUIdent 1 } + +xPDUIdentHardwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The hardware revision of the PDU. + This value is set at the factory." + ::= { xPDUIdent 2 } + +xPDUIdentFirmwareAppRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An ID string identifying the application firmware revision of the PDU." + ::= { xPDUIdent 3 } + +xPDUIdentFirmwareAppOSRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An ID string identifying the application operating system firmware revision of the PDU." + ::= { xPDUIdent 4 } + +xPDUIdentFirmwareControllerRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An ID string identifying the PDU controller firmware revision." + ::= { xPDUIdent 5 } + +xPDUIdentDateOfManufacture OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The date when the PDU was manufactured in mm/dd/yyyy format. + This value is set at the factory." + ::= { xPDUIdent 6 } + +xPDUIdentModelNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the model number of + the PDU. This value is set at the factory." + ::= { xPDUIdent 7 } + +xPDUIdentSerialNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the serial number of + the PDU. This value is set at the factory." + ::= { xPDUIdent 8 } + +-- the xPDUDevice group + +xPDUDeviceNominalMainInputVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The nominal main input voltage to the PDU. + Measured in Volts, line-to-line for a delta service or + line-to-neutral for a wye service." + ::= { xPDUDevice 1 } + +xPDUDeviceServiceType OBJECT-TYPE + SYNTAX INTEGER { + delta (1), + wye (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The type of utility input to the PDU. Either 3 wires (delta), or 4 wires (wye)." + ::= { xPDUDevice 2 } + +xPDUDeviceNominalOutputVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The nominal line-to-neutral output voltage to the load measured in Volts." + ::= { xPDUDevice 3 } + +xPDUDeviceMainInputBreakerRating OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The rating of the main input breaker measured in Amps." + ::= { xPDUDevice 4 } + +xPDUDevicePanelBreakerRating OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The rating of the panel breaker measured in Amps." + ::= { xPDUDevice 5 } + +xPDUDeviceTransformerPresent OBJECT-TYPE + SYNTAX INTEGER { + notPresent (1), + present (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates whether or not a transformer is installed in the PDU." + ::= { xPDUDevice 6 } + +xPDUDeviceLoadTieBreakerPresent OBJECT-TYPE + SYNTAX INTEGER { + notPresent (1), + present (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates whether or not a load tie breaker is installed in the PDU." + ::= { xPDUDevice 7 } + +xPDUDeviceLoadTestPortPresent OBJECT-TYPE + SYNTAX INTEGER { + notPresent (1), + present (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates whether or not a load test port is installed in the PDU." + ::= { xPDUDevice 8 } + +xPDUDeviceFusesPresent OBJECT-TYPE + SYNTAX INTEGER { + notPresent (1), + present (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates whether or not the UPS feed from the PDU includes fuses." + ::= { xPDUDevice 9 } + +xPDUDeviceFansPresent OBJECT-TYPE + SYNTAX INTEGER { + notPresent (1), + present (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates whether or not cooling fans are installed in the PDU." + ::= { xPDUDevice 10 } + +xPDUDeviceBypassInputPresent OBJECT-TYPE + SYNTAX INTEGER { + notPresent (1), + present (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates whether or not the PDU is equipped with a second feed for + the UPS's bypass input." + ::= { xPDUDevice 11 } + +xPDUDeviceCrossTieOutputPresent OBJECT-TYPE + SYNTAX INTEGER { + notPresent (1), + present (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates whether or not the PDU is equipped with a cross-tie output." + ::= { xPDUDevice 12 } + +xPDUDeviceEarthGroundMonitorPresent OBJECT-TYPE + SYNTAX INTEGER { + notPresent (1), + present (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates whether or not the PDU can provide ground current measurements." + ::= { xPDUDevice 13 } + +xPDUDeviceInfraXureType OBJECT-TYPE + SYNTAX INTEGER { + typeB (1), + typeC (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates the configuration of this PDU system. + Type-B PDU is in a distributed UPS system and has bypass capabilities. + Type-C PDU receives power from a larger central UPS." + ::= { xPDUDevice 14 } + +-- Main Input + +xPDUMainInputOverVoltThreshold OBJECT-TYPE + SYNTAX INTEGER (0..30) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold above which an input over voltage condition will be generated. + Specified as percent deviation from nominal." + ::= { xPDUMainInput 1 } + +xPDUMainInputUnderVoltThreshold OBJECT-TYPE + SYNTAX INTEGER (0..30) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold below which an input under voltage condition will be generated. + Specified as percent deviation from nominal." + ::= { xPDUMainInput 2 } + +-- Main Input Voltage Table + +xPDUMainInputVoltageTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of Main input voltage entries." + ::= { xPDUMainInput 3 } + +xPDUMainInputVoltageTable OBJECT-TYPE + SYNTAX SEQUENCE OF XPDUMainInputVoltagePhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of input voltage table entries. The number of + entries are the phase entries. + The number of entries is contained in the + xPDUMainInputVoltageTableSize OID." + ::= { xPDUMainInput 4 } + + xPDUMainInputVoltagePhaseEntry OBJECT-TYPE + SYNTAX XPDUMainInputVoltagePhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information applicable to a + particular main input voltage phase." + INDEX { xPDUMainInputVoltagePhaseIndex } + ::= { xPDUMainInputVoltageTable 1 } + + XPDUMainInputVoltagePhaseEntry ::= SEQUENCE { + xPDUMainInputVoltagePhaseIndex INTEGER, + xPDUMainInputVoltageLtoL INTEGER, + xPDUMainInputVoltageLtoN INTEGER + } + + xPDUMainInputVoltagePhaseIndex OBJECT-TYPE + SYNTAX INTEGER{ + phase1(1), + phase2(2), + phase3(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Description of each input phase entry in the table." + ::= { xPDUMainInputVoltagePhaseEntry 1 } + + xPDUMainInputVoltageLtoL OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Line-to-line PDU input voltage when an isolation transformer is present, + or -1 if no transformer present in this PDU. Measured in tenths of Volts." + ::= { xPDUMainInputVoltagePhaseEntry 2 } + + xPDUMainInputVoltageLtoN OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Line-to-neutral PDU input voltage when an isolation transformer is not present, + or -1 if a transformer is present in this PDU. Measured in tenths of Volts." + ::= { xPDUMainInputVoltagePhaseEntry 3 } + + +xPDUBypassInputOverVoltThreshold OBJECT-TYPE + SYNTAX INTEGER (0..30) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold above which a bypass input over voltage condition will be generated. + Specified as percent deviation from nominal." + ::= { xPDUBypassInput 1 } + +xPDUBypassInputUnderVoltThreshold OBJECT-TYPE + SYNTAX INTEGER (0..30) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold below which an bypass input under voltage condition will be generated. + Specified as percent deviation from nominal." + ::= { xPDUBypassInput 2 } + +-- Bypass Input Voltage Table + +xPDUBypassInputVoltageTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of bypass input voltage entries." + ::= { xPDUBypassInput 3 } + +xPDUBypassInputVoltageTable OBJECT-TYPE + SYNTAX SEQUENCE OF XPDUBypassInputVoltagePhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of output table entries. The number of + entries are the phase entries. + The number of entries is contained in the + xPDUBypassInputVoltageTableSize OID." + ::= { xPDUBypassInput 4 } + + xPDUBypassInputVoltagePhaseEntry OBJECT-TYPE + SYNTAX XPDUBypassInputVoltagePhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information applicable to a + particular bypass input voltage phase." + INDEX { xPDUBypassInputVoltagePhaseIndex } + ::= { xPDUBypassInputVoltageTable 1 } + + XPDUBypassInputVoltagePhaseEntry ::= SEQUENCE { + xPDUBypassInputVoltagePhaseIndex INTEGER, + xPDUBypassInputVoltageLtoL INTEGER, + xPDUBypassInputVoltageLtoN INTEGER + } + + xPDUBypassInputVoltagePhaseIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Index of each bypass input phase entry in the table." + ::= { xPDUBypassInputVoltagePhaseEntry 1 } + + xPDUBypassInputVoltageLtoL OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Line-to-line bypass input voltage, or -1 if no bypass + feed is present in this PDU. Measured in tenths of Volts" + ::= { xPDUBypassInputVoltagePhaseEntry 2 } + + xPDUBypassInputVoltageLtoN OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Line-to-neutral bypass input voltage, or -1 if no bypass + feed is present in this PDU. Measured in tenths of Volts" + ::= { xPDUBypassInputVoltagePhaseEntry 3 } + +-- UPS Input Table + +xPDUUPSInputVoltageTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of UPS input voltage entries." + ::= { xPDUUPSInput 1 } + +xPDUUPSInputVoltageTable OBJECT-TYPE + SYNTAX SEQUENCE OF XPDUUPSInputVoltagePhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of UPS input table entries. The number of + entries are the phase entries. + The number of entries is contained in the + xPDUUPSInputVoltageTableSize OID." + ::= { xPDUUPSInput 2 } + + xPDUUPSInputVoltagePhaseEntry OBJECT-TYPE + SYNTAX XPDUUPSInputVoltagePhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information applicable to a + particular UPS input voltage phase." + INDEX { xPDUUPSInputVoltagePhaseIndex } + ::= { xPDUUPSInputVoltageTable 1 } + + XPDUUPSInputVoltagePhaseEntry ::= SEQUENCE { + xPDUUPSInputVoltagePhaseIndex INTEGER, + xPDUUPSInputVoltageLtoNPresent INTEGER + } + + xPDUUPSInputVoltagePhaseIndex OBJECT-TYPE + SYNTAX INTEGER{ + phase1(1), + phase2(2), + phase3(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Description of each UPS input phase entry in the table." + ::= { xPDUUPSInputVoltagePhaseEntry 1 } + + xPDUUPSInputVoltageLtoNPresent OBJECT-TYPE + SYNTAX INTEGER { + notPresent (1), + present (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates whether or not voltage is present at the UPS feed." + ::= { xPDUUPSInputVoltagePhaseEntry 2 } + +-- System Output + +xPDUSystemOutputFrequency OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system output frequency in tenths of Hertz." + ::= { xPDUSystemOutput 1 } + +xPDUSystemOutputNeutralCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Shows the neutral current measured at the system output in tenths of Amps." + ::= { xPDUSystemOutput 2 } + +xPDUSystemOutputTotalPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Shows the total system output power in tenths of kW." + ::= { xPDUSystemOutput 3 } + +xPDUSystemOutputTotalApparentPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Shows the total system output power in tenths of kVA." + ::= { xPDUSystemOutput 4 } + +xPDUSystemOutputTotalPowerFactor OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates the total power factor of the system output. + A value of 100 representing a unity power factor (1.00). + Measured in hundredths." + ::= { xPDUSystemOutput 5 } + +xPDUSystemOutputFrequencyTolerance OBJECT-TYPE + SYNTAX INTEGER{ + freqToleranceOff (1), + freqTolerancePointTwo (2), + freqTolerancePointFive (3), + freqToleranceOne (4), + freqToleranceOnePointFive (5), + freqToleranceTwo (6), + freqToleranceThree (7), + freqToleranceFour (8), + freqToleranceFive (9), + freqToleranceNine (10) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Shows the circuit panel output frequency tolerance in Hertz." + ::= { xPDUSystemOutput 6 } + +xPDUSystemOutputMaxKWPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Defines 100% load in kW. + Purpose is to set to match UPS capabilities." + ::= { xPDUSystemOutput 7 } + +xPDUSystemOutputOverVoltThreshold OBJECT-TYPE + SYNTAX INTEGER (0..30) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold above which an output over voltage condition will be generated. + Specified as percent deviation from nominal." + ::= { xPDUSystemOutput 8 } + +xPDUSystemOutputUnderVoltThreshold OBJECT-TYPE + SYNTAX INTEGER (0..30) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold below which an output under voltage condition will be generated. + Specified as percent deviation from nominal." + ::= { xPDUSystemOutput 9 } + + +xPDUSystemOutputOverCurrentThreshold OBJECT-TYPE + SYNTAX INTEGER (0..100) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold above which an over current condition will be generated. + Specified as a percent of the panel breaker rating." + ::= { xPDUSystemOutput 10 } + +xPDUSystemOutputOverCurrentNeutralThreshold OBJECT-TYPE + SYNTAX INTEGER (0..100) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold above which an Over current neutral condition will be generated. + Specified as a percent of the panel breaker rating." + ::= { xPDUSystemOutput 11 } + +xPDUSystemOutputUnderCurrentThreshold OBJECT-TYPE + SYNTAX INTEGER (0..100) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold below which an under current condition will be generated. + Specified as a percent of the panel breaker rating." + ::= { xPDUSystemOutput 12 } + +xPDUSystemOutputTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of System Output phase entries." + ::= { xPDUSystemOutput 13 } + +xPDUSystemOutputTable OBJECT-TYPE + SYNTAX SEQUENCE OF XPDUSystemOutputPhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of system output table entries. + The number of entries is contained in the + xPDUSystemOutputTableSize OID." + ::= { xPDUSystemOutput 14 } + + xPDUSystemOutputPhaseEntry OBJECT-TYPE + SYNTAX XPDUSystemOutputPhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information applicable to a + particular system output phase." + INDEX { xPDUSystemOutputPhaseIndex } + ::= { xPDUSystemOutputTable 1 } + + XPDUSystemOutputPhaseEntry ::= SEQUENCE { + xPDUSystemOutputPhaseIndex INTEGER, + xPDUSystemOutputVoltageLtoL INTEGER, + xPDUSystemOutputVoltageLtoN INTEGER, + xPDUSystemOutputPhaseCurrent INTEGER, + xPDUSystemOutputPower INTEGER, + xPDUSystemOutputApparentPower INTEGER, + xPDUSystemOutputPowerFactor INTEGER + } + + xPDUSystemOutputPhaseIndex OBJECT-TYPE + SYNTAX INTEGER{ + phase1(1), + phase2(2), + phase3(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Description of each output phase entry in the table." + ::= { xPDUSystemOutputPhaseEntry 1 } + + xPDUSystemOutputVoltageLtoL OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Line-to-line system output voltage available at the cicuit panel. + Measured in tenths of Volts." + ::= { xPDUSystemOutputPhaseEntry 2 } + + xPDUSystemOutputVoltageLtoN OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Line-to-neutral system output voltage available at the cicuit panel. + Measured in tenths of Volts." + ::= { xPDUSystemOutputPhaseEntry 3 } + + + xPDUSystemOutputPhaseCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "System load current per phase. Measured in tenths of Amps." + ::= { xPDUSystemOutputPhaseEntry 4 } + + xPDUSystemOutputPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "System output power per phase. Measured in tenths of kW." + ::= { xPDUSystemOutputPhaseEntry 5 } + + xPDUSystemOutputApparentPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "System output power per phase. Measured in tenths of kVA." + ::= { xPDUSystemOutputPhaseEntry 6 } + + xPDUSystemOutputPowerFactor OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates the Power Factor of the system output per phase. + A value of 100 representing a unity Power Factor (1.00). + Measured in hundredths." + ::= { xPDUSystemOutputPhaseEntry 7 } + +xPDUGroundCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Shows the current measured in the earth ground conductor in tenths of Amps." + ::= { xPDUGroundMonitorPoint 1 } + +xPDUGroundCurrentThreshold OBJECT-TYPE + SYNTAX INTEGER (0..50) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold above which a ground current over current + condition will be generated. Measured in tenths of Amps." + ::= { xPDUGroundMonitorPoint 2 } + +-- System Breakers + +xPDUSystemBreakerTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of system breaker entries." + ::= { xPDUSystemBreakers 1 } + +xPDUSystemBreakerTable OBJECT-TYPE + SYNTAX SEQUENCE OF XPDUSystemBreakerTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of system breaker entries. + The number of entries is contained in the + xPDUSystemBreakerTableSize OID." + ::= { xPDUSystemBreakers 2 } + + xPDUSystemBreakerTableEntry OBJECT-TYPE + SYNTAX XPDUSystemBreakerTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information applicable to a + particular system breaker." + INDEX { xPDUSystemBreakerTableIndex } + ::= { xPDUSystemBreakerTable 1 } + + XPDUSystemBreakerTableEntry ::= SEQUENCE { + xPDUSystemBreakerTableIndex INTEGER, + xPDUSystemBreakerDescription DisplayString, + xPDUSystemBreakerPosition INTEGER + } + + xPDUSystemBreakerTableIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Index of system breaker entries in the table." + ::= { xPDUSystemBreakerTableEntry 1 } + +xPDUSystemBreakerDescription OBJECT-TYPE + SYNTAX DisplayString (SIZE (0..79)) + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A brief description of the system breakers." + ::= { xPDUSystemBreakerTableEntry 2 } + + xPDUSystemBreakerPosition OBJECT-TYPE + SYNTAX INTEGER { + open (1), + closed (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates whether this breaker is open(1) or closed(2)." + ::= { xPDUSystemBreakerTableEntry 3 } + +-- Branch Breakers (Breaker Panel) + +xPDUNumOfBranchBreakers OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of branch breakers in the Panel." + ::= { xPDUBranchBreakers 1 } + +-- Branch Breakers Table + +xPDUBranchBreakerTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of branch breaker entries." + ::= { xPDUBranchBreakers 2 } + +xPDUBranchBreakerTable OBJECT-TYPE + SYNTAX SEQUENCE OF XPDUBranchBreakerEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of branch breaker table entries. The + number of entries is given by the value of xPDUBranchBreakerTableSize + The number of entries is contained in the + xPDUBranchBreakerTableSize OID." + ::= { xPDUBranchBreakers 3 } + + xPDUBranchBreakerEntry OBJECT-TYPE + SYNTAX XPDUBranchBreakerEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information applicable to a + particular branch breaker." + INDEX { xPDUBranchBreakerTableIndex } + ::= { xPDUBranchBreakerTable 1 } + + XPDUBranchBreakerEntry ::= SEQUENCE { + xPDUBranchBreakerTableIndex INTEGER, + xPDUBranchBreakerRating INTEGER, + xPDUBranchBreakerRDPFeed INTEGER, + xPDUBranchBreakerTieIndicator INTEGER, + xPDUBranchBreakerCurrent INTEGER, + xPDUBranchBreakerOverCurrentThreshold INTEGER, + xPDUBranchBreakerUnderCurrentThreshold INTEGER + } + + xPDUBranchBreakerTableIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Index of branch breaker entries in the table." + ::= { xPDUBranchBreakerEntry 1 } + + xPDUBranchBreakerRating OBJECT-TYPE + SYNTAX INTEGER (0..100) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Indicates current rating of this breaker. + 0=Breaker is not present. + 1=Earth leakage connection. + 2=Neutral connection. + A value greater than 2 indicates breaker current rating in Amps." + ::= { xPDUBranchBreakerEntry 2 } + + xPDUBranchBreakerRDPFeed OBJECT-TYPE + SYNTAX INTEGER { + remoteDistribution (1), + noRemoteDistribution (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Indicates that a breaker position is feeding a remote + distribution panel." + ::= { xPDUBranchBreakerEntry 3 } + + xPDUBranchBreakerTieIndicator OBJECT-TYPE + SYNTAX INTEGER { + breakerTied (1), + breakerUntied (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Indicates whether or not the breaker pole is physically + connected to the breaker immediately below." + ::= { xPDUBranchBreakerEntry 4 } + + xPDUBranchBreakerCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates the branch current in tenths of Amps or -1 when not available." + ::= { xPDUBranchBreakerEntry 5 } + + xPDUBranchBreakerOverCurrentThreshold OBJECT-TYPE + SYNTAX INTEGER (0..100) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold above which a branch circuit over current + condition will be generated. + Specified as a percent of the branch breaker rating." + ::= { xPDUBranchBreakerEntry 6 } + + xPDUBranchBreakerUnderCurrentThreshold OBJECT-TYPE + SYNTAX INTEGER (0..100) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold below which a branch circuit under current + condition will be generated. + Specified as a percent of the branch breaker rating." + ::= { xPDUBranchBreakerEntry 7 } + +-- the xPDUInputContacts group + +xPDUInputContactNumContacts OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of contacts supported by the PDU." + ::= { xPDUInputContacts 1 } + +xPDUInputContactTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of input contact entries." + ::= { xPDUInputContacts 2 } + +xPDUInputContactTable OBJECT-TYPE + SYNTAX SEQUENCE OF XPDUInputContactEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of contacts supported by the PDU. + The number of entries is contained in the + xPDUInputContactTableSize OID." + ::= { xPDUInputContacts 3 } + +xPDUInputContactEntry OBJECT-TYPE + SYNTAX XPDUInputContactEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A contact entry containing information for a given contact." + INDEX { xPDUInputContactNumber } + ::= { xPDUInputContactTable 1 } + +XPDUInputContactEntry ::= + SEQUENCE { + xPDUInputContactNumber INTEGER, + xPDUInputContactName DisplayString, + xPDUInputContactNormalState INTEGER, + xPDUInputContactCurrentState INTEGER + } + +xPDUInputContactNumber OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An index identifying the contact on the PDU." + ::= { xPDUInputContactEntry 1 } + +xPDUInputContactName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The description of the purpose/use of the contact." + ::= { xPDUInputContactEntry 2 } + +xPDUInputContactNormalState OBJECT-TYPE + SYNTAX INTEGER { + open (1), + closed (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The normal operating position of the contact." + ::= { xPDUInputContactEntry 3 } + +xPDUInputContactCurrentState OBJECT-TYPE + SYNTAX INTEGER { + open (1), + closed (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This value indicates the current state of the contact." + ::= { xPDUInputContactEntry 4 } + +-- the xPDUOutputRelays group + +xPDUOutputRelaysNumRelays OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of output relays supported by the PDU." + ::= { xPDUOutputRelays 1 } + +xPDUOutputRelaysTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of output relay entries." + ::= { xPDUOutputRelays 2 } + +xPDUOutputRelayTable OBJECT-TYPE + SYNTAX SEQUENCE OF XPDUOutputRelayEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of output relays supported by the PDU. + The number of entries is contained in the + xPDUOutputRelayTableSize OID." + ::= { xPDUOutputRelays 3 } + +xPDUOutputRelayEntry OBJECT-TYPE + SYNTAX XPDUOutputRelayEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A output relay entry containing information for a given contact." + INDEX { xPDUOutputRelayNumber } + ::= { xPDUOutputRelayTable 1 } + +XPDUOutputRelayEntry ::= + SEQUENCE { + xPDUOutputRelayNumber INTEGER, + xPDUOutputRelayName DisplayString, + xPDUOutputRelayNormalState INTEGER, + xPDUOutputRelayCurrentState INTEGER + } + +xPDUOutputRelayNumber OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An index identifying the output relay on the PDU." + ::= { xPDUOutputRelayEntry 1 } + +xPDUOutputRelayName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The description of the purpose/use of the output relay." + ::= { xPDUOutputRelayEntry 2 } + +xPDUOutputRelayNormalState OBJECT-TYPE + SYNTAX INTEGER { + open (1), + closed (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The normal operating position of the output relay." + ::= { xPDUOutputRelayEntry 3 } + +xPDUOutputRelayCurrentState OBJECT-TYPE + SYNTAX INTEGER { + open (1), + closed (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This value indicates the current state of the output relay." + ::= { xPDUOutputRelayEntry 4 } + +-- the xPDUMiscGroup + +xPDUEPOMode OBJECT-TYPE + SYNTAX INTEGER { + armed (1), + disarmed (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates whether the EPO System is armed(1) or disarmed(2)." + ::= { xPDUMiscGroup 1 } + +xPDUTransformTempStatus OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + overtemp (2), + noTransformerPresent (3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates if the PDU's isolation transformer is over temperature." + ::= { xPDUMiscGroup 2 } + +xPDUCoolingFanStatus OBJECT-TYPE + SYNTAX INTEGER { + normal (1), + failed (2), + noCoolingFansPresent (3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates if one or more of the PDU's cooling fans have failed." + ::= { xPDUMiscGroup 3 } + +-- The xATSIdent group + +xATSIdentProductName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the transfer switch unit." + ::= { xATSIdent 1 } + +xATSIdentHardwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The hardware revision of the transfer switch. + This value is set at the factory." + ::= { xATSIdent 2 } + +xATSIdentFirmwareAppRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An ID string identifying the application firmware revision of the transfer switch." + ::= { xATSIdent 3 } + +xATSIdentFirmwareAppOSRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An ID string identifying the application operating system firmware revision of the transfer switch." + ::= { xATSIdent 4 } + +xATSIdentFirmwareControllerRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An ID string identifying the transfer switch controller firmware revision." + ::= { xATSIdent 5 } + +xATSIdentDateOfManufacture OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The date when the transfer switch was manufactured in mm/dd/yyyy format. + This value is set at the factory." + ::= { xATSIdent 6 } + +xATSIdentModelNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the model number of the transfer switch. + This value is set at the factory." + ::= { xATSIdent 7 } + +xATSIdentSerialNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the serial number of the transfer switch. + This value is set at the factory." + ::= { xATSIdent 8 } + +-- The xATSDevice group + +xATSDeviceServiceType OBJECT-TYPE + SYNTAX INTEGER { + threeWire (1), + fourWire (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The type of utility input to the transfer switch. + Either 3 wires (delta), or 4 wires (wye)." + ::= { xATSDevice 1 } + +xATSDeviceNominalVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The nominal line-to-neutral system voltage. + Measured in Volts, line-to-line for a 3-wire service or + line-to-neutral for a 4-wire service. -1 if not available." + ::= { xATSDevice 2 } + +xATSDeviceNominalFrequency OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The nominal system frequency. Measured in tenths of Hertz. + -1 if not available." + ::= { xATSDevice 3 } + +xATSDeviceTransferSwitchRating OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The rating of the transfer switch. + Measured in Amps." + ::= { xATSDevice 4 } + +xATSDeviceDCBackUpPresent OBJECT-TYPE + SYNTAX INTEGER{ + yes (1), + no (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Indicates if a DC backup is present or not." + ::= { xATSDevice 5 } + +-- The xATS Switch Status group + +xATSSwitchStatusSelectedSource OBJECT-TYPE + SYNTAX INTEGER{ + none (1), + source1 (2), + source2 (3), + fault (4), + unknown (5) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The source which is currently selected, i.e. supplying power to the load." + ::= { xATSSwitchStatus 1 } + +xATSSwitchStatusOperationalMode OBJECT-TYPE + SYNTAX INTEGER{ + automatic (1), + notInAutoAbnormal (2), + notInAuto (3), + unknown (4) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The current operating mode of the transfer switch. When the ATS is in + automatic mode, generator starting and ATS transferring is all done automatically + as needed based on the state of source 1. Automatic operation is halted when the + ATS is in either of the notInAuto modes. + A mode of notInAuto indicates that the automatic operation switch is in the + disabled position, as indicated by the xATSSwitchStatusAutomaticOperationSwitch OID. + The notInAutoAbnormal condition indicates that an abnormal + condition has caused the transfer switch to halt automatic operation. + In this case, traps can indicate the exact problem. In the case of + notInAutoAbnormal, refer to the operation manual for details + on how debug the condition and restore automatic operation." + ::= { xATSSwitchStatus 2 } + +xATSSwitchStatusAutomaticOperationSwitch OBJECT-TYPE + SYNTAX INTEGER{ + disabled (1), + enabled (2), + unknown (3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The position of the automatic operation switch on the front of the transfer switch." + ::= { xATSSwitchStatus 3 } + +xATSSwitchStatusEngineStartSignal OBJECT-TYPE + SYNTAX INTEGER{ + run (1), + stop (2), + unknown (3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The position of the Start/Stop contact which signals the generator + engine to start/run. When the ATS is in automatic mode, + generator starting/stopping is under ATS control." + ::= { xATSSwitchStatus 4 } + +-- The xATS Switch Setting group + +xATSSwitchSettingsLowVoltageTransferPoint OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The lowest acceptable voltage condition at source 1. + When any phase of source 1 is lower than this voltage, + source quality is considered bad and the generator run signal + is asserted to begin generator operation. + Specified in volts, line-to-line for a 3-wire service or + line-to-neutral for a 4-wire service. + -1 if not available." + ::= { xATSSwitchSettings 1 } + +xATSSwitchSettingsHighVoltageTransferPoint OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The highest acceptable voltage condition at source 1. + When any phase of source 1 is greater than this voltage, + source quality is considered bad and the generator run signal + is asserted to begin generator operation. + Specified in volts, line-to-line for a 3-wire service or + line-to-neutral for a 4-wire service. + -1 if not available." + ::= { xATSSwitchSettings 2 } + +xATSSwitchSettingsMaxFrequencyDeviation OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The maximum acceptable frequency deviation condition from nominal at source 1. + When source 1 frequency is outside the specified range, + source quality is considered bad and the generator run signal + is asserted to begin generator operation. + Specified in tenths of Hertz above or below nominal. + A value of zero indicates that frequency is ignored when + determining source quality. + -1 if not available." + ::= { xATSSwitchSettings 3 } + +xATSSwitchSettingsMinPhaseBalance OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The minimum required phase balance at source 1. + When the percentage difference between the minimum and maximum + phase voltage measurements at source 1 is greater than this value, + source quality is considered bad and the generator run signal + is asserted to begin generator operation. + Specified as a percentage. A value of zero indicates that phase balance + is ignored when determining source quality. + -1 if not available." + ::= { xATSSwitchSettings 4 } + +xATSSwitchSettingsNominalRotation OBJECT-TYPE + SYNTAX INTEGER{ + abc (1), + cba (2), + any (3), + unknown (4) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The nominal phase rotation (or phase sequence) required by the load. + For certain types of equipment, such as rotating machinery, phase rotation + is critical for proper operation as it determines the direction which motors + will rotate (clockwise or counterclockwise). + Source quality will be seen as bad if the rotation measured at that + ATS input does not match this setting. + If this setting is set to any, phase rotation is ignored." + ::= { xATSSwitchSettings 5 } + +xATSSwitchSettingsAllowClosedTransfer OBJECT-TYPE + SYNTAX INTEGER{ + yes (1), + no (2), + unknown (3) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This setting enables seemless (closed) transfers between sources. + When possible, both source 1 and source 2 are closed to the output + for a brief time. If closed transfer is not possible within the amount + of time specified by the xATSSwitchSettingsMaxSyncTime OID, + an open transfer will be executed." + ::= { xATSSwitchSettings 6 } + +xATSSwitchSettingsMaxSyncTime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "When attempting/seeking to perform a closed transfer, this setting defines + the maximum time allowed before the transfer switch will give up and perform + an open transfer. Specified in seconds. + -1 if not available." + ::= { xATSSwitchSettings 7 } + +xATSSwitchSettingsNeutralTransferTime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This setting defines how long both source 1 and source 2 will be + disconnected from the output, during an open transfer. + Specified in seconds. + -1 if not available." + ::= { xATSSwitchSettings 8 } + +xATSSwitchSettingsClearLatchedAlarms OBJECT-TYPE + SYNTAX INTEGER{ + yes (1), + no (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Clears any latched alarm conditions." + ::= { xATSSwitchSettings 9 } + +xATSSwitchSettingsSetToFactoryDefaults OBJECT-TYPE + SYNTAX INTEGER{ + yes (1), + no (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Sets all transfer switch settings to factory default values." + ::= { xATSSwitchSettings 10 } + + +-- The xATSSwitchTimers group + + xATSSwitchTimersTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of transfer switch timer entries." + ::= { xATSSwitchTimers 1 } + + xATSSwitchTimersTable OBJECT-TYPE + SYNTAX SEQUENCE OF XATSSwitchTimersEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of timers supported by ATS. + The number of entries is contained in the xATSSwitchTimersTableSize OID." + ::= { xATSSwitchTimers 2 } + + xATSSwitchTimersEntry OBJECT-TYPE + SYNTAX XATSSwitchTimersEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information about an individual ATS timer." + INDEX { xATSSwitchTimersIndex } + ::= { xATSSwitchTimersTable 1 } + + XATSSwitchTimersEntry ::= + SEQUENCE { + xATSSwitchTimersIndex INTEGER, + xATSSwitchTimersName DisplayString, + xATSSwitchTimersAbort INTEGER, + xATSSwitchTimersStatus INTEGER, + xATSSwitchTimersRemainingTime INTEGER, + xATSSwitchTimersDelaySetting INTEGER + } + +xATSSwitchTimersIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Index of timer entries in the table." + ::= { xATSSwitchTimersEntry 1 } + +xATSSwitchTimersName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Name of the individual timer.Refer to ATS operation manual, + or on-line help, for detailed descriptions of ATS timers." + ::= { xATSSwitchTimersEntry 2 } + +xATSSwitchTimersAbort OBJECT-TYPE + SYNTAX INTEGER{ + yes (1), + no (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This aborts the individual timer." + ::= { xATSSwitchTimersEntry 3 } + +xATSSwitchTimersStatus OBJECT-TYPE + SYNTAX INTEGER{ + inactive (1), + active (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the individual timer. Designates whether this timer + entry is currently running or inactive." + ::= { xATSSwitchTimersEntry 4 } + +xATSSwitchTimersRemainingTime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The time remaining for this timer entry. + Specified in seconds." + ::= { xATSSwitchTimersEntry 5 } + +xATSSwitchTimersDelaySetting OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The delay settings associated with this timer entry. + When this timer entry is active, the timer value must exceed this setting + before the ATS behavior associated with this timer is executed. + Refer to ATS operation manual, or on-line help, for detailed + descriptions of ATS timers." + ::= { xATSSwitchTimersEntry 6 } + +-- The xATSSwitchBlockMap group + + xATSSwitchBlockMapTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of blocking map entries, or how many ATS actions can be blocked." + ::= { xATSSwitchBlockMap 1 } + + xATSSwitchBlockMapTable OBJECT-TYPE + SYNTAX SEQUENCE OF XATSSwitchBlockMapEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of blocking maps supported by the ATS. + The number of entries is contained in the xATSSwitchBlockMapTableSize OID." + ::= { xATSSwitchBlockMap 2 } + + xATSSwitchBlockMapEntry OBJECT-TYPE + SYNTAX XATSSwitchBlockMapEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information about a specific ATS blocking map." + INDEX { xATSSwitchBlockMapIndex } + ::= { xATSSwitchBlockMapTable 1 } + + XATSSwitchBlockMapEntry ::= + SEQUENCE { + xATSSwitchBlockMapIndex INTEGER, + xATSSwitchBlockMapName DisplayString, + xATSSwitchBlockMapStatus INTEGER, + xATSSwitchBlockMapSetting INTEGER + } + + xATSSwitchBlockMapIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Index of blocking map entries in the table." + ::= { xATSSwitchBlockMapEntry 1 } + + xATSSwitchBlockMapName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A string describing the ATS action to be blocked." + ::= { xATSSwitchBlockMapEntry 2 } + + xATSSwitchBlockMapStatus OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Represents the status of this blocking map entry, in bit-mapped format. + A non-zero value indicates that this entry's ATS action is currently being blocked. + The bit(s) set indicate which input(s) are causing the blocking (bit0, bit1, etc). + + bit 0 - Contact 1 + bit 1 - Contact 2 + bit 2 - Contact 3 + bit 3 - Contact 4." + ::= { xATSSwitchBlockMapEntry 3 } + + xATSSwitchBlockMapSetting OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This setting designates the inputs that block the ATS action + The mapping is specified as a bit-field, where each bit set indicates + the input that blocks the ATS action associated with the entry. + + bit 0 - Contact 1 + bit 1 - Contact 2 + bit 2 - Contact 3 + bit 3 - Contact 4." + ::= { xATSSwitchBlockMapEntry 4 } + +-- The xATSSwitchStatistics group + + xATSSwitchStatisticsTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of transfer switch statistics entries." + ::= { xATSSwitchStatistics 1 } + + xATSSwitchStatisticsTable OBJECT-TYPE + SYNTAX SEQUENCE OF XATSSwitchStatisticsEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of statistics supported by ATS. + The number of entries is contained in the xATSSwitchStatisticsTableSize OID." + ::= { xATSSwitchStatistics 2 } + + xATSSwitchStatisticsEntry OBJECT-TYPE + SYNTAX XATSSwitchStatisticsEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information about an individual ATS statistic." + INDEX { xATSSwitchStatisticsIndex } + ::= { xATSSwitchStatisticsTable 1 } + + XATSSwitchStatisticsEntry ::= + SEQUENCE { + xATSSwitchStatisticsIndex INTEGER, + xATSSwitchStatisticsName DisplayString, + xATSSwitchStatisticsValue DisplayString, + xATSSwitchStatisticsReset INTEGER + } + + xATSSwitchStatisticsIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Index of ATS statistics entries in the table." + ::= { xATSSwitchStatisticsEntry 1 } + + xATSSwitchStatisticsName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This is the name of the ATS statistic associated with this entry." + ::= { xATSSwitchStatisticsEntry 2 } + + xATSSwitchStatisticsValue OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This is the value of the ATS statistic associated with this entry." + ::= { xATSSwitchStatisticsEntry 3 } + + xATSSwitchStatisticsReset OBJECT-TYPE + SYNTAX INTEGER{ + yes (1), + no (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This will reset the individual ATS statistic associated with this entry." + ::= { xATSSwitchStatisticsEntry 4 } + +-- The xATS Source 1 group + +xATSSource1Name OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "String used to identify source 1." + ::= { xATSSource1 1 } + +xATSSource1Position OBJECT-TYPE + SYNTAX INTEGER{ + open (1), + closed (2), + tripped (3), + unknown (4) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The current position of the switch at source 1." + ::= { xATSSource1 2 } + +xATSSource1Frequency OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The frequency at source 1 in tenths of Hertz. + -1 if unavailable." + ::= { xATSSource1 3 } + +xATSSource1Quality OBJECT-TYPE + SYNTAX INTEGER{ + sourceGood (1), + lowVoltage (2), + highVoltage (3), + phaseImbalance (4), + freqOutOfRange (5), + badRotation (6), + unknown (7) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The current line quality of source 1." + ::= { xATSSource1 4 } + +xATSSource1Rotation OBJECT-TYPE + SYNTAX INTEGER{ + abc (1), + cba (2), + unknown (3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The phase rotation measured at the source 1 input of the ATS. + The sequence is a reference to the order in which the three phases + pass the zero-crossing boundary in time." + ::= { xATSSource1 5 } + +xATSSource1TableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of input voltage entries at the source 1 input of the ATS." + ::= { xATSSource1 6 } + + xATSSource1Table OBJECT-TYPE + SYNTAX SEQUENCE OF XATSSource1PhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of voltage table entries for source 1. The number of + entries are the phase entries. The number of entries is contained in the + xATSSource1TableSize OID." + ::= { xATSSource1 7 } + + xATSSource1PhaseEntry OBJECT-TYPE + SYNTAX XATSSource1PhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information applicable to a + particular input voltage phase at the source 1 input of the ATS." + INDEX { xATSSource1Index } + ::= { xATSSource1Table 1 } + + XATSSource1PhaseEntry ::= SEQUENCE { + xATSSource1Index INTEGER, + xATSSource1VoltageLtoL INTEGER, + xATSSource1VoltageLtoN INTEGER + } + + xATSSource1Index OBJECT-TYPE + SYNTAX INTEGER{ + phase1(1), + phase2(2), + phase3(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Description of each phase utilized at source 1." + ::= { xATSSource1PhaseEntry 1 } + + xATSSource1VoltageLtoL OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Source 1 line-to-line input voltage. + Measured in tenths of Volts." + ::= { xATSSource1PhaseEntry 2 } + + xATSSource1VoltageLtoN OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Source 1 line-to-neutral input voltage. + Measured in tenths of Volts. -1 for a 3-wire service type." + ::= { xATSSource1PhaseEntry 3 } + +-- The xATS Source 2 group + +xATSSource2Name OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "String used to identify source 2." + ::= { xATSSource2 1 } + +xATSSource2Position OBJECT-TYPE + SYNTAX INTEGER{ + open (1), + closed (2), + tripped (3), + unknown (4) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The current position of the switch at source 2." + ::= { xATSSource2 2 } + +xATSSource2Frequency OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The frequency at source 2 in tenths of Hertz. + -1 if not available." + ::= { xATSSource2 3 } + +xATSSource2Quality OBJECT-TYPE + SYNTAX INTEGER{ + sourceGood (1), + lowVoltage (2), + highVoltage (3), + phaseImbalance (4), + freqOutOfRange (5), + badRotation (6), + unknown (7) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The current line quality of source 2." + ::= { xATSSource2 4 } + +xATSSource2Rotation OBJECT-TYPE + SYNTAX INTEGER{ + abc (1), + cba (2), + unknown (3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The phase rotation measured at the source 2 input of the ATS. + -1 if not available." + ::= { xATSSource2 5 } + +xATSSource2TableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of input voltage entries at the source 2 input of the ATS." + ::= { xATSSource2 6 } + + xATSSource2Table OBJECT-TYPE + SYNTAX SEQUENCE OF XATSSource2PhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of voltage table entries for the source 2. The number of + entries are the phase entries. The number of entries is contained in the + xATSSource2TableSize OID." + ::= { xATSSource2 7 } + + xATSSource2PhaseEntry OBJECT-TYPE + SYNTAX XATSSource2PhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information applicable to a + particular input voltage phase at the source 2 input of the ATS." + INDEX { xATSSource2Index } + ::= { xATSSource2Table 1 } + + XATSSource2PhaseEntry ::= SEQUENCE { + xATSSource2Index INTEGER, + xATSSource2VoltageLtoL INTEGER, + xATSSource2VoltageLtoN INTEGER + } + + xATSSource2Index OBJECT-TYPE + SYNTAX INTEGER{ + phase1(1), + phase2(2), + phase3(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Description of each phase utilized at the source 2." + ::= { xATSSource2PhaseEntry 1 } + + xATSSource2VoltageLtoL OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Source 2 line-to-line input voltage. + Measured in tenths of Volts." + ::= { xATSSource2PhaseEntry 2 } + + xATSSource2VoltageLtoN OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Source 2 line-to-neutral input voltage. + Measured in tenths of Volts. -1 for a 3-wire service type." + ::= { xATSSource2PhaseEntry 3 } + +-- The xATSSystemOutput + +xATSSystemOutputFrequency OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system output frequency in tenths of Hertz." + ::= { xATSSystemOutput 1 } + +xATSSystemOutputTotalPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Shows the total system output power in tenths of kW." + ::= { xATSSystemOutput 2 } + +xATSSystemOutputTotalApparentPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Shows the total system output power in tenths of kVA." + ::= { xATSSystemOutput 3 } + +xATSSystemOutputTotalPowerFactor OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates the total power factor of the system output. + A value of 100 representing a unity power factor (1.00) + Specified in hundredths." + ::= { xATSSystemOutput 4 } + +xATSSystemOutputFrequencyTolerance OBJECT-TYPE + SYNTAX INTEGER{ + freqToleranceOff (1), + freqTolerancePointTwo (2), + freqTolerancePointFive (3), + freqToleranceOne (4), + freqToleranceOnePointFive (5), + freqToleranceTwo (6), + freqToleranceThree (7), + freqToleranceFour (8), + freqToleranceFive (9), + freqToleranceNine (10) + + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Shows the panel output frequency tolerance in +/- Hertz." + ::= { xATSSystemOutput 5 } + +xATSSystemOutputOverVoltThreshold OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold above which an output over voltage condition will be generated. + Specified as tenths of percent deviation from nominal. + A value of zero indicates that the threshold is disabled." + ::= { xATSSystemOutput 6 } + +xATSSystemOutputUnderVoltThreshold OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold below which an output under voltage condition will be generated. + Specified as tenths of percent deviation from nominal. + A value of zero indicates that the threshold is disabled." + ::= { xATSSystemOutput 7 } + +xATSSystemOutputOverCurrentThreshold OBJECT-TYPE + SYNTAX INTEGER (0..100) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold above which an over current condition will be generated. + Specified as a percent of the transfer switch rating (xATSDeviceTransferSwitchRating OID). + A value of zero indicates that the threshold is disabled." + ::= { xATSSystemOutput 8 } + +xATSSystemOutputUnderCurrentThreshold OBJECT-TYPE + SYNTAX INTEGER (0..100) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold below which an under current condition will be generated. + Specified as a percent of the transfer switch rating (xATSDeviceTransferSwitchRating OID). + A value of zero indicates that the threshold is disabled." + ::= { xATSSystemOutput 9 } + +xATSSystemOutputAlarmDelayThreshold OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Delay the generation of an output alarm. + Specified in seconds." + ::= { xATSSystemOutput 10 } + +xATSSystemOutputTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of system output phase entries." + ::= { xATSSystemOutput 11 } + +xATSSystemOutputTable OBJECT-TYPE + SYNTAX SEQUENCE OF XATSSystemOutputPhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of system output table entries. + The number of entries is contained in the xATSSystemOutputTableSize OID." + ::= { xATSSystemOutput 12 } + + xATSSystemOutputPhaseEntry OBJECT-TYPE + SYNTAX XATSSystemOutputPhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information applicable to a + particular system output phase." + INDEX { xATSSystemOutputPhaseIndex } + ::= { xATSSystemOutputTable 1 } + + XATSSystemOutputPhaseEntry ::= SEQUENCE { + xATSSystemOutputPhaseIndex INTEGER, + xATSSystemOutputVoltageLtoL INTEGER, + xATSSystemOutputVoltageLtoN INTEGER, + xATSSystemOutputPhaseCurrent INTEGER, + xATSSystemOutputPower INTEGER, + xATSSystemOutputApparentPower INTEGER, + xATSSystemOutputPowerFactor INTEGER + } + + xATSSystemOutputPhaseIndex OBJECT-TYPE + SYNTAX INTEGER{ + phase1(1), + phase2(2), + phase3(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Description of each system output phase utilized in this device." + ::= { xATSSystemOutputPhaseEntry 1 } + + xATSSystemOutputVoltageLtoL OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Line-to-line system output voltage, measured in tenths of Volts, available at the circuit panel. + -1 if not available." + ::= { xATSSystemOutputPhaseEntry 2 } + + xATSSystemOutputVoltageLtoN OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Line-to-neutral system output voltage, measured in tenths of Volts, available at the circuit panel. + -1 for a 3-wire service type or if not available." + ::= { xATSSystemOutputPhaseEntry 3 } + + xATSSystemOutputPhaseCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "System load current per phase. Measured in Amps. + -1 if not available." + ::= { xATSSystemOutputPhaseEntry 4 } + + xATSSystemOutputPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "System output power per phase. Measured in tenths of kW." + ::= { xATSSystemOutputPhaseEntry 5 } + + xATSSystemOutputApparentPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "system output power per phase. Measured in tenths of kVA." + ::= { xATSSystemOutputPhaseEntry 6 } + + xATSSystemOutputPowerFactor OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "indicates the power factor of the system output per phase. + A value of 100 representing a unity power factor (1.00). + Measured in hundredths." + ::= { xATSSystemOutputPhaseEntry 7 } + +-- xATS TestingStatus group + +xATSTestingStatusSelectTestProcess OBJECT-TYPE + SYNTAX INTEGER { + engineStartTest (1), + systemLoadTest (2), + generatorHoldTest (3), + cancelTest (4) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Type of tests that can be selected when no test has been scheduled. + engineStartTest and systemLoadTest may be selected when no tests + are running. Tests that are selected may be cancelled manually." + ::= { xATSTestingStatus 1 } + +xATSTestingStatusTestStatus OBJECT-TYPE + SYNTAX INTEGER { + noTestInProcess (1), + testPending (2), + startingEngine (3), + engineWarmingUp (4), + awaitingTransferToS2 (5), + testingWithLoad (6), + awaitingRetransferToS1 (7), + testingWithoutLoad (8), + stoppingEngine (9), + holdingOnGenerator (10) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The present system test status/state." + ::= { xATSTestingStatus 2 } + +xATSTestingStatusProfileWarmupTime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The amount of time that the generator will warm up during a test. + This is portion of the test when the xATSTestingStatusTestStatus + OID returns the value engineWarmingUp. + Specified in seconds." + ::= { xATSTestingStatus 3 } + +xATSTestingStatusProfileLoadedTime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The amount of time that ATS will apply the system load to the generator + during a system load test. + This is portion of the test when the xATSTestingStatusTestStatus + OID returns the value testingWithLoad. + Specified in minutes." + ::= { xATSTestingStatus 4 } + +xATSTestingStatusProfileUnloadedTime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The amount of time that the generator will run following the warm up + portion of a start test, or the loaded portion of a load test. + This is portion of the test when the xATSTestingStatusTestStatus + OID returns the value testingWithoutLoad. + Specified in seconds." + ::= { xATSTestingStatus 5 } + +-- xATS TestingResults group + +xATSTestingResultsLastDateOfTest OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Date of the last test that was performed, either scheduled or manual. + Test results are available in the xATSTestingResultsLastResult OID. + Specified in the dd/mm/yyyy format, or 'none' if not available." + ::= { xATSTestingResults 1 } + +xATSTestingResultsLastResult OBJECT-TYPE + SYNTAX INTEGER { + startTestPassed (1), + loadTestPassed (2), + startSignalFailure (3), + failedGenNotInAuto (4), + failedGenEmerStop (5), + failedGenShutdown (6), + failedGenDidNotStart (7), + failedS2NeverGood (8), + genFailedDuringWarmup (9), + failureOnXferToS1 (10), + genFailedLoaded (11), + failureOnRexferToS2 (12), + genFailedToStop (13), + failedAtsInternalFault (14), + failedAtsNotInAuto (15), + cancelledManualTest (16), + cancelledScheduledTest (17) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The result of the last ATS/generator system test." + ::= { xATSTestingResults 2 } + +xATSTestingResultsTestLastTestTime OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Time of day at which the last test was performed, either scheduled or manual. + Test results are available in the xATSTestingResultsLastResult OID. + Specified in the hh:mm:ss format, or 'none' if not available." + ::= { xATSTestingResults 3 } + +xATSTestingResultsLastCrankDuration OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The time spent cranking the generator before it started during the last test. + Specified in seconds, or -1 if not available." + ::= { xATSTestingResults 4 } + +xATSTestingResultsLastWarmupDuration OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The time spent in the engineWarmingUp state during the last system test. + Specified in seconds, or -1 if not available." + ::= { xATSTestingResults 5 } + +xATSTestingResultsLastLoadedDuration OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The time spent in the testingWithLoad state during the last system test. + Specified in seconds, or -1 if not available." + ::= { xATSTestingResults 6 } + +xATSTestingResultsLastUnloadedDuration OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The time spent in the testingWithoutLoad state during the last system test. + Specified in seconds, or -1 if not available." + ::= { xATSTestingResults 7 } + +-- xATS TestingSchedule group + +xATSTestingScheduleFrequency OBJECT-TYPE + SYNTAX INTEGER { + never (1), + daily (2), + weekly (3), + monthly (4) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The frequency of running scheduled tests." + ::= { xATSTestingSchedule 1 } + +xATSTestingScheduleTestDay OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The desired day for the scheduled test. This object applies only + when the xATSTestingScheduleFrequency OID is set to weekly or monthly. + For weekly test frequency, the string is the day the test will be run. + For monthly test frequency, the string indicates the day, + and the instance within the month. + For example, for monthly frequency: 2nd sunday, 3rd monday, 4th tuesday, + for weekly frequency: sunday, monday, tuesday." + ::= { xATSTestingSchedule 2 } + +xATSTestingScheduleTestTime OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The time of day that the scheduled test will occur. + Specified in the format hh:mm." + ::= { xATSTestingSchedule 3 } + +xATSTestingScheduleTestWithLoadInterval OBJECT-TYPE + SYNTAX INTEGER { + applyLoadEveryTest (1), + neverApplyLoad (2), + applyLoadMonthly (3), + applyLoadMonthlyDetailed (4) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This setting specifies which system tests should include applying the + load to the generator. The applyLoadMonthlyDetailed entry + in the list will apply load once, for each month represented in the + xATSTestingScheduleTestWithLoadSelectMonth OID." + ::= { xATSTestingSchedule 4 } + +xATSTestingScheduleTestWithLoadSelectMonth OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The detailed selection for testing with load on a month-by-month basis. + This object is applicable when the xATSTestingScheduleTestWithLoadInterval + is set to applyLoadMonthlyDetailed. Otherwise this selection will be ignored. + Format for this string is a comma-separated entry of months. + For example: Jan,Mar,Dec. + The string will return 'No Months Scheduled' if no months have been selected." + ::= { xATSTestingSchedule 5 } + +xATSTestingScheduleNextTestDate OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The date of the next scheduled test, in the format dd-mmm-yyyy." + ::= { xATSTestingSchedule 6 } + +-- xATSTestingSimulatePowerFail group + +xATSTestingSimulatePowerFailTest OBJECT-TYPE + SYNTAX INTEGER{ + cancelSimulation (1), + fiveSecondsSimulation (2), + tenSecondsSimulation (3), + thirtySecondsSimulation (4), + oneMinuteSimulation (5), + threeMinutesSimulation (6), + fiveMinutesSimulation (7), + tenMinutesSimulation (8) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This object executes a simulated power failure for the duration indicated. + Simulation can be aborted by selecting cancelSimulation." + ::= { xATSTestingSimulatePowerFail 1 } + +xATSTestingSimulatePowerFailTimeRemaining OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates the time remaining in seconds, for a simulated power failure. + a value of zero indicates that simulated power failure is not active." + ::= { xATSTestingSimulatePowerFail 2 } + +-- The xATS Input Contact group + +xATSInputContactNumContacts OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of contacts supported by the ATS." + ::= { xATSInputContacts 1 } + +xATSInputContactTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of input contact entries." + ::= { xATSInputContacts 2 } + +xATSInputContactTable OBJECT-TYPE + SYNTAX SEQUENCE OF XATSContactEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of contacts supported by the ATS. + The number of entries is contained in the + xATSInputContactTableSize OID." + ::= { xATSInputContacts 3 } + + xATSInputContactEntry OBJECT-TYPE + SYNTAX XATSContactEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A contact entry containing information for a given contact." + INDEX { xATSInputContactNumber } + ::= { xATSInputContactTable 1 } + + XATSContactEntry ::= + SEQUENCE { + xATSInputContactNumber INTEGER, + xATSInputContactName DisplayString, + xATSInputContactNormalState INTEGER, + xATSInputContactCurrentState INTEGER + } + + xATSInputContactNumber OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An index identifying the contact on the ATS." + ::= { xATSInputContactEntry 1 } + + xATSInputContactName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The description of the purpose/use of the contact." + ::= { xATSInputContactEntry 2 } + + xATSInputContactNormalState OBJECT-TYPE + SYNTAX INTEGER { + open (1), + closed (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The normal operating position of the contact." + ::= { xATSInputContactEntry 3 } + + xATSInputContactCurrentState OBJECT-TYPE + SYNTAX INTEGER { + open (1), + closed (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This value indicates the current state of the contact." + ::= { xATSInputContactEntry 4 } + +-- the xATS OutputRelays group + + xATSOutputRelayNumRelays OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of output relays supported by the ATS." + ::= { xATSOutputRelays 1 } + + xATSOutputRelayTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of output relay entries." + ::= { xATSOutputRelays 2 } + + xATSOutputRelayTable OBJECT-TYPE + SYNTAX SEQUENCE OF XATSOutputRelayEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of output relays supported by the ATS. + The number of entries is contained in the + xATSOutputRelayTableSize OID." + ::= { xATSOutputRelays 3 } + + xATSOutputRelayEntry OBJECT-TYPE + SYNTAX XATSOutputRelayEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A output relay entry containing information for a given contact." + INDEX { xATSOutputRelayNumber } + ::= { xATSOutputRelayTable 1 } + + XATSOutputRelayEntry ::= + SEQUENCE { + xATSOutputRelayNumber INTEGER, + xATSOutputRelayName DisplayString, + xATSOutputRelayNormalState INTEGER, + xATSOutputRelayCurrentState INTEGER + } + + xATSOutputRelayNumber OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An index identifying the output relay on the ATS." + ::= { xATSOutputRelayEntry 1 } + + xATSOutputRelayName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The description of the purpose/use of the output relay." + ::= { xATSOutputRelayEntry 2 } + + xATSOutputRelayNormalState OBJECT-TYPE + SYNTAX INTEGER { + open (1), + closed (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The normal operating position of the output relay." + ::= { xATSOutputRelayEntry 3 } + + xATSOutputRelayCurrentState OBJECT-TYPE + SYNTAX INTEGER { + open (1), + closed (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This value indicates the current state of the output relay." + ::= { xATSOutputRelayEntry 4 } + +-- The xATS Generator Ident group + +xATSGeneratorIdentModelNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the model number of the generator. + This value is set at the factory." + ::= { xATSGeneratorIdent 1 } + +xATSGeneratorIdentSerialNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the serial number of the generator. + This value is set at the factory." + ::= { xATSGeneratorIdent 2 } + +xATSGeneratorIdentDateofManufacture OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying when the generator was manufactured in mm/dd/yyyy format. + This value is set at the factory." + ::= { xATSGeneratorIdent 3 } + +xATSGeneratorIdentVoltageConfiguration OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The voltage for which the generator's alternator is designed. + Specified in Volts line-to-line." + ::= { xATSGeneratorIdent 4 } + +xATSGeneratorIdentMaxPowerRating OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The max power rating of the generator. Specified in kW." + ::= { xATSGeneratorIdent 5 } + +xATSGeneratorIdentAlternatorFrequency OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The frequency for which the generator's alternator is designed. + Specified in Hertz." + ::= { xATSGeneratorIdent 6 } + +-- The xATS Generator Status group + +xATSGeneratorStatusGeneratorName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name or label for the generator connected to the source 2 of the ATS." + ::= { xATSGeneratorStatus 1 } + +xATSGeneratorStatusOperational OBJECT-TYPE + SYNTAX INTEGER{ + nocomm (1), + off (2), + ready (3), + starting (4), + idle (5), + running (6), + normalStop (7), + emergencyStop (8), + notInAuto (9), + shutdown (10), + unknown (11) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The operational status of the generator. unavailable when unrecognized status is received." + ::= { xATSGeneratorStatus 2 } + +xATSGeneratorStatusModeSwitchPosition OBJECT-TYPE + SYNTAX INTEGER{ + off (1), + manual (2), + automatic (3), + unknown (4) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The position of the generator's auto-mode switch. + In automatic mode, the generator is started and stopped via the + remote start contact, which has state indicated in the + xATSGeneratorStatusRemoteStart OID. + In manual mode generator start/stop control is via local command only. + Off prevents the generator from running." + ::= { xATSGeneratorStatus 3 } + +xATSGeneratorStatusRemoteStart OBJECT-TYPE + SYNTAX INTEGER{ + stop (1), + run (2), + unknown (3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the generator's remote start contact, which is + provided as an output from the transfer switch to start/stop the + generator when in automatic mode." + ::= { xATSGeneratorStatus 4 } + +-- The xATS Generator Advanced Status group + +xATSGeneratorAdvStatusBatteryVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The voltage of the generator's starting battery. + Measured in tenths of VDC, or -1 if not available." + ::= { xATSGeneratorAdvStatus 1 } + +xATSGeneratorAdvStatusOilPressure OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The generator's engine oil pressure. + Measured in tenths of Psi or kPa, based on the + value of the xATSGeneratorSettingsMetricUnit OID, + or -1 if not available." + ::= { xATSGeneratorAdvStatus 2 } + +xATSGeneratorAdvStatusCoolantTemperature OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Current coolant temperature in the generator. + Measured in degrees Celsius or Fahrenheit, based on the + value of the xATSGeneratorSettingsMetricUnit OID, + or -1 if not available." + ::= { xATSGeneratorAdvStatus 3 } + +xATSGeneratorAdvStatusEngineRPM OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Current engine speed of the generator. + Measured in RPM, or -1 if not available." + ::= { xATSGeneratorAdvStatus 4 } + +xATSGeneratorAdvStatusOilLevel OBJECT-TYPE + SYNTAX INTEGER{ + ok (1), + low (2), + unknown (3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates adequate oil level in the generator." + ::= { xATSGeneratorAdvStatus 5 } + +xATSGeneratorAdvStatusCoolantLevel OBJECT-TYPE + SYNTAX INTEGER{ + ok (1), + low (2), + unknown (3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates adequate coolant level in the generator." + ::= { xATSGeneratorAdvStatus 6 } + +-- The xATS Generator Output group + +xATSGeneratorOutputFrequency OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The output frequency of the generator. + Measured in tenths of Hertz, or -1 if not avaialble." + ::= { xATSGeneratorOutput 1 } + +xATSGeneratorOutputTotalPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The total output power of the generator. + Measured in tenths of tenths of kW, or -1 if not avaialble." + ::= { xATSGeneratorOutput 2 } + +xATSGeneratorOutputTotalApparentPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The total output power of the generator. + Measured in tenths of kVA, or -1 if not avaialble." + ::= { xATSGeneratorOutput 3 } + +xATSGeneratorOutputTotalPowerFactor OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates the total load power factor of the generator. + A value of 100 representing a unity power factor (1.00), + or -1 when if not avaialble." + ::= { xATSGeneratorOutput 4 } + +xATSGeneratorOutputTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of generator output phase entries." + ::= { xATSGeneratorOutput 5 } + + xATSGeneratorOutputTable OBJECT-TYPE + SYNTAX SEQUENCE OF XATSGeneratorOutputPhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of generator output table entries. + The number of entries is contained in the xATSGeneratorOutputTableSize OID." + ::= { xATSGeneratorOutput 6 } + + xATSGeneratorOutputPhaseEntry OBJECT-TYPE + SYNTAX XATSGeneratorOutputPhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information applicable to a + particular generator output phase." + INDEX { xATSGeneratorOutputPhaseIndex } + ::= { xATSGeneratorOutputTable 1 } + + XATSGeneratorOutputPhaseEntry ::= SEQUENCE { + xATSGeneratorOutputPhaseIndex INTEGER, + xATSGeneratorOutputVoltageLtoL INTEGER, + xATSGeneratorOutputVoltageLtoN INTEGER, + xATSGeneratorOutputPhaseCurrent INTEGER, + xATSGeneratorOutputPower INTEGER, + xATSGeneratorOutputApparentPower INTEGER, + xATSGeneratorOutputPowerFactor INTEGER + } + + xATSGeneratorOutputPhaseIndex OBJECT-TYPE + SYNTAX INTEGER{ + phase1(1), + phase2(2), + phase3(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Description of each generator output phase utilized in this device." + ::= { xATSGeneratorOutputPhaseEntry 1 } + + xATSGeneratorOutputVoltageLtoL OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Line-to-line generator output voltage. + Measured in Volts, or -1 if not available." + ::= { xATSGeneratorOutputPhaseEntry 2 } + + xATSGeneratorOutputVoltageLtoN OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Line-to-neutral generator output voltage. + Measured in volts, or -1 if not avaialble." + ::= { xATSGeneratorOutputPhaseEntry 3 } + + xATSGeneratorOutputPhaseCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Generator load current per phase. + Measured in Amps, or -1 if not avaialble." + ::= { xATSGeneratorOutputPhaseEntry 4 } + + xATSGeneratorOutputPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Generator output power per phase. + Measured in tenths of kW, or -1 if not avaialble." + ::= { xATSGeneratorOutputPhaseEntry 5 } + + xATSGeneratorOutputApparentPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Generator output power per phase. + Measured in tenths of kVA, or -1 if not available." + ::= { xATSGeneratorOutputPhaseEntry 6 } + + xATSGeneratorOutputPowerFactor OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates the load power factor of the generator output per phase. + A value of 100 representing a unity power factor (1.00), + or -1 if not avaialble." + ::= { xATSGeneratorOutputPhaseEntry 7 } + +-- xATS Generator Settings group + +xATSGeneratorSettingsVoltageAdjust OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The voltage adjust of the generator. + Specified in volts line-to-line, + or -1 if not available." + ::= { xATSGeneratorSettings 1 } + +xATSGeneratorSettingsFrequencyAdjust OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The frequency adjust of the generator. + Specified in tenths of Hertz." + ::= { xATSGeneratorSettings 2 } + +xATSGeneratorSettingsStartDelay OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The delay, in seconds, after the remote run signal is activated + before the generator's engine will be cranked to start, + or -1 if not available." + ::= { xATSGeneratorSettings 3 } + +xATSGeneratorSettingsStopDelay OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The delay, in seconds, before the generator will stop + after the remote run signal is deactivated, + or -1 if not available." + ::= { xATSGeneratorSettings 4 } + +xATSGeneratorSettingsCrankCycleEnable OBJECT-TYPE + SYNTAX INTEGER{ + disabled (1), + enabled (2), + unknown (3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "When Crank Cycle is enabled, the engine will be cranked up to the time + specified by the xATSGeneratorSettingsCrankTime OID. + If the generator's engine does not start, there will be a pause as + specified by the xATSGeneratorSettingsCrankRestTime OID before the + engine will be cranked again. This cycle is repeated as specified by + the xATSGeneratorSettingsNumberCrank OID. + When crank cycle is disabled, the generator's engine will be + cranked continuously until it starts." + ::= { xATSGeneratorSettings 5 } + +xATSGeneratorSettingsCrankTime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The duration of engine cranking, in seconds, when starting the generator. + Applicable when the xATSGeneratorSettingsCrankCycleEnable OID is enabled. + -1 if not available." + ::= { xATSGeneratorSettings 6 } + +xATSGeneratorSettingsCrankRestTime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The pause duration, in seconds, following an unsuccessful attempt to start the generator. + Applicable when the xATSGeneratorSettingsCrankCycleEnable OID is enabled. + -1 if not available." + ::= { xATSGeneratorSettings 7 } + +xATSGeneratorSettingsNumberCrank OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of failed crank attempts before giving up on starting the generator. + Applicable when the xATSGeneratorSettingsCrankCycleEnable OID is enabled. + -1 if not available." + ::= { xATSGeneratorSettings 8 } + +xATSGeneratorSettingsMetricUnit OBJECT-TYPE + SYNTAX INTEGER{ + disabled (1), + enabled (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Specifies the use of metric units in generator related OIDs, as well + as on all other interfaces including the generator's local interface." + ::= { xATSGeneratorSettings 9 } + +-- xATS generator service group + +xATSGeneratorServiceTotalRunHoursLifetime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Total time that the generator engine has been run, + over the life of the generator. Measured in hours. + -1 if not available." + ::= { xATSGeneratorService 1 } + +xATSGeneratorServiceEngineStartsLifetime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Number of engine starts over the life of the generator. + -1 if not available." + ::= { xATSGeneratorService 2 } + +xATSGeneratorServiceTotalkWhLifetime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Total kWh of operation over the life of the generator. + -1 if not available." + ::= { xATSGeneratorService 3 } + +xATSGeneratorServiceTotalRunHoursSinceMaintanence OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Total time that the generator engine has been run, + since last service maintenance. Measured in tenths of hours. + -1 if not available." + ::= { xATSGeneratorService 4 } + +xATSGeneratorServiceEngineStartsSinceMaintanence OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Number of engine starts since last service maintenance. + -1 if not available." + ::= { xATSGeneratorService 5 } + +xATSGeneratorServiceTotalkWhMaintanence OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Total kWh of operation since last service maintenance. + -1 if not available." + ::= { xATSGeneratorService 6 } + +xATSGeneratorServiceResetRecord OBJECT-TYPE + SYNTAX INTEGER{ + yes (1), + no (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Resets the engine start counter, engine run-hours, and kWh values that have + accumulated in the generator since last maintenance. + Also, the last service date will be reset to the current system date, and + any service alarms will be cleared." + ::= { xATSGeneratorService 7 } + +xATSGeneratorServiceRecordResetDate OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Date at which the generator's service record was reset, in dd-mmm-yyyy format." + ::= { xATSGeneratorService 8 } + +xATSGeneratorServiceNextServiceDate OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Date at which the next generator service is due in dd-mmm-yyyy format. + Based on the xATSGeneratorServiceCalendarIntervalThreshold OID + or '' if the calander-based threshold is set to off." + ::= { xATSGeneratorService 9 } + +xATSGeneratorServiceRunHoursUntilServiceDate OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Runhours until the next generator service is due, in hours. + Based on the xATSGeneratorServiceRunHoursThreshold OID + or -1 if the runhour-based threshold is set to off." + ::= { xATSGeneratorService 10 } + +xATSGeneratorServiceRunHoursThreshold OBJECT-TYPE + SYNTAX INTEGER{ + disabled (1), + runThreshold100Hours (2), + runThreshold150Hours (3), + runThreshold200Hours (4), + runThreshold250Hours (5), + runThreshold300Hours (6), + runThreshold400Hours (7), + runThreshold500Hours (8) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Runhour-based service interval. When the run-hours since + service surpasses this threshold, generator service is due." + ::= { xATSGeneratorService 11 } + +xATSGeneratorServiceCalendarIntervalThreshold OBJECT-TYPE + SYNTAX INTEGER{ + disabled (1), + interval1month (2), + interval2month (3), + interval3month (4), + interval6month (5), + intervalyearly (6) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Calander-based service interval. When the next service date, + as indicated by the xATSGeneratorServiceNextServiceDate OID + is in the past, generator is due for service." + ::= { xATSGeneratorService 12 } + +-- The xATS Generator Fuel system group + +xATSGeneratorFuelSystemType OBJECT-TYPE + SYNTAX INTEGER{ + diesel (1), + propane (2), + naturalGas (3), + unknown (4) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The type of fuel used by the generator." + ::= { xATSGeneratorFuelSystem 1 } + +xATSGeneratorFuelSystemTankSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Size of the generator's fuel tank. + Specified in gallons or liters, based on the value of the + xATSGeneratorSettingsMetricUnit OID, or -1 if not available." + ::= { xATSGeneratorFuelSystem 2 } + +xATSGeneratorFuelSystemFuelLevel OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Fuel remaining in the generator tank. + Measured in percent of tank fill, or -1 if if not available." + ::= { xATSGeneratorFuelSystem 3 } + +xATSGeneratorFuelSystemRuntimePower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The power value used in the runtime remaining calculation. + Measured in tenths of kW, or -1 if not available." + ::= { xATSGeneratorFuelSystem 4 } + +xATSGeneratorFuelSystemEstimatedRunTime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An estimate of available runtime for the generator, based on + available fuel as specified in the xATSGeneratorFuelSystemFuelLevel OID + and kW load as specified in the xATSGeneratorFuelSystemRuntimePower OID. + Measured in tenths of hours, or -1 if not available." + ::= { xATSGeneratorFuelSystem 5 } + +xATSGeneratorFuelSystemLowRunTimeThreshold OBJECT-TYPE + SYNTAX INTEGER{ + disabled (1), + oneHour (2), + twoHours (3), + threeHours (4), + fourHours (5), + fiveHours (6), + sixHours (7), + twelveHours (8), + oneDay (9), + twoDays (10), + threeDays (11), + fourDays (12), + fiveDays (13), + sixDays (14), + sevenDays (15) + + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold below which a low runtime alarm will exist." + ::= { xATSGeneratorFuelSystem 6 } + +xATSGeneratorFuelSystemVeryLowRunTimeThreshold OBJECT-TYPE + SYNTAX INTEGER{ + disabled (1), + oneHour (2), + twoHours (3), + threeHours (4), + fourHours (5), + fiveHours (6), + sixHours (7), + twelveHours (8), + oneDay (9), + twoDays (10), + threeDays (11), + fourDays (12), + fiveDays (13), + sixDays (14), + sevenDays (15) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold below which a very low runtime alarm will exist." + ::= { xATSGeneratorFuelSystem 7 } + +xATSGeneratorFuelSystemLowFuelLevelThreshold OBJECT-TYPE + SYNTAX INTEGER (0..100) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold below which a low fuel alarm will exist, with a value of 0 indicating disabled. + Specified as percent of tank fill." + ::= { xATSGeneratorFuelSystem 8 } + +xATSGeneratorFuelSystemVeryLowFuelLevelThreshold OBJECT-TYPE + SYNTAX INTEGER (0..100) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold below which a very low fuel alarm will exist, with a value of 0 indicating disabled. + Specified as percent of tank fill." + ::= { xATSGeneratorFuelSystem 9 } + +-- the software group +-- the powerNetSubAgent group +-- the powerNetSoftwareSystem group + +powerNetSoftwareSystemDescription OBJECT-TYPE + SYNTAX DisplayString (SIZE (0..79)) + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A brief description of the PowerNet sub-agent." + ::= { powerNetSoftwareSystem 1 } + +powerNetSoftwareOid OBJECT-TYPE + SYNTAX OBJECT IDENTIFIER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The object identifier of the PowerNet sub-agent." + ::= { powerNetSoftwareSystem 2 } + +-- powerNetSmuxPeer OBJECT IDENTIFIER ::= { powerNetSoftwareOid 1 } +-- powerNetDPIPeer OBJECT IDENTIFIER ::= { powerNetSoftwareOid 2 } + +powerNetSoftwareSystemUpTime OBJECT-TYPE + SYNTAX TimeTicks + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The time that the sub-agent has been running." + ::= { powerNetSoftwareSystem 3 } + + +-- powerNetSoftwareConfig group + +powerNetSoftwareTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of software modules supporting the UPS." + ::= { powerNetSoftwareConfig 1 } + +powerNetSoftwareTable OBJECT-TYPE + SYNTAX SEQUENCE OF SoftwareEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of the software monitoring the UPS." + ::= { powerNetSoftwareConfig 2 } + +powerNetSoftwareEntry OBJECT-TYPE + SYNTAX SoftwareEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information on a software module." + INDEX { moduleNumber } + ::= { powerNetSoftwareTable 1 } + +SoftwareEntry ::= + SEQUENCE { + moduleNumber + INTEGER, + moduleName + DisplayString, + moduleVersion + DisplayString, + moduleDate + DisplayString + } + +moduleNumber OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index into the Software Entry Table" + ::= { powerNetSoftwareEntry 1 } + +moduleName OBJECT-TYPE + SYNTAX DisplayString (SIZE (0..79)) + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the software module." + ::= { powerNetSoftwareEntry 2 } + +moduleVersion OBJECT-TYPE + SYNTAX DisplayString (SIZE (0..8)) + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The version of the software module." + ::= { powerNetSoftwareEntry 3 } + +moduleDate OBJECT-TYPE + SYNTAX DisplayString (SIZE (0..9)) + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The date of the software module represented as mm-dd-yy." + ::= { powerNetSoftwareEntry 4 } + + +-- the ups group +-- the upsIdent group +-- the upsBasicIdent + +upsBasicIdentModel OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The UPS model name (e.g. 'APC Smart-UPS 600')." + ::= { upsBasicIdent 1 } + +upsBasicIdentName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "An 8 byte ID string identifying the UPS. This object + can be set by the administrator." + ::= { upsBasicIdent 2 } + + +-- the upsAdvIdent group + +upsAdvIdentFirmwareRevision OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The firmware revision of the UPS system's microprocessor." + ::= { upsAdvIdent 1 } + +upsAdvIdentDateOfManufacture OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The date when the UPS was manufactured in mm/dd/yy format." + ::= { upsAdvIdent 2 } + +upsAdvIdentSerialNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An 8-character string identifying the serial number of + the UPS internal microprocessor. This number is set at + the factory. NOTE: This number does NOT correspond to + the serial number on the rear of the UPS." + ::= { upsAdvIdent 3 } + + + +-- the upsBattery group +-- the upsBasicBattery group + +upsBasicBatteryStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown(1), + batteryNormal(2), + batteryLow(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the UPS batteries. A batteryLow(3) + value indicates the UPS will be unable to sustain the + current load, and its services will be lost if power is + not restored. The amount of run time in reserve at the + time of low battery can be configured by the + upsAdvConfigLowBatteryRunTime." + ::= { upsBasicBattery 1 } + +upsBasicBatteryTimeOnBattery OBJECT-TYPE + SYNTAX TimeTicks + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The elapsed time since the UPS has switched to battery + power." + ::= { upsBasicBattery 2 } + +upsBasicBatteryLastReplaceDate OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The date when the UPS system's batteries were last replaced + in mm/dd/yy format. For Smart-UPS models, this value + is originally set in the factory. When the UPS batteries + are replaced, this value should be reset by the administrator." + ::= { upsBasicBattery 3 } + + + +-- the upsAdvBattery group + +upsAdvBatteryCapacity OBJECT-TYPE + SYNTAX Gauge + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The remaining battery capacity expressed in + percent of full capacity." + ::= { upsAdvBattery 1 } + +upsAdvBatteryTemperature OBJECT-TYPE + SYNTAX Gauge + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The current internal UPS temperature expressed in + Celsius." + ::= { upsAdvBattery 2 } + +upsAdvBatteryRunTimeRemaining OBJECT-TYPE + SYNTAX TimeTicks + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The UPS battery run time remaining before battery + exhaustion." + ::= { upsAdvBattery 3 } + +upsAdvBatteryReplaceIndicator OBJECT-TYPE + SYNTAX INTEGER { + noBatteryNeedsReplacing(1), + batteryNeedsReplacing(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Indicates whether the UPS batteries need replacing." + ::= { upsAdvBattery 4 } + +upsAdvBatteryNumOfBattPacks OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of external battery packs connected to the UPS. If + the UPS does not use smart cells then the agent reports + ERROR_NO_SUCH_NAME." + ::= { upsAdvBattery 5 } + +upsAdvBatteryNumOfBadBattPacks OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of external battery packs connected to the UPS that + are defective. If the UPS does not use smart cells then the + agent reports ERROR_NO_SUCH_NAME." + ::= { upsAdvBattery 6 } + +upsAdvBatteryNominalVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The nominal battery voltage in Volts." + ::= { upsAdvBattery 7 } + +upsAdvBatteryActualVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The actual battery bus voltage in Volts." + ::= { upsAdvBattery 8 } + +upsAdvBatteryCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The battery current in Amps." + ::= { upsAdvBattery 9 } + +upsAdvTotalDCCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The total DC current in Amps." + ::= { upsAdvBattery 10 } + + +-- the upsBasicInput group + +upsBasicInputPhase OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The current AC input phase." + ::= { upsBasicInput 1 } + + +-- the upsAdvInput group + +upsAdvInputLineVoltage OBJECT-TYPE + SYNTAX Gauge + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The current utility line voltage in VAC." + ::= { upsAdvInput 1 } + +upsAdvInputMaxLineVoltage OBJECT-TYPE + SYNTAX Gauge + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The maximum utility line voltage in VAC over the + previous 1 minute period." + ::= { upsAdvInput 2 } + +upsAdvInputMinLineVoltage OBJECT-TYPE + SYNTAX Gauge + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The minimum utility line voltage in VAC over the + previous 1 minute period." + ::= { upsAdvInput 3 } + +upsAdvInputFrequency OBJECT-TYPE + SYNTAX Gauge + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The current input frequency to the UPS system in Hz." + ::= { upsAdvInput 4 } + + +upsAdvInputLineFailCause OBJECT-TYPE + SYNTAX INTEGER { + noTransfer(1), + highLineVoltage(2), + brownout(3), + blackout(4), + smallMomentarySag(5), + deepMomentarySag(6), + smallMomentarySpike(7), + largeMomentarySpike(8), + selfTest(9), + rateOfVoltageChnage(10) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The reason for the occurrence of the last transfer to UPS + battery power. The variable is set to: + - noTransfer(1) -- if there is no transfer yet. + - highLineVoltage(2) -- if the transfer to battery is caused + by an over voltage greater than the high transfer voltage. + - brownout(3) -- if the duration of the outage is greater than + five seconds and the line voltage is between 40% of the + rated output voltage and the low transfer voltage. + - blackout(4) -- if the duration of the outage is greater than five + seconds and the line voltage is between 40% of the rated + output voltage and ground. + - smallMomentarySag(5) -- if the duration of the outage is less + than five seconds and the line voltage is between 40% of the + rated output voltage and the low transfer voltage. + - deepMomentarySag(6) -- if the duration of the outage is less + than five seconds and the line voltage is between 40% of the + rated output voltage and ground. The variable is set to + - smallMomentarySpike(7) -- if the line failure is caused by a + rate of change of input voltage less than ten volts per cycle. + - largeMomentarySpike(8) -- if the line failure is caused by + a rate of change of input voltage greater than ten volts per cycle. + - selfTest(9) -- if the UPS was commanded to do a self test. + - rateOfVoltageChange(10) -- if the failure is due to the rate of change of + the line voltage." + ::= { upsAdvInput 5 } + + +-- the upsBasicOutput group + +upsBasicOutputStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown(1), + onLine(2), + onBattery(3), + onSmartBoost(4), + timedSleeping(5), + softwareBypass(6), + off(7), + rebooting(8), + switchedBypass(9), + hardwareFailureBypass(10), + sleepingUntilPowerReturn(11), + onSmartTrim(12) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The current state of the UPS. If the UPS is unable + to determine the state of the UPS this variable is set + to unknown(1)." + ::= { upsBasicOutput 1 } + +upsBasicOutputPhase OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The current output phase." + ::= { upsBasicOutput 2 } + + +-- the upsAdvOutput group + +upsAdvOutputVoltage OBJECT-TYPE + SYNTAX Gauge + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The output voltage of the UPS system in VAC." + ::= { upsAdvOutput 1 } + +upsAdvOutputFrequency OBJECT-TYPE + SYNTAX Gauge + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The current output frequency of the UPS system in Hz." + ::= { upsAdvOutput 2 } + +upsAdvOutputLoad OBJECT-TYPE + SYNTAX Gauge + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The current UPS load expressed in percent + of rated capacity." + ::= { upsAdvOutput 3 } + +upsAdvOutputCurrent OBJECT-TYPE + SYNTAX Gauge + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The current in amperes drawn by the load on the UPS." + ::= { upsAdvOutput 4 } + + +-- the upsBasicConfig group + +upsBasicConfigNumDevices OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of devices that are plugged into the UPS." + ::= { upsBasicConfig 1 } + +upsBasicConfigDeviceTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsBasicConfigDeviceEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of devices that are plugged into the UPS. + The number of entries is given by the value of + upsBasicConfigNumDevices." + ::= { upsBasicConfig 2 } + +upsBasicConfigDeviceEntry OBJECT-TYPE + SYNTAX UpsBasicConfigDeviceEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The devices plugged in to the UPS." + INDEX { deviceIndex } + ::= { upsBasicConfigDeviceTable 1 } + +UpsBasicConfigDeviceEntry ::= + SEQUENCE { + deviceIndex + INTEGER, + deviceName + DisplayString, + vaRating + INTEGER, + acceptThisDevice + INTEGER + } + +deviceIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of the device that is plugged into the UPS." + ::= { upsBasicConfigDeviceEntry 1 } + +deviceName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name/description of the device plugged into the UPS." + ::= { upsBasicConfigDeviceEntry 2 } + +vaRating OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The volt-amp rating of the device plugged into the UPS." + ::= { upsBasicConfigDeviceEntry 3 } + +acceptThisDevice OBJECT-TYPE + SYNTAX INTEGER { + yes(1), + no(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "An entry is added if yes, the entry is deleted if no." + ::= { upsBasicConfigDeviceEntry 4 } + + + + +-- the upsAdvConfig group + +upsAdvConfigRatedOutputVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The nominal output voltage from the UPS in VAC. + + For a list of allowed values supported by your UPS model, + see the UPS User's Manual. + + If a value other than a supported value is provided in a + set request, the UPS interprets it as the next lower + acceptable value. If the provided value is lower than + the lowest acceptable value, the lowest acceptable + value is used." + ::= { upsAdvConfig 1 } + +upsAdvConfigHighTransferVolt OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The maximum line voltage in VAC allowed before the + UPS system transfers to battery backup. + + For a list of allowed values supported by your UPS model, + see the UPS User's Manual. + + If a value other than a supported value is provided in a + set request, the UPS interprets it as a the next higher + acceptable value. If the provided value is higher than + the highest acceptable value, the highest acceptable + value is used." + ::= { upsAdvConfig 2 } + +upsAdvConfigLowTransferVolt OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The minimum line voltage in VAC allowed before the + UPS system transfers to battery backup. + + For a list of allowed values supported by your UPS model, + see the UPS User's Manual. + + If a value other than a supported value is provided in a + set request, the UPS interprets it as the next lower + acceptable value. If the provided value is lower than + the lowest acceptable value, the lowest acceptable + value is used." + ::= { upsAdvConfig 3 } + +upsAdvConfigAlarm OBJECT-TYPE + SYNTAX INTEGER { + timed(1), + atLowBattery(2), + never(3), + mute(4) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "A flag indicating how the UPS should handle audible + line fail alarms: + timed(1): UPS alarm will sound after a preset timed duration starting + from the line fail condition (see OID upsAdvConfigAlarmTimer for the + alarm timer value) + atLowBattery(2): UPS alarm will sound when the UPS has reached a Low + Battery condition during a line fail + never(3): Disables the UPS audible alarm + mute(4): Mutes the current alarm for some UPSs only when it is in an + alarm state and will return to the previously configured option when + the UPS recovers from the alarm condition" + ::= { upsAdvConfig 4 } + +upsAdvConfigAlarmTimer OBJECT-TYPE + SYNTAX TimeTicks + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The time after initial line failure at which the UPS + begins emitting audible alarms (beeping). This timer is + observed only if the value of extControlAlarm is timed(2). + Allowed values are 0 or 30 seconds. + + If a value other than a supported value is provided in a + set request, the UPS interprets it as a the next lower + acceptable value. If the provided value is lower than + the lowest acceptable value, the lowest acceptable + value is used." + ::= { upsAdvConfig 5 } + +upsAdvConfigMinReturnCapacity OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The minimum battery capacity required before the UPS will + return from a low battery shutdown condition. The capacity is + measured from 0% battery capacity (or Low Battery) as a percent + of full capacity (100%). In other words, the UPS will not re-energize + the output until the battery has charged so that its' capacity is equal + to this value. + + For a list of allowed values supported by your UPS model, + see the UPS User's Manual. + + If a value other than a supported value is provided in a + set request, the UPS interprets it as a the next higher + acceptable value. If the provided value is higher than + the highest acceptable value, the highest acceptable + value is used." + ::= { upsAdvConfig 6 } + +upsAdvConfigSensitivity OBJECT-TYPE + SYNTAX INTEGER { + auto(1), + low(2), + medium(3), + high(4) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The sensitivity of the UPS to utility line abnormalities + or noises." + ::= { upsAdvConfig 7 } + +upsAdvConfigLowBatteryRunTime OBJECT-TYPE + SYNTAX TimeTicks + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The desired run time of the UPS, in seconds, once the + low battery condition is reached. During this time the UPS will + produce a constant warning tone which can not be disabled. + + For a list of allowed values supported by your UPS model, + see the UPS User's Manual. + + If a value other than a supported value is provided in a set + request, the UPS interprets the value as the next higher + acceptable value. If the provided value is higher than the + highest acceptable value, the highest acceptable value is used." + ::= { upsAdvConfig 8 } + +upsAdvConfigReturnDelay OBJECT-TYPE + SYNTAX TimeTicks + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The delay in seconds after utility line power returns + before the UPS will turn on. This value is also used + when the UPS comes out of a reboot and before the UPS + wakes up from 'sleep' mode. + + For a list of allowed values supported by your UPS model, + see the UPS User's Manual. + + If a value other than a supported value is provided in a + set request, the UPS interprets it as a the next higher + acceptable value. If the provided value is higher than + the highest acceptable value, the highest acceptable + value is used." + ::= { upsAdvConfig 9 } + +upsAdvConfigShutoffDelay OBJECT-TYPE + SYNTAX TimeTicks + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The delay in seconds the UPS remains on after being told + to turn off. + + For a list of allowed values supported by your UPS model, + see the UPS User's Manual. + + If a value other than a supported value is provided in a + set request, the UPS interprets it as a the next higher + acceptable value. If the provided value is higher than + the highest acceptable value, the highest acceptable + value is used." + ::= { upsAdvConfig 10 } + +upsAdvConfigUpsSleepTime OBJECT-TYPE + SYNTAX TimeTicks + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The time in seconds for the UPS to go to 'sleep' when + instructed. When in sleep mode, the UPS will not provide + output power regardless of the input line state. Once the + specified time has elapsed, output power will be restored. + + This is a configuration setting. The UPS will not go to + sleep until told to do so by the manager from a management + station. + + Any input value is allowed, however the UPS only recognizes + 1/10 of an hour increments. The provided value will be + rounded to the closest 1/10 of an hour with one exception: + Any value entered between 1 and 540 seconds will be rounded + to 360 seconds (or 6 minutes)." + ::= { upsAdvConfig 11 } + + +upsAdvConfigSetEEPROMDefaults OBJECT-TYPE + SYNTAX INTEGER { + noSetEEPROMDefaults(1), + setEEPROMDefaults(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "WRITE: Resets the UPS EEPROM variables to default values. + READ: returns 0" + ::= { upsAdvConfig 12 } + +upsAdvConfigDipSwitchSetting OBJECT-TYPE + SYNTAX SEQUENCE OF UpsAdvConfigDipSwitchEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Current settings of UPS dip switches." + ::= { upsAdvConfig 13 } + +upsAdvConfigDipSwitchEntry OBJECT-TYPE + SYNTAX UpsAdvConfigDipSwitchEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The current setting of one dip switch." + INDEX { dipSwitchIndex } + ::= { upsAdvConfigDipSwitchSetting 1 } + +UpsAdvConfigDipSwitchEntry ::= + SEQUENCE { + dipSwitchIndex + INTEGER, + dipSwitchStatus + INTEGER + } + +dipSwitchIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of a UPS dip switch." + ::= { upsAdvConfigDipSwitchEntry 1 } + +dipSwitchStatus OBJECT-TYPE + SYNTAX INTEGER { + on(1), + off(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The setting of a UPS dip switch." + ::= { upsAdvConfigDipSwitchEntry 2 } + +upsAdvConfigBattExhaustThresh OBJECT-TYPE + SYNTAX TimeTicks + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The number of seconds prior to battery exhaustion when the + UPS will switch off power to its load." + ::= { upsAdvConfig 14 } + +upsAdvConfigPassword OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The password entered at the UPS front panel to enable local + configuration of the EEProm. If the password is disabled or + is not supported, then the agent returns a null string." + ::= { upsAdvConfig 15 } + +upsAdvConfigAllowedSetTable OBJECT-TYPE + SYNTAX SEQUENCE OF ApcUpsConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The table listing the allowed values for all discrete + configurable UPS variables." + ::= { upsAdvConfig 16 } + +apcUpsConfigEntry OBJECT-TYPE + SYNTAX ApcUpsConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The table entry for a configurable UPS variable." + INDEX { apcUpsConfigFieldIndex } + ::= { upsAdvConfigAllowedSetTable 1 } + +ApcUpsConfigEntry ::= SEQUENCE { + apcUpsConfigFieldIndex INTEGER, + apcUpsConfigFieldOID OBJECT IDENTIFIER, + apcUpsConfigFieldValueRange DisplayString + } + +apcUpsConfigFieldIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to an eeprom field entry." + ::= { apcUpsConfigEntry 1 } + +apcUpsConfigFieldOID OBJECT-TYPE + SYNTAX OBJECT IDENTIFIER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The OID of the current configurable value." + ::= { apcUpsConfigEntry 2 } + +apcUpsConfigFieldValueRange OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The discrete set of allowed values of a configurable + register. Individual values are delimited by a comma." + ::= { apcUpsConfigEntry 3 } + +upsAdvConfigBattCabAmpHour OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Configure settings of UPS battery cabinet amp hour setting." + ::= { upsAdvConfig 17 } + +upsAdvConfigPositionSelector OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + rack (2), + tower (3) + } + + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Configure UPS position selector. If the UPS doesn't + support this configuration it will report unknown (1). + The positions are either rack (2) for rack mounted or + tower (3) for tower unit." + ::= { upsAdvConfig 18 } + +upsAdvConfigOutputFreqRange OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + freqRangeAUTO (2), + freqRange60Var1 (3), + freqRange60Var3 (4), + freqRange50Var1 (5), + freqRange50Var3 (6), + freqRange60Var10 (7), + freqRange50Var10 (8) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Configure the output frequency tolerance range. + unknown(1) indicates the output frequency is unknown. + freqRangeAUTO(2) configure the output frequency range for automatic. + freqRange60Var1(3) configure the output frequency range for 60 +/- 0.1 Hz + freqRange60Var3(4) configure the output frequency range for 60 +/- 3.0 Hz + freqRange50Var1(5) configure the output frequency range for 50 +/- 0.1 Hz + freqRange50Var3(6) configure the output frequency range for 50 +/- 3.0 Hz + freqRange60Var10(7) configure the output frequency range for 60 +/- 10 Hz + freqRange50Var10(8) configure the output frequency range for 50 +/- 10 Hz" + ::= { upsAdvConfig 19 } + +upsAdvConfigUPSFail OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + gotoBypass (2), + dropLoad (3) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Configure the UPS fail action. If UPS fails, + and frequency or voltage is out of range it will either + GotoBypass (2) or DropLoad (3). This OID will report + unknown (1) if it is not supported feature or option." + ::= { upsAdvConfig 20 } + +upsAdvConfigAlarmRedundancy OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Configure settings of UPS alarm if the redundancy is + under the current redundancy. Use -1 for never." + ::= { upsAdvConfig 21 } + +upsAdvConfigAlarmLoadOver OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Configure settings of UPS alarm if the load is + over the current load in kVA. Use -1 for never." + ::= { upsAdvConfig 22 } + +upsAdvConfigAlarmRuntimeUnder OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Configure settings of UPS alarm if the runtime is + under the current time of minutes. Use -1 for never." + ::= { upsAdvConfig 23 } + +upsAdvConfigVoutReporting OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + voutAUTO (2), + vout208 (3), + vout240 (4) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Configure the way the UPS scales its output voltage readings. + unknown(1) indicates the Vout Reporting is unknown. + voutAUTO(2) configure the Vout Reporting for automatic scalling. + vout208(3) configure the Vout Reporting for 208 Volts. + vout240(4) configure the Vout Reporting for 240 Volts." + ::= { upsAdvConfig 24 } + +upsAdvConfigNumExternalBatteries OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Configure the number of external batteries connected to the UPS." + ::= { upsAdvConfig 25 } + +upsAdvConfigSimpleSignalShutdowns OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + disabled (2), + enabled (3) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Configure Simple Signal shutdown commands from the Simple Signal + port to be issued to the UPS. + unknown(1) indicates the Simple Signal Shutdown setting is unknown. + disabled(2) configure to disable Simple Signal Shutdowns. + enabled(3) configure to enable Simple Signal Shutdowns." + ::= { upsAdvConfig 26 } + + +-- the upsSyncCtrlGroupConfig group + +upsSCGMembershipGroupNumber OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The SCG Membership Group number (MGN) is a 16-bit number allowing + up to 65534 separate groups that can be identified and distinguished + per IP subnet. Zero and 65535 are not used. The MGN is used in all + communication between members of the SCG and a Network Management Card + (NMC) will listen and only respond to commands sent to it using its + configured SCG ID." + ::= { upsSyncCtrlGroupConfig 1 } + +upsSCGActiveMembershipStatus OBJECT-TYPE + SYNTAX INTEGER { + enabledSCG (1), + disabledSCG (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Membership in the configured SCG can be enabled and + disabled. If an NMC is configured for an SCG, but + has its membership disabled, all synchronized control commands + received will be ignored." + ::= { upsSyncCtrlGroupConfig 2 } + +upsSCGPowerSynchronizationDelayTime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The Power Synchronization Delay Time (PSD) setting is the maximum + number of seconds an SCG Initiator will wait for all SCG members to + recover utility power before completing the reboot sequence of a + reboot or sleep command. If all SCG members are ready to proceed, + no additional delay is introduced." + ::= { upsSyncCtrlGroupConfig 3 } + +upsSCGReturnBatteryCapacityOffset OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "A reboot command uses the Initiator’s Return battery Capacity (RBC) to control + when the SCG completes this operation. In a Normal Control Operation (NCC) the + UPS will only complete the reboot if RBC is reached. Due to normal battery + charge rate variations it may be desirable for the Followers to complete the + reboot if they are within some range of the Initiator’s RBC when the Initiator + is prepared (charged to RBC) to complete the reboot. The Return Battery + Capacity Offset (RBCO) defines a percent battery capacity subtracted from an + RBC above which a Follower’s battery must be charged for it to complete a + reboot. For example, if the Initiator’s RBC is 50% and the Initiator’s RBCO is + 5% then a Follower’s battery capacity is within range if it is greater or equal + to 45% (50% - 5%) at the time when the Initiator tries to complete the reboot + command. The default RBCO is 10%. " + ::= { upsSyncCtrlGroupConfig 4 } + +upsSCGMultiCastIP OBJECT-TYPE + SYNTAX IpAddress + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The MultiCast IP address of the SCG Group." + ::= { upsSyncCtrlGroupConfig 5 } + +-- the upsSyncCtrlGroupStatus group + +upsSCGNumOfGroupMembers OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of active, communicating members in the Sync Control Group (SCG). + This variable indicates the number of rows in the SCG Status Table." + ::= { upsSyncCtrlGroupStatus 1 } + +-- Sync Control Group Status Table + +upsSCGStatusTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsSCGStatusEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of SCG status table entries. The number of entries + is given by the value of upsSCGNumOfGroupMembers." + ::= { upsSyncCtrlGroupStatus 2 } + + upsSCGStatusEntry OBJECT-TYPE + SYNTAX UpsSCGStatusEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information applicable to a + particular SCG Member." + INDEX { upsSCGStatusTableIndex } + ::= { upsSCGStatusTable 1 } + + UpsSCGStatusEntry ::= SEQUENCE { + upsSCGStatusTableIndex INTEGER, + upsSCGMemberIP IpAddress, + upsSCGACInputStatus INTEGER, + upsSCGACOutputStatus INTEGER + } + + upsSCGStatusTableIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of a status entry for an active, communicating SCG member." + ::= { upsSCGStatusEntry 1 } + + upsSCGMemberIP OBJECT-TYPE + SYNTAX IpAddress + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The IP address of an active, communicating SCG Member." + ::= { upsSCGStatusEntry 2 } + + upsSCGACInputStatus OBJECT-TYPE + SYNTAX INTEGER { + acInGood(1), + acInBad(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID indicates the AC Input Status of the SCG Member. + acInGood(1) indicates the AC Input is within tolerance. + acInBad(2) indicates the AC Input is not within tolerance." + ::= { upsSCGStatusEntry 3 } + + upsSCGACOutputStatus OBJECT-TYPE + SYNTAX INTEGER { + acOutOn(1), + acOutOff(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID indicates the AC Output Status of the SCG Member. + acOutOn(1) indicates the UPS output is providing power to the load. + acOutOff(2) indicates the UPS output is not providing power to the load. " + ::= { upsSCGStatusEntry 4 } + +-- the upsBasicState group + +upsBasicStateOutputState OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An ASCII string containing the 64 flags representing + the current state(s) of the UPS. If the Network Card + is unable to determine the state of the UPS, this + variable is set to ‘UNKNOWN’. + + The flags are numbered 1 to 64, read from left to + right. The flags are defined as follows: + + Flag 1: Abnormal Condition Present + Flag 2: On Battery + Flag 3: Low Battery + Flag 4: On Line + + Flag 5: Replace Battery + Flag 6: Serial Communication Established + Flag 7: AVR Boost Active* + Flag 8: AVR Trim Active* + + Flag 9: Overload + Flag 10: Runtime Calibration + Flag 11: Batteries Discharged + Flag 12: Manual Bypass + + Flag 13: Software Bypass + Flag 14: In Bypass due to Internal Fault + Flag 15: In Bypass due to Supply Failure* + Flag 16: In Bypass due to Fan Failure* + + Flag 17: Sleeping on a Timer + Flag 18: Sleeping until Utility Power Returns + Flag 19: On + Flag 20: Rebooting + + Flag 21: Battery Communication Lost* + Flag 22: Graceful Shutdown Initiated + Flag 23: Smart Boost or Smart Trim Fault* + Flag 24: Bad Output Voltage* + + Flag 25: Battery Charger Failure* + Flag 26: High Battery Temperature + Flag 27: Self Test In Progress + Flag 28: Low Battery / On Battery + + Flag 29: Graceful Shutdown Issued by Upstream Device + Flag 30: Graceful Shutdown Issued by Downstream Device + Flag 31: No Batteries Attached* + Flag 32: Synchronized command is in progress + + Flag 33: + Flag 34: + Flag 35: + Flag 36: + + Flag 37: + Flag 38: + Flag 39: + Flag 40: + + Flag 41: + Flag 42: + Flag 43: + Flag 44: + + Flag 45: + Flag 46: + Flag 47: + Flag 48: + + Flag 49: + Flag 50: + Flag 51: + Flag 52: + + Flag 53: + Flag 54: + Flag 55: + Flag 56: + + Flag 57: + Flag 58: + Flag 59: + Flag 60: + + Flag 61: + Flag 62: + Flag 63: + Flag 64: " + + ::= { upsBasicState 1 } + +-- the upsAdvState group + +upsAdvStateAbnormalConditions OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An ASCII string containing the 32 flags representing + the current active UPS faults. If the Network Card + is unable to determine the values of the flags, this + variable is set to ‘UNKNOWN’. If this variable is not + supported by the connected UPS, this variable is set to + ‘NOT SUPPORTED’. + + The flags are numbered from 1 to 32, and read from left to + right. The flags are defined as follows: + + Flag 1: Power Module Failure + Flag 2: Main Intelligence Module Failure + Flag 3: Redundant Intelligence Module Failure + Flag 4: Battery Failure + + Flag 5: Load(kVA) Alarm Threshold Violation + Flag 6: Redundancy Lost + Flag 7: Redundancy Below Alarm Threshold + Flag 8: Bypass notin Range; Either Frequency or Voltage + + Flag 9: Bypass Contactor Stuck in Bypass Condition + Flag 10: Bypass Contactor Stuck in On-Line Condition + Flag 11: In Bypass due to an Internal Fault + Flag 12: In Bypass due to an Overload + + Flag 13: In Maintanence Bypass + Flag 14: Input Circuit Braker Tripped Open + Flag 15: System Level Fan Failure + Flag 16: Redundant Intelligent Module in Control + + Flag 17: IIC Inter-Module Communication Failure + Flag 18: No Working Power Modules + Flag 19: Load Shutdown From Bypass; Input Frequency + Flag 20: Runtime Below Alarm Threshold + + Flag 21: Extended Run Frame Fault + Flag 22: Output Voltage out of Range + Flag 23: UPS Not Synchronized + Flag 24: No Batteries Installed + + Flag 25: Battery Voltage High + Flag 26: UPS Specific Fault Detected + Flag 27: Site Wiring Fault + Flag 28: Backfeed Protection Relay Opened + + Flag 29: + Flag 30: + Flag 31: + Flag 32: " + ::= { upsAdvState 1 } + +upsAdvStateSymmetra3PhaseSpecificFaults OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An ASCII string containing the 64 flags representing + the current active UPS specific faults for the Symmetra + 3-Phase UPS models. If the Network Card is unable to + determine the values of the flags, this variable is set + to ‘UNKNOWN’. If the connected UPS does not use this + variable, it is set to ‘NOT SUPPORTED’. + + The flags are numbered from 1 to 64, and read from left + to right. The bits are defined as follows: + + Flag 1: External Switch Gear Failure + Flag 2: External Transformer Over Temperature + Flag 3: External DC Circuit Breaker Tripped + Flag 4: System Power Supply Failure + + Flag 5: Battery Monitor Card Failure + Flag 6: Battery Monitor Card Removed + Flag 7: XR Communication Card Failure + Flag 8: XR Communication Card Removed + + Flag 9: External Switch Gear Monitoring Card Failure + Flag 10: External Switch Gear Monitoring Card Removed + Flag 11: Internal DC Circiut Breaker Tripped + Flag 12: Static Bypass Switch Failure + + Flag 13: System EEPROM Removed + Flag 14: System EEPROM Failure + Flag 15: UPS in Forced Bypass + Flag 16: + + Flag 17: + Flag 18: + Flag 19: + Flag 20: + + Flag 21: + Flag 22: + Flag 23: + Flag 24: + + Flag 25: + Flag 26: + Flag 27: + Flag 28: + + Flag 29: + Flag 30: + Flag 31: + Flag 32: + + Flag 33: + Flag 34: + Flag 35: + Flag 36: + + Flag 37: + Flag 38: + Flag 39: + Flag 40: + + Flag 41: + Flag 42: + Flag 43: + Flag 44: + + Flag 45: + Flag 46: + Flag 47: + Flag 48: + + Flag 49: + Flag 50: + Flag 51: + Flag 52: + + Flag 53: + Flag 54: + Flag 55: + Flag 56: + + Flag 57: + Flag 58: + Flag 59: + Flag 60: + + Flag 61: + Flag 62: + Flag 63: + Flag 64: " + ::= { upsAdvState 2 } + +upsAdvStateDP300ESpecificFaults OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An ASCII string containing the 64 flags representing + the current active UPS specific faults for the Silcon + DP300E UPS models. If the Network Card is unable to + determine the values of the flags, this variable is set + to ‘UNKNOWN’. If the connected UPS does not use this + variable, it is set to ‘NOT SUPPORTED’. + + The flags are numbered from 1 to 64, and read from left + to right. The bits are defined as follows: + + Flag 1: Peak Current Limiter Avtive + Flag 2: Bypass Power Supply Fault + Flag 3: Delta Current LImiter Active + Flag 4: Fan Fault + + Flag 5: High DC warning + Flag 6: Inverter Voltage Error + Flag 7: Parallel Synchronization Error + Flag 8: Second Power Supply Fault + + Flag 9: Internal Power Supply Fault + Flag 10: + Flag 11: + Flag 12: + + Flag 13: + Flag 14: Bypass Static Switch High Temperature + Flag 15: High Battery Temperature + Flag 16: Battery Weak + + Flag 17: + Flag 18: System Locked in Operation Mode + Flag 19: RAM1 Memory Write Error + Flag 20: Memory Write Error + + Flag 21: Communication to VQ Bypass Lost + Flag 22: Communication to VQ Output Lost + Flag 23: Communication to DMU Lost + Flag 24: Communication to Controller Lost + + Flag 25: Communication to Parallel IF Lost + Flag 26: External Shutdown Accepted + Flag 27: DC Capacitor Charge Error + Flag 28: Communication to VQ Mains Lost + + Flag 29: Bypass Synchronization Error + Flag 30: Charge Error + Flag 31: + Flag 32: + + Flag 33: + Flag 34: + Flag 35: + Flag 36: + + Flag 37: + Flag 38: + Flag 39: + Flag 40: + + Flag 41: + Flag 42: + Flag 43: + Flag 44: + + Flag 45: + Flag 46: + Flag 47: + Flag 48: + + Flag 49: + Flag 50: + Flag 51: + Flag 52: + + Flag 53: + Flag 54: + Flag 55: + Flag 56: + + Flag 57: + Flag 58: + Flag 59: + Flag 60: + + Flag 61: + Flag 62: + Flag 63: + Flag 64: " + ::= { upsAdvState 3 } + + +-- the upsBasicControl group + +upsBasicControlConserveBattery OBJECT-TYPE + SYNTAX INTEGER { + noTurnOffUps(1), + turnOffUpsToConserveBattery(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this variable to turnUpsOffToConserveBattery(2) + causes a UPS on battery to be put into 'sleep' mode. The + UPS will turn back on when utility power is restored. + Attempting to turn off a UPS that is not on battery will + result in a badValue error. + + Setting this value to noTurnOffUps(1) has no + effect. + + The value noTurnOffUps(1) will always be returned + when the variable is read." +::= { upsBasicControl 1 } + + + +-- the upsAdvControl group + +upsAdvControlUpsOff OBJECT-TYPE + SYNTAX INTEGER { + noTurnUpsOff(1), + turnUpsOff(2), + turnUpsOffGracefully(3), + turnUpsSyncGroupOff(4), + turnUpsSyncGroupOffAfterDelay(5), + turnUpsSyncGroupOffGracefully(6) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this variable to turnUpsOff(2) causes + the UPS to shut off. When in this state, the UPS + will not provide output power regardless of the input + line state. + + Setting this variable to turnUpsOffGracefully(3) causes + the UPS to shut off after a delay period. This allows the + host to shut down in a graceful manner. When in this state, + the UPS will not provide output power regardless of the + input line state. + + If this UPS is an active member of a Synchronized + Control Group (SCG) the turnUpsSyncGroupOff(4) command + will perform a Synchronized Turn Off of all active Group + members regardless of their current AC output status. + + If this UPS is an active member of a Synchronized + Control Group (SCG) the turnUpsSyncGroupOffAfterDelay(5) + command will perform a Synchronized Turn Off After Delay + of all active Group members regardless of their current + AC output status. This unit's Shutdown Delay will be used + to execute the Turn Off After Delay command. + + If this UPS is an active member of an SCG, the + turnUpsSyncGroupOffGracefully(6) command will perform a + Synchronized Turn Off Gracefully of all active Group + members regardless of their current AC output status. + This unit's Maximum Shutdown Time and Shutdown Delay will + be used to execute the Turn Off Gracefully command. + + Setting this value to noTurnUpsOff(1) has no + effect. + + The value noTurnUpsOff(1) will always be returned + when the variable is read." + ::= { upsAdvControl 1 } + +upsAdvControlRebootUps OBJECT-TYPE + SYNTAX INTEGER { + noRebootUps(1), + rebootUps(2), + rebootUpsGracefully(3), + rebootSyncGroupUps(4), + rebootSyncGroupUpsGracefully(5) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this variable to rebootUps(2) causes the + UPS to shut off and turn back on. + + Setting this variable to rebootUpsGracefully(3) causes the + UPS to shut off and turn back on after a delay period. + This allows the host to shut down in a graceful manner. + + If this UPS is an active member of a Synchronized Control + Group (SCG) the rebootSyncGroupUps(4) command will perform + a Synchronized Reboot of all active Group members regardless + of their current AC output status. This unit's Power + Synchronization Delay, Shutdown Delay, Return Delay, + Return Battery Capacity, and Return Battery Capacity Offset + will be used to execute the Reboot command. + + If this UPS is an active member of a SCG the + rebootSyncGroupUpsGracefully(5) command will perform a + Synchronized Reboot of all active Group members regardless + of their current AC output status. This unit's Power + Synchronization Delay, Maximum Shutdown Time, + Shutdown Delay, Return Delay, Return Battery Capacity, and + Return Battery Capacity Offset will be used + to execute the Reboot command. + + Setting this value to noRebootUps(1) has no effect. + + The value noRebootUps(1) will always be returned + when the variable is read." + ::= { upsAdvControl 2 } + +upsAdvControlUpsSleep OBJECT-TYPE + SYNTAX INTEGER { + noPutUpsToSleep(1), + putUpsToSleep(2), + putUpsToSleepGracefully(3), + putUpsSyncGroupToSleep(4), + putUpsSyncGroupToSleepGracefully(5) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this variable to putUpsToSleep(2) causes + the UPS to go to sleep for the time specified by + upsAdvConfigUpsSleepTime. + + Setting this variable to putUpsToSleepGracefully(3) + causes the UPS to go to sleep for the time specified + by upsAdvConfigUpsSleepTime after a delay period. + This allows the host to shut down in a graceful manner. + + If this UPS is an active member of a Synchronized Control + Group (SCG), the putUpsSyncGroupToSleep(4) command will perform + a Synchronized Sleep of all active Group members regardless + of their current AC output status. This unit's Power + Synchronization Delay, Shutdown Delay, Sleep Time, + and Return Delay will be used to execute the sleep command. + + If this UPS is an active member of a SCG the + putUpsSyncGroupToSleepGracefully(5) command will perform a + Synchronized Sleep Gracefully of all active Group members + regardless of their current AC output status. This unit's + Power Synchronization Delay, Maximum Shutdown Time, Shutdown + Delay, Sleep Time, and Return Delay to execute the sleep + command. + + When in sleep mode, the UPS will not provide output + power regardless of the input line state. Once the + specified time has elapsed, output power will be + restored. + + Setting this value to noPutUpsToSleep(1) has no + effect. + + The value noPutUpsToSleep(1) will always be returned + when the variable is read." + ::= { upsAdvControl 3 } + + +upsAdvControlSimulatePowerFail OBJECT-TYPE + SYNTAX INTEGER { + noSimulatePowerFailure(1), + simulatePowerFailure(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this variable to simulatePowerFailure(2) causes + the UPS switch to battery power. + + Setting this value to noSimulatePowerFailure(1) has no + effect. + + The value noSimulatePowerFailure(1) will always be returned + when the variable is read." + ::= { upsAdvControl 4 } + + +upsAdvControlFlashAndBeep OBJECT-TYPE + SYNTAX INTEGER { + noFlashAndBeep(1), + flashAndBeep(2), + flashAndBeepSyncGroup(3) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this variable to flashAndBeep(2) causes the + UPS to beep and simultaneously turn on the UPS front + panel lights (Smart-UPS only). + + If this UPS is an active member of a Synchronized Control + Group (SCG), the flashAndBeepSyncGroup(3) command will + Flash and Beep all active Group members regardless of + current AC output status. + + Setting this value to noFlashAndBeep(1) has no + effect. + + The value noFlashAndBeep(1) will always be returned + when the variable is read." + ::= { upsAdvControl 5 } + + +upsAdvControlTurnOnUPS OBJECT-TYPE + SYNTAX INTEGER { + noTurnOnUPS(1), + turnOnUPS(2), + turnOnUPSSyncGroup(3) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this variable to turnOnUPS(2) causes the + UPS to be turned on immediately. + + If this UPS is an active member of a Synchronized Control + Group (SCG), the turnOnUPSSyncGroup(3) command will perform + a Synchronized Turn On of all active Group members + regardless of their current AC output status. + + Setting this value to noTurnOnUPS(1) has no + effect. + + The value noTurnOnUPS(1) will always be returned + when the variable is read." + ::= { upsAdvControl 6 } + +upsAdvControlBypassSwitch OBJECT-TYPE + SYNTAX INTEGER { + noBypassSwitch (1), + switchToBypass (2), + switchOutOfBypass(3) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This switch puts the UPS in or out of bypass mode." + ::= { upsAdvControl 7 } + + +-- the upsTest group + +-- the upsBasicTest group + +-- the upsAdvTest group + +upsAdvTestDiagnosticSchedule OBJECT-TYPE + SYNTAX INTEGER { + unknown(1), + biweekly(2), + weekly(3), + atTurnOn(4), + never(5) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The UPS system's automatic battery test schedule." + ::= { upsAdvTest 1 } + + +upsAdvTestDiagnostics OBJECT-TYPE + SYNTAX INTEGER { + noTestDiagnostics(1), + testDiagnostics(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this variable to testDiagnostics(2) causes + the UPS to perform a diagnostic self test. + + Setting this value to noTestDiagnostics(1) has no + effect. + + The value noTestDiagnostics(1) will always be returned + when the variable is read." + ::= { upsAdvTest 2 } + +upsAdvTestDiagnosticsResults OBJECT-TYPE + SYNTAX INTEGER { + ok(1), + failed(2), + invalidTest(3), + testInProgress(4) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The results of the last UPS diagnostics test performed." + ::= { upsAdvTest 3 } + +upsAdvTestLastDiagnosticsDate OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The date the last UPS diagnostics test was performed in + mm/dd/yy format." + ::= { upsAdvTest 4 } + +upsAdvTestRuntimeCalibration OBJECT-TYPE + SYNTAX INTEGER { + noPerformCalibration(1), + performCalibration(2), + cancelCurrentCalibration(3) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this variable to performCalibration(2) causes + the UPS to discharge to calibrate the UPS. + The test will only start if the battery capacity is 100%. + The test runs until capacity is less than 25%. + + Setting this variable to cancelCurrentCalibration(3) + after setting performCalibration(2) will cancel the + current discharge. + + Setting this variable to noPerformCalibration(1) + will have no effect. + + The value noPerformCalibration(1) will always be returned + when the variable is read. + + The result of the calibration will be saved in + upsAdvTestCalibrationResult." + ::= { upsAdvTest 5 } + +upsAdvTestCalibrationResults OBJECT-TYPE + SYNTAX INTEGER { + ok(1), + invalidCalibration(2), + calibrationInProgress(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The results of the last runtime calibration. + + Value ok(1) means a successful runtime calibration. + + Value invalidCalibration(2) indicates last calibration did + not take place since the battery capacity was below + 100%. + + Value calibrationInProgress(3) means a calibration + is occurring now. " + ::= { upsAdvTest 6 } + +upsAdvTestCalibrationDate OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The date the last UPS runtime calibration was + performed in mm/dd/yy format." + ::= { upsAdvTest 7 } + +-- the upsComm group + +upsCommStatus OBJECT-TYPE + SYNTAX INTEGER { + ok(1), + noComm(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of agent's communication with UPS. " + ::= { upsComm 1 } + + +-- the measureUps group +-- the Environ group + +mUpsEnvironAmbientTemperature OBJECT-TYPE + SYNTAX Gauge + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The ambient temperature in Celsius for Probe 1." + ::= { mUpsEnviron 1 } + +mUpsEnvironRelativeHumidity OBJECT-TYPE + SYNTAX Gauge + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The relative humidity as a percentage for Probe 1." + ::= { mUpsEnviron 2 } + + +mUpsEnvironAmbientTemperature2 OBJECT-TYPE + SYNTAX Gauge + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The ambient temperature in Celsius for Probe 2." + ::= { mUpsEnviron 3 } + +mUpsEnvironRelativeHumidity2 OBJECT-TYPE + SYNTAX Gauge + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The relative humidity as a percentage for Probe 2." + ::= { mUpsEnviron 4 } + +-- the mUpsContact group + +mUpsContactNumContacts OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of contacts supported by the Measure-UPS." + ::= { mUpsContact 1 } + +mUpsContactTable OBJECT-TYPE + SYNTAX SEQUENCE OF ContactEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of contacts supported by the Measure-UPS." + ::= { mUpsContact 2 } + +mUpsContactEntry OBJECT-TYPE + SYNTAX ContactEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A contact entry containing information for a given contact." + INDEX { contactNumber } + ::= { mUpsContactTable 1 } + +ContactEntry ::= + SEQUENCE { + contactNumber + INTEGER, + normalState + INTEGER, + description + DisplayString, + monitoringStatus + INTEGER, + currentStatus + INTEGER + } + +contactNumber OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An index identifying the contact on the Measure-UPS." + ::= { mUpsContactEntry 1 } + +normalState OBJECT-TYPE + SYNTAX INTEGER { + unknown(1), + open(2), + closed(3) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The normal operating position of the contact. If the normal + operating position cannot be set then it is controlled via the + dip switch on the Measure-UPS and is therefore read-only." + ::= { mUpsContactEntry 2 } + +description OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The description of the purpose/use of the contact." + ::= { mUpsContactEntry 3 } + +monitoringStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown(1), + enabled(2), + disabled(3) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "A flag indicating whether this contact is + monitored, or not." + ::= { mUpsContactEntry 4 } + +currentStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown(1), + noFault(2), + fault(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This value indicates the current state of the contact. + If the contact is not in its normal state. This value + is set to fault(2)." + ::= { mUpsContactEntry 5 } + +-- Three Phase Group + +-- +-- Reset Max/Min Values Group +-- + + upsPhaseResetMaxMinValues OBJECT-TYPE + SYNTAX INTEGER { + none (1), + reset (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Reset the maximum and minimum UPS values: + upsPhaseInputMaxVoltage, upsPhaseInputMinVoltage, + upsPhaseInputMaxCurrent, upsPhaseInputMinCurrent, + upsPhaseInputMaxPower, upsPhaseInputMinPower, + upsPhaseOutputMaxCurrent, upsPhaseOutputMinCurrent, + upsPhaseOutputMaxLoad, upsPhaseOutputMinLoad, + upsPhaseOutputMaxPercentLoad, upsPhaseOutputMinPercentLoad, + upsPhaseOutputMaxPower, upsPhaseOutputMinPower, + upsPhaseOutputMaxPercentPower, upsPhaseOutputMinPercentPower." + ::= { upsPhaseResetValues 1 } + +-- +-- Input Group +-- + +-- Number of Inputs + + upsPhaseNumInputs OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of input feeds to this device. + This variable indicates the number of rows in the + input table." + ::= { upsPhaseInput 1 } + +-- Input Table + + upsPhaseInputTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsPhaseInputEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of input table entries. The number of entries + is given by the value of upsPhaseNumInputs." + ::= { upsPhaseInput 2 } + + upsPhaseInputEntry OBJECT-TYPE + SYNTAX UpsPhaseInputEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information applicable to a + particular input." + INDEX { upsPhaseInputTableIndex } + ::= { upsPhaseInputTable 1 } + + UpsPhaseInputEntry ::= SEQUENCE { + upsPhaseInputTableIndex INTEGER, + upsPhaseNumInputPhases INTEGER, + upsPhaseInputVoltageOrientation INTEGER, + upsPhaseInputFrequency INTEGER, + upsPhaseInputType INTEGER, + upsPhaseInputName DisplayString + } + + upsPhaseInputTableIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The input identifier." + ::= { upsPhaseInputEntry 1 } + + upsPhaseNumInputPhases OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of input phases utilized in this + device. The sum of all the upsPhaseNumInputPhases + variable indicates the number of rows in the + input phase table." + ::= { upsPhaseInputEntry 2 } + + upsPhaseInputVoltageOrientation OBJECT-TYPE + SYNTAX INTEGER { + unknown(1), + singlePhase(2), + splitPhase(3), + threePhasePhaseToNeutral(4), + threePhasePhaseToPhase(5) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The input voltage orientation: + 1: unknown for this UPS + 2: singlePhase - phase 1 voltage is between Phase 1 + and Neutral. + 3: splitPhase - phase 1 voltage is between Phase 1 and + Neutral; phase 2 voltage is between Phase 2 and Neutral; + phase 3 voltage is between Phase 1 and Phase2. + 4: threePhasePhaseToNeutral - phase 1 voltage is between + Phase 1 and Neutral; phase 2 voltage is between Phase 2 + and Neutral; phase 3 voltage is between Phase3 and + Neutral. + 5: threePhasePhaseToPhase - phase 1 voltage is between + Phase 1 and Phase 2; phase 2 voltage is between Phase 2 + and Phase 3; phase 3 voltage is between Phase 3 and + Phase 1." + ::= { upsPhaseInputEntry 3 } + + upsPhaseInputFrequency OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The input frequency in 0.1 Hertz, or -1 if it's unsupported + by this UPS." + ::= { upsPhaseInputEntry 4 } + + upsPhaseInputType OBJECT-TYPE + SYNTAX INTEGER { + unknown(1), + main(2), + bypass(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The input type." + ::= { upsPhaseInputEntry 5 } + + upsPhaseInputName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "A name given to a particular input." + ::= { upsPhaseInputEntry 6 } + +-- Input Phase Table + + upsPhaseInputPhaseTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsPhaseInputPhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of input table entries. The number of entries + is given by the sum of the upsPhaseNumInputPhases." + ::= { upsPhaseInput 3 } + + upsPhaseInputPhaseEntry OBJECT-TYPE + SYNTAX UpsPhaseInputPhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information applicable to a + particular input phase." + INDEX { upsPhaseInputPhaseTableIndex, upsPhaseInputPhaseIndex } + ::= { upsPhaseInputPhaseTable 1 } + + UpsPhaseInputPhaseEntry ::= SEQUENCE { + upsPhaseInputPhaseTableIndex INTEGER, + upsPhaseInputPhaseIndex INTEGER, + upsPhaseInputVoltage INTEGER, + upsPhaseInputMaxVoltage INTEGER, + upsPhaseInputMinVoltage INTEGER, + upsPhaseInputCurrent INTEGER, + upsPhaseInputMaxCurrent INTEGER, + upsPhaseInputMinCurrent INTEGER, + upsPhaseInputPower INTEGER, + upsPhaseInputMaxPower INTEGER, + upsPhaseInputMinPower INTEGER + } + + upsPhaseInputPhaseTableIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The input identifier." + ::= { upsPhaseInputPhaseEntry 1 } + + upsPhaseInputPhaseIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The input phase identifier." + ::= { upsPhaseInputPhaseEntry 2 } + + upsPhaseInputVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The input voltage in VAC, or -1 if it's unsupported + by this UPS." + ::= { upsPhaseInputPhaseEntry 3 } + + upsPhaseInputMaxVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The maximum input voltage in VAC measured + since the last reset (upsPhaseResetMaxMinValues), or + -1 if it's unsupported by this UPS. + Sampled every 30 seconds." + ::= { upsPhaseInputPhaseEntry 4 } + + upsPhaseInputMinVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The minimum input voltage in VAC measured + since the last reset (upsPhaseResetMaxMinValues), or + -1 if it's unsupported by this UPS. + Sampled every 30 seconds." + ::= { upsPhaseInputPhaseEntry 5 } + + upsPhaseInputCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The input current in 0.1 amperes, or -1 if it's + unsupported by this UPS." + ::= { upsPhaseInputPhaseEntry 6 } + + upsPhaseInputMaxCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The maximum input current in 0.1 amperes measured + since the last reset (upsPhaseResetMaxMinValues), or + -1 if it's unsupported by this UPS. + Sampled every 30 seconds." + ::= { upsPhaseInputPhaseEntry 7 } + + upsPhaseInputMinCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The minimum input current in 0.1 amperes measured + since the last reset (upsPhaseResetMaxMinValues), or + -1 if it's unsupported by this UPS. + Sampled every 30 seconds." + ::= { upsPhaseInputPhaseEntry 8 } + + upsPhaseInputPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The input power in Watts, or -1 if it's unsupported + by this UPS." + ::= { upsPhaseInputPhaseEntry 9 } + + upsPhaseInputMaxPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The maximum input power in Watts measured + since the last reset (upsPhaseResetMaxMinValues), or + -1 if it's unsupported by this UPS. + Sampled every 30 seconds." + ::= { upsPhaseInputPhaseEntry 10 } + + upsPhaseInputMinPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The minimum input power in Watts measured + since the last reset (upsPhaseResetMaxMinValues), or + -1 if it's unsupported by this UPS. + Sampled every 30 seconds." + ::= { upsPhaseInputPhaseEntry 11 } + + -- + -- The Output group. + -- + + -- Number of Outputs + + upsPhaseNumOutputs OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of output feeds to this device. + This variable indicates the number of rows in the + output table." + ::= { upsPhaseOutput 1 } + + -- Output Table + + upsPhaseOutputTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsPhaseOutputEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of output table entries. The number of entries + is given by the value of upsOutputNumPhases." + ::= { upsPhaseOutput 2 } + + upsPhaseOutputEntry OBJECT-TYPE + SYNTAX UpsPhaseOutputEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information applicable to a + particular output." + INDEX { upsPhaseOutputTableIndex } + ::= { upsPhaseOutputTable 1 } + + UpsPhaseOutputEntry ::= SEQUENCE { + upsPhaseOutputTableIndex INTEGER, + upsPhaseNumOutputPhases INTEGER, + upsPhaseOutputVoltageOrientation INTEGER, + upsPhaseOutputFrequency INTEGER + } + + upsPhaseOutputTableIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The output identifier." + ::= { upsPhaseOutputEntry 1 } + + upsPhaseNumOutputPhases OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of output phases utilized in this + device. The sum of all the upsPhaseNumOutputPhases + variable indicates the number of rows in the + output phase table." + ::= { upsPhaseOutputEntry 2 } + + upsPhaseOutputVoltageOrientation OBJECT-TYPE + SYNTAX INTEGER { + unknown(1), + singlePhase(2), + splitPhase(3), + threePhasePhaseToNeutral(4), + threePhasePhaseToPhase(5) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The output voltage orientation: + 1: unknown for this UPS + 2: singlePhase - phase 1 voltage is between Phase 1 + and Neutral. + 3: splitPhase - phase 1 voltage is between Phase 1 and + Neutral; phase 2 voltage is between Phase 2 and Neutral; + phase 3 voltage is between Phase 1 and Phase2. + 4: threePhasePhaseToNeutral - phase 1 voltage is between + Phase 1 and Neutral; phase 2 voltage is between Phase 2 + and Neutral; phase 3 voltage is between Phase3 and + Neutral. + 5: threePhasePhaseToPhase - phase 1 voltage is between + Phase 1 and Phase 2; phase 2 voltage is between Phase 2 + and Phase 3; phase 3 voltage is between Phase 3 and + Phase 1." + ::= { upsPhaseOutputEntry 3 } + + upsPhaseOutputFrequency OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The output frequency in 0.1 Hertz, or -1 if it's + unsupported by this UPS." + ::= { upsPhaseOutputEntry 4 } + + -- Output Phase Table + + upsPhaseOutputPhaseTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsPhaseOutputPhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of output table entries. The number of + entries is given by the sum of the upsPhaseNumOutputPhases." + ::= { upsPhaseOutput 3 } + + upsPhaseOutputPhaseEntry OBJECT-TYPE + SYNTAX UpsPhaseOutputPhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information applicable to a + particular output phase." + INDEX { upsPhaseOutputPhaseTableIndex, upsPhaseOutputPhaseIndex } + ::= { upsPhaseOutputPhaseTable 1 } + + UpsPhaseOutputPhaseEntry ::= SEQUENCE { + upsPhaseOutputPhaseTableIndex INTEGER, + upsPhaseOutputPhaseIndex INTEGER, + upsPhaseOutputVoltage INTEGER, + upsPhaseOutputCurrent INTEGER, + upsPhaseOutputMaxCurrent INTEGER, + upsPhaseOutputMinCurrent INTEGER, + upsPhaseOutputLoad INTEGER, + upsPhaseOutputMaxLoad INTEGER, + upsPhaseOutputMinLoad INTEGER, + upsPhaseOutputPercentLoad INTEGER, + upsPhaseOutputMaxPercentLoad INTEGER, + upsPhaseOutputMinPercentLoad INTEGER, + upsPhaseOutputPower INTEGER, + upsPhaseOutputMaxPower INTEGER, + upsPhaseOutputMinPower INTEGER, + upsPhaseOutputPercentPower INTEGER, + upsPhaseOutputMaxPercentPower INTEGER, + upsPhaseOutputMinPercentPower INTEGER + } + + upsPhaseOutputPhaseTableIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The output identifier." + ::= { upsPhaseOutputPhaseEntry 1 } + + upsPhaseOutputPhaseIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The output phase identifier." + ::= { upsPhaseOutputPhaseEntry 2 } + + upsPhaseOutputVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The output voltage in VAC, or -1 if it's unsupported + by this UPS." + ::= { upsPhaseOutputPhaseEntry 3 } + + upsPhaseOutputCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The output current in 0.1 amperes drawn + by the load on the UPS, or -1 if it's unsupported + by this UPS." + ::= { upsPhaseOutputPhaseEntry 4 } + + upsPhaseOutputMaxCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The maximum output current in 0.1 amperes measured + since the last reset (upsPhaseResetMaxMinValues), or + -1 if it's unsupported by this UPS. + Sampled every 30 seconds." + ::= { upsPhaseOutputPhaseEntry 5 } + + upsPhaseOutputMinCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The minimum output current in 0.1 amperes measured + since the last reset (upsPhaseResetMaxMinValues), or + -1 if it's unsupported by this UPS. + Sampled every 30 seconds." + ::= { upsPhaseOutputPhaseEntry 6 } + + upsPhaseOutputLoad OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The output load in VA, or -1 if it's unsupported + by this UPS." + ::= { upsPhaseOutputPhaseEntry 7 } + + upsPhaseOutputMaxLoad OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The maximum output load in VA measured + since the last reset (upsPhaseResetMaxMinValues), or + -1 if it's unsupported by this UPS. + Sampled every 30 seconds." + ::= { upsPhaseOutputPhaseEntry 8 } + + upsPhaseOutputMinLoad OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The minimum output load in VA measured + since the last reset (upsPhaseResetMaxMinValues), or + -1 if it's unsupported by this UPS. + Sampled every 30 seconds." + ::= { upsPhaseOutputPhaseEntry 9 } + + upsPhaseOutputPercentLoad OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The percentage of the UPS load capacity in VA at + redundancy @ (n + x) presently being used on this + output phase, or -1 if it's unsupported by this UPS." + ::= { upsPhaseOutputPhaseEntry 10 } + + upsPhaseOutputMaxPercentLoad OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The maximum percentage of the UPS load capacity in + VA measured at redundancy @ (n + x) presently + being used on this output phase since the last reset + (upsPhaseResetMaxMinValues), or -1 if it's unsupported + by this UPS. Sampled every 30 seconds." + ::= { upsPhaseOutputPhaseEntry 11 } + + upsPhaseOutputMinPercentLoad OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The minimum percentage of the UPS load capacity in + VA measured at redundancy @ (n + x) presently + being used on this output phase since the last reset + (upsPhaseResetMaxMinValues), or -1 if it's unsupported + by this UPS. Sampled every 30 seconds." + ::= { upsPhaseOutputPhaseEntry 12 } + + upsPhaseOutputPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The output power in Watts, or -1 if it's + unsupported by this UPS." + ::= { upsPhaseOutputPhaseEntry 13 } + + upsPhaseOutputMaxPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The maximum output power in Watts measured + since the last reset (upsPhaseResetMaxMinValues), or + -1 if it's unsupported by this UPS. + Sampled every 30 seconds." + ::= { upsPhaseOutputPhaseEntry 14 } + + upsPhaseOutputMinPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The minimum output power in Watts measured + since the last reset (upsPhaseResetMaxMinValues), or + -1 if it's unsupported by this UPS. + Sampled every 30 seconds." + ::= { upsPhaseOutputPhaseEntry 15 } + + upsPhaseOutputPercentPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The percentage of the UPS power capacity in Watts at + redundancy @ (n + x) presently being used on this + output phase, or -1 if it's unsupported by this UPS." + ::= { upsPhaseOutputPhaseEntry 16 } + + upsPhaseOutputMaxPercentPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The maximum percentage of the UPS power capacity + in Watts measured at redundancy @ (n + x) presently + being used on this output phase since the last + reset (upsPhaseResetMaxMinValues), or -1 if it's + unsupported by this UPS. Sampled every 30 seconds." + ::= { upsPhaseOutputPhaseEntry 17 } + + upsPhaseOutputMinPercentPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The maximum percentage of the UPS power capacity + in Watts measured at redundancy @ (n + x) presently + being used on this output phase since the last + reset (upsPhaseResetMaxMinValues), or -1 if it's + unsupported by this UPS. Sampled every 30 seconds." + ::= { upsPhaseOutputPhaseEntry 18 } + +-- the upsOutletGroupStatus group + +upsOutletGroupStatusTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of outlet groups for the UPS." + ::= { upsOutletGroupStatus 1 } + +upsOutletGroupStatusTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsOutletGroupStatusEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for getting status of the outlet groups. The number of + entries is contained in the upsOutletGroupStatusTableSize OID." + ::= { upsOutletGroupStatus 2 } + +upsOutletGroupStatusEntry OBJECT-TYPE + SYNTAX UpsOutletGroupStatusEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The outlet group status to get." + INDEX { upsOutletGroupStatusIndex} + ::= { upsOutletGroupStatusTable 1 } + +UpsOutletGroupStatusEntry ::= + SEQUENCE { + upsOutletGroupStatusIndex INTEGER, + upsOutletGroupStatusName DisplayString, + upsOutletGroupStatusGroupState INTEGER, + upsOutletGroupStatusCommandPending INTEGER + } + +upsOutletGroupStatusIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the outlet group entry." + ::= { upsOutletGroupStatusEntry 1 } + +upsOutletGroupStatusName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the outlet group. This OID is provided + for informational purposes only. This value is set + by the upsOutletGroupConfigName OID." + ::= { upsOutletGroupStatusEntry 2 } + +upsOutletGroupStatusGroupState OBJECT-TYPE + SYNTAX INTEGER { + upsOutletGroupStatusOn (1), + upsOutletGroupStatusOff (2), + upsOutletGroupStatusUnknown (3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this variable will return the outlet group state. If the outlet + group is on, the upsOutletGroupStatusOn (1) value will be returned. If + the outlet group is off, the upsOutletGroupStatusOff (2) value will be + returned. If the state of the outlet group cannot be determined, the + upsOutletGroupStatusUnknown (3) value will be returned." + + ::= { upsOutletGroupStatusEntry 3 } + +upsOutletGroupStatusCommandPending OBJECT-TYPE + SYNTAX INTEGER { + upsOutletGroupCommandPending (1), + upsOutletGroupNoCommandPending (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this variable will return the command pending + state of the outlet group. If a command is pending on the + outlet group, the upsOutletGroupCommandPending (1) value + will be returned. If there is not a command pending + on the outlet group, the upsOutletGroupNoCommandPending (2) + will be returned." + ::= { upsOutletGroupStatusEntry 4 } + +-- the upsOutletGroupConfig group + +upsOutletGroupConfigTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of outlet groups for the UPS." + ::= { upsOutletGroupConfig 1 } + +upsOutletGroupConfigTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsOutletGroupConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The list of outlet groups to configure. The number of entries + is defined by the upsOutletGroupConfigTableSize OID." + ::= { upsOutletGroupConfig 2 } + +upsOutletGroupConfigEntry OBJECT-TYPE + SYNTAX UpsOutletGroupConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The outlet groups to configure." + INDEX { upsOutletGroupConfigIndex} + ::= { upsOutletGroupConfigTable 1 } + +UpsOutletGroupConfigEntry ::= + SEQUENCE { + upsOutletGroupConfigIndex INTEGER, + upsOutletGroupConfigName DisplayString, + upsOutletGroupConfigPowerOnDelay INTEGER, + upsOutletGroupConfigPowerOffDelay INTEGER, + upsOutletGroupConfigRebootDuration INTEGER + } + +upsOutletGroupConfigIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the outlet group entry." + ::= { upsOutletGroupConfigEntry 1 } + +upsOutletGroupConfigName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the outlet group." + ::= { upsOutletGroupConfigEntry 2 } + +upsOutletGroupConfigPowerOnDelay OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The amount of time (in seconds) the outlet group will delay + powering on when the delayed on or reboot command is applied. + Allowed values are -1 (for Never) or 0 to 600 seconds." + ::= { upsOutletGroupConfigEntry 3 } + +upsOutletGroupConfigPowerOffDelay OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The amount of time (in seconds) the outlet group will delay + powering off when the delayed off command is applied. + Allowed values are 0 to 600 seconds." + ::= { upsOutletGroupConfigEntry 4 } + +upsOutletGroupConfigRebootDuration OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "During a reboot sequence, power is turned off and then + back on. This OID defines the amount of time to wait, + in seconds, after turning the power off, at the start + of the sequence, before initiating the power on sequence. + Allowed values are 0 to 600 seconds." + ::= { upsOutletGroupConfigEntry 5 } + +-- the upsOutletGroupControl group + +upsOutletGroupControlTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of outlet groups for the UPS." + ::= { upsOutletGroupControl 1 } + +upsOutletGroupControlTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsOutletGroupControlEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for control of individual outlet groups. The number of + entries is contained in the upsOutletGroupControlTableSize OID." + ::= { upsOutletGroupControl 2 } + +upsOutletGroupControlEntry OBJECT-TYPE + SYNTAX UpsOutletGroupControlEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The outlet group to control." + INDEX { upsOutletGroupControlIndex} + ::= { upsOutletGroupControlTable 1 } + +UpsOutletGroupControlEntry ::= + SEQUENCE { + upsOutletGroupControlIndex INTEGER, + upsOutletGroupControlName DisplayString, + upsOutletGroupControlCommand INTEGER + } + +upsOutletGroupControlIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the outlet group entry." + ::= { upsOutletGroupControlEntry 1 } + +upsOutletGroupControlName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the outlet group. This OID is provided + for informational purposes only. This value is set + by the upsOutletGroupConfigName OID." + ::= { upsOutletGroupControlEntry 2 } + +upsOutletGroupControlCommand OBJECT-TYPE + SYNTAX INTEGER { + upsOutletGroupImmediateOn (1), + upsOutletGroupImmediateOff (2), + upsOutletGroupImmediateReboot (3), + upsOutletGroupDelayedOn (4), + upsOutletGroupDelayedOff (5), + upsOutletGroupDelayedReboot (6), + upsOutletGroupCancelPendingCommand (7), + upsOutletGroupControlUnknown (8) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Getting this variable will return the outlet group state. If the outlet + group is on, the upsOutletGroupImmediateOn (1) value will be returned. If + the outlet group is off, the upsOutletGroupImmediateOff (2) value will be + returned. + + If the state of the outlet group cannot be determined, the + upsOutletGroupControlUnknown (8) value will be returned. + + Setting this variable to upsOutletGroupImmediateOn (1) will turn the + outlet group on. + + Setting this variable to upsOutletGroupImmediateOff (2) will turn the + outlet group off. + + Setting this variable to upsOutletGroupImmediateReboot (3) will turn the outlet + group off, wait the upsOutletGroupConfigRebootDuration OID time, wait the + upsOutletGroupConfigPowerOnDelay OID, and then turn the outlet group on. + + Setting this variable to upsOutletGroupDelayedOn (4) will turn the outlet + group on after the upsOutletGroupConfigPowerOnDelay OID has elapsed. + + Setting this variable to upsOutletGroupDelayedOff (5) will turn the outlet + group off after the upsOutletGroupConfigPowerOffDelay OID has elapsed. + + Setting this variable to upsOutletGroupDelayedReboot (6) will turn the outlet + group off after the upsOutletGroupConfigPowerOffDelay OID has elapsed, wait the + upsOutletGroupConfigRebootDuration OID time, wait the + upsOutletGroupConfigPowerOnDelay OID, and then turn the outlet group on. + + Setting this variable to upsOutletGroupCancelPendingCommand (7) will + cause any pending command to this outlet group to be canceled." + ::= { upsOutletGroupControlEntry 3 } + +-- the upsDiagnosticIM group + +upsDiagIMTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of Intelligence Modules in or attached to the UPS." + ::= { upsDiagnosticIM 1 } + +upsDiagIMTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsDiagIMEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for diagnostics of individual Intelligence Modules. The number of + entries is contained in the upsDiagIMTableSize OID." + ::= { upsDiagnosticIM 2 } + +upsDiagIMEntry OBJECT-TYPE + SYNTAX UpsDiagIMEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The diagnostics and information of an Intelligence Module." + INDEX { upsDiagIMIndex} + ::= { upsDiagIMTable 1 } + +UpsDiagIMEntry ::= + SEQUENCE { + upsDiagIMIndex INTEGER, + upsDiagIMType INTEGER, + upsDiagIMStatus INTEGER, + upsDiagIMFirmwareRev DisplayString, + upsDiagIMSlaveFirmwareRev DisplayString, + upsDiagIMHardwareRev DisplayString, + upsDiagIMSerialNum DisplayString, + upsDiagIMManufactureDate DisplayString + } + +upsDiagIMIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the Intelligence Module entry." + ::= { upsDiagIMEntry 1 } + +upsDiagIMType OBJECT-TYPE + SYNTAX INTEGER { + imUnknown (1), + imMIM (2), + imRIM (3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The type of the Intelligence Module. + imUnknown(1) indicates the IM type is unknown. + imMIM(2) indicates the IM type is a Main Intelligence Module. + imRIM(3) indicates the IM type is Redundant Intelligence Module." + ::= { upsDiagIMEntry 2 } + +upsDiagIMStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + offOk (3), + onOk (4), + offFail (5), + onFail (6), + lostComm (7) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the Intelligence Module. + unknown(1) indicates the device status is unknown. + notInstalled(2) indicates the device is not installed. + offOk(3) indicates the device status is off and OK. + onOk(4) indicates the device status is on and OK. + offFail(5) indicates the device status is off and failed. + onFail(6) indicates the device status is on and failed. + lostComm(7) indicates the device has lost communication." + ::= { upsDiagIMEntry 3 } + +upsDiagIMFirmwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The firmware revision of the Intelligence Module." + ::= { upsDiagIMEntry 4 } + +upsDiagIMSlaveFirmwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The slave firmware revision of the Intelligence Module." + ::= { upsDiagIMEntry 5 } + +upsDiagIMHardwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The hardware revision of the Intelligence Module." + ::= { upsDiagIMEntry 6 } + +upsDiagIMSerialNum OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The serial number of the Intelligence Module." + ::= { upsDiagIMEntry 7 } + +upsDiagIMManufactureDate OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The manufacture date of the Intelligence Module." + ::= { upsDiagIMEntry 8 } + +-- the upsDiagnosticPowerModules group + +upsDiagPMTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of Power Modules in or attached to the UPS." + ::= { upsDiagnosticPowerModules 1 } + +upsDiagPMTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsDiagPMEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for diagnostics of Individual Power modules. The number of + entries is contained in the upsDiagPMTableSize OID." + ::= { upsDiagnosticPowerModules 2 } + +upsDiagPMEntry OBJECT-TYPE + SYNTAX UpsDiagPMEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The diagnostics of an Power Module." + INDEX { upsDiagPMIndex} + ::= { upsDiagPMTable 1 } + +UpsDiagPMEntry ::= + SEQUENCE { + upsDiagPMIndex INTEGER, + upsDiagPMStatus INTEGER, + upsDiagPMFirmwareRev DisplayString, + upsDiagPMHardwareRev DisplayString, + upsDiagPMSerialNum DisplayString, + upsDiagPMManufactureDate DisplayString + } + +upsDiagPMIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the Power Module entry." + ::= { upsDiagPMEntry 1 } + +upsDiagPMStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + offOk (3), + onOk (4), + offFail (5), + onFail (6), + lostComm (7) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the Power Module. + unknown(1) indicates the device status is unknown. + notInstalled(2) indicates the device is not installed. + offOk(3) indicates the device status is off and OK. + onOk(4) indicates the device status is on and OK. + offFail(5) indicates the device status is off and failed. + onFail(6) indicates the device status is on and failed. + lostComm(7) indicates the device has lost communication." + ::= { upsDiagPMEntry 2 } + +upsDiagPMFirmwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The firmware revision of the Power Module." + ::= { upsDiagPMEntry 3 } + +upsDiagPMHardwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The hardware revision of the Power Module." + ::= { upsDiagPMEntry 4 } + +upsDiagPMSerialNum OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The serial number of the Power Module." + ::= { upsDiagPMEntry 5 } + +upsDiagPMManufactureDate OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The manufacture date of the Power Module." + ::= { upsDiagPMEntry 6 } + +-- the upsDiagnosticBatteries group + +upsDiagBatteryTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of batteries in or attached to the UPS." + ::= { upsDiagnosticBatteries 1 } + +upsDiagBatteryTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsDiagBatteryEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for diagnostics of individual batteries. The number of + entries is contained in the upsDiagBattTableSize OID." + ::= { upsDiagnosticBatteries 2 } + +upsDiagBatteryEntry OBJECT-TYPE + SYNTAX UpsDiagBatteryEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The diagnostics of a battery." + INDEX { upsDiagBatteryIndex} + ::= { upsDiagBatteryTable 1 } + +UpsDiagBatteryEntry ::= + SEQUENCE { + upsDiagBatteryFrameIndex INTEGER, + upsDiagBatteryIndex INTEGER, + upsDiagBatteryStatus INTEGER, + upsDiagBatterySerialNumber DisplayString, + upsDiagBatteryFirmwareRev DisplayString, + upsDiagBatteryManufactureDate DisplayString, + upsDiagBatteryType DisplayString + } + +upsDiagBatteryFrameIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the battery frame entry. + Frame 0 indicates the Main frame. Extended Run (XR) frames + start from index 1." + ::= { upsDiagBatteryEntry 1 } + +upsDiagBatteryIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the battery entry." + ::= { upsDiagBatteryEntry 2 } + +upsDiagBatteryStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + ok (3), + failed (4), + highTemperature (5), + replaceImmediately (6), + lowCapacity (7) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the battery. + unknown(1) indicates the device status is unknown. + notInstalled(2) indicates the device is not installed. + ok(3) indicates the battery status is OK. + failed(4) indicates the battery status is failed. + highTemperature(5) indicates the battery has a high temperature condition. + replaceImmediately(6) indicates the battery must be replaced immediately. + lowCapacity(7) indicates the battery has a low capacity." + ::= { upsDiagBatteryEntry 3 } + +upsDiagBatterySerialNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The serial number of the battery." + ::= { upsDiagBatteryEntry 4 } + +upsDiagBatteryFirmwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The firmware revision of the battery." + ::= { upsDiagBatteryEntry 5 } + +upsDiagBatteryManufactureDate OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The manufacture date of the battery." + ::= { upsDiagBatteryEntry 6 } + +upsDiagBatteryType OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The battery type or rating for the battery." + ::= { upsDiagBatteryEntry 7 } + +-- the upsDiagnosticSubsystem group + +upsDiagSubSysFrameTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of frames attached to the UPS including the Main frame." + ::= { upsDiagnosticSubsystem 1 } + +upsDiagSubSysFrameTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsDiagSubSysFrameEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for diagnostics of individual XR Frames." + ::= { upsDiagnosticSubsystem 2 } + +upsDiagSubSysFrameEntry OBJECT-TYPE + SYNTAX UpsDiagSubSysFrameEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The diagnostics of an XR Frame." + INDEX { upsDiagSubSysFrameIndex} + ::= { upsDiagSubSysFrameTable 1 } + +UpsDiagSubSysFrameEntry ::= + SEQUENCE { + upsDiagSubSysFrameIndex INTEGER, + upsDiagSubSysFrameType INTEGER, + upsDiagSubSysFrameFirmwareRev DisplayString, + upsDiagSubSysFrameHardwareRev DisplayString, + upsDiagSubSysFrameSerialNum DisplayString, + upsDiagSubSysFrameManufactureDate DisplayString + } + +upsDiagSubSysFrameIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The frame index entry." + ::= { upsDiagSubSysFrameEntry 1 } + +upsDiagSubSysFrameType OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + frameTypeMain (3), + frameTypeXR (4), + frameTypeLXR (5) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The type of Frame. + unknown(1) indicates the device status is unknown. + notInstalled(2) indicates the device is not installed. + frameTypeMain(3) indicates the the frame type is the Main Frame. + frameTypeXR(4) indicates the frame type is an XR Frame. + frameTypeLXR(5) indicates the frame type is an LXR Frame." + ::= { upsDiagSubSysFrameEntry 2 } + +upsDiagSubSysFrameFirmwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The firmware revision of the frame." + ::= { upsDiagSubSysFrameEntry 3 } + +upsDiagSubSysFrameHardwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The hardware revision of the frame." + ::= { upsDiagSubSysFrameEntry 4 } + +upsDiagSubSysFrameSerialNum OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The serial number of the frame." + ::= { upsDiagSubSysFrameEntry 5 } + +upsDiagSubSysFrameManufactureDate OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The manufacture date of the frame." + ::= { upsDiagSubSysFrameEntry 6 } + +upsDiagSubSysIntBypSwitchTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of Internal Bypass switches attached to the UPS." + ::= { upsDiagnosticSubsystem 3 } + +upsDiagSubSysIntBypSwitchTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsDiagSubSysIntBypSwitchEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for diagnostics of the Internal Bypass Switch." + ::= { upsDiagnosticSubsystem 4 } + +upsDiagSubSysIntBypSwitchEntry OBJECT-TYPE + SYNTAX UpsDiagSubSysIntBypSwitchEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The diagnostics of the Internal Bypass Switch." + INDEX { upsDiagSubSysIntBypSwitchIndex} + ::= { upsDiagSubSysIntBypSwitchTable 1 } + +UpsDiagSubSysIntBypSwitchEntry ::= + SEQUENCE { + upsDiagSubSysIntBypSwitchFrameIndex INTEGER, + upsDiagSubSysIntBypSwitchIndex INTEGER, + upsDiagSubSysIntBypSwitchStatus INTEGER, + upsDiagSubSysIntBypSwitchFirmwareRev DisplayString, + upsDiagSubSysIntBypSwitchHardwareRev DisplayString, + upsDiagSubSysIntBypSwitchSerialNum DisplayString, + upsDiagSubSysIntBypSwitchManufactureDate DisplayString + } + +upsDiagSubSysIntBypSwitchFrameIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The frame index entry." + ::= { upsDiagSubSysIntBypSwitchEntry 1 } + +upsDiagSubSysIntBypSwitchIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The Internal Bypass Switch index entry." + ::= { upsDiagSubSysIntBypSwitchEntry 2 } + +upsDiagSubSysIntBypSwitchStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + offOk (3), + onOk (4), + offFail (5), + onFail (6), + lostComm (7) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The Internal Bypass Switch status. + unknown(1) indicates the device status is unknown. + notInstalled(2) indicates the device is not installed. + offOk(3) indicates the device status is off and OK. + onOk(4) indicates the device status is on and OK. + offFail(5) indicates the device status is off and failed. + onFail(6) indicates the device status is on and failed. + lostComm(7) indicates the device has lost communication." + ::= { upsDiagSubSysIntBypSwitchEntry 3 } + +upsDiagSubSysIntBypSwitchFirmwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The firmware revision of the Internal Bypass Switch." + ::= { upsDiagSubSysIntBypSwitchEntry 4 } + +upsDiagSubSysIntBypSwitchHardwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The hardware revision of the Internal Bypass Switch." + ::= { upsDiagSubSysIntBypSwitchEntry 5 } + +upsDiagSubSysIntBypSwitchSerialNum OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The serial number of the Internal Bypass Switch." + ::= { upsDiagSubSysIntBypSwitchEntry 6 } + +upsDiagSubSysIntBypSwitchManufactureDate OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The manufacture date of the Internal Bypass Switch." + ::= { upsDiagSubSysIntBypSwitchEntry 7 } + +upsDiagSubSysBattMonitorTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of Battery Monitor Boards attached to the UPS." + ::= { upsDiagnosticSubsystem 5 } + +upsDiagSubSysBattMonitorTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsDiagSubSysBattMonitorEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for diagnostics of the Battery Monitor Board." + ::= { upsDiagnosticSubsystem 6 } + +upsDiagSubSysBattMonitorEntry OBJECT-TYPE + SYNTAX UpsDiagSubSysBattMonitorEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The diagnostics of the Battery Monitor Board." + INDEX { upsDiagSubSysBattMonitorIndex} + ::= { upsDiagSubSysBattMonitorTable 1 } + +UpsDiagSubSysBattMonitorEntry ::= + SEQUENCE { + upsDiagSubSysBattMonitorFrameIndex INTEGER, + upsDiagSubSysBattMonitorIndex INTEGER, + upsDiagSubSysBattMonitorStatus INTEGER, + upsDiagSubSysBattMonitorFirmwareRev DisplayString, + upsDiagSubSysBattMonitorHardwareRev DisplayString, + upsDiagSubSysBattMonitorSerialNum DisplayString, + upsDiagSubSysBattMonitorManufactureDate DisplayString + } + +upsDiagSubSysBattMonitorFrameIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The frame index entry." + ::= { upsDiagSubSysBattMonitorEntry 1 } + +upsDiagSubSysBattMonitorIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of the Battery Monitor Board." + ::= { upsDiagSubSysBattMonitorEntry 2 } + +upsDiagSubSysBattMonitorStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + offOk (3), + onOk (4), + offFail (5), + onFail (6), + lostComm (7) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the Battery Monitor Board. + unknown(1) indicates the device status is unknown. + notInstalled(2) indicates the device is not installed. + offOk(3) indicates the device status is off and OK. + onOk(4) indicates the device status is on and OK. + offFail(5) indicates the device status is off and failed. + onFail(6) indicates the device status is on and failed. + lostComm(7) indicates the device has lost communication." + ::= { upsDiagSubSysBattMonitorEntry 3 } + +upsDiagSubSysBattMonitorFirmwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The firmware revision of the Battery Monitor Board." + ::= { upsDiagSubSysBattMonitorEntry 4 } + +upsDiagSubSysBattMonitorHardwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The hardware revision of the Battery Monitor Board." + ::= { upsDiagSubSysBattMonitorEntry 5 } + +upsDiagSubSysBattMonitorSerialNum OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The serial number of the Battery Monitor Board." + ::= { upsDiagSubSysBattMonitorEntry 6 } + +upsDiagSubSysBattMonitorManufactureDate OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The date of the manufacture for the Battery Monitor Board." + ::= { upsDiagSubSysBattMonitorEntry 7 } + +upsDiagSubSysExternalSwitchGearTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of External Switch Gears attached to the UPS." + ::= { upsDiagnosticSubsystem 7 } + +upsDiagSubSysExternalSwitchGearTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsDiagSubSysExternalSwitchGearEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for diagnostics of the individual External Switch Gear." + ::= { upsDiagnosticSubsystem 8 } + +upsDiagSubSysExternalSwitchGearEntry OBJECT-TYPE + SYNTAX UpsDiagSubSysExternalSwitchGearEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The diagnostics of an individual External Switch Gear." + INDEX { upsDiagSubSysExternalSwitchGearIndex} + ::= { upsDiagSubSysExternalSwitchGearTable 1 } + +UpsDiagSubSysExternalSwitchGearEntry ::= + SEQUENCE { + upsDiagSubSysExternalSwitchGearFrameIndex INTEGER, + upsDiagSubSysExternalSwitchGearIndex INTEGER, + upsDiagSubSysExternalSwitchGearStatus INTEGER, + upsDiagSubSysExternalSwitchGearFirmwareRev DisplayString, + upsDiagSubSysExternalSwitchGearHardwareRev DisplayString, + upsDiagSubSysExternalSwitchGearSerialNum DisplayString, + upsDiagSubSysExternalSwitchGearManufactureDate DisplayString + } + +upsDiagSubSysExternalSwitchGearFrameIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The frame index entry." + ::= { upsDiagSubSysExternalSwitchGearEntry 1 } + +upsDiagSubSysExternalSwitchGearIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of the External Switch Gear." + ::= { upsDiagSubSysExternalSwitchGearEntry 2 } + +upsDiagSubSysExternalSwitchGearStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + offOk (3), + onOk (4), + offFail (5), + onFail (6), + lostComm (7) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the External Switch Gear. + unknown(1) indicates the device status is unknown. + notInstalled(2) indicates the device is not installed. + offOk(3) indicates the device status is off and OK. + onOk(4) indicates the device status is on and OK. + offFail(5) indicates the device status is off and failed. + onFail(6) indicates the device status is on and failed. + lostComm(7) indicates the device has lost communication." + ::= { upsDiagSubSysExternalSwitchGearEntry 3 } + +upsDiagSubSysExternalSwitchGearFirmwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The firmware revision of the External Switch Gear monitor card." + ::= { upsDiagSubSysExternalSwitchGearEntry 4 } + +upsDiagSubSysExternalSwitchGearHardwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The hardware revision of the External Switch Gear monitor card." + ::= { upsDiagSubSysExternalSwitchGearEntry 5 } + +upsDiagSubSysExternalSwitchGearSerialNum OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The serial number of the External Switch Gear monitor card." + ::= { upsDiagSubSysExternalSwitchGearEntry 6 } + +upsDiagSubSysExternalSwitchGearManufactureDate OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The date of the manufacture for the External Switch Gear monitor card." + ::= { upsDiagSubSysExternalSwitchGearEntry 7 } + +upsDiagSubSysDisplayInterfaceCardTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of Display Interface Cards attached to the UPS." + ::= { upsDiagnosticSubsystem 9 } + +upsDiagSubSysDisplayInterfaceCardTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsDiagSubSysDisplayInterfaceCardEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for diagnostics of individual Display Interface Cards." + ::= { upsDiagnosticSubsystem 10 } + +upsDiagSubSysDisplayInterfaceCardEntry OBJECT-TYPE + SYNTAX UpsDiagSubSysDisplayInterfaceCardEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The diagnostics of a Display Interface Card." + INDEX { upsDiagSubSysDisplayInterfaceCardIndex} + ::= { upsDiagSubSysDisplayInterfaceCardTable 1 } + +UpsDiagSubSysDisplayInterfaceCardEntry ::= + SEQUENCE { + upsDiagSubSysDisplayInterfaceCardFrameIndex INTEGER, + upsDiagSubSysDisplayInterfaceCardIndex INTEGER, + upsDiagSubSysDisplayInterfaceCardStatus INTEGER + } + +upsDiagSubSysDisplayInterfaceCardFrameIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The frame index entry." + ::= { upsDiagSubSysDisplayInterfaceCardEntry 1 } + +upsDiagSubSysDisplayInterfaceCardIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of the Display Interface Card." + ::= { upsDiagSubSysDisplayInterfaceCardEntry 2 } + +upsDiagSubSysDisplayInterfaceCardStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + offOk (3), + onOk (4), + offFail (5), + onFail (6), + lostComm (7) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the Display Interface Card. + unknown(1) indicates the device status is unknown. + notInstalled(2) indicates the device is not installed. + offOk(3) indicates the device status is off and OK. + onOk(4) indicates the device status is on and OK. + offFail(5) indicates the device status is off and failed. + onFail(6) indicates the device status is on and failed. + lostComm(7) indicates the device has lost communication." + ::= { upsDiagSubSysDisplayInterfaceCardEntry 3 } + +upsDiagSubSysDCCircuitBreakerTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of DC Circuit Breakers attached to the UPS." + ::= { upsDiagnosticSubsystem 11 } + +upsDiagSubSysDCCircuitBreakerTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsDiagSubSysDCCircuitBreakerEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for diagnostics of individual DC Circuit Breakers." + ::= { upsDiagnosticSubsystem 12 } + +upsDiagSubSysDCCircuitBreakerEntry OBJECT-TYPE + SYNTAX UpsDiagSubSysDCCircuitBreakerEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The diagnostics of a DC Circuit Breaker." + INDEX { upsDiagSubSysDCCircuitBreakerIndex} + ::= { upsDiagSubSysDCCircuitBreakerTable 1 } + +UpsDiagSubSysDCCircuitBreakerEntry ::= + SEQUENCE { + upsDiagSubSysDCCircuitBreakerFrameIndex INTEGER, + upsDiagSubSysDCCircuitBreakerIndex INTEGER, + upsDiagSubSysDCCircuitBreakerStatus INTEGER + } + +upsDiagSubSysDCCircuitBreakerFrameIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The frame index entry." + ::= { upsDiagSubSysDCCircuitBreakerEntry 1 } + +upsDiagSubSysDCCircuitBreakerIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of the DC Circuit Breaker." + ::= { upsDiagSubSysDCCircuitBreakerEntry 2 } + +upsDiagSubSysDCCircuitBreakerStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + opened (3), + closed (4) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the DC Circuit Breaker. + unknown(1) indicates the circuit breaker status is unknown. + notInstalled(2) indicates the circuit breaker is not installed. + opened(3) indicates the circuit breaker is opened. + closed(4) indicates the circuit breaker is closed." + ::= { upsDiagSubSysDCCircuitBreakerEntry 3 } + +upsDiagSubSysSystemPowerSupplyTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of System Power Supplies attached to the UPS." + ::= { upsDiagnosticSubsystem 13 } + +upsDiagSubSysSystemPowerSupplyTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsDiagSubSysSystemPowerSupplyEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for diagnostics of individual System Power Supplies." + ::= { upsDiagnosticSubsystem 14 } + +upsDiagSubSysSystemPowerSupplyEntry OBJECT-TYPE + SYNTAX UpsDiagSubSysSystemPowerSupplyEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The diagnostics of a System Power Supply." + INDEX { upsDiagSubSysSystemPowerSupplyIndex} + ::= { upsDiagSubSysSystemPowerSupplyTable 1 } + +UpsDiagSubSysSystemPowerSupplyEntry ::= + SEQUENCE { + upsDiagSubSysSystemPowerSupplyFrameIndex INTEGER, + upsDiagSubSysSystemPowerSupplyIndex INTEGER, + upsDiagSubSysSystemPowerSupplyStatus INTEGER + } + +upsDiagSubSysSystemPowerSupplyFrameIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The frame index entry." + ::= { upsDiagSubSysSystemPowerSupplyEntry 1 } + +upsDiagSubSysSystemPowerSupplyIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of a System Power Supply." + ::= { upsDiagSubSysSystemPowerSupplyEntry 2 } + +upsDiagSubSysSystemPowerSupplyStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + offOk (3), + onOk (4), + offFail (5), + onFail (6), + lostComm (7) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the System Power Supply. + unknown(1) indicates the device status is unknown. + notInstalled(2) indicates the device is not installed. + offOk(3) indicates the device status is off and OK. + onOk(4) indicates the device status is on and OK. + offFail(5) indicates the device status is off and failed. + onFail(6) indicates the device status is on and failed. + lostComm(7) indicates the device has lost communication." + ::= { upsDiagSubSysSystemPowerSupplyEntry 3 } + +upsDiagSubSysXRCommunicationCardTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of XR Communication Cards attached to the UPS." + ::= { upsDiagnosticSubsystem 15 } + +upsDiagSubSysXRCommunicationCardTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsDiagSubSysXRCommunicationCardEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for diagnostics of individual XR Communication Cards." + ::= { upsDiagnosticSubsystem 16 } + +upsDiagSubSysXRCommunicationCardEntry OBJECT-TYPE + SYNTAX UpsDiagSubSysXRCommunicationCardEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The diagnostics of an XR Communication Card." + INDEX { upsDiagSubSysXRCommunicationCardIndex} + ::= { upsDiagSubSysXRCommunicationCardTable 1 } + +UpsDiagSubSysXRCommunicationCardEntry ::= + SEQUENCE { + upsDiagSubSysXRCommunicationCardFrameIndex INTEGER, + upsDiagSubSysXRCommunicationCardIndex INTEGER, + upsDiagSubSysXRCommunicationCardStatus INTEGER + } + +upsDiagSubSysXRCommunicationCardFrameIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The frame index entry." + ::= { upsDiagSubSysXRCommunicationCardEntry 1 } + +upsDiagSubSysXRCommunicationCardIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of an XR Communication Card." + ::= { upsDiagSubSysXRCommunicationCardEntry 2 } + +upsDiagSubSysXRCommunicationCardStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + offOk (3), + onOk (4), + offFail (5), + onFail (6), + lostComm (7) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the XR Communication Card. + unknown(1) indicates the device status is unknown. + notInstalled(2) indicates the device is not installed. + offOk(3) indicates the device status is off and OK. + onOk(4) indicates the device status is on and OK. + offFail(5) indicates the device status is off and failed. + onFail(6) indicates the device status is on and failed. + lostComm(7) indicates the device has lost communication." + ::= { upsDiagSubSysXRCommunicationCardEntry 3 } + +upsDiagSubSysExternalPowerFrameBoardTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of External Power Frame Boards attached to the UPS." + ::= { upsDiagnosticSubsystem 17 } + +upsDiagSubSysExternalPowerFrameBoardTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsDiagSubSysExternalPowerFrameBoardEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for diagnostics of individual External Power Frame Boards." + ::= { upsDiagnosticSubsystem 18 } + +upsDiagSubSysExternalPowerFrameBoardEntry OBJECT-TYPE + SYNTAX UpsDiagSubSysExternalPowerFrameBoardEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The diagnostics of an External Power Frame Board." + INDEX { upsDiagSubSysExternalPowerFrameBoardIndex} + ::= { upsDiagSubSysExternalPowerFrameBoardTable 1 } + +UpsDiagSubSysExternalPowerFrameBoardEntry ::= + SEQUENCE { + upsDiagSubSysExternalPowerFrameBoardFrameIndex INTEGER, + upsDiagSubSysExternalPowerFrameBoardIndex INTEGER, + upsDiagSubSysExternalPowerFrameBoardStatus INTEGER + } + +upsDiagSubSysExternalPowerFrameBoardFrameIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The frame index entry." + ::= { upsDiagSubSysExternalPowerFrameBoardEntry 1 } + +upsDiagSubSysExternalPowerFrameBoardIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of an External Power Frame Board." + ::= { upsDiagSubSysExternalPowerFrameBoardEntry 2 } + +upsDiagSubSysExternalPowerFrameBoardStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + offOk (3), + onOk (4), + offFail (5), + onFail (6), + lostComm (7) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the External Power Frame Board. + unknown(1) indicates the device status is unknown. + notInstalled(2) indicates the device is not installed. + offOk(3) indicates the device status is off and OK. + onOk(4) indicates the device status is on and OK. + offFail(5) indicates the device status is off and failed. + onFail(6) indicates the device status is on and failed. + lostComm(7) indicates the device has lost communication." + ::= { upsDiagSubSysExternalPowerFrameBoardEntry 3 } + +upsDiagSubSysChargerTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of Chargers attached to the UPS." + ::= { upsDiagnosticSubsystem 19 } + + upsDiagSubSysChargerTable OBJECT-TYPE + SYNTAX SEQUENCE OF UpsDiagSubSysChargerEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for diagnostics of individual chargers." + ::= { upsDiagnosticSubsystem 20 } + +upsDiagSubSysChargerEntry OBJECT-TYPE + SYNTAX UpsDiagSubSysChargerEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The diagnostics of a charger." + INDEX { upsDiagSubSysChargerIndex} + ::= { upsDiagSubSysChargerTable 1 } + +UpsDiagSubSysChargerEntry ::= + SEQUENCE { + upsDiagSubSysChargerFrameIndex INTEGER, + upsDiagSubSysChargerIndex INTEGER, + upsDiagSubSysChargerStatus INTEGER + } + +upsDiagSubSysChargerFrameIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The frame index entry." + ::= { upsDiagSubSysChargerEntry 1 } + +upsDiagSubSysChargerIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of a charger." + ::= { upsDiagSubSysChargerEntry 2 } + +upsDiagSubSysChargerStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + offOk (3), + onOk (4), + offFail (5), + onFail (6), + lostComm (7) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the Charger. + unknown(1) indicates the device status is unknown. + notInstalled(2) indicates the device is not installed. + offOk(3) indicates the device status is off and OK. + onOk(4) indicates the device status is on and OK. + offFail(5) indicates the device status is off and failed. + onFail(6) indicates the device status is on and failed. + lostComm(7) indicates the device has lost communication." + ::= { upsDiagSubSysChargerEntry 3 } + +-- the upsDiagnosticExternalDevices group + +upsDiagSwitchGearStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + ok (3), + fail (4), + lostComm (5), + overtemp (6) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the Switch Gear. + unknown(1) indicates the device status is unknown. + notInstalled(2) indicates the device is not installed. + ok(3) indicates the device status is OK. + fail(4) indicates the device status has failed. + lostComm(5) indicates the device has lost communication. + overtemp(6) indicates the device has an over temperature condition." + ::= { upsDiagSwitchGear 1 } + +upsDiagSwitchGearInputSwitchStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + opened (3), + closed (4) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the Switch Gear Input Switch. + unknown(1) indicates the switch status is unknown. + notInstalled(2) indicates the switch is not installed. + opened(3) indicates the switch is opened. + closed(4) indicates the switch is closed." + ::= { upsDiagSwitchGear 2 } + +upsDiagSwitchGearOutputSwitchStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + opened (3), + closed (4) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the Switch Gear Output Switch. + unknown(1) indicates the switch status is unknown. + notInstalled(2) indicates the switch is not installed. + opened(3) indicates the switch is opened. + closed(4) indicates the switch is closed." + ::= { upsDiagSwitchGear 3 } + +upsDiagSwitchGearBypassSwitchStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + opened (3), + closed (4) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the Switch Gear Bypass Switch. + unknown(1) indicates the switch status is unknown. + notInstalled(2) indicates the switch is not installed. + opened(3) indicates the switch is opened. + closed(4) indicates the switch is closed." + ::= { upsDiagSwitchGear 4 } + +upsDiagMCCBBoxStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + opened (3), + closed (4) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the MCCB Box (Molded Case Circuit Breaker Box) external device. + unknown(1) indicates the device status is unknown. + notInstalled(2) indicates the device is not installed. + opened(3) indicates the circuit is opened. + closed(4) indicates the circuit is closed." + ::= { upsDiagMCCBBox 1 } + +upsDiagTransformerStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + ok (3), + fail (4), + lostComm (5), + overtemp (6), + opened (7), + closed (8) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the External Transformer. + unknown(1) indicates the device status is unknown. + notInstalled(2) indicates the device is not installed. + ok(3) indicates the device status is OK. + fail(4) indicates the device status has failed. + lostComm(5) indicates the device has lost communication. + overtemp(6) indicates the device has an over temperature condition. + opened(7) indicates the circuit is opened. + closed(8) indicates the circuit is closed." + ::= { upsDiagTransformer 1 } + +-- the upsDiagnosticComBus group + +upsDiagComBusInternalMIMStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + ok (3), + lostComm (4), + rxFailure (5), + txFailure (6) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the internal MIM communication bus. + unknown(1) indicates the device status is unknown. + notInstalled(2) indicates the device is not installed. + ok(3) indicates the device status is OK. + lostComm(4) indicates the device has lost communication. + rxFailure(5) indicates the device has a receive failure. + txFailure(6) indicates the device has a transmit failure." + ::= { upsDiagnosticComBus 1 } + +upsDiagComBusInternalRIMStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + ok (3), + lostComm (4), + rxFailure (5), + txFailure (6) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the internal RIM communication bus. + unknown(1) indicates the device status is unknown. + notInstalled(2) indicates the device is not installed. + ok(3) indicates the device status is OK. + lostComm(4) indicates the device has lost communication. + rxFailure(5) indicates the device has a receive failure. + txFailure(6) indicates the device has a transmit failure." + ::= { upsDiagnosticComBus 2 } + +upsDiagComBusMIMtoRIMStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + ok (3), + lostComm (4), + rxFailure (5), + txFailure (6) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the MIM to RIM communication bus. + unknown(1) indicates the device status is unknown. + notInstalled(2) indicates the device is not installed. + ok(3) indicates the device status is OK. + lostComm(4) indicates the device has lost communication. + rxFailure(5) indicates the device has a receive failure. + txFailure(6) indicates the device has a transmit failure." + ::= { upsDiagnosticComBus 3 } + +upsDiagComBusExternalMIMStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + ok (3), + lostComm (4), + rxFailure (5), + txFailure (6) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the external MIM communication bus. + unknown(1) indicates the device status is unknown. + notInstalled(2) indicates the device is not installed. + ok(3) indicates the device status is OK. + lostComm(4) indicates the device has lost communication. + rxFailure(5) indicates the device has a receive failure. + txFailure(6) indicates the device has a transmit failure." + ::= { upsDiagnosticComBus 4 } + +upsDiagComBusExternalRIMStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown (1), + notInstalled (2), + ok (3), + lostComm (4), + rxFailure (5), + txFailure (6) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the external RIM communication bus. + unknown(1) indicates the device status is unknown. + notInstalled(2) indicates the device is not installed. + ok(3) indicates the device status is OK. + lostComm(4) indicates the device has lost communication. + rxFailure(5) indicates the device has a receive failure. + txFailure(6) indicates the device has a transmit failure." + ::= { upsDiagnosticComBus 5 } + +-- the serialPort2Config group + +serialPort2Mode OBJECT-TYPE + SYNTAX INTEGER { + localConsole(1), + passthrough(2) + } + ACCESS read-write + STATUS obsolete + DESCRIPTION + "Setting this variable to passthrough will enable mini's port2 + behave like a UPS port. Choosing localConsole will enable the port + to be used as local console." + ::= { serialPort2Config 1 } +-- the serialPort2Control group + +setPulseOnTXD OBJECT-TYPE + SYNTAX INTEGER { + noSetPulseOnTXD(1), + setPulseOnTXD(2), + setTXDLow(3), + setTXDHigh(4) + + } + ACCESS read-write + STATUS obsolete + DESCRIPTION + "Setting this variable to setPulseOnTXD(2) + causes adapter to generate a PULSE on TXD pin of serial port 2. + The duration in the prototype implementation will be 1 second. + + Setting this value to noSetPulseOnTXD(1) has no + effect. + + The value noSetPulseOnTXD(1) will always be returned + when the variable is read. + + Setting this value to setTXDLow(3), or setTXDHigh(4) will keep TXD + always low or high respectively." + ::= { serialPort2Control 1 } + +-- the sPDUIdent group + +sPDUIdentHardwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The hardware revision of the PDU. This value + is set at the factory." + ::= { sPDUIdent 1 } + +sPDUIdentFirmwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An 8 byte ID string identifying the PDU firmware revision. + This value is set at the factory." + ::= { sPDUIdent 2 } + + +sPDUIdentDateOfManufacture OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The date when the PDU was manufactured in mm/dd/yy format. + This value is set at the factory. The year 2000 will be + represented by 00." + ::= { sPDUIdent 3 } + +sPDUIdentModelNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A 10-character string identifying the model number of + the PDU internal. This value is set at the factory." + ::= { sPDUIdent 4 } + +sPDUIdentSerialNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A 12-character string identifying the serial number of + the PDU internal microprocessor. This value is set at + the factory." + ::= { sPDUIdent 5 } + + +-- the sPDUMasterControl group + +sPDUMasterControlSwitch OBJECT-TYPE + SYNTAX INTEGER { + turnAllOnNow (1), + turnAllOnSequence (2), + turnAllOffNow (3), + rebootAllNow (4), + rebootAllSequence (5), + noCommand (6), + turnAllOffSequence (7) + } + + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to turnAllOnNow (1) will turn all outlets + on immediately. + + Setting this OID to turnAllOnSequence (2) will turn all outlets + on as defined by each outlet's sPDUOutletPowerOnTime OID value. + + Setting this OID to turnAllOff (3) will turn all outlets + off immediately. + + Setting this OID to rebootAllNow (4) will reboot all outlets + immediately. + + For MasterSwitch firmware version 1.X, setting this OID to + rebootAllSequence (5) reboots all outlets, with power returned + to the outlets in the sequence defined by each outlet's + sPDUOutletPowerOnTime OID value. + + For MasterSwitch firmware version 2.X, setting this OID to + rebootAllSequence (5) will cause a turnAllOffSequence to be performed. + Once all outlets are off, the MasterSwitch will then delay the + sPDUMasterConfigReboot OID time, and then perform a turnAllOnSequence. + + For MasterSwitch firmware version 2.X, setting this OID to + turnAllOffSequence (7) will turn all outlets off as defined by + each outlet's sPDUOutletPowerOffTime OID value. + + For MasterSwitch firmware version 1.X, setting this OID to + turnAllOffSequence (7) will have no effect. + + Getting this OID will return the noCommand (6) value." + + ::= { sPDUMasterControl 1 } + + +sPDUMasterState OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will cause the status of all outlets to be + returned. This OID is provided for informational purposes only. + To change the outlet state, the user should use the sPDUOutletCtl + OID in the sPDUOutletControlTable. + + The format of the data returned is a character string consisting + of the word 'On' if the outlet is on or 'Off' if the outlet is + off. At least one space will delimit each outlet entry in the + string. + + If the outlet states are unknown, the character string 'Unknown' + will be returned. This signifies that there is an inconsistancy + in the PDU. In the rare case that this should happen, the user + is advised to shut down all equipment powered by the PDU and + then cycle the PDU's power. This will put the PDU in a consistent + state." + + ::= { sPDUMasterControl 2 } + +sPDUMasterPending OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will cause the command pending status of all outlets to be returned. + + The format of the data returned is a character string consisting + of the word 'Yes' if a command is pending for the outlet or 'No' + if there is no command pending for the outlet. At least one + space will delimit each outlet entry in the string. + + If the pending states are unknown, the character string 'Unknown' + will be returned. This signifies that there is an inconsistancy + in the PDU. In the rare case that this should happen, the user + is advised to shut down all equipment powered by the PDU and then + cycle the PDU's power. This will put the PDU in a consistent state." + ::= { sPDUMasterControl 3 } + + +-- the sPDUMasterConfig group + +sPDUMasterConfigPowerOn OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + " The amount of delay, in seconds, between when + power is provided to the PDU and when the PDU + provides basic master power to the outlets. + + Allowed values are: + + -1 never apply power automatically. + 0 apply power immediately. + 15 apply power in 15 seconds. + 30 apply power in 30 seconds. + 45 apply power in 45 seconds. + 60 apply power in 60 seconds (1 minute). + 120 apply power in 120 seconds (2 minutes). + 300 apply power in 300 seconds (5 minutes). + + If a value other than a supported value is provided in a + set request, the PDU interprets it as the next lower + acceptable value. If the provided value is lower than + the lowest acceptable value, the lowest acceptable + value is used." + + ::= { sPDUMasterConfig 1 } + +sPDUMasterConfigReboot OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "During a reboot sequence, power is turned off and then + back on. This OID defines the amount of time to wait, + in seconds, after turning the power off, at the start + of the sequence, before turning power back on, at the + end of the reboot sequence. + + Allowed values are: + + 5 wait 5 seconds between off/on. + 10 wait 10 seconds between off/on. + 15 wait 15 seconds between off/on. + 20 wait 20 seconds between off/on. + 30 wait 30 seconds between off/on. + 45 wait 45 seconds between off/on. + 60 wait 60 seconds (1 minute) between off/on. + + If a value other than a supported value is provided in a + set request, the PDU interprets it as the next lower + acceptable value. If the provided value is lower than + the lowest acceptable value, the lowest acceptable + value is used. + + This OID is read-only for the MasterSwitch version 2.X and is the + maximum sPDUOutletRebootDuration OID of the individual outlets." + + ::= { sPDUMasterConfig 2 } + +sPDUMasterConfigPDUName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the PDU. The maximum value is 20 characters." + ::= { sPDUMasterConfig 3 } + + + +-- the sPDUOutletControl group +sPDUOutletControlTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of outlets for the PDU." + ::= { sPDUOutletControl 1 } + + +sPDUOutletControlTable OBJECT-TYPE + SYNTAX SEQUENCE OF OutletControlEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for control of individual outlet switches. The number of + entries is contained in the sPDUOutletControlTableSize OID." + ::= { sPDUOutletControl 2 } + +sPDUOutletControlEntry OBJECT-TYPE + SYNTAX OutletControlEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The outlets to control." + INDEX { sPDUOutletControlIndex} + ::= { sPDUOutletControlTable 1 } + +OutletControlEntry ::= + SEQUENCE { + sPDUOutletControlIndex INTEGER, + sPDUOutletPending INTEGER, + sPDUOutletCtl INTEGER, + sPDUOutletCtlName DisplayString + } + +sPDUOutletControlIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the outlet entry." + ::= { sPDUOutletControlEntry 1 } + +sPDUOutletPending OBJECT-TYPE + SYNTAX INTEGER{ + commandPending (1), + noCommandPending (2), + commandPendingUnknown (3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Reports whether the current outlet has a pending command. + + If the commandPendingUnknown (3) value is returned, all + devices powered by the PDU should be shut down. The PDU's + power should then be cycled to clear this condition." + + ::= { sPDUOutletControlEntry 2 } + +sPDUOutletCtl OBJECT-TYPE + SYNTAX INTEGER { + outletOn (1), + outletOff (2), + outletReboot (3), + outletUnknown (4), + outletOnWithDelay (5), + outletOffWithDelay (6), + outletRebootWithDelay (7) + } + + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Getting this variable will return the outlet state. If + the outlet is on, the outletOn (1) value will be returned. + If the outlet is off, the outletOff (2) value will be + returned. + + If the state of the outlet cannot be determined, the + outletUnknown (4) value will be returned. If the + outletUnknown condition should occur, all devices + powered by the PDU should be shut down. The PDU's power + should then be cycled to clear this condition. + + Setting this variable to outletOn (1) will turn the outlet on. + + Setting this variable to outletOff (2) will turn the outlet off. + + Setting this variable to outletReboot (3) will reboot the outlet. + + Setting this variable to outletOnWithDelay (5) will turn the outlet on + after the sPDUOutletPowerOnTime OID has elapsed. This option is not + valid for MasterSwitch firmware version 1.X. + + Setting this variable to outletOffWithDelay (6) will turn the outlet off + after the sPDUOutletPowerOffTime OID has elapsed. This option is not valid + for MasterSwitch firmware version 1.X. + + Setting this variable to outletRebootWithDelay (7) will turn the outlet off + after the sPDUOutletPowerOffTime OID has elapsed, wait the sPDUOutletRebootDuration + OID time, then turn the outlet back on. + This option is not valid for MasterSwitch firmware version 1.X." + + ::= { sPDUOutletControlEntry 3 } + +sPDUOutletCtlName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the outlet. Maximum size is 20 characters. + This OID is provided for informational purposes only. + This value is set by the sPDUOutletName OID." + + ::= { sPDUOutletControlEntry 4 } + +-- the sPDUOutletConfig group +sPDUOutletConfigTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of outlets for the PDU." + ::= { sPDUOutletConfig 1 } + +sPDUOutletConfigTable OBJECT-TYPE + SYNTAX SEQUENCE OF SPDUOutletConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The list of outlets to configure. The number of + entries is defined by the sPDUOutletConfigTableSize + OID." + + ::= { sPDUOutletConfig 2 } + +sPDUOutletConfigEntry OBJECT-TYPE + SYNTAX SPDUOutletConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The outlets to control." + INDEX { sPDUOutletConfigIndex} + ::= { sPDUOutletConfigTable 1 } + +SPDUOutletConfigEntry ::= + SEQUENCE { + sPDUOutletConfigIndex INTEGER, + sPDUOutletPowerOnTime INTEGER, + sPDUOutletName DisplayString, + sPDUOutletPowerOffTime INTEGER, + sPDUOutletRebootDuration INTEGER + } + +sPDUOutletConfigIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the outlet entry." + ::= { sPDUOutletConfigEntry 1 } + +sPDUOutletPowerOnTime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The amount of time (in seconds) the outlet will delay + powering on when the MasterSwitch is powered on. + + Allowed values are: + + -1 never power on automatically. + 0 power on with the Master Switch. + 15 power on 15 seconds after the MasterSwitch has power applied. + 30 power on 30 seconds after the MasterSwitch has power applied. + 45 power on 45 seconds after the MasterSwitch has power applied. + 60 power on 60 seconds (1 minute) after the MasterSwitch has power applied. + 120 power on 120 seconds (2 minutes) after the MasterSwitch has power applied. + 300 power on 300 seconds (5 minutes) after the MasterSwitch has power applied. + + If a value other than a supported value is provided in a + set request, the PDU interprets it as the next lower + acceptable value. If the provided value is lower than + the lowest acceptable value, the lowest acceptable + value is used." + + ::= { sPDUOutletConfigEntry 2 } + +sPDUOutletName OBJECT-TYPE + SYNTAX DisplayString ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the outlet. Maximum size is 20 characters." + + ::= { sPDUOutletConfigEntry 3 } + +sPDUOutletPowerOffTime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The amount of time (in seconds) the outlet will delay + powering off. + + Allowed values are: + + -1 never power off automatically. + 0 power off with the MasterSwitch. + 15 power off 15 seconds after being commanded. + 30 power off 30 seconds after being commanded. + 45 power off 45 seconds after being commanded. + 60 power off 60 seconds (1 minute) after being commanded. + 120 power off 120 seconds (2 minutes) after being commanded. + 300 power off 300 seconds (5 minutes) after being commanded. + + If a value other than a supported value is provided in a + set request, the PDU interprets it as the next lower + acceptable value. If the provided value is lower than + the lowest acceptable value, the lowest acceptable + value is used. + + This OID is not available for MasterSwitch firmware version 1.X." + + ::= { sPDUOutletConfigEntry 4 } + +sPDUOutletRebootDuration OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "During a reboot sequence, power is turned off and then + back on. This OID defines the amount of time to wait, + in seconds, after turning the power off, at the start + of the sequence, before turning power back on, at the + end of the reboot sequence. + + Allowed values are: + + 5 wait 5 seconds between off/on. + 10 wait 10 seconds between off/on. + 15 wait 15 seconds between off/on. + 20 wait 20 seconds between off/on. + 30 wait 30 seconds between off/on. + 45 wait 45 seconds between off/on. + 60 wait 60 seconds (1 minute) between off/on. + + If a value other than a supported value is provided in a + set request, the PDU interprets it as the next lower + acceptable value. If the provided value is lower than + the lowest acceptable value, the lowest acceptable + value is used. + + This OID is not available for MasterSwitch firmware version 1.X." + + ::= { sPDUOutletConfigEntry 5 } + + +-- the sPDUIdentVM group + +sPDUIdentVMTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of MasterSwitch VMs controllable + by this IP address." + ::= { sPDUIdentVM 1 } + + +sPDUIdentVMTable OBJECT-TYPE + SYNTAX SEQUENCE OF IdentVMEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for query of the individual MasterSwitch VMs. + The number of entries is contained in the + sPDUIdentVMTableSize OID." + ::= { sPDUIdentVM 2 } + +sPDUIdentVMEntry OBJECT-TYPE + SYNTAX IdentVMEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The MasterSwitch VMs to query." + INDEX { sPDUIdentVMIndex} + ::= { sPDUIdentVMTable 1 } + +IdentVMEntry ::= + SEQUENCE { + sPDUIdentVMIndex INTEGER, + sPDUIdentNameVM DisplayString, + sPDUIdentHardwareRevVM DisplayString, + sPDUIdentFirmwareRevVM DisplayString, + sPDUIdentDateOfManufactureVM DisplayString, + sPDUIdentModelNumberVM DisplayString, + sPDUIdentSerialNumberVM DisplayString + } + +sPDUIdentVMIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the MasterSwitch VM entry." + ::= { sPDUIdentVMEntry 1 } + +sPDUIdentNameVM OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A 23-character string identifying the + MasterSwitch VM. " + ::= { sPDUIdentVMEntry 2 } + +sPDUIdentHardwareRevVM OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The hardware version of the MasterSwitch VM. + This value is set at the factory." + ::= { sPDUIdentVMEntry 3 } + +sPDUIdentFirmwareRevVM OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An 6-character ID string identifying the MasterSwitch VM + firmware version. This value is set at the factory." + ::= { sPDUIdentVMEntry 4 } + + +sPDUIdentDateOfManufactureVM OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The date when the MasterSwitch VM was manufactured in mm/dd/yyyy format. + This value is set at the factory. " + ::= { sPDUIdentVMEntry 5 } + +sPDUIdentModelNumberVM OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A 17-character string identifying the model number of + the MasterSwitch VM. This value is set at the factory." + ::= { sPDUIdentVMEntry 6 } + +sPDUIdentSerialNumberVM OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A 17-character string identifying the serial number of + the MasterSwitch VM. This value is set at the factory." + ::= { sPDUIdentVMEntry 7 } + + +-- the sPDUMasterControlVM group + +sPDUMasterControlVMTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of MasterSwitch VMs controllable + by this IP address." + ::= { sPDUMasterControlVM 1 } + + +sPDUMasterControlVMTable OBJECT-TYPE + SYNTAX SEQUENCE OF MasterControlVMEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for control of the individual MasterSwitch VMs. + The number of entries is contained in the + sPDUMasterControlVMTableSize OID." + ::= { sPDUMasterControlVM 2 } + +sPDUMasterControlVMEntry OBJECT-TYPE + SYNTAX MasterControlVMEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The MasterSwitch VMs to control." + INDEX { sPDUMasterControlVMIndex} + ::= { sPDUMasterControlVMTable 1 } + +MasterControlVMEntry ::= + SEQUENCE { + sPDUMasterControlVMIndex INTEGER, + sPDUMasterControlVMName DisplayString, + sPDUMasterControlVMCommand INTEGER + } + +sPDUMasterControlVMIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the MasterSwitch VM entry." + ::= { sPDUMasterControlVMEntry 1 } + +sPDUMasterControlVMName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the MasterSwitch VM. The maximum + value is 23 characters. The name is set by + using the sPDUMasterConfigVMName OID." + ::= { sPDUMasterControlVMEntry 2 } + +sPDUMasterControlVMCommand OBJECT-TYPE + SYNTAX INTEGER { + noCommandAllVM (1), + immediateAllOnVM (2), + immediateAllOffVM (3), + immediateAllRebootVM (4), + delayedAllOnVM (5), + delayedAllOffVM (6), + sequencedAllRebootVM (7), + delayedAllRebootVM (8), + delayedSequenceAllRebootVM (9), + cancelAllPendingCommandsVM (10), + audioAlarmMute (11) + } + + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to immediateAllOnVM (2) will turn all outlets + on immediately. + + Setting this OID to immediateAllOffVM (3) will turn all outlets + off immediately. + + Setting this OID to immediateAllRebootVM (4) will reboot all outlets + immediately. + + Setting this OID to delayedAllOnVM (5) will turn all outlets on as + defined by each outlet's sPDUOutletConfigVMPowerOnTime OID value. + + Setting this OID to delayedAllOffVM (6) will turn all outlets + off as defined by each outlet's sPDUOutletConfigVMPowerOffTime OID value. + + Setting this OID to sequencedAllRebootVM (7) will cause a + immediateAllOffVM command to be performed. The MasterSwitch VM will + then delay the sPDUMasterStatusVMRebootDuration OID time, and then + perform a delayedAllOnVM command. + + Setting this OID to delayedAllRebootVM (8) will cause a delayedAllOffVM + command to be performed. Each outlet will then wait its + sPDUOutletConfigVMRebootDuration before returning power to the outlet. + + Setting this OID to delayedSequenceAllRebootVM (9) will cause a + delayedAllOffVM command to be performed. Once all outlets are off, + the MasterSwitch VM will then delay the sPDUMasterStatusVMRebootDuration + OID time, and then perform a delayedAllOnVM command. + + Setting this OID to cancelAllPendingCommandsVM (10) will cause all pending + commands on the MasterSwitch VM to be canceled. + + + Setting this OID to audioAlarmMute (11) will temporarily silence the audible + alarm for the duration of the current overload condition. The audible alarm + will be activated on subsequent overload alarms. + + Getting this OID will return the noCommandAllVM (1) value." + ::= { sPDUMasterControlVMEntry 3 } + + +-- the sPDUMasterConfigVM group + +sPDUMasterConfigVMTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of MasterSwitch VMs configurable + by this IP address." + ::= { sPDUMasterConfigVM 1 } + + +sPDUMasterConfigVMTable OBJECT-TYPE + SYNTAX SEQUENCE OF MasterConfigVMEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for configuration of the individual MasterSwitch VMs. + The number of entries is contained in the + sPDUMasterConfigVMTableSize OID." + ::= { sPDUMasterConfigVM 2 } + +sPDUMasterConfigVMEntry OBJECT-TYPE + SYNTAX MasterConfigVMEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The MasterSwitch VMs to configure." + INDEX { sPDUMasterConfigVMIndex} + ::= { sPDUMasterConfigVMTable 1 } + +MasterConfigVMEntry ::= + SEQUENCE { + sPDUMasterConfigVMIndex INTEGER, + sPDUMasterConfigVMName DisplayString, + sPDUMasterConfigVMColdstartDelay INTEGER, + sPDUMasterConfigVMAudioAlarmActivated INTEGER, + sPDUMasterConfigVMHighLoadWarningThreshold INTEGER, + sPDUMasterConfigVMLowLoadWarningThreshold INTEGER, + sPDUMasterConfigVMOverloadRestriction INTEGER + } + +sPDUMasterConfigVMIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the MasterSwitch VM entry." + ::= { sPDUMasterConfigVMEntry 1 } + + +sPDUMasterConfigVMName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the MasterSwitch VM. Maximum size is 23 characters." + ::= { sPDUMasterConfigVMEntry 2 } + +sPDUMasterConfigVMColdstartDelay OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + " The amount of delay, in seconds, between when + power is provided to the MasterSwitch VM and + when the MasterSwitch VM provides basic master + power to the outlets. + + Allowed values are: + + -1 never apply power automatically. + 0 apply power immediately. + 15 apply power in 15 seconds. + 30 apply power in 30 seconds. + 45 apply power in 45 seconds. + 60 apply power in 60 seconds (1 minute). + 120 apply power in 120 seconds (2 minutes). + 300 apply power in 300 seconds (5 minutes). + + If a value other than a supported value is provided in a + set request, the MasterSwitch VM interprets it as the next lower + acceptable value. If the provided value is lower than + the lowest acceptable value, the lowest acceptable + value is used." + ::= { sPDUMasterConfigVMEntry 3 } + +sPDUMasterConfigVMAudioAlarmActivated OBJECT-TYPE + SYNTAX INTEGER { + audioAlarmActiveNever (1), + audioAlarmActiveOnOverload (2), + audioAlarmActiveOnOverloadImminent (3) + } + + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to audioAlarmActiveNever (1) will disable + the audio alarm on the MasterSwitch VM. + + Setting this OID to audioAlarmActiveOnOverload (2) will + activate the audio alarm on the MasterSwitch VM when an + overload condition is present. + + Setting this OID to audioAlarmActiveOnOverloadImminent (3) + will activate the audio alarm on the MasterSwitch VM when + the load on the MasterSwitch VM has surpassed the + sPDUMasterConfigVMHighLoadWarningThreshold OID value." + ::= { sPDUMasterConfigVMEntry 4 } + +sPDUMasterConfigVMHighLoadWarningThreshold OBJECT-TYPE + SYNTAX INTEGER (0..100) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "A threshold that indicates the power consumption of + the load is nearing an overload condition. It is + represented as a percentage of full load." + ::= { sPDUMasterConfigVMEntry 5 } + +sPDUMasterConfigVMLowLoadWarningThreshold OBJECT-TYPE + SYNTAX INTEGER (0..100) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "A threshold that indicates the power consumption of + the load is nearing a low consumption condition. It is + represented as a percentage of full load." + ::= { sPDUMasterConfigVMEntry 6 } + +sPDUMasterConfigVMOverloadRestriction OBJECT-TYPE + SYNTAX INTEGER { + alwaysAllowTurnON (1), + restrictOnWarning (2), + restrictOnOverload (3) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This OID controls the behavior of the MasterSwitch VM + when an overload condition is possible and additional + outlets are requested to be turned on. + + Setting this OID to alwaysAllowTurnON (1) will always allow + the outlets to turn on. + + Setting this OID to restrictOnWarning (2) will not allow + outlets to turn on if the sPDUMasterConfigVMHighLoadWarningThreshold + OID is exceeded. + + Setting this OID to restrictOnOverload (3) will not allow + outlets to turn on if the MasterSwitch Vm is in an + overload condition." + ::= { sPDUMasterConfigVMEntry 7 } + +-- the sPDUMasterStatusVM group + +sPDUMasterStatusVMTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of MasterSwitch VMs at + this IP address." + ::= { sPDUMasterStatusVM 1 } + + +sPDUMasterStatusVMTable OBJECT-TYPE + SYNTAX SEQUENCE OF MasterStatusVMEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for gathering of status from the individual + MasterSwitch VMs. The number of entries is contained + in the sPDUMasterStatusVMTableSize OID." + ::= { sPDUMasterStatusVM 2 } + +sPDUMasterStatusVMEntry OBJECT-TYPE + SYNTAX MasterStatusVMEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The MasterSwitch VMs to gather status from." + INDEX { sPDUMasterStatusVMIndex} + ::= { sPDUMasterStatusVMTable 1 } + +MasterStatusVMEntry ::= + SEQUENCE { + sPDUMasterStatusVMIndex INTEGER, + sPDUMasterStatusVMName DisplayString, + sPDUMasterStatusVMCommandPending INTEGER, + sPDUMasterStatusVMOverloadCondition INTEGER, + sPDUMasterStatusVMLowLoadCondition INTEGER, + sPDUMasterStatusVMCurrentLoad INTEGER, + sPDUMasterStatusVMMaxLoad INTEGER, + sPDUMasterStatusVMOutletCount INTEGER, + sPDUMasterStatusVMRebootDuration INTEGER + } + +sPDUMasterStatusVMIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the MasterSwitch VM entry." + ::= { sPDUMasterStatusVMEntry 1 } + +sPDUMasterStatusVMName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the MasterSwitch VM. Maximum size is 23 characters." + ::= { sPDUMasterStatusVMEntry 2 } + +sPDUMasterStatusVMCommandPending OBJECT-TYPE + SYNTAX INTEGER { + commandPendingMasterTrueVM (1), + commandPendingMasterFalseVM (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return commandPendingMasterTrueVM (1) + if the MasterSwitch VM has a pending command on any of its + outlets. + + commandPendingMasterFalseVM (2) will be returned if there are + no pending commands." + ::= { sPDUMasterStatusVMEntry 3 } + +sPDUMasterStatusVMOverloadCondition OBJECT-TYPE + SYNTAX INTEGER { + overloadConditionTrueVM (1), + overloadConditionFalseVM (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return overloadConditionTrueVM (1) + if the sPDUMasterConfigVMHighLoadWarningThreshold OID is + violated. + + overloadConditionFalseVM (2) will be returned if the + sPDUMasterConfigVMHighLoadWarningThreshold OID is not + violated." + ::= { sPDUMasterStatusVMEntry 4 } + +sPDUMasterStatusVMLowLoadCondition OBJECT-TYPE + SYNTAX INTEGER { + lowLoadConditionTrueVM (1), + lowLoadConditionFalseVM (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return lowLoadConditionTrueVM (1) + if the sPDUMasterConfigVMLowLoadWarningThreshold OID is + violated. + + lowLoadConditionFalseVM (2) will be returned if the + sPDUMasterConfigVMHighLoadWarningThreshold OID is not + violated. " + ::= { sPDUMasterStatusVMEntry 5 } + +sPDUMasterStatusVMCurrentLoad OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return the total amount of power + being consumed by the load. It is represented as a + percentage of full load." + ::= { sPDUMasterStatusVMEntry 6 } + +sPDUMasterStatusVMMaxLoad OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return the total amount of power + that this MasterSwitch VM can provide. It is represented + in Amps." + ::= { sPDUMasterStatusVMEntry 7 } + +sPDUMasterStatusVMOutletCount OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return the number of controllable + outlets for this MasterSwitch VM." + ::= { sPDUMasterStatusVMEntry 8 } + +sPDUMasterStatusVMRebootDuration OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return the largest + sPDUOutletConfigVMRebootDuration OID time + for this MasterSwitch VM." + ::= { sPDUMasterStatusVMEntry 9 } + +-- the sPDUOutletControlVM group + + +sPDUOutletControlVMTable OBJECT-TYPE + SYNTAX SEQUENCE OF OutletControlVMEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for control of individual outlet switches. The number of + entries is contained in the sPDUMasterStatusOutletCount OID." + ::= { sPDUOutletControlVM 1 } + +sPDUOutletControlVMEntry OBJECT-TYPE + SYNTAX OutletControlVMEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The outlets to control." + INDEX { sPDUOutletControlVMIndex, sPDUOutletControlVMOutletIndex } + ::= { sPDUOutletControlVMTable 1 } + +OutletControlVMEntry ::= + SEQUENCE { + sPDUOutletControlVMIndex INTEGER, + sPDUOutletControlVMName DisplayString, + sPDUOutletControlVMOutletIndex INTEGER, + sPDUOutletControlVMOutletName DisplayString, + sPDUOutletControlVMOutletCommand INTEGER + } + +sPDUOutletControlVMIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the MasterSwitch VM." + ::= { sPDUOutletControlVMEntry 1 } + +sPDUOutletControlVMName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the MasterSwitch VM. Maximum size is 23 characters. + This OID is provided for informational purposes only." + ::= { sPDUOutletControlVMEntry 2 } + +sPDUOutletControlVMOutletIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the outlet entry." + ::= { sPDUOutletControlVMEntry 3 } + +sPDUOutletControlVMOutletName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the outlet. Maximum size is 23 characters. + This OID is provided for informational purposes only." + ::= { sPDUOutletControlVMEntry 4 } + +sPDUOutletControlVMOutletCommand OBJECT-TYPE + SYNTAX INTEGER { + immediateOnVM (1), + immediateOffVM (2), + immediateRebootVM (3), + delayedOnVM (4), + delayedOffVM (5), + delayedRebootVM (6), + cancelPendingCommandVM (7) + + } + + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Getting this variable will return the outlet state. If + the outlet is on, the immediateOnVM (1) value will be returned. + If the outlet is off, the immediateOffVM (2) value will be + returned. + + + Setting this variable to immediateOnVM (1) will immediately turn the outlet on. + + Setting this variable to immediateOffVM (2) will immediately turn the outlet off. + + Setting this variable to immediateRebootVM (3) will immediately reboot the outlet. + + Setting this variable to delayedOnVM (4) will turn the outlet on + after the sPDUOutletConfigVMPowerOnTime OID time has elapsed. + + Setting this variable to delayedOffVM (5) will turn the outlet off + after the sPDUOutletConfigVMPowerOffTime OID time has elapsed. + + Setting this variable to delayedRebootVM (6) will cause the + MasterSwitch VM to perform a delayedOffVM command, wait the + sPDUOutletConfigVMRebootDuration OID time, and then perform the + immediateOnVM command. + + Setting this variable to cancelPendingCommandVM (7) will cause any + pending command to this outlet to be canceled." + ::= { sPDUOutletControlVMEntry 5 } + +-- the sPDUOutletConfigVM group + +sPDUOutletConfigVMTable OBJECT-TYPE + SYNTAX SEQUENCE OF OutletConfigVMEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for configuration of individual outlets. The number of + entries is contained in the sPDUMasterStatusOutletCount OID." + ::= { sPDUOutletConfigVM 1 } + +sPDUOutletConfigVMEntry OBJECT-TYPE + SYNTAX OutletConfigVMEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The outlets to configure." + INDEX { sPDUOutletConfigVMIndex, sPDUOutletConfigVMOutletIndex } + ::= { sPDUOutletConfigVMTable 1 } + +OutletConfigVMEntry ::= + SEQUENCE { + sPDUOutletConfigVMIndex INTEGER, + sPDUOutletConfigVMName DisplayString, + sPDUOutletConfigVMOutletIndex INTEGER, + sPDUOutletConfigVMOutletName DisplayString, + sPDUOutletConfigVMPowerOnTime INTEGER, + sPDUOutletConfigVMPowerOffTime INTEGER, + sPDUOutletConfigVMRebootDuration INTEGER + } + +sPDUOutletConfigVMIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the MasterSwitch VM." + ::= { sPDUOutletConfigVMEntry 1 } + +sPDUOutletConfigVMName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the MasterSwitch VM. Maximum size is 23 characters." + ::= { sPDUOutletConfigVMEntry 2 } + +sPDUOutletConfigVMOutletIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the outlet entry." + ::= { sPDUOutletConfigVMEntry 3 } + + +sPDUOutletConfigVMOutletName OBJECT-TYPE + SYNTAX DisplayString ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the outlet. Maximum size is 23 characters." + ::= { sPDUOutletConfigVMEntry 4 } + +sPDUOutletConfigVMPowerOnTime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The amount of time (in seconds) the outlet will delay + powering on at coldstart or when a command that requires + a turn-on delay is issued. + + Allowed values are: + + -1 never power on. + 0 power on immediately. + 15 power on 15 seconds after being commanded. + 30 power on 30 seconds after being commanded. + 45 power on 45 seconds after being commanded. + 60 power on 60 seconds (1 minute) after being commanded. + 120 power on 120 seconds (2 minutes) after being commanded. + 300 power on 300 seconds (5 minutes) after being commanded. + + If a value other than a supported value is provided in a + set request, the MasterSwitch VM interprets it as the next lower + acceptable value. If the provided value is lower than + the lowest acceptable value, the lowest acceptable + value is used." + ::= { sPDUOutletConfigVMEntry 5 } + + +sPDUOutletConfigVMPowerOffTime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The amount of time (in seconds) the outlet will delay + powering off when a command that requires + a turn-off delay is issued. + + + Allowed values are: + + -1 never power off automatically. + 0 power off immediately. + 15 power off 15 seconds after being commanded. + 30 power off 30 seconds after being commanded. + 45 power off 45 seconds after being commanded. + 60 power off 60 seconds (1 minute) after being commanded. + 120 power off 120 seconds (2 minutes) after being commanded. + 300 power off 300 seconds (5 minutes) after being commanded. + + If a value other than a supported value is provided in a + set request, the MasterSwitch VM interprets it as the next lower + acceptable value. If the provided value is lower than + the lowest acceptable value, the lowest acceptable + value is used." + ::= { sPDUOutletConfigVMEntry 6 } + +sPDUOutletConfigVMRebootDuration OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "During a reboot sequence, power is turned off and then + back on. This OID defines the amount of time to wait, + in seconds, after turning the power off, at the start + of the sequence, before turning power back on, at the + end of the reboot sequence. + + Allowed values are: + + 5 wait 5 seconds between off/on. + 10 wait 10 seconds between off/on. + 15 wait 15 seconds between off/on. + 20 wait 20 seconds between off/on. + 30 wait 30 seconds between off/on. + 45 wait 45 seconds between off/on. + 60 wait 60 seconds (1 minute) between off/on. + + If a value other than a supported value is provided in a + set request, the MasterSwitch VM interprets it as the next lower + acceptable value. If the provided value is lower than + the lowest acceptable value, the lowest acceptable + value is used." + ::= { sPDUOutletConfigVMEntry 7 } + +-- the sPDUOutletStatusVM group + +sPDUOutletStatusVMTable OBJECT-TYPE + SYNTAX SEQUENCE OF OutletStatusVMEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for getting of status of individual outlets. The number of + entries is contained in the sPDUMasterStatusOutletCount OID." + ::= { sPDUOutletStatusVM 1 } + +sPDUOutletStatusVMEntry OBJECT-TYPE + SYNTAX OutletStatusVMEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The outlets to gather status from." + INDEX { sPDUOutletStatusVMIndex, sPDUOutletStatusVMOutletIndex } + ::= { sPDUOutletStatusVMTable 1 } + +OutletStatusVMEntry ::= + SEQUENCE { + sPDUOutletStatusVMIndex INTEGER, + sPDUOutletStatusVMName DisplayString, + sPDUOutletStatusVMOutletIndex INTEGER, + sPDUOutletStatusVMOutletName DisplayString, + sPDUOutletStatusVMOutletState INTEGER, + sPDUOutletStatusVMCommandPending INTEGER + } + +sPDUOutletStatusVMIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the MasterSwitch VM." + ::= { sPDUOutletStatusVMEntry 1 } + +sPDUOutletStatusVMName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the MasterSwitch VM. Maximum size is 23 characters." + ::= { sPDUOutletStatusVMEntry 2 } + +sPDUOutletStatusVMOutletIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the outlet entry." + ::= { sPDUOutletStatusVMEntry 3 } + +sPDUOutletStatusVMOutletName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the outlet. Maximum size is 23 characters." + ::= { sPDUOutletStatusVMEntry 4 } + +sPDUOutletStatusVMOutletState OBJECT-TYPE + SYNTAX INTEGER { + outletStatusVMOn (1), + outletStatusVMOff (2) + } + + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this variable will return the outlet state. If + the outlet is on, the outletStatusOnVM (1) value will be returned. + If the outlet is off, the outletStatusOffVM (2) value will be + returned. " + ::= { sPDUOutletStatusVMEntry 5 } + +sPDUOutletStatusVMCommandPending OBJECT-TYPE + SYNTAX INTEGER { + outletStatusVMCommandPending (1), + outletStatusVMNoCommandPending (2) + } + + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this variable will return the command pending + state of the outlet. If a command is pending on the + outlet, the outletStatusVMCommandPending (1) value + will be returned. If there is not a command pending + on the outlet, the outletStatusVMNoCommandPending (2) + will be returned." + ::= { sPDUOutletStatusVMEntry 6 } + +-- the sPDUIdentMSP group + +sPDUIdentMSPTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of MasterSwitch pluses controllable + by this IP address." + ::= { sPDUIdentMSP 1 } + + +sPDUIdentMSPTable OBJECT-TYPE + SYNTAX SEQUENCE OF IdentMSPEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for query of the individual MasterSwitch pluses. + The number of entries is contained in the + sPDUIdentMSPTableSize OID." + ::= { sPDUIdentMSP 2 } + +sPDUIdentMSPEntry OBJECT-TYPE + SYNTAX IdentMSPEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The MasterSwitch pluses to query." + INDEX { sPDUIdentMSPIndex} + ::= { sPDUIdentMSPTable 1 } + +IdentMSPEntry ::= + SEQUENCE { + sPDUIdentMSPIndex INTEGER, + sPDUIdentNameMSP DisplayString, + sPDUIdentHardwareRevMSP DisplayString, + sPDUIdentFirmwareRevMSP DisplayString, + sPDUIdentDateOfManufactureMSP DisplayString, + sPDUIdentModelNumberMSP DisplayString, + sPDUIdentSerialNumberMSP DisplayString + } + +sPDUIdentMSPIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the MasterSwitch plus entry." + ::= { sPDUIdentMSPEntry 1 } + +sPDUIdentNameMSP OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the MasterSwitch plus. The maximum + value is 23 characters. The name is set by + using the sPDUMasterConfigMSPName OID." + ::= { sPDUIdentMSPEntry 2 } + +sPDUIdentHardwareRevMSP OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The hardware version of the MasterSwitch plus. + This value is set at the factory." + ::= { sPDUIdentMSPEntry 3 } + +sPDUIdentFirmwareRevMSP OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An 6-character ID string identifying the MasterSwitch plus + firmware version. This value is set at the factory." + ::= { sPDUIdentMSPEntry 4 } + +sPDUIdentDateOfManufactureMSP OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The date when the MasterSwitch plus was manufactured in mm/dd/yyyy format. + This value is set at the factory. " + ::= { sPDUIdentMSPEntry 5 } + +sPDUIdentModelNumberMSP OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A 17-character string identifying the model number of + the MasterSwitch plus. This value is set at the factory." + ::= { sPDUIdentMSPEntry 6 } + +sPDUIdentSerialNumberMSP OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A 17-character string identifying the serial number of + the MasterSwitch plus. This value is set at the factory." + ::= { sPDUIdentMSPEntry 7 } + + +-- the sPDUMasterControlMSP group + +sPDUMasterControlMSPTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of MasterSwitch pluses controllable + by this IP address." + ::= { sPDUMasterControlMSP 1 } + +sPDUMasterControlMSPTable OBJECT-TYPE + SYNTAX SEQUENCE OF MasterControlMSPEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for control of the individual MasterSwitch pluses. + The number of entries is contained in the + sPDUMasterControlMSPTableSize OID." + ::= { sPDUMasterControlMSP 2 } + +sPDUMasterControlMSPEntry OBJECT-TYPE + SYNTAX MasterControlMSPEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The MasterSwitch pluses to control." + INDEX { sPDUMasterControlMSPIndex} + ::= { sPDUMasterControlMSPTable 1 } + +MasterControlMSPEntry ::= + SEQUENCE { + sPDUMasterControlMSPIndex INTEGER, + sPDUMasterControlMSPName DisplayString, + sPDUMasterControlMSPCommand INTEGER + } + +sPDUMasterControlMSPIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the MasterSwitch plus entry." + ::= { sPDUMasterControlMSPEntry 1 } + +sPDUMasterControlMSPName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the MasterSwitch plus. The maximum + value is 23 characters. The name is set by + using the sPDUMasterConfigMSPName OID." + ::= { sPDUMasterControlMSPEntry 2 } + +sPDUMasterControlMSPCommand OBJECT-TYPE + SYNTAX INTEGER { + noCommandAllMSP (1), + immediateAllOnMSP (2), + sequencedAllOnMSP (3), + immediateAllOffMSP (4), + gracefulAllRebootMSP (5), + immediateAllRebootMSP (6), + gracefulAllShutdownMSP (7), + overrideAllBatCapThreshMSP (8), + cancelAllPendingCommandsMSP (9), + restoreFactoryDefaultsMSP (10) + } + + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to immediateAllOnMSP (2) will turn all outlets + on immediately. + + Setting this OID to sequencedAllOnMSP (3) will turn all outlets + on as defined by each outlet's sPDUOutletConfigMSPPowerOnDelay OID value. + + Setting this OID to immediateAllOffMSP (4) will turn all outlets + off immediately. + + Setting this OID to gracefulAllRebootMSP (5) will reboot all outlets + (after the device running PowerChute confirms shutdown) as defined + by each outlet's sPDUOutletConfigMSPRebootDuration OID time value. + + Setting this OID to immediateAllRebootMSP (6) will reboot all outlets + immediately. + + Setting this OID to gracefulAllShutdownMSP (7) will shutdown all outlets + (after the device running PowerChute confirms shutdown) as defined + by each outlet's sPDUOutletConfigMSPPowerOffDelay OID time value. Each + outlet will then turn on after the sum of its + sPDUOutletConfigMSPRestartDelay and sPDUOutletConfigMSPPowerOnDelay OID + values. + + Setting this OID to overrideAllBatCapThreshMSP (8) will cause the + outlet to ignore the Battery Capacity Threshold and proceed turning on + the outlets as defined by each outlet's sPDUOutletConfigMSPPowerOnDelay + OID value. + + Setting this OID to cancelAllPendingCommandsMSP (9) will cause all pending + commands on the MasterSwitch plus to be canceled. + + Setting this OID to restoreFactoryDefaultsMSP (10) will cause the settings of + the MasterSwitch plus to be restored to the factory defaults. + + Getting this OID will return the noCommandAllMSP (1) value." + ::= { sPDUMasterControlMSPEntry 3 } + + +-- the sPDUMasterConfigMSP group + +sPDUMasterConfigMSPTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of MasterSwitch pluses configurable + by this IP address." + ::= { sPDUMasterConfigMSP 1 } + +sPDUMasterConfigMSPTable OBJECT-TYPE + SYNTAX SEQUENCE OF MasterConfigMSPEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for configuration of the individual MasterSwitch pluses. + The number of entries is contained in the + sPDUMasterConfigMSPTableSize OID." + ::= { sPDUMasterConfigMSP 2 } + +sPDUMasterConfigMSPEntry OBJECT-TYPE + SYNTAX MasterConfigMSPEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The MasterSwitch pluses to configure." + INDEX { sPDUMasterConfigMSPIndex} + ::= { sPDUMasterConfigMSPTable 1 } + +MasterConfigMSPEntry ::= + SEQUENCE { + sPDUMasterConfigMSPIndex INTEGER, + sPDUMasterConfigMSPName DisplayString, + sPDUMasterConfigMSPPowerOnTimeDelay INTEGER, + sPDUMasterConfigMSPManualButton INTEGER + } + +sPDUMasterConfigMSPIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the MasterSwitch plus entry." + ::= { sPDUMasterConfigMSPEntry 1 } + +sPDUMasterConfigMSPName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the MasterSwitch plus. Maximum size is 23 characters." + ::= { sPDUMasterConfigMSPEntry 2 } + +sPDUMasterConfigMSPPowerOnTimeDelay OBJECT-TYPE + SYNTAX INTEGER (0..9999) + ACCESS read-write + STATUS mandatory + DESCRIPTION + " The amount of delay, in seconds, between when + power is provided to the MasterSwitch plus and + when the MasterSwitch plus provides basic master + power to the outlets. + + Allowed values are: + + 0 - 9999 seconds (0 - 2hrs, 46 mins, 39 secs). + 0 indicates to apply power immediately." + ::= { sPDUMasterConfigMSPEntry 3 } + + +sPDUMasterConfigMSPManualButton OBJECT-TYPE + SYNTAX INTEGER { + manualButtonDisabled (1), + manualButtonEnabled (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to manualButtonDisabled (1) will disable + the manual button on the MasterSwitch plus. + + Setting this OID to manualButtonEnabled (2) will enable + the manual button on the MasterSwitch plus." + ::= { sPDUMasterConfigMSPEntry 4 } + +-- the sPDUMasterStatusMSP group + +sPDUMasterStatusMSPTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of MasterSwitch pluses at + this IP address." + ::= { sPDUMasterStatusMSP 1 } + + +sPDUMasterStatusMSPTable OBJECT-TYPE + SYNTAX SEQUENCE OF MasterStatusMSPEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for gathering of status from the individual + MasterSwitch pluses. The number of entries is contained + in the sPDUMasterStatusMSPTableSize OID." + ::= { sPDUMasterStatusMSP 2 } + +sPDUMasterStatusMSPEntry OBJECT-TYPE + SYNTAX MasterStatusMSPEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The MasterSwitch pluses to gather status from." + INDEX { sPDUMasterStatusMSPIndex} + ::= { sPDUMasterStatusMSPTable 1 } + +MasterStatusMSPEntry ::= + SEQUENCE { + sPDUMasterStatusMSPIndex INTEGER, + sPDUMasterStatusMSPName DisplayString, + sPDUMasterStatusMSPOutletCount INTEGER + } + +sPDUMasterStatusMSPIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the MasterSwitch plus entry." + ::= { sPDUMasterStatusMSPEntry 1 } + +sPDUMasterStatusMSPName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the MasterSwitch plus. The maximum + value is 23 characters. The name is set by + using the sPDUMasterConfigMSPName OID." + ::= { sPDUMasterStatusMSPEntry 2 } + +sPDUMasterStatusMSPOutletCount OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return the number of controllable + outlets for this MasterSwitch plus." + ::= { sPDUMasterStatusMSPEntry 3 } + +-- the sPDUOutletControlMSP group + +sPDUOutletControlMSPTable OBJECT-TYPE + SYNTAX SEQUENCE OF OutletControlMSPEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for control of individual outlet switches. The number of + entries is contained in the sPDUMasterStatusMSPOutletCount OID." + ::= { sPDUOutletControlMSP 1 } + +sPDUOutletControlMSPEntry OBJECT-TYPE + SYNTAX OutletControlMSPEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The outlets to control." + INDEX { sPDUOutletControlMSPIndex, sPDUOutletControlMSPOutletIndex } + ::= { sPDUOutletControlMSPTable 1 } + +OutletControlMSPEntry ::= + SEQUENCE { + sPDUOutletControlMSPIndex INTEGER, + sPDUOutletControlMSPName DisplayString, + sPDUOutletControlMSPOutletIndex INTEGER, + sPDUOutletControlMSPOutletName DisplayString, + sPDUOutletControlMSPOutletCommand INTEGER + } + +sPDUOutletControlMSPIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the MasterSwitch plus." + ::= { sPDUOutletControlMSPEntry 1 } + +sPDUOutletControlMSPName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the MasterSwitch plus. The maximum + value is 23 characters. The name is set by + using the sPDUMasterConfigMSPName OID." + ::= { sPDUOutletControlMSPEntry 2 } + +sPDUOutletControlMSPOutletIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the outlet entry." + ::= { sPDUOutletControlMSPEntry 3 } + +sPDUOutletControlMSPOutletName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the outlet. The maximum size is + 23 characters. The name is set by using the + sPDUOutletConfigMSPallOutletName OID. + This OID is provided for informational purposes only." + ::= { sPDUOutletControlMSPEntry 4 } + +sPDUOutletControlMSPOutletCommand OBJECT-TYPE + SYNTAX INTEGER { + immediateOnMSP (1), + delayedOnMSP (2), + immediateOffMSP (3), + gracefulRebootMSP (4), + immediateRebootMSP (5), + gracefulshutdownMSP (6), + overrideBatCapThreshMSP (7), + cancelPendingCommandMSP (8) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Getting this variable will return the outlet state. If + the outlet is on, the immediateOnMSP (1) value will be returned. + If the outlet is off, the immediateOffMSP (3) value will be + returned. + + Setting this variable to immediateOnMSP (1) will immediately turn the outlet on. + + Setting this variable to delayedOnMSP (2) will turn the outlet on + after the sPDUOutletConfigMSPPowerOnDelay OID time has elapsed. + + Setting this variable to immediateOffMSP (3) will immediately turn the outlet off. + + Setting this variable to gracefulRebootMSP (4) will cause the outlet to wait for + device confirmation (if applicable) and then turn the outlet off after the + sPDUOutletConfigMSPPowerOffDelay OID time has elapsed. The outlet will then turn + on after the sPDUOutletConfigMSPRebootDuration OID time has elapsed. + + Setting this variable to immediateRebootMSP (5) will immediately reboot the outlet. + + Setting this variable to gracefulshutdownMSP (6) will cause the outlet to wait for + device confirmation (if applicable) and then turn the outlet off after the + sPDUOutletConfigMSPPowerOffDelay OID time has elapsed. The outlet will then turn + on after the sum of the sPDUOutletConfigMSPRestartTime OID time and the + sPDUOutletConfigMSPPowerOnDelay OID time has elapsed. + + Setting this variable to overrideBatCapThreshMSP (7) will cause the outlet to + ignore the Battery Capacity Threshold and proceed waiting on the + sPDUOutletConfigMSPPowerOnDelay OID time before turning the outlet on. + + Setting this variable to cancelPendingCommandMSP (8) will cause any + pending command to this outlet to be canceled." + ::= { sPDUOutletControlMSPEntry 5 } + +-- the sPDUOutletConfigMSPall group + +sPDUOutletConfigMSPallTable OBJECT-TYPE + SYNTAX SEQUENCE OF OutletConfigMSPallEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for configuration of individual outlets. The number of + entries is contained in the sPDUMasterStatusMSPOutletCount OID." + ::= { sPDUOutletConfigMSPall 1 } + +sPDUOutletConfigMSPallEntry OBJECT-TYPE + SYNTAX OutletConfigMSPallEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The outlets to configure." + INDEX { sPDUOutletConfigMSPallIndex, sPDUOutletConfigMSPallOutletIndex } + ::= { sPDUOutletConfigMSPallTable 1 } + +OutletConfigMSPallEntry ::= + SEQUENCE { + sPDUOutletConfigMSPallIndex INTEGER, + sPDUOutletConfigMSPallName DisplayString, + sPDUOutletConfigMSPallOutletIndex INTEGER, + sPDUOutletConfigMSPallOutletName DisplayString, + sPDUOutletConfigMSPallOutletCtrlMode INTEGER + } + +sPDUOutletConfigMSPallIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the MasterSwitch plus." + ::= { sPDUOutletConfigMSPallEntry 1 } + +sPDUOutletConfigMSPallName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the MasterSwitch plus. The maximum + value is 23 characters. The name is set by + using the sPDUMasterConfigMSPName OID." + ::= { sPDUOutletConfigMSPallEntry 2 } + +sPDUOutletConfigMSPallOutletIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the outlet entry." + ::= { sPDUOutletConfigMSPallEntry 3 } + +sPDUOutletConfigMSPallOutletName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the outlet. Maximum size is 23 characters." + ::= { sPDUOutletConfigMSPallEntry 4 } + +sPDUOutletConfigMSPallOutletCtrlMode OBJECT-TYPE + SYNTAX INTEGER { + modeGracefulShutdown (1), + modeAnnunciator (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to modeGracefulShutdown (1) will put this + outlet into the Graceful Shutdown control mode. + + Setting this OID to modeAnnunciator (2) will put this outlet + into the Annunciator control mode." + ::= { sPDUOutletConfigMSPallEntry 5 } + + +-- the sPDUOutConfigMSPgs group + +sPDUOutletConfigMSPgsTable OBJECT-TYPE + SYNTAX SEQUENCE OF OutletConfigMSPgsEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for configuration of individual outlets. The number of + entries is contained in the sPDUMasterStatusMSPOutletCount OID." + ::= { sPDUOutletConfigMSPgs 1 } + +sPDUOutletConfigMSPgsEntry OBJECT-TYPE + SYNTAX OutletConfigMSPgsEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The outlets to configure." + INDEX { sPDUOutletConfigMSPgsIndex, sPDUOutletConfigMSPgsOutletIndex } + ::= { sPDUOutletConfigMSPgsTable 1 } + +OutletConfigMSPgsEntry ::= + SEQUENCE { + sPDUOutletConfigMSPgsIndex INTEGER, + sPDUOutletConfigMSPgsName DisplayString, + sPDUOutletConfigMSPgsOutletIndex INTEGER, + sPDUOutletConfigMSPgsOutletName DisplayString, + sPDUOutletConfigMSPgsOutletCtrlMode INTEGER, + sPDUOutletConfigMSPgsDeviceConfirm INTEGER, + sPDUOutletConfigMSPgsLowBattWarning INTEGER, + sPDUOutletConfigMSPgsLowBattMult INTEGER, + sPDUOutletConfigMSPgsRestartDelay INTEGER, + sPDUOutletConfigMSPgsPowerOnDelay INTEGER, + sPDUOutletConfigMSPgsPowerOffDelay INTEGER, + sPDUOutletConfigMSPgsBattCapThresh INTEGER, + sPDUOutletConfigMSPgsRebootDuration INTEGER + } + +sPDUOutletConfigMSPgsIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the MasterSwitch plus." + ::= { sPDUOutletConfigMSPgsEntry 1 } + +sPDUOutletConfigMSPgsName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the MasterSwitch plus. The maximum + value is 23 characters. The name is set by + using the sPDUMasterConfigMSPName OID." + ::= { sPDUOutletConfigMSPgsEntry 2 } + +sPDUOutletConfigMSPgsOutletIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the outlet entry." + ::= { sPDUOutletConfigMSPgsEntry 3 } + +sPDUOutletConfigMSPgsOutletName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the outlet. The maximum size is + 23 characters. The name is set by using the + sPDUOutletConfigMSPallOutletName OID. + This OID is provided for informational purposes only." + ::= { sPDUOutletConfigMSPgsEntry 4 } + +sPDUOutletConfigMSPgsOutletCtrlMode OBJECT-TYPE + SYNTAX INTEGER { + modeGracefulShutdown (1), + modeAnnunciator (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The Control Mode of the outlet. + This OID is provided for informational purposes only." + ::= { sPDUOutletConfigMSPgsEntry 5 } + +sPDUOutletConfigMSPgsDeviceConfirm OBJECT-TYPE + SYNTAX INTEGER { + deviceConfirmNo (1), + deviceConfirmYes (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to deviceConfirmNo (1) cause the outlet to + NOT wait for device confirmation while performing graceful + operations. + + Setting this OID to deviceConfirmYes (2) cause the outlet to + wait for device confirmation while performing graceful + operations." + ::= { sPDUOutletConfigMSPgsEntry 6 } + +sPDUOutletConfigMSPgsLowBattWarning OBJECT-TYPE + SYNTAX INTEGER (-2..9999) + ACCESS read-write + STATUS mandatory + DESCRIPTION + " The amount of delay, in 6 second intervals, between + when the UPS goes on battery and the power down sequence for + the outlet is initiated. + + Allowed values are: + + -2 - Never initiate the power down sequence on low battery warning. + -1 - Initiate power down sequence based on remaining runtime. + 1 - 9999 six second intervals (6 secs - 16hrs, 39 mins, 54 secs). + 0 indicates to immediately initiate power down sequence on low + battery warning." + ::= { sPDUOutletConfigMSPgsEntry 7 } + +sPDUOutletConfigMSPgsLowBattMult OBJECT-TYPE + SYNTAX INTEGER (1..7) + ACCESS read-write + STATUS mandatory + DESCRIPTION + " Only applicable if sPDUOutletConfigMSPgsLowBattWarning OID is + set to -1 (On Runtime Remaining). + + Allows you to set the value to stagger the shutdown sequence of the outlets. + 1 provides the longest delay (the outlet to shutoff first), and 7 would + provide the shortest delay (the outlet to shut off last). + + Allowed values are: + 1 - 7." + ::= { sPDUOutletConfigMSPgsEntry 8 } + +sPDUOutletConfigMSPgsRestartDelay OBJECT-TYPE + SYNTAX INTEGER (-1..9999) + ACCESS read-write + STATUS mandatory + DESCRIPTION + " The amount of delay, in 6 minute intervals, between + when the outlet is turned off and the outlet is turned back on + when performing a Graceful Shutdown. + + Allowed values are: + + -1 - Never turn outlet back on after a Graceful shutdown. + 0 - 9999 six minute intervals (0 - 999hrs, 54 mins)." + ::= { sPDUOutletConfigMSPgsEntry 9 } + +sPDUOutletConfigMSPgsPowerOnDelay OBJECT-TYPE + SYNTAX INTEGER (-1..9999) + ACCESS read-write + STATUS mandatory + DESCRIPTION + " The amount of delay, in seconds, between the UPS entering + normal (on-line) state and the outlet being powered on. + + Allowed values are: + + -1 - Remain Off when the UPS enters the on-line state. + 0 - 9999 seconds (0 - 2 hrs, 46 mins, 39 secs)." + ::= { sPDUOutletConfigMSPgsEntry 10 } + + +sPDUOutletConfigMSPgsPowerOffDelay OBJECT-TYPE + SYNTAX INTEGER (0..9999) + ACCESS read-write + STATUS mandatory + DESCRIPTION + " The amount of delay, in seconds, between when the server + shuts down and the outlet is powered off. + + Allowed values are: + + 0 - 9999 seconds (0 - 2 hrs, 46 mins, 39 secs)." + ::= { sPDUOutletConfigMSPgsEntry 11 } + +sPDUOutletConfigMSPgsBattCapThresh OBJECT-TYPE + SYNTAX INTEGER (0..100) + ACCESS read-write + STATUS mandatory + DESCRIPTION + " The minimum battery capacity, as a percent (0-100%), required + of the UPS before an outlet will be allowed to power on. + + Allowed values are: + + 0 - 100 percent." + ::= { sPDUOutletConfigMSPgsEntry 12 } + +sPDUOutletConfigMSPgsRebootDuration OBJECT-TYPE + SYNTAX INTEGER (0..9999) + ACCESS read-write + STATUS mandatory + DESCRIPTION + " The amount of delay, in seconds, from outlet off until + outlet on during a reboot. + + Allowed values are: + + 0 - 9999 seconds (0 - 2 hrs, 46 mins, 39 secs)." + ::= { sPDUOutletConfigMSPgsEntry 13 } + + +-- the sPDUOutConfigMSPannun group + +sPDUOutletConfigMSPannunTable OBJECT-TYPE + SYNTAX SEQUENCE OF OutletConfigMSPannunEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for configuration of individual outlets. The number of + entries is contained in the sPDUMasterStatusMSPOutletCount OID." + ::= { sPDUOutletConfigMSPannun 1 } + +sPDUOutletConfigMSPannunEntry OBJECT-TYPE + SYNTAX OutletConfigMSPannunEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The outlets to configure." + INDEX { sPDUOutletConfigMSPannunIndex, sPDUOutletConfigMSPannunOutletIndex } + ::= { sPDUOutletConfigMSPannunTable 1 } + +OutletConfigMSPannunEntry ::= + SEQUENCE { + sPDUOutletConfigMSPannunIndex INTEGER, + sPDUOutletConfigMSPannunName DisplayString, + sPDUOutletConfigMSPannunOutletIndex INTEGER, + sPDUOutletConfigMSPannunOutletName DisplayString, + sPDUOutletConfigMSPannunOutletCtrlMode INTEGER, + sPDUOutletConfigMSPannunInitialState INTEGER, + sPDUOutletConfigMSPannunAlarmActionDly INTEGER + } + +sPDUOutletConfigMSPannunIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the MasterSwitch plus." + ::= { sPDUOutletConfigMSPannunEntry 1 } + +sPDUOutletConfigMSPannunName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the MasterSwitch plus. The maximum + value is 23 characters. The name is set by + using the sPDUMasterConfigMSPName OID." + ::= { sPDUOutletConfigMSPannunEntry 2 } + +sPDUOutletConfigMSPannunOutletIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the outlet entry." + ::= { sPDUOutletConfigMSPannunEntry 3 } + +sPDUOutletConfigMSPannunOutletName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the outlet. The maximum size is + 23 characters. The name is set by using the + sPDUOutletConfigMSPallOutletName OID. + This OID is provided for informational purposes only." + ::= { sPDUOutletConfigMSPannunEntry 4 } + +sPDUOutletConfigMSPannunOutletCtrlMode OBJECT-TYPE + SYNTAX INTEGER { + modeGracefulShutdown (1), + modeAnnunciator (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The Control Mode of the outlet. + This OID is provided for informational purposes only." + ::= { sPDUOutletConfigMSPannunEntry 5 } + +sPDUOutletConfigMSPannunInitialState OBJECT-TYPE + SYNTAX INTEGER { + initialStateOff (1), + initialStateOn (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to initialStateOff (1) causes the outlet + to default to off when in the non-alarmed condition. + + Setting this OID to initialStateOn (2) causes the outlet + to default to on when in the non-alarmed condition." + ::= { sPDUOutletConfigMSPannunEntry 6 } + +sPDUOutletConfigMSPannunAlarmActionDly OBJECT-TYPE + SYNTAX INTEGER (0..9999) + ACCESS read-write + STATUS mandatory + DESCRIPTION + " The amount of time, in seconds, that an enabled Measure-UPS + alarm must be asserted before an alarm condition is recognized. + + Allowed values are: + + 0 - 9999 seconds (0 - 2 hrs, 46 mins, 39 secs)." + ::= { sPDUOutletConfigMSPannunEntry 7 } + + +-- the sPDUOutConfigMSPmups group + +sPDUOutletConfigMSPmupsTable OBJECT-TYPE + SYNTAX SEQUENCE OF OutletConfigMSPmupsEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for configuration of individual outlets. The number of + entries is contained in the sPDUMasterStatusMSPOutletCount OID." + ::= { sPDUOutletConfigMSPmups 1 } + +sPDUOutletConfigMSPmupsEntry OBJECT-TYPE + SYNTAX OutletConfigMSPmupsEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The outlets to configure." + INDEX { sPDUOutletConfigMSPmupsIndex, sPDUOutletConfigMSPmupsOutletIndex } + ::= { sPDUOutletConfigMSPmupsTable 1 } + +OutletConfigMSPmupsEntry ::= + SEQUENCE { + sPDUOutletConfigMSPmupsIndex INTEGER, + sPDUOutletConfigMSPmupsName DisplayString, + sPDUOutletConfigMSPmupsOutletIndex INTEGER, + sPDUOutletConfigMSPmupsOutletName DisplayString, + sPDUOutletConfigMSPmupsZone1 INTEGER, + sPDUOutletConfigMSPmupsZone2 INTEGER, + sPDUOutletConfigMSPmupsZone3 INTEGER, + sPDUOutletConfigMSPmupsZone4 INTEGER, + sPDUOutletConfigMSPmupsP1LowHum INTEGER, + sPDUOutletConfigMSPmupsP1HiHum INTEGER, + sPDUOutletConfigMSPmupsP1LowTemp INTEGER, + sPDUOutletConfigMSPmupsP1HiTemp INTEGER, + sPDUOutletConfigMSPmupsP2LowHum INTEGER, + sPDUOutletConfigMSPmupsP2HiHum INTEGER, + sPDUOutletConfigMSPmupsP2LowTemp INTEGER, + sPDUOutletConfigMSPmupsP2HiTemp INTEGER + } + +sPDUOutletConfigMSPmupsIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the MasterSwitch plus." + ::= { sPDUOutletConfigMSPmupsEntry 1 } + +sPDUOutletConfigMSPmupsName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the MasterSwitch plus. The maximum + value is 23 characters. The name is set by + using the sPDUMasterConfigMSPName OID." + ::= { sPDUOutletConfigMSPmupsEntry 2 } + +sPDUOutletConfigMSPmupsOutletIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the outlet entry." + ::= { sPDUOutletConfigMSPmupsEntry 3 } + +sPDUOutletConfigMSPmupsOutletName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the outlet. The maximum size is + 23 characters. The name is set by using the + sPDUOutletConfigMSPallOutletName OID. + This OID is provided for informational purposes only." + ::= { sPDUOutletConfigMSPmupsEntry 4 } + +sPDUOutletConfigMSPmupsZone1 OBJECT-TYPE + SYNTAX INTEGER { + disableAlarm (1), + enableAlarm (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to disableAlarm (1) disables the + Zone 1 alarm for this outlet. + + Setting this OID to enableAlarm (2) enables the + Zone 1 alarm for this outlet." + ::= { sPDUOutletConfigMSPmupsEntry 5 } + +sPDUOutletConfigMSPmupsZone2 OBJECT-TYPE + SYNTAX INTEGER { + disableAlarm (1), + enableAlarm (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to disableAlarm (1) disables the + Zone 2 alarm for this outlet. + + Setting this OID to enableAlarm (2) enables the + Zone 2 alarm for this outlet." + ::= { sPDUOutletConfigMSPmupsEntry 6 } + +sPDUOutletConfigMSPmupsZone3 OBJECT-TYPE + SYNTAX INTEGER { + disableAlarm (1), + enableAlarm (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to disableAlarm (1) disables the + Zone 3 alarm for this outlet. + + Setting this OID to enableAlarm (2) enables the + Zone 3 alarm for this outlet." + ::= { sPDUOutletConfigMSPmupsEntry 7 } + +sPDUOutletConfigMSPmupsZone4 OBJECT-TYPE + SYNTAX INTEGER { + disableAlarm (1), + enableAlarm (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to disableAlarm (1) disables the + Zone 4 alarm for this outlet. + + Setting this OID to enableAlarm (2) enables the + Zone 4 alarm for this outlet." + ::= { sPDUOutletConfigMSPmupsEntry 8 } + +sPDUOutletConfigMSPmupsP1LowHum OBJECT-TYPE + SYNTAX INTEGER { + disableAlarm (1), + enableAlarm (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to disableAlarm (1) disables the + Probe 1 low humidity alarm for this outlet. + + Setting this OID to enableAlarm (2) enables the + Probe 1 low humidity alarm for this outlet." + ::= { sPDUOutletConfigMSPmupsEntry 9 } + +sPDUOutletConfigMSPmupsP1HiHum OBJECT-TYPE + SYNTAX INTEGER { + disableAlarm (1), + enableAlarm (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to disableAlarm (1) disables the + Probe 1 high humidity alarm for this outlet. + + Setting this OID to enableAlarm (2) enables the + Probe 1 high humidity alarm for this outlet." + ::= { sPDUOutletConfigMSPmupsEntry 10 } + +sPDUOutletConfigMSPmupsP1LowTemp OBJECT-TYPE + SYNTAX INTEGER { + disableAlarm (1), + enableAlarm (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to disableAlarm (1) disables the + Probe 1 low temperature alarm for this outlet. + + Setting this OID to enableAlarm (2) enables the + Probe 1 low temperature alarm for this outlet." + ::= { sPDUOutletConfigMSPmupsEntry 11 } + +sPDUOutletConfigMSPmupsP1HiTemp OBJECT-TYPE + SYNTAX INTEGER { + disableAlarm (1), + enableAlarm (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to disableAlarm (1) disables the + Probe 1 high temperature alarm for this outlet. + + Setting this OID to enableAlarm (2) enables the + Probe 1 high temperature alarm for this outlet." + ::= { sPDUOutletConfigMSPmupsEntry 12 } + +sPDUOutletConfigMSPmupsP2LowHum OBJECT-TYPE + SYNTAX INTEGER { + disableAlarm (1), + enableAlarm (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to disableAlarm (1) disables the + Probe 2 low humidity alarm for this outlet. + + Setting this OID to enableAlarm (2) enables the + Probe 2 low humidity alarm for this outlet." + ::= { sPDUOutletConfigMSPmupsEntry 13 } + +sPDUOutletConfigMSPmupsP2HiHum OBJECT-TYPE + SYNTAX INTEGER { + disableAlarm (1), + enableAlarm (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to disableAlarm (1) disables the + Probe 2 high humidity alarm for this outlet. + + Setting this OID to enableAlarm (2) enables the + Probe 2 high humidity alarm for this outlet." + ::= { sPDUOutletConfigMSPmupsEntry 14 } + +sPDUOutletConfigMSPmupsP2LowTemp OBJECT-TYPE + SYNTAX INTEGER { + disableAlarm (1), + enableAlarm (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to disableAlarm (1) disables the + Probe 2 low temperature alarm for this outlet. + + Setting this OID to enableAlarm (2) enables the + Probe 2 low temperature alarm for this outlet." + ::= { sPDUOutletConfigMSPmupsEntry 15 } + +sPDUOutletConfigMSPmupsP2HiTemp OBJECT-TYPE + SYNTAX INTEGER { + disableAlarm (1), + enableAlarm (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to disableAlarm (1) disables the + Probe 2 high temperature alarm for this outlet. + + Setting this OID to enableAlarm (2) enables the + Probe 2 high temperature alarm for this outlet." + ::= { sPDUOutletConfigMSPmupsEntry 16 } + +-- the sPDUOutletStatusMSP group + +sPDUOutletStatusMSPTable OBJECT-TYPE + SYNTAX SEQUENCE OF OutletStatusMSPEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for getting of status of individual outlets. The number of + entries is contained in the sPDUMasterStatusOutletCount OID." + ::= { sPDUOutletStatusMSP 1 } + +sPDUOutletStatusMSPEntry OBJECT-TYPE + SYNTAX OutletStatusMSPEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The outlets to gather status from." + INDEX { sPDUOutletStatusMSPIndex, sPDUOutletStatusMSPOutletIndex } + ::= { sPDUOutletStatusMSPTable 1 } + +OutletStatusMSPEntry ::= + SEQUENCE { + sPDUOutletStatusMSPIndex INTEGER, + sPDUOutletStatusMSPName DisplayString, + sPDUOutletStatusMSPOutletIndex INTEGER, + sPDUOutletStatusMSPOutletName DisplayString, + sPDUOutletStatusMSPOutletState INTEGER, + sPDUOutletStatusMSPCommandPending INTEGER, + sPDUOutletStatusMSPOutletCtrlMode INTEGER + } + +sPDUOutletStatusMSPIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the MasterSwitch MSP." + ::= { sPDUOutletStatusMSPEntry 1 } + +sPDUOutletStatusMSPName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the MasterSwitch plus. The maximum + value is 23 characters. The name is set by + using the sPDUMasterConfigMSPName OID." + ::= { sPDUOutletStatusMSPEntry 2 } + +sPDUOutletStatusMSPOutletIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the outlet entry." + ::= { sPDUOutletStatusMSPEntry 3 } + +sPDUOutletStatusMSPOutletName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the outlet. The maximum size is + 23 characters. The name is set by using the + sPDUOutletConfigMSPallOutletName OID. + This OID is provided for informational purposes only." + ::= { sPDUOutletStatusMSPEntry 4 } + +sPDUOutletStatusMSPOutletState OBJECT-TYPE + SYNTAX INTEGER { + outletStatusMSPOn (1), + outletStatusMSPOff (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this variable will return the outlet state. If + the outlet is on, the outletStatusMSPOn (1) value will be returned. + If the outlet is off, the outletStatusMSPOff (2) value will be + returned. " + ::= { sPDUOutletStatusMSPEntry 5 } + +sPDUOutletStatusMSPCommandPending OBJECT-TYPE + SYNTAX INTEGER { + outletStatusMSPCommandPending (1), + outletStatusMSPNoCommandPending (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this variable will return the command pending + state of the outlet. If a command is pending on the + outlet, the outletStatusMSPCommandPending (1) value + will be returned. If there is not a command pending + on the outlet, the outletStatusMSPNoCommandPending (2) + will be returned." + ::= { sPDUOutletStatusMSPEntry 6 } + +sPDUOutletStatusMSPOutletCtrlMode OBJECT-TYPE + SYNTAX INTEGER { + modeGracefulShutdown (1), + modeAnnunciator (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The Control Mode of the outlet. + This OID is provided for informational purposes only." + ::= { sPDUOutletStatusMSPEntry 7 } + + +-- the rPDUIdent group + +rPDUIdentName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the Rack PDU. + The maximum string size is device dependent." + ::= { rPDUIdent 1 } + +rPDUIdentHardwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The hardware revision of the Rack PDU. + This value is set at the factory." + ::= { rPDUIdent 2 } + +rPDUIdentFirmwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An 8-byte ID string identifying the Rack PDU firmware revision. + This value is set at the factory." + ::= { rPDUIdent 3 } + + +rPDUIdentDateOfManufacture OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The date when the Rack PDU was manufactured in mm/dd/yy format. + This value is set at the factory. The year 2000 will be + represented by 00." + ::= { rPDUIdent 4 } + +rPDUIdentModelNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A 10-character string identifying the model number of + the Rack PDU. This value is set at the factory." + ::= { rPDUIdent 5 } + +rPDUIdentSerialNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A 12-character string identifying the serial number of + the Rack PDU. This value is set at the factory." + ::= { rPDUIdent 6 } + +rPDUIdentDeviceRating OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return the electrical rating of the device." + + ::= { rPDUIdent 7 } + +rPDUIdentDeviceNumOutlets OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return the number of outlets contained in the device." + + ::= { rPDUIdent 8 } + +rPDUIdentDeviceNumPhases OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return the number of phases supported by the device." + + ::= { rPDUIdent 9 } + +rPDUIdentDeviceNumBreakers OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return the number of circuit breakers supported by the device. + This is the same as the number of banks of outlets." + + ::= { rPDUIdent 10 } + +rPDUIdentDeviceBreakerRating OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return rating of the circuit breakers on the device if it has any." + + ::= { rPDUIdent 11 } + +rPDUIdentDeviceOrientation OBJECT-TYPE + SYNTAX INTEGER { + orientHorizontal (1), + orientVertical (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return the intended physical orientation of the device. + + OrientHorizonatal(1) indicates Horizontal. + OrientVertical(2) indicates Vertical." + + ::= { rPDUIdent 12 } + +rPDUIdentDeviceOutletLayout OBJECT-TYPE + SYNTAX INTEGER { + seqPhaseToNeutral (1), + seqPhaseToPhase (2), + seqPhToNeu21PhToPh (3), + seqPhToPhGrouped (4) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return outlet layout for the device. + + SeqPhaseToNeutral(1) indicates outlet layout as follows: + 1:1-N,2:2-N,3:3-N,4:1-N,5:2-N,... + + SeqPhaseToPhase(2) indicates outlet layout as follows: + 1:1-2,2:2-3,3:3-1,4:1-2,5:2-3,... + + SeqPhToNeu21PhToPh(3) indicates outlet layout as follows: + 1:1-N,2:2-N...21:3-N,22:1-2,23:2-3,24:3-1,... + + SeqPhToPhGrouped(4) indicates outlet layout as follows: + Otlts1-8::(3-1),Otlts9-16::(2-3),Otlts17-24::(1-2)." + ::= { rPDUIdent 13 } + + + +-- the rPDULoadDevice group + +rPDULoadDevMaxPhaseLoad OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return the maximum rated power + that each phase of the Rack PDU can provide. It is + represented in Amps." + ::= { rPDULoadDevice 1 } + +rPDULoadDevNumPhases OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of phases available with this Rack PDU." + ::= { rPDULoadDevice 2 } + +rPDULoadDevMaxBankLoad OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return the maximum rated power + that each bank of the Rack PDU can provide. It is + represented in Amps. + + 0 will be returned if the device does not have any banks." + + ::= { rPDULoadDevice 3 } + +rPDULoadDevNumBanks OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of banks of outlets available with this Rack PDU. + A bank of outlets has a unique circuit breaker for a subset + of the total number of outlets on the rPDU." + ::= { rPDULoadDevice 4 } + +-- the rPDULoadPhaseConfig group + +rPDULoadPhaseConfigTable OBJECT-TYPE + SYNTAX SEQUENCE OF LoadPhaseConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for configuration of each Rack PDU phase. + The number of entries is contained in the + rPDULoadDevNumPhases OID." + ::= { rPDULoadPhaseConfig 1 } + +rPDULoadPhaseConfigEntry OBJECT-TYPE + SYNTAX LoadPhaseConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The Rack PDU phase to configure." + INDEX { rPDULoadPhaseConfigIndex} + ::= { rPDULoadPhaseConfigTable 1 } + +LoadPhaseConfigEntry ::= + SEQUENCE { + rPDULoadPhaseConfigIndex INTEGER, + rPDULoadPhaseConfigLowLoadThreshold INTEGER, + rPDULoadPhaseConfigNearOverloadThreshold INTEGER, + rPDULoadPhaseConfigOverloadThreshold INTEGER + } + +rPDULoadPhaseConfigIndex OBJECT-TYPE + SYNTAX INTEGER { + phase1 (1), + phase2 (2), + phase3 (3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the Rack PDU phase entry." + ::= { rPDULoadPhaseConfigEntry 1 } + +rPDULoadPhaseConfigLowLoadThreshold OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "A threshold that indicates the power consumption of + the load is nearing a low consumption condition. It is + represented in amps. A warning will be issued when the + load is less than the threshold value. + + A threshold value of 0 amps effectively disables this + warning. + + Maximum value must be less than the value returned + by the rPDULoadPhaseConfigNearOverloadThreshold OID." + ::= { rPDULoadPhaseConfigEntry 2 } + +rPDULoadPhaseConfigNearOverloadThreshold OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "A threshold that indicates the power consumption of + the load is nearing an overload condition. It is + represented in amps. A warning will be issued when the + load is greater than or equal to the threshold value. + + Minimum value must be greater than the value returned by + the rPDULoadPhaseConfigLowLoadThreshold OID. + + Maximum value must be less than or equal to the value + returned by the rPDULoadPhaseConfigOverloadThreshold OID." + ::= { rPDULoadPhaseConfigEntry 3 } + +rPDULoadPhaseConfigOverloadThreshold OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "A threshold that indicates the power consumption of + the load has entered an overload condition. It is + represented in amps. A warning will be issued when the + load is greater than or equal to the threshold value. + + Minimum value must be greater than or equal to the value + returned by the rPDULoadPhaseConfigNearOverloadThreshold OID. + + Maximum value must be less than or equal to the value + returned by the rPDULoadDevMaxPhaseLoad OID." + ::= { rPDULoadPhaseConfigEntry 4 } + + +-- the rPDULoadStatus group + +rPDULoadStatusTable OBJECT-TYPE + SYNTAX SEQUENCE OF LoadStatusEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for getting of status of each Rack PDU phase/bank. + The number of entries is calculated by adding + the number of phases (rPDULoadDevNumPhases OID) and + the number of banks of outlets (rPDULoadDevNumBanks) + Number of entries = #phases + #banks. + NOTE: If a device has phase and bank information, all phase information + shall preceed the bank information." + ::= { rPDULoadStatus 1 } + +rPDULoadStatusEntry OBJECT-TYPE + SYNTAX LoadStatusEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The Rack PDU phase/bank to gather status from." + INDEX { rPDULoadStatusIndex} + ::= { rPDULoadStatusTable 1 } + +LoadStatusEntry ::= + SEQUENCE { + rPDULoadStatusIndex INTEGER, + rPDULoadStatusLoad Gauge, + rPDULoadStatusLoadState INTEGER, + rPDULoadStatusPhaseNumber INTEGER, + rPDULoadStatusBankNumber INTEGER + } + +rPDULoadStatusIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the Rack PDU phase/bank entry. All phase information will preceed + any bank information" + ::= { rPDULoadStatusEntry 1 } + +rPDULoadStatusLoad OBJECT-TYPE + SYNTAX Gauge + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return the phase/bank load measured + in tenths of amps." + ::= { rPDULoadStatusEntry 2 } + +rPDULoadStatusLoadState OBJECT-TYPE + SYNTAX INTEGER { + phaseLoadNormal (1), + phaseLoadLow (2), + phaseLoadNearOverload (3), + phaseLoadOverload (4) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return the phase/bank load state. + + phaseLoadNormal(1) indicates that the phase/bank is + operating properly within the rPDULoadConfigLowLoadThreshold + and rPDULoadConfigNearOverloadThreshold OID values. + + phaseLoadLow(2) indicates that the phase/bank load has + dropped below the rPDULoadConfigLowLoadThreshold OID value. + An SNMP trap will occur when this state is entered or cleared. + + phaseLoadNearOverload(3) indicates that the phase/bank load + is greater than or equal to the + rPDULoadConfigNearOverloadThreshold OID value. + An SNMP trap will occur when this state is entered or cleared. + + phaseLoadOverload(4) indicates that the phase/bank load is + greater than or equal to the rPDULoadConfigOverloadThreshold + OID value. + An SNMP trap will occur when this state is entered or cleared." + ::= { rPDULoadStatusEntry 3 } + +rPDULoadStatusPhaseNumber OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The phase number to which this record refers. A value of 0 will be returned if + this is bank related information." + ::= { rPDULoadStatusEntry 4 } + +rPDULoadStatusBankNumber OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The bank number to which this record refers. A value of 0 will be returned if + this is phase related information." + ::= { rPDULoadStatusEntry 5 } + +-- the rPDULoadBankConfig group + +rPDULoadBankConfigTable OBJECT-TYPE + SYNTAX SEQUENCE OF LoadBankConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for configuration of each Rack PDU bank. + The number of entries is contained in the + rPDULoadDevNumBanks OID." + ::= { rPDULoadBankConfig 1 } + +rPDULoadBankConfigEntry OBJECT-TYPE + SYNTAX LoadBankConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The Rack PDU bank to configure." + INDEX { rPDULoadBankConfigIndex} + ::= { rPDULoadBankConfigTable 1 } + +LoadBankConfigEntry ::= + SEQUENCE { + rPDULoadBankConfigIndex INTEGER, + rPDULoadBankConfigLowLoadThreshold INTEGER, + rPDULoadBankConfigNearOverloadThreshold INTEGER, + rPDULoadBankConfigOverloadThreshold INTEGER + } + +rPDULoadBankConfigIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the Rack PDU bank entry." + ::= { rPDULoadBankConfigEntry 1 } + +rPDULoadBankConfigLowLoadThreshold OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "A threshold that indicates the power consumption of + the load is nearing a low consumption condition. It is + represented in amps. A warning will be issued when the + load is less than the threshold value. + + A threshold value of 0 amps effectively disables this + warning. + + Maximum value must be less than the value returned + by the rPDULoadBankConfigNearOverloadThreshold OID. + + -1 will be returned if the device has no banks." + + ::= { rPDULoadBankConfigEntry 2 } + +rPDULoadBankConfigNearOverloadThreshold OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "A threshold that indicates the power consumption of + the load is nearing an overload condition. It is + represented in amps. A warning will be issued when the + load is greater than or equal to the threshold value. + + Minimum value must be greater than the value returned by + the rPDULoadBankConfigLowLoadThreshold OID. + + Maximum value must be less than or equal to the value + returned by the rPDULoadBankConfigOverloadThreshold OID. + + -1 will be returned if the device has no banks." + + ::= { rPDULoadBankConfigEntry 3 } + +rPDULoadBankConfigOverloadThreshold OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "A threshold that indicates the power consumption of + the load has entered an overload condition. It is + represented in amps. A warning will be issued when the + load is greater than or equal to the threshold value. + + Minimum value must be greater than or equal to the value + returned by the rPDULoadBankConfigNearOverloadThreshold OID. + + Maximum value must be less than or equal to the value + returned by the rPDULoadDevMaxBankLoad OID. + + -1 will be returned if the device has no banks." + + ::= { rPDULoadBankConfigEntry 4 } + + +-- the rPDUOutletDevice group + +rPDUOutletDevCommand OBJECT-TYPE + SYNTAX INTEGER { + noCommandAll (1), + immediateAllOn (2), + immediateAllOff (3), + immediateAllReboot (4), + delayedAllOn (5), + delayedAllOff (6), + delayedAllReboot (7), + cancelAllPendingCommands (8), + gracefulAllOff (9), + gracefulAllReboot (10) + } + + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this OID to immediateAllOn (2) will turn all outlets + on immediately. + + Setting this OID to immediateAllOff (3) will turn all outlets + off immediately. + + Setting this OID to immediateAllReboot (4) will reboot all outlets + immediately. + + Setting this OID to delayedAllOn (5) will turn all outlets on as + defined by each outlet's rPDUOutletConfigPowerOnTime OID value. + + Setting this OID to delayedAllOff (6) will turn all outlets + off as defined by each outlet's rPDUOutletConfigPowerOffTime OID value. + + Setting this OID to delayedAllReboot (7) will cause a + delayedAllOff command to be performed. Once all outlets are off, + the Switched Rack PDU will then delay the largest + rPDUOutletConfigRebootDuration OID time, and then perform a + delayedAllOn command. + + Setting this OID to cancelAllPendingCommands (8) will cause all pending + commands on the Switched Rack PDU to be canceled. + + Setting this variable to gracefulAllOff (9) will cause the + Switched Rack PDU to shut all outlets off after it waits the + servers graceful shutdown time and each outlet's shutdown delay. + + Setting this variable to gracefulAllReboot (10) will cause the + Switched Rack PDU to shut all outlets off after it waits the + servers graceful shutdown time and each outlet's shutdown delay. + Once all outlet are off, it will wait until the UPS reaches the + configured minimum return battery capacity, then each outlet's + return delay before it turns the outlet back on. + + Getting this OID will return the noCommandAll (1) value." + ::= { rPDUOutletDevice 1 } + +rPDUOutletDevColdstartDelay OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The amount of delay, in seconds, between when + power is provided to the Switched Rack PDU and + when the Switched Rack PDU provides basic master + power to the outlets. + + Allowed values are: + + -1 - never apply power automatically. + 0 - apply power immediately. + 1 to 300 - delay up to 300 seconds (5 minutes)." + ::= { rPDUOutletDevice 2 } + +rPDUOutletDevNumCntrlOutlets OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of controlled outlets on this Switched Rack PDU." + ::= { rPDUOutletDevice 3 } + +rPDUOutletDevNumTotalOutlets OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The total number of outlets on this Rack PDU." + ::= { rPDUOutletDevice 4 } + + +-- the rPDUOutletPhase group + +rPDUOutletPhaseTable OBJECT-TYPE + SYNTAX SEQUENCE OF OutletPhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for management of outlets on a per phase basis." + ::= { rPDUOutletPhase 1 } + +rPDUOutletPhaseEntry OBJECT-TYPE + SYNTAX OutletPhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The phase to manage." + INDEX { rPDUOutletPhaseIndex} + ::= { rPDUOutletPhaseTable 1 } + +OutletPhaseEntry ::= + SEQUENCE { + rPDUOutletPhaseIndex INTEGER, + rPDUOutletPhaseOverloadRestriction INTEGER + } + +rPDUOutletPhaseIndex OBJECT-TYPE + SYNTAX INTEGER { + phase1 (1), + phase2 (2), + phase3 (3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the Switched Rack PDU phase entry." + ::= { rPDUOutletPhaseEntry 1 } + +rPDUOutletPhaseOverloadRestriction OBJECT-TYPE + SYNTAX INTEGER { + alwaysAllowTurnON (1), + restrictOnNearOverload (2), + restrictOnOverload (3) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This OID controls the behavior of a Switched Rack PDU + phase when an overload condition is possible and + additional outlets are requested to be turned on. + + Setting this OID to alwaysAllowTurnON (1) will always allow + the outlets on the corresponding phase to turn on. + + Setting this OID to restrictOnNearOverload (2) will not allow + outlets on the corresponding phase to turn on if the + rPDULoadConfigNearOverloadThreshold OID is exceeded. + + Setting this OID to restrictOnOverload (3) will not allow + outlets on the corresponding phase to turn on if the + rPDULoadConfigOverloadThreshold OID is exceeded." + ::= { rPDUOutletPhaseEntry 2 } + + +-- the rPDUOutletControl group + +rPDUOutletControlTable OBJECT-TYPE + SYNTAX SEQUENCE OF RPDUOutletControlEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for control of the individual outlets. + The number of entries is contained in the + rPDUOutletDevNumCntrlOutlets OID." + ::= { rPDUOutletControl 1 } + +rPDUOutletControlEntry OBJECT-TYPE + SYNTAX RPDUOutletControlEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The outlet to control." + INDEX { rPDUOutletControlIndex} + ::= { rPDUOutletControlTable 1 } + +RPDUOutletControlEntry ::= + SEQUENCE { + rPDUOutletControlIndex INTEGER, + rPDUOutletControlOutletName DisplayString, + rPDUOutletControlOutletPhase INTEGER, + rPDUOutletControlOutletCommand INTEGER, + rPDUOutletControlOutletBank INTEGER + } + +rPDUOutletControlIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the outlet entry." + ::= { rPDUOutletControlEntry 1 } + +rPDUOutletControlOutletName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the outlet. Maximum size is dependent on device. + An error will be returned if the set request exceeds the max size. + This OID is provided for informational purposes only." + ::= { rPDUOutletControlEntry 2 } + +rPDUOutletControlOutletPhase OBJECT-TYPE + SYNTAX INTEGER { + phase1 (1), + phase2 (2), + phase3 (3), + phase1-2 (4), + phase2-3 (5), + phase3-1 (6) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The phase/s associated with this outlet. + + For single phase devices, this object will always + return phase1(1). + + For 3-phase devices, this object will return phase1 (1), + phase2 (2), or phase3 (3) for outlets tied to a single + phase. For outlets tied to two phases, this object will + return phase1-2 (4) for phases 1 and 2, phase2-3 (5) for + phases 2 and 3, and phase3-1 (6) for phases 3 and 1." + ::= { rPDUOutletControlEntry 3 } + +rPDUOutletControlOutletCommand OBJECT-TYPE + SYNTAX INTEGER { + immediateOn (1), + immediateOff (2), + immediateReboot (3), + delayedOn (4), + delayedOff (5), + delayedReboot (6), + cancelPendingCommand (7), + gracefulOff (8), + gracefulReboot (9) + + } + + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Getting this variable will return the outlet state. If + the outlet is on, the immediateOn (1) value will be returned. + If the outlet is off, the immediateOff (2) value will be + returned. + + + Setting this variable to immediateOn (1) will immediately turn + the outlet on. + + Setting this variable to immediateOff (2) will immediately turn + the outlet off. + + Setting this variable to immediateReboot (3) will immediately + reboot the outlet. + + Setting this variable to delayedOn (4) will turn the outlet on + after the rPDUOutletConfigPowerOnTime OID time has elapsed. + + Setting this variable to delayedOff (5) will turn the outlet off + after the rPDUOutletConfigPowerOffTime OID time has elapsed. + + Setting this variable to delayedReboot (6) will cause the + Switched Rack PDU to perform a delayedOff command, wait the + rPDUOutletConfigRebootDuration OID time, and then perform a + delayedOn command. + + Setting this variable to cancelPendingCommand (7) will cause any + pending command to this outlet to be canceled. + + Setting this variable to gracefulOff (8) will cause the + Switched Rack PDU to shut the outlet off after it waits the + servers graceful shutdown time and the outlets shutdown delay. + + Setting this variable to gracefulReboot (9) will cause the + Switched Rack PDU to shut the outlet off after it waits the + servers graceful shutdown time and the outlets shutdown delay. + Once the outlet is off, it will wait until the UPS reaches the + configured minimum return battery capacity, then the outlets + return delay before it turns the outlet back on." + + ::= { rPDUOutletControlEntry 4 } + +rPDUOutletControlOutletBank OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The bank associated with this outlet." + ::= { rPDUOutletControlEntry 5 } + + +-- the rPDUOutletConfig group + +rPDUOutletConfigTable OBJECT-TYPE + SYNTAX SEQUENCE OF RPDUOutletConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for configuration of individual outlets. The number of + entries is contained in the rPDUOutletDevNumCntrlOutlets OID." + ::= { rPDUOutletConfig 1 } + +rPDUOutletConfigEntry OBJECT-TYPE + SYNTAX RPDUOutletConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The outlet to configure." + INDEX { rPDUOutletConfigIndex} + ::= { rPDUOutletConfigTable 1 } + +RPDUOutletConfigEntry ::= + SEQUENCE { + rPDUOutletConfigIndex INTEGER, + rPDUOutletConfigOutletName DisplayString, + rPDUOutletConfigOutletPhase INTEGER, + rPDUOutletConfigPowerOnTime INTEGER, + rPDUOutletConfigPowerOffTime INTEGER, + rPDUOutletConfigRebootDuration INTEGER, + rPDUOutletConfigOutletBank INTEGER + } + +rPDUOutletConfigIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the outlet entry." + ::= { rPDUOutletConfigEntry 1 } + +rPDUOutletConfigOutletName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the outlet. Maximum size is dependent on device. + An error will be returned if the set request exceeds the max size." + ::= { rPDUOutletConfigEntry 2 } + +rPDUOutletConfigOutletPhase OBJECT-TYPE + SYNTAX INTEGER { + phase1 (1), + phase2 (2), + phase3 (3), + phase1-2 (4), + phase2-3 (5), + phase3-1 (6) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The phase/s associated with this outlet. + + For single phase devices, this object will always + return phase1(1). + + For 3-phase devices, this object will return phase1 (1), + phase2 (2), or phase3 (3) for outlets tied to a single + phase. For outlets tied to two phases, this object will + return phase1-2 (4) for phases 1 and 2, phase2-3 (5) for + phases 2 and 3, and phase3-1 (6) for phases 3 and 1." + ::= { rPDUOutletConfigEntry 3 } + +rPDUOutletConfigPowerOnTime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The amount of time (in seconds) the outlet will delay + powering on at coldstart or when a command that requires + a turn-on delay is issued. + + Allowed values are: + + -1 - never power on. + 0 - power on immediately. + 1 to 300 - power on up to 300 seconds (5 minutes) after being + commanded." + ::= { rPDUOutletConfigEntry 4 } + +rPDUOutletConfigPowerOffTime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The amount of time (in seconds) the outlet will delay + powering off when a command that requires + a turn-off delay is issued. + + Allowed values are: + + -1 - never power off. + 0 - power off immediately. + 1 to 300 - power off up to 300 seconds (5 minutes) after being + commanded." + ::= { rPDUOutletConfigEntry 5 } + +rPDUOutletConfigRebootDuration OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "During a reboot sequence, power is turned off and then + back on. This OID defines the amount of time to wait, + in seconds, after turning the power off, at the start + of the sequence, before turning power back on, at the + end of the reboot sequence. + + Allowed range is any value between 5 and 60 seconds (1 minute)." + ::= { rPDUOutletConfigEntry 6 } + +rPDUOutletConfigOutletBank OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The bank associated with this outlet." + ::= { rPDUOutletConfigEntry 7 } + + +-- the rPDUOutletStatus group + +rPDUOutletStatusTable OBJECT-TYPE + SYNTAX SEQUENCE OF RPDUOutletStatusEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for getting of status of individual outlets. The number of + entries is contained in the rPDUOutletDevNumCntrlOutlets OID." + ::= { rPDUOutletStatus 1 } + +rPDUOutletStatusEntry OBJECT-TYPE + SYNTAX RPDUOutletStatusEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The outlet to gather status from." + INDEX { rPDUOutletStatusIndex} + ::= { rPDUOutletStatusTable 1 } + +RPDUOutletStatusEntry ::= + SEQUENCE { + rPDUOutletStatusIndex INTEGER, + rPDUOutletStatusOutletName DisplayString, + rPDUOutletStatusOutletPhase INTEGER, + rPDUOutletStatusOutletState INTEGER, + rPDUOutletStatusCommandPending INTEGER, + rPDUOutletStatusOutletBank INTEGER + } + +rPDUOutletStatusIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the outlet entry." + ::= { rPDUOutletStatusEntry 1 } + +rPDUOutletStatusOutletName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the outlet. Maximum size is dependent on device. + An error will be returned if the set request exceeds the max size. + This OID is provided for informational purposes only." + ::= { rPDUOutletStatusEntry 2 } + +rPDUOutletStatusOutletPhase OBJECT-TYPE + SYNTAX INTEGER { + phase1 (1), + phase2 (2), + phase3 (3), + phase1-2 (4), + phase2-3 (5), + phase3-1 (6) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The phase/s associated with this outlet. + + For single phase devices, this object will always + return phase1(1). + + For 3-phase devices, this object will return phase1 (1), + phase2 (2), or phase3 (3) for outlets tied to a single + phase. For outlets tied to two phases, this object will + return phase1-2 (4) for phases 1 and 2, phase2-3 (5) for + phases 2 and 3, and phase3-1 (6) for phases 3 and 1." + ::= { rPDUOutletStatusEntry 3 } + +rPDUOutletStatusOutletState OBJECT-TYPE + SYNTAX INTEGER { + outletStatusOn (1), + outletStatusOff (2) + } + + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this variable will return the outlet state. If + the outlet is on, the outletStatusOn (1) value will be returned. + If the outlet is off, the outletStatusOff (2) value will be + returned. " + ::= { rPDUOutletStatusEntry 4 } + +rPDUOutletStatusCommandPending OBJECT-TYPE + SYNTAX INTEGER { + outletStatusCommandPending (1), + outletStatusNoCommandPending (2) + } + + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this variable will return the command pending + state of the outlet. If a command is pending on the + outlet, the outletStatusCommandPending (1) value + will be returned. If there is not a command pending + on the outlet, the outletStatusNoCommandPending (2) + will be returned." + ::= { rPDUOutletStatusEntry 5 } + +rPDUOutletStatusOutletBank OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The bank associated with this outlet." + ::= { rPDUOutletStatusEntry 6 } + + +-- the rPDUOutletBank group + +rPDUOutletBankTable OBJECT-TYPE + SYNTAX SEQUENCE OF OutletBankEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for management of outlets on a per bank basis." + ::= { rPDUOutletBank 1 } + +rPDUOutletBankEntry OBJECT-TYPE + SYNTAX OutletBankEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The bank to manage." + INDEX { rPDUOutletBankIndex} + ::= { rPDUOutletBankTable 1 } + +OutletBankEntry ::= + SEQUENCE { + rPDUOutletBankIndex INTEGER, + rPDUOutletBankOverloadRestriction INTEGER + } + +rPDUOutletBankIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the Switched Rack PDU bank entry." + ::= { rPDUOutletBankEntry 1 } + +rPDUOutletBankOverloadRestriction OBJECT-TYPE + SYNTAX INTEGER { + alwaysAllowTurnON (1), + restrictOnNearOverload (2), + restrictOnOverload (3) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This OID controls the behavior of a Switched Rack PDU + bank when an overload condition is possible and + additional outlets are requested to be turned on. + + Setting this OID to alwaysAllowTurnON (1) will always allow + the outlets on the corresponding bank to turn on. + + Setting this OID to restrictOnNearOverload (2) will not allow + outlets on the corresponding bank to turn on if the + rPDULoadConfigNearOverloadThreshold OID is exceeded. + + Setting this OID to restrictOnOverload (3) will not allow + outlets on the corresponding bank to turn on if the + rPDULoadConfigOverloadThreshold OID is exceeded." + ::= { rPDUOutletBankEntry 2 } + +-- the rPDUPowerSupplyDevice group + +rPDUPowerSupply1Status OBJECT-TYPE + SYNTAX INTEGER { + powerSupply1Ok (1), + powerSupply1Failed (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return powerSupply1Ok(1) if power + supply 1 is functioning normally. If not functioning normally, + this OID will return powerSupply1Failed(2)." + ::= { rPDUPowerSupplyDevice 1 } + +rPDUPowerSupply2Status OBJECT-TYPE + SYNTAX INTEGER { + powerSupply2Ok (1), + powerSupply2Failed (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return powerSupply2Ok(1) if power + supply 2 is functioning normally. If not functioning normally, + this OID will return powerSupply2Failed(2)." + ::= { rPDUPowerSupplyDevice 2 } + + + +-- the dm3IdentSystem group + +dm3IdentSysDescriptionTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of DC description records." + ::= { dm3IdentSystem 1 } + +dm3IdentSysDescriptionTable OBJECT-TYPE + SYNTAX SEQUENCE OF IdentSysDescriptionEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for accessing description records of the powerplant. The number of + entries is contained in the dm3IdentSysDescriptionTableSize OID." + ::= { dm3IdentSystem 2 } + +dm3IdentSysDescriptionEntry OBJECT-TYPE + SYNTAX IdentSysDescriptionEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The powerplant description record to reference." + INDEX { dm3IdentSysDescriptionIndex } + ::= { dm3IdentSysDescriptionTable 1 } + +IdentSysDescriptionEntry ::= + SEQUENCE { + dm3IdentSysDescriptionIndex INTEGER, + dm3IdentSysDescriptionText DisplayString + } + +dm3IdentSysDescriptionIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the DC powerplant description record." + ::= { dm3IdentSysDescriptionEntry 1 } + +dm3IdentSysDescriptionText OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A 16 character text field describing the DC power plant device. + This field can be configured from the dm3ConfigSysDescriptionText OID." + ::= { dm3IdentSysDescriptionEntry 2 } + +dm3IdentSysModel OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Model type of the DC power plant." + ::= { dm3IdentSystem 3 } + +dm3IdentSysCntrlRev OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Integer representation of the hardware revision of the Master Controller board." + ::= { dm3IdentSystem 4 } + +dm3IdentSysFWVersion OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Integer representation of the power plant Master Controller firmware revision." + ::= { dm3IdentSystem 5 } + +-- the dm3ConfigSystem group + +dm3ConfigSysDescriptionTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of DC description records." + ::= { dm3ConfigSystem 1 } + +dm3ConfigSysDescriptionTable OBJECT-TYPE + SYNTAX SEQUENCE OF ConfigSysDescriptionEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for accessing description records of the powerplant. The number of + entries is contained in the dm3ConfigSysDescriptionTableSize OID." + ::= { dm3ConfigSystem 2 } + +dm3ConfigSysDescriptionEntry OBJECT-TYPE + SYNTAX ConfigSysDescriptionEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The powerplant description record to reference." + INDEX { dm3ConfigSysDescriptionIndex } + ::= { dm3ConfigSysDescriptionTable 1 } + +ConfigSysDescriptionEntry ::= + SEQUENCE { + dm3ConfigSysDescriptionIndex INTEGER, + dm3ConfigSysDescriptionText DisplayString + } + +dm3ConfigSysDescriptionIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the DC powerplant description record." + + ::= { dm3ConfigSysDescriptionEntry 1 } + +dm3ConfigSysDescriptionText OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "16 character text field describing the DC power plant device." + + ::= { dm3ConfigSysDescriptionEntry 2 } + +dm3ConfigSysHighTempThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Ambient high temperature threshold. Temperature sensor located on Master + Controller board. + + Values are represented in thousandths of a degree. + Units are displayed in the scale shown in + the 'dm3StatusSysTempUnits' OID (Celsius or Fahrenheit). + + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigSystem 3 } + +dm3ConfigSysHighTempAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the System High Temperature Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + ::= { dm3ConfigSystem 4 } + +dm3ConfigSysLowTempThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Ambient low temperature threshold. Temperature sensor located on Master + Controller board. + + Values are represented in thousandths of a degree. + Units are displayed in the scale shown in + the 'dm3StatusSysTempUnits' OID (Celsius or Fahrenheit). + + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigSystem 5 } + +dm3ConfigSysLowTempAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the System Low Temperature Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + ::= { dm3ConfigSystem 6 } + +dm3ConfigSysHardwareTempAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the System Hardware Temperature Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + ::= { dm3ConfigSystem 7 } + +dm3ConfigSysRemoteAccess OBJECT-TYPE + SYNTAX INTEGER { + accessEnabled (1), + accessDisabled (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + " + This OID is used to disable remote write access to the power plant. + Setting this OID to accessEnabled (1) will have no affect. + Setting this OID to accessDisabled (2) will disable the ability to + remotely configure the DC powerplant. + + Once remote access is disabled, it can only be restored from the front + panel of the DC power plant." + ::= { dm3ConfigSystem 8 } + + +-- the dm3ConfigLVD group + +dm3ConfigLVDTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of DC powerplant LVDs controllable + by this IP address." + ::= { dm3ConfigLVD 1 } + +dm3ConfigLVDTable OBJECT-TYPE + SYNTAX SEQUENCE OF ConfigLVDEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for accessing settings of the LVDs. The number of + entries is contained in the dm3ConfigLVDTableSize OID." + ::= { dm3ConfigLVD 2 } + +dm3ConfigLVDEntry OBJECT-TYPE + SYNTAX ConfigLVDEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The LVD to configure." + INDEX { dm3ConfigLVDIndex } + ::= { dm3ConfigLVDTable 1 } + +ConfigLVDEntry ::= + SEQUENCE { + dm3ConfigLVDIndex INTEGER, + dm3ConfigLVDName DisplayString, + dm3ConfigLVDEnable INTEGER, + dm3ConfigLVDTripThresh INTEGER, + dm3ConfigLVDResetThresh INTEGER, + dm3ConfigLVDOpenAlarm INTEGER, + dm3ConfigLVDHWAlarm INTEGER + } + +dm3ConfigLVDIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the DC powerplant LVD." + ::= { dm3ConfigLVDEntry 1 } + +dm3ConfigLVDName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the LVD. The maximum value is 16 characters." + ::= { dm3ConfigLVDEntry 2 } + +dm3ConfigLVDEnable OBJECT-TYPE + SYNTAX INTEGER { + enabledYes (1), + enabledNo (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This OID is used to control and indicate if the LVD is on or off. + Setting this OID to enabledYes (1) will enable (turn on) the LVD. + Setting this OID to enabledNo (2) will disable (turn off) the LVD." + ::= { dm3ConfigLVDEntry 3 } + +dm3ConfigLVDTripThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "LVD Trip threshold. If voltage exceeds threshold, the LVD will trip. + + Values are represented in thousandths of Volts (mV). + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigLVDEntry 4 } + +dm3ConfigLVDResetThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "LVD Reset threshold. If voltage exceeds threshold, the LVD will reset. + + Values are represented in thousandths of Volts (mV). + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigLVDEntry 5 } + +dm3ConfigLVDOpenAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the LVD Open Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + ::= { dm3ConfigLVDEntry 6 } + +dm3ConfigLVDHWAlarm OBJECT-TYPE +SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the LVD Hardware Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + ::= { dm3ConfigLVDEntry 7 } + + +-- the dm3ConfigBattery group + +dm3ConfigBattFloatVolt OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Battery Float Voltage. This setting controls the power plant voltage. + + Values are represented in thousandths of Volts (mV). + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigBattery 1 } + +dm3ConfigBattMaxRecharge OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Battery Maximum Recharge Rate. This setting controls the battery max + recharge rate. The value is based on C/20 for 240 AHr battery string. + + Values are represented in thousandths of Amps (mA). + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigBattery 2 } + +dm3ConfigBattDischargeThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Battery discharge threshold. If battery output current exceeds threshold + a battery discharge alarm will occur. + + Values are represented in thousandths of Amps (mA). + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigBattery 3 } + +dm3ConfigBattDischargeAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Battery Discharge Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigBattery 4 } + +dm3ConfigBattHighVoltThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Battery high voltage threshold. If system battery voltage exceeds threshold + a battery high voltage alarm will occur. + + Values are represented in thousandths of Volts (mV). + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigBattery 5 } + +dm3ConfigBattHighVoltAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Battery High Voltage Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigBattery 6 } + +dm3ConfigBattLowVoltThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Battery low voltage threshold. If system battery voltage is under threshold + a battery low voltage alarm will occur. + + Values are represented in thousandths of Volts (mV). + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigBattery 7 } + +dm3ConfigBattLowVoltAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Battery Low Voltage Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigBattery 8 } + +dm3ConfigBattHighTempThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Battery high temperature threshold. If system battery temperature exceeds threshold + a battery high temperature alarm will occur. + + Values are represented in thousandths of a degree. + Units are displayed in the scale shown in + the 'dm3StatusSysTempUnits' OID (Celsius or Fahrenheit). + + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + + ::= { dm3ConfigBattery 9 } + +dm3ConfigBattHighTempAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Battery High Temperature Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigBattery 10 } + +dm3ConfigBattLowTempThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Battery low temperature threshold. If system battery temperature is under threshold + a battery low temperature alarm will occur. + + Values are represented in thousandths of a degree. + Units are displayed in the scale shown in + the 'dm3StatusSysTempUnits' OID (Celsius or Fahrenheit). + + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + + ::= { dm3ConfigBattery 11 } + +dm3ConfigBattLowTempAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Battery Low Temperature Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigBattery 12 } + +dm3ConfigBattAmpHour OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Battery Amp-Hour Size. Units are thousandths of Amp hours (mAHr). + + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigBattery 13 } + +dm3ConfigCompMethod OBJECT-TYPE + SYNTAX INTEGER { + tempcompOn (1), + tempcompOff (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This OID is used to configure and get the state of the battery + temperature compensation. + + Setting this OID to tempcompOn (1) will enable/turn on the battery temperature compensation. + Setting this OID to tempcompOff (2) will disable/turn off the battery temperature compensation." + ::= { dm3ConfigBattery 14 } + +dm3ConfigCompTempCoeff OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Compensation Temperature Coefficient. (uV/degC/cell). + + Units are presented in microvolts. + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigBattery 15 } + +dm3ConfigHighKneeTemp OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "High Knee for temperature compensation: Compensation temperature coefficient + becomes 0mV/degC/cell. + + Values are represented in thousandths of degrees Celcius. + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigBattery 16 } + +dm3ConfigLowKneeTemp OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Low Knee for temperature compensation: Compensation temperature coefficient + becomes 0mV/degC/cell. + + Values are represented in thousandths of degrees Celcius. + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigBattery 17 } + +dm3ConfigBattHwCurrentAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Battery Current Hardware Alarm (indicating current is outside realistic + limits, or a possible measurement fault; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigBattery 18 } + +dm3ConfigBattHwTempAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Battery Temperature Hardware Alarm (indicating temperature is outside realistic + limits, or a possible measurement fault; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigBattery 19 } + + +-- the dm3ConfigRectThresh group +dm3ConfigRectHighVoltThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Rectifier high voltage threshold. If rectifier voltage exceeds threshold + a rectifier high voltage alarm will occur. + + Values are represented in thousandths of Volts (mV). + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigRectThresh 1 } + + +dm3ConfigRectLowVoltThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Rectifier low voltage threshold. If rectifier voltage is under threshold + a rectifier low voltage alarm will occur. + + Values are represented in thousandths of Volts (mV). + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigRectThresh 2 } + +dm3ConfigRectFailSafe OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Rectifier Fail Safe point. This OID represents the value sent to rectifier controllers + to use in the event of communications loss with the Master Controller or Master Controller + board failure. + + Values are represented in thousandths of Volts (mV). + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigRectThresh 3 } + +dm3ConfigRectFailComm OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Rectifier Communication Fail timeout. This OID represents the time interval in which there is no + communication between the rectifier and the master controller at which the rectifier will reset + all its values to default. + + Values are represented in hundredths of Seconds. + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigRectThresh 4 } + +-- the dm3ConfigRectAlarms group + +dm3ConfigRectHighVoltAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Rectifier High Voltage Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigRectAlarms 1 } + +dm3ConfigRectLowVoltAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Rectifier Low Voltage Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigRectAlarms 2 } + +dm3ConfigRectConfigAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This alarm is activated when a new rectifier is detected; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigRectAlarms 3 } + +dm3ConfigRect1ofNAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This setting indicates the action if ONE rectifier of a N+1 system has failed; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigRectAlarms 4 } + +dm3ConfigRect2ofNAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This setting indicates the action if TWO OR MORE rectifiers of a N+1 system have failed; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigRectAlarms 5 } + +dm3ConfigRectDiagAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9), + alarmNofN (10) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Rectifier Controller Diagnostics Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition. + Setting this OID to alarmNofN (10) causes the alarm specified in the dm3ConfigRect1ofNAlarm OID + to be activated if ONE rectifier fails in an N+1 system. It causes the alarm specified in the + dm3ConfigRect2ofNAlarm OID to be activated if TWO OR MORE rectifiers fail in an N+1 system." + + ::= { dm3ConfigRectAlarms 6 } + +dm3ConfigRectImbalanceAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Rectifier Imbalance Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigRectAlarms 7 } + +dm3ConfigRectCurrLimitAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9), + alarmNofN (10) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Rectifier Current Limit Alarm (indicating rectifier in the Current Limit state); + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition. + Setting this OID to alarmNofN (10) causes the alarm specified in the dm3ConfigRect1ofNAlarm OID + to be activated if ONE rectifier fails in an N+1 system. It causes the alarm specified in the + dm3ConfigRect2ofNAlarm OID to be activated if TWO OR MORE rectifiers fail in an N+1 system." + + ::= { dm3ConfigRectAlarms 8 } + +dm3ConfigRectStandbyAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9), + alarmNofN (10) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Rectifier Standby Alarm (indicating output DC has been turned off); + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition. + Setting this OID to alarmNofN (10) causes the alarm specified in the dm3ConfigRect1ofNAlarm OID + to be activated if ONE rectifier fails in an N+1 system. It causes the alarm specified in the + dm3ConfigRect2ofNAlarm OID to be activated if TWO OR MORE rectifiers fail in an N+1 system." + + ::= { dm3ConfigRectAlarms 9 } + +dm3ConfigRectFanFailAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9), + alarmNofN (10) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Rectifier Fan Fail Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition. + Setting this OID to alarmNofN (10) causes the alarm specified in the dm3ConfigRect1ofNAlarm OID + to be activated if ONE rectifier fails in an N+1 system. It causes the alarm specified in the + dm3ConfigRect2ofNAlarm OID to be activated if TWO OR MORE rectifiers fail in an N+1 system." + + ::= { dm3ConfigRectAlarms 10 } + +dm3ConfigRectFailAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9), + alarmNofN (10) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Rectifier Fail Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition. + Setting this OID to alarmNofN (10) causes the alarm specified in the dm3ConfigRect1ofNAlarm OID + to be activated if ONE rectifier fails in an N+1 system. It causes the alarm specified in the + dm3ConfigRect2ofNAlarm OID to be activated if TWO OR MORE rectifiers fail in an N+1 system." + + ::= { dm3ConfigRectAlarms 11 } + +dm3ConfigRectHwVoltAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Rectifier Hardware Voltage Alarm (indicating voltage outside realistic limits, + or a possible measurement fault); + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigRectAlarms 12 } + + +-- the dm3ConfigConvThresh group + +dm3ConfigConvHighVoltThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Converter high voltage threshold. If converter voltage exceeds threshold + a converter high voltage alarm will occur. + + Values are represented in thousandths of Volts (mV). + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + + ::= { dm3ConfigConvThresh 1 } + +dm3ConfigConvLowVoltThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Converter low voltage threshold. If converter voltage exceeds threshold + a converter low voltage alarm will occur. + + Values are represented in thousandths of Volts (mV). + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigConvThresh 2 } + +dm3ConfigConvFailSafe OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Converter Fail Safe point. This OID represents the value sent to converter controllers + to use in the event of communications loss with the Master Controller or Master Controller + board failure. + + Values are represented in thousandths of Volts (mV). + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigConvThresh 3 } + +dm3ConfigConvSetPoint OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Converter Set point. This OID represents the initial set point used in the + voltage control loop. + + Units are thousandths of Volts (mV). + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigConvThresh 4 } + +dm3ConfigConvFailMax OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Converter Fail Maximum limit. This OID represents the value sent to the converter + controllers to define the maximum set point allowed. + + Units are thousandths of Volts (mV). + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigConvThresh 5 } + +dm3ConfigConvFailMin OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Converter Fail Minimum limit. This OID represents the value sent to the converter + controllers to define the minimum set point allowed. + + Units are thousandths of Volts (mV). + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigConvThresh 6 } + +dm3ConfigConvFailComm OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Converter Communication Fail timeout. This OID represents the time interval in which there is no + communication between the converter and the master controller at which the converter will reset + all its values to default. + + Values are represented in hundredths of Seconds. + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigConvThresh 7 } + +-- the dm3ConfigConvAlarms group +dm3ConfigConvHighVoltAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Converter High Voltage Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigConvAlarms 1 } + +dm3ConfigConvLowVoltAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Converter Low Voltage Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigConvAlarms 2 } + +dm3ConfigConvConfigAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Converter Configuration Alarm (indicating a new converter has been detected); + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigConvAlarms 3 } + +dm3ConfigConv1ofNAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Converter 1ofN Alarm (indicating action if ONE converter of a N+1 system has failed); + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigConvAlarms 4 } + +dm3ConfigConv2ofNAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Converter 2ofN Alarm (indicating action if TWO OR MORE converters of a N+1 system has failed); + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigConvAlarms 5 } + +dm3ConfigConvDiagAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9), + alarmNofN (10) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Converter Diagnostics Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition. + Setting this OID to alarmNofN (10) causes the alarm specified in the dm3ConfigConv1ofNAlarm OID + to be activated if ONE converter fails in an N+1 system. It causes the alarm specified in the + dm3ConfigConv2ofNAlarm OID to be activated if TWO OR MORE converters fail in an N+1 system." + + ::= { dm3ConfigConvAlarms 6 } + +dm3ConfigConvImbalanceAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9), + alarmNofN (10) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Converter Imbalance Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition. + Setting this OID to alarmNofN (10) causes the alarm specified in the dm3ConfigConv1ofNAlarm OID + to be activated if ONE converter fails in an N+1 system. It causes the alarm specified in the + dm3ConfigConv2ofNAlarm OID to be activated if TWO OR MORE converters fail in an N+1 system." + + ::= { dm3ConfigConvAlarms 7 } + +dm3ConfigConvCurrLimitAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9), + alarmNofN (10) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Converter Current Limit Alarm (indicating the converter is in the Current Limit state); + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition. + Setting this OID to alarmNofN (10) causes the alarm specified in the dm3ConfigConv1ofNAlarm OID + to be activated if ONE converter fails in an N+1 system. It causes the alarm specified in the + dm3ConfigConv2ofNAlarm OID to be activated if TWO OR MORE converters fail in an N+1 system." + + ::= { dm3ConfigConvAlarms 8 } + +dm3ConfigConvStandbyAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9), + alarmNofN (10) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Converter Standby Alarm (indicating the converter is in the Standby state); + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition. + Setting this OID to alarmNofN (10) causes the alarm specified in the dm3ConfigConv1ofNAlarm OID + to be activated if ONE converter fails in an N+1 system. It causes the alarm specified in the + dm3ConfigConv2ofNAlarm OID to be activated if TWO OR MORE converters fail in an N+1 system." + + ::= { dm3ConfigConvAlarms 9 } + +dm3ConfigConvFanFailAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9), + alarmNofN (10) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Converter Fan Fail Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition. + Setting this OID to alarmNofN (10) causes the alarm specified in the dm3ConfigConv1ofNAlarm OID + to be activated if ONE converter fails in an N+1 system. It causes the alarm specified in the + dm3ConfigConv2ofNAlarm OID to be activated if TWO OR MORE converters fail in an N+1 system." + + ::= { dm3ConfigConvAlarms 10 } + +dm3ConfigConvFailAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9), + alarmNofN (10) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Converter Fail Alarm; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition. + Setting this OID to alarmNofN (10) causes the alarm specified in the dm3ConfigConv1ofNAlarm OID + to be activated if ONE converter fails in an N+1 system. It causes the alarm specified in the + dm3ConfigConv2ofNAlarm OID to be activated if TWO OR MORE converters fail in an N+1 system." + + ::= { dm3ConfigConvAlarms 11 } + +dm3ConfigConvHwVoltAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9), + alarmNofN (10) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "For the Converter Voltage Alarm (indicating voltage outside realistic limits, or a + possible measurement fault); + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition. + Setting this OID to alarmNofN (10) causes the alarm specified in the dm3ConfigConv1ofNAlarm OID + to be activated if ONE converter fails in an N+1 system. It causes the alarm specified in the + dm3ConfigConv2ofNAlarm OID to be activated if TWO OR MORE converters fail in an N+1 system." + + ::= { dm3ConfigConvAlarms 12 } + + +-- the dm3ConfigOutputRelays group + +dm3ConfigOutRlyTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of DC powerplant Output Relays controllable + by this IP address." + ::= { dm3ConfigOutputRelays 1 } + +dm3ConfigOutRlyTable OBJECT-TYPE + SYNTAX SEQUENCE OF ConfigOutRlyEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for accessing settings of the Output Relays. The number of + entries is contained in the dm3ConfigOutRlyTableSize OID." + ::= { dm3ConfigOutputRelays 2 } + +dm3ConfigOutRlyEntry OBJECT-TYPE + SYNTAX ConfigOutRlyEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The output relay to configure." + INDEX { dm3ConfigOutRlyIndex } + ::= { dm3ConfigOutRlyTable 1 } + +ConfigOutRlyEntry ::= + SEQUENCE { + dm3ConfigOutRlyIndex INTEGER, + dm3ConfigOutRlyName DisplayString, + dm3ConfigOutRlyDelay INTEGER, + dm3ConfigOutRlyAlarm INTEGER + } + +dm3ConfigOutRlyIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the DC powerplant output relay." + ::= { dm3ConfigOutRlyEntry 1 } + +dm3ConfigOutRlyName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the output relay. The maximum value is 16 characters." + ::= { dm3ConfigOutRlyEntry 2 } + +dm3ConfigOutRlyDelay OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Output Relay Delay. This OID represents the time delay from the initiation of an + output relay action to when the output relay action does occur. If the alarm condition + disappears before the end of the delay, no action will occur. Delay for Major + and Minor alarms is not configurable and is always set to 0. + + Values are represented in hundredths of seconds. + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigOutRlyEntry 3 } + +dm3ConfigOutRlyAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Output Relay Alarm. This setting indicates what action to perform in the event of + an output relay alarm condition; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition. + + Relay Alarm for Major and Minor alarms is not configurable and is always set to + alarmMajor and alarmMinor respectively." + + ::= { dm3ConfigOutRlyEntry 4 } + + +-- the dm3ConfigInputRelays group + +dm3ConfigInRlyTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of DC powerplant Input Relays controllable + by this IP address." + ::= { dm3ConfigInputRelays 1 } + +dm3ConfigInRlyTable OBJECT-TYPE + SYNTAX SEQUENCE OF ConfigInRlyEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for accessing settings of the Input Relays. The number of + entries is contained in the dm3ConfigInRlyTableSize OID." + ::= { dm3ConfigInputRelays 2 } + +dm3ConfigInRlyEntry OBJECT-TYPE + SYNTAX ConfigInRlyEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The input relay to configure." + INDEX { dm3ConfigInRlyIndex } + ::= { dm3ConfigInRlyTable 1 } + +ConfigInRlyEntry ::= + SEQUENCE { + dm3ConfigInRlyIndex INTEGER, + dm3ConfigInRlyName DisplayString, + dm3ConfigInRlyDelay INTEGER, + dm3ConfigInRlyAlarm INTEGER + } + +dm3ConfigInRlyIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the DC powerplant input relay." + ::= { dm3ConfigInRlyEntry 1 } + +dm3ConfigInRlyName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the input relay. The maximum value is 16 characters." + + ::= { dm3ConfigInRlyEntry 2 } + +dm3ConfigInRlyDelay OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Input Relay Delay. This OID represents the time delay from the initiation of an + input relay action to when the input relay action does occur. If the alarm condition + disappears before the end of the delay, no action will occur. + + Values are represented in hundredths of seconds. + + Attempts to set the value above or below the acceptable range of the powerplant + will cause the value to be set at the high or low point of the range respectively." + ::= { dm3ConfigInRlyEntry 3 } + +dm3ConfigInRlyAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Input Relay Alarm. This setting indicates what action to perform in the event of + an input relay alarm condition; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigInRlyEntry 4 } + +-- the dm3ConfigBreakers group + +dm3ConfigBreakersTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of DC powerplant circuit breakers controllable + by this IP address." + ::= { dm3ConfigBreakers 1 } + +dm3ConfigBreakersTable OBJECT-TYPE + SYNTAX SEQUENCE OF ConfigBreakersEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for accessing settings of the circuit breakers. The number of + entries is contained in the dm3ConfigBreakersTableSize OID." + ::= { dm3ConfigBreakers 2 } + +dm3ConfigBreakersEntry OBJECT-TYPE + SYNTAX ConfigBreakersEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The circuit breaker to configure." + INDEX { dm3ConfigBreakersIndex } + ::= { dm3ConfigBreakersTable 1 } + +ConfigBreakersEntry ::= + SEQUENCE { + dm3ConfigBreakersIndex INTEGER, + dm3ConfigBreakersName DisplayString, + dm3ConfigBreakersAlarm INTEGER + } + +dm3ConfigBreakersIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the DC powerplant circuit breaker." + ::= { dm3ConfigBreakersEntry 1 } + +dm3ConfigBreakersName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the circuit breaker. The maximum value is 16 characters." + ::= { dm3ConfigBreakersEntry 2 } + +dm3ConfigBreakersAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Circuit Breaker Alarm. This setting indicates what action to perform in the event of + a circuit breaker alarm condition; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigBreakersEntry 3 } + +-- the dm3ConfigFuses group + +dm3ConfigFusesTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of DC powerplant Fuses controllable + by this IP address." + ::= { dm3ConfigFuses 1 } + +dm3ConfigFusesTable OBJECT-TYPE + SYNTAX SEQUENCE OF ConfigFusesEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for accessing settings of the Fuses. The number of + entries is contained in the dm3ConfigFusesTableSize OID." + ::= { dm3ConfigFuses 2 } + +dm3ConfigFusesEntry OBJECT-TYPE + SYNTAX ConfigFusesEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The fuse to configure." + INDEX { dm3ConfigFusesIndex } + ::= { dm3ConfigFusesTable 1 } + +ConfigFusesEntry ::= + SEQUENCE { + dm3ConfigFusesIndex INTEGER, + dm3ConfigFusesName DisplayString, + dm3ConfigFusesAlarm INTEGER + } + +dm3ConfigFusesIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the DC powerplant fuse." + ::= { dm3ConfigFusesEntry 1 } + +dm3ConfigFusesName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the fuse. The maximum value is 16 characters." + ::= { dm3ConfigFusesEntry 2 } + +dm3ConfigFusesAlarm OBJECT-TYPE + SYNTAX INTEGER { + alarmIgnore (1), + alarmRelay1 (2), + alarmRelay2 (3), + alarmRelay3 (4), + alarmRelay4 (5), + alarmRelay5 (6), + alarmRelay6 (7), + alarmMinor (8), + alarmMajor (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Fuses Alarm. This setting indicates what action to perform in the event of + a Fuse alarm condition; + Setting this OID to alarmIgnore (1) results in the alarm condition being ignored. + Setting this OID to alarmRelay1 (2) causes relay 1 to be activated for an + alarm condition. + Setting this OID to alarmRelay2 (3) causes relay 2 to be activated for an + alarm condition. + Setting this OID to alarmRelay3 (4) causes relay 3 to be activated for an + alarm condition. + Setting this OID to alarmRelay4 (5) causes relay 4 to be activated for an + alarm condition. + Setting this OID to alarmRelay5 (6) causes relay 5 to be activated for an + alarm condition. + Setting this OID to alarmRelay6 (7) causes relay 6 to be activated for an + alarm condition. + Setting this OID to alarmMinor (8) causes the Minor relay to be activated for an + alarm condition. + Setting this OID to alarmMajor (9) causes the Major relay to be activated for an + alarm condition." + + ::= { dm3ConfigFusesEntry 3 } + +-- the dm3StatusSystem group + +dm3StatusSystemTemp OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "System temperature based on sensor on Master Controller PCB. + + Values are represented in thousandths of a degree. + Units are displayed in the scale shown in + the 'dm3StatusSysTempUnits' OID (Celsius or Fahrenheit)." + + ::= { dm3StatusSystem 1 } + +dm3StatusSystemStart OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Time stamp at DC powerplant initialization. + The time is represented as MMM,DD,YYYY,HH:MM:SS." + ::= { dm3StatusSystem 2 } + +dm3StatusSysRemoteAccess OBJECT-TYPE + SYNTAX INTEGER { + accessEnabled (1), + accessDisabled (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Remote Access indicator + This setting indicates if configuration (write) access to the powerplant is enabled or + disabled at the powerplant level. + This value will be accessEnabled (1) if remote configuration is enabled, and + accessDisabled (2) if remote configuration is disabled." + ::= { dm3StatusSystem 3 } + +dm3StatusSysSecurityLevel OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This variable shows the current active security access level of controller. This + can only be changed directly from the front panel." + ::= { dm3StatusSystem 4 } + +dm3StatusSysTempSanity OBJECT-TYPE + SYNTAX INTEGER{ + saneYES (1), + saneNO (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "System temperature sanity indicator. Indicates if the system temperature is + reasonable. Reasonable is defined based on powerplant type. A value of saneYes (1) + indicates temperature is reasonable, a value of saneNo (2) indicates it is not." + ::= { dm3StatusSystem 5 } + +dm3StatusSysAlarmState OBJECT-TYPE + SYNTAX INTEGER{ + alarmMinor (1), + alarmMajor (2), + alarmBoth (3), + alarmNone (4) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "System Alarm State. Reflects the alarm status of the overall DC system. + If a minor alarm is present, the value will be alarmMinor(1). + If a major alarm is present, the value will be alarmMajor(2). + If both minor and a major alarm is present, the value will be alarmBoth(3). + If no alarm is present, the value will be alarmNone(4)." + ::= { dm3StatusSystem 6 } + +dm3StatusSysTempUnits OBJECT-TYPE + SYNTAX INTEGER { + celsius(1), + fahrenheit(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The temperature scale used to display the temperature + in the DC system, Celsius(1) or Fahrenheit(2). + This setting is based on the system preferences + configuration in the agent." + ::= { dm3StatusSystem 7 } + + +-- the dm3StatusAlarms group + +dm3StatusAlarmsTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of DC powerplant alarms viewable + by this IP address." + ::= { dm3StatusAlarms 1 } + +dm3StatusAlarmsTable OBJECT-TYPE + SYNTAX SEQUENCE OF StatusAlarmsEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for accessing system alarms. The number of + entries is contained in the dm3StatusAlarmsTableSize OID." + ::= { dm3StatusAlarms 2 } + +dm3StatusAlarmsEntry OBJECT-TYPE + SYNTAX StatusAlarmsEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The alarm to display." + INDEX { dm3StatusAlarmsIndex } + ::= { dm3StatusAlarmsTable 1 } + +StatusAlarmsEntry ::= + SEQUENCE { + dm3StatusAlarmsIndex INTEGER, + dm3StatusAlarmsText DisplayString + } + +dm3StatusAlarmsIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of the system alarm." + ::= { dm3StatusAlarmsEntry 1 } + +dm3StatusAlarmsText OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The 16 character text describing the active alarm condition." + ::= { dm3StatusAlarmsEntry 2 } + +-- the dm3StatusBattery group + +dm3StatusBattCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Battery Current: This OID shows the battery current in thousandths of Amps (mA)." + ::= { dm3StatusBattery 1 } + +dm3StatusBattTemp OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Battery Temperature: + + Values are represented in thousandths of a degree. + Units are displayed in the scale shown in + the 'dm3StatusSysTempUnits' OID (Celsius or Fahrenheit)." + + ::= { dm3StatusBattery 2 } + +dm3StatusBattCurrentSanity OBJECT-TYPE + SYNTAX INTEGER{ + saneYES (1), + saneNO (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Battery current sanity indicator. Indicates if the battery current is + reasonable. Reasonable is defined based on powerplant type. A value of saneYes (1) + indicates current is reasonable, a value of saneNo (2) indicates it is not." + ::= { dm3StatusBattery 3 } + +dm3StatusBattTempSanity OBJECT-TYPE + SYNTAX INTEGER{ + saneYES (1), + saneNO (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Battery temperature sanity indicator. Indicates if the battery temperature is + reasonable. Reasonable is defined based on powerplant type. A value of saneYes (1) + indicates temperature is reasonable, a value of saneNo (2) indicates it is not." + ::= { dm3StatusBattery 4 } + +-- the dm3StatusOEM group + +dm3StatusOEMrectOffset OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the rectifier offset value in thousandths of Volts (mV)." + ::= { dm3StatusOEM 1 } + +dm3StatusOEMrectGain OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the rectifier gain value in thousandths of Volts (mV/V)." + ::= { dm3StatusOEM 2 } + +dm3StatusOEMconvOffset OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the converter offset value in thousandths of Volts (mV)." + ::= { dm3StatusOEM 3 } + +dm3StatusOEMconvGain OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the converter gain value in thousandths of Volts (mV/V)." + ::= { dm3StatusOEM 4 } + +dm3StatusOEMshuntOffset OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the shunt offset value in thousandths of Amps (mA)." + ::= { dm3StatusOEM 5 } + +dm3StatusOEMshuntGain OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the shunt gain value in thousandths of Amps (mA/A)." + ::= { dm3StatusOEM 6 } + +-- the dm3StatusLVD group + +dm3StatusLVDTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of DC powerplant LVDs viewable + by this IP address." + ::= { dm3StatusLVD 1 } + +dm3StatusLVDTable OBJECT-TYPE + SYNTAX SEQUENCE OF StatusLVDEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for accessing settings of the LVDs. The number of + entries is contained in the dm3StatusLVDTableSize OID." + ::= { dm3StatusLVD 2 } + +dm3StatusLVDEntry OBJECT-TYPE + SYNTAX StatusLVDEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The LVD to gather status from." + INDEX { dm3StatusLVDIndex } + ::= { dm3StatusLVDTable 1 } + +StatusLVDEntry ::= + SEQUENCE { + dm3StatusLVDIndex INTEGER, + dm3StatusLVDName DisplayString, + dm3StatusLVDState INTEGER, + dm3StatusLVDHwFault INTEGER + } + +dm3StatusLVDIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the DC powerplant LVD." + ::= { dm3StatusLVDEntry 1 } + +dm3StatusLVDName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the LVD. The maximum size is + 16 characters. The name is set by using the + dm3ConfigLVDName OID. + This OID is provided for informational purposes only." + ::= { dm3StatusLVDEntry 2 } + +dm3StatusLVDState OBJECT-TYPE + SYNTAX INTEGER { + statusClosed (1), + statusOpened (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusClosed (1) if the LVD is closed. + statusOpened (2) will be returned if the LVD is opened." + ::= { dm3StatusLVDEntry 3 } + +dm3StatusLVDHwFault OBJECT-TYPE + SYNTAX INTEGER { + statusFault (1), + statusNofault (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusFault (1) if the LVD is faulted. + statusNofault (2) will be returned if the LVD is not faulted." + ::= { dm3StatusLVDEntry 4 } + +-- the dm3StatusRectifier group + +dm3StatusRectTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of DC powerplant rectifiers viewable + by this IP address." + ::= { dm3StatusRectifier 1 } + +dm3StatusRectTable OBJECT-TYPE + SYNTAX SEQUENCE OF StatusRectEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for accessing settings of the rectifiers. The number of + entries is contained in the dm3StatusRectTableSize OID." + ::= { dm3StatusRectifier 2 } + +dm3StatusRectEntry OBJECT-TYPE + SYNTAX StatusRectEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The rectifier to gather status from." + INDEX { dm3StatusRectIndex } + ::= { dm3StatusRectTable 1 } + +StatusRectEntry ::= + SEQUENCE { + dm3StatusRectIndex INTEGER, + dm3StatusRectID INTEGER, + dm3StatusRectDesc DisplayString, + dm3StatusRectCurrent INTEGER, + dm3StatusRectCurrentLimit INTEGER, + dm3StatusRectStandby INTEGER, + dm3StatusRectFanFail INTEGER, + dm3StatusRectFail INTEGER, + dm3StatusRectDevType INTEGER, + dm3StatusRectPhyAddr INTEGER, + dm3StatusRectCfg INTEGER, + dm3StatusRectPcbRev INTEGER, + dm3StatusRectFwVer INTEGER, + dm3StatusRectPresent INTEGER, + dm3StatusRectDiagPass INTEGER, + dm3StatusRectState INTEGER + } + +dm3StatusRectIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the DC powerplant rectifier." + ::= { dm3StatusRectEntry 1 } + +dm3StatusRectID OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the rectifier ID. This enumerates the number of the rectifier within + a group of rectifiers." + ::= { dm3StatusRectEntry 2 } + +dm3StatusRectDesc OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the 16-character rectifier description." + ::= { dm3StatusRectEntry 3 } + +dm3StatusRectCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the rectifier current in thousandths of Amps (mA)." + ::= { dm3StatusRectEntry 4 } + +dm3StatusRectCurrentLimit OBJECT-TYPE + SYNTAX INTEGER { + statusTrue (1), + statusFalse (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusTrue (1) if the rectifier is in the Current Limit state. + statusFalse (2) will be returned if the rectifier is not in the Current Limit state." + ::= { dm3StatusRectEntry 5 } + +dm3StatusRectStandby OBJECT-TYPE + SYNTAX INTEGER { + statusTrue (1), + statusFalse (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusTrue (1) if the rectifier is in the Standby state. + statusFalse (2) will be returned if the rectifier is not in the Standby state." + ::= { dm3StatusRectEntry 6 } + +dm3StatusRectFanFail OBJECT-TYPE + SYNTAX INTEGER { + statusTrue (1), + statusFalse (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusTrue (1) if the rectifier Fan has failed. + statusFalse (2) will be returned if the rectifier Fan has not failed." + ::= { dm3StatusRectEntry 7 } + +dm3StatusRectFail OBJECT-TYPE + SYNTAX INTEGER { + statusTrue (1), + statusFalse (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusTrue (1) if the rectifier has failed. + statusFalse (2) will be returned if the rectifier has not failed." + ::= { dm3StatusRectEntry 8 } + +dm3StatusRectDevType OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the rectifier device type." + ::= { dm3StatusRectEntry 9 } + +dm3StatusRectPhyAddr OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the rectifier physical address (the address on the bus)." + ::= { dm3StatusRectEntry 10 } + +dm3StatusRectCfg OBJECT-TYPE + SYNTAX INTEGER { + statusTrue (1), + statusFalse (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusTrue (1) if the rectifier is present after + power-up or set-configuration. + statusFalse (2) will be returned if the rectifier is not configured." + ::= { dm3StatusRectEntry 11 } + +dm3StatusRectPcbRev OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the rectifier device PCB serial number." + ::= { dm3StatusRectEntry 12 } + +dm3StatusRectFwVer OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the rectifier device firmware revision." + ::= { dm3StatusRectEntry 13 } + +dm3StatusRectPresent OBJECT-TYPE + SYNTAX INTEGER { + statusTrue (1), + statusFalse (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusTrue (1) if the rectifier is present. + statusFalse (2) will be returned if the rectifier is not present." + ::= { dm3StatusRectEntry 14 } + +dm3StatusRectDiagPass OBJECT-TYPE + SYNTAX INTEGER { + statusTrue (1), + statusFalse (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusTrue (1) if the rectifier diagnostics have passed. + statusFalse (2) will be returned if the rectifier diagnostics have not passed." + ::= { dm3StatusRectEntry 15 } + +dm3StatusRectState OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the rectifier device state as defined by the device status register." + ::= { dm3StatusRectEntry 16 } + +dm3StatusSysRectVoltSanity OBJECT-TYPE + SYNTAX INTEGER { + saneYES (1), + saneNO (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Rectifier voltage sanity indicator. Indicates if the rectifier voltage is + reasonable. Reasonable is defined based on powerplant type. A value of saneYes (1) + indicates voltage is reasonable, a value of saneNo (2) indicates it is not." + ::= { dm3StatusRectifier 3 } + +dm3StatusSysRectAvailable OBJECT-TYPE + SYNTAX INTEGER { + statusTrue (1), + statusFalse (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusTrue (1) if the rectifier is available. + statusFalse (2) will be returned if the rectifier is not available." + ::= { dm3StatusRectifier 4 } + +dm3StatusSysRectType OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the type of rectifier the system has. There can only be a single type of + rectifier in the power plant" + ::= { dm3StatusRectifier 5 } + +dm3StatusSysRectVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the system level rectifier voltage in thousandths of Volts (mV)." + ::= { dm3StatusRectifier 6 } + +dm3StatusSysRectCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the system level rectifier current in thousandths of Amps (mA)." + ::= { dm3StatusRectifier 7 } + + +-- the dm3StatusConverter group + +dm3StatusConvTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of DC powerplant converters viewable + by this IP address." + ::= { dm3StatusConverter 1 } + +dm3StatusConvTable OBJECT-TYPE + SYNTAX SEQUENCE OF StatusConvEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for viewing status of the converters. The number of + entries is contained in the dm3StatusConvTableSize OID." + ::= { dm3StatusConverter 2 } + +dm3StatusConvEntry OBJECT-TYPE + SYNTAX StatusConvEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The converter to gather status from." + INDEX { dm3StatusConvIndex } + ::= { dm3StatusConvTable 1 } + +StatusConvEntry ::= + SEQUENCE { + dm3StatusConvIndex INTEGER, + dm3StatusConvID INTEGER, + dm3StatusConvDesc DisplayString, + dm3StatusConvCurrent INTEGER, + dm3StatusConvCurrentLimit INTEGER, + dm3StatusConvStandby INTEGER, + dm3StatusConvFanFail INTEGER, + dm3StatusConvFail INTEGER, + dm3StatusConvDevType INTEGER, + dm3StatusConvPhyAddr INTEGER, + dm3StatusConvCfg INTEGER, + dm3StatusConvPcbRev INTEGER, + dm3StatusConvFwVer INTEGER, + dm3StatusConvPresent INTEGER, + dm3StatusConvDiagPass INTEGER, + dm3StatusConvState INTEGER + } + +dm3StatusConvIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the DC powerplant converter." + ::= { dm3StatusConvEntry 1 } + +dm3StatusConvID OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the converter ID. This enumerates the number of the converter within + a group of converters." + ::= { dm3StatusConvEntry 2 } + +dm3StatusConvDesc OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the 16 character converter description." + ::= { dm3StatusConvEntry 3 } + +dm3StatusConvCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the converter current in thousandths of Amps (mA)." + ::= { dm3StatusConvEntry 4 } + +dm3StatusConvCurrentLimit OBJECT-TYPE + SYNTAX INTEGER { + statusTrue (1), + statusFalse (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusTrue (1) if the converter is in the Current Limit state. + statusFalse (2) will be returned if the converter is not in the Current Limit state." + ::= { dm3StatusConvEntry 5 } + +dm3StatusConvStandby OBJECT-TYPE + SYNTAX INTEGER { + statusTrue (1), + statusFalse (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusTrue (1) if the converter is in the Standby state. + statusFalse (2) will be returned if the converter is not in the Standby state." + ::= { dm3StatusConvEntry 6 } + +dm3StatusConvFanFail OBJECT-TYPE + SYNTAX INTEGER { + statusTrue (1), + statusFalse (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusTrue (1) if the converter Fan has failed. + statusFalse (2) will be returned if the converter Fan has not failed." + ::= { dm3StatusConvEntry 7 } + +dm3StatusConvFail OBJECT-TYPE + SYNTAX INTEGER { + statusTrue (1), + statusFalse (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusTrue (1) if the converter has failed. + statusFalse (2) will be returned if the converter has not failed." + ::= { dm3StatusConvEntry 8 } + +dm3StatusConvDevType OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the converter device type." + ::= { dm3StatusConvEntry 9 } + +dm3StatusConvPhyAddr OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the converter physical address (the address on the bus)." + ::= { dm3StatusConvEntry 10 } + +dm3StatusConvCfg OBJECT-TYPE + SYNTAX INTEGER { + statusTrue (1), + statusFalse (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusTrue (1) if the converter is present after + power-up or set-configuration. + statusFalse (2) will be returned if the converter is not configured." + ::= { dm3StatusConvEntry 11 } + +dm3StatusConvPcbRev OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the converter device PCB serial number." + ::= { dm3StatusConvEntry 12 } + +dm3StatusConvFwVer OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the converter device firmware version." + ::= { dm3StatusConvEntry 13 } + +dm3StatusConvPresent OBJECT-TYPE + SYNTAX INTEGER { + statusTrue (1), + statusFalse (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusTrue (1) if the converter is present. + statusFalse (2) will be returned if the converter is not present." + ::= { dm3StatusConvEntry 14 } + +dm3StatusConvDiagPass OBJECT-TYPE + SYNTAX INTEGER { + statusTrue (1), + statusFalse (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusTrue (1) if the converter diagnostics have passed. + statusFalse (2) will be returned if the converter diagnostics have not passed." + ::= { dm3StatusConvEntry 15 } + +dm3StatusConvState OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the converter state as defined by the device status register." + ::= { dm3StatusConvEntry 16 } + +dm3StatusSysConvVoltSanity OBJECT-TYPE + SYNTAX INTEGER{ + saneYES (1), + saneNO (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Converter voltage sanity indicator. Indicates if the converter voltage is + reasonable. Reasonable is defined based on powerplant type. A value of saneYes (1) + indicates voltage is reasonable, a value of saneNo (2) indicates it is not." + ::= { dm3StatusConverter 3 } + +dm3StatusSysConvAvailable OBJECT-TYPE + SYNTAX INTEGER { + statusTrue (1), + statusFalse (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusTrue (1) if the converter is available. + statusFalse (2) will be returned if the converter is not available." + ::= { dm3StatusConverter 4 } + +dm3StatusSysConvType OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the converter type." + ::= { dm3StatusConverter 5 } + +dm3StatusSysConvVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the system level converter voltage in thousandths of volts (mV)." + ::= { dm3StatusConverter 6 } + +dm3StatusSysConvCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the system level converter current in thousandths of Amps (mA)." + ::= { dm3StatusConverter 7 } + +-- the dm3StatusOutputRelays group + +dm3StatusOutRlyTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of DC powerplant output relays viewable + by this IP address." + ::= { dm3StatusOutputRelays 1 } + +dm3StatusOutRlyTable OBJECT-TYPE + SYNTAX SEQUENCE OF StatusOutRlyEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for viewing status of the output relays. The number of + entries is contained in the dm3StatusOutRlyTableSize OID." + ::= { dm3StatusOutputRelays 2 } + +dm3StatusOutRlyEntry OBJECT-TYPE + SYNTAX StatusOutRlyEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The output relay to gather status from." + INDEX { dm3StatusOutRlyIndex } + ::= { dm3StatusOutRlyTable 1 } + +StatusOutRlyEntry ::= + SEQUENCE { + dm3StatusOutRlyIndex INTEGER, + dm3StatusOutRlyName DisplayString, + dm3StatusOutRlyStatus INTEGER + } + +dm3StatusOutRlyIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the DC powerplant output relay." + ::= { dm3StatusOutRlyEntry 1 } + +dm3StatusOutRlyName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the output relay. The maximum size is + 16 characters. The name is set by using the + dm3ConfigOutRlyName OID. + This OID is provided for informational purposes only." + ::= { dm3StatusOutRlyEntry 2 } + +dm3StatusOutRlyStatus OBJECT-TYPE + SYNTAX INTEGER { + statusOn (1), + statusOff (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusOn (1) if the output relay is enabled/on. + statusOff (2) will be returned if the output relay is disabled/off." + ::= { dm3StatusOutRlyEntry 3 } + + +-- the dm3StatusInputRelays group + +dm3StatusInRlyTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of DC powerplant input relays viewable + by this IP address." + ::= { dm3StatusInputRelays 1 } + +dm3StatusInRlyTable OBJECT-TYPE + SYNTAX SEQUENCE OF StatusInRlyEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for viewing status of the input relays. The number of + entries is contained in the dm3StatusInRlyTableSize OID." + ::= { dm3StatusInputRelays 2 } + + +dm3StatusInRlyEntry OBJECT-TYPE + SYNTAX StatusInRlyEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The input relays to gather status from." + INDEX { dm3StatusInRlyIndex } + ::= { dm3StatusInRlyTable 1 } + +StatusInRlyEntry ::= + SEQUENCE { + dm3StatusInRlyIndex INTEGER, + dm3StatusInRlyName DisplayString, + dm3StatusInRlyStatus INTEGER + } + +dm3StatusInRlyIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the DC powerplant input relay." + ::= { dm3StatusInRlyEntry 1 } + +dm3StatusInRlyName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the input relay. The maximum size is + 16 characters. The name is set by using the + dm3ConfigInRlyName OID. + This OID is provided for informational purposes only." + ::= { dm3StatusInRlyEntry 2 } + +dm3StatusInRlyStatus OBJECT-TYPE + SYNTAX INTEGER { + statusOn (1), + statusOff (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusOn (1) if the input relay is enabled/on. + statusOff (2) will be returned if the input relay is disabled/off." + ::= { dm3StatusInRlyEntry 3 } + +-- the dm3StatusBreakers group + +dm3StatusBreakersTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of DC powerplant circuit breakers viewable + by this IP address." + ::= { dm3StatusBreakers 1 } + +dm3StatusBreakersTable OBJECT-TYPE + SYNTAX SEQUENCE OF StatusBreakersEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for viewing status of the circuit breakers. The number of + entries is contained in the dm3StatusBreakersTableSize OID." + ::= { dm3StatusBreakers 2 } + +dm3StatusBreakersEntry OBJECT-TYPE + SYNTAX StatusBreakersEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The circuit breaker to gather status from." + INDEX { dm3StatusBreakersIndex } + ::= { dm3StatusBreakersTable 1 } + +StatusBreakersEntry ::= + SEQUENCE { + dm3StatusBreakersIndex INTEGER, + dm3StatusBreakersName DisplayString, + dm3StatusBreakersStatus INTEGER + } + +dm3StatusBreakersIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the DC powerplant circuit breaker." + ::= { dm3StatusBreakersEntry 1 } + +dm3StatusBreakersName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the circuit breaker. The maximum size is + 16 characters. The name is set by using the + dm3ConfigBreakersName OID. + This OID is provided for informational purposes only." + ::= { dm3StatusBreakersEntry 2 } + +dm3StatusBreakersStatus OBJECT-TYPE + SYNTAX INTEGER { + statusClosed (1), + statusOpen (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusClosed (1) if the circuit breaker is closed. + statusOpen (2) will be returned if the circuit breaker is open." + ::= { dm3StatusBreakersEntry 3 } + +-- the dm3StatusFuses group + +dm3StatusFusesTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of DC powerplant fuses controllable + by this IP address." + ::= { dm3StatusFuses 1 } + +dm3StatusFusesTable OBJECT-TYPE + SYNTAX SEQUENCE OF StatusFusesEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for viewing status of the fuses. The number of + entries is contained in the dm3StatusFusesTableSize OID." + ::= { dm3StatusFuses 2 } + +dm3StatusFusesEntry OBJECT-TYPE + SYNTAX StatusFusesEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The fuse to gather status from." + INDEX { dm3StatusFusesIndex } + ::= { dm3StatusFusesTable 1 } + +StatusFusesEntry ::= + SEQUENCE { + dm3StatusFusesIndex INTEGER, + dm3StatusFusesName DisplayString, + dm3StatusFusesStatus INTEGER + } + +dm3StatusFusesIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the DC powerplant fuse." + ::= { dm3StatusFusesEntry 1 } + +dm3StatusFusesName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the fuse. The maximum size is + 16 characters. The name is set by using the + dm3ConfigFuseName OID. + This OID is provided for informational purposes only." + ::= { dm3StatusFusesEntry 2 } + +dm3StatusFusesStatus OBJECT-TYPE + SYNTAX INTEGER { + statusClosed (1), + statusOpen (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusClosed (1) if the fuse is closed. + statusOpen (2) will be returned if the fuse is open." + ::= { dm3StatusFusesEntry 3 } + +-- the atsIdent group + +atsIdentHardwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The hardware version of the Automatic Transfer Switch. + This value is set at the factory." + ::= { atsIdent 1 } + +atsIdentFirmwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A string identifying the Automatic Transfer Switch + firmware version." + ::= { atsIdent 2 } + +atsIdentFirmwareDate OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The date of release for this Automatic Transfer Switch + firmware version. " + ::= { atsIdent 3 } + +atsIdentDateOfManufacture OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The date when the Automatic Transfer Switch was manufactured in mm/dd/yyyy format. + This value is set at the factory. " + ::= { atsIdent 4 } + +atsIdentModelNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A string identifying the model number of the Automatic Transfer Switch. + This value is set at the factory." + ::= { atsIdent 5 } + +atsIdentSerialNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A string identifying the serial number of + the Automatic Transfer Switch. This value is set at the factory." + ::= { atsIdent 6 } + +atsIdentNominalLineVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "RMS Utility Voltage measured in V." + ::= { atsIdent 7 } + +atsIdentNominalLineFrequency OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Utility Power Frequency measured in Hz." + ::= { atsIdent 8 } + +-- the atsCalibration group + +-- Input Voltage Calibration Factor table + + atsCalibrationNumInputs OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of inputs to this device." + ::= { atsCalibrationInput 1 } + + atsCalibrationNumInputPhases OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of phases per input for this device." + ::= { atsCalibrationInput 2 } + + atsCalibrationInputTable OBJECT-TYPE + SYNTAX SEQUENCE OF ATSCalibrationInputPhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The number of phases per input line to this device." + ::= { atsCalibrationInput 3 } + + atsCalibrationInputPhaseEntry OBJECT-TYPE + SYNTAX ATSCalibrationInputPhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing calibration information applicable to a + particular input phase." + INDEX { atsCalibrationInputTableIndex, atsCalibrationInputPhaseTableIndex } + ::= { atsCalibrationInputTable 1 } + + ATSCalibrationInputPhaseEntry ::= SEQUENCE { + atsCalibrationInputTableIndex INTEGER, + atsCalibrationInputPhaseTableIndex INTEGER, + atsLineVoltageCalibrationFactor INTEGER + } + + atsCalibrationInputTableIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The input identifier." + ::= { atsCalibrationInputPhaseEntry 1 } + + atsCalibrationInputPhaseTableIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The input phase identifier." + ::= { atsCalibrationInputPhaseEntry 2 } + + atsLineVoltageCalibrationFactor OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The Line Voltage Calibration factor. + This value is set at the factory." + ::= { atsCalibrationInputPhaseEntry 3 } + +-- Power Supply Voltage Calibration table + + atsCalibrationPowerSupplyVoltages OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of power supply voltages supported by this device. + This variable indicates the number of rows in the + atsCalibrationPowerSupplyTable. There is one entry per + supported voltage: 24V, 12V and 5V" + ::= { atsCalibrationPowerSupply 1 } + + atsCalibrationPowerSupplyVoltageTable OBJECT-TYPE + SYNTAX SEQUENCE OF ATSCalibrationPowerSupplyVoltageEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of Power Supply table entries." + ::= { atsCalibrationPowerSupply 2 } + + atsCalibrationPowerSupplyVoltageEntry OBJECT-TYPE + SYNTAX ATSCalibrationPowerSupplyVoltageEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information applicable to a + particular Power Supply Voltage." + INDEX { atsCalibrationPowerSupplyVoltageTableIndex } + ::= { atsCalibrationPowerSupplyVoltageTable 1 } + + ATSCalibrationPowerSupplyVoltageEntry ::= SEQUENCE { + atsCalibrationPowerSupplyVoltageTableIndex INTEGER, + atsCalibrationPowerSupplyVoltage INTEGER, + atsPowerSupplyVoltageCalibrationFactor INTEGER + } + + atsCalibrationPowerSupplyVoltageTableIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The power supply voltage identifier. + Three power supply voltages are supported by the ATS: + 24V , 12V and 5V . + The value of this index indicates the power supply voltage: + 1 = 24V + 2 = 12V + 3 = 5V" + ::= { atsCalibrationPowerSupplyVoltageEntry 1 } + + atsCalibrationPowerSupplyVoltage OBJECT-TYPE + SYNTAX INTEGER { + powerSupply24V(1), + powerSupply12V(2), + powerSupply(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This value describes the power supply voltage." + ::= { atsCalibrationPowerSupplyVoltageEntry 2 } + + atsPowerSupplyVoltageCalibrationFactor OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The Line Voltage Calibration factor. + This value is set at the factory." + ::= { atsCalibrationPowerSupplyVoltageEntry 3 } + +-- Output Current Calibration table + + atsCalibrationNumOutputs OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of output lines from this device. + This variable indicates the number of rows in the + atsCalibrationOutputTable." + ::= { atsCalibrationOutput 1 } + + atsCalibrationNumOutputPhases OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of output phases utilized in this + device." + ::= { atsCalibrationOutput 2 } + + atsCalibrationOutputTable OBJECT-TYPE + SYNTAX SEQUENCE OF ATSCalibrationOutputEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of output table entries." + ::= { atsCalibrationOutput 3 } + + atsCalibrationOutputEntry OBJECT-TYPE + SYNTAX ATSCalibrationOutputEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information applicable to a + particular output." + INDEX { atsCalibrationOutputTableIndex, atsCalibrationOutputPhasesTableIndex } + ::= { atsCalibrationOutputTable 1 } + + ATSCalibrationOutputEntry ::= SEQUENCE { + atsCalibrationOutputTableIndex INTEGER, + atsCalibrationOutputPhasesTableIndex INTEGER, + atsOutputCurrentCalibrationFactor INTEGER + } + + atsCalibrationOutputTableIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The output identifier." + ::= { atsCalibrationOutputEntry 1 } + + atsCalibrationOutputPhasesTableIndex OBJECT-TYPE + SYNTAX INTEGER{ + phase1(1), + phase2(2), + phase3(3), + neutral(4) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Description of each calibration factor for each + output phase utilized in this device and one for neutral. " + ::= { atsCalibrationOutputEntry 2 } + + atsOutputCurrentCalibrationFactor OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The output current calibration factor measured in Amps." + ::= { atsCalibrationOutputEntry 3 } + + +-- the atsControl group + +atsControlResetATS OBJECT-TYPE + SYNTAX INTEGER { + none(1), + reset(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this variable will cause the Automatic Transfer Switch to + perform a power-on reset." + ::= { atsControl 1 } + +atsControlClearAllAlarms OBJECT-TYPE + SYNTAX INTEGER { + none(1), + clear(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this variable will clear all alarms in the Automatic Transfer Switch." + ::= { atsControl 2 } + +-- the atsConfig group + +atsConfigProductName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "A configurable character string." + ::= { atsConfig 1 } + +atsConfigPreferredSource OBJECT-TYPE + SYNTAX INTEGER { + sourceA(1), + sourceB(2), + none(3) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This variable returns the preferred source of power when both sources are OK." + ::= { atsConfig 2 } + +atsConfigFrontPanelLockout OBJECT-TYPE + SYNTAX INTEGER { + disableFrontPanel(1), + enableFrontPanel(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Setting this variable to disableFrontPanel(1) will disallow source + preference configuration of the Automatic Transfer Switch via the + Front Panel. Once this value is set, it can only be re-enabled through + the serial interface of the ATS. + When this variable is set to enableFrontPanel(2), source preference + configuration of the Automatic Transfer Switch via the Front Panel + is allowed." + ::= { atsConfig 3 } + +atsConfigVoltageSensitivity OBJECT-TYPE + SYNTAX INTEGER { + high(1), + low(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This variable defines the sensitivity to changes in voltage: + high(1) for best protection, low(2) for frequent small line + voltage changes." + ::= { atsConfig 4 } + +atsConfigTransferVoltageRange OBJECT-TYPE + SYNTAX INTEGER { + wide(1), + medium(2), + narrow(3) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This variable defines the range of acceptable voltage from a power source. + If the voltage measured from the selected input source is not within this + range, the Automatic Transfer Switch will switch over (transfer) to the + alternate power source." + + ::= { atsConfig 5 } + +atsConfigCurrentLimit OBJECT-TYPE + SYNTAX INTEGER (0..20) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The threshold (in Amps) at which an Over Current Alarm will be generated." + + ::= { atsConfig 6 } + + +atsConfigResetValues OBJECT-TYPE + SYNTAX INTEGER { + none(1), + reset(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Resets the ATS configuration to its default values." + + ::= { atsConfig 7 } + +-- the atsStatus group + + atsStatusCommStatus OBJECT-TYPE + SYNTAX INTEGER { + atsNeverDiscovered(1), + atsCommEstablished(2), + atsCommLost(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This variable returns the current communication status + of the Automatic Transfer Switch. " + ::= { atsStatusDeviceStatus 1 } + + atsStatusSelectedSource OBJECT-TYPE + SYNTAX INTEGER { + sourceA(1), + sourceB(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This variable returns the current source of power. " + ::= { atsStatusDeviceStatus 2 } + + atsStatusRedundancyState OBJECT-TYPE + SYNTAX INTEGER { + atsRedundancyLost(1), + atsFullyRedundant(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This variable returns the current redundancy state of the ATS. + atsRedundancyLost(1) indicates that the ATS is unable to + switch over to the alternate power source if the current source fails. + atsFullyRedundant(2) indicates that the ATS will switch over to + the alternate power source if the current source fails." + ::= { atsStatusDeviceStatus 3 } + + atsStatusOverCurrentState OBJECT-TYPE + SYNTAX INTEGER { + atsOverCurrent(1), + atsCurrentOK(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This variable returns the output current state of the ATS. + atsOverCurrent(1) indicates that the ATS has exceeded the output + current threshold and will not allow a switch over to the alternate power + source if the current source fails. + atsCurrentOK(2) indicates that the output current is below the + output current threshold." + ::= { atsStatusDeviceStatus 4 } + + atsStatus5VPowerSupply OBJECT-TYPE + SYNTAX INTEGER { + atsPowerSupplyFailure(1), + atsPowerSupplyOK(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This variable returns the current state of the ATS 5-volt power supply. + atsPowerSupplyFailure(1) indicates the 5-volt power supply has failed + and that the ATS serial port Configuration Menu is not accessible . + atsPowerSupplyOK(2) indicates that the ATS 5-volt power supply + is operating within tolerance." + ::= { atsStatusDeviceStatus 5 } + + atsStatus24VPowerSupply OBJECT-TYPE + SYNTAX INTEGER { + atsPowerSupplyFailure(1), + atsPowerSupplyOK(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This variable returns the current state of the ATS 24-volt power supply. + atsPowerSupplyFailure(1) indicates the 24-volt power supply has failed + and the ATS is unable to switch over to the alternate power source if + the current source fails. + atsPowerSupplyOK(2) indicates that the ATS 24-volt power supply + is operating within tolerance." + ::= { atsStatusDeviceStatus 6 } + + atsStatusResetMaxMinValues OBJECT-TYPE + SYNTAX INTEGER { + none(1), + reset(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Resets the maximum and minimum ATS values: + atsInputMaxVoltage, atsInputMinVoltage, + atsInputMaxCurrent, atsInputMinCurrent, + atsInputMaxPower, atsInputMinPower, + atsOutputMaxCurrent, atsOutputMinCurrent, + atsOutputMaxLoad, atsOutputMinLoad, + atsOutputMaxPercentLoad, atsOutputMinPercentLoad, + atsOutputMaxPower, atsOutputMinPower, + atsOutputMaxPercentPower, atsOutputMinPercentPower. + These variables represent the maximum and minimum ATS values + since the last time they were read or reset by this OID. + Values unsupported by this ATS will return (-1)." + ::= { atsStatusResetValues 1 } + +-- +-- Input Group +-- + +-- Number of Inputs + + atsNumInputs OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of input feeds to this device. + This variable indicates the number of rows in the + input table." + ::= { atsStatusInput 1 } + +-- Input Table + + atsInputTable OBJECT-TYPE + SYNTAX SEQUENCE OF ATSPhaseInputEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of input table entries. The number of entries + is given by the value of atsNumInputs." + ::= { atsStatusInput 2 } + + atsInputEntry OBJECT-TYPE + SYNTAX ATSPhaseInputEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information applicable to a + particular input." + INDEX { atsInputTableIndex } + ::= { atsInputTable 1 } + + ATSPhaseInputEntry ::= SEQUENCE { + atsInputTableIndex INTEGER, + atsNumInputPhases INTEGER, + atsInputVoltageOrientation INTEGER, + atsInputFrequency INTEGER, + atsInputType INTEGER, + atsInputName DisplayString + } + + atsInputTableIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The input identifier." + ::= { atsInputEntry 1 } + + atsNumInputPhases OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of input phases utilized in this + device. The sum of all the atsNumInputPhases + variable indicates the number of rows in the + input phase table." + ::= { atsInputEntry 2 } + + atsInputVoltageOrientation OBJECT-TYPE + SYNTAX INTEGER { + unknown(1), + singlePhase(2), + splitPhase(3), + threePhasePhaseToNeutral(4), + threePhasePhaseToPhase(5) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The input voltage orientation: + 1: unknown for this Source + 2: singlePhase - phase 1 voltage is between Phase 1 + and Neutral. + 3: splitPhase - phase 1 voltage is between Phase 1 and + Neutral; phase 2 voltage is between Phase 2 and Neutral; + phase 3 voltage is between Phase 1 and Phase2. + 4: threePhasePhaseToNeutral - phase 1 voltage is between + Phase 1 and Neutral; phase 2 voltage is between Phase 2 + and Neutral; phase 3 voltage is between Phase3 and + Neutral. + 5: threePhasePhaseToPhase - phase 1 voltage is between + Phase 1 and Phase 2; phase 2 voltage is between Phase 2 + and Phase 3; phase 3 voltage is between Phase 3 and + Phase 1." + ::= { atsInputEntry 3 } + + atsInputFrequency OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The input frequency in Hertz, or -1 if it's unsupported + by this Source." + ::= { atsInputEntry 4 } + + atsInputType OBJECT-TYPE + SYNTAX INTEGER { + unknown(1), + main(2), + bypass(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The input type." + ::= { atsInputEntry 5 } + + atsInputName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "A name given to a particular input." + ::= { atsInputEntry 6 } + +-- Input Phase Table + + atsInputPhaseTable OBJECT-TYPE + SYNTAX SEQUENCE OF ATSPhaseInputPhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of input table entries. The number of entries + is given by the sum of the atsNumInputPhases." + ::= { atsStatusInput 3 } + + atsInputPhaseEntry OBJECT-TYPE + SYNTAX ATSPhaseInputPhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information applicable to a + particular input phase." + INDEX { atsInputPhaseTableIndex, atsInputPhaseIndex } + ::= { atsInputPhaseTable 1 } + + ATSPhaseInputPhaseEntry ::= SEQUENCE { + atsInputPhaseTableIndex INTEGER, + atsInputPhaseIndex INTEGER, + atsInputVoltage INTEGER, + atsInputMaxVoltage INTEGER, + atsInputMinVoltage INTEGER, + atsInputCurrent INTEGER, + atsInputMaxCurrent INTEGER, + atsInputMinCurrent INTEGER, + atsInputPower INTEGER, + atsInputMaxPower INTEGER, + atsInputMinPower INTEGER + } + + atsInputPhaseTableIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The input identifier." + ::= { atsInputPhaseEntry 1 } + + atsInputPhaseIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The input phase identifier." + ::= { atsInputPhaseEntry 2 } + + atsInputVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The input voltage in VAC, or -1 if it's unsupported + by this Source." + ::= { atsInputPhaseEntry 3 } + + atsInputMaxVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The maximum input voltage in VAC measured + since the last time this variable was read + or reset (atsStatusResetMaxMinValues). + Returns (-1) if unsupported." + ::= { atsInputPhaseEntry 4 } + + atsInputMinVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The minimum input voltage in VAC measured + since the last time this variable was read + or reset (atsStatusResetMaxMinValues). + Returns (-1) if unsupported." + ::= { atsInputPhaseEntry 5 } + + atsInputCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The input current in amperes, or -1 if it's + unsupported by this Source." + ::= { atsInputPhaseEntry 6 } + + atsInputMaxCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The maximum input current in amperes measured + since the last time this variable was read + or reset (atsStatusResetMaxMinValues). + Returns (-1) if unsupported." + ::= { atsInputPhaseEntry 7 } + + atsInputMinCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The minimum input current in amperes measured + since the last time this variable was read + or reset (atsStatusResetMaxMinValues). + Returns (-1) if unsupported." + ::= { atsInputPhaseEntry 8 } + + atsInputPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The input power in Watts, or -1 if it's unsupported + by this Source." + ::= { atsInputPhaseEntry 9 } + + atsInputMaxPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The maximum input power in Watts measured + since the last time this variable was read + or reset (atsStatusResetMaxMinValues). + Returns (-1) if unsupported." + ::= { atsInputPhaseEntry 10 } + + atsInputMinPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The minimum input power in Watts measured + since the last time this variable was read + or reset (atsStatusResetMaxMinValues). + Returns (-1) if unsupported." + ::= { atsInputPhaseEntry 11 } + + -- + -- The Output group. + -- + + -- Number of Outputs + + atsNumOutputs OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of output feeds to this device. + This variable indicates the number of rows in the + output table." + ::= { atsStatusOutput 1 } + + -- Output Table + + atsOutputTable OBJECT-TYPE + SYNTAX SEQUENCE OF ATSPhaseOutputEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of output table entries. The number of entries + is given by the value of atsOutputNumPhases." + ::= { atsStatusOutput 2 } + + atsOutputEntry OBJECT-TYPE + SYNTAX ATSPhaseOutputEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information applicable to a + particular output." + INDEX { atsOutputTableIndex } + ::= { atsOutputTable 1 } + + ATSPhaseOutputEntry ::= SEQUENCE { + atsOutputTableIndex INTEGER, + atsNumOutputPhases INTEGER, + atsOutputVoltageOrientation INTEGER, + atsOutputFrequency INTEGER + } + + atsOutputTableIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The output identifier." + ::= { atsOutputEntry 1 } + + atsNumOutputPhases OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of output phases utilized in this + device. The sum of all the atsNumOutputPhases + variable indicates the number of rows in the + output phase table." + ::= { atsOutputEntry 2 } + + atsOutputVoltageOrientation OBJECT-TYPE + SYNTAX INTEGER { + unknown(1), + singlePhase(2), + splitPhase(3), + threePhasePhaseToNeutral(4), + threePhasePhaseToPhase(5) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The output voltage orientation: + 1: unknown for this ATS + 2: singlePhase - phase 1 voltage is between Phase 1 + and Neutral. + 3: splitPhase - phase 1 voltage is between Phase 1 and + Neutral; phase 2 voltage is between Phase 2 and Neutral; + phase 3 voltage is between Phase 1 and Phase2. + 4: threePhasePhaseToNeutral - phase 1 voltage is between + Phase 1 and Neutral; phase 2 voltage is between Phase 2 + and Neutral; phase 3 voltage is between Phase3 and + Neutral. + 5: threePhasePhaseToPhase - phase 1 voltage is between + Phase 1 and Phase 2; phase 2 voltage is between Phase 2 + and Phase 3; phase 3 voltage is between Phase 3 and + Phase 1." + ::= { atsOutputEntry 3 } + + atsOutputFrequency OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The output frequency in Hertz, or -1 if it's + unsupported by this ATS." + ::= { atsOutputEntry 4 } + + -- Output Phase Table + + atsOutputPhaseTable OBJECT-TYPE + SYNTAX SEQUENCE OF ATSPhaseOutputPhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of output table entries. The number of + entries is given by the sum of the atsNumOutputPhases." + ::= { atsStatusOutput 3 } + + atsOutputPhaseEntry OBJECT-TYPE + SYNTAX ATSPhaseOutputPhaseEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "An entry containing information applicable to a + particular output phase." + INDEX { atsOutputPhaseTableIndex, atsOutputPhaseIndex } + ::= { atsOutputPhaseTable 1 } + + ATSPhaseOutputPhaseEntry ::= SEQUENCE { + atsOutputPhaseTableIndex INTEGER, + atsOutputPhaseIndex INTEGER, + atsOutputVoltage INTEGER, + atsOutputCurrent INTEGER, + atsOutputMaxCurrent INTEGER, + atsOutputMinCurrent INTEGER, + atsOutputLoad INTEGER, + atsOutputMaxLoad INTEGER, + atsOutputMinLoad INTEGER, + atsOutputPercentLoad INTEGER, + atsOutputMaxPercentLoad INTEGER, + atsOutputMinPercentLoad INTEGER, + atsOutputPower INTEGER, + atsOutputMaxPower INTEGER, + atsOutputMinPower INTEGER, + atsOutputPercentPower INTEGER, + atsOutputMaxPercentPower INTEGER, + atsOutputMinPercentPower INTEGER + } + + atsOutputPhaseTableIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The output identifier." + ::= { atsOutputPhaseEntry 1 } + + atsOutputPhaseIndex OBJECT-TYPE + SYNTAX INTEGER{ + phase1(1), + phase2(2), + phase3(3), + neutral(4) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Description of each output phase utilized in + this device and one for neutral. " + ::= { atsOutputPhaseEntry 2 } + + atsOutputVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The output voltage in VAC, or -1 if it's unsupported + by this ATS." + ::= { atsOutputPhaseEntry 3 } + + atsOutputCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The output current in 0.1 amperes drawn + by the load on the ATS, or -1 if it's unsupported + by this ATS." + ::= { atsOutputPhaseEntry 4 } + + atsOutputMaxCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The maximum output current in 0.1 amperes measured + since the last time this variable was read + or reset (atsStatusResetMaxMinValues). + Returns (-1) if unsupported." + ::= { atsOutputPhaseEntry 5 } + + atsOutputMinCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The minimum output current in 0.1 amperes measured + since the last time this variable was read + or reset (atsStatusResetMaxMinValues). + Returns (-1) if unsupported." + ::= { atsOutputPhaseEntry 6 } + + atsOutputLoad OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The output load in VA, or -1 if it's unsupported + by this ATS." + ::= { atsOutputPhaseEntry 7 } + + atsOutputMaxLoad OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The maximum output load in VA measured + since the last time this variable was read + or reset (atsStatusResetMaxMinValues). + Returns (-1) if unsupported." + ::= { atsOutputPhaseEntry 8 } + + atsOutputMinLoad OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The minimum output load in VA measured + since the last time this variable was read + or reset (atsStatusResetMaxMinValues). + Returns (-1) if unsupported." + ::= { atsOutputPhaseEntry 9 } + + atsOutputPercentLoad OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The percentage of the ATS load capacity in VA at + redundancy @ (n + x) presently being used on this + output phase, or -1 if it's unsupported by this ATS." + ::= { atsOutputPhaseEntry 10 } + + atsOutputMaxPercentLoad OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The maximum percentage of the ATS load capacity in + VA measured at redundancy @ (n + x) presently + being used on this output phase since the last time + this variable was read or reset (atsStatusResetMaxMinValues). + Returns (-1) if unsupported." + ::= { atsOutputPhaseEntry 11 } + + atsOutputMinPercentLoad OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The minimum percentage of the ATS load capacity in + VA measured at redundancy @ (n + x) presently + being used on this output phase since the last time + this variable was read or reset (atsStatusResetMaxMinValues). + Returns (-1) if unsupported." + ::= { atsOutputPhaseEntry 12 } + + atsOutputPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The output power in Watts, or -1 if it's + unsupported by this ATS." + ::= { atsOutputPhaseEntry 13 } + + atsOutputMaxPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The maximum output power in Watts measured + since the last time this variable was read + or reset (atsStatusResetMaxMinValues). + Returns (-1) if unsupported." + ::= { atsOutputPhaseEntry 14 } + + atsOutputMinPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The minimum output power in Watts measured + since the last time this variable was read + or reset (atsStatusResetMaxMinValues). + Returns (-1) if unsupported." + ::= { atsOutputPhaseEntry 15 } + + atsOutputPercentPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The percentage of the ATSpower capacity in Watts at + redundancy @ (n + x) presently being used on this + output phase, or -1 if it's unsupported by this ATS." + ::= { atsOutputPhaseEntry 16 } + + atsOutputMaxPercentPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The maximum percentage of the ATSpower capacity + in Watts measured at redundancy @ (n + x) presently + being used on this output phase since the last time + this variable was read or reset (atsStatusResetMaxMinValues). + Returns (-1) if unsupported." + ::= { atsOutputPhaseEntry 17 } + + atsOutputMinPercentPower OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The minimum percentage of the ATSpower capacity + in Watts measured at redundancy @ (n + x) presently + being used on this output phase since the last time + this variable was read or reset (atsStatusResetMaxMinValues). + Returns (-1) if unsupported." + ::= { atsOutputPhaseEntry 18 } + +-- the dcmim2IdentSystem group + +dcmim2IdentSysFWVersion OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Integer representation of the power plant Master Controller firmware revision." + ::= { dcmim2IdentSystem 1 } + + +-- the dcmim2ControlSystem group + +dcmim2ControlRunFunctBatteryTest OBJECT-TYPE + SYNTAX INTEGER { + battTestOff (1), + battTestOn (2) +} + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Getting this OID will return the battery functional test state. If + the test is off, the battTestOff (1) value will be returned. + If the test is on, the battTestOn (2) value will be + returned. + + Setting this OID to battTestOff (1) will turn the battery functional test off. + Setting this OID to battTestOn (2) will turn the battery functional test on." + + ::= { dcmim2ControlSystem 1 } + +dcmim2ControlRunCapacityBatteryTest OBJECT-TYPE + SYNTAX INTEGER { + battTestOff (1), + battTestOn (2) +} + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Getting this OID will return the battery capacity test state. If + the test is off, the battTestOff (1) value will be returned. + If the test is on, the battTestOn (2) value will be + returned. + + Setting this OID to battTestOff (1) will turn the battery capacity test off. + Setting this OID to battTestOn (2) will turn the battery capacity test on." + + ::= { dcmim2ControlSystem 2 } + + +-- the dcmim2ConfigSystem group + +dcmim2ConfigSysHighTempTrip OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Trip level (threshold) at which System High Temp alarm condition is created. + Range 28 to 100 (degC). + + Values are represented in thousandths of a degree. + Units are displayed in the scale shown in + the 'dcmim2StatusSysTempUnits' OID (Celsius or Fahrenheit)." + + + ::= { dcmim2ConfigSystem 1 } + +dcmim2ConfigSysHighTempReset OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Level at which System High Temp alarm condition is reset (cleared). + Range 25 to (upper temp - 3) (degC). + + Values are represented in thousandths of a degree. + Units are displayed in the scale shown in + the 'dcmim2StatusSysTempUnits' OID (Celsius or Fahrenheit)." + + ::= { dcmim2ConfigSystem 2 } + +dcmim2ConfigSysLowTempTrip OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Trip level (threshold) at which System Low Temp alarm condition is created. + Range -100 to 10 (degC). + Values are represented in thousandths of a degree. + Units are displayed in the scale shown in + the 'dcmim2StatusSysTempUnits' OID (Celsius or Fahrenheit)." + + ::= { dcmim2ConfigSystem 3 } + +dcmim2ConfigSysLowTempReset OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Level at which System Low Temp alarm condition is reset (cleared). + Range (lower temp + 3) to 13 (degC). + Values are represented in thousandths of a degree. + Units are displayed in the scale shown in + the 'dcmim2StatusSysTempUnits' OID (Celsius or Fahrenheit)." + + ::= { dcmim2ConfigSystem 4 } + +-- the dcmim2ConfigBattery group + +dcmim2ConfigBattFloatVolt OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Battery Float Voltage defined at 25 degrees Celsius. + + Values are represented in thousandths of Volts (mV)." + + ::= { dcmim2ConfigBattery 1 } + +dcmim2ConfigBattMaxRecharge OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Battery Maximum Recharge Rate. This is the maximum current used + during battery charging. + + Values are represented in thousandths of Amps (mA)." + + ::= { dcmim2ConfigBattery 2 } + +dcmim2ConfigBattMfgCapacity OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Battery capacity (Amp-Hour Size) as specified by the battery manufacturer. + + Values are represented in thousandths of Amp hours (mAHr)." + + ::= { dcmim2ConfigBattery 3 } + +dcmim2ConfigBattType OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Type of battery in the powerplant + + Valid values range from 0 to 254." + + ::= { dcmim2ConfigBattery 4 } + +dcmim2ConfigBattFunctTestDuration OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Duration of the battery functional test. + + Values are represented in thousandths of seconds (mSecs)." + + ::= { dcmim2ConfigBattery 5 } + +dcmim2ConfigBattFunctTestThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold the battery voltage of the system must remain above + in order to pass the battery functional test. + + Values are represented in thousandths of Volts (mV)." + + ::= { dcmim2ConfigBattery 6 } + +dcmim2ConfigBattCapacityTestPercent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Threshold for good battery capacity test results. + + Values range from 0 to 100 percent." + + ::= { dcmim2ConfigBattery 7 } + +dcmim2ConfigBattCapacityTestEndThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Safeguard voltage at which battery capacity test will end + if there is a battery problem. + + Values are represented in thousandths of Volts (mV)." + + ::= { dcmim2ConfigBattery 8 } + +dcmim2ConfigBattCapacityTestCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Constant current value used during battery capacity testing. + + Values are represented in thousandths of Amps (mA)." + + ::= { dcmim2ConfigBattery 9 } + + +-- the dcmim2ConfigLVD group + +dcmim2ConfigLVDTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of DC powerplant LVDs controllable + by this IP address." + ::= { dcmim2ConfigLVD 1 } + +dcmim2ConfigLVDTable OBJECT-TYPE + SYNTAX SEQUENCE OF DC2ConfigLVDEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for accessing settings of the LVDs. The number of + entries is contained in the dcmim2ConfigLVDTableSize OID." + ::= { dcmim2ConfigLVD 2 } + +dcmim2ConfigLVDEntry OBJECT-TYPE + SYNTAX DC2ConfigLVDEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The LVD to configure." + INDEX { dcmim2ConfigLVDIndex } + ::= { dcmim2ConfigLVDTable 1 } + +DC2ConfigLVDEntry ::= + SEQUENCE { + dcmim2ConfigLVDIndex INTEGER, + dcmim2ConfigLVDTrip INTEGER, + dcmim2ConfigLVDReset INTEGER, + dcmim2ConfigLVDState INTEGER + } + +dcmim2ConfigLVDIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the DC powerplant LVD." + ::= { dcmim2ConfigLVDEntry 1 } + +dcmim2ConfigLVDTrip OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "LVD Trip threshold. System bus voltage at which LVD will trip (open) + during a battery backup operation. + + Values are represented in thousandths of Volts (mV)." + ::= { dcmim2ConfigLVDEntry 2 } + +dcmim2ConfigLVDReset OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "LVD Reset threshold. System bus voltage at which LVD will reset (close) + after AC power has been restored. + + Values are represented in thousandths of Volts (mV)." + ::= { dcmim2ConfigLVDEntry 3 } + +dcmim2ConfigLVDState OBJECT-TYPE + SYNTAX INTEGER { + statusClosed (1), + statusOpened (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusClosed (1) if the LVD is closed. + statusOpened (2) will be returned if the LVD is opened." + ::= { dcmim2ConfigLVDEntry 4 } + + +-- the dcmim2StatusSystem group + +dcmim2StatusSysRectCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "System (Total Rectifier) current in thousandths of Amps (mA)." + ::= { dcmim2StatusSystem 1 } + +dcmim2StatusSysLoadCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Load current in thousandths of Amps (mA)." + ::= { dcmim2StatusSystem 2 } + +dcmim2StatusSysBusVoltage OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "System bus voltage in thousandths of Volts (mV)." + ::= { dcmim2StatusSystem 3 } + +dcmim2StatusSysAmbientTemp OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "System temperature based on sensor on Master Controller PCB. + + Values are represented in thousandths of a degree. + Units are displayed in the scale shown in + the 'dcmim2StatusSysTempUnits' OID (Celsius or Fahrenheit)." + ::= { dcmim2StatusSystem 4 } + +dcmim2StatusSysUpTime OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Length of time since the DC Powerplant controller has been powered up." + ::= { dcmim2StatusSystem 5 } + +dcmim2StatusSysTempUnits OBJECT-TYPE + SYNTAX INTEGER { + celsius(1), + fahrenheit(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The temperature scale used to display the temperature + in the DC system, Celsius(1) or Fahrenheit(2). + This setting is based on the system preferences + configuration in the agent." + ::= { dcmim2StatusSystem 6 } + + +-- the dcmim2StatusRectifier group + +dcmim2StatusRectTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of DC powerplant rectifiers viewable + by this IP address." + ::= { dcmim2StatusRectifier 1 } + +dcmim2StatusRectTable OBJECT-TYPE + SYNTAX SEQUENCE OF DC2StatusRectEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for accessing settings of the rectifiers. The number of + entries is contained in the dcmim2StatusRectTableSize OID." + ::= { dcmim2StatusRectifier 2 } + +dcmim2StatusRectEntry OBJECT-TYPE + SYNTAX DC2StatusRectEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The rectifier to gather status from." + INDEX { dcmim2StatusRectIndex } + ::= { dcmim2StatusRectTable 1 } + +DC2StatusRectEntry ::= + SEQUENCE { + dcmim2StatusRectIndex INTEGER, + dcmim2StatusRectDevType INTEGER, + dcmim2StatusRectID INTEGER, + dcmim2StatusRectPhyAddr INTEGER, + dcmim2StatusRectFail INTEGER, + dcmim2StatusRectCurrent INTEGER + } + +dcmim2StatusRectIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the DC powerplant rectifier." + ::= { dcmim2StatusRectEntry 1 } + +dcmim2StatusRectDevType OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the rectifier device type." + ::= { dcmim2StatusRectEntry 2 } + +dcmim2StatusRectID OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the rectifier ID. This enumerates the number of the rectifier within + a group of rectifiers." + ::= { dcmim2StatusRectEntry 3 } + +dcmim2StatusRectPhyAddr OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the rectifier physical address (the address on the bus)." + ::= { dcmim2StatusRectEntry 4 } + +dcmim2StatusRectFail OBJECT-TYPE + SYNTAX INTEGER { + statusTrue (1), + statusFalse (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusTrue (1) if the rectifier has failed. + statusFalse (2) will be returned if the rectifier has not failed." + ::= { dcmim2StatusRectEntry 5 } + +dcmim2StatusRectCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID shows the individual rectifier current in thousandths of Amps (mA)." + ::= { dcmim2StatusRectEntry 6 } + + +-- the dcmim2StatusBattery group + +dcmim2StatusBattFloatVolt OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Battery Float Voltage represented in thousandths of Volts (mV)." + ::= { dcmim2StatusBattery 1 } + +dcmim2StatusBattCurrent OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Battery Current: This OID shows the battery current in thousandths of Amps (mA)." + ::= { dcmim2StatusBattery 2 } + +dcmim2StatusBattTemp OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Battery Temperature: + + Values are represented in thousandths of a degree. + Units are displayed in the scale shown in + the 'dcmim2StatusSysTempUnits' OID (Celsius or Fahrenheit)." + ::= { dcmim2StatusBattery 3 } + +dcmim2StatusBattMfgCapacity OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Battery capacity (Amp-Hour Size) as specified by the battery manufacturer. + Values are represented in thousandths of Amp hours (mAHr)." + ::= { dcmim2StatusBattery 4 } + +dcmim2StatusBattTestCapacity OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Battery capacity (Amp-Hour Size) as determined by the battery capacity test. + Values are represented in thousandths of Amp hours (mAHr)." + ::= { dcmim2StatusBattery 5 } + +dcmim2StatusBattFunctTestResult OBJECT-TYPE + SYNTAX INTEGER{ + functTestNotPerformed (1), + functTestInProcess (2), + functTestInterrupted (3), + functTestPass (4), + functTestFail (5) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Results of the last battery functional test that was run." + ::= { dcmim2StatusBattery 6 } + +dcmim2StatusBattCapacityTestResult OBJECT-TYPE + SYNTAX INTEGER{ + capacityTestNotPerformed (1), + capacityTestInProcess (2), + capacityTestInterrupted (3), + capacityTestPass (4), + capacityTestFail (5) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Results of the last battery capacity test that was run." + ::= { dcmim2StatusBattery 7 } + + +-- the dcmim2StatusLVD group + +dcmim2StatusLVDTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of DC powerplant LVDs accessible + by this IP address." + ::= { dcmim2StatusLVD 1 } + +dcmim2StatusLVDTable OBJECT-TYPE + SYNTAX SEQUENCE OF DC2StatusLVDEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for accessing the LVDs. The number of + entries is contained in the dcmim2StatusLVDTableSize OID." + ::= { dcmim2StatusLVD 2 } + +dcmim2StatusLVDEntry OBJECT-TYPE + SYNTAX DC2StatusLVDEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The LVD to access." + INDEX { dcmim2StatusLVDIndex } + ::= { dcmim2StatusLVDTable 1 } + +DC2StatusLVDEntry ::= + SEQUENCE { + dcmim2StatusLVDIndex INTEGER, + dcmim2StatusLVDState INTEGER + } + +dcmim2StatusLVDIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the DC powerplant LVD." + ::= { dcmim2StatusLVDEntry 1 } + +dcmim2StatusLVDState OBJECT-TYPE + SYNTAX INTEGER { + statusClosed (1), + statusOpened (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this OID will return statusClosed (1) if the LVD is closed. + statusOpened (2) will be returned if the LVD is opened." + ::= { dcmim2StatusLVDEntry 2 } + + +-- the dcmim2StatusAlarms group + +dcmim2StatusAlarmsTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of DC powerplant alarms viewable + by this IP address." + ::= { dcmim2StatusAlarms 1 } + +dcmim2StatusAlarmsTable OBJECT-TYPE + SYNTAX SEQUENCE OF DC2StatusAlarmsEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for accessing system alarms. The number of + entries is contained in the dcmim2StatusAlarmsTableSize OID." + ::= { dcmim2StatusAlarms 2 } + +dcmim2StatusAlarmsEntry OBJECT-TYPE + SYNTAX DC2StatusAlarmsEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The alarm to display." + INDEX { dcmim2StatusAlarmsIndex } + ::= { dcmim2StatusAlarmsTable 1 } + +DC2StatusAlarmsEntry ::= + SEQUENCE { + dcmim2StatusAlarmsIndex INTEGER, + dcmim2StatusAlarmsText DisplayString + } + +dcmim2StatusAlarmsIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of the system alarm." + ::= { dcmim2StatusAlarmsEntry 1 } + +dcmim2StatusAlarmsText OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The 16 character text describing the active alarm condition." + ::= { dcmim2StatusAlarmsEntry 2 } + +-- External Environmental Monitor + +emIdentFirmwareRevision OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The firmware revision of the Environmental Monitor." + ::= { emIdent 1 } + +emConfigProbesNumProbes OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of temperature and humidity probes available." + ::= { emConfig 1 } + +emConfigProbesTable OBJECT-TYPE + SYNTAX SEQUENCE OF EmConfigProbesEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of probes supported by the Environmental Monitor + and their configurations." + ::= { emConfig 2 } + +emConfigProbesEntry OBJECT-TYPE + SYNTAX EmConfigProbesEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The Environmental Monitor probe configurations." + INDEX { emConfigProbeNumber } + ::= { emConfigProbesTable 1 } + +EmConfigProbesEntry ::= + SEQUENCE { + emConfigProbeNumber + INTEGER, + emConfigProbeName + DisplayString, + emConfigProbeHighTempThreshold + INTEGER, + emConfigProbeLowTempThreshold + INTEGER, + emConfigProbeTempUnits + INTEGER, + emConfigProbeHighHumidThreshold + INTEGER, + emConfigProbeLowHumidThreshold + INTEGER, + emConfigProbeHighTempEnable + INTEGER, + emConfigProbeLowTempEnable + INTEGER, + emConfigProbeHighHumidEnable + INTEGER, + emConfigProbeLowHumidEnable + INTEGER + } + +emConfigProbeNumber OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index into an Environmental Monitor probe entry." + ::= { emConfigProbesEntry 1 } + +emConfigProbeName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "A descriptive name of the probe set by the user, + possibly denoting its location or purpose." + ::= { emConfigProbesEntry 2 } + +emConfigProbeHighTempThreshold OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The high temperature alarm threshold for the probe. + Units are displayed in the scale selected in + the 'emConfigProbeTempUnits' OID (Celsius or Fahrenheit)." + ::= { emConfigProbesEntry 3 } + +emConfigProbeLowTempThreshold OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The low temperature alarm threshold for the probe. + Units are displayed in the scale selected in + the 'emConfigProbeTempUnits' OID (Celsius or Fahrenheit)." + ::= { emConfigProbesEntry 4 } + +emConfigProbeTempUnits OBJECT-TYPE + SYNTAX INTEGER { + celsius(1), + fahrenheit(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The temperature scale used to display the temperature + thresholds of the probe, Celsius(1) or Fahrenheit(2). + This setting is based on the system preferences + configuration in the agent." + ::= { emConfigProbesEntry 5 } + +emConfigProbeHighHumidThreshold OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The high humidity alarm threshold for the probe in + percent relative humidity." + ::= { emConfigProbesEntry 6 } + +emConfigProbeLowHumidThreshold OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The low humidity alarm threshold for the probe in + percent relative humidity." + ::= { emConfigProbesEntry 7 } + +emConfigProbeHighTempEnable OBJECT-TYPE + SYNTAX INTEGER { + disabled(1), + enabled(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The high temperature alarm enable/disable for the + probe. No alarm will be generated if this value + is set to disabled(1). The alarm will be + generated if this value is set to enabled(2) and + the threshold has been violated." + ::= { emConfigProbesEntry 8 } + +emConfigProbeLowTempEnable OBJECT-TYPE + SYNTAX INTEGER { + disabled(1), + enabled(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The low temperature alarm enable/disable for the + probe. No alarm will be generated if this value + is set to disabled(1). The alarm will be + generated if this value is set to enabled(2) and + the threshold has been violated." + ::= { emConfigProbesEntry 9 } + +emConfigProbeHighHumidEnable OBJECT-TYPE + SYNTAX INTEGER { + disabled(1), + enabled(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The high humidity alarm enable/disable for the + probe. No alarm will be generated if this value + is set to disabled(1). The alarm will be + generated if this value is set to enabled(2) and + the threshold has been violated." + ::= { emConfigProbesEntry 10 } + +emConfigProbeLowHumidEnable OBJECT-TYPE + SYNTAX INTEGER { + disabled(1), + enabled(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The low humidity alarm enable/disable for the + probe. No alarm will be generated if this value + is set to disabled(1). The alarm will be + generated if this value is set to enabled(2) and + the threshold has been violated." + ::= { emConfigProbesEntry 11 } + +emConfigContactsNumContacts OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of contacts supported by the Environmental + Monitor." + ::= { emConfig 3 } + +emConfigContactsTable OBJECT-TYPE + SYNTAX SEQUENCE OF EmConfigContactsEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of contacts supported by the Environmental Monitor + and their configurations." + ::= { emConfig 4 } + +emConfigContactsEntry OBJECT-TYPE + SYNTAX EmConfigContactsEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The Environmental Monitor contact configurations." + INDEX { emConfigContactNumber } + ::= { emConfigContactsTable 1 } + +EmConfigContactsEntry ::= + SEQUENCE { + emConfigContactNumber + INTEGER, + emConfigContactName + DisplayString, + emConfigContactEnable + INTEGER + } + +emConfigContactNumber OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of an Environmental Monitor contact." + ::= { emConfigContactsEntry 1 } + +emConfigContactName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "A descriptive name for an Environmental Monitor + contact set by the user, possibly denoting its + location or purpose." + ::= { emConfigContactsEntry 2 } + +emConfigContactEnable OBJECT-TYPE + SYNTAX INTEGER { + disabled(1), + enabled(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "An Environmental Monitor contact alarm enable/disable. + No alarm will be generated if the contact is disabled(1). + An alarm will be generated if the contact is enabled(2) + and the contact has been faulted." + ::= { emConfigContactsEntry 3 } + +emStatusCommStatus OBJECT-TYPE + SYNTAX INTEGER { + noComm(1), + comm(2), + commLost(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The communication status between the agent + and the Environmental Monitor. + + noComm(1), Communication has never been established. + comm(2), Communication has been established. + commLost(3), Communication was established, but was lost." + ::= { emStatus 1 } + +emStatusProbesNumProbes OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of available probes on the Environmental + Monitor." + ::= { emStatus 2 } + +emStatusProbesTable OBJECT-TYPE + SYNTAX SEQUENCE OF EmStatusProbesEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of probes supported by the Environmental Monitor + and their status." + ::= { emStatus 3 } + +emStatusProbesEntry OBJECT-TYPE + SYNTAX EmStatusProbesEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The status of the probe." + INDEX { emStatusProbeNumber } + ::= { emStatusProbesTable 1 } + +EmStatusProbesEntry ::= + SEQUENCE { + emStatusProbeNumber + INTEGER, + emStatusProbeName + DisplayString, + emStatusProbeStatus + INTEGER, + emStatusProbeCurrentTemp + INTEGER, + emStatusProbeTempUnits + INTEGER, + emStatusProbeCurrentHumid + INTEGER, + emStatusProbeHighTempViolation + INTEGER, + emStatusProbeLowTempViolation + INTEGER, + emStatusProbeHighHumidViolation + INTEGER, + emStatusProbeLowHumidViolation + INTEGER + } + +emStatusProbeNumber OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of the probe." + ::= { emStatusProbesEntry 1 } + +emStatusProbeName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A descriptive name for the probe set by the user, + possibly denoting its location or purpose." + ::= { emStatusProbesEntry 2 } + +emStatusProbeStatus OBJECT-TYPE + SYNTAX INTEGER { + disconnected(1), + connected(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The connected status of the probe, either + disconnected(1) or connected(2)." + ::= { emStatusProbesEntry 3 } + +emStatusProbeCurrentTemp OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The current temperature reading from the probe displayed + in the units shown in the 'emStatusProbeTempUnits' OID + (Celsius or Fahrenheit)." + ::= { emStatusProbesEntry 4 } + +emStatusProbeTempUnits OBJECT-TYPE + SYNTAX INTEGER { + celsius(1), + fahrenheit(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The temperature scale used to display the temperature + thresholds of the probe, Celsius(1) or Fahrenheit(2). + This setting is based on the system preferences + configuration in the agent." + ::= { emStatusProbesEntry 5 } + +emStatusProbeCurrentHumid OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The current humidity reading from the probe in + percent relative humidity." + ::= { emStatusProbesEntry 6 } + +emStatusProbeHighTempViolation OBJECT-TYPE + SYNTAX INTEGER { + noViolation(1), + highTempViolation(2), + disabled(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The high temperature violation status of the probe + temperature reading. This OID will show a highTempViolation(2) + if the current temperature reading shown in the + 'emStatusProbeCurrentTemp' OID is greater than or equal to + the high temperature threshold value, the + 'emConfigProbeHighTempThreshold' OID, and the value of the + 'emConfigProbeHighTempEnable' OID is enabled. Otherwise it will show + noViolation(1). If the 'emConfigProbeHighTempEnable' OID is disabled, + this OID will show disabled(3)." + ::= { emStatusProbesEntry 7 } + +emStatusProbeLowTempViolation OBJECT-TYPE + SYNTAX INTEGER { + noViolation(1), + lowTempViolation(2), + disabled(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The high temperature violation status of the probe + temperature reading. This OID will show a lowTempViolation(2) + if the current temperature reading shown in the + 'emStatusProbeCurrentTemp' OID is less than or equal to + the low temperature threshold value, the + 'emConfigProbeLowTempThreshold' OID, and the value of the + 'emConfigProbeLowTempEnable' OID is enabled. Otherwise it will show + noViolation(1). If the 'emConfigProbeLowTempEnable' OID is disabled, + this OID will show disabled(3)." + ::= { emStatusProbesEntry 8 } + +emStatusProbeHighHumidViolation OBJECT-TYPE + SYNTAX INTEGER { + noViolation(1), + highHumidViolation(2), + disabled(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The high humidity violation status of the probe humidity + reading. This OID will show a highTempViolation(2) + if the current humidity reading shown in the + 'emStatusProbeCurrentHumid' OID is greater than or equal to + the high humidity threshold value, the + 'emConfigProbeHighHumidThreshold' OID, and the value of the + 'emConfigProbeHighHumidEnable' OID is enabled. Otherwise it will + show noViolation(1). If the 'emConfigProbeHighHumidEnable' OID is + disabled, this OID will show disabled(3)" + ::= { emStatusProbesEntry 9 } + +emStatusProbeLowHumidViolation OBJECT-TYPE + SYNTAX INTEGER { + noViolation(1), + lowHumidViolation(2), + disabled(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The low humidity violation status of the probe humidity + reading. This OID will show a lowTempViolation(2) + if the current humidity reading shown in the + 'emStatusProbeCurrentHumid' OID is less than or equal to + the low humidity threshold value, the + 'emConfigProbeLowHumidThreshold' OID, and the value of the + 'emConfigProbeLowHumidEnable' OID is enabled. Otherwise it will + show noViolation(1). If the 'emConfigProbeLowHumidEnable' OID is + disabled, this OID will show disabled(3)." + ::= { emStatusProbesEntry 10 } + +emStatusContactsNumContacts OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of contacts supported by the + Environmental Monitor." + ::= { emStatus 4 } + +emStatusContactsTable OBJECT-TYPE + SYNTAX SEQUENCE OF EmStatusContactsEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of contacts supported by the Environmental Monitor + and their status." + ::= { emStatus 5 } + +emStatusContactsEntry OBJECT-TYPE + SYNTAX EmStatusContactsEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The status of the contact." + INDEX { emStatusContactNumber } + ::= { emStatusContactsTable 1 } + +EmStatusContactsEntry ::= + SEQUENCE { + emStatusContactNumber + INTEGER, + emStatusContactName + DisplayString, + emStatusContactStatus + INTEGER + } + +emStatusContactNumber OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of the Environmental Monitor contact." + ::= { emStatusContactsEntry 1 } + +emStatusContactName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A descriptive name for the Environmental Monitor contact + set by the user, possibly denoting its location or purpose." + ::= { emStatusContactsEntry 2 } + +emStatusContactStatus OBJECT-TYPE + SYNTAX INTEGER { + noFault(1), + fault(2), + disabled(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the Environmental Monitor contact. The status + will show noFault(1) if the contact is in the normal state + and the 'emConfigContactEnable' OID is enabled. The status will + show a fault(2) if the contact is faulted and the + 'emContactEnable' OID is enabled. If the 'emConfigContactEnable' + OID is disabled, the status will show disabled(3)." + ::= { emStatusContactsEntry 3 } + +-- Integrated Environmental Monitor (IEM) + +iemIdentHardwareRevision OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The hardware revision of the Integrated Environmental + Monitor." + ::= { iemIdent 1 } + +iemConfigProbesNumProbes OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of temperature and humidity probes available." + ::= { iemConfig 1 } + +iemConfigProbesTable OBJECT-TYPE + SYNTAX SEQUENCE OF IemConfigProbesEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of probes supported by the Environmental Monitor + and their configurations." + ::= { iemConfig 2 } + +iemConfigProbesEntry OBJECT-TYPE + SYNTAX IemConfigProbesEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The Environmental Monitor probe configurations." + INDEX { iemConfigProbeNumber } + ::= { iemConfigProbesTable 1 } + +IemConfigProbesEntry ::= + SEQUENCE { + iemConfigProbeNumber + INTEGER, + iemConfigProbeName + DisplayString, + iemConfigProbeHighTempThreshold + INTEGER, + iemConfigProbeLowTempThreshold + INTEGER, + iemConfigProbeTempUnits + INTEGER, + iemConfigProbeHighHumidThreshold + INTEGER, + iemConfigProbeLowHumidThreshold + INTEGER, + iemConfigProbeHighTempEnable + INTEGER, + iemConfigProbeLowTempEnable + INTEGER, + iemConfigProbeHighHumidEnable + INTEGER, + iemConfigProbeLowHumidEnable + INTEGER + } + +iemConfigProbeNumber OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to a Environmental Monitor probe entry." + ::= { iemConfigProbesEntry 1 } + +iemConfigProbeName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "A descriptive name for the probe set by the user, + possibly denoting its location or purpose." + ::= { iemConfigProbesEntry 2 } + +iemConfigProbeHighTempThreshold OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The high temperature alarm threshold for the probe. + Units are displayed in the scale selected in the + 'iemConfigProbeTempUnits' OID (Celsius or Fahrenheit)." + ::= { iemConfigProbesEntry 3 } + +iemConfigProbeLowTempThreshold OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The low temperature alarm threshold for the probe. + Units are displayed in the scale selected in the + 'iemConfigProbeTempUnits' OID (Celsius or Fahrenheit)." + ::= { iemConfigProbesEntry 4 } + +iemConfigProbeTempUnits OBJECT-TYPE + SYNTAX INTEGER { + celsius(1), + fahrenheit(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The temperature scale used to display the temperature + thresholds of the probe, Celsius(1) or Fahrenheit(2). + This setting is based on the system preferences + configuration in the agent." + ::= { iemConfigProbesEntry 5 } + +iemConfigProbeHighHumidThreshold OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The high humidity alarm threshold for the probe in + percent relative humidity." + ::= { iemConfigProbesEntry 6 } + +iemConfigProbeLowHumidThreshold OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The low humidity alarm threshold for the probe in + percent relative humidity." + ::= { iemConfigProbesEntry 7 } + +iemConfigProbeHighTempEnable OBJECT-TYPE + SYNTAX INTEGER { + disabled(1), + enabled(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The high temperature alarm enable/disable for the + probe. No alarm will be generated if this value + is set to disabled(1). The alarm will be + generated if this value is set to enabled(2) and + the threshold has been violated." + ::= { iemConfigProbesEntry 8 } + +iemConfigProbeLowTempEnable OBJECT-TYPE + SYNTAX INTEGER { + disabled(1), + enabled(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The low temperature alarm enable/disable for the + probe. No alarm will be generated if this value + is set to disabled(1). The alarm will be + generated if this value is set to enabled(2) and + the threshold has been violated." + ::= { iemConfigProbesEntry 9 } + +iemConfigProbeHighHumidEnable OBJECT-TYPE + SYNTAX INTEGER { + disabled(1), + enabled(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The high humidity alarm enable/disable for the + probe. No alarm will be generated if this value + is set to disabled(1). The alarm will be + generated if this value is set to enabled(2) and + the threshold has been violated." + ::= { iemConfigProbesEntry 10 } + +iemConfigProbeLowHumidEnable OBJECT-TYPE + SYNTAX INTEGER { + disabled(1), + enabled(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The low humidity alarm enable/disable for the + probe. No alarm will be generated if this value + is set to disabled(1). The alarm will be + generated if this value is set to enabled(2) and + the threshold has been violated." + ::= { iemConfigProbesEntry 11 } + +iemConfigContactsNumContacts OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of contacts available on the Environmental + Monitor." + ::= { iemConfig 3 } + +iemConfigContactsTable OBJECT-TYPE + SYNTAX SEQUENCE OF IemConfigContactsEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of contacts supported by the Environmental Monitor + and their configurations." + ::= { iemConfig 4 } + +iemConfigContactsEntry OBJECT-TYPE + SYNTAX IemConfigContactsEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The Environmental Monitor contact configurations." + INDEX { iemConfigContactNumber } + ::= { iemConfigContactsTable 1 } + +IemConfigContactsEntry ::= + SEQUENCE { + iemConfigContactNumber + INTEGER, + iemConfigContactName + DisplayString, + iemConfigContactEnable + INTEGER + } + +iemConfigContactNumber OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of an Environmental Monitor contact." + ::= { iemConfigContactsEntry 1 } + +iemConfigContactName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "A descriptive name for the Environmental Monitor contact + set by the user, possibly denoting its location or purpose." + ::= { iemConfigContactsEntry 2 } + +iemConfigContactEnable OBJECT-TYPE + SYNTAX INTEGER { + disabled(1), + enabled(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "An Environmental Monitor contact alarm enable/disable." + ::= { iemConfigContactsEntry 3 } + + +iemStatusProbesNumProbes OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of available probes on the Environmental + Monitor." + ::= { iemStatus 1 } + +iemStatusProbesTable OBJECT-TYPE + SYNTAX SEQUENCE OF IemStatusProbesEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of probes supported by the Environmental Monitor + and their status." + ::= { iemStatus 2 } + +iemStatusProbesEntry OBJECT-TYPE + SYNTAX IemStatusProbesEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The status of the probe." + INDEX { iemStatusProbeNumber } + ::= { iemStatusProbesTable 1 } + +IemStatusProbesEntry ::= + SEQUENCE { + iemStatusProbeNumber + INTEGER, + iemStatusProbeName + DisplayString, + iemStatusProbeStatus + INTEGER, + iemStatusProbeCurrentTemp + INTEGER, + iemStatusProbeTempUnits + INTEGER, + iemStatusProbeCurrentHumid + INTEGER, + iemStatusProbeHighTempViolation + INTEGER, + iemStatusProbeLowTempViolation + INTEGER, + iemStatusProbeHighHumidViolation + INTEGER, + iemStatusProbeLowHumidViolation + INTEGER + } + +iemStatusProbeNumber OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of the probe." + ::= { iemStatusProbesEntry 1 } + +iemStatusProbeName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A descriptive name for the probe set by the user, + denoting its location or purpose." + ::= { iemStatusProbesEntry 2 } + +iemStatusProbeStatus OBJECT-TYPE + SYNTAX INTEGER { + disconnected(1), + connected(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The connected status of the probe, either + disconnected(1) or connected(2)." + ::= { iemStatusProbesEntry 3 } + +iemStatusProbeCurrentTemp OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The current temperature reading from the probe displayed + in the units shown in the 'iemStatusProbeTempUnits' OID + (Celsius or Fahrenheit)." + ::= { iemStatusProbesEntry 4 } + +iemStatusProbeTempUnits OBJECT-TYPE + SYNTAX INTEGER { + celsius(1), + fahrenheit(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The temperature scale used to display the temperature + thresholds of the probe, Celsius(1) or Fahrenheit(2). + This setting is based on the system preferences + configuration in the agent." + ::= { iemStatusProbesEntry 5 } + +iemStatusProbeCurrentHumid OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The current humidity reading from the probe in percent + relative humidity." + ::= { iemStatusProbesEntry 6 } + +iemStatusProbeHighTempViolation OBJECT-TYPE + SYNTAX INTEGER { + noViolation(1), + highTempViolation(2), + disabled(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The high temperature violation status of the probe + temperature reading. This OID will show a highTempViolation(2) + if the current temperature reading shown in the + 'iemStatusProbeCurrentTemp' OID is greater than or equal to + the high temperature threshold value, the + 'iemConfigProbeHighTempThreshold' OID, and the value of the + 'iemConfigProbeHighTempEnable' OID is enabled. Otherwise it will show + noViolation(1). If the 'iemConfigProbeHighTempEnable' OID is disabled, + this OID will show disabled(3)." + ::= { iemStatusProbesEntry 7 } + +iemStatusProbeLowTempViolation OBJECT-TYPE + SYNTAX INTEGER { + noViolation(1), + lowTempViolation(2), + disabled(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The high temperature violation status of the probe + temperature reading. This OID will show a lowTempViolation(2) + if the current temperature reading shown in the + 'iemStatusProbeCurrentTemp' OID is less than or equal to + the low temperature threshold value, the + 'iemConfigProbeLowTempThreshold' OID, and the value of the + 'iemPConfigrobeLowTempEnable' OID is enabled. Otherwise it will show + noViolation(1). If the 'iemConfigProbeLowTempEnable' OID is disabled, + this OID will show disabled(3)." + ::= { iemStatusProbesEntry 8 } + +iemStatusProbeHighHumidViolation OBJECT-TYPE + SYNTAX INTEGER { + noViolation(1), + highHumidViolation(2), + disabled(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The high humidity violation status of the probe humidity + reading. This OID will show a highTempViolation(2) + if the current humidity reading shown in the + 'iemStatusProbeCurrentHumid' OID is greater than or equal to + the high humidity threshold value, the + 'iemConfigProbeHighHumidThreshold' OID, and the value of the + 'iemConfigProbeHighHumidEnable' OID is enabled. Otherwise it will + show noViolation(1). If the 'iemConfigProbeHighHumidEnable' OID is + disabled, this OID will show disabled(3)." + ::= { iemStatusProbesEntry 9 } + +iemStatusProbeLowHumidViolation OBJECT-TYPE + SYNTAX INTEGER { + noViolation(1), + lowHumidViolation(2), + disabled(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The low humidity violation status of the probe humidity + reading. This OID will show a lowTempViolation(2) + if the current humidity reading shown in the + 'iemStatusProbeCurrentHumid' OID is less than or equal to + the low humidity threshold value, the + 'iemConfigProbeLowHumidThreshold' OID, and the value of the + 'iemConfigProbeLowHumidEnable' OID is enabled. Otherwise it will + show noViolation(1). If the 'iemConfigProbeLowHumidEnable' OID is + disabled, this OID will show disabled(3)." + ::= { iemStatusProbesEntry 10 } + +iemStatusContactsNumContacts OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of contacts supported on the + Environmental Monitor." + ::= { iemStatus 3 } + +iemStatusContactsTable OBJECT-TYPE + SYNTAX SEQUENCE OF IemStatusContactsEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of contacts supported by the Environmental Monitor + and their status." + ::= { iemStatus 4 } + +iemStatusContactsEntry OBJECT-TYPE + SYNTAX IemStatusContactsEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The status of the contact." + INDEX { iemStatusContactNumber } + ::= { iemStatusContactsTable 1 } + +IemStatusContactsEntry ::= + SEQUENCE { + iemStatusContactNumber + INTEGER, + iemStatusContactName + DisplayString, + iemStatusContactStatus + INTEGER + } + +iemStatusContactNumber OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of the Environmental Monitor contact." + ::= { iemStatusContactsEntry 1 } + +iemStatusContactName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A descriptive name for the Environmental Monitor contact + set by the user, denoting its location or purpose." + ::= { iemStatusContactsEntry 2 } + +iemStatusContactStatus OBJECT-TYPE + SYNTAX INTEGER { + noFault(1), + fault(2), + disabled(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the Environmental Monitor contact. The status + will show noFault(1) if the contact is in the normal state + and the 'iemConfigContactEnable' OID is enabled. The status will + show a fault(2) if the contact is faulted and the + 'iemConfigContactEnable' OID is enabled. If the + 'iemConfigContactEnable' OID is disabled, the status will show + disabled(3)." + ::= { iemStatusContactsEntry 3 } + +iemStatusRelaysNumRelays OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of output relays supported on the + Environmental Monitor." + ::= { iemStatus 6 } + +iemStatusRelaysTable OBJECT-TYPE + SYNTAX SEQUENCE OF IemStatusRelaysEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of output relays supported by the + Environmental Monitor and their status." + ::= { iemStatus 7 } + +iemStatusRelaysEntry OBJECT-TYPE + SYNTAX IemStatusRelaysEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The status of the relay." + INDEX { iemStatusRelayNumber } + ::= { iemStatusRelaysTable 1 } + +IemStatusRelaysEntry ::= + SEQUENCE { + iemStatusRelayNumber + INTEGER, + iemStatusRelayName + DisplayString, + iemStatusRelayStatus + INTEGER + } + +iemStatusRelayNumber OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of the output relay." + ::= { iemStatusRelaysEntry 1 } + +iemStatusRelayName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A descriptive name for the output relay set by the + user, denoting its location or purpose." + ::= { iemStatusRelaysEntry 2 } + +iemStatusRelayStatus OBJECT-TYPE + SYNTAX INTEGER { + faultState(1), + normalState(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the output relay, either faultState(1) or + normalState(2)." + ::= { iemStatusRelaysEntry 3 } + +-- Environmental Management System (EMS) + +-- EMS IDENT + +emsIdentEMSName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the + device. " + ::= { emsIdent 1 } + +emsIdentProductNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the model number of + the device. This value is set at the factory." + ::= { emsIdent 2 } + +emsIdentFirmwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The firmware revision of the device." + ::= { emsIdent 3 } + +emsIdentHardwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The hardware revision of the device. + This value is set at the factory." + ::= { emsIdent 4 } + +emsIdentDateOfManufacture OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The date when the device was manufactured in mm/dd/yyyy format. + This value is set at the factory. " + ::= { emsIdent 5 } + +emsIdentSerialNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the serial number of + the device. This value is set at the factory." + ::= { emsIdent 6 } + +-- EMS CONTROL + +-- EMS OUTPUT RELAY CONTROL STATUS TABLE + +emsOutputRelayControlTable OBJECT-TYPE + SYNTAX SEQUENCE OF OutputRelayControlEMSEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for control of individual output relays. The number of + entries is contained in the emsStatusOutputRelayCount OID." + ::= { emsOutputRelayControl 1 } + +emsOutputRelayControlEntry OBJECT-TYPE + SYNTAX OutputRelayControlEMSEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The output relays to control." + INDEX { emsOutputRelayControlOutputRelayIndex } + ::= { emsOutputRelayControlTable 1 } + +OutputRelayControlEMSEntry ::= + SEQUENCE { + emsOutputRelayControlOutputRelayIndex INTEGER, + emsOutputRelayControlOutputRelayName DisplayString, + emsOutputRelayControlOutputRelayCommand INTEGER + } + +emsOutputRelayControlOutputRelayIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the output relay entry." + ::= { emsOutputRelayControlEntry 1 } + +emsOutputRelayControlOutputRelayName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the output relay. + This OID is provided for informational purposes only." + ::= { emsOutputRelayControlEntry 2 } + +emsOutputRelayControlOutputRelayCommand OBJECT-TYPE + SYNTAX INTEGER { + immediateCloseEMS (1), + immediateOpenEMS (2) + } + + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Getting this variable will return the output relay state. If + the output relay is closed, the immediateCloseEMS (1) value will be returned. + If the output relay is open, the immediateOpenEMS (2) value will be + returned. + + Setting this variable to immediateCloseEMS (1) will immediately close the relay. + + Setting this variable to immediateOpenEMS (2) will immediately open the relay." + ::= { emsOutputRelayControlEntry 3 } + +-- EMS OUTLET CONTROL TABLE + +emsOutletControlTable OBJECT-TYPE + SYNTAX SEQUENCE OF OutletControlEMSEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for control of individual outlet switches. The number of + entries is contained in the emsStatusOutletCount OID." + ::= { emsOutletControl 1 } + +emsOutletControlEntry OBJECT-TYPE + SYNTAX OutletControlEMSEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The outlets to control." + INDEX { emsOutletControlOutletIndex } + ::= { emsOutletControlTable 1 } + +OutletControlEMSEntry ::= + SEQUENCE { + emsOutletControlOutletIndex INTEGER, + emsOutletControlOutletName DisplayString, + emsOutletControlOutletCommand INTEGER + } + +emsOutletControlOutletIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the outlet entry." + ::= { emsOutletControlEntry 1 } + +emsOutletControlOutletName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the outlet. + This OID is provided for informational purposes only." + ::= { emsOutletControlEntry 2 } + +emsOutletControlOutletCommand OBJECT-TYPE + SYNTAX INTEGER { + immediateOnEMS (1), + immediateOffEMS (2) + } + + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Getting this variable will return the outlet state. If + the outlet is on, the immediateOnEMS (1) value will be returned. + If the outlet is off, the immediateOffEMS (2) value will be + returned. + + Setting this variable to immediateOnEMS (1) will immediately turn the outlet on. + + Setting this variable to immediateOffEMS (2) will immediately turn the outlet off." + ::= { emsOutletControlEntry 3 } + +-- EMS SENSOR CONTROL TABLE + +emsSensorControlTable OBJECT-TYPE + SYNTAX SEQUENCE OF EMSSensorControlEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for control/reset of individual sensors. The number of + entries is contained in the emsStatusSensorCount OID." + ::= { emsSensorControl 1 } + +emsSensorControlEntry OBJECT-TYPE + SYNTAX EMSSensorControlEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The sensors to control/reset." + INDEX { emsSensorControlSensorIndex } + ::= { emsSensorControlTable 1 } + +EMSSensorControlEntry ::= + SEQUENCE { + emsSensorControlSensorIndex INTEGER, + emsSensorControlSensorSystemName DisplayString, + emsSensorControlSensorUserName DisplayString, + emsSensorControlSensorCommand INTEGER + } + +emsSensorControlSensorIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the sensor entry." + ::= { emsSensorControlEntry 1 } + +emsSensorControlSensorSystemName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system name of the sensor. This describes the hardware system + intent of this sensor." + ::= { emsSensorControlEntry 2 } + +emsSensorControlSensorUserName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the sensor as given by the system user." + ::= { emsSensorControlEntry 3 } + +emsSensorControlSensorCommand OBJECT-TYPE + SYNTAX INTEGER { + noCommandEMS (1), + resetCommandEMS (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Getting this variable will return noCommandEMS(1). + + Setting this variable to resetCommandEMS(2) will issue a reset command to the + sensor. Some sensors cannot be manually reset and will not be affected + by this command." + ::= { emsSensorControlEntry 4 } + +-- EMS ALARM DEVICE CONTROL TABLE + +emsAlarmDeviceControlTable OBJECT-TYPE + SYNTAX SEQUENCE OF AlarmDeviceControlEMSEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for control of individual alarm devices. + Note: Some alarm devices are not controllable. The number of + entries is contained in the emsStatusAlarmDeviceCount OID." + ::= { emsAlarmDeviceControl 1 } + +emsAlarmDeviceControlEntry OBJECT-TYPE + SYNTAX AlarmDeviceControlEMSEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The alarm devices to control." + INDEX { emsAlarmDeviceControlDeviceIndex } + ::= { emsAlarmDeviceControlTable 1 } + +AlarmDeviceControlEMSEntry ::= + SEQUENCE { + emsAlarmDeviceControlDeviceIndex INTEGER, + emsAlarmDeviceControlDeviceName DisplayString, + emsAlarmDeviceControlDeviceCommand INTEGER + } + +emsAlarmDeviceControlDeviceIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the alarm device entry." + ::= { emsAlarmDeviceControlEntry 1 } + +emsAlarmDeviceControlDeviceName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the alarm device. + This OID is provided for informational purposes only." + ::= { emsAlarmDeviceControlEntry 2 } + +emsAlarmDeviceControlDeviceCommand OBJECT-TYPE + SYNTAX INTEGER { + alarmDeviceOnEMS (1), + alarmDeviceOffEMS (2), + alarmDeviceNotInstalledEMS (3) + } + + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Getting this variable will return the device state. If + the device is active, the alarmDeviceOnEMS (1) value will be returned. + If the device is inactive, the alarmDeviceOffEMS (2) value will be + returned. If the device is not installed, the + alarmDeviceNotInstalledEMS (3) value will be returned. + + Actions resulting from setting this variable are device-dependent. + + Setting this variable to alarmDeviceOnEMS (1) will turn that device (ex. Beacon) on. + Setting this variable to alarmDeviceOffEMS (2) will turn that device off." + + ::= { emsAlarmDeviceControlEntry 3 } + + +-- EMS CONFIG + +emsConfigName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the device." + ::= { emsConfig 1 } + +emsConfigCheckLogLight OBJECT-TYPE + SYNTAX INTEGER { + lightDisabled (1), + lightOnInformational (2), + lightOnWarning (3), + lightOnSevere (4) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The setting of this OID determines the level of event that will + trigger the check-log light on the EMS. This is not available on the EMU2. + + lightDisabled (1) disables the check-log light. + lightOnInformational (2) lights check-log for any event of + informational severity or above. + lightOnWarning (3) lights check-log for any event of + warning severity or above. + lightOnSevere (4) lights check-log for any event of severe severity." + + ::= { emsConfig 2 } + +-- EMS PROBE CONFIG TABLE + +emsProbeConfigTable OBJECT-TYPE + SYNTAX SEQUENCE OF EMSProbeConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for configuration of individual probes. The number of + entries is contained in the emsStatusProbeCount OID." + ::= { emsProbeConfig 1 } + +emsProbeConfigEntry OBJECT-TYPE + SYNTAX EMSProbeConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The probes to configure." + INDEX { emsProbeConfigProbeIndex } + ::= { emsProbeConfigTable 1 } + +EMSProbeConfigEntry ::= + SEQUENCE { + emsProbeConfigProbeIndex INTEGER, + emsProbeConfigProbeName DisplayString, + emsProbeConfigProbeHighTempThresh INTEGER, + emsProbeConfigProbeLowTempThresh INTEGER, + emsProbeConfigProbeHighHumidityThresh INTEGER, + emsProbeConfigProbeLowHumidityThresh INTEGER, + emsProbeConfigProbeMaxTempThresh INTEGER, + emsProbeConfigProbeMinTempThresh INTEGER, + emsProbeConfigProbeDeltaTemp INTEGER, + emsProbeConfigProbeMaxHumidityThresh INTEGER, + emsProbeConfigProbeMinHumidityThresh INTEGER, + emsProbeConfigProbeDeltaHumidity INTEGER, + emsProbeConfigProbeSTIncTempVariance INTEGER, + emsProbeConfigProbeSTIncTempTime INTEGER, + emsProbeConfigProbeSTDecTempVariance INTEGER, + emsProbeConfigProbeSTDecTempTime INTEGER, + emsProbeConfigProbeLTIncTempVariance INTEGER, + emsProbeConfigProbeLTIncTempTime INTEGER, + emsProbeConfigProbeLTDecTempVariance INTEGER, + emsProbeConfigProbeLTDecTempTime INTEGER + } + +emsProbeConfigProbeIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the probe entry." + ::= { emsProbeConfigEntry 1 } + +emsProbeConfigProbeName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the probe." + ::= { emsProbeConfigEntry 2 } + +emsProbeConfigProbeHighTempThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Probe high temperature threshold. + + Values are represented in whole number degrees. + Units are displayed in the scale shown in + the emsStatusSysTempUnits OID (Celsius or Fahrenheit)." + ::= { emsProbeConfigEntry 3 } + +emsProbeConfigProbeLowTempThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Probe low temperature threshold. + + Values are represented in whole number degrees. + Units are displayed in the scale shown in + the emsStatusSysTempUnits OID (Celsius or Fahrenheit)." + ::= { emsProbeConfigEntry 4 } + +emsProbeConfigProbeHighHumidityThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Probe high humidity threshold. + + Values are represented in whole number percentage." + ::= { emsProbeConfigEntry 5 } + +emsProbeConfigProbeLowHumidityThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Probe low humidity threshold. + + Values are represented in whole number percentage." + ::= { emsProbeConfigEntry 6 } + +emsProbeConfigProbeMaxTempThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Probe maximum temperature threshold. + + Values are represented in whole number degrees. + Units are displayed in the scale shown in + the emsStatusSysTempUnits OID (Celsius or Fahrenheit)." + ::= { emsProbeConfigEntry 7 } + +emsProbeConfigProbeMinTempThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Probe minimum temperature threshold. + + Values are represented in whole number degrees. + Units are displayed in the scale shown in + the emsStatusSysTempUnits OID (Celsius or Fahrenheit)." + ::= { emsProbeConfigEntry 8 } + +emsProbeConfigProbeDeltaTemp OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Probe delta temperature. + + Values are represented in whole number degrees. + Units are displayed in the scale shown in + the emsStatusSysTempUnits OID (Celsius or Fahrenheit)." + ::= { emsProbeConfigEntry 9 } + +emsProbeConfigProbeMaxHumidityThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Probe maximum humidity threshold. + + Values are represented in whole number percentage." + ::= { emsProbeConfigEntry 10 } + +emsProbeConfigProbeMinHumidityThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Probe minimum humidity threshold. + + Values are represented in whole number percentage." + ::= { emsProbeConfigEntry 11 } + +emsProbeConfigProbeDeltaHumidity OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Probe delta humidity. + + Values are represented in whole number percentage." + ::= { emsProbeConfigEntry 12 } + +emsProbeConfigProbeSTIncTempVariance OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Probe short-term increasing temperature variance used for rate of change alarms. + + Values are represented in whole number degrees. + Units are displayed in the scale shown in + the emsStatusSysTempUnits OID (Celsius or Fahrenheit)." + ::= { emsProbeConfigEntry 13 } + +emsProbeConfigProbeSTIncTempTime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Probe short-term increasing temperature time used for rate of change alarms. + + Values are represented in whole number minutes." + ::= { emsProbeConfigEntry 14 } + +emsProbeConfigProbeSTDecTempVariance OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Probe short-term decreasing temperature variance used for rate of change alarms. + + Values are represented in whole number degrees. + Units are displayed in the scale shown in + the emsStatusSysTempUnits OID (Celsius or Fahrenheit)." + ::= { emsProbeConfigEntry 15 } + +emsProbeConfigProbeSTDecTempTime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Probe short-term decreasing temperature time used for rate of change alarms. + + Values are represented in whole number minutes." + ::= { emsProbeConfigEntry 16 } + +emsProbeConfigProbeLTIncTempVariance OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Probe long-term increasing temperature variance used for rate of change alarms. + + Values are represented in whole number degrees. + Units are displayed in the scale shown in + the emsStatusSysTempUnits OID (Celsius or Fahrenheit)." + ::= { emsProbeConfigEntry 17 } + +emsProbeConfigProbeLTIncTempTime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Probe long-term increasing temperature time used for rate of change alarms. + + Values are represented in whole number hours." + ::= { emsProbeConfigEntry 18 } + +emsProbeConfigProbeLTDecTempVariance OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Probe long-term decreasing temperature variance used for rate of change alarms. + + Values are represented in whole number degrees. + Units are displayed in the scale shown in + the emsStatusSysTempUnits OID (Celsius or Fahrenheit)." + ::= { emsProbeConfigEntry 19 } + +emsProbeConfigProbeLTDecTempTime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Probe long-term decreasing temperature time used for rate of change alarms. + + Values are represented in whole number hours." + ::= { emsProbeConfigEntry 20 } + + +-- EMS INPUT CONTACT CONFIG STATUS TABLE + +emsInputContactConfigTable OBJECT-TYPE + SYNTAX SEQUENCE OF EMSInputContactConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for configuration of individual input contacts. The number of + entries is contained in the emsStatusInputContactCount OID." + ::= { emsInputContactConfig 1 } + +emsInputContactConfigEntry OBJECT-TYPE + SYNTAX EMSInputContactConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The input contacts to configure." + INDEX { emsInputContactConfigInputContactIndex } + ::= { emsInputContactConfigTable 1 } + +EMSInputContactConfigEntry ::= + SEQUENCE { + emsInputContactConfigInputContactIndex INTEGER, + emsInputContactConfigInputContactName DisplayString, + emsInputContactConfigInputContactNormalState INTEGER + } + +emsInputContactConfigInputContactIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the input contact entry." + ::= { emsInputContactConfigEntry 1 } + +emsInputContactConfigInputContactName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the input contact." + ::= { emsInputContactConfigEntry 2 } + +emsInputContactConfigInputContactNormalState OBJECT-TYPE + SYNTAX INTEGER { + normallyClosedEMS (1), + normallyOpenEMS (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Getting this variable will return the normal state of the input contact. If + the normal state is closed, the normallyClosedEMS (1) value will be returned. + If the normal state is closed, the normallyOpenEMS (2) value will be + returned. + + Setting this variable will change the normal state of the input contact" + ::= { emsInputContactConfigEntry 3 } + +-- EMS OUTPUT RELAY CONFIG STATUS TABLE + +emsOutputRelayConfigTable OBJECT-TYPE + SYNTAX SEQUENCE OF EMSOutputRelayConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for configuration of individual output relays. The number of + entries is contained in the emsStatusOutputRelayCount OID." + ::= { emsOutputRelayConfig 1 } + +emsOutputRelayConfigEntry OBJECT-TYPE + SYNTAX EMSOutputRelayConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The output relays to configure." + INDEX { emsOutputRelayConfigOutputRelayIndex } + ::= { emsOutputRelayConfigTable 1 } + +EMSOutputRelayConfigEntry ::= + SEQUENCE { + emsOutputRelayConfigOutputRelayIndex INTEGER, + emsOutputRelayConfigOutputRelayName DisplayString, + emsOutputRelayConfigOutputRelayNormalState INTEGER + } + +emsOutputRelayConfigOutputRelayIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the output relay entry." + ::= { emsOutputRelayConfigEntry 1 } + +emsOutputRelayConfigOutputRelayName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the output relay." + ::= { emsOutputRelayConfigEntry 2 } + +emsOutputRelayConfigOutputRelayNormalState OBJECT-TYPE + SYNTAX INTEGER { + normallyClosedEMS (1), + normallyOpenEMS (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Getting this variable will return the normal state of the output relay. If + the normal state is closed, the normallyClosedEMS (1) value will be returned. + If the normal state is closed, the normallyOpenEMS (2) value will be + returned. + + Setting this variable will change the normal state of the output relay" + ::= { emsOutputRelayConfigEntry 3 } + +-- EMS OUTLET CONFIG TABLE + +emsOutletConfigTable OBJECT-TYPE + SYNTAX SEQUENCE OF EMSOutletConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for configuration of individual outlets. The number of + entries is contained in the emsStatusOutletCount OID." + ::= { emsOutletConfig 1 } + +emsOutletConfigEntry OBJECT-TYPE + SYNTAX EMSOutletConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The outlets to configure." + INDEX { emsOutletConfigOutletIndex } + ::= { emsOutletConfigTable 1 } + +EMSOutletConfigEntry ::= + SEQUENCE { + emsOutletConfigOutletIndex INTEGER, + emsOutletConfigOutletName DisplayString, + emsOutletConfigOutletNormalState INTEGER + } + +emsOutletConfigOutletIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the outlet entry." + ::= { emsOutletConfigEntry 1 } + +emsOutletConfigOutletName OBJECT-TYPE + SYNTAX DisplayString ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the outlet." + ::= { emsOutletConfigEntry 2 } + +emsOutletConfigOutletNormalState OBJECT-TYPE + SYNTAX INTEGER { + normallyOnEMS (1), + normallyOffEMS (2) + } + + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Getting this variable will return the normal state of the outlet. If + the normal state is on, the normallyOnEMS (1) value will be returned. + If the normal state is off, the normallyOffEMS (2) value will be + returned. + + Setting this variable will change the normal state of the outlet" + ::= { emsOutletConfigEntry 3 } + +-- EMS SENSOR CONFIG TABLE + +emsSensorConfigTable OBJECT-TYPE + SYNTAX SEQUENCE OF EMSSensorConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for configuration of individual sensors. The number of + entries is contained in the emsStatusSensorCount OID." + ::= { emsSensorConfig 1 } + +emsSensorConfigEntry OBJECT-TYPE + SYNTAX EMSSensorConfigEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The sensors to configure." + INDEX { emsSensorConfigSensorIndex } + ::= { emsSensorConfigTable 1 } + +EMSSensorConfigEntry ::= + SEQUENCE { + emsSensorConfigSensorIndex INTEGER, + emsSensorConfigSensorSystemName DisplayString, + emsSensorConfigSensorUserName DisplayString, + emsSensorConfigSensorNormalState INTEGER, + emsSensorConfigSensorAlarmDelay INTEGER + } + +emsSensorConfigSensorIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the sensor entry." + ::= { emsSensorConfigEntry 1 } + +emsSensorConfigSensorSystemName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system name of the sensor. This describes the hardware system + intent of this sensor." + ::= { emsSensorConfigEntry 2 } + +emsSensorConfigSensorUserName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the sensor as given by the system user." + ::= { emsSensorConfigEntry 3 } + +emsSensorConfigSensorNormalState OBJECT-TYPE + SYNTAX INTEGER { + normallyClosedEMS (1), + normallyOpenEMS (2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Getting this variable will return the normal state of the sensor. If + the normal state is closed, the normallyClosedEMS (1) value will be returned. + If the normal state is closed, the normallyOpenEMS (2) value will be + returned. + + Setting this variable will change the normal state of the sensor. Note: + Only the AUX sensor in the EMS has a configurable Normal State" + ::= { emsSensorConfigEntry 4 } + +emsSensorConfigSensorAlarmDelay OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The delay (in seconds) after a sensor detects an alarm condition before the + condition is reported." + ::= { emsSensorConfigEntry 5 } + +-- EMS STATUS +--- EMS MASTER status + +emsStatusEMSName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the + device. " + ::= { emsStatus 1 } + +emsStatusCommStatus OBJECT-TYPE + SYNTAX INTEGER { + noComm(1), + comm(2), + commLost(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The communication status between the agent + and the device. + + noComm(1), Communication has never been established. + comm(2), Communication has been established. + commLost(3), Communication was established, but was lost." + ::= { emsStatus 2 } + +emsStatusProbeCount OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The total number of T/H probes (both local and remote) that + is supported by this device." + ::= { emsStatus 3 } + +emsStatusInputContactCount OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The total number of Input Contacts that + is supported by this device." + ::= { emsStatus 4 } + +emsStatusOutputRelayCount OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The total number of Output Relays that + is supported by this device." + ::= { emsStatus 5 } + +emsStatusOutletCount OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The total number of AC Outlets that + is supported by this device." + ::= { emsStatus 6 } + +emsStatusSensorCount OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The total number of Sensors that + is supported by this device." + ::= { emsStatus 7 } + +emsStatusAlinkAruDeviceCount OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The total number of remote Aru's supported by this device." + ::= { emsStatus 8 } + +emsStatusAlinkProbeDeviceCount OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The total number of remote T/H probes supported by this device." + ::= { emsStatus 9 } + +emsStatusAlarmDeviceCount OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of alarm devices supported by this device." + ::= { emsStatus 10 } + +emsStatusSysTempUnits OBJECT-TYPE + SYNTAX INTEGER { + celsius(1), + fahrenheit(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The temperature scale used to display the temperature + in the system, Celsius(1) or Fahrenheit(2). + This setting is based on the system preferences + configuration in the agent." + ::= { emsStatus 11 } + +emsStatusCheckLogLight OBJECT-TYPE + SYNTAX INTEGER { + lightOff (1), + lightOn (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the check-log light on the device. + For the EMU2, this will always indicate lightOff(1). + + lightOff (1) indicates the light is off (no new log entries). + lightOn (2) indicates the light is on (new log entries present)." + + ::= { emsStatus 12 } + +emsStatusHardwareStatus OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the EMS hardware. This integer should be interpreted + as a bit map, with each bit representing the presence or absence of + a specific hardware error condition. + + 0 indicates there are no error conditions detected in the EMS hardware. + 1 indicates a Current Limit error condition related to the Alink port. + 2 indicates incorrect hardware is plugged into an EMS port. + 3 indicates that both of these error conditions are present." + + ::= { emsStatus 13 } + +-- EMS PROBE STATUS TABLE + +emsProbeStatusTable OBJECT-TYPE + SYNTAX SEQUENCE OF EMSProbeStatusEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for access of individual probes. The number of + entries is contained in the emsStatusProbeCount OID." + ::= { emsProbeStatus 1 } + +emsProbeStatusEntry OBJECT-TYPE + SYNTAX EMSProbeStatusEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The probes to access." + INDEX { emsProbeStatusProbeIndex } + ::= { emsProbeStatusTable 1 } + +EMSProbeStatusEntry ::= + SEQUENCE { + emsProbeStatusProbeIndex INTEGER, + emsProbeStatusProbeName DisplayString, + emsProbeStatusProbeTemperature INTEGER, + emsProbeStatusProbeHighTempThresh INTEGER, + emsProbeStatusProbeLowTempThresh INTEGER, + emsProbeStatusProbeHumidity INTEGER, + emsProbeStatusProbeHighHumidityThresh INTEGER, + emsProbeStatusProbeLowHumidityThresh INTEGER, + emsProbeStatusProbeSerialNumber DisplayString, + emsProbeStatusProbeCommStatus INTEGER, + emsProbeStatusProbeAlarmStatus INTEGER, + emsProbeStatusProbeMaxTempThresh INTEGER, + emsProbeStatusProbeMinTempThresh INTEGER, + emsProbeStatusProbeMaxHumidityThresh INTEGER, + emsProbeStatusProbeMinHumidityThresh INTEGER + } + +emsProbeStatusProbeIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the probe entry." + ::= { emsProbeStatusEntry 1 } + +emsProbeStatusProbeName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the probe." + ::= { emsProbeStatusEntry 2 } + +emsProbeStatusProbeTemperature OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Probe temperature reading. + + Values are represented in whole number degrees. + Units are displayed in the scale shown in + the emsStatusSysTempUnits OID (Celsius or Fahrenheit)." + ::= { emsProbeStatusEntry 3 } + +emsProbeStatusProbeHighTempThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Probe high temperature threshold. + + Values are represented in whole number degrees. + Units are displayed in the scale shown in + the emsStatusSysTempUnits OID (Celsius or Fahrenheit)." + ::= { emsProbeStatusEntry 4 } + +emsProbeStatusProbeLowTempThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Probe low temperature threshold. + + Values are represented in whole number degrees. + Units are displayed in the scale shown in + the emsStatusSysTempUnits OID (Celsius or Fahrenheit)." + ::= { emsProbeStatusEntry 5 } + +emsProbeStatusProbeHumidity OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Probe humidity reading. + + Values are represented in whole number percentage." + ::= { emsProbeStatusEntry 6 } + +emsProbeStatusProbeHighHumidityThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Probe high humidity threshold. + + Values are represented in whole number percentage." + ::= { emsProbeStatusEntry 7 } + +emsProbeStatusProbeLowHumidityThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Probe low humidity threshold. + + Values are represented in whole number percentage." + ::= { emsProbeStatusEntry 8 } + +emsProbeStatusProbeSerialNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A label indicating the type (Local[L] or Remote[R]) and Number + of the probe. For example, the first local probe would be L1 and + the third remote probe would be R3." + ::= { emsProbeStatusEntry 9 } + +emsProbeStatusProbeCommStatus OBJECT-TYPE + SYNTAX INTEGER { + commsNeverDiscovered(1), + commsEstablished(2), + commsLost(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + " The state of communications to the probe. + commNeverDiscovered(1) indicates there has never been communications with this device. + commsEstablished(2) indicates communication is normal and active with this device. + commsLost(3) indicates communication had been established, but is no longer." + ::= { emsProbeStatusEntry 10 } + +emsProbeStatusProbeAlarmStatus OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The alarm status of the probe. This integer should be interpreted + as a bit map, with each bit representing the presence or absence of + the specific alarm conditions listed below. The bit will be '1' if + the condition is present, and '0' if the condition is not present. + + Bit Hex. Value Description + 1 0x0001 Maximum temperature exceeded. + 2 0x0002 High temperature exceeded. + 3 0x0004 Low temperature exceeded. + 4 0x0008 Minimum temperature exceeded. + 5 0x0010 Short-term increasing temperature rate exceeded. + 6 0x0020 Short-term decreasing temperature rate exceeded. + 7 0x0040 Long-term increasing temperature rate exceeded. + 8 0x0080 Long-term decreasing temperature rate exceeded. + 9 0x0100 Maximum humidity exceeded. + 10 0x0200 High humidity exceeded. + 11 0x0400 Low humidity exceeded. + 12 0x0800 Minimum humidity exceeded." + ::= { emsProbeStatusEntry 11 } + +emsProbeStatusProbeMaxTempThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Probe maximum temperature threshold. + + Values are represented in whole number degrees. + Units are displayed in the scale shown in + the emsStatusSysTempUnits OID (Celsius or Fahrenheit)." + ::= { emsProbeStatusEntry 12 } + +emsProbeStatusProbeMinTempThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Probe minimum temperature threshold. + + Values are represented in whole number degrees. + Units are displayed in the scale shown in + the emsStatusSysTempUnits OID (Celsius or Fahrenheit)." + ::= { emsProbeStatusEntry 13 } + +emsProbeStatusProbeMaxHumidityThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Probe maximum humidity threshold. + + Values are represented in whole number percentage." + ::= { emsProbeStatusEntry 14 } + +emsProbeStatusProbeMinHumidityThresh OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Probe minimum humidity threshold. + + Values are represented in whole number percentage." + ::= { emsProbeStatusEntry 15 } + + +-- EMS INPUT CONTACT STATUS TABLE + +emsInputContactStatusTable OBJECT-TYPE + SYNTAX SEQUENCE OF EMSInputContactStatusEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for access of individual input contacts. The number of + entries is contained in the emsStatusInputContactCount OID." + ::= { emsInputContactStatus 1 } + +emsInputContactStatusEntry OBJECT-TYPE + SYNTAX EMSInputContactStatusEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The input contacts to access." + INDEX { emsInputContactStatusInputContactIndex } + ::= { emsInputContactStatusTable 1 } + +EMSInputContactStatusEntry ::= + SEQUENCE { + emsInputContactStatusInputContactIndex INTEGER, + emsInputContactStatusInputContactName DisplayString, + emsInputContactStatusInputContactState INTEGER, + emsInputContactStatusInputContactNormalState INTEGER + } + +emsInputContactStatusInputContactIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the input contact entry." + ::= { emsInputContactStatusEntry 1 } + +emsInputContactStatusInputContactName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the input contact." + ::= { emsInputContactStatusEntry 2 } + +emsInputContactStatusInputContactState OBJECT-TYPE + SYNTAX INTEGER { + contactClosedEMS (1), + contactOpenEMS (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this variable will return the state of the input contact. If + the input contact is closed, the contactClosedEMS (1) value will be returned. + If the input contact state is open, the contactOpenEMS (2) value will be + returned. " + + ::= { emsInputContactStatusEntry 3 } + +emsInputContactStatusInputContactNormalState OBJECT-TYPE + SYNTAX INTEGER { + normallyClosedEMS (1), + normallyOpenEMS (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this variable will return the normal state of the input contact. If + the normal state is closed, the normallyClosedEMS (1) value will be returned. + If the normal state is open, the normallyOpenEMS (2) value will be + returned. " + + ::= { emsInputContactStatusEntry 4 } + + +-- EMS OUTPUT RELAY STATUS TABLE + +emsOutputRelayStatusTable OBJECT-TYPE + SYNTAX SEQUENCE OF EMSOutputRelayStatusEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for access of individual output relays. The number of + entries is contained in the emsStatusOutputRelayCount OID." + ::= { emsOutputRelayStatus 1 } + +emsOutputRelayStatusEntry OBJECT-TYPE + SYNTAX EMSOutputRelayStatusEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The output relays to access." + INDEX { emsOutputRelayStatusOutputRelayIndex } + ::= { emsOutputRelayStatusTable 1 } + +EMSOutputRelayStatusEntry ::= + SEQUENCE { + emsOutputRelayStatusOutputRelayIndex INTEGER, + emsOutputRelayStatusOutputRelayName DisplayString, + emsOutputRelayStatusOutputRelayState INTEGER, + emsOutputRelayStatusOutputRelayNormalState INTEGER + } + +emsOutputRelayStatusOutputRelayIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the output relay entry." + ::= { emsOutputRelayStatusEntry 1 } + +emsOutputRelayStatusOutputRelayName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the output relay." + ::= { emsOutputRelayStatusEntry 2 } + +emsOutputRelayStatusOutputRelayState OBJECT-TYPE + SYNTAX INTEGER { + relayClosedEMS (1), + relayOpenEMS (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this variable will return the state of the output relay. If + the output relay is closed, the relayClosedEMS (1) value will be returned. + If the output relay is open, the relayOpenEMS (2) value will be + returned. " + + ::= { emsOutputRelayStatusEntry 3 } + +emsOutputRelayStatusOutputRelayNormalState OBJECT-TYPE + SYNTAX INTEGER { + normallyClosedEMS (1), + normallyOpenEMS (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this variable will return the normal state of the output relay. If + the normal state is closed, the normallyClosedEMS (1) value will be returned. + If the normal state is open, the normallyOpenEMS (2) value will be + returned. " + + ::= { emsOutputRelayStatusEntry 4 } + +-- EMS OUTLET STATUS TABLE + +emsOutletStatusTable OBJECT-TYPE + SYNTAX SEQUENCE OF EMSOutletStatusEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for access of individual outlets. The number of + entries is contained in the emsStatusOutletCount OID." + ::= { emsOutletStatus 1 } + +emsOutletStatusEntry OBJECT-TYPE + SYNTAX EMSOutletStatusEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The outlets to access." + INDEX { emsOutletStatusOutletIndex } + ::= { emsOutletStatusTable 1 } + +EMSOutletStatusEntry ::= + SEQUENCE { + emsOutletStatusOutletIndex INTEGER, + emsOutletStatusOutletName DisplayString, + emsOutletStatusOutletState INTEGER, + emsOutletStatusOutletNormalState INTEGER + } + +emsOutletStatusOutletIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the outlet entry." + ::= { emsOutletStatusEntry 1 } + +emsOutletStatusOutletName OBJECT-TYPE + SYNTAX DisplayString ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the outlet." + ::= { emsOutletStatusEntry 2 } + +emsOutletStatusOutletState OBJECT-TYPE + SYNTAX INTEGER { + outletOnEMS (1), + outletOffEMS (2) + } + + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this variable will return the state of the outlet. If + the outlet is on, the outletOnEMS (1) value will be returned. + If the outlet is off, the outletOffEMS (2) value will be + returned. " + + ::= { emsOutletStatusEntry 3 } + +emsOutletStatusOutletNormalState OBJECT-TYPE + SYNTAX INTEGER { + normallyOnEMS (1), + normallyOffEMS (2) + } + + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this variable will return the normal state of the outlet. If + the normal state is on, the normallyOnEMS (1) value will be returned. + If the normal state is off, the normallyOffEMS (2) value will be + returned. " + + ::= { emsOutletStatusEntry 4 } + +-- EMS ALARM DEVICE STATUS TABLE + +emsAlarmDeviceStatusTable OBJECT-TYPE + SYNTAX SEQUENCE OF EMSAlarmDeviceStatusEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for access of individual alarm devices. The number of + entries is contained in the emsStatusAlarmDeviceCount OID." + ::= { emsAlarmDeviceStatus 1 } + +emsAlarmDeviceStatusEntry OBJECT-TYPE + SYNTAX EMSAlarmDeviceStatusEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The alarm devices to access." + INDEX { emsAlarmDeviceStatusDeviceIndex } + ::= { emsAlarmDeviceStatusTable 1 } + +EMSAlarmDeviceStatusEntry ::= + SEQUENCE { + emsAlarmDeviceStatusDeviceIndex INTEGER, + emsAlarmDeviceStatusDeviceName DisplayString, + emsAlarmDeviceStatusDeviceState INTEGER + } + +emsAlarmDeviceStatusDeviceIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the alarm device entry." + ::= { emsAlarmDeviceStatusEntry 1 } + +emsAlarmDeviceStatusDeviceName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the alarm device. + This OID is provided for informational purposes only." + ::= { emsAlarmDeviceStatusEntry 2 } + +emsAlarmDeviceStatusDeviceState OBJECT-TYPE + SYNTAX INTEGER { + alarmDeviceOnEMS (1), + alarmDeviceOffEMS (2), + alarmDeviceNotInstalledEMS (3) + } + + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this variable will return the device state. If + the device is active, the alarmDeviceOnEMS (1) value will be returned. + If the device is inactive, the alarmDeviceOffEMS (2) value will be + returned. If the device is not installed, the + alarmDeviceNotInstalledEMS (3) value will be returned." + + ::= { emsAlarmDeviceStatusEntry 3 } + + +-- EMS SENSOR STATUS TABLE + +emsSensorStatusTable OBJECT-TYPE + SYNTAX SEQUENCE OF EMSSensorStatusEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for access of individual sensors. The number of + entries is contained in the emsStatusSensorCount OID." + ::= { emsSensorStatus 1 } + +emsSensorStatusEntry OBJECT-TYPE + SYNTAX EMSSensorStatusEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The sensors to access." + INDEX { emsSensorStatusSensorIndex } + ::= { emsSensorStatusTable 1 } + +EMSSensorStatusEntry ::= + SEQUENCE { + emsSensorStatusSensorIndex INTEGER, + emsSensorStatusSensorSystemName DisplayString, + emsSensorStatusSensorName DisplayString, + emsSensorStatusSensorState INTEGER, + emsSensorStatusSensorNormalState INTEGER, + emsSensorStatusSensorAlarmDelay INTEGER + } + +emsSensorStatusSensorIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the sensor entry." + ::= { emsSensorStatusEntry 1 } + +emsSensorStatusSensorSystemName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system name of the sensor. This describes the hardware system + intent of this sensor." + ::= { emsSensorStatusEntry 2 } + +emsSensorStatusSensorName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the sensor as given by the system user." + ::= { emsSensorStatusEntry 3 } + +emsSensorStatusSensorState OBJECT-TYPE + SYNTAX INTEGER { + sensorFaultedEMS (1), + sensorOKEMS (2), + sensorNotInstalledEMS (3) + } + + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this variable will return the sensor state. If the sensor is faulted, + the sensorFaultedEMS (1) value will be returned. + If the sensor is not faulted, the sensorOKEMS (2) value will be + returned. If the sensor is not installed, the sensorNotInstalledEMS (3) + value will be returned." + ::= { emsSensorStatusEntry 4 } + +emsSensorStatusSensorNormalState OBJECT-TYPE + SYNTAX INTEGER { + normallyClosedEMS (1), + normallyOpenEMS (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "Getting this variable will return the normal state of the sensor. If + the normal state is closed, the normallyClosedEMS (1) value will be returned. + If the normal state is closed, the normallyOpenEMS (2) value will be + returned." + ::= { emsSensorStatusEntry 5 } + +emsSensorStatusSensorAlarmDelay OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The delay (in seconds) after a sensor detects an alarm condition before the + condition is reported." + ::= { emsSensorStatusEntry 6 } + + + +-- airFM AIR CONDITIONER IDENT + +airFMIdentName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the + device. " + ::= { airFMIdent 1 } + +airFMIdentTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of entries in the airFMIdentTable. " + ::= { airFMIdent 2 } + +airFMIdentTable OBJECT-TYPE + SYNTAX SEQUENCE OF AirFMIdentTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for getting identification information + from each module in the system. " + ::= { airFMIdent 3 } + +airFMIdentTableEntry OBJECT-TYPE + SYNTAX AirFMIdentTableEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The module to get information from." + INDEX { airFMIdentModuleIndex } + ::= { airFMIdentTable 1 } + +AirFMIdentTableEntry ::= + SEQUENCE { + airFMIdentModuleIndex INTEGER, + airFMIdentModuleModelNumber DisplayString, + airFMIdentModuleDateOfMfg DisplayString, + airFMIdentModuleSerialNumber DisplayString, + airFMIdentModuleFirmwareRev DisplayString, + airFMIdentModuleHardwareRev DisplayString + } + +airFMIdentModuleIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of the module information." + ::= { airFMIdentTableEntry 1 } + +airFMIdentModuleModelNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the + model number. " + ::= { airFMIdentTableEntry 2 } + +airFMIdentModuleDateOfMfg OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the + manufacture date. " + ::= { airFMIdentTableEntry 3 } + +airFMIdentModuleSerialNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the + unit serial number. " + ::= { airFMIdentTableEntry 4 } + +airFMIdentModuleFirmwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the + firmware revision. " + ::= { airFMIdentTableEntry 5 } + +airFMIdentModuleHardwareRev OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the + hardware revision. " + ::= { airFMIdentTableEntry 6 } + +-- airFM AIR CONDITIONER STATUS + +airFMStatusSystemOn OBJECT-TYPE + SYNTAX INTEGER { + statusOn (1), + statusOff (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The operating state of the system. " + ::= { airFMStatus 1 } + +airFMStatusSystemAverageRetTempC OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system average return air + temperature in tenths of degrees Celsius. " + ::= { airFMStatus 2 } + +airFMStatusSystemAverageRetTempF OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system average return air + temperature in tenths of degrees Fahrenheit. " + ::= { airFMStatus 3 } + +airFMStatusSystemAverageRetHum OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system average return air + humidity. " + ::= { airFMStatus 4 } + +airFMStatusSystemActionTempC OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system action air + temperature in tenths of degrees Celsius. " + ::= { airFMStatus 5 } + +airFMStatusSystemActionTempF OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system action air + temperature in tenths of degrees Fahrenheit. " + ::= { airFMStatus 6 } + +airFMStatusSystemActionHum OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system action air humidity. " + ::= { airFMStatus 7 } + +airFMStatusSystemRemoteHighTempC OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system remote high air + temperature in tenths of degrees Celsius. " + ::= { airFMStatus 8 } + +airFMStatusSystemRemoteHighTempF OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system remote high air + temperature in tenths of degrees Fahrenheit. " + ::= { airFMStatus 9 } + +airFMStatusSystemRemoteAvgTempC OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system remote average air + temperature in tenths of degrees Celsius. " + ::= { airFMStatus 10 } + +airFMStatusSystemRemoteAvgTempF OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system remote average air + temperature in tenths of degrees Fahrenheit. " + ::= { airFMStatus 11 } + +airFMStatusSystemRemoteAvgHum OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system remote average air + humidity. " + ::= { airFMStatus 12 } + +airFMStatusSystemRemoteLowTempC OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system remote low air + temperature in tenths of degrees Celsius. " + ::= { airFMStatus 13 } + +airFMStatusSystemRemoteLowTempF OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The system remote low air + temperature in tenths of degrees Fahrenheit. " + ::= { airFMStatus 14 } + +airFMStatusSystemCoolingEnabled OBJECT-TYPE + SYNTAX INTEGER { + enabledYes (1), + enabledNo (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The state of the system cooling + function enable. " + ::= { airFMStatus 15 } + +airFMStatusSystemReheatingEnabled OBJECT-TYPE + SYNTAX INTEGER { + enabledYes (1), + enabledNo (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The state of the system reheating + function enable. " + ::= { airFMStatus 16 } + +airFMStatusSystemHumidifyEnabled OBJECT-TYPE + SYNTAX INTEGER { + enabledYes (1), + enabledNo (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The state of the system humidify + function enable. " + ::= { airFMStatus 17 } + +airFMStatusSystemDehumidifyEnabled OBJECT-TYPE + SYNTAX INTEGER { + enabledYes (1), + enabledNo (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The state of the system dehumidify + function enable. " + ::= { airFMStatus 18 } + +airFMStatusModuleTableSize OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of entries in the airFMStatusModuleTable. " + ::= { airFMStatus 19 } + +airFMStatusModuleTable OBJECT-TYPE + SYNTAX SEQUENCE OF AirFMStatusModuleEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for getting information from each module + in the system. " + ::= { airFMStatus 20 } + +airFMStatusModuleEntry OBJECT-TYPE + SYNTAX AirFMStatusModuleEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The module to get status from." + INDEX { airFMStatusModuleIndex } + ::= { airFMStatusModuleTable 1 } + +AirFMStatusModuleEntry ::= + SEQUENCE { + airFMStatusModuleIndex INTEGER, + airFMStatusModuleOutputCapacity INTEGER, + airFMStatusModuleSupplyTempC INTEGER, + airFMStatusModuleSupplyTempF INTEGER, + airFMStatusModuleSupplyHum INTEGER, + airFMStatusModuleReturnTempC INTEGER, + airFMStatusModuleReturnTempF INTEGER, + airFMStatusModuleReturnHum INTEGER + } + +airFMStatusModuleIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index of the module information." + ::= { airFMStatusModuleEntry 1 } + +airFMStatusModuleOutputCapacity OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The module output capacity in kilowatts." + ::= { airFMStatusModuleEntry 2 } + +airFMStatusModuleSupplyTempC OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The module supply air temperature in + tenths of degrees Celsius. " + ::= { airFMStatusModuleEntry 3 } + +airFMStatusModuleSupplyTempF OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The module supply air temperature in + tenths of degrees Fahrenheit. " + ::= { airFMStatusModuleEntry 4 } + +airFMStatusModuleSupplyHum OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The module supply air humidity. " + ::= { airFMStatusModuleEntry 5 } + +airFMStatusModuleReturnTempC OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The module return air temperature in + tenths of degrees Celsius. " + ::= { airFMStatusModuleEntry 6 } + +airFMStatusModuleReturnTempF OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The module return air temperature in + tenths of degrees Fahrenheit. " + ::= { airFMStatusModuleEntry 7 } + +airFMStatusModuleReturnHum OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The module return air humidity. " + ::= { airFMStatusModuleEntry 8 } + +-- airFM AIR CONDITIONER GROUP DATA + +airFMGroupSysStatus OBJECT-TYPE + SYNTAX INTEGER { + statusOnLine (1), + statusIdle (2), + statusLoadShare (3), + statusOffLine (4), + statusFailed (5) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of this system within the group. " + ::= { airFMGroup 1 } + +airFMGroupSysRuntime OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The number of hours the system has been running. " + ::= { airFMGroup 2 } + +airFMGroupSysRole OBJECT-TYPE + SYNTAX INTEGER { + rolePrimary (1), + roleBackup (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The role of this system within the group. " + ::= { airFMGroup 3 } + +-- airPA Portable Air Conditioner Ident + +airPAIdentName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the device name. " + ::= { airPAIdent 1 } + +airPAModelNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the device model number. " + ::= { airPAIdent 2 } + +airPADateOfManufacture OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying when the device was produced. " + ::= { airPAIdent 3 } + +airPASerialNumber OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the device serial number. " + ::= { airPAIdent 4 } + +airPAFirmwareRevision OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the device firmware revision. " + ::= { airPAIdent 5 } + +airPAHardwareRevision OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the device hardware revision. " + ::= { airPAIdent 6 } + +-- airPA Portable Air Conditioner Status + +airPASystemPower OBJECT-TYPE + SYNTAX INTEGER { + powerON (1), + powerOFF (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The status of the unit's system power setting. + + ON(1) The system power is turned on. + OFF(2) The system power is turned off. " + ::= { airPAStatus 1 } + +airPAOperatingMode OBJECT-TYPE + SYNTAX INTEGER { + modeOFF (1), + modeVENTING (2), + modeCOOLING (3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The current operating mode of the unit. + + OFF(1) The system is off. + VENTING(2) The system's venting function is active. + COOLING(3) The system's cooling function is active. " + ::= { airPAStatus 2 } + +airPASetpointTempF OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The temperature setpoint in Fahrenheit to which the unit is controlling. " + ::= { airPAStatus 3 } + +airPASetpointTempC OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The temperature setpoint in Celsius to which the unity is controlling. " + ::= { airPAStatus 4 } + +airPABlowerSpeed OBJECT-TYPE + SYNTAX INTEGER { + speedLOW (1), + speedHIGH (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The unit's blower speed setting. + + LOW(1) The blower speed is low. + HIGH(2) The blower speed is high. " + ::= { airPAStatus 5 } + +airPACompressor OBJECT-TYPE + SYNTAX INTEGER { + statusON (1), + statusOFF (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The unit's compressor status. + + ON(1) The compressor is turned on. + OFF(2) The compressor is turned off. " + ::= { airPAStatus 6 } + +airPACondenserFan OBJECT-TYPE + SYNTAX INTEGER { + statusON (1), + statusOFF (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The unit's condenser fan status. + + ON(1) The condenser fan is turned on. + OFF(2) The condenser fan is turned off. " + ::= { airPAStatus 7 } + +airPACondensatePump OBJECT-TYPE + SYNTAX INTEGER { + statusON (1), + statusOFF (2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The unit's condensate pump status. + + ON(1) The condensate pump is turned on. + OFF(2) The condensate pump is turned off. " + ::= { airPAStatus 8 } + +airPASupplyTempF OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The supply temperature in degrees Fahrenheit. " + ::= { airPAStatus 9 } + +airPASupplyTempC OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The supply temperature in degrees Celsius. " + ::= { airPAStatus 10 } + +airPAReturnTempF OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The return temperature in degrees Fahrenheit. " + ::= { airPAStatus 11 } + +airPAReturnTempC OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The return temperature in degrees Celsius. " + ::= { airPAStatus 12 } + +airPARemoteTempF OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The remote temperature in degrees Fahrenheit. " + ::= { airPAStatus 13 } + +airPARemoteTempC OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The remote temperature in degrees Celsius. " + ::= { airPAStatus 14 } + +airPARemoteHumidity OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The remote humidity. " + ::= { airPAStatus 15 } + +-- RACK AIR REMOVAL UNIT IDENT + +rARUIdentTable OBJECT-TYPE + SYNTAX SEQUENCE OF IdentRARUEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for query of the individual devices. + The number of entries is contained in the + rARUStatusAruDeviceCount OID." + ::= { rARUIdent 1 } + +rARUIdentEntry OBJECT-TYPE + SYNTAX IdentRARUEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The device to query." + INDEX { rARUIdentIndex} + ::= { rARUIdentTable 1 } + +IdentRARUEntry ::= + SEQUENCE { + rARUIdentIndex INTEGER, + rARUIdentName DisplayString + } + +rARUIdentIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the device entry." + ::= { rARUIdentEntry 1 } + +rARUIdentName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "A character string identifying the + device. " + ::= { rARUIdentEntry 2 } + + +-- RACK AIR REMOVAL UNIT CONFIGURATION + +rARUConfigTable OBJECT-TYPE + SYNTAX SEQUENCE OF ConfigRARUEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for configuration of individual ARUs. The number of + entries is contained in the rARUStatusAruDeviceCount OID." + ::= { rARUConfig 1 } + +rARUConfigEntry OBJECT-TYPE + SYNTAX ConfigRARUEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The ARUs to configure." + INDEX { rARUConfigAruIndex } + ::= { rARUConfigTable 1 } + +ConfigRARUEntry ::= + SEQUENCE { + rARUConfigAruIndex INTEGER, + rARUConfigAruName DisplayString, + rARUConfigAruRemoteSetpoint INTEGER, + rARUConfigAruTempOvrdEnableDisable INTEGER, + rARUConfigAruTempOvrdSetpoint INTEGER + } + +rARUConfigAruIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the device entry." + ::= { rARUConfigEntry 1 } + +rARUConfigAruName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The name of the ARU." + ::= { rARUConfigEntry 2 } + +rARUConfigAruRemoteSetpoint OBJECT-TYPE + SYNTAX INTEGER { + aruOff (1), + aru85F-29C (2), + aru90F-32C (3), + aru95F-35C (4), + aru100F-38C (5), + aru7kW (6), + aru5kW (7), + aru3kW (8), + aru2kW (9) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This OID is the Remote setpoint of the ARU. + NOTE: -1 will be returned if the ARU is not communicating." + + ::= { rARUConfigEntry 3 } + +rARUConfigAruTempOvrdEnableDisable OBJECT-TYPE + SYNTAX INTEGER { + disabled(1), + enabled(2) + } + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This OID is used to enable/disable the remote temperature override setting of the ARU. + + If this OID is set to 1, the remote setting for temperature override is disabled. + If this OID is set to 2, the remote setting for temperature override is enabled." + ::= { rARUConfigEntry 4 } + +rARUConfigAruTempOvrdSetpoint OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-write + STATUS mandatory + DESCRIPTION + "This OID is the Temperature Override setpoint of the ARU. + NOTE: -1 will be returned if the ARU is not communicating." + + ::= { rARUConfigEntry 5 } + +-- RACK AIR REMOVAL UNIT STATUS + +rARUStatusAruDeviceCount OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The total number of ARUs accessible from this IP." + ::= { rARUStatus 1 } + +rARUStatusSysTempUnits OBJECT-TYPE + SYNTAX INTEGER { + celsius(1), + fahrenheit(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The temperature scale used to display the temperature + in the system, Celsius(1) or Fahrenheit(2). + This setting is based on the system preferences + configuration in the agent." + ::= { rARUStatus 2 } + +rARUStatusTable OBJECT-TYPE + SYNTAX SEQUENCE OF StatusRARUEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "Allows for access of individual ARUs. The number of + entries is contained in the rARUStatusAruDeviceCount OID." + ::= { rARUStatus 3 } + +rARUStatusEntry OBJECT-TYPE + SYNTAX StatusRARUEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "The ARUs to access." + INDEX { rARUStatusAruIndex } + ::= { rARUStatusTable 1 } + +StatusRARUEntry ::= + SEQUENCE { + rARUStatusAruIndex INTEGER, + rARUStatusAruName DisplayString, + rARUStatusAruRemoteSetpoint INTEGER, + rARUStatusAruManualSetpoint INTEGER, + rARUStatusAruTemp1 INTEGER, + rARUStatusAruTemp2 INTEGER, + rARUStatusAruTemp3 INTEGER, + rARUStatusAruTempOvrdEnableDisable INTEGER, + rARUStatusAruTempOvrdSetpoint INTEGER, + rARUStatusAruAlarmState DisplayString, + rARUStatusAruCommStatus INTEGER + } + +rARUStatusAruIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The index to the ARU entry." + ::= { rARUStatusEntry 1 } + +rARUStatusAruName OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The name of the ARU." + ::= { rARUStatusEntry 2 } + +rARUStatusAruRemoteSetpoint OBJECT-TYPE + SYNTAX INTEGER { + aruOff (1), + aru85F-29C (2), + aru90F-32C (3), + aru95F-35C (4), + aru100F-38C (5), + aru7kW (6), + aru5kW (7), + aru3kW (8), + aru2kW (9) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "ARU remote setpoint temperature setting. + + NOTE: -1 will be returned if the ARU is not communicating. + + Values are represented in whole number degrees. + Units are displayed in the scale shown in + the rARUStatusSysTempUnits OID (Celsius or Fahrenheit)." + ::= { rARUStatusEntry 3 } + +rARUStatusAruManualSetpoint OBJECT-TYPE + SYNTAX INTEGER { + aruOff (1), + aru85F-29C (2), + aru90F-32C (3), + aru95F-35C (4), + aru100F-38C (5), + aru7kW (6), + aru5kW (7), + aru3kW (8), + aru2kW (9), + aruRem (10) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "ARU manual setpoint temperature setting. + + NOTE: -1 will be returned if the ARU is not communicating. + + Values are represented in whole number degrees. + If the manual setpoint is set to Remote, this OID will return 0. + Units are displayed in the scale shown in + the rARUStatusSysTempUnits OID (Celsius or Fahrenheit)." + ::= { rARUStatusEntry 4 } + +rARUStatusAruTemp1 OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "ARU temperature probe #1 reading. + + NOTE: -1 will be returned if the ARU is not communicating. + + Values are represented in whole number degrees. + Units are displayed in the scale shown in + the rARUStatusSysTempUnits OID (Celsius or Fahrenheit)." + ::= { rARUStatusEntry 5 } + +rARUStatusAruTemp2 OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "ARU temperature probe #2 reading. + + NOTE: -1 will be returned if the ARU is not communicating. + + Values are represented in whole number degrees. + Units are displayed in the scale shown in + the rARUStatusSysTempUnits OID (Celsius or Fahrenheit)." + ::= { rARUStatusEntry 6 } + +rARUStatusAruTemp3 OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "ARU temperature probe #3 reading. + + NOTE: -1 will be returned if the ARU is not communicating. + + Values are represented in whole number degrees. + Units are displayed in the scale shown in + the rARUStatusSysTempUnits OID (Celsius or Fahrenheit)." + ::= { rARUStatusEntry 7 } + +rARUStatusAruTempOvrdEnableDisable OBJECT-TYPE + SYNTAX INTEGER { + disabled(1), + enabled(2) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "This OID indicates whether the ARU remote temperature override is enabled or disabled. + If this OID is a 1, the remote setting for temperature override is disabled. + If this OID is a 2, the remote setting for temperature override is enabled." + ::= { rARUStatusEntry 8 } + +rARUStatusAruTempOvrdSetpoint OBJECT-TYPE + SYNTAX INTEGER + ACCESS read-only + STATUS mandatory + DESCRIPTION + "ARU remote temperature override setpoint setting. + + NOTE: -1 will be returned if the ARU is not communicating. + + Values are represented in whole number degrees. + Units are displayed in the scale shown in + the rARUStatusSysTempUnits OID (Celsius or Fahrenheit)." + ::= { rARUStatusEntry 9 } + +rARUStatusAruAlarmState OBJECT-TYPE + SYNTAX DisplayString + ACCESS read-only + STATUS mandatory + DESCRIPTION + "An ASCII string containing the 8 flags representing + the current alarm state of the ARU. If the state of + the ARU is unknown, this variable is set to ‘UNKNOWN’. + + The flags are numbered 1 to 8, read from left to + right. The flags are defined as follows: + + Flag 1: Fan Fail 1 + Flag 2: Fan Fail 2 + Flag 3: Fan Fail 3 + Flag 4: Smoke + + Flag 5: High Temp (Out of Thermal Control) + Flag 6: Over Temp (Exhaust Temp. Exceeds Override Setpoint) + Flag 7: Reserved + Flag 8: Reserved" + ::= { rARUStatusEntry 10 } + +rARUStatusAruCommStatus OBJECT-TYPE + SYNTAX INTEGER { + commsNeverDiscovered(1), + commsEstablished(2), + commsLost(3) + } + ACCESS read-only + STATUS mandatory + DESCRIPTION + "The state of communications to the device. + commNeverDiscovered(1) indicates there has never been communications with this device. + commsEstablished(2) indicates communication is normal and active with this device. + commsLost(3) indicates communication had been established, but is no device." + ::= { rARUStatusEntry 11 } + +-- Traps +-- Annotations are provided for Novell's NMS product +-- +-- Each trap has at least one variable (mtrapargsString) which always appears +-- as the last variable in the list. This variable contains either a static +-- or dynamically-constructed string which provides an enhanced description of +-- the trap's purpose and any pertinent information about the trap. + +communicationLost TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "SEVERE: Communication to the UPS has been lost. Steps + to reestablish communication are in progress." + --#TYPE "APC UPS: Communication lost" + --#SUMMARY "Communication lost between the agent and the UPS." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 1 + +upsOverload TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "SEVERE: The UPS has sensed a load greater than 100 percent + of its rated capacity." + --#TYPE "APC UPS: Overload" + --#SUMMARY "The UPS has sensed a load greater than 100 percent of its rated capacity." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 2 + +upsDiagnosticsFailed TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "SEVERE: The UPS failed its internal diagnostic self-test." + --#TYPE "APC UPS: Failed self-test" + --#SUMMARY "The UPS has failed its internal self-test." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 3 + +upsDischarged TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "SEVERE: The UPS batteries are discharged; if utility power fails + an immediate low battery condition will exist. Sufficient runtime + for necessary action cannot be guaranteed." + --#TYPE "APC UPS: batteries are discharged" + --#SUMMARY "The UPS batteries are discharged." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 4 + +upsOnBattery TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: The UPS has switched to battery backup power." + --#TYPE "APC UPS: On battery" + --#SUMMARY "The UPS has switched to battery backup power." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 5 + +smartBoostOn TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: The UPS has enabled SmartBoost(TM)." + --#TYPE "APC UPS: SmartBoost(TM)" + --#SUMMARY "The UPS has enabled SmartBoost(TM); low incoming line voltage." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 6 + +lowBattery TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "SEVERE: The UPS batteries are low and will soon be exhausted. + If utility power is not restored the UPS will put itself + to 'sleep' and immediately cut power to the load." + --#TYPE "APC UPS: Low battery" + --#SUMMARY "The UPS system's batteries are low and will soon be exhausted." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 7 + +communicationEstablished TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Communication with the UPS has been established." + --#TYPE "APC UPS: Communication established" + --#SUMMARY "UPS communication has been established." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 8 + +powerRestored TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Utility power has been restored." + --#TYPE "APC UPS: Utility power restored" + --#SUMMARY "Returned from battery backup power; utility power restored." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 9 + +upsDiagnosticsPassed TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The UPS passed its internal self-test." + --#TYPE "APC UPS: Passed self-test" + --#SUMMARY "The UPS passed internal self-test." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 10 + +returnFromLowBattery TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The UPS has returned from a low battery + condition." + --#TYPE "APC UPS: Returned from Low-Battery condition" + --#SUMMARY "The UPS has returned from a Low-Battery condition." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 11 + +upsTurnedOff TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: The UPS has been turned 'off' by the management station." + --#TYPE "APC UPS: Turned off" + --#SUMMARY "The UPS has been switched off by a management station." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE NONOPERATIONAL + ::= 12 + +upsSleeping TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: The UPS is entering 'sleep' mode. Power + to the load will be cut off." + --#TYPE "APC UPS: Entered sleep mode" + --#SUMMARY "The UPS entered sleep mode. Power to the load will be cut off." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE NONOPERATIONAL + ::= 13 + +upsWokeUp TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATION: The UPS has returned from 'sleep' mode. Power + to the load has been restored." + --#TYPE "APC UPS: Wake up" + --#SUMMARY "The UPS has returned from sleep mode. Power to the load has been restored." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 14 + +upsRebootStarted TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: The UPS has started its reboot sequence. + The UPS will reboot itself at this time." + --#TYPE "APC UPS: Starting reboot" + --#SUMMARY "The UPS has started its reboot sequence." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE NONOPERATIONAL + ::= 15 + +upsDipSwitchChanged TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: The dip switch settings on the UPS have been + changed, possibly altering UPS performance." + --#TYPE "APC UPS: DIP switch altered" + --#SUMMARY "The DIP switch settings on the UPS have been changed." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 16 + +upsBatteryNeedsReplacement TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "SEVERE: The batteries of the UPS need immediate replacement." + --#TYPE "APC UPS: UPS batteries need replacement" + --#SUMMARY "The UPS batteries require immediate replacement." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 17 + + +-- the Environmental Monitor traps + +contactFault TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: One of the contacts on the Environmental Monitor has + changed from its default position. The first variable is + the contact number that is faulted." + --#TYPE "APC Environment: Contact fault" + --#SUMMARY "An Environment contact closure has faulted." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 18 + +contactFaultResolved TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A fault on one of the Environmental Monitor contacts + has been resolved. The first variable is + the contact number that has been resolved." + --#TYPE "APC Environment: Contact fault cleared." + --#SUMMARY "A Environment contact closure has returned to it's default state." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 19 + +-- the Matrix-UPS traps + +hardwareFailureBypass TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "SEVERE: UPS on bypass due to internal fault" + --#TYPE "APC UPS: On bypass due to internal fault" + --#SUMMARY "The UPS is on bypass due to an internal fault." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 20 + +softwareBypass TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: UPS on bypass - user set via software or panel" + --#TYPE "APC UPS: On bypass by user via software or panel" + --#SUMMARY "UPS put on bypass by user via software or front UPS panel." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 21 + +switchedBypass TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: UPS on bypass - initiated by user" + --#TYPE "APC UPS: On bypass initiated by user" + --#SUMMARY "UPS put on bypass by user." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 22 + +returnFromBypass TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: UPS has returned from bypass" + --#TYPE "APC UPS: UPS has returned from bypass" + --#SUMMARY "The UPS has returned from bypass mode." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 23 + +bypassPowerSupplyFailure TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "SEVERE: Base module bypass power supply needs repair" + --#TYPE "APC UPS: Base module bypass power supply needs repair" + --#SUMMARY "The base module bypass power supply needs repair." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE NONOPERATIONAL + ::= 24 + +baseFanFailure TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "SEVERE: Base module fan needs repair" + --#TYPE "APC UPS: Base module fan needs repair" + --#SUMMARY "The base module fan needs repair." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE NONOPERATIONAL + ::= 25 + +batteryPackCommLost TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "SEVERE: Check installation of external battery packs signal cable" + --#TYPE "APC UPS: Communication lost with battery packs" + --#SUMMARY "Communication lost with external battery packs, check battery signal cable." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 26 + +batteryPackCommEstablished TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: UPS is communicating with the external battery packs." + --#TYPE "APC UPS: Communication established with battery packs" + --#SUMMARY "Communication established with external battery packs." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 27 + +calibrationStart TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A battery calibration test has been initiated on the UPS." + --#TYPE "APC UPS: Calibration initiated" + --#SUMMARY "A battery run time calibration test has been initiated." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 28 + +-- Misc. Traps + +restartAgent TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Agent restarting as commanded by manager." + --#TYPE "APC SNMP Agent: Agent restarting" + --#SUMMARY "Agent restarting as commanded by manager." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 29 + +upsTurnedOn TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A UPS is turned on." + --#TYPE "APC UPS: A UPS is turned on." + --#SUMMARY " A UPS is turned on." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 30 + +smartAvrReducing TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: The UPS is reducing the line voltage via SmartTrim(TM)." + --#TYPE "APC UPS: SmartTrim(TM) reducing" + --#SUMMARY "The UPS has enabled SmartTrim(TM) voltage reduction." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 31 + +codeAuthenticationDone TRAP-TYPE + ENTERPRISE apc + VARIABLES { mconfigTFTPServerIP, newCodeAuthentViaTFTP } + DESCRIPTION + "INFORMATIONAL: Authentication on agent code image is done." + --#TYPE "APC CODE: Authentication on agent code image is done." + --#SUMMARY "Authentication on agent code image is done." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 32 + +upsOverloadCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The overload condition has been cleared." + --#TYPE "APC UPS: Overload cleared." + --#SUMMARY "The overload condition has been cleared. ." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 33 + +smartBoostOff TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The UPS has returned from SmartBoost(TM)." + --#TYPE "APC UPS: SmartBoost(TM) off." + --#SUMMARY "The UPS has returned from SmartBoost(TM)." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 34 + +smartAvrReducingOff TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The UPS has returned from SmartTrim(TM)." + --#TYPE "APC UPS: SmartTrim(TM) reducing off" + --#SUMMARY "The UPS has returned from SmartTrim(TM) voltage reduction." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 35 + +upsBatteryReplaced TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A bad battery fault has been cleared." + --#TYPE "APC UPS: Bad battery replaced" + --#SUMMARY "The UPS has returned from a bad battery fault." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 36 + +calibrationEnd TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The UPS has finished calibrating." + --#TYPE "APC UPS: Calibration end" + --#SUMMARY "The UPS has finished calibrating" + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 37 + +dischargeCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A UPS discharge condition has been cleared." + --#TYPE "APC UPS: Discharge cleared." + --#SUMMARY "The UPS discharge condition has been cleared." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 38 + +gracefullShutdown TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A graceful shutdown has been initiated." + --#TYPE "APC UPS: A graceful shutdown has been initiated." + --#SUMMARY "A graceful shutdown has been initiated." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 39 + + +outletOn TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUOutletControlIndex } + DESCRIPTION + "WARNING: The specified PDU outlet has turned on. + If sPDUOutletControlIndex equals zero, then all outlets have + turned on." + --#TYPE "APC PDU: Outlet has been turned on." + --#SUMMARY "Outlet has been turned on" + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 41 + + +outletOff TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUOutletControlIndex } + DESCRIPTION + "WARNING: The specified PDU outlet has turned off. + If sPDUOutletControlIndex equals zero, then all outlets + have turned off." + --#TYPE "APC PDU: Outlet has turned off." + --#SUMMARY "Outlet has turned off." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 42 + +outletReboot TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUOutletControlIndex } + DESCRIPTION + "WARNING: The specified PDU outlet has rebooted. + If sPDUOutletControlIndex equals zero, then all outlets + have rebooted." + --#TYPE "APC PDU: Outlet has rebooted." + --#SUMMARY "Outlet has rebooted." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 43 + +configChangeSNMP TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: The SNMP configuration has been changed." + --#TYPE "APC: The SNMP configuration has been changed." + --#SUMMARY "The SNMP configuration has been changed." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 44 + + +configChangeOutlet TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUOutletConfigIndex } + DESCRIPTION + "WARNING: The specified PDU outlet has changed configuration. + If sPDUOutletConfigIndex equals zero, then the Master outlet + has changed configuration." + --#TYPE "APC PDU: Outlet configuration has been changed." + --#SUMMARY "Outlet configuration has been changed." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 45 + +accessViolationConsole TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: Someone has attempted to login via the console with the incorrect password." + --#TYPE "APC: Access violation via the console." + --#SUMMARY "Three unsuccessful logins have been attempted via the console." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 46 + +accessViolationHTTP TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: Someone has attempted to login via HTTP with the incorrect password." + --#TYPE "APC: Access violation via HTTP." + --#SUMMARY "An unsuccessful attempt to login via HTTP." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 47 + +passwordChange TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: The password for the device has been changed." + --#TYPE "APC: Password change for the device." + --#SUMMARY "Someone has changed the password on the device." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 48 + +badVoltage TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: The output voltage is not within acceptable range." + --#TYPE "APC UPS: Bad output voltage." + --#SUMMARY "The output voltage is not within acceptable range." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 49 + +badVoltageCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The output voltage has returned to an acceptable level." + --#TYPE "APC UPS: The bad voltage output condition has been cleared." + --#SUMMARY "The output voltage has returned to an acceptable level." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 50 + +chargerFailure TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: The battery charger has failed." + --#TYPE "APC UPS: The battery charger has failed." + --#SUMMARY "The battery charger has failed." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 51 + +chargerFailureCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The battery charger failure condition has been cleared." + --#TYPE "APC UPS: The battery charger failure condition cleared" + --#SUMMARY "The battery charger failure condition has been cleared." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 52 + +batteryOverTemperature TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: The battery temperature threshold has been violated." + --#TYPE "APC UPS: The battery temperature threshold has been violated." + --#SUMMARY "The battery temperature threshold has been violated." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 53 + +batteryOverTemperatureCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The battery over temperature has been cleared." + --#TYPE "APC UPS: The battery over temperature has been cleared." + --#SUMMARY "The battery over temperature has been cleared." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 54 + + smartRelayFault TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: SmartBoost(TM) or SmartTrim(TM) relay fault." + --#TYPE "APC UPS: SmartBoost(TM) or SmartTrim(TM) relay fault." + --#SUMMARY "SmartBoost(TM) or SmartTrim(TM) relay fault." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 55 + +smartRelayFaultCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: SmartBoost(TM) or SmartTrim(TM) relay fault has been cleared." + --#TYPE "APC UPS: SmartBoost(TM) or SmartTrim(TM) relay fault cleared." + --#SUMMARY "SmartBoost(TM) or SmartTrim(TM) relay fault has been cleared." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 56 + +humidityThresholdViolation1 TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: Probe 1 humidity threshold violated. The + first variable is the current humidity." + --#TYPE "APC Environmental Monitor: Probe 1 humidity threshold violation" + --#SUMMARY "A humidity threshold has been violated on probe 1." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 57 + +humidityThresholdViolationCleared1 TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An Environmental Monitor humidity threshold violation has been cleared on probe 1." + --#TYPE "APC Environmental Monitor: Probe 1 humidity violation cleared" + --#SUMMARY "A humidity threshold violation has been cleared on probe 1." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 58 + +temperatureThresholdViolation1 TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: An Environmental Monitor temperature threshold has been violated on probe 1. + The first variable is the current temperature." + --#TYPE "APC Environmental Monitor: Probe 1 temperature violation" + --#SUMMARY "A temperature threshold has been violated on probe 1." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 59 + +temperatureThresholdViolationCleared1 TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An Environmental Monitor temperature threshold violation has been cleared on probe 1." + --#TYPE "APC Environmental Monitor: Probe 1 temperature violation cleared" + --#SUMMARY "A temperature threshold violation has been cleared on probe 1." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 60 + +humidityThresholdViolation2 TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: An Environmental Monitor humidity threshold has been violated on probe 2. + The first variable is the current humidity." + --#TYPE "APC Environmental Monitor: Probe 2 humidity violation" + --#SUMMARY "A humidity threshold has been violated on probe 2." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 61 + +humidityThresholdViolationCleared2 TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An Environmental Monitor humidity threshold violation has been cleared on probe 2." + --#TYPE "APC Environmental Monitor: Probe 2 humidity violation cleared" + --#SUMMARY "A humidity threshold violation has been cleared on probe 2." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 62 + +temperatureThresholdViolation2 TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: An Environmental Monitor temperature threshold has been violated on probe 2. + The first variable is the current temperature." + --#TYPE "APC Environmental Monitor: Probe 2 temperature violation" + --#SUMMARY "A temperature threshold has been violated on probe 2." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 63 + +temperatureThresholdViolationCleared2 TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An Environmental Monitor temperature threshold violation has been cleared on probe 2." + --#TYPE "APC Environmental Monitor: Probe 2 temperature violation cleared" + --#SUMMARY "A temperature threshold violation has been cleared on probe 2." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 64 + +mupsCommunicationEstablished TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Communication with the Environmental Monitor has been established." + --#TYPE "APC Environmental Monitor: Communication established" + --#SUMMARY "Communication established between the agent and the Environmental Monitor." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 65 + +mupsCommunicationLost TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "SEVERE: Communication to the Environmental Monitor has been lost. Steps + to reestablish communication are in progress." + --#TYPE "APC Environmental Monitor: Communication failure" + --#SUMMARY "Communication lost between the agent and the Environmental Monitor." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 66 + +batteryIncrease TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The number of batteries has increased." + --#TYPE "APC UPS: The number of batteries has increased." + --#SUMMARY "The number of batteries has increased." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 67 + +batteryDecrease TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The number of batteries has decreased." + --#TYPE "APC UPS: The number of batteries has decreased." + --#SUMMARY "The number of batteries has decreased." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 68 + +powerModuleIncrease TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The number of power modules has increased." + --#TYPE "APC UPS: The number of power modules has increased." + --#SUMMARY "The number of power modules has increased." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 69 + +powerModuleDecrease TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The number of power modules has decreased." + --#TYPE "APC UPS: The number of power modules has decreased." + --#SUMMARY "The number of power modules has decreased." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 70 + +intelligenceModuleInserted TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An intelligence module has been inserted." + --#TYPE "APC UPS: An intelligence module has been inserted." + --#SUMMARY "An intelligence module has been inserted." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 71 + +intelligenceModuleRemoved TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An intelligence module has been removed." + --#TYPE "APC UPS: An intelligence module has been removed." + --#SUMMARY "An intelligence module has been removed." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 72 + +rintelligenceModuleInserted TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A redundant intelligence module has been inserted." + --#TYPE "APC UPS: A redundant intelligence module has been inserted." + --#SUMMARY "A redundant intelligence module has been inserted." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 73 + +rintelligenceModuleRemoved TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A redundant intelligence module has been removed." + --#TYPE "APC UPS: A redundant intelligence module has been removed." + --#SUMMARY "A redundant intelligence module has been removed." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 74 + +extBatteryFrameIncease TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An external battery frame has been added." + --#TYPE "APC UPS: An external battery frame has been added." + --#SUMMARY "An external battery frame has been added." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 75 + +extBatteryFrameDecrease TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An external battery frame has been removed." + --#TYPE "APC UPS: An external battery frame has been removed." + --#SUMMARY "An external battery frame has been removed." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 76 + +abnormalCondition TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: An abnormal condition has been detected. + The first variable is the fault condition." + --#TYPE "APC: An abnormal condition has been detected." + --#SUMMARY "An abnormal condition has been detected." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 77 + +abnormalConditionCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An abnormal condition has been cleared. + The first variable is the fault condition." + --#TYPE "APC: An abnormal condition has been cleared." + --#SUMMARY "An abnormal condition has been cleared." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 78 + +deviceStatusChange TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString} + DESCRIPTION + "INFORMATIONAL: The status of the device being monitored has changed." + --#TYPE "APC : The status of the device being monitored has changed." + --#SUMMARY "The status of the device being monitored has changed." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 79 + +noBatteries TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: The UPS has no batteries attached." + --#TYPE "APC UPS: No batteries attached." + --#SUMMARY "The UPS has no batteries attached." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 80 + +noBatteriesCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The UPS's batteries have been attached." + --#TYPE "APC UPS: The no batteries attached condition has been cleared." + --#SUMMARY "The UPS's batteries have been attached." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 81 + +userAdded TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A new user has been added." + --#TYPE "APC: A new user has been added." + --#SUMMARY "A new user has been added." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 82 + +userDeleted TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A user has been deleted." + --#TYPE "APC: A user has been deleted." + --#SUMMARY "A user has been deleted." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 83 + +userModified TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A user has been modified." + --#TYPE "APC: A user has been modified." + --#SUMMARY "A user has been modified." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 84 + +-- MasterSwitch Vm Traps + +msvmCommunicationEstablished TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUMasterControlVMIndex, sPDUMasterControlVMName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Communications with the MasterSwitch VM has been established." + --#TYPE "APC: Communications established with the MasterSwitch VM." + --#SUMMARY "Communications with the MasterSwitch VM has been established." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 85 + +msvmCommunicationLost TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUMasterControlVMIndex, sPDUMasterControlVMName, mtrapargsString } + DESCRIPTION + "SEVERE: Communications with the MasterSwitch VM has been lost." + --#TYPE "APC: Communications lost with the MasterSwitch VM." + --#SUMMARY "Communications with the MasterSwitch VM has been lost." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 86 + +msvmOverload TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUMasterControlVMIndex, sPDUMasterControlVMName, mtrapargsString } + DESCRIPTION + "SEVERE: The MasterSwitch VM in an overload condition." + --#TYPE "APC: The MasterSwitch VM is near or at an overload condition." + --#SUMMARY "The MasterSwitch VM is near or at an overload condition." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 87 + +msvmOverloadCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUMasterControlVMIndex, sPDUMasterControlVMName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The overload condition on the MasterSwitch VM has been cleared." + --#TYPE "APC: The overload condition cleared on the MasterSwitch VM." + --#SUMMARY "The overload condition on the MasterSwitch VM has been cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 88 + +msvmOutletOn TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUMasterControlVMIndex, sPDUMasterControlVMName, + sPDUOutletControlVMOutletIndex, sPDUOutletControlVMOutletName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An outlet on the MasterSwitch VM has turned on." + --#TYPE "APC: An outlet on the MasterSwitch VM has turned on." + --#SUMMARY "An outlet on the MasterSwitch VM has turned on." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 89 + +msvmOutletOff TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUMasterControlVMIndex, sPDUMasterControlVMName, + sPDUOutletControlVMOutletIndex, sPDUOutletControlVMOutletName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An outlet on the MasterSwitch VM has turned off." + --#TYPE "APC: An outlet on the MasterSwitch VM has turned off." + --#SUMMARY "An outlet on the MasterSwitch VM has turned off." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 90 + +msvmDeviceConfigChange TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUMasterControlVMIndex, sPDUMasterControlVMName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A device configuration change has been made on a MasterSwitch VM." + --#TYPE "APC: A device configuration change on a MasterSwitch VM." + --#SUMMARY "A device configuration change has been made on a MasterSwitch VM." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 91 + +msvmOutletConfigChange TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUMasterControlVMIndex, sPDUMasterControlVMName, + sPDUOutletControlVMOutletIndex, sPDUOutletControlVMOutletName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An outlet configuration change has been made on a MasterSwitch VM." + --#TYPE "APC: An outlet configuration change on a MasterSwitch VM." + --#SUMMARY "An outlet configuration change has been made on a MasterSwitch VM." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 92 + +msvmLowLoad TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUMasterControlVMIndex, sPDUMasterControlVMName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The MasterSwitch VM has violated the low load threshold." + --#TYPE "APC: The MasterSwitch VM has violated the low load threshold." + --#SUMMARY "The MasterSwitch VM has violated the low load threshold." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 93 + +msvmLowLoadCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUMasterControlVMIndex, sPDUMasterControlVMName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The low load condition on the MasterSwitch VM has been cleared." + --#TYPE "APC: The low load condition cleared on the MasterSwitch VM." + --#SUMMARY "The low load condition on the MasterSwitch VM has been cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 94 + +msvmNearOverload TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUMasterControlVMIndex, sPDUMasterControlVMName, mtrapargsString } + DESCRIPTION + "SEVERE: The MasterSwitch VM is approaching an overload condition." + --#TYPE "APC: The MasterSwitch VM is near or at an overload condition." + --#SUMMARY "The MasterSwitch VM is near or at an overload condition." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 95 + +msvmNearOverloadCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUMasterControlVMIndex, sPDUMasterControlVMName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The near overload condition on the MasterSwitch VM has been cleared." + --#TYPE "APC: The overload condition cleared on the MasterSwitch VM." + --#SUMMARY "The overload condition on the MasterSwitch VM has been cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 96 + +msvmPowerSupplyStatusChange TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUMasterControlVMIndex, sPDUMasterControlVMName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "WARNING: The power supply status of the MasterSwitch VM has changed." + --#TYPE "APC: The power supply status changed on MasterSwitch VM" + --#SUMMARY "The power supply status of the MasterSwitch VM has changed." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 97 + +-- MasterSwitch plus (MSP) Traps + +mspCommunicationEstablished TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUMasterControlMSPIndex, sPDUMasterControlMSPName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Communications with the MasterSwitch plus has been established." + --#TYPE "APC: Communications established with the MasterSwitch plus." + --#SUMMARY "Communications with the MasterSwitch plus has been established." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 98 + +mspCommunicationLost TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUMasterControlMSPIndex, sPDUMasterControlMSPName, mtrapargsString } + DESCRIPTION + "SEVERE: Communications with the MasterSwitch plus has been lost." + --#TYPE "APC: Communications lost with the MasterSwitch plus." + --#SUMMARY "Communications with the MasterSwitch plus has been lost." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 99 + +mspOutletOn TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUMasterControlMSPIndex, sPDUMasterControlMSPName, + sPDUOutletControlMSPOutletIndex, sPDUOutletControlMSPOutletName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An outlet on the MasterSwitch plus has turned on." + --#TYPE "APC: An outlet on the MasterSwitch plus has turned on." + --#SUMMARY "An outlet on the MasterSwitch plus has turned on." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 100 + +mspOutletOff TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUMasterControlMSPIndex, sPDUMasterControlMSPName, + sPDUOutletControlMSPOutletIndex, sPDUOutletControlMSPOutletName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An outlet on the MasterSwitch plus has turned off." + --#TYPE "APC: An outlet on the MasterSwitch plus has turned off." + --#SUMMARY "An outlet on the MasterSwitch plus has turned off." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 101 + +mspDeviceConfigChange TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUMasterControlMSPIndex, sPDUMasterControlMSPName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A device configuration change has been made on a MasterSwitch plus." + --#TYPE "APC: A device configuration change on a MasterSwitch plus." + --#SUMMARY "A device configuration change has been made on a MasterSwitch plus." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 102 + +mspOutletConfigChange TRAP-TYPE + ENTERPRISE apc + VARIABLES { sPDUMasterControlMSPIndex, sPDUMasterControlMSPName, sPDUOutletControlMSPOutletIndex, sPDUOutletControlMSPOutletName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An outlet configuration change has been made on a MasterSwitch plus." + --#TYPE "APC: An outlet configuration change on a MasterSwitch plus." + --#SUMMARY "An outlet configuration change has been made on a MasterSwitch plus." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 103 + +rsSourceSwitched TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger02, mtrapargsString03, mtrapargsInteger, mtrapargsString02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The Redundant Switch has switched source. + The first variable is an integer representing the current source: 0=A, 1=B. + The second variable is the 32-character name of the current source. + The third variable is an integer representing the transfer cause: + 0=No Transfers Recorded, 1=Due to user action or preferred switching, + 3=Due to line notch or spike, 5=Due to low line voltage, + 7=Transfer due to high line voltage, + 9=Transfer due to frequency out of range. + The fourth variable is a character string listing the transfer cause." + --#TYPE "APC Redundant Switch: The Redundant Switch has switched source" + --#SUMMARY "The Redundant Switch has switched source." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 104 + +rsLostRedundancy TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString02, mtrapargsString } + DESCRIPTION + "SEVERE: The Redundant Switch has lost redundancy. + The first variable is an integer representing the source which is no longer available: 0=A, 1=B. + The second variable is the 32-character name of the source which is no longer available." + --#TYPE "APC Redundant Switch: The Redundant Switch has lost redundancy" + --#SUMMARY "The Redundant Switch has has lost redundancy." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 105 + +rsRedundancyRestored TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Redundancy has been restored to the Redundant Switch . + The first variable is an integer representing the source which has been restored: 0=A, 1=B. + The second variable is the 32-character name of the source which has been restored." + --#TYPE "APC Redundant Switch: Redundancy has been restored." + --#SUMMARY "Redundancy has been restored to the Redundant Switch ." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 106 + +rsConfigChange TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A configuration change has been made on a Redundant Switch." + --#TYPE "APC: A configuration change on a Redundant Switch." + --#SUMMARY "A configuration change has been made on a Redundant Switch." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 107 + +rsCommunicationEstablished TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Communications with the Redundant Switch has been established." + --#TYPE "APC: Communications established with the Redundant Switch." + --#SUMMARY "Communications with the Redundant Switch has been established." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 108 + +rsCommunicationLost TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "SEVERE: Communications with the Redundant Switch has been lost." + --#TYPE "APC: Communications lost with the Redundant Switch." + --#SUMMARY "Communications with the Redundant Switch has been lost." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 109 + +dcCommunicationEstablished TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Communications with the DC power plant has been established." + --#TYPE "APC: Communications established with the DC power plant." + --#SUMMARY "Communications with the DC power plant has been established." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 110 + +dcCommunicationLost TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "SEVERE: Communications with the DC power plant has been lost." + --#TYPE "APC: Communications lost with the DC power plant." + --#SUMMARY "Communications with the DC power plant has been lost." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 111 + +dcPINChanged TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The active PIN on the DC controller has been changed." + --#TYPE "APC: The active PIN on the DC controller has been changed." + --#SUMMARY "The active PIN on the DC controller has been changed." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 112 + +dcMajorAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "SEVERE: A Major alarm is active in the DC power plant." + --#TYPE "APC: A Major alarm is active in the DC power plant." + --#SUMMARY "A Major alarm is active in the DC power plant." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 113 + +dcMajorAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A Major alarm is no longer active in the DC power plant." + --#TYPE "APC: A Major alarm is no longer active in the DC power plant." + --#SUMMARY "A Major alarm is no longer active in the DC power plant." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 114 + +dcMinorAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: A Minor alarm is active in the DC power plant." + --#TYPE "APC: A Minor alarm is active in the DC power plant." + --#SUMMARY "A Minor alarm is active in the DC power plant." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 115 + +dcMinorAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A Minor alarm is no longer active in the DC power plant." + --#TYPE "APC: A Minor alarm is no longer active in the DC power plant." + --#SUMMARY "A Minor alarm is no longer active in the DC power plant." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 116 + +dcOutputRelayOn TRAP-TYPE + ENTERPRISE apc + VARIABLES { dm3StatusOutRlyIndex, dm3StatusOutRlyName, mtrapargsString } + DESCRIPTION + "WARNING: An output relay for the powerplant has been activated (state changed to on). + The first variable is an integer representing the output relay number that has gone on. + The second variable is the 16-character name of the output relay." + --#TYPE "APC: An output relay has gone on." + --#SUMMARY "An output relay has gone on in the DC power plant." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 117 + +dcOutputRelayOff TRAP-TYPE + ENTERPRISE apc + VARIABLES { dm3StatusOutRlyIndex, dm3StatusOutRlyName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An output relay for the powerplant has been deactivated (state changed to off). + The first variable is an integer representing the output relay number that has gone off. + The second variable is the 16-character name of the output relay." + --#TYPE "APC: An output relay has gone off." + --#SUMMARY "An output relay has gone off in the DC power plant." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 118 + +dcInputRelayOn TRAP-TYPE + ENTERPRISE apc + VARIABLES { dm3StatusInRlyIndex, dm3StatusInRlyName, mtrapargsString } + DESCRIPTION + "WARNING: An input relay for the powerplant has been activated (state changed to on). + The first variable is an integer representing the input relay number that has gone on. + The second variable is the 16-character name of the input relay." + --#TYPE "APC: An input relay has gone on." + --#SUMMARY "An input relay has gone on in the DC power plant." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 119 + +dcInputRelayOff TRAP-TYPE + ENTERPRISE apc + VARIABLES { dm3StatusInRlyIndex, dm3StatusInRlyName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An input relay for the powerplant has been deactivated (state changed to off). + The first variable is an integer representing the input relay number that has gone off. + The second variable is the 16-character name of the input relay." + --#TYPE "APC: An input relay has gone off." + --#SUMMARY "An input relay has gone off in the DC power plant." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 120 + +logicPowerSuppliesIncreased TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The number of system power supplies has increased." + --#TYPE "APC UPS: The number of system power supplies has increased." + --#SUMMARY "The number of system power supplies has increased." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 121 + +logicPowerSuppliesDecreased TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The number of system power supplies has decreased." + --#TYPE "APC UPS: The number of system power supplies has decreased." + --#SUMMARY "The number of system power supplies has decreased." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 122 + +externalSwitchGearClosed TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: External Switch Gear closed." + --#TYPE "APC UPS: External Switch Gear closed." + --#SUMMARY "External Switch Gear closed." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 123 + +externalSwitchGearOpened TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: External Switch Gear opened." + --#TYPE "APC UPS: External Switch Gear opened." + --#SUMMARY "External Switch Gear opened." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 124 + +generalDeviceEvent TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: APC Device event." + --#TYPE "APC Device event" + --#SUMMARY "APC Device event." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 125 + +atsSourceSwitched TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The Automatic Transfer Switch has switched source. + The first variable is an integer representing the current source: 0=A, 1=B. + The second variable is the 32-character name of the current source." + --#TYPE "APC Automatic Transfer Switch: The ATS has switched source" + --#SUMMARY "The Automatic Transfer Switch has switched source." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 126 + +atsLostRedundancy TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString02, mtrapargsString } + DESCRIPTION + "SEVERE: The Automatic Transfer Switch has lost redundancy. + The first variable is an integer representing the source which is no longer available: 0=A, 1=B. + The second variable is the 32-character name of the source which is no longer available." + --#TYPE "APC Automatic Transfer Switch: The ATS has lost redundancy. " + --#SUMMARY "The Automatic Transfer Switch has has lost redundancy." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 127 + +atsRedundancyRestored TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Redundancy has been restored to the Automatic Transfer Switch . + The first variable is an integer representing the source which has been restored: 0=A, 1=B. + The second variable is the 32-character name of the source which has been restored." + --#TYPE "APC Automatic Transfer Switch: Redundancy has been restored." + --#SUMMARY "Redundancy has been restored to the Automatic Transfer Switch ." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 128 + +atsConfigChange TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A configuration change has been made on the Automatic Transfer Switch. + The first variable is an integer representing the configuration setting which changed: + 0=Transfer Voltage Range, 1=Sensitivity 2=Preferred Source + 3=Front Panel Lockout 4=Current Limit" + --#TYPE "APC Automatic Transfer Switch: ATS configuration changed." + --#SUMMARY "A configuration change has been made on a Automatic Transfer Switch." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 129 + +atsCommunicationEstablished TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Communications with the Automatic Transfer Switch has been established." + --#TYPE "APC Automatic Transfer Switch: Communications established." + --#SUMMARY "Communications with the Automatic Transfer Switch has been established." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 130 + +atsCommunicationLost TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "SEVERE: Communications with the Automatic Transfer Switch has been lost." + --#TYPE "APC Automatic Transfer Switch: Communications lost." + --#SUMMARY "Communications with the Automatic Transfer Switch has been lost." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 131 + +atsOverCurrent TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "SEVERE: Output Current has exceeded threshold." + --#TYPE "APC Automatic Transfer Switch: Output Current exceeded threshold" + --#SUMMARY "Output Current has exceeded Threshold. " + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 132 + +atsOverCurrentCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Output Current has returned below threshold." + --#TYPE "APC Automatic Transfer Switch: Output Current below threshold." + --#SUMMARY "Output Current has returned below threshold." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 133 + +atsPowerSupplyFailure TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: The Automatic Transfer Switch Power Supply has failed. + The first variable is an integer representing the Power Supply which + has failed: 0=24V, 1=12V 2=5V." + --#TYPE "APC Automatic Transfer Switch: The ATS Power Supply has failed." + --#SUMMARY "The Automatic Transfer Switch Power Supply has failed." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 134 + +atsPowerSupplyFailureCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The Automatic Transfer Power Supply Failure Cleared. + The first variable is an integer representing the Power Supply which + has cleared: 0=24V, 1=12V 2=5V." + --#TYPE "APC Automatic Transfer Switch: Power Supply Failure Cleared." + --#SUMMARY "The Automatic Transfer Switch Power Supply Failure Cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 135 + +dcMainsFailAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: A Mains Fail alarm is active in the DC power plant." + --#TYPE "APC: A Mains Fail alarm is active in the DC power plant." + --#SUMMARY "A Mains Fail alarm is active in the DC power plant." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 136 + +dcMainsFailAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Mains Fail alarm is no longer active in the DC power plant." + --#TYPE "APC: Mains Fail alarm is no longer active in the DC power plant." + --#SUMMARY "Mains Fail alarm is no longer active in the DC power plant." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 137 + +dcFanFailAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: A Fan Fail alarm is active in the DC power plant." + --#TYPE "APC: A Fan Fail alarm is active in the DC power plant." + --#SUMMARY "A Fan Fail alarm is active in the DC power plant." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 138 + +dcFanFailAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A Fan Fail alarm is no longer active in the DC power plant." + --#TYPE "APC: A Fan Fail alarm is no longer active in the DC power plant." + --#SUMMARY "A Fan Fail alarm is no longer active in the DC power plant." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 139 + +dcRectifierOvertempAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: Rect. Overtemp alarm is active in the power plant." + --#TYPE "APC: Rect. Overtemp alarm is active in the power plant." + --#SUMMARY "Rect. Overtemp alarm is active in the power plant." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 140 + +dcRectifierOvertempAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Rect. Overtemp alarm is no longer active in the power plant." + --#TYPE "APC: Rect. Overtmp alarm is no longer active in the power plant." + --#SUMMARY "Rect. Overtmp alarm is no longer active in the power plant." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 141 + +dcCurrentLimitAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: A Current Limit alarm is active in the power plant." + --#TYPE "APC: A Current Limit alarm is active in the power plant." + --#SUMMARY "A Current Limit alarm is active in the power plant." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 142 + +dcCurrentLimitAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Current Limit alarm is no longer active in the power plant." + --#TYPE "APC: Current Limit alarm is no longer active in the power plant." + --#SUMMARY "Current Limit alarm is no longer active in the power plant." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 143 + +dcRectifierFailAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: A Rect. Fail alarm is active in the power plant." + --#TYPE "APC: A Rect. Fail alarm is active in the power plant." + --#SUMMARY "A Rect. Fail alarm is active in the power plant." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 144 + +dcRectifierFailAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Rect. Fail alarm is no longer active in the power plant." + --#TYPE "APC: Rect. Fail alarm is no longer active in the power plant." + --#SUMMARY "Rect. Fail alarm is no longer active in the power plant." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 145 + +dcMultRectFailAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: Multiple Rect. Fail alarm is active in the powerplant." + --#TYPE "APC: Multiple Rect. Fail alarm is active in the powerplant." + --#SUMMARY "Multiple Rect. Fail alarm is active in the powerplant." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 146 + +dcMultRectFailAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Mult Rect Fail alarm is no longer active in the powerplant." + --#TYPE "APC: Mult Rect Fail alarm is no longer active in the powerplant." + --#SUMMARY "Mult Rect Fail alarm is no longer active in the powerplant." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 147 + +dcBatteryBreakerAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: Batt. Breaker alarm is active in the power plant." + --#TYPE "APC: Batt. Breaker alarm is active in the power plant." + --#SUMMARY "Batt. Breaker alarm is active in the power plant." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 148 + +dcBatteryBreakerAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Batt. Breaker alarm is no longer active in the power plant." + --#TYPE "APC: Batt. Breaker alarm is no longer active in the power plant." + --#SUMMARY "Batt. Breaker alarm is no longer active in the power plant." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 149 + +dcRectifierOVPAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: A Rect. OVP alarm is active in the power plant." + --#TYPE "APC: A Rect. OVP alarm is active in the power plant." + --#SUMMARY "A Rect. OVP alarm is active in the power plant." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 150 + +dcRectifierOVPAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A Rect. OVP alarm is no longer active in the power plant." + --#TYPE "APC: A Rect. OVP alarm is no longer active in the power plant." + --#SUMMARY "A Rect. OVP alarm is no longer active in the power plant." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 151 + +dcLVDImminentAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: A LVD Imminent alarm is active in the powerplant." + --#TYPE "APC: A LVD Imminent alarm is active in the powerplant." + --#SUMMARY "A LVD Imminent alarm is active in the powerplant." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 152 + +dcLVDImminentAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A LVD Imminent alarm is no longer active in the powerplant." + --#TYPE "APC: A LVD Imminent alarm is no longer active in the powerplant." + --#SUMMARY "A LVD Imminent alarm is no longer active in the powerplant." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 153 + +dcFuseCBAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: A Fuse/CB alarm is active in the DC power plant." + --#TYPE "APC: A Fuse/CB alarm alarm is active in the DC power plant." + --#SUMMARY "A Fuse/CB alarm is active in the DC power plant." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 154 + +dcFuseCBAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A Fuse/CB alarm is no longer active in the DC power plant." + --#TYPE "APC: A Fuse/CB alarm is no longer active in the DC power plant." + --#SUMMARY "A Fuse/CB alarm is no longer active in the DC power plant." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 155 + +dcBatteryTestFail TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: A Battery Test failed in the DC power plant." + --#TYPE "APC: A Battery Test failed in the DC power plant." + --#SUMMARY "A Battery Test failed in the DC power plant." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 156 + +dcTemperatureAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: A Temperature is active in the power plant." + --#TYPE "APC: A Temperature alarm is active in the power plant." + --#SUMMARY "A Temperature alarm is active in the power plant." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 157 + +dcTemperatureAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A Temperature alarm is no longer active in the power plant." + --#TYPE "APC: A Temperature alarm is no longer active in the power plant." + --#SUMMARY "A Temperature alarm is no longer active in the power plant." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 158 + +dcHumidityAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: A Humidity alarm is active in the DC power plant." + --#TYPE "APC: A Humidity alarm is active in the DC power plant." + --#SUMMARY "A Humidity alarm is active in the DC power plant." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 159 + +dcHumidityAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A Humidity alarm is no longer active in the DC power plant." + --#TYPE "APC: A Humidity alarm is no longer active in the DC power plant." + --#SUMMARY "A Humidity alarm is no longer active in the DC power plant." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 160 + +dcBBCommunicationEstablished TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Power plant bridging board communications established." + --#TYPE "APC: Power plant bridging board communications established." + --#SUMMARY "Power plant bridging board communications established." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 161 + +dcBBCommunicationLost TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "SEVERE: Power plant bridging board communications lost." + --#TYPE "APC: Power plant bridging board communications lost." + --#SUMMARY "Power plant bridging board communications lost." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 162 + +iemHighTempThresholdViolation TRAP-TYPE + ENTERPRISE apc + VARIABLES { iemStatusProbeCurrentTemp, iemStatusProbeTempUnits, iemStatusProbeNumber, + iemStatusProbeName, mtrapargsString } + DESCRIPTION + "SEVERE: High temperature threshold violated on Integrated + Environmental Monitor probe. The first variable is the + current temperature. The second variable is the temperature + scale. The third variable is the probe number. The fourth + variable is the probe name." + --#TYPE "APC IEM: High temperature threshold violation." + --#SUMMARY "High temperature threshold violation." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 163 + +iemHighTempThresholdViolationCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { iemStatusProbeNumber, iemStatusProbeName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: High temperature threshold violated on Integrated + Environmental Monitor probe has been cleared. The first variable + is the probe number. The second variable is the probe name." + --#TYPE "APC IEM: High temperature threshold violation cleared." + --#SUMMARY "High temperature threshold violation has been cleared." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 164 + +iemLowTempThresholdViolation TRAP-TYPE + ENTERPRISE apc + VARIABLES { iemStatusProbeCurrentTemp, iemStatusProbeTempUnits, iemStatusProbeNumber, + iemStatusProbeName, mtrapargsString } + DESCRIPTION + "SEVERE: Low temperature threshold violated on integrated + probe. The first variable is the current temperature. The + second variable is the temperature scale. The third + variable is the probe number. The fourth variable is the + probe name." + --#TYPE "APC IEM: Low temperature threshold violation." + --#SUMMARY "Low temperature threshold violation." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 165 + +iemLowTempThresholdViolationCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { iemStatusProbeNumber, iemStatusProbeName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Low temperature threshold violated on integrated + probe has been cleared. The first variable is the probe number. + The second variable is the probe name." + --#TYPE "APC IEM: Low temperature threshold violation cleared." + --#SUMMARY "Low temperature threshold violation has been cleared." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 166 + +iemHighHumidThresholdViolation TRAP-TYPE + ENTERPRISE apc + VARIABLES { iemStatusProbeCurrentHumid, iemStatusProbeNumber, iemStatusProbeName, + mtrapargsString } + DESCRIPTION + "SEVERE: High humidity threshold violated on integrated + probe. The first variable is the current humidity. The + second variable is the probe number. The third variable + is the probe name." + --#TYPE "APC IEM: High humidity threshold violation." + --#SUMMARY "High humidity threshold violation." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 167 + +iemHighHumidThresholdViolationCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { iemStatusProbeNumber, iemStatusProbeName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: High humidity threshold violated on integrated + probe cleared. The first variable is the probe number. The second + variable is the probe name." + --#TYPE "APC IEM: High humidity threshold violation cleared." + --#SUMMARY "High humidity threshold violation has been cleared." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 168 + +iemLowHumidThresholdViolation TRAP-TYPE + ENTERPRISE apc + VARIABLES { iemStatusProbeCurrentHumid, iemStatusProbeNumber, iemStatusProbeName, + mtrapargsString } + DESCRIPTION + "SEVERE: Low humidity threshold violated on integrated + probe. The first variable is the current humidity. The + second variable is the probe number. The third variable + is the probe name." + --#TYPE "APC IEM: Low humidity threshold violation." + --#SUMMARY "Low humidity threshold violation." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 169 + +iemLowHumidThresholdViolationCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { iemStatusProbeNumber, iemStatusProbeName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Low humidity threshold violated on integrated + probe cleared. The first variable is the probe number. The second + variable is the probe name." + --#TYPE "APC IEM: Low humidity threshold violation cleared." + --#SUMMARY "Low humidity threshold violation has been cleared." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 170 + +iemProbeDisconnected TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: The temperature/humidity probe on the Integrated + Environmental Monitor has been disconnected. This trap is + generated when a probe that has been in communication with + the Environmental Monitor has been disconnected or can no + longer communicate." + --#TYPE "APC IEM: Probe disconnected." + --#SUMMARY "Probe has been disconnected." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 171 + +iemProbeConnected TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The temperature/humidity probe on the Integrated + Environmental Monitor has been connected. This trap is generated + when the Environmental Monitor establishes communication with a + probe that had previously not been connected." + --#TYPE "APC IEM: Probe Connected." + --#SUMMARY "Probe has been connected." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 172 + +iemContactFault TRAP-TYPE + ENTERPRISE apc + VARIABLES { iemStatusContactNumber, iemStatusContactName, mtrapargsString } + DESCRIPTION + "SEVERE: There is a contact fault on the Integrated + Environmental Monitor. The first argument is the number + of the contact. The second argument is the name of the + contact." + --#TYPE "APC IEM: Contact fault." + --#SUMMARY "Contact fault." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 173 + +iemContactFaultCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { iemStatusContactNumber, iemStatusContactName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The contact fault on the Integrated + Environmental Monitor has been cleared. The first + argument is the number of the contact. The second + argument is the name of the contact." + --#TYPE "APC IEM: Contact fault." + --#SUMMARY "Contact fault cleared." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 174 + +iemRelayFault TRAP-TYPE + ENTERPRISE apc + VARIABLES { iemStatusRelayNumber, iemStatusRelayName, mtrapargsString02, mtrapargsString } + DESCRIPTION + "SEVERE: The output relay on the Integrated Environmental + Monitor has switched to the fault state. The first + argument is the number of the output relay. The second + argument is the name of the output relay. The third + argument is the event that caused the fault." + --#TYPE "APC IEM: Output relay fault." + --#SUMMARY "Output relay has faulted." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 175 + +iemRelayFaultCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { iemStatusRelayNumber, iemStatusRelayName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The fault condition on the output relay on the + Integrated Environmental Monitor has cleared. The first + argument is the number of the output relay. The second + argument is the name of the output relay." + --#TYPE "APC IEM: Output relay fault condition cleared." + --#SUMMARY "Output relay fault cleared." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 176 + +bmBatManCommEstab TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Serial Communications Established with Battery Manager." + --#TYPE "BatMan : Communications Established." + --#SUMMARY "Communications Established." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 177 + +bmBatManCommLost TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: Serial Communications Lost with Battery Manager." + --#TYPE "BatMan : Communications Lost." + --#SUMMARY "Communications Lost." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 178 + +bmBatManKneeAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: Battery Voltage Knee Threshold Alarm Detected." + --#TYPE "BatMan : Knee Alarm Detected." + --#SUMMARY "Knee Alarm Detected." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 179 + +bmBatManKneeAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Battery Voltage Knee Threshold Alarm Cleared." + --#TYPE "BatMan : Knee Alarm Cleared." + --#SUMMARY "Knee Alarm Cleared." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 180 + +bmBatManChargerAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "WARNING: Charger Alarm Detected." + --#TYPE "BatMan : Charger Alarm Detected." + --#SUMMARY "Charger Alarm Detected." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 181 + +bmBatManChargerAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Charger Alarm Cleared." + --#TYPE "BatMan : Charger Alarm Cleared." + --#SUMMARY "Charger Alarm Cleared." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 182 + +bmBatManBatteryAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "WARNING: Battery Alarm Detected." + --#TYPE "BatMan : Battery Alarm Detected." + --#SUMMARY "Battery Alarm Detected." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 183 + +bmBatManBatteryAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Battery Alarm Cleared." + --#TYPE "BatMan : Battery Alarm Cleared." + --#SUMMARY "Battery Alarm Cleared." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 184 + +bmBatManEnvironmentAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "WARNING: Environment Alarm Detected." + --#TYPE "BatMan : Environment Alarm Detected." + --#SUMMARY "Environment Alarm Detected." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 185 + +bmBatManEnvironmentAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Environment Alarm Cleared." + --#TYPE "BatMan : Environment Alarm Cleared." + --#SUMMARY "Environment Alarm Cleared." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 186 + +bmBatManMaintenanceAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Maintenance Alarm Detected." + --#TYPE "BatMan : Maintenance Due Alarm Detected." + --#SUMMARY "Maintenance Due Alarm Detected." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 187 + +bmBatManMaintenanceAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Maintenance Alarm Cleared." + --#TYPE "BatMan : Maintenance Due Alarm Cleared." + --#SUMMARY "Maintenance Due Alarm Cleared." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 188 + +pduCommunicationEstablished TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Communication Established. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC PDU: Communication Established." + --#SUMMARY "Communication Established." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 189 + +pduCommunicationLost TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsString } + DESCRIPTION + "SEVERE: Communication Lost. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC PDU: Communication Lost." + --#SUMMARY "Communication Lost." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 190 + +pduUtilityLineUndervoltage TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: Utility Line Undervoltage. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase number." + --#TYPE "APC PDU: Utility Line Undervoltage." + --#SUMMARY "Utility Line Undervoltage." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 191 + +pduUtilityLineUndervoltageCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Utility Line Undervoltage Cleared. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase number." + --#TYPE "APC PDU: Utility Line Undervoltage Cleared." + --#SUMMARY "Utility Line Undervoltage Cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 192 + +pduUtilityLineOvervoltage TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: Utility Line Overvoltage. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase number." + --#TYPE "APC PDU: Utility Line Overvoltage." + --#SUMMARY "Utility Line Overvoltage." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 193 + +pduUtilityLineOvervoltageCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Utility Line Overvoltage Cleared. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase number." + --#TYPE "APC PDU: Utility Line Overvoltage Cleared." + --#SUMMARY "Utility Line Overvoltage Cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 194 + +pduGroundOvercurrent TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsString } + DESCRIPTION + "SEVERE: Ground Overcurrent. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC PDU: Ground Overcurrent." + --#SUMMARY "Ground Overcurrent." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 195 + +pduGroundOvercurrentCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Ground Overcurrent Cleared. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC PDU: Ground Overcurrent Cleared." + --#SUMMARY "Ground Overcurrent Cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 196 + +pduCircuitPanelInputUndervoltage TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: Circuit Panel Input Undervoltage. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase number." + --#TYPE "APC PDU: Circuit Panel Input Undervoltage." + --#SUMMARY "Circuit Panel Input Undervoltage." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 197 + +pduCircuitPanelInputUndervoltageCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Circuit Panel Input Undervoltage Cleared. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase number." + --#TYPE "APC PDU: Circuit Panel Input Undervoltage Cleared." + --#SUMMARY "Circuit Panel Input Undervoltage Cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 198 + +pduCircuitPanelInputOvervoltage TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: Circuit Panel Input Overvoltage. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase number." + --#TYPE "APC PDU: Circuit Panel Input Overvoltage." + --#SUMMARY "Circuit Panel Input Overvoltage." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 199 + +pduCircuitPanelInputOvervoltageCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Circuit Panel Input Overvoltage Cleared. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase number." + --#TYPE "APC PDU: Circuit Panel Input Overvoltage Cleared." + --#SUMMARY "Circuit Panel Input Overvoltage Cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 200 + +pduCircuitPanelInputUndercurrent TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: Circuit Panel Input Undercurrent. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase number." + --#TYPE "APC PDU: Circuit Panel Input Undercurrent." + --#SUMMARY "Circuit Panel Input Undercurrent." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 201 + +pduCircuitPanelInputUndercurrentCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Circuit Panel Input Undercurrent Cleared. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase number." + --#TYPE "APC PDU: Circuit Panel Input Undercurrent Cleared." + --#SUMMARY "Circuit Panel Input Undercurrent Cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 202 + +pduCircuitPanelInputOvercurrent TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: Circuit Panel Input Overcurrent. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase number." + --#TYPE "APC PDU: Circuit Panel Input Overcurrent." + --#SUMMARY "Circuit Panel Input Overcurrent." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 203 + +pduCircuitPanelInputOvercurrentCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Circuit Panel Input Overcurrent Cleared. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase number." + --#TYPE "APC PDU: Circuit Panel Input Overcurrent Cleared." + --#SUMMARY "Circuit Panel Input Overcurrent Cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 204 + +pduCircuitPanelFrequencyOutOfRange TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsString } + DESCRIPTION + "SEVERE: Circuit Panel Input Frequency Out Of Range. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC PDU: Circuit Panel Input Frequency Out Of Range." + --#SUMMARY "Circuit Panel Input Frequency Out Of Range." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 205 + +pduCircuitPanelFrequencyOutofRangeCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Circuit Panel Input Frequency No Longer Out Of Range. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC PDU: Circuit Panel Input Frequency No Longer Out Of Range." + --#SUMMARY "Circuit Panel Input Frequency No Longer Out Of Range." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 206 + +pduCircuitPanelNeutralOvercurrent TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsString } + DESCRIPTION + "SEVERE: Circuit Panel Input Neutral Overcurrent. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC PDU: Circuit Panel Input Neutral Overcurrent." + --#SUMMARY "Circuit Panel Input Neutral Overcurrent." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 207 + +pduCircuitPanelNeutralOvercurrentCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Circuit Panel Input Neutral Overcurrent Cleared. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC PDU: Circuit Panel Input Neutral Overcurrent Cleared." + --#SUMMARY "Circuit Panel Input Neutral Overcurrent Cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 208 + +pduSystemOff TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsString } + DESCRIPTION + "SEVERE: PDU System Off. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC PDU: System Off." + --#SUMMARY "PDU System Off." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 209 + +pduOnBatteryMode TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsString } + DESCRIPTION + "SEVERE: PDU is in On Battery Mode. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC PDU: On Battery Mode." + --#SUMMARY "PDU is in On Battery Mode." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 210 + +pduMaintenanceBypassMode TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: PDU is in Maintenance Bypass Mode. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC PDU: Maintenance Bypass Mode." + --#SUMMARY "PDU is in Maintenance Bypass Mode." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 211 + +pduAtypicalBypassMode TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsString } + DESCRIPTION + "WARNING: PDU is in Atypical Bypass Mode. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC PDU: Atypical Bypass Mode." + --#SUMMARY "PDU is in Atypical Bypass Mode." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 212 + +pduNoPanelFeedMode TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsString } + DESCRIPTION + "SEVERE: PDU is in No Panel Feed Mode. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC PDU: No Panel Feed Mode." + --#SUMMARY "PDU is in No Panel Feed Mode." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 213 + +pduUpsOperationMode TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: PDU is in Ups Operation Mode. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC PDU: Ups Operation Mode." + --#SUMMARY "PDU is in Ups Operation Mode." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 214 + +pduForcedBypassMode TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsString } + DESCRIPTION + "WARNING: PDU is in Forced Bypass Mode. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC PDU: Forced Bypass Mode." + --#SUMMARY "PDU is in Forced Bypass Mode." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 215 + +pduInputTransformerOverTemperature TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsString } + DESCRIPTION + "SEVERE: Input Transformer Over Temperature. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC PDU: Input Transformer Over Temperature." + --#SUMMARY "Input Transformer Over Temperature." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 216 + +pduInputTransformerOverTemperatureCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Input Transformer Over Temperature Cleared. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC PDU: Input Transformer Over Temperature Cleared." + --#SUMMARY "Input Transformer Over Temperature Cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 217 + +pduUPSInputVoltageLost TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: UPS Input Voltage phase-N Lost. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase number." + --#TYPE "APC PDU: UPS Input Voltage phase-N Lost." + --#SUMMARY "UPS Input Voltage phase-N Lost." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 218 + +pduUPSInputVoltageRestored TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: UPS Input Voltage phase-N Restored. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase number." + --#TYPE "APC PDU: UPS Input Voltage phase-N Restored." + --#SUMMARY "UPS Input Voltage phase-N Restored." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 219 + +pduContactFault TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: A contact closure in the PDU is in an abnormal position. + The first argument is the serial number. + The second argument is the device name. + The third argument is the number of the contact." + --#TYPE "APC PDU: Contact Abnormal." + --#SUMMARY "Contact Abnormal." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 220 + +pduContactFaultCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A contact closure in the PDU is in a normal position. + The first argument is the serial number. + The second argument is the device name. + The third argument is the number of the contact." + --#TYPE "APC PDU: Contact Normal." + --#SUMMARY "Contact Normal." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 221 + +rPDUBankPhaseLowLoad TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, + rPDULoadStatusBankNumber, rPDULoadStatusPhaseNumber, mtrapargsString } + DESCRIPTION + "WARNING: A bank or phase on the Rack PDU has violated the low load threshold. + The first argument is the serial number. + The second argument is the device name. + The third argument is the bank number (0 if this is phase data). + The fourth argument is the phase number (0 if this is bank data)." + --#TYPE "APC Rack PDU: Violation of bank or phase low load threshold." + --#SUMMARY "A bank or phase on the Rack PDU has violated the low load threshold." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 222 + +rPDUBankPhaseLowLoadCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, + rPDULoadStatusBankNumber, rPDULoadStatusPhaseNumber, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The bank or phase low load condition on a Rack PDU has been + cleared. + The first argument is the serial number. + The second argument is the device name. + The third argument is the bank number (0 if this is phase data). + The fourth argument is the phase number (0 if this is bank data)." + --#TYPE "APC Rack PDU: Bank or phase low load condition cleared." + --#SUMMARY "The bank or phase low load condition on a Rack PDU has been cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 223 + +rPDUBankPhaseNearOverload TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, + rPDULoadStatusBankNumber, rPDULoadStatusPhaseNumber, mtrapargsString } + DESCRIPTION + "WARNING: A bank or phase of the Rack PDU is near an overload condition. + The first argument is the serial number. + The second argument is the device name. + The third argument is the bank number (0 if this is phase data). + The fourth argument is the phase number (0 if this is bank data)." + --#TYPE "APC Rack PDU: Bank or phase near an overload condition." + --#SUMMARY "A bank or phase of the Rack PDU is near an overload condition." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 224 + +rPDUBankPhaseNearOverloadCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, + rPDULoadStatusBankNumber, rPDULoadStatusPhaseNumber, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The bank or phase near overload condition on a Rack PDU has + been cleared. + The first argument is the serial number. + The second argument is the device name. + The third argument is the bank number (0 if this is phase data). + The fourth argument is the phase number (0 if this is bank data)." + --#TYPE "APC Rack PDU: Bank or phase near overload condition has cleared." + --#SUMMARY "Rack PDU bank or phase near overload condition has cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 225 + +rPDUBankPhaseOverload TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, + rPDULoadStatusBankNumber, rPDULoadStatusPhaseNumber, mtrapargsString } + DESCRIPTION + "SEVERE: A bank or phase of the Rack PDU is in an overload condition. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase number. + The third argument is the bank number (0 if this is phase data). + The fourth argument is the phase number (0 if this is bank data)." + --#TYPE "APC Rack PDU: Bank or phase overload condition." + --#SUMMARY "A bank or phase of the Rack PDU is in an overload condition." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 226 + +rPDUBankPhaseOverloadCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, + rPDULoadStatusBankNumber, rPDULoadStatusPhaseNumber, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The bank or phase overload condition on a Rack PDU has been + cleared. + The first argument is the serial number. + The second argument is the device name. + The third argument is the bank number (0 if this is phase data). + The fourth argument is the phase number (0 if this is bank data)." + --#TYPE "APC Rack PDU: Bank or phase overload condition has cleared." + --#SUMMARY "The bank or phase overload condition on a Rack PDU has cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 227 + +aruDeviceConfigChange TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, + rARUStatusAruIndex, rARUStatusAruName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Remote ARU Device Configurtion change. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the ARU number. + The fourth argument is the ARU name." + --#TYPE "APC ARU: ARU Device configuration change." + --#SUMMARY "ARU device configuration change." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 228 + +rmPDUCommunicationLost TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString03, mtrapargsString02, mtrapargsString } + DESCRIPTION + "SEVERE: Communication Lost. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC RM PDU: Communication Lost." + --#SUMMARY "Communication Lost." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 229 + +emsCommunicationEstablished TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Communication Established. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC EMS: Communication Established." + --#SUMMARY "Communication Established." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 230 + +emsCommunicationLost TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, mtrapargsString } + DESCRIPTION + "SEVERE: Communication Lost. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC EMS: Communication Lost." + --#SUMMARY "Communication Lost." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 231 + +emsProbeConnected TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A probe has been connected to the EMS. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the probe number. + The fourth argument is the probe name." + --#TYPE "APC EMS: Probe Connected." + --#SUMMARY "Probe Connected." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 232 + +emsProbeDisconnected TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "SEVERE: A probe has been disconnected from the EMS. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the probe number. + The fourth argument is the probe name." + --#TYPE "APC EMS: Probe Disconnected." + --#SUMMARY "Probe Disconnected." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 233 + +emsSensorConnected TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, + emsSensorStatusSensorIndex, emsSensorStatusSensorName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A sensor has been connected to the EMS. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the sensor number. + The fourth argument is the sensor name." + --#TYPE "APC EMS: Sensor Connected." + --#SUMMARY "Sensor Connected." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 234 + +emsSensorDisconnected TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, + emsSensorStatusSensorIndex, emsSensorStatusSensorName, mtrapargsString } + DESCRIPTION + "SEVERE: A sensor has been disconnected from the EMS. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the sensor number. + The fourth argument is the sensor name." + --#TYPE "APC EMS: Sensor Disconnected." + --#SUMMARY "Sensor Disconnected." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 235 + +emsSensorFault TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, + emsSensorStatusSensorIndex, emsSensorStatusSensorName, mtrapargsString } + DESCRIPTION + "SEVERE: A EMS sensor is in the fault condition. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the sensor number. + The fourth argument is the sensor name." + --#TYPE "APC EMS: Sensor Fault." + --#SUMMARY "Sensor Fault." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 236 + +emsSensorFaultCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, + emsSensorStatusSensorIndex, emsSensorStatusSensorName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A EMS sensor fault condition has cleared. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the sensor number. + The fourth argument is the sensor name." + --#TYPE "APC EMS: Sensor Fault Cleared." + --#SUMMARY "Sensor Fault Cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 237 + +emsBeaconConnected TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A beacon has been connected to the EMS. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC EMS: Beacon Connected." + --#SUMMARY "Beacon Connected." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 238 + +emsBeaconDisconnected TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, mtrapargsString } + DESCRIPTION + "SEVERE: A beacon has been disconnected from the EMS. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC EMS: Beacon Disconnected." + --#SUMMARY "Beacon Disconnected." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 239 + +emsBeaconOn TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A EMS beacon has gone on. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC EMS: Beacon On." + --#SUMMARY "Beacon On." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 240 + +emsBeaconOff TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A EMS beacon has gone off. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC EMS: Beacon Off." + --#SUMMARY "Beacon Off." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 241 + +emsMajorAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, mtrapargsString } + DESCRIPTION + "SEVERE: A Major Alarm is present in the EMS. + The first argument is the EMS serial number. + The second argument is the EMS name." + --#TYPE "APC EMS: Major Alarm." + --#SUMMARY "Major Alarm." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 242 + +emsMajorAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A Major Alarm condition has been cleared in the EMS. + The first argument is the EMS serial number. + The second argument is the EMS name." + --#TYPE "APC EMS: Major Alarm Cleared." + --#SUMMARY "Major Alarm Cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 243 + +emsMinorAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, mtrapargsString } + DESCRIPTION + "SEVERE: A Minor Alarm is present in the EMS. + The first argument is the EMS serial number. + The second argument is the EMS name." + --#TYPE "APC EMS: Minor Alarm." + --#SUMMARY "Minor Alarm." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 244 + +emsMinorAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A Minor Alarm condition has been cleared in the EMS. + The first argument is the EMS serial number. + The second argument is the EMS name." + --#TYPE "APC EMS: Minor Alarm Cleared." + --#SUMMARY "Minor Alarm Cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 245 + +emsOutletStateAbnormal TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsOutletStatusOutletIndex, emsOutletStatusOutletName, + emsOutletStatusOutletState, emsOutletStatusOutletNormalState, mtrapargsString } + DESCRIPTION + "WARNING: An outlet on the EMS has changed to its abnormal state. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the outlet number. + The fourth argument is the outlet name. + The fifth argument is the current outlet state (1=ON, 2=OFF). + The sixth argument is the configured normal outlet state (1=ON, 2=OFF)." + --#TYPE "APC EMS: Outlet has changed to its abnormal state." + --#SUMMARY "Outlet has changed to its abnormal state." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 246 + +emsOutletStateNormal TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsOutletStatusOutletIndex, emsOutletStatusOutletName, + emsOutletStatusOutletState, emsOutletStatusOutletNormalState, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An outlet on the EMS has changed to its normal state. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the outlet number. + The fourth argument is the outlet name. + The fifth argument is the current outlet state (1=ON, 2=OFF). + The sixth argument is the configured normal outlet state (1=ON, 2=OFF)." + --#TYPE "APC EMS: Outlet has changed to its normal state." + --#SUMMARY "Outlet has changed to its normal state." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 247 + +emsInputContactStateAbnormal TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsInputContactStatusInputContactIndex, + emsInputContactStatusInputContactName, emsInputContactStatusInputContactState, + emsInputContactStatusInputContactNormalState, mtrapargsString } + DESCRIPTION + "WARNING: An input contact on the EMS has changed to its abnormal state. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the input contact number. + The fourth argument is the input contact name. + The fifth argument is the input contact state (1=CLOSED, 2=OPEN). + The sixth argument is the configured normal input contact state (1=CLOSED, 2=OPEN)." + --#TYPE "APC EMS: Input contact has changed to its abnormal state." + --#SUMMARY "Input contact has changed to its abnormal state." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 248 + +emsInputContactStateNormal TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsInputContactStatusInputContactIndex, + emsInputContactStatusInputContactName, emsInputContactStatusInputContactState, + emsInputContactStatusInputContactNormalState, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An input contact on the EMS has changed to its normal state. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the input contact number. + The fourth argument is the input contact name. + The fifth argument is the input contact state (1=CLOSED, 2=OPEN). + The sixth argument is the configured normal input contact state (1=CLOSED, 2=OPEN)." + --#TYPE "APC EMS: Input contact has changed to its normal state." + --#SUMMARY "Input contact has changed to its normal state." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 249 + +emsOutputRelayStateAbnormal TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsOutputRelayStatusOutputRelayIndex, + emsOutputRelayStatusOutputRelayName, emsOutputRelayStatusOutputRelayState, + emsOutputRelayStatusOutputRelayNormalState, mtrapargsString } + DESCRIPTION + "WARNING: An output relay on the EMS has changed to its abnormal state. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the output relay number. + The fourth argument is the output relay name. + The fifth argument is the current output relay state (1=CLOSED, 2=OPEN). + The sixth argument is the configured normal output relay state (1=CLOSED, 2=OPEN)." + --#TYPE "APC EMS: Output Relay has changed to its abnormal state." + --#SUMMARY "Output Relay has changed to its abnormal state." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 250 + +emsOutputRelayStateNormal TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsOutputRelayStatusOutputRelayIndex, + emsOutputRelayStatusOutputRelayName, emsOutputRelayStatusOutputRelayState, + emsOutputRelayStatusOutputRelayNormalState, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An output relay on the EMS has changed to its normal state. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the output relay number. + The fourth argument is the output relay name. + The fifth argument is the current output relay state (1=CLOSED, 2=OPEN). + The sixth argument is the configured normal output relay state (1=CLOSED, 2=OPEN)." + --#TYPE "APC EMS: Output Relay has changed to its normal state." + --#SUMMARY "Output Relay has changed to its normal state." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 251 + +emsDeviceConfigChange TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A device configuration change has been made on the EMS. + The first argument is the EMS serial number. + The second argument is the EMS name." + --#TYPE "APC: A device configuration change on a EMS." + --#SUMMARY "A device configuration change has been made on a EMS." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 252 + +envHighTempThresholdViolation TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeTemperature, emsStatusSysTempUnits, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "SEVERE: High temperature threshold violated on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current temperature. + The fourth argument is the temperature scale. + The fifth argument is the probe number. + The sixth argument is the probe name." + --#TYPE "APC ENV: High temperature threshold violation." + --#SUMMARY "High temperature threshold violation." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 253 + +envHighTempThresholdViolationCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeTemperature, emsStatusSysTempUnits, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: High temperature threshold violation cleared on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current temperature. + The fourth argument is the temperature scale. + The fifth argument is the probe number. + The sixth argument is the probe name." + --#TYPE "APC ENV: High temperature threshold violation cleared." + --#SUMMARY "High temperature threshold violation cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 254 + +envLowTempThresholdViolation TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeTemperature, emsStatusSysTempUnits, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "SEVERE: Low temperature threshold violated on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current temperature. + The fourth argument is the temperature scale. + The fifth argument is the probe number. + The sixth argument is the probe name." + --#TYPE "APC ENV: Low temperature threshold violation." + --#SUMMARY "Low temperature threshold violation." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 255 + +envLowTempThresholdViolationCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeTemperature, emsStatusSysTempUnits, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Low temperature threshold violation cleared on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current temperature. + The fourth argument is the temperature scale. + The fifth argument is the probe number. + The sixth argument is the probe name." + --#TYPE "APC ENV: Low temperature threshold violation cleared." + --#SUMMARY "Low temperature threshold violation cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 256 + +envHighHumidityThresholdViolation TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeHumidity, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "SEVERE: High humidity threshold violated on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current humidity + The fourth argument is the probe number. + The fifth argument is the probe name." + --#TYPE "APC ENV: High humidity threshold violation." + --#SUMMARY "High humidity threshold violation." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 257 + +envHighHumidityThresholdViolationCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeHumidity, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: High humidity threshold violation cleared on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current humidity. + The fourth argument is the probe number. + The fifth argument is the probe name." + --#TYPE "APC ENV: High humidity threshold violation cleared." + --#SUMMARY "High humidity threshold violation cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 258 + +envLowHumidityThresholdViolation TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeHumidity, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "SEVERE: Low humidity threshold violated on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current humidity + The fourth argument is the probe number. + The fifth argument is the probe name." + --#TYPE "APC ENV: Low humidity threshold violation." + --#SUMMARY "Low humidity threshold violation." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 259 + +envLowHumidityThresholdViolationCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeHumidity, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Low humidity threshold violation cleared on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current humidity. + The fourth argument is the probe number. + The fifth argument is the probe name." + --#TYPE "APC ENV: Low humidity threshold violation cleared." + --#SUMMARY "Low humidity threshold violation cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 260 + + +-- Switched and Metered Rack PDU Traps + +rPDUCommunicationEstablished TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Communication with a Rack PDU has been established. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC Rack PDU: Communication established." + --#SUMMARY "Communication with a Rack PDU established." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 266 + +rPDUCommunicationLost TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, mtrapargsString } + DESCRIPTION + "SEVERE: Communication with a Rack PDU has been lost. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC Rack PDU: Communication lost." + --#SUMMARY "Communication with a Rack PDU has been lost." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 267 + +rPDUOutletOn TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, + rPDUOutletControlIndex, rPDUOutletControlOutletName, + mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An outlet on a Switched Rack PDU has turned on. + The first argument is the serial number. + The second argument is the device name. + The third argument is the outlet index number. + The fourth argument is the outlet name." + --#TYPE "APC Switched Rack PDU: An outlet has turned on." + --#SUMMARY "An outlet on a Switched Rack PDU has turned on." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 268 + +rPDUOutletOff TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, + rPDUOutletControlIndex, rPDUOutletControlOutletName, + mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An outlet on a Switched Rack PDU has turned off. + The first argument is the serial number. + The second argument is the device name. + The third argument is the outlet index number. + The fourth argument is the outlet name." + --#TYPE "APC Switched Rack PDU: An outlet has turned off." + --#SUMMARY "An outlet on a Switched Rack PDU has turned off." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 269 + +rPDUDeviceConfigChange TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A device configuration change has been made on a + Rack PDU. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC Rack PDU: Device configuration change made." + --#SUMMARY "Device configuration change has been made on a Rack PDU." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 270 + +rPDUOutletConfigChange TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, + rPDUOutletControlIndex, rPDUOutletControlOutletName, + mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An outlet configuration change has been made on a + Switched Rack PDU. + The first argument is the serial number. + The second argument is the device name. + The third argument is the outlet index number. + The fourth argument is the outlet name." + --#TYPE "APC Switched Rack PDU: Outlet configuration change made." + --#SUMMARY "Outlet configuration change has been made on a Switched Rack PDU." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 271 + +rPDULowLoad TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, + rPDULoadStatusPhaseNumber, mtrapargsString } + DESCRIPTION + "WARNING: A Rack PDU has violated the low load threshold. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase number." + --#TYPE "APC Rack PDU: Violation of low load threshold." + --#SUMMARY "A Rack PDU has violated the low load threshold." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 272 + +rPDULowLoadCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, + rPDULoadStatusPhaseNumber, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The low load condition on a Rack PDU has been + cleared. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase number." + --#TYPE "APC Rack PDU: Low load condition cleared." + --#SUMMARY "The low load condition on a Rack PDU has been cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 273 + +rPDUNearOverload TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, + rPDULoadStatusPhaseNumber, mtrapargsString } + DESCRIPTION + "WARNING: A Rack PDU is near an overload condition. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase number." + --#TYPE "APC Rack PDU: Near an overload condition." + --#SUMMARY "A Rack PDU is near an overload condition." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 274 + +rPDUNearOverloadCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, + rPDULoadStatusPhaseNumber, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The near overload condition on a Rack PDU has + been cleared. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase number." + --#TYPE "APC Rack PDU: Near overload condition has cleared." + --#SUMMARY "Rack PDU near overload condition has cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 275 + +rPDUOverload TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, + rPDULoadStatusPhaseNumber, mtrapargsString } + DESCRIPTION + "SEVERE: A Rack PDU is in an overload condition. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase number." + --#TYPE "APC Rack PDU: Overload condition." + --#SUMMARY "A Rack PDU is in an overload condition." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 276 + +rPDUOverloadCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, + rPDULoadStatusPhaseNumber, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The overload condition on a Rack PDU has been + cleared. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase number." + --#TYPE "APC Rack PDU: Overload condition has cleared." + --#SUMMARY "The overload condition on a Rack PDU has cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 277 + +rPDUPowerSupply1Fail TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, mtrapargsString } + DESCRIPTION + "SEVERE: Power Supply 1 on Rack PDU is in FAIL state. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC Rack PDU: Power Supply 1 is in FAIL state." + --#SUMMARY "Power Supply 1 on Rack PDU is in FAIL state." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 278 + +rPDUPowerSupply1Ok TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Power Supply 1 on Rack PDU is operating normally. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC Rack PDU: Power Supply 1 is operating normally." + --#SUMMARY "Power Supply 1 on Rack PDU is operating normally." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 279 + +rPDUPowerSupply2Fail TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, mtrapargsString } + DESCRIPTION + "SEVERE: Power Supply 2 on Rack PDU is in FAIL state. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC Rack PDU: Power Supply 2 is in FAIL state." + --#SUMMARY "Power Supply 2 on Rack PDU is in FAIL state." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 280 + +rPDUPowerSupply2Ok TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Power Supply 2 on Rack PDU is operating normally. + The first argument is the serial number. + The second argument is the device name." + --#TYPE "APC Rack PDU: Power Supply 2 is operating normally." + --#SUMMARY "Power Supply 2 on Rack PDU is operating normally." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 281 + +rPDUPhaseConfigChange TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, + rPDULoadPhaseConfigIndex, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A phase configuration change has been made on a + Rack PDU. + The first argument is the serial number. + The second argument is the device name. + The third argument is the phase index number." + --#TYPE "APC Rack PDU: Phase configuration change made." + --#SUMMARY "Phase configuration change has been made on a Rack PDU." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 282 + +rPDUCancelPendingCommand TRAP-TYPE + ENTERPRISE apc + VARIABLES { rPDUIdentSerialNumber, rPDUIdentName, + rPDUOutletControlIndex, rPDUOutletControlOutletName, + mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A cancel pending command has been made on a + Switched Rack PDU. + The first argument is the serial number. + The second argument is the device name. + The third argument is the outlet index number (0 indicates all outlets). + The fourth argument is the outlet name (or device name if all outlets)." + --#TYPE "APC Switched Rack PDU: Cancel Pending Command made." + --#SUMMARY "A Cancel Pending Command has been made on a Switched Rack PDU." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 283 + +aruAlinkCommunicationEstablished TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, + rARUStatusAruIndex, rARUStatusAruName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Remote ARU Communication Established. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the ARU number. + The fourth argument is the ARU name." + --#TYPE "APC ARU: Communication Established." + --#SUMMARY "Communication Established." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 284 + +aruAlinkCommunicationLost TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, + rARUStatusAruIndex, rARUStatusAruName, mtrapargsString } + DESCRIPTION + "SEVERE: Remote ARU Communication Lost. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the ARU number. + The fourth argument is the ARU name." + --#TYPE "APC ARU: Communication Lost." + --#SUMMARY "Communication Lost." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 285 + +aruFanFail TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, + rARUStatusAruIndex, rARUStatusAruName, mtrapargsString } + DESCRIPTION + "SEVERE: Remote ARU Fan Fail. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the ARU number. + The fourth argument is the ARU name." + --#TYPE "APC ARU: Fan Fail." + --#SUMMARY "Fan Fail." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 286 + +aruFanFailCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, + rARUStatusAruIndex, rARUStatusAruName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Remote ARU Fan Fail Cleared. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the ARU number. + The fourth argument is the ARU name." + --#TYPE "APC ARU: Fan Fail Cleared." + --#SUMMARY "Fan Fail Cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 287 + +aruSmokeAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, + rARUStatusAruIndex, rARUStatusAruName, mtrapargsString } + DESCRIPTION + "SEVERE: Remote ARU Smoke Alarm. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the ARU number. + The fourth argument is the ARU name." + --#TYPE "APC ARU: Smoke Alarm." + --#SUMMARY "Smoke Alarm." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 288 + +aruSmokeAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, + rARUStatusAruIndex, rARUStatusAruName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Remote ARU Smoke Alarm Cleared. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the ARU number. + The fourth argument is the ARU name." + --#TYPE "APC ARU: Smoke Alarm Cleared." + --#SUMMARY "Smoke Alarm Cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 289 + +aruHighTemperatureAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, + rARUStatusAruIndex, rARUStatusAruName, mtrapargsString } + DESCRIPTION + "SEVERE: Remote ARU High Temperature Alarm. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the ARU number. + The fourth argument is the ARU name." + --#TYPE "APC ARU: High Temperature Alarm." + --#SUMMARY "High Temperature Alarm." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 290 + +aruHighTemperatureAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, + rARUStatusAruIndex, rARUStatusAruName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Remote ARU High Temperature Alarm Cleared. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the ARU number. + The fourth argument is the ARU name." + --#TYPE "APC ARU: High Temperature Alarm Cleared." + --#SUMMARY "High Temperature Alarm Cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 291 + +aruExhaustTemperatureAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, + rARUStatusAruIndex, rARUStatusAruName, mtrapargsString } + DESCRIPTION + "SEVERE: Remote ARU Exhaust Temperature Alarm. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the ARU number. + The fourth argument is the ARU name." + --#TYPE "APC ARU: Exhaust Temperature Alarm." + --#SUMMARY "Exhaust Temperature Alarm." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 292 + +aruExhaustTemperatureAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, + rARUStatusAruIndex, rARUStatusAruName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Remote ARU Exhaust Temperature Alarm Cleared. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the ARU number. + The fourth argument is the ARU name." + --#TYPE "APC ARU: Exhaust Temperature Alarm Cleared." + --#SUMMARY "Exhaust Temperature Alarm Cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 293 + +envAlinkCommunicationEstablished TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Remote Probe Communication Established. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the probe number. + The fourth argument is the probe name." + --#TYPE "APC ENV: Communication Established." + --#SUMMARY "Communication Established." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 294 + +envAlinkCommunicationLost TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "SEVERE: Remote Probe Communication Lost. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the probe number. + The fourth argument is the probe name." + --#TYPE "APC ENV: Communication Lost." + --#SUMMARY "Communication Lost." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 295 + +emsAlinkPowerOverload TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, mtrapargsString } + DESCRIPTION + "SEVERE: Alink Power Overload. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC EMS: Alink Power Overload." + --#SUMMARY "Alink Power Overload." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 296 + +emsAlinkPowerOverloadCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Alink Power Overload Cleared. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC EMS: Alink Power Overload Cleared." + --#SUMMARY "Alink Power Overload Cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 297 + +upsOutletGroupTurnedOn TRAP-TYPE + ENTERPRISE apc + VARIABLES { upsOutletGroupControlIndex, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The specified Outlet Group turned on." + --#TYPE "APC UPS: Outlet Group turned on." + --#SUMMARY "Outlet Group turned on" + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 298 + +upsOutletGroupTurnedOff TRAP-TYPE + ENTERPRISE apc + VARIABLES { upsOutletGroupControlIndex, mtrapargsString } + DESCRIPTION + "WARNING: The specified Outlet Group turned off." + --#TYPE "APC UPS: Outlet Group turned off." + --#SUMMARY "Outlet Group turned off." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 299 + +smwCriticalCondition TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsGauge, mtrapargsString } + DESCRIPTION + "SEVERE: A Symmetra MW UPS critical condition has been detected. + The first variable is the fault condition." + --#TYPE "APC Symmetra MW UPS: A critical condition has been detected." + --#SUMMARY "A critical condition has been detected." + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 300 + +smwCriticalConditionCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsGauge, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A Symmetra MW UPS critical condition has been cleared. + The first variable is the fault condition." + --#TYPE "APC Symmetra MW UPS: A critical condition has been cleared." + --#SUMMARY "A critical condition has been cleared." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 301 + +smwWarningCondition TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsGauge, mtrapargsString } + DESCRIPTION + "WARNING: A Symmetra MW UPS warning condition has been detected. + The first variable is the fault condition." + --#TYPE "APC Symmetra MW UPS: A warning condition has been detected." + --#SUMMARY "A warning condition has been detected." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 302 + +smwWarningConditionCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsGauge, mtrapargsString } + DESCRIPTION + "WARNING: A Symmetra MW UPS warning condition has been cleared. + The first variable is the fault condition." + --#TYPE "APC Symmetra MW UPS: A warning condition has been cleared." + --#SUMMARY "A warning condition has been cleared." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 303 + +smwInformationalCondition TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsGauge, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A Symmetra MW UPS informational condition has been detected. + The first variable is the fault condition." + --#TYPE "APC Symmetra MW UPS: Informational condition detected." + --#SUMMARY "An informational condition has been detected." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 304 + +smwInformationalConditionCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsGauge, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A Symmetra MW UPS informational condition has been cleared. + The first variable is the fault condition." + --#TYPE "APC Symmetra MW UPS: Informational condition cleared." + --#SUMMARY "An informational condition has been cleared." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 305 + +airCriticalCondition TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: An Air critical condition was detected. + The first variable is the error condition text message. + The second variable is the error number." + --#TYPE "APC Air: A critical condition was detected. " + --#SUMMARY "A critical condition was detected. " + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 306 + +airCriticalConditionCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An Air critical condition was cleared. + The first variable is the error condition text message. + The second variable is the error number." + --#TYPE "APC Air: A critical condition was cleared. " + --#SUMMARY "A critical condition was cleared. " + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 307 + +airWarningCondition TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "WARNING: An Air warning condition was detected. + The first variable is the error condition text message. + The second variable is the error number." + --#TYPE "APC Air: A warning condition was detected. " + --#SUMMARY "A warning condition was detected. " + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 308 + +airWarningConditionCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "WARNING: An Air warning condition was cleared. + The first variable is the error condition text message. + The second variable is the error number." + --#TYPE "APC Air: A warning condition was cleared. " + --#SUMMARY "A warning condition was cleared. " + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 309 + +airInformationalCondition TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An Air informational condition was detected. + The first variable is the error condition text message. + The second variable is the error number." + --#TYPE "APC Air: Informational condition detected. " + --#SUMMARY "An informational condition was detected. " + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 310 + +airInformationalConditionCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An Air informational condition was cleared. + The first variable is the error condition text message. + The second variable is the error number." + --#TYPE "APC Air: Informational condition was cleared. " + --#SUMMARY "An informational condition was cleared. " + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 311 + +-- xPDU Traps (part 1) + +xPDUInputVoltageLowAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "WARNING: Three-phase input voltage to the device is outside the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase + (1=L1-N, 2=L2-N, 3=L3-N, 4=unused, 5=L1-L2, 6=L2-L3, 7=L3-L1). + The fourth argument is the measured voltage in tenths of Volts. + The fifth argument is the threshold, in tenths of Volts, from which the alarm was generated." + --#TYPE "APC XPDU: Main input voltage out-of-range alarm." + --#SUMMARY "Input voltage is out-of-range." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 312 + +xPDUInputVoltageLowAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Three-phase input voltage to the device is back within the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1-N, 2=L2-N, 3=L3-N, 4=unused, 5=L1-L2, 6=L2-L3, 7=L3-L1). + The fourth argument is the measured voltage in tenths of Volts." + --#TYPE "APC XPDU: Main input voltage back in range." + --#SUMMARY "Input voltage in range." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 313 + + +xPDUInputVoltageHighAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "WARNING: Three-phase input voltage to the device is outside the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase + (1=L1-N, 2=L2-N, 3=L3-N, 4=unused, 5=L1-L2, 6=L2-L3, 7=L3-L1). + The fourth argument is the measured voltage in tenths of Volts. + The fifth argument is the threshold, in tenths of Volts, above which the alarm was generated." + --#TYPE "APC XPDU: Main input voltage out-of-range alarm." + --#SUMMARY "Input voltage is out-of-range." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 314 + +xPDUInputVoltageHighAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Three-phase input voltage to the device is back within the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1-N, 2=L2-N, 3=L3-N, 4=unused, 5=L1-L2, 6=L2-L3, 7=L3-L1). + The fourth argument is the measured voltage in tenths of Volts." + --#TYPE "APC XPDU: Main input voltage back in range." + --#SUMMARY "Input voltage in range." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 315 + +xPDUBypassVoltageLowAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "WARNING: Three-phase bypass input voltage to the device is outside the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1-N, 2=L2-N, 3=L3-N). + The fourth argument is the measured voltage in tenths of Volts. + The fifth argument is the threshold, in tenths of Volts, from which the alarm was generated." + --#TYPE "APC XPDU: Bypass input voltage out-of-range alarm." + --#SUMMARY "Bypass input voltage is out-of-range." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 316 + +xPDUBypassVoltageLowAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Three-phase bypass input voltage to the device is back within the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1-N, 2=L2-N, 3=L3-N). + The fourth argument is the measured voltage in tenths of Volts." + --#TYPE "APC XPDU: Bypass input voltage back in range." + --#SUMMARY "Bypass input voltage in range." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 317 + +xPDUBypassVoltageHighAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "WARNING: Three-phase bypass input voltage to the device is outside the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1-N, 2=L2-N, 3=L3-N). + The fourth argument is the measured voltage in tenths of Volts. + The fifth argument is the threshold, in tenths of Volts, above which the alarm was generated." + --#TYPE "APC XPDU: Bypass input voltage out-of-range alarm." + --#SUMMARY "Bypass input voltage is out-of-range." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 318 + +xPDUBypassVoltageHighAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Three-phase bypass input voltage to the device is back within the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1-N, 2=L2-N, 3=L3-N). + The fourth argument is the measured voltage in tenths of Volts." + --#TYPE "APC XPDU: Bypass input voltage back in range." + --#SUMMARY "Bypass input voltage in range." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 319 + +xPDUOutputVoltageLowAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "WARNING: The device three-phase output voltage of the device is outside the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1-N, 2=L2-N, 3=L3-N). + The fourth argument is the measured voltage in tenths of Volts. + The fifth argument is the threshold, in tenths of Volts, from which the alarm was generated." + --#TYPE "APC XPDU: Output voltage out-of-range alarm." + --#SUMMARY "Output voltage is out-of-range." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 320 + +xPDUOutputVoltageLowAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The devices three-phase output voltage is back within the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1-N, 2=L2-N, 3=L3-N). + The fourth argument is the measured voltage in tenths of Volts." + --#TYPE "APC XPDU: Output voltage back in range." + --#SUMMARY "Output voltage in range." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 321 + +xPDUOutputVoltageHighAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "WARNING: The device three-phase output voltage of the device is outside the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1-N, 2=L2-N, 3=L3-N). + The fourth argument is the measured voltage in tenths of Volts. + The fifth argument is the threshold, in tenths of Volts, above which the alarm was generated." + --#TYPE "APC XPDU: Output voltage out-of-range alarm." + --#SUMMARY "Output voltage is out-of-range." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 322 + +xPDUOutputVoltageHighAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The devices three-phase output voltage is back within the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1-N, 2=L2-N, 3=L3-N). + The fourth argument is the measured voltage in tenths of Volts." + --#TYPE "APC XPDU: Output voltage back in range." + --#SUMMARY "Output voltage in range." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 323 + +xPDUOutputCurrentLowAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "SEVERE: The devices three-phase load current is outside the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1, 2=L2, 3=L3). + The fourth argument is the measured current in tenths of Amps. + The fifth argument is the threshold, in Amps, from which the alarm was generated." + --#TYPE "APC XPDU: Output (load) current out-of-range alarm." + --#SUMMARY "Output current is out-of-range." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 324 + +xPDUOutputCurrentLowAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The devices three-phase output current is back within the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1, 2=L2, 3=L3). + The fourth argument is the measured current in tenths of Amps." + --#TYPE "APC XPDU: Output (load) current back in range." + --#SUMMARY "Output current in range." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 325 + +xPDUOutputCurrentHighAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "SEVERE: The devices three-phase load current is outside the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1, 2=L2, 3=L3). + The fourth argument is the measured current in tenths of Amps. + The fifth argument is the threshold, in Amps, above which the alarm was generated." + --#TYPE "APC XPDU: Output (load) current out-of-range alarm." + --#SUMMARY "Output current is out-of-range." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 326 + +xPDUOutputCurrentHighAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The devices three-phase output current is back within the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1, 2=L2, 3=L3). + The fourth argument is the measured current in tenths of Amps." + --#TYPE "APC XPDU: Output (load) current back in range." + --#SUMMARY "Output current in range." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 327 + +xPDUOutputFrequencyAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: The devices output frequency is outside the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the frequency deviation from the nominal in tenths of Hertz." + --#TYPE "APC XPDU: Output frequency out-of-range alarm." + --#SUMMARY "Output frequency is out-of-range." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 328 + +xPDUOutputFrequencyAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The devices output frequency is back within the specified limits. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XPDU: Output frequency back in range." + --#SUMMARY "Output frequency in range." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 329 + +xPDUSystemGroundCurrentAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: The devices earth ground current is over the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the measured current in tenths of Amps." + --#TYPE "APC XPDU: Earth ground current over range alarm." + --#SUMMARY "Earth ground current is over limit." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 330 + +xPDUSystemGroundCurrentAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The devices earth ground current is back within the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the measured current in tenths of Amps." + --#TYPE "APC XPDU: Earth ground current back in range." + --#SUMMARY "Earth ground current in range." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 331 + +xPDUInputContactStateAbnormal TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsString02, mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "WARNING: A user input contact on the device has changed to its abnormal state. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the input contact number. + The fourth argument is the input contact name. + The fifth argument is the input contact state (1=OPEN, 2=CLOSED). + The sixth argument is the configured normal input contact state (1=OPEN, 2=CLOSED)." + --#TYPE "APC XPDU: Input contact has changed to its abnormal state." + --#SUMMARY "Input contact has changed to its abnormal state." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 332 + +xPDUInputContactStateNormal TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsString02, mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A user input contact on the device has changed to its normal state. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the input contact number. + The fourth argument is the input contact name. + The fifth argument is the input contact state (1=CLOSED, 2=OPEN). + The sixth argument is the configured normal input contact state (1=OPEN, 2=CLOSED)." + --#TYPE "APC XPDU: Input contact has changed to its normal state." + --#SUMMARY "Input contact has changed to its normal state." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 333 + +xPDUOutputRelayStateAbnormal TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsString02, mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "WARNING: An Output Relay on the device has changed to its abnormal state. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the Output Relay number. + The fourth argument is the Output Relay name. + The fifth argument is the current Output Relay state (1=OPEN, 2=CLOSED). + The sixth argument is the configured normal Output Relay state (1=OPEN, 2=CLOSED)." + --#TYPE "APC XPDU: Output Relay has changed to its abnormal state." + --#SUMMARY "Output Relay has changed to its abnormal state." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 334 + +xPDUOutputRelayStateNormal TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsString02, mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: An Output Relay on the device has changed to its normal state. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the Output Relay number. + The fourth argument is the Output Relay name. + The fifth argument is the current Output Relay state (1=OPEN, 2=CLOSED). + The sixth argument is the configured normal Output Relay state (1=OPEN, 2=CLOSED)." + --#TYPE "APC XPDU: Output Relay has changed to its normal state." + --#SUMMARY "Output Relay has changed to its normal state." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 335 + +xPDUCoolingFanAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsString } + DESCRIPTION + "SEVERE: The device's internal cooling fans have failed. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XPDU: Cooling fan failure alarm." + --#SUMMARY "Cooling fan failure." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 336 + +xPDUCoolingFanAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The device's cooling fans are now functioning properly. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XPDU: Cooling fan alarm cleared." + --#SUMMARY "Cooling fan alarm cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 337 + +xPDUTransformerTempAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsString } + DESCRIPTION + "SEVERE: The device's isolation transformer is over temperature. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XPDU: Isolation transformer over temperature alarm." + --#SUMMARY "Transformer temp alarm." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 338 + +xPDUTransformerTempAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The device's isolation transformer is no longer over temperature. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XPDU: Isolation transformer over temperature alarm cleared." + --#SUMMARY "Transformer temp alarm cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 339 + +xPDUBranchCurrentLowAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "SEVERE: The current in a branch circuit is outside the limits specified for that + branch circuit. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the panel position of the branch circuit (1-based index). + The fourth argument is the measured current in tenths of Amps. + The fifth argument is the threshold, in tenth of Amps, from which the alarm was generated." + --#TYPE "APC XPDU: Branch circuit current out-of-range alarm." + --#SUMMARY "Branch circuit current is out-of-range." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 340 + +xPDUBranchCurrentLowAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The current in a branch circuit is back within the limits + specified for that branch circuit. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the panel position of the branch circuit (1-based index). + The fourth argument is the measured current in tenths of Amps." + --#TYPE "APC XPDU: Branch circuit current back in range." + --#SUMMARY "Branch circuit current in range." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 341 + +xPDUBranchCurrentHighAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "SEVERE: The current in a branch circuit is outside the limits specified for that + branch circuit. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the panel position of the branch circuit (1-based index). + The fourth argument is the measured current in tenths of Amps. + The fifth argument is the threshold, in tenth of Amps, above which the alarm was generated." + --#TYPE "APC XPDU: Branch circuit current out-of-range alarm." + --#SUMMARY "Branch circuit current is out-of-range." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 342 + +xPDUBranchCurrentHighAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The current in a branch circuit is back within the limits + specified for that branch circuit. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the panel position of the branch circuit (1-based index). + The fourth argument is the measured current in tenths of Amps." + --#TYPE "APC XPDU: Branch circuit current back in range." + --#SUMMARY "Branch circuit current in range." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 343 + + +xPDUInternalCommError TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsString } + DESCRIPTION + "SEVERE: There is an internal communication error in the device. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XPDU: Internal communication error." + --#SUMMARY "Internal communication error." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 344 + +emsHardwareStateAbnormal TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, mtrapargsString } + DESCRIPTION + "SEVERE: The device's hardware is improperly configured and operating outside + normal bounds for the hardware. This can be caused by improper devices being + connected to the EMS ports or Alink Current limit detection." + --#TYPE "APC EMS: Hardware is in an abnormal state." + --#SUMMARY "Hardware is in an abnormal state." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 345 + +emsHardwareStateNormal TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The device's hardware is in its normal operational state. + The first argument is the host device serial number." + --#TYPE "APC EMS: Hardware is in a normal state." + --#SUMMARY "Hardware is in its normal state." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 346 + +ceSevereCondition TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: A Custom Event severe condition was detected. + The first variable is the custom event text message. + The second variable is the custom event number." + --#TYPE "APC CustomEvent: A severe condition was detected. " + --#SUMMARY "A severe condition was detected. " + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 347 + +ceSevereConditionCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A Custom Event severe condition was cleared. + The first variable is the custom event text message. + The second variable is the custom event number." + --#TYPE "APC CustomEvent: A severe condition was cleared. " + --#SUMMARY "A severe condition was cleared. " + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 348 + +ceWarningCondition TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "WARNING: A Custom Event warning condition was detected. + The first variable is the custom event text message. + The second variable is the custom event number." + --#TYPE "APC CustomEvent: A warning condition was detected. " + --#SUMMARY "A warning condition was detected. " + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 349 + +ceWarningConditionCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A Custom Event warning condition was cleared. + The first variable is the custom event text message. + The second variable is the custom event number." + --#TYPE "APC CustomEvent: A warning condition was cleared. " + --#SUMMARY "A warning condition was cleared. " + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 350 + +ceInformationalCondition TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A Custom Event informational condition was detected. + The first variable is the custom event text message. + The second variable is the custom event number." + --#TYPE "APC CustomEvent: Informational condition detected. " + --#SUMMARY "An informational condition was detected. " + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 351 + +ceInformationalConditionCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A Custom Event informational condition was cleared. + The first variable is the custom event text message. + The second variable is the custom event number." + --#TYPE "APC CustomEvent: Informational condition was cleared. " + --#SUMMARY "An informational condition was cleared. " + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 352 + +upsInternalOverTemperature TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "WARNING: The internal over temperature condition exists." + --#TYPE "APC UPS: The internal over temperature condition exists." + --#SUMMARY "The internal over temperature condition exists." + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 353 + +upsInternalOverTemperatureCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The internal over temperature condition cleared." + --#TYPE "APC UPS: The internal over temperature condition cleared." + --#SUMMARY "The internal over temperature condition cleared." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 354 + +upsMpuReset TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The MPU has been reset." + --#TYPE "APC UPS: The MPU has been reset." + --#SUMMARY "The MPU has been reset." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 355 + +upsOutputSwitchClosed TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The Output Switch is closed." + --#TYPE "APC UPS: The Output Switch is closed." + --#SUMMARY "The Output Switch is closed." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 356 + +upsOutputSwitchOpened TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The Output Switch is open." + --#TYPE "APC UPS: The Output Switch is open." + --#SUMMARY "The Output Switch is open." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 357 + +upsCalibrationStackChanged TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A calibration value in the stack was changed." + --#TYPE "APC UPS: A calibration value in the stack was changed." + --#SUMMARY "A calibration value in the stack was changed." + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 358 + + +-- Upgraded EMS now has more env traps + +envMaxTempThresholdViolation TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeTemperature, emsStatusSysTempUnits, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "SEVERE: Max temperature threshold violated on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current temperature. + The fourth argument is the temperature scale. + The fifth argument is the probe number. + The sixth argument is the probe name." + --#TYPE "APC ENV: Max temperature threshold violation." + --#SUMMARY "Max temperature threshold violation." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 359 + +envMaxTempThresholdViolationCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeTemperature, emsStatusSysTempUnits, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Max temperature threshold violation cleared on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current temperature. + The fourth argument is the temperature scale. + The fifth argument is the probe number. + The sixth argument is the probe name." + --#TYPE "APC ENV: Max temperature threshold violation cleared." + --#SUMMARY "Max temperature threshold violation cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 360 + +envMinTempThresholdViolation TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeTemperature, emsStatusSysTempUnits, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "SEVERE: Min temperature threshold violated on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current temperature. + The fourth argument is the temperature scale. + The fifth argument is the probe number. + The sixth argument is the probe name." + --#TYPE "APC ENV: Min temperature threshold violation." + --#SUMMARY "Min temperature threshold violation." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 361 + +envMinTempThresholdViolationCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeTemperature, emsStatusSysTempUnits, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Min temperature threshold violation cleared on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current temperature. + The fourth argument is the temperature scale. + The fifth argument is the probe number. + The sixth argument is the probe name." + --#TYPE "APC ENV: Min temperature threshold violation cleared." + --#SUMMARY "Min temperature threshold violation cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 362 + +envMaxHumidityThresholdViolation TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeHumidity, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "SEVERE: Max humidity threshold violated on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current humidity + The fourth argument is the probe number. + The fifth argument is the probe name." + --#TYPE "APC ENV: Max humidity threshold violation." + --#SUMMARY "Max humidity threshold violation." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 363 + +envMaxHumidityThresholdViolationCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeHumidity, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Max humidity threshold violation cleared on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current humidity. + The fourth argument is the probe number. + The fifth argument is the probe name." + --#TYPE "APC ENV: Max humidity threshold violation cleared." + --#SUMMARY "Max humidity threshold violation cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 364 + +envMinHumidityThresholdViolation TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeHumidity, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "SEVERE: Min humidity threshold violated on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current humidity + The fourth argument is the probe number. + The fifth argument is the probe name." + --#TYPE "APC ENV: Min humidity threshold violation." + --#SUMMARY "Min humidity threshold violation." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 365 + +envMinHumidityThresholdViolationCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeHumidity, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Min humidity threshold violation cleared on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current humidity. + The fourth argument is the probe number. + The fifth argument is the probe name." + --#TYPE "APC ENV: Min humidity threshold violation cleared." + --#SUMMARY "Min humidity threshold violation cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 366 + +envSTIncTempRateViolation TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeTemperature, emsStatusSysTempUnits, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "SEVERE: Short-term increasing temperature rate violated on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current temperature. + The fourth argument is the temperature scale. + The fifth argument is the probe number. + The sixth argument is the probe name." + --#TYPE "APC ENV: Short-term inc. temp rate violation." + --#SUMMARY "Short-term inc. temp rate violation." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 367 + +envSTIncTempRateViolationCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeTemperature, emsStatusSysTempUnits, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Short-term increasing temperature rate cleared on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current temperature. + The fourth argument is the temperature scale. + The fifth argument is the probe number. + The sixth argument is the probe name." + --#TYPE "APC ENV: Short-term inc. temp rate violation cleared." + --#SUMMARY "Short-term inc. temp rate violation cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 368 + +envSTDecTempRateViolation TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeTemperature, emsStatusSysTempUnits, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "SEVERE: Short-term decreasing temperature rate violated on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current temperature. + The fourth argument is the temperature scale. + The fifth argument is the probe number. + The sixth argument is the probe name." + --#TYPE "APC ENV: Short-term dec. temp rate violation." + --#SUMMARY "Short-term dec. temp rate violation." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 369 + +envSTDecTempRateViolationCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeTemperature, emsStatusSysTempUnits, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Short-term decreasing temperature rate cleared on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current temperature. + The fourth argument is the temperature scale. + The fifth argument is the probe number. + The sixth argument is the probe name." + --#TYPE "APC ENV: Short-term dec. temp rate violation cleared." + --#SUMMARY "Short-term dec. temp rate violation cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 370 + +envLTIncTempRateViolation TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeTemperature, emsStatusSysTempUnits, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "SEVERE: Long-term increasing temperature rate violated on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current temperature. + The fourth argument is the temperature scale. + The fifth argument is the probe number. + The sixth argument is the probe name." + --#TYPE "APC ENV: Long-term inc. temp rate violation." + --#SUMMARY "Long-term inc. temp rate violation." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 371 + +envLTIncTempRateViolationCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeTemperature, emsStatusSysTempUnits, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Long-term increasing temperature rate cleared on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current temperature. + The fourth argument is the temperature scale. + The fifth argument is the probe number. + The sixth argument is the probe name." + --#TYPE "APC ENV: Long-term inc. temp rate violation cleared." + --#SUMMARY "Long-term inc. temp rate violation cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 372 + +envLTDecTempRateViolation TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeTemperature, emsStatusSysTempUnits, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "SEVERE: Long-term decreasing temperature rate violated on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current temperature. + The fourth argument is the temperature scale. + The fifth argument is the probe number. + The sixth argument is the probe name." + --#TYPE "APC ENV: Long-term dec. temp rate violation." + --#SUMMARY "Long-term dec. temp rate violation." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 373 + +envLTDecTempRateViolationCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { emsIdentSerialNumber, emsIdentEMSName, emsProbeStatusProbeTemperature, emsStatusSysTempUnits, + emsProbeStatusProbeIndex, emsProbeStatusProbeName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Long-term decreasing temperature rate cleared on the probe. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the current temperature. + The fourth argument is the temperature scale. + The fifth argument is the probe number. + The sixth argument is the probe name." + --#TYPE "APC ENV: Long-term dec. temp rate violation cleared." + --#SUMMARY "Long-term dec. temp rate violation cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 374 + +-- Battery Management System Traps + +bmsCriticalCondition TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: A Battery Management System critical condition was detected. + The first variable is the error condition text message. + The second variable is the error number." + --#TYPE "APC BMS: A critical condition was detected. " + --#SUMMARY "A critical condition was detected. " + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 375 + +bmsCriticalConditionCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A Battery Management System critical condition was cleared. + The first variable is the error condition text message. + The second variable is the error number." + --#TYPE "APC BMS: A critical condition was cleared. " + --#SUMMARY "A critical condition was cleared. " + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 376 + +bmsWarningCondition TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "WARNING: A Battery Management System warning condition was detected. + The first variable is the error condition text message. + The second variable is the error number." + --#TYPE "APC BMS: A warning condition was detected. " + --#SUMMARY "A warning condition was detected. " + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 377 + +bmsWarningConditionCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "WARNING: A Battery Management System warning condition was cleared. + The first variable is the error condition text message. + The second variable is the error number." + --#TYPE "APC BMS: A warning condition was cleared. " + --#SUMMARY "A warning condition was cleared. " + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 378 + +bmsInformationalCondition TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A Battery Management System informational condition was detected. + The first variable is the error condition text message. + The second variable is the error number." + --#TYPE "APC BMS: Informational condition detected. " + --#SUMMARY "An informational condition was detected. " + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 379 + +bmsInformationalConditionCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsString02, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A Battery Management System informational condition was cleared. + The first variable is the error condition text message. + The second variable is the error number." + --#TYPE "APC BMS: Informational condition was cleared. " + --#SUMMARY "An informational condition was cleared. " + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 380 + +-- xATS Traps + +xATSOutputVoltageLowAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "SEVERE: The device three-phase output voltage of the device is outside the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1-N, 2=L2-N, 3=L3-N, 4=unused, 5=L1-L2, 6=L2-L3, 7=L3-L1). + The fourth argument is the measured voltage in tenths of Volts. + The fifth argument is the threshold, in tenths of Volts, from which the alarm was generated." + --#TYPE "APC XATS: Output voltage out-of-range alarm." + --#SUMMARY "Output voltage is out-of-range." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 381 + +xATSOutputVoltageLowAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The devices three-phase output voltage is back within the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1-N, 2=L2-N, 3=L3-N, 4=unused, 5=L1-L2, 6=L2-L3, 7=L3-L1). + The fourth argument is the measured voltage in tenths of Volts." + --#TYPE "APC XATS: Output voltage back in range." + --#SUMMARY "Output voltage in range." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 382 + +xATSOutputVoltageHighAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "SEVERE: The device three-phase output voltage of the device is outside the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1-N, 2=L2-N, 3=L3-N, 4=unused, 5=L1-L2, 6=L2-L3, 7=L3-L1). + The fourth argument is the measured voltage in tenths of Volts. + The fifth argument is the threshold, in tenths of Volts, above which the alarm is generated." + --#TYPE "APC XATS: Output voltage out-of-range alarm." + --#SUMMARY "Output voltage is out-of-range." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 383 + +xATSOutputVoltageHighAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The devices three-phase output voltage is back within the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1-N, 2=L2-N, 3=L3-N, 4=unused, 5=L1-L2, 6=L2-L3, 7=L3-L1). + The fourth argument is the measured voltage in tenths of Volts." + --#TYPE "APC XATS: Output voltage back in range." + --#SUMMARY "Output voltage in range." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 384 + +xATSOutputCurrentLowAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "SEVERE: The devices three-phase load current is outside the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1, 2=L2, 3=L3, 4=Neutral, 5=L1-2, 6=L2-3, 7=L3-1). + The fourth argument is the measured current in Amps. + The fifth argument is the threshold, in Amps, from which the alarm was generated." + --#TYPE "APC XATS: Output (load) current out-of-range alarm." + --#SUMMARY "Output current is out-of-range." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 385 + +xATSOutputCurrentLowAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The devices three-phase output current is back within the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1, 2=L2, 3=L3, 4=Neutral). + The fourth argument is the measured current in Amps." + --#TYPE "APC XATS: Output (load) current back in range." + --#SUMMARY "Output current in range." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 386 + +xATSOutputCurrentHighAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "SEVERE: The devices three-phase load current is outside the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1, 2=L2, 3=L3, 4=Neutral). + The fourth argument is the measured current in Amps. + The fifth argument is the threshold, in Amps, from which the alarm was generated." + --#TYPE "APC XATS: Output (load) current out-of-range alarm." + --#SUMMARY "Output current is out-of-range." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 387 + +xATSOutputCurrentHighAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The devices three-phase output current is back within the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1, 2=L2, 3=L3, 4=Neutral). + The fourth argument is the measured current in Amps." + --#TYPE "APC XATS: Output (load) current back in range." + --#SUMMARY "Output current in range." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 388 + + +xATSOutputFrequencyAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsString } + DESCRIPTION + "SEVERE: The devices output frequency is outside the specified limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the frequency deviation from the nominal in tenths of Hertz. + The fourth argument is the frequency deviation threshold in tenths of Hertz, + from which the alarm was generated." + --#TYPE "APC XATS: Output frequency out-of-range alarm." + --#SUMMARY "Output frequency is out-of-range." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 389 + +xATSOutputFrequencyAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The devices output frequency is back within the specified limits. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Output frequency back in range." + --#SUMMARY "Output frequency in range." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 390 + +xATSInternalCommError TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "SEVERE: There is an internal communication error in the device. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Internal communication error." + --#SUMMARY "Internal communication error." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 391 + +xATSInternalCommErrorCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Internal communication has been restored. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Internal Communication error cleared." + --#SUMMARY "ATS Communication error cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 392 + +xATSDataCommMismatchError TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "SEVERE: A data incompatibility exists within the device. This + is typically the result of mismatches between firmware revisions + of the transfer switch controller and the Network Management interface. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Data mismatch error." + --#SUMMARY "ATS data mismatch error." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 393 + +xATSDataCommMismatchErrorCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The internal data incompatibility has been resolved. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: data mismatch error cleared." + --#SUMMARY "ATS data mismatch error cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 394 + +xATSGenCommLost TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "WARNING: The XATS cannot communicate with the generator. + This will make unavailable all the xATSGenerator OIDs. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: No communication with generator." + --#SUMMARY "ATS/Generator communication lost." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 395 + +xATSGenCommEstablished TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The XATS has established communication with the generator. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Communication with generator established." + --#SUMMARY "ATS/generator communication established." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 396 + +xATSNeutralPosition TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, + mtrapargsString } + DESCRIPTION + "WARNING: XATS has transferred to neutral position. + In this position neither Source 1 nor Source 2 is selected, + and the XATS will have no output voltage. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the mode in which the switch is operating + (1=Auto, 2=Not-in-Auto, Abnormal Condition 3=Not-in-Auto, manual)." + --#TYPE "APC XATS: Transferred to the neutral (no output power) position." + --#SUMMARY "Transferred to neutral." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 397 + +xATSSwitchTransferEvent TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: XATS has transferred from one source to the other. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the mode in which the switch is operating. + (1=Auto, 2=Not-in-Auto, Abnormal Condition 3=Not-in-Auto, manual). + The fourth argument is the input source selected (1=Source 1, 2=Source 2). + The fifth argument is type of transfer that took place. (1=Closed, 2=Open, 3=Unknown)" + --#TYPE "APC XATS: Transferred from Source-X to Source-Y." + --#SUMMARY "Source-to-Source transfer." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 398 + +xATSInternalATSFault TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: An internal XATS fault has been detected. + The XATS may have forced itself to not-in-auto mode (abnormal condition), + as indicated by the xATSSwitchStatusAutoSwitchOperationalMode OID. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument indicates the detected fault. + + 1=Cannot Close S1 + 2=Cannot Close S2 + 3=Cannot Open S1 + 4=Cannot Open S2 + 5=Cannot Trip Open S1 + 6=Cannot Trip Open S2 + 7=Start Contact Failure + 8=Voltage Sensing Failure" + + --#TYPE "APC XATS: Internal fault detected." + --#SUMMARY "ATS internal fault detected." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 399 + +xATSInternalATSFaultCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The detected internal XATS fault has been cleared. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument indicates the detected fault. + + 1=Cannot Close S1 + 2=Cannot Close S2 + 3=Cannot Open S1 + 4=Cannot Open S2 + 5=Cannot Trip Open S1 + 6=Cannot Trip Open S2 + 7=Start Contact Failure + 8=Voltage Sensing Failure" + + --#TYPE "APC XATS: Internal fault cleared." + --#SUMMARY "ATS internal fault cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 400 + +xATSEngineStartAsserted TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The XATS has asserted the Engine Start contact. + This should result in the generator producing output voltage. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument indicates the reason that the start signal was asserted + 1=Unknown, 2=S1 Low Voltage, 3=S1 High Voltage, 4=S1 Line Imbalance, + 5=S1 Freq Range, 6=S1 Bad Rotation." + --#TYPE "APC XATS: Engine Start signal asserted." + --#SUMMARY "Engine Start asserted." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 401 + +xATSEngineStopAsserted TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The XATS has de-asserted the Engine Start contact. + This should result in the generator shutting down, and producing no output voltage. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Engine Stop signal asserted." + --#SUMMARY "Engine Stop asserted." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 402 + +xATSStartFailure TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "SEVERE: The generator failed to start. After assertion of the + Engine Start signal, the quality of Source 2 was not seen as good. + This alarm can be cleared using the xATSSwitchStatusClearLatchedAlarms OID. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument indicates the line quality at S2 + 1=Unknown, 2=S2 Low Voltage, 3=S2 High Voltage, 4=S2 Line Imbalance, + 4=S2 Freq Range, 5=S2 Bad Rotation." + --#TYPE "APC XATS: Generator failed to start alarm." + --#SUMMARY "Generator failed to start." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 403 + +xATSStopFailure TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "WARNING: The generator failed to stop. After de-assertion of the + Engine Start signal, the quality of Source 2 continued to be seen as good. + This alarm can be cleared using the xATSSwitchStatusClearLatchedAlarms OID. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Generator failed to stop alarm." + --#SUMMARY "Generator failed to stop." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 404 + +xATSNotInAutomaticMode TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "SEVERE: Automatic Transfer Switch is not in automatic mode. + The first argument is the host device serial number. + The second argument is the host device name. + The xATSSwitchStatusAutoSwitchStatus OID and the + xATSSwitchStatusAutoSwitchOperationalMode OID + can provide more information about the state of the XATS." + --#TYPE "APC XATS: XATS is not-in-automatic mode." + --#SUMMARY "ATS not in auto." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 405 + +xATSNotInAutomaticModeCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Automatic Transfer Switch is in automatic mode. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: XATS in auto mode." + --#SUMMARY "ATS in auto mode." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 406 + +xATSEpoTripped TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "SEVERE: The device's Emergency Power Off (EPO) circuit is tripped. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Emergency Power Off (EPO) tripped." + --#SUMMARY "EPO tripped." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 407 + +xATSEpoReset TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The device's Emergency Power Off (EPO) circuit has been + reset to the armed position. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Emergency Power Off (EPO) reset." + --#SUMMARY "EPO armed." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 408 + +xATSEpoTestMode TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "WARNING: The device's Emergency Power Off (EPO) circuit has been + switched back to the test position. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Emergency Power Off (EPO) in test mode." + --#SUMMARY "EPO disabled." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 409 + +xATSEpoArmed TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The device's Emergency Power Off (EPO) circuit has been + switched back to the armed position. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Emergency Power Off (EPO) enabled." + --#SUMMARY "EPO armed." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 410 + +xATSTestInitiated TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A scheduled test has been initiated. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the type of test initiated (1=scheduled, 2=manual)." + --#TYPE "APC XATS: Test initiated." + --#SUMMARY "Test initiated." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 411 + +xATSTestCancelled TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The scheduled test has been canceled + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the type of test initiated (1=scheduled, 2=manual)." + --#TYPE "APC XATS: Test cancelled." + --#SUMMARY "Test cancelled." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 412 + +xATSTestFailed TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "SEVERE: The initiated test has failed. + This alarm can be cleared using the xATSSwitchStatusClearLatchedAlarms OID. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Initiated test failed." + --#SUMMARY "Initiated test failed." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 413 + +xATSTestPassed TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The initiated test has passed + switched back to the armed position. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Initiated test passed." + --#SUMMARY "Initiated test passed." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 414 + +xATSInputContactStateAbnormal TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, + mtrapargsString02, mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "SEVERE: A user input contact on the device has changed to its abnormal state. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the input contact number. + The fourth argument is the input contact name. + The fifth argument is the input contact state (1=OPEN, 2=CLOSED). + The sixth argument is the configured normal input contact state (1=OPEN, 2=CLOSED)." + --#TYPE "APC XATS: Input contact has changed to its abnormal state." + --#SUMMARY "Input contact has changed to its abnormal state." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 415 + +xATSInputContactStateNormal TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, + mtrapargsString02, mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A user input contact on the device has changed to its normal state. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the input contact number. + The fourth argument is the input contact name. + The fifth argument is the input contact state (1=OPEN, 2=CLOSED). + The sixth argument is the configured normal input contact state (1=OPEN, 2=CLOSED)." + --#TYPE "APC XATS: Input contact has changed to its normal state." + --#SUMMARY "Input contact has changed to its normal state." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 416 + +xATSRemoteStartContactMismatch TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "SEVERE: The state of the generator's Remote Start input + and the ATS's Engine Start output do not match. + This indicates something wrong in the Engine Start wiring, + which must be corrected. This condition will prevent the + generator from being started when needed. + + (See also: xATSGeneratorStatusRemoteStart + and xATSSwitchStatusEngineStartSignal OIDs) + + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Generator/ATS start contact mismatch." + --#SUMMARY "Generator/ATS start contact mismatch." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 417 + +xATSRemoteStartContactMismatchCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Mismatch in the state of the generator's + Remote Start input and the ATS's Engine Start output as been resolved. + This indicates something wrong in the Engine Start wiring, + which must be corrected. This condition will prevent the + generator from being started when needed. + + (See also: xATSGeneratorStatusRemoteStart + and xATSSwitchStatusEngineStartSignal OIDs) + + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Generator/ATS start contact mismatch cleared." + --#SUMMARY "Generator/ATS start contact mismatch cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 418 + +xATSDoorOpenAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "WARNING: The XATS exterior panel door is open. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Panel door is open alarm." + --#SUMMARY "Panel door open alarm." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 419 + +xATSDoorOpenAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The external door to the device is closed. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Panel door open alarm cleared." + --#SUMMARY "Panel door open alarm cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 420 + +xATSDCBackupAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "WARNING: The XATS's DC backup has been lost. The XATS will lose power + on Source 1 failure, causing the Engine Start signal to be asserted. + The XATS will then restart from Source 2. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: DC backup failure." + --#SUMMARY "ATS DC backup failure." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 421 + +xATSDCBackupAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: DC backup alarm has been cleared in the device. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: DC backup alarm cleared." + --#SUMMARY "DC backup alarm cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 422 + +-- xATS Generator Traps + +xATSGeneratorLowCoolantLevelAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: Low coolant level has been detected in the generator. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator low coolant level alarm." + --#SUMMARY "Generator low coolant level alarm." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 423 + +xATSGeneratorLowCoolantLevelAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The detected low coolant level has been cleared in the generator. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator low coolant level alarm cleared." + --#SUMMARY "Generator low coolant level alarm cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 424 + +xATSGeneratorVeryLowCoolantLevelAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: Very low coolant level has been detected in the generator. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator very low coolant level alarm." + --#SUMMARY "Generator very low coolant level alarm." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 425 + +xATSGeneratorVeryLowCoolantLevelAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The detected Very low coolant level has been cleared in the generator. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator very low coolant level alarm cleared." + --#SUMMARY "Generator very low coolant level alarm cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 426 + +xATSGeneratorHighCoolantTempAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: High coolant temperature has been detected in the generator. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator high coolant temperature alarm." + --#SUMMARY "Generator high coolant temperature alarm." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 427 + +xATSGeneratorHighCoolantTempAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The detected high coolant temperature has been cleared in the generator. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator high coolant temperature alarm cleared." + --#SUMMARY "Generator high coolant temperature alarm cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 428 + +xATSGeneratorVeryHighCoolantTempAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: Very high coolant temperature has been detected in the generator. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator very high coolant temperature alarm." + --#SUMMARY "Generator very high coolant temperature alarm." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 429 + +xATSGeneratorVeryHighCoolantTempAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The Very high coolant temperature condition has been cleared in the generator. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator very high coolant temperature alarm cleared." + --#SUMMARY "Generator very high coolant temperature alarm cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 430 + +xATSGeneratorLowCoolantTempAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "WARNING: Low coolant temperature has been detected in the generator. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator low coolant temperature alarm." + --#SUMMARY "Generator low coolant temperature alarm." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 431 + +xATSGeneratorLowCoolantTempAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The low coolant temperature condition has been cleared in the generator. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator low coolant temperature alarm cleared." + --#SUMMARY "Generator low coolant temperature alarm cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 432 + +xATSGeneratorLowOilLevelAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: Low oil level has been detected in the generator. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator low oil level alarm." + --#SUMMARY "Generator low oil level alarm." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 433 + +xATSGeneratorLowOilLevelAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Low oil level alarm has been cleared in the generator. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator low oil level alarm cleared." + --#SUMMARY "Generator low oil level alarm cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 434 + +xATSGeneratorLowBatteryVoltDuringCrankAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: The generator's battery voltage has been detected + as low while cranking the engine. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Low batt. voltage while cranking alarm." + --#SUMMARY "Generator low battery volts while cranking alarm." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 435 + +xATSGeneratorLowBatteryVoltDuringCrankAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The generator's low battery voltage while + cranking condition has been cleared. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "XGEN: Generator low batt. voltage while cranking alarm cleared." + --#SUMMARY "Generator low battery volts while cranking alarm cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 436 + +xATSGeneratorVeryLowBatteryVoltDuringCrankAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: The generator's battery voltage has been detected + as very low while cranking the engine. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "XGEN: Generator v.low battery voltage while cranking alarm." + --#SUMMARY "Generator v.low battery volts while cranking alarm." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 437 + +xATSGeneratorVeryLowBatteryVoltDuringCrankAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The generator's high battery voltage while + cranking condition has been cleared. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "XGEN: Generator v.low batt volt, while cranking alarm cleared." + --#SUMMARY "Generator v.low battery volts while cranking alarm cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 438 + +xATSGeneratorEStop TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsInteger02, mtrapargsString } + DESCRIPTION + "SEVERE: The generator's emergency stop input has been activated. + After the emergency stop signal has been removed, the E-Stop condition + must be cleared before the generator can be started again. + E-Stop conditions can only be cleared via the generator front panel. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code. + The fourth argument is the type of E-Stop (1=LOCAL, 2=REMOTE)." + --#TYPE "APC XGEN: Generator emergency stop engaged." + --#SUMMARY "Generator emergency stop engaged." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE NONOPERATIONAL + ::= 439 + +xATSGeneratorEStopCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsInteger02, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The generator's emergency stop condition has been cleared. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code. + The fourth argument is the type of E-Stop (1=LOCAL, 2=REMOTE)." + --#TYPE "APC XGEN: Generator emergency stop condition cleared." + --#SUMMARY "Generator emergency stop condition cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 440 + +xATSGeneratorHighBatteryVolt TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "WARNING: The generator's battery voltage has been detected as high. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator high battery voltage." + --#SUMMARY "Generator high battery volts." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 441 + +xATSGeneratorHighBatteryVoltCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The detected high battery voltage has been cleared, on the generator. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator high battery voltage condition cleared." + --#SUMMARY "Generator high battery volts condition cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 442 + +xATSGeneratorLowBatteryVolt TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: The generator's battery voltage has been detected as low. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator low battery voltage." + --#SUMMARY "Generator low battery volts." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 443 + +xATSGeneratorLowBatteryVoltCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The detected low battery voltage has been cleared, on the generator. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator low battery voltage condition cleared." + --#SUMMARY "Generator low battery volts condition cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 444 + +xATSGeneratorControlSwitchNotAuto TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: The control switch on the generator is not in auto position. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator not-in-automatic mode." + --#SUMMARY "Generator not-in-auto." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 445 + +xATSGeneratorControlSwitchNotAutoCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The control switch on the generator is in auto position. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator automatic mode restored." + --#SUMMARY "Generator not-in-auto cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 446 + +xATSGeneratorLowOilPressure TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: The generator's oil pressure has been detected as low. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator low oil pressure." + --#SUMMARY "Generator low oil pressure." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 447 + +xATSGeneratorLowOilPressureCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The detected low oil pressure has been cleared, on the generator. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator low oil pressure condition cleared." + --#SUMMARY "Generator low oil pressure condition cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 448 + +xATSGeneratorVeryLowOilPressure TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: The generator's oil pressure has been detected as very low. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator v.low oil pressure." + --#SUMMARY "Generator v.low oil pressure." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 449 + +xATSGeneratorVeryLowOilPressureCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The detected v.low oil pressure has been cleared, on the generator. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator v.low oil pressure condition cleared." + --#SUMMARY "Generator v.low oil pressure condition cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 450 + +xATSGeneratorOverload TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: The generator is overloaded. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator is in overload event." + --#SUMMARY "Generator on overload event." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 451 + +xATSGeneratorOverloadCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The generator is running within loading limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator is in overload event cleared." + --#SUMMARY "Generator on overload event cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 452 + +xATSGeneratorLowACVEvent TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: The generator AC voltage is outside the acceptable bounds. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: State of the Generator ac voltage." + --#SUMMARY " State of the Generator ac voltage." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 453 + +xATSGeneratorLowACVEventCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The generator AC voltage is within normal bounds. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: State of the Generator ac voltage cleared." + --#SUMMARY "State of the Generator ac voltage cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 454 + +xATSGeneratorHighACVEvent TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: The generator AC voltage is outside the acceptable bounds. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: State of the Generator ac voltage." + --#SUMMARY " State of the Generator ac voltage." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 455 + +xATSGeneratorHighACVEventCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The generator AC voltage is within normal bounds. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: State of the Generator ac voltage cleared." + --#SUMMARY "State of the Generator ac voltage cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 456 + +xATSGeneratorOverspeed TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: The generator is running over the acceptable RPM. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator overspeed condition." + --#SUMMARY "Generator overspeed condition." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 457 + +xATSGeneratorOverspeedCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The generator overspeed shutdown has been cleared. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator overspeed condition cleared." + --#SUMMARY "Generator overspeed condition cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 458 + +xATSGeneratorEngineCold TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: The generator engine is cold, may not start. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator engine is cold, may not start." + --#SUMMARY "Generator engine is cold." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 459 + +xATSGeneratorEngineColdCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The engine is not cold to start. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Engine is cold to start condition cleared." + --#SUMMARY "Engine is cold to start condition cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 460 + +xATSGeneratorOutputBreakerOpen TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: The generators output breaker has been detected as open. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator output breaker open alarm." + --#SUMMARY "Generator output breaker open." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE NONOPERATIONAL + ::= 461 + +xATSGeneratorOutputBreakerOpenCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The engine is not cold to start. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator output breaker open alarm cleared." + --#SUMMARY "Generator output breaker open cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 462 + +xATSGeneratorLowFuelLevelAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "WARNING: The tank fuel level is below the limits specified + in the xATSGeneratorFuelSystemLowFuelLevelThreshold OID. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the measured fuel level in percent of full." + --#TYPE "APC XGEN: Low fuel level alarm." + --#SUMMARY "Generator low fuel level alarm." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 463 + +xATSGeneratorLowFuelLevelAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The tank fuel level is back above the specified limit. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XGEN: Low fuel level alarm cleared." + --#SUMMARY "Generator low fuel level alarm cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 464 + +xATSGeneratorVeryLowFuelLevelAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: The tank fuel level is below the low threshold limits. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the measured tank fuel level in percent of full." + --#TYPE "APC XGEN: Very Low fuel level alarm." + --#SUMMARY "Generator very low fuel level alarm." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 465 + +xATSGeneratorVeryLowFuelLevelAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The detected low tank level has been cleared in the device. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XGEN: Very low fuel level alarm cleared." + --#SUMMARY "Generator very low fuel level alarm cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 466 + +xATSGeneratorLowRunTimeAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "WARNING: The estimated runtime is below the limits specified. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the estimated runtime in hours." + --#TYPE "APC XGEN: Low run time alarm." + --#SUMMARY "Generator low run time alarm." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 467 + +xATSGeneratorLowRunTimeAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The detected low runtime has been cleared in the device. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XGEN: Low run time alarm cleared." + --#SUMMARY "Generator low run time alarm." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 468 + +xATSGeneratorVeryLowRunTimeAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: The estimated runtime is below the limits specified + in the xATSGeneratorFuelSystemVeryLowRunTimeThreshold OID. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the estimated runtime in hours." + --#TYPE "APC XGEN: Very low run time alarm." + --#SUMMARY "Generator very low run time alarm." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 469 + +xATSGeneratorVeryLowRunTimeAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The detected low runtime has been cleared in the device. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XGEN: Very low run time alarm cleared." + --#SUMMARY "Generator very low run time alarm." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 470 + +xATSGeneratorServiceDueAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "WARNING: The generator is due for scheduled service. + Generation of this alarm is based on calender days since + and/or actual generator run-hours since last service. + This alarm is cleared using the xATSGeneratorServiceResetRecord OID. + + (See also: xATSGeneratorServiceCalendarIntervalThreshold + and xATSGeneratorServiceRunHoursThreshold OIDs) + + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Generator scheduled maintenance is due." + --#SUMMARY "Generator maintenance due." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 471 + +xATSGeneratorServiceDueAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The generator's service registers have been reset. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Generator service due alarm is cleared." + --#SUMMARY "Generator service alarm is cleard." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 472 + +xATSGeneratorShutdown TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: The generator is shutdown. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator shutdown." + --#SUMMARY "Generator shutdown" + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 473 + +xATSGeneratorShutdownCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The generator shutdown alarm is cleared. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator shutdown is cleared." + --#SUMMARY "Generator shutdown is cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 474 + +xATSGeneratorBatteryCharger TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: The generator battery charger is nonfunctional. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator batt. charger is nonfunctional." + --#SUMMARY "Generator battery charger is nonfunctional" + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 475 + +xATSGeneratorBatteryChargerCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: nonfunctionality of the generator battery is cleared. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: " Nonfunctionality of battery charger is cleared." + --#SUMMARY "non-functionality of Generator battery charger is cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 476 + +xATSGeneratorGenericEvent TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "WARNING: Any generic generator event. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generator generic event." + --#SUMMARY "Generator generic event." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 477 + +xATSGeneratorGenericEventCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xATSIdentSerialNumber, xATSIdentProductName, mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Generated generic generator event is cleared. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the OEM's fault/event code." + --#TYPE "APC XGEN: Generic generator event is cleared." + --#SUMMARY "Generic generator event is cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 478 + +-- xPDU Traps (part 2) + +xPDUInternalCommErrorCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Internal communication has been restored. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XPDU: Internal Communication error cleared." + --#SUMMARY "Communication error cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 479 + +xPDUSystemStateAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, + mtrapargsInteger, mtrapargsString } + DESCRIPTION + "WARNING: The PDU's breakers (Q1, Q2 & Q3) are in a configuration that might lead + to system unavailability. it may signify a temporary condition, when the breakers + are placed in an atypical manner as the user transitions to (UPS OPERATION or MAINTENANCE BYPASS) + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the type of alarm + (1=NO UPS INPUT, 2=NO PANEL FEED, 3=ATYPICAL BYPASS MODE)." + --#TYPE "APC XPDU: System state alarm ." + --#SUMMARY "PDU state alarm." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 480 + +xPDUSystemStateNormal TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, + mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The PDU's breakers (Q1, Q2 & Q3) are set in a configuration + that is a non-alarm state. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the type of alarm (1=UPS OPERATION, 2=MAINTENANCE BYPASS)." + --#TYPE "APC XPDU: System state returned to normal." + --#SUMMARY "PDU state normal." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 481 + +xPDUEpoTestMode TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsString } + DESCRIPTION + "WARNING: The device's Emergency Power Off (EPO) circuit has been + switched back to the test position. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XPDU: Emergency Power Off (EPO) in test mode." + --#SUMMARY "EPO disabled." + --#ARGUMENTS { } + --#SEVERITY WARNING + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 482 + +xPDUEpoArmed TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: The device's Emergency Power Off (EPO) circuit has been + switched back to the armed position. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XPDU: Emergency Power Off (EPO) enabled." + --#SUMMARY "EPO armed." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 483 + +xPDUFuseBlownAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, + mtrapargsInteger, mtrapargsString } + DESCRIPTION + "SEVERE: One or more fuses in this PDU have been detected as open. + These fuses are in the feed to the UPS associated with this PDU. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1, 2=L2, 3=L3)." + --#TYPE "APC XPDU: Check fuse alarm." + --#SUMMARY "Fuse detected opened." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 484 + +xPDUFuseBlownAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, + mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A previous check fuse alarm in this PDU has cleared. + These fuses are in the feed to the UPS associated with this PDU. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the phase (1=L1, 2=L2, 3=L3)." + --#TYPE "APC XPDU: Check fuse alarm cleared." + --#SUMMARY "Fuse alarm cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 485 + +xPDUBreakerPositionAlarm TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, + mtrapargsInteger, mtrapargsInteger02, mtrapargsString } + DESCRIPTION + "SEVERE: A PDU breaker is in a state that compromises system availability. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the breaker (1=MAIN INPUT, 2=BYPASS INPUT, 3=CROSS TIE). + The fourth argument is the breaker position (1=OPEN, 2=CLOSED)." + --#TYPE "APC XPDU: Breaker position alarm." + --#SUMMARY "Breaker position alarm." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 486 + +xPDUBreakerPositionAlarmCleared TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, + mtrapargsInteger, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A PDU breaker is no longer in a state that compromises system availability. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the breaker (1=MAIN INPUT, 2=BYPASS INPUT, 3=CROSS TIE)." + --#TYPE "APC XPDU: Breaker position alarm cleared." + --#SUMMARY "Breaker alarm cleared." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 487 + +xPDUBreakerChangeEvent TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsInteger, + mtrapargsInteger02, mtrapargsInteger03, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: A system breaker or switch within the device has changed state. + They are generated when any of the Q1, Q2 or Q3 breakers have changed states. + The first argument is the host device serial number. + The second argument is the host device name. + The third argument is the breaker that has changed + (1=UPS FEED (Q1), 2=UPS OUTPUT(Q2), 3=MAINTENANCE BYPASS (Q3). + The fourth argument is the state of the breaker that has changed (1=OPEN, 2=CLOSED). + The fifth argument is a 8-bit field representing the state of all breakers in the system, + when any of one of the Q1, Q2 or Q3 breakers have changed state. + + The bit map is represented in the following manner (b7, b6 ... b0) + b0 - UPS FEED (Q1) + b1 - MAINTENANCE BYPASS (Q3) + b2 - UPS OUTPUT (Q2) + b3 - MAIN INPUT + b4 - BYPASS INPUT + b5 - CROSS-TIE OUTPUT + + Example: value of 60 (0x3C) indicates that the CROSS_TIE, BYPASS and MAIN INPUT, and Q2 breakers + are CLOSED and Q2, Q1 breakers are OPEN." + --#TYPE "APC XPDU: Breaker/switch change event." + --#SUMMARY "Breaker/switch change event." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 488 + +xPDUControllerFirmwareUpdateTransferStart TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Start Controller firmware transfer in the device. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XPDU: Start controller firmware transfer." + --#SUMMARY "Start controller firmware transfer." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 489 + +xPDUControllerFirmwareUpdateTransferComplete TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Transfer of Controller firmware was completed in the device. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XPDU: Controller firmware transfer completed." + --#SUMMARY "Controller firmware transfer completed." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 490 + +xPDUControllerFirmwareUpdateTransferFailed TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsString } + DESCRIPTION + "SEVERE: Transfer of Controller firmware has failed in the PDU. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XPDU: Controller firmware transfer failed." + --#SUMMARY "Controller firmware transfer failed." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 491 + +xATSControllerFirmwareUpdateTransferStart TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Start Controller firmware transfer in the device. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Start controller firmware transfer." + --#SUMMARY "Start controller firmware transfer." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 492 + +xATSControllerFirmwareUpdateTransferComplete TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsString } + DESCRIPTION + "INFORMATIONAL: Transfer of Controller firmware was completed in the device. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Controller firmware transfer completed." + --#SUMMARY "Controller firmware transfer completed." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 493 + +xATSControllerFirmwareUpdateTransferFailed TRAP-TYPE + ENTERPRISE apc + VARIABLES { xPDUIdentSerialNumber, xPDUIdentProductName, mtrapargsString } + DESCRIPTION + "SEVERE: Transfer of Controller firmware has failed in the device. + The first argument is the host device serial number. + The second argument is the host device name." + --#TYPE "APC XATS: Controller firmware transfer failed." + --#SUMMARY "Controller firmware transfer failed." + --#ARGUMENTS { } + --#SEVERITY SEVERE + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE DEGRADED + ::= 494 + +apcDeviceShutdownHeartbeat TRAP-TYPE + ENTERPRISE apc + VARIABLES { mtrapargsInteger, mtrapargsTimeTicks, mtrapargsString} + DESCRIPTION + "INFORMATIONAL: " + --#TYPE "APC X:" + --#SUMMARY "." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 999 + +apcDiscoveryAlarmStateTableUpdate TRAP-TYPE + ENTERPRISE apc + VARIABLES { apcDiscoveryDeviceAlarmStateChangeCount } + DESCRIPTION + "INTERNAL: A Discovery Alarm State Table Update trap is sent + when any data alarm state is added, removed, or its parameters + are changed in the condition table. This trap is + only for machine-to-machine communication. " + --#TYPE "APC X:" + --#SUMMARY "." + --#ARGUMENTS { } + --#SEVERITY INFORMATIONAL + --#TIMEINDEX 1 + --#HELP "" + --#HELPTAG 0 + --#STATE OPERATIONAL + ::= 1000 + +END diff --git a/agents/autodetect/a.py b/agents/autodetect/a.py new file mode 100644 index 0000000..608d0f8 --- /dev/null +++ b/agents/autodetect/a.py @@ -0,0 +1,8 @@ +from b import myf + +def maf(): + return 5 + +def maf2(): + return myf() + \ No newline at end of file diff --git a/agents/autodetect/autodetect.py b/agents/autodetect/autodetect.py new file mode 100755 index 0000000..24d9a73 --- /dev/null +++ b/agents/autodetect/autodetect.py @@ -0,0 +1,255 @@ +#!/usr/bin/python + +import pexpect +import re +import logging +import time +import sys +import fencing + +import fence_apc +import fence_bladecenter +import fence_brocade +import fence_rsa + +def check_agent(conn, options, found_prompt, prompts, test_fn, eol=None): + options["--action"] = "list" + options["--command-prompt"] = found_prompt + if any(x in options["--command-prompt"][0] for x in prompts): + options["--command-prompt"] = prompts + + return test_fn(conn, options) + return False + +def get_list(conn, options, found_prompt, prompts, list_fn, eol=None): + def test_fn(conn, options): + if len(list_fn(conn, options)) > 0: + return True + else: + return False + + return check_agent(conn, options, found_prompt, prompts, test_fn, eol) + +""" *************************** MAIN ******************************** """ + + +def detect_login_telnet(options): + options["--ipport"] = 23 + re_login_string = r"([\r\n])((?!Last )login\s*:)|((?!Last )Login Name: )|(username: )|(User Name :)" + re_login = re.compile(re_login_string, re.IGNORECASE) + re_pass = re.compile("(password)|(pass phrase)", re.IGNORECASE) + + options["eol"] = "\r\n" + conn = fencing.fspawn(options, options["--telnet-path"]) + conn.send("set binary\n") + conn.send("open %s -%s\n"%(options["--ip"], options["--ipport"])) + + conn.log_expect(re_login, int(options["--login-timeout"])) + conn.send_eol(options["--username"]) + + ## automatically change end of line separator + screen = conn.read_nonblocking(size=100, timeout=int(options["--shell-timeout"])) + if re_login.search(screen) != None: + options["eol"] = "\n" + conn.send_eol(options["--username"]) + conn.log_expect(re_pass, int(options["--login-timeout"])) + elif re_pass.search(screen) == None: + conn.log_expect(re_pass, int(options["--shell-timeout"])) + + try: + conn.send_eol(options["--password"]) + valid_password = conn.log_expect([re_login] + \ + [pexpect.TIMEOUT], int(options["--shell-timeout"])) + if valid_password == 0: + ## password is invalid or we have to change EOL separator + options["eol"] = "\r" + conn.send_eol("") + screen = conn.read_nonblocking(size=100, timeout=int(options["--shell-timeout"])) + ## after sending EOL the fence device can either show 'Login' or 'Password' + if re_login.search(conn.after + screen) != None: + conn.send_eol("") + conn.send_eol(options["--username"]) + conn.log_expect(re_pass, int(options["--login-timeout"])) + conn.send_eol(options["--password"]) + conn.log_expect(pexpect.TIMEOUT, int(options["--login-timeout"])) + except KeyError: + fencing.fail(fencing.EC_PASSWORD_MISSING) + + found_cmd_prompt = guess_prompt(conn, options, conn.before) + return (found_cmd_prompt, conn) + +def guess_prompt(conn, options, before=""): + time.sleep(2) + conn.send_eol("") + conn.send_eol("") + + conn.log_expect(pexpect.TIMEOUT, int(options["--login-timeout"])) + lines = re.split(r'\r|\n', before + conn.before) + logging.info("Cmd-prompt candidate: %s" % (lines[-1])) + if lines.count(lines[-1]) >= 3: + found_cmd_prompt = ["\n" + lines[-1]] + else: + if lines.count(lines[-1]) == 2: + conn.log_expect(lines[-1], int(options["--shell-timeout"])) + conn.log_expect(lines[-1], int(options["--shell-timeout"])) + options["eol"] = "\r" + conn.send_eol("") + time.sleep(0.1) + conn.send_eol("") + time.sleep(0.1) + conn.send_eol("") + time.sleep(0.1) + conn.log_expect(pexpect.TIMEOUT, int(options["--login-timeout"])) + lines = re.split(r'\r|\n', conn.before) + logging.info("Cmd-prompt candidate: %s" % (lines[1])) + if lines.count(lines[-1]) >= 3: + found_cmd_prompt = ["\n" + lines[-1]] + else: + print "Unable to obtain command prompt automatically" + sys.exit(1) + else: + print "Unable to obtain command prompt automatically" + print lines[-1] + print conn.before + sys.exit(1) + + conn.log_expect(found_cmd_prompt, int(options["--shell-timeout"])) + conn.log_expect(found_cmd_prompt, int(options["--shell-timeout"])) + conn.log_expect(found_cmd_prompt, int(options["--shell-timeout"])) + + # Handle situation when CR/LF is interpreted as ENTER, ENTER + # In such case we will have get two additional command prompts to get on right position + res = conn.log_expect([pexpect.TIMEOUT] + found_cmd_prompt, int(options["--shell-timeout"])) + if res > 0: + # @note: store that information? + print "CMD twice" + conn.log_expect(found_cmd_prompt, int(options["--shell-timeout"])) + return found_cmd_prompt + +def detect_login_ssh(options, version=2): + options["--ipport"] = 22 + if version == "1": + command = '%s %s@%s -p %s -1 -c blowfish -o PubkeyAuthentication=no' % (options["--ssh-path"], options["--username"], options["--ip"], options["--ipport"]) + else: + command = '%s %s@%s -p %s -o PubkeyAuthentication=no' % (options["--ssh-path"], options["--username"], options["--ip"], options["--ipport"]) + + conn = fencing.fspawn(options, command) + result = conn.log_expect(["ssword:", "Are you sure you want to continue connecting (yes/no)?"], int(options["--login-timeout"])) + if result == 1: + conn.send("yes\n") + conn.log_expect("ssword:", int(options["--login-timeout"])) + + conn.send(options["--password"] + "\n") + + found_cmd_prompt = guess_prompt(conn, options, conn.before) + return (found_cmd_prompt, conn) + +def detect_device(conn, options, found_cmd_prompt): + if get_list(conn, options, found_cmd_prompt, prompts=["\n>", "\napc>"], list_fn=fence_apc.get_power_status): + fencing.fence_logout(conn, "4") + return "fence_apc # older serie" + + if get_list(conn, options, found_cmd_prompt, prompts=["\n>", "\napc>"], list_fn=fence_apc.get_power_status5): + fencing.fence_logout(conn, "exit") + return "fence_apc # v5+" + + ## Test fence_lpar with list action (HMC version 3 and 4) + def test_lpar(conn, options): + conn.send_eol("lssyscfg; echo $?") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + if "\n0\r\n" in conn.before: + return True + else: + return False + + if check_agent(conn, options, found_cmd_prompt, [r":~>", r"]\$", r"\$ "], test_lpar): + fencing.fence_logout(conn, "quit") + return "fence_lpar # 2" + + if get_list(conn, options, found_cmd_prompt, prompts=["system>"], list_fn=fence_bladecenter.get_blades_list): + fencing.fence_logout(conn, "exit") + return "fence_bladecenter #2" + + if get_list(conn, options, found_cmd_prompt, prompts=["> "], list_fn=fence_brocade.get_power_status, eol="\n"): + fencing.fence_logout(conn, "exit") + return "fence_brocade #2" + + if get_list(conn, options, found_cmd_prompt, prompts=["> "], list_fn=fence_rsa.get_power_status): + fencing.fence_logout(conn, "exit") + return "fence_rsa" + + return None + +# Test fence ilo moonshot +#cmd_possible = ["MP>", "hpiLO->"] +#options["--action"] = "list" +#options["--command-prompt"] = found_cmd_prompt +#options["eol"] = "\n" +#if any(x in options["--command-prompt"][0] for x in cmd_possible): +# options["--command-prompt"] = cmd_possible +# +# plugs = fence_ilo_moonshot.get_power_status(conn, options) +# if len(plugs) > 0: +# print "fence_ilo_moonshot # " +# fencing.fence_logout(conn, "exit") +# sys.exit(0) + +def xxx(): + ## login mechanism as in fencing.py.py - differences is that we do not know command prompt + #logging.getLogger().setLevel(logging.DEBUG) + options = {} + options["--ssh-path"] = "/usr/bin/ssh" + options["--telnet-path"] = "/usr/bin/telnet" + + # virtual machine + #options["--username"] = "marx" + #options["--ip"] = "localhost" + #options["--password"] = "batalion" + + # APC + #options["--username"] = "labuser" + #options["--ip"] = "pdu-bar.englab.brq.redhat.com" + #options["--password"] = "labuser" + + # LPAR + options["--username"] = "rhts" + options["--ip"] = "ppc-hmc-01.mgmt.lab.eng.bos.redhat.com" + #options["--ip"] = "ibm-js22-vios-02.rhts.eng.bos.redhat.com" + options["--password"] = "100yard-" + + # Bladecenter + options["--ip"] = "blade-mm.englab.brq.redhat.com" + + # Brocade + #options["--ip"] = "hp-fcswitch-01.lab.bos.redhat.com" + #options["--password"] = "password" + #options["--username"] = "admin" + + # iLO Moonshot - chova sa to divne + #options["--password"] = "Access@gis" + #options["--username"] = "rcuser" + #options["--ip"] = "hp-m1500-mgmt.gsslab.pnq.redhat.com" + + #options["--ip"] = "ibm-x3755-01-rsa.ovirt.rhts.eng.bos.redhat.com" + #options["--username"] = "USERID" + #options["--password"] = "PASSW0RD" + + options["--login-timeout"] = "10" + options["--shell-timeout"] = "5" + options["--power-timeout"] = "10" + + options["eol"] = "\r\n" + + (found_cmd_prompt, conn) = detect_login_telnet(options) + #(found_cmd_prompt, conn) = detect_login_ssh(options) + + res = detect_device(conn, options, found_cmd_prompt) + if not res is None: + print res + sys.exit(0) + else: + ## Nothing found + sys.exit(2) + +if __name__ == "__main__": + xxx() diff --git a/agents/autodetect/autodetect_test.py b/agents/autodetect/autodetect_test.py new file mode 100755 index 0000000..a18aaed --- /dev/null +++ b/agents/autodetect/autodetect_test.py @@ -0,0 +1,33 @@ +#!/usr/bin/python + +import unittest +import autodetect as detect + +class TestDetectDevice(unittest.TestCase): + options = {} + + def setUp(self): + self.options = {} + self.options["--ssh-path"] = "/usr/bin/ssh" + self.options["--telnet-path"] = "/usr/bin/telnet" + self.options["--login-timeout"] = "10" + self.options["--shell-timeout"] = "5" + self.options["--power-timeout"] = "10" + self.options["eol"] = "\r\n" + + def test_bladecenter(self): + self.options["--username"] = "rhts" + self.options["--password"] = "100yard-" + self.options["--ip"] = "blade-mm.englab.brq.redhat.com" + + (found_cmd_prompt, conn) = detect.detect_login_telnet(self.options) + res = detect.detect_device(conn, self.options, found_cmd_prompt) + self.assertEqual('fence_bladecenter', res) + + def test_apc5(self): + self.assertEqual('foo', 'foo') + self.options["c"] = "c" + print self.options + +if __name__ == "__main__": + unittest.main() diff --git a/agents/autodetect/b.py b/agents/autodetect/b.py new file mode 100644 index 0000000..fdfda59 --- /dev/null +++ b/agents/autodetect/b.py @@ -0,0 +1,2 @@ +def myf(): + return 3 diff --git a/agents/autodetect/fence_apc.py b/agents/autodetect/fence_apc.py new file mode 100644 index 0000000..c6dd106 --- /dev/null +++ b/agents/autodetect/fence_apc.py @@ -0,0 +1,259 @@ +#!/usr/bin/python -tt + +##### +## +## The Following Agent Has Been Tested On: +## +## Model Firmware +## +---------------------------------------------+ +## AP7951 AOS v2.7.0, PDU APP v2.7.3 +## AP7941 AOS v3.5.7, PDU APP v3.5.6 +## AP9606 AOS v2.5.4, PDU APP v2.7.3 +## +## @note: ssh is very slow on AP79XX devices protocol (1) and +## cipher (des/blowfish) have to be defined +##### + +import sys, re +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, fail_usage, EC_STATUS + +#BEGIN_VERSION_GENERATION +RELEASE_VERSION="New APC Agent - test release on steroids" +REDHAT_COPYRIGHT="" +BUILD_DATE="March, 2008" +#END_VERSION_GENERATION + +def get_power_status(conn, options): + exp_result = 0 + outlets = {} + + conn.send_eol("1") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + version = 0 + admin = 0 + switch = 0 + + if None != re.compile('.* MasterSwitch plus.*', re.IGNORECASE | re.S).match(conn.before): + switch = 1 + if None != re.compile('.* MasterSwitch plus 2', re.IGNORECASE | re.S).match(conn.before): + if not options.has_key("--switch"): + fail_usage("Failed: You have to enter physical switch number") + else: + if not options.has_key("--switch"): + options["--switch"] = "1" + + if None == re.compile('.*Outlet Management.*', re.IGNORECASE | re.S).match(conn.before): + version = 2 + else: + version = 3 + + if None == re.compile('.*Outlet Control/Configuration.*', re.IGNORECASE | re.S).match(conn.before): + admin = 0 + else: + admin = 1 + + if switch == 0: + if version == 2: + if admin == 0: + conn.send_eol("2") + else: + conn.send_eol("3") + else: + conn.send_eol("2") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + conn.send_eol("1") + else: + conn.send_eol(options["--switch"]) + + while True: + exp_result = conn.log_expect( + ["Press "] + options["--command-prompt"], int(options["--shell-timeout"])) + lines = conn.before.split("\n") + show_re = re.compile(r'(^|\x0D)\s*(\d+)- (.*?)\s+(ON|OFF)\s*') + for line in lines: + res = show_re.search(line) + if res != None: + outlets[res.group(2)] = (res.group(3), res.group(4)) + conn.send_eol("") + if exp_result != 0: + break + conn.send(chr(03)) + conn.log_expect("- Logout", int(options["--shell-timeout"])) + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + if ["list", "monitor"].count(options["--action"]) == 1: + return outlets + else: + try: + (_, status) = outlets[options["--plug"]] + return status.lower().strip() + except KeyError: + fail(EC_STATUS) + +def set_power_status(conn, options): + action = { + 'on' : "1", + 'off': "2" + }[options["--action"]] + + conn.send_eol("1") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + version = 0 + admin2 = 0 + admin3 = 0 + switch = 0 + + if None != re.compile('.* MasterSwitch plus.*', re.IGNORECASE | re.S).match(conn.before): + switch = 1 + ## MasterSwitch has different schema for on/off actions + action = { + 'on' : "1", + 'off': "3" + }[options["--action"]] + if None != re.compile('.* MasterSwitch plus 2', re.IGNORECASE | re.S).match(conn.before): + if not options.has_key("--switch"): + fail_usage("Failed: You have to enter physical switch number") + else: + if not options.has_key("--switch"): + options["--switch"] = 1 + + if None == re.compile('.*Outlet Management.*', re.IGNORECASE | re.S).match(conn.before): + version = 2 + else: + version = 3 + + if None == re.compile('.*Outlet Control/Configuration.*', re.IGNORECASE | re.S).match(conn.before): + admin2 = 0 + else: + admin2 = 1 + + if switch == 0: + if version == 2: + if admin2 == 0: + conn.send_eol("2") + else: + conn.send_eol("3") + else: + conn.send_eol("2") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + if None == re.compile('.*2- Outlet Restriction.*', re.IGNORECASE | re.S).match(conn.before): + admin3 = 0 + else: + admin3 = 1 + conn.send_eol("1") + else: + conn.send_eol(options["--switch"]) + + while 0 == conn.log_expect( + ["Press "] + options["--command-prompt"], int(options["--shell-timeout"])): + conn.send_eol("") + + conn.send_eol(options["--plug"]+"") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + if switch == 0: + if admin2 == 1: + conn.send_eol("1") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + if admin3 == 1: + conn.send_eol("1") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + else: + conn.send_eol("1") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + conn.send_eol(action) + conn.log_expect("Enter 'YES' to continue or to cancel :", int(options["--shell-timeout"])) + conn.send_eol("YES") + conn.log_expect("Press to continue...", int(options["--power-timeout"])) + conn.send_eol("") + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + conn.send(chr(03)) + conn.log_expect("- Logout", int(options["--shell-timeout"])) + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + +def get_power_status5(conn, options): + outlets = {} + + conn.send_eol("olStatus all") + + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + lines = conn.before.split("\n") + + show_re = re.compile(r'^\s*(\d+): (.*): (On|Off)\s*$', re.IGNORECASE) + + for line in lines: + res = show_re.search(line) + if res != None: + outlets[res.group(1)] = (res.group(2), res.group(3)) + + if ["list", "monitor"].count(options["--action"]) == 1: + return outlets + else: + try: + (_, status) = outlets[options["--plug"]] + return status.lower().strip() + except KeyError: + fail(EC_STATUS) + +def set_power_status5(conn, options): + action = { + 'on' : "olOn", + 'off': "olOff" + }[options["--action"]] + + conn.send_eol(action + " " + options["--plug"]) + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + +def main(): + device_opt = ["ipaddr", "login", "passwd", "cmd_prompt", "secure", \ + "port", "switch", "telnet"] + + atexit.register(atexit_handler) + + all_opt["cmd_prompt"]["default"] = ["\n>", "\napc>"] + all_opt["ssh_options"]["default"] = "-1 -c blowfish" + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for APC over telnet/ssh" + docs["longdesc"] = "fence_apc is an I/O Fencing agent \ +which can be used with the APC network power switch. It logs into device \ +via telnet/ssh and reboots a specified outlet. Lengthy telnet/ssh connections \ +should be avoided while a GFS cluster is running because the connection \ +will block any necessary fencing actions." + docs["vendorurl"] = "http://www.apc.com" + show_docs(options, docs) + + ## Support for --plug [switch]:[plug] notation that was used before + if (options.has_key("--plug") == 1) and (-1 != options["--plug"].find(":")): + (switch, plug) = options["--plug"].split(":", 1) + options["--switch"] = switch + options["--plug"] = plug + + ## + ## Operate the fencing device + #### + conn = fence_login(options) + + ## Detect firmware version (ASCII menu vs command-line interface) + ## and continue with proper action + #### + result = -1 + firmware_version = re.compile(r'\s*v(\d)*\.').search(conn.before) + if (firmware_version != None) and (firmware_version.group(1) in [ "5", "6" ]): + result = fence_action(conn, options, set_power_status5, get_power_status5, get_power_status5) + else: + result = fence_action(conn, options, set_power_status, get_power_status, get_power_status) + + fence_logout(conn, "4") + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/autodetect/fence_bladecenter.py b/agents/autodetect/fence_bladecenter.py new file mode 100644 index 0000000..d72c07f --- /dev/null +++ b/agents/autodetect/fence_bladecenter.py @@ -0,0 +1,111 @@ +#!/usr/bin/python -tt + +##### +## +## The Following Agent Has Been Tested On: +## +## Model Firmware +## +--------------------+---------------------------+ +## (1) Main application BRET85K, rev 16 +## Boot ROM BRBR67D, rev 16 +## Remote Control BRRG67D, rev 16 +## +##### + +import sys, re +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, EC_STATUS, EC_GENERIC_ERROR + +#BEGIN_VERSION_GENERATION +RELEASE_VERSION="New Bladecenter Agent - test release on steroids" +REDHAT_COPYRIGHT="" +BUILD_DATE="March, 2008" +#END_VERSION_GENERATION + +def get_power_status(conn, options): + node_cmd = r"system:blade\[" + options["--plug"] + r"\]>" + + conn.send_eol("env -T system:blade[" + options["--plug"] + "]") + i = conn.log_expect([node_cmd, "system>"], int(options["--shell-timeout"])) + if i == 1: + ## Given blade number does not exist + if options.has_key("--missing-as-off"): + return "off" + else: + fail(EC_STATUS) + conn.send_eol("power -state") + conn.log_expect(node_cmd, int(options["--shell-timeout"])) + status = conn.before.splitlines()[-1] + conn.send_eol("env -T system") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + return status.lower().strip() + +def set_power_status(conn, options): + node_cmd = r"system:blade\[" + options["--plug"] + r"\]>" + + conn.send_eol("env -T system:blade[" + options["--plug"] + "]") + i = conn.log_expect([node_cmd, "system>"], int(options["--shell-timeout"])) + if i == 1: + ## Given blade number does not exist + if options.has_key("--missing-as-off"): + return + else: + fail(EC_GENERIC_ERROR) + + conn.send_eol("power -"+options["--action"]) + conn.log_expect(node_cmd, int(options["--shell-timeout"])) + conn.send_eol("env -T system") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + +def get_blades_list(conn, options): + outlets = {} + + node_cmd = "system>" + + conn.send_eol("env -T system") + conn.log_expect(node_cmd, int(options["--shell-timeout"])) + conn.send_eol("list -l 2") + conn.log_expect(node_cmd, int(options["--shell-timeout"])) + + lines = conn.before.split("\r\n") + filter_re = re.compile(r"^\s*blade\[(\d+)\]\s+(.*?)\s*$") + for blade_line in lines: + res = filter_re.search(blade_line) + if res != None: + outlets[res.group(1)] = (res.group(2), "") + + return outlets + +def main(): + device_opt = ["ipaddr", "login", "passwd", "cmd_prompt", "secure", \ + "port", "missing_as_off", "telnet"] + + atexit.register(atexit_handler) + + all_opt["power_wait"]["default"] = "10" + all_opt["cmd_prompt"]["default"] = ["system>"] + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for IBM BladeCenter" + docs["longdesc"] = "fence_bladecenter is an I/O Fencing agent \ +which can be used with IBM Bladecenters with recent enough firmware that \ +includes telnet support. It logs into a Brocade chasis via telnet or ssh \ +and uses the command line interface to power on and off blades." + docs["vendorurl"] = "http://www.ibm.com" + show_docs(options, docs) + + ## + ## Operate the fencing device + ###### + conn = fence_login(options, "(username\s*:\s*)") + result = fence_action(conn, options, set_power_status, get_power_status, get_blades_list) + fence_logout(conn, "exit") + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/autodetect/fence_brocade.py b/agents/autodetect/fence_brocade.py new file mode 100644 index 0000000..5257bcc --- /dev/null +++ b/agents/autodetect/fence_brocade.py @@ -0,0 +1,78 @@ +#!/usr/bin/python -tt + +import sys, re +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, EC_STATUS + +#BEGIN_VERSION_GENERATION +RELEASE_VERSION="New Brocade Agent - test release on steroids" +REDHAT_COPYRIGHT="" +BUILD_DATE="March, 20013" +#END_VERSION_GENERATION + +def set_power_status(conn, options): + action = { + 'on' : "portCfgPersistentEnable", + 'off': "portCfgPersistentDisable" + }[options["--action"]] + + conn.send_eol(action + " " + options["--plug"]) + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + +def get_power_status(conn, options): + line_re = re.compile(r'=========', re.IGNORECASE) + outlets = {} + in_index = False + + conn.send_eol("switchshow") + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + for line in str(conn.before).split("\n"): + if line_re.search(line): + in_index = True + elif in_index and line.lstrip()[0].isdigit(): + tokens = line.lstrip().split() + status = "off" if len(tokens) > 7 and tokens[7] == "Disabled" else "on" + outlets[tokens[0]] = ("", status) + + if ["list", "monitor"].count(options["--action"]) == 0: + (_, status) = outlets[options["--plug"]] + return status + else: + return outlets + +def main(): + device_opt = ["ipaddr", "login", "passwd", "cmd_prompt", "secure", \ + "port", "fabric_fencing", "telnet"] + + atexit.register(atexit_handler) + + all_opt["cmd_prompt"]["default"] = ["> "] + + options = check_input(device_opt, process_input(device_opt)) + options["eol"] = "\n" + + docs = {} + docs["shortdesc"] = "Fence agent for HP Brocade over telnet/ssh" + docs["longdesc"] = "fence_brocade is an I/O Fencing agent which can be used with Brocade FC switches. \ +It logs into a Brocade switch via telnet and disables a specified port. Disabling the port which a machine is \ +connected to effectively fences that machine. Lengthy telnet connections to the switch should be avoided while \ +a GFS cluster is running because the connection will block any necessary fencing actions. \ +\ +After a fence operation has taken place the fenced machine can no longer connect to the Brocade FC switch. \ +When the fenced machine is ready to be brought back into the GFS cluster (after reboot) the port on the Brocade \ +FC switch needs to be enabled. This can be done by running fence_brocade and specifying the enable action" + docs["vendorurl"] = "http://www.brocade.com" + show_docs(options, docs) + + ## + ## Operate the fencing device + #### + conn = fence_login(options) + result = fence_action(conn, options, set_power_status, get_power_status, get_power_status) + fence_logout(conn, "exit") + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/autodetect/fence_ilo_moonshot.py b/agents/autodetect/fence_ilo_moonshot.py new file mode 100644 index 0000000..e161ac6 --- /dev/null +++ b/agents/autodetect/fence_ilo_moonshot.py @@ -0,0 +1,69 @@ +#!/usr/bin/python -tt + +import sys +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, EC_STATUS + +#BEGIN_VERSION_GENERATION +RELEASE_VERSION="" +REDHAT_COPYRIGHT="" +BUILD_DATE="" +#END_VERSION_GENERATION + +def get_power_status(conn, options): + conn.send_eol("show node list") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + nodes = {} + for line in conn.before.splitlines(): + if len(line.split()) == 10: + nodes[line.split()[1]] = ("", line.split()[8].lower().strip()) + + if ["list", "monitor"].count(options["--action"]) == 1: + return nodes + else: + try: + (_, status) = nodes[options["--plug"]] + return status.lower() + except KeyError: + fail(EC_STATUS) + +def set_power_status(conn, options): + if options["--action"] == "on": + conn.send_eol("set node power on %s" % (options["--plug"])) + else: + conn.send_eol("set node power off force %s" % (options["--plug"])) + + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + + return + +def main(): + device_opt = ["ipaddr", "login", "passwd", "secure", "cmd_prompt", "port"] + + atexit.register(atexit_handler) + + all_opt["secure"]["default"] = "1" + all_opt["cmd_prompt"]["default"] = ["MP>", "hpiLO->"] + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for HP Moonshot iLO" + docs["longdesc"] = "" + docs["vendorurl"] = "http://www.hp.com" + show_docs(options, docs) + + conn = fence_login(options) + + ## + ## Fence operations + #### + result = fence_action(conn, options, set_power_status, get_power_status, get_power_status) + fence_logout(conn, "exit") + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/autodetect/fence_lpar.py b/agents/autodetect/fence_lpar.py new file mode 100644 index 0000000..6676e1c --- /dev/null +++ b/agents/autodetect/fence_lpar.py @@ -0,0 +1,159 @@ +#!/usr/bin/python -tt + +##### +## +## The Following Agent Has Been Tested On: +## +## Version +## +---------------------------------------------+ +## Tested on HMC +## +##### + +import sys, re +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, fail_usage, EC_STATUS_HMC + +#BEGIN_VERSION_GENERATION +RELEASE_VERSION="" +REDHAT_COPYRIGHT="" +BUILD_DATE="" +#END_VERSION_GENERATION + +def get_power_status(conn, options): + if options["--hmc-version"] == "3": + conn.send("lssyscfg -r lpar -m " + options["--managed"] + " -n " + options["--plug"] + " -F name,state\n") + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + + try: + status = re.compile("^" + options["--plug"] + ",(.*?),.*$", + re.IGNORECASE | re.MULTILINE).search(conn.before).group(1) + except AttributeError: + fail(EC_STATUS_HMC) + elif options["--hmc-version"] == "4": + conn.send("lssyscfg -r lpar -m "+ options["--managed"] + + " --filter 'lpar_names=" + options["--plug"] + "'\n") + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + + try: + status = re.compile(",state=(.*?),", re.IGNORECASE).search(conn.before).group(1) + except AttributeError: + fail(EC_STATUS_HMC) + + ## + ## Transformation to standard ON/OFF status if possible + if status in ["Running", "Open Firmware", "Shutting Down", "Starting"]: + status = "on" + else: + status = "off" + + return status + +def set_power_status(conn, options): + if options["--hmc-version"] == "3": + conn.send("chsysstate -o " + options["--action"] + " -r lpar -m " + options["--managed"] + + " -n " + options["--plug"] + "\n") + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + elif options["--hmc-version"] == "4": + if options["--action"] == "on": + conn.send("chsysstate -o on -r lpar -m " + options["--managed"] + + " -n " + options["--plug"] + + " -f `lssyscfg -r lpar -F curr_profile " + + " -m " + options["--managed"] + + " --filter \"lpar_names=" + options["--plug"] + "\"`\n") + else: + conn.send("chsysstate -o shutdown -r lpar --immed" + + " -m " + options["--managed"] + " -n " + options["--plug"] + "\n") + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + +def get_lpar_list(conn, options): + outlets = {} + if options["--hmc-version"] == "3": + conn.send("query_partition_names -m " + options["--managed"] + "\n") + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + + ## We have to remove first 3 lines (command + header) and last line (part of new prompt) + #### + res = re.search("^.+?\n(.+?\n){2}(.*)\n.*$", conn.before, re.S) + + if res == None: + fail_usage("Unable to parse output of list command") + + lines = res.group(2).split("\n") + for outlet_line in lines: + outlets[outlet_line.rstrip()] = ("", "") + elif options["--hmc-version"] == "4": + conn.send("lssyscfg -r lpar -m " + options["--managed"] + + " -F name:state\n") + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + + ## We have to remove first line (command) and last line (part of new prompt) + #### + res = re.search("^.+?\n(.*)\n.*$", conn.before, re.S) + + if res == None: + fail_usage("Unable to parse output of list command") + + lines = res.group(1).split("\n") + for outlet_line in lines: + (port, status) = outlet_line.split(":") + outlets[port] = ("", status) + + return outlets + +def define_new_opts(): + all_opt["managed"] = { + "getopt" : "s:", + "longopt" : "managed", + "help" : "-s, --managed=[id] Name of the managed system", + "required" : "0", + "shortdesc" : "Managed system name", + "order" : 1} + all_opt["hmc_version"] = { + "getopt" : "H:", + "longopt" : "hmc-version", + "help" : "-H, --hmc-version=[version] Force HMC version to use: (3|4) (default: 4)", + "required" : "0", + "shortdesc" : "Force HMC version to use", + "default" : "4", + "choices" : ["3", "4"], + "order" : 1} + +def main(): + device_opt = ["ipaddr", "login", "passwd", "secure", "cmd_prompt", \ + "port", "managed", "hmc_version"] + + atexit.register(atexit_handler) + + define_new_opts() + + all_opt["login_timeout"]["default"] = "15" + all_opt["secure"]["default"] = "1" + all_opt["cmd_prompt"]["default"] = [r":~>", r"]\$", r"\$ "] + + options = check_input(device_opt, process_input(device_opt), other_conditions = True) + + docs = {} + docs["shortdesc"] = "Fence agent for IBM LPAR" + docs["longdesc"] = "" + docs["vendorurl"] = "http://www.ibm.com" + show_docs(options, docs) + + if not options.has_key("--managed"): + fail_usage("Failed: You have to enter name of managed system") + + if options["--action"] == "validate-all": + sys.exit(0) + + ## + ## Operate the fencing device + #### + conn = fence_login(options) + result = fence_action(conn, options, set_power_status, get_power_status, get_lpar_list) + fence_logout(conn, "quit\r\n") + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/autodetect/fencing.py b/agents/autodetect/fencing.py new file mode 100644 index 0000000..ea21ace --- /dev/null +++ b/agents/autodetect/fencing.py @@ -0,0 +1,1393 @@ +#!/usr/bin/python -tt + +import sys, getopt, time, os, uuid, pycurl, stat +import pexpect, re, syslog +import logging +import subprocess +import threading +import shlex +import exceptions +import socket +import textwrap +import __main__ + +## do not add code here. +#BEGIN_VERSION_GENERATION +RELEASE_VERSION="4.0.21.23-eaa13" +BUILD_DATE="(built Wed Nov 4 13:28:43 CET 2015)" +REDHAT_COPYRIGHT="Copyright (C) Red Hat, Inc. 2004-2010 All rights reserved." +#END_VERSION_GENERATION + +__all__ = ['atexit_handler', 'check_input', 'process_input', 'all_opt', 'show_docs', + 'fence_login', 'fence_action', 'fence_logout'] + +EC_OK = 0 +EC_GENERIC_ERROR = 1 +EC_BAD_ARGS = 2 +EC_LOGIN_DENIED = 3 +EC_CONNECTION_LOST = 4 +EC_TIMED_OUT = 5 +EC_WAITING_ON = 6 +EC_WAITING_OFF = 7 +EC_STATUS = 8 +EC_STATUS_HMC = 9 +EC_PASSWORD_MISSING = 10 +EC_INVALID_PRIVILEGES = 11 + +all_opt = { + "help" : { + "getopt" : "h", + "longopt" : "help", + "help" : "-h, --help Display this help and exit", + "required" : "0", + "shortdesc" : "Display help and exit", + "order" : 54}, + "version" : { + "getopt" : "V", + "longopt" : "version", + "help" : "-V, --version Display version information and exit", + "required" : "0", + "shortdesc" : "Display version information and exit", + "order" : 53}, + "verbose" : { + "getopt" : "v", + "longopt" : "verbose", + "help" : "-v, --verbose Verbose mode", + "required" : "0", + "order" : 51}, + "debug" : { + "getopt" : "D:", + "longopt" : "debug-file", + "help" : "-D, --debug-file=[debugfile] Debugging to output file", + "required" : "0", + "shortdesc" : "Write debug information to given file", + "order" : 52}, + "delay" : { + "getopt" : ":", + "longopt" : "delay", + "help" : "--delay=[seconds] Wait X seconds before fencing is started", + "required" : "0", + "default" : "0", + "order" : 200}, + "agent" : { + "getopt" : "", + "help" : "", + "order" : 1}, + "web" : { + "getopt" : "", + "help" : "", + "order" : 1}, + "force_on" : { + "getopt" : "", + "help" : "", + "order" : 1}, + "action" : { + "getopt" : "o:", + "longopt" : "action", + "help" : "-o, --action=[action] Action: status, reboot (default), off or on", + "required" : "1", + "shortdesc" : "Fencing action", + "default" : "reboot", + "order" : 1}, + "fabric_fencing" : { + "getopt" : "", + "help" : "", + "order" : 1}, + "ipaddr" : { + "getopt" : "a:", + "longopt" : "ip", + "help" : "-a, --ip=[ip] IP address or hostname of fencing device", + "required" : "1", + "order" : 1}, + "ipport" : { + "getopt" : "u:", + "longopt" : "ipport", + "help" : "-u, --ipport=[port] TCP/UDP port to use for connection", + "required" : "0", + "shortdesc" : "TCP/UDP port to use for connection with device", + "order" : 1}, + "login" : { + "getopt" : "l:", + "longopt" : "username", + "help" : "-l, --username=[name] Login name", + "required" : "?", + "order" : 1}, + "no_login" : { + "getopt" : "", + "help" : "", + "order" : 1}, + "no_password" : { + "getopt" : "", + "help" : "", + "order" : 1}, + "no_port" : { + "getopt" : "", + "help" : "", + "order" : 1}, + "no_status" : { + "getopt" : "", + "help" : "", + "order" : 1}, + "no_on" : { + "getopt" : "", + "help" : "", + "order" : 1}, + "no_off" : { + "getopt" : "", + "help" : "", + "order" : 1}, + "telnet" : { + "getopt" : "", + "help" : "", + "order" : ""}, + "passwd" : { + "getopt" : "p:", + "longopt" : "password", + "help" : "-p, --password=[password] Login password or passphrase", + "required" : "0", + "order" : 1}, + "passwd_script" : { + "getopt" : "S:", + "longopt" : "password-script", + "help" : "-S, --password-script=[script] Script to run to retrieve password", + "required" : "0", + "order" : 1}, + "identity_file" : { + "getopt" : "k:", + "longopt" : "identity-file", + "help" : "-k, --identity-file=[filename] Identity file (private key) for SSH", + "required" : "0", + "order" : 1}, + "cmd_prompt" : { + "getopt" : "c:", + "longopt" : "command-prompt", + "help" : "-c, --command-prompt=[prompt] Force Python regex for command prompt", + "required" : "0", + "order" : 1}, + "secure" : { + "getopt" : "x", + "longopt" : "ssh", + "help" : "-x, --ssh Use SSH connection", + "required" : "0", + "order" : 1}, + "ssh_options" : { + "getopt" : ":", + "longopt" : "ssh-options", + "help" : "--ssh-options=[options] SSH options to use", + "required" : "0", + "order" : 1}, + "ssl" : { + "getopt" : "z", + "longopt" : "ssl", + "help" : "-z, --ssl Use SSL connection with verifying certificate", + "required" : "0", + "order" : 1}, + "ssl_insecure" : { + "getopt" : "", + "longopt" : "ssl-insecure", + "help" : "--ssl-insecure Use SSL connection without verifying certificate", + "required" : "0", + "order" : 1}, + "ssl_secure" : { + "getopt" : "", + "longopt" : "ssl-secure", + "help" : "--ssl-secure Use SSL connection with verifying certificate", + "required" : "0", + "order" : 1}, + "notls" : { + "getopt" : "t", + "longopt" : "notls", + "help" : "-t, --notls " + "Disable TLS negotiation and force SSL3.0. " + "This should only be used for devices that do not support TLS1.0 and up.", + "required" : "0", + "order" : 1}, + "tls1.0" : { + "getopt" : "", + "longopt" : "tls1.0", + "help" : "--tls1.0 " + "Disable TLS negotiation and force TLS1.0. " + "This should only be used for devices that do not support TLS1.1 and up.", + "required" : "0", + "order" : 1}, + "port" : { + "getopt" : "n:", + "longopt" : "plug", + "help" : "-n, --plug=[id] " + "Physical plug number on device, UUID or identification of machine", + "required" : "1", + "order" : 1}, + "switch" : { + "getopt" : "s:", + "longopt" : "switch", + "help" : "-s, --switch=[id] Physical switch number on device", + "required" : "0", + "order" : 1}, + "exec" : { + "getopt" : "e:", + "longopt" : "exec", + "help" : "-e, --exec=[command] Command to execute", + "required" : "0", + "order" : 1}, + "vmware_type" : { + "getopt" : "d:", + "longopt" : "vmware_type", + "help" : "-d, --vmware_type=[type] Type of VMware to connect", + "required" : "0", + "order" : 1}, + "vmware_datacenter" : { + "getopt" : "s:", + "longopt" : "vmware-datacenter", + "help" : "-s, --vmware-datacenter=[dc] VMWare datacenter filter", + "required" : "0", + "order" : 2}, + "snmp_version" : { + "getopt" : "d:", + "longopt" : "snmp-version", + "help" : "-d, --snmp-version=[version] Specifies SNMP version to use (1|2c|3)", + "required" : "0", + "shortdesc" : "Specifies SNMP version to use", + "choices" : ["1", "2c", "3"], + "order" : 1}, + "community" : { + "getopt" : "c:", + "longopt" : "community", + "help" : "-c, --community=[community] Set the community string", + "required" : "0", + "order" : 1}, + "snmp_auth_prot" : { + "getopt" : "b:", + "longopt" : "snmp-auth-prot", + "help" : "-b, --snmp-auth-prot=[prot] Set authentication protocol (MD5|SHA)", + "required" : "0", + "shortdesc" : "Set authentication protocol", + "choices" : ["MD5", "SHA"], + "order" : 1}, + "snmp_sec_level" : { + "getopt" : "E:", + "longopt" : "snmp-sec-level", + "help" : "-E, --snmp-sec-level=[level] " + "Set security level (noAuthNoPriv|authNoPriv|authPriv)", + "required" : "0", + "shortdesc" : "Set security level", + "choices" : ["noAuthNoPriv", "authNoPriv", "authPriv"], + "order" : 1}, + "snmp_priv_prot" : { + "getopt" : "B:", + "longopt" : "snmp-priv-prot", + "help" : "-B, --snmp-priv-prot=[prot] Set privacy protocol (DES|AES)", + "required" : "0", + "shortdesc" : "Set privacy protocol", + "choices" : ["DES", "AES"], + "order" : 1}, + "snmp_priv_passwd" : { + "getopt" : "P:", + "longopt" : "snmp-priv-passwd", + "help" : "-P, --snmp-priv-passwd=[pass] Set privacy protocol password", + "required" : "0", + "order" : 1}, + "snmp_priv_passwd_script" : { + "getopt" : "R:", + "longopt" : "snmp-priv-passwd-script", + "help" : "-R, --snmp-priv-passwd-script Script to run to retrieve privacy password", + "required" : "0", + "order" : 1}, + "inet4_only" : { + "getopt" : "4", + "longopt" : "inet4-only", + "help" : "-4, --inet4-only Forces agent to use IPv4 addresses only", + "required" : "0", + "order" : 1}, + "inet6_only" : { + "getopt" : "6", + "longopt" : "inet6-only", + "help" : "-6, --inet6-only Forces agent to use IPv6 addresses only", + "required" : "0", + "order" : 1}, + "separator" : { + "getopt" : "C:", + "longopt" : "separator", + "help" : "-C, --separator=[char] Separator for CSV created by 'list' operation", + "default" : ",", + "required" : "0", + "order" : 100}, + "login_timeout" : { + "getopt" : ":", + "longopt" : "login-timeout", + "help" : "--login-timeout=[seconds] Wait X seconds for cmd prompt after login", + "default" : "5", + "required" : "0", + "order" : 200}, + "shell_timeout" : { + "getopt" : ":", + "longopt" : "shell-timeout", + "help" : "--shell-timeout=[seconds] Wait X seconds for cmd prompt after issuing command", + "default" : "3", + "required" : "0", + "order" : 200}, + "power_timeout" : { + "getopt" : ":", + "longopt" : "power-timeout", + "help" : "--power-timeout=[seconds] Test X seconds for status change after ON/OFF", + "default" : "20", + "required" : "0", + "order" : 200}, + "power_wait" : { + "getopt" : ":", + "longopt" : "power-wait", + "help" : "--power-wait=[seconds] Wait X seconds after issuing ON/OFF", + "default" : "0", + "required" : "0", + "order" : 200}, + "missing_as_off" : { + "getopt" : "", + "longopt" : "missing-as-off", + "help" : "--missing-as-off Missing port returns OFF instead of failure", + "required" : "0", + "order" : 200}, + "retry_on" : { + "getopt" : ":", + "longopt" : "retry-on", + "help" : "--retry-on=[attempts] Count of attempts to retry power on", + "default" : "1", + "required" : "0", + "order" : 201}, + "session_url" : { + "getopt" : "s:", + "longopt" : "session-url", + "help" : "-s, --session-url URL to connect to XenServer on", + "required" : "1", + "order" : 1}, + "sudo" : { + "getopt" : "", + "longopt" : "use-sudo", + "help" : "--use-sudo Use sudo (without password) when calling 3rd party software", + "required" : "0", + "order" : 205}, + "method" : { + "getopt" : "m:", + "longopt" : "method", + "help" : "-m, --method=[method] Method to fence (onoff|cycle) (Default: onoff)", + "required" : "0", + "shortdesc" : "Method to fence", + "default" : "onoff", + "choices" : ["onoff", "cycle"], + "order" : 1}, + "telnet_path" : { + "getopt" : ":", + "longopt" : "telnet-path", + "help" : "--telnet-path=[path] Path to telnet binary", + "required" : "0", + "default" : "/usr/bin/telnet", + "order": 300}, + "ssh_path" : { + "getopt" : ":", + "longopt" : "ssh-path", + "help" : "--ssh-path=[path] Path to ssh binary", + "required" : "0", + "default" : "/usr/bin/ssh", + "order": 300}, + "gnutlscli_path" : { + "getopt" : ":", + "longopt" : "gnutlscli-path", + "help" : "--gnutlscli-path=[path] Path to gnutls-cli binary", + "required" : "0", + "default" : "/usr/bin/gnutls-cli", + "order": 300}, + "sudo_path" : { + "getopt" : ":", + "longopt" : "sudo-path", + "help" : "--sudo-path=[path] Path to sudo binary", + "required" : "0", + "default" : "/usr/bin/sudo", + "order": 300}, + "snmpwalk_path" : { + "getopt" : ":", + "longopt" : "snmpwalk-path", + "help" : "--snmpwalk-path=[path] Path to snmpwalk binary", + "required" : "0", + "default" : "/usr/bin/snmpwalk", + "order" : 300}, + "snmpset_path" : { + "getopt" : ":", + "longopt" : "snmpset-path", + "help" : "--snmpset-path=[path] Path to snmpset binary", + "required" : "0", + "default" : "/usr/bin/snmpset", + "order" : 300}, + "snmpget_path" : { + "getopt" : ":", + "longopt" : "snmpget-path", + "help" : "--snmpget-path=[path] Path to snmpget binary", + "required" : "0", + "default" : "/usr/bin/snmpget", + "order" : 300}, + "snmp": { + "getopt" : "", + "help" : "", + "order" : 1}, + "port_as_ip": { + "getopt" : "", + "longopt" : "port-as-ip", + "help" : "--port-as-ip Make \"port/plug\" to be an alias to IP address", + "required" : "0", + "order" : 200}, + "on_target": { + "getopt" : "", + "help" : "", + "order" : 1}, + "quiet": { + "getopt" : "q", + "longopt": "quiet", + "help" : "-q, --quiet Disable logging to stderr. Does not affect --verbose or --debug-file or logging to syslog.", + "required" : "0", + "order" : 50} +} + +# options which are added automatically if 'key' is encountered ("default" is always added) +DEPENDENCY_OPT = { + "default" : ["help", "debug", "verbose", "version", "action", "agent", \ + "power_timeout", "shell_timeout", "login_timeout", "power_wait", "retry_on", \ + "delay", "quiet"], + "passwd" : ["passwd_script"], + "sudo" : ["sudo_path"], + "secure" : ["identity_file", "ssh_options", "ssh_path"], + "telnet" : ["telnet_path"], + "ipaddr" : ["ipport", "inet4_only", "inet6_only"], + "port" : ["separator"], + "ssl" : ["ssl_secure", "ssl_insecure", "gnutlscli_path"], + "snmp" : ["snmp_auth_prot", "snmp_sec_level", "snmp_priv_prot", \ + "snmp_priv_passwd", "snmp_priv_passwd_script", "community", \ + "snmpset_path", "snmpget_path", "snmpwalk_path"] + } + +class fspawn(pexpect.spawn): + def __init__(self, options, command): + logging.info("Running command: %s", command) + pexpect.spawn.__init__(self, command) + self.opt = options + + def log_expect(self, pattern, timeout): + result = self.expect(pattern, timeout) + logging.debug("Received: %s", str(self.before) + str(self.after)) + return result + + def send(self, message): + logging.debug("Sent: %s", message) + return pexpect.spawn.send(self, message) + + # send EOL according to what was detected in login process (telnet) + def send_eol(self, message): + return self.send(message + self.opt["eol"]) + +def atexit_handler(): + try: + sys.stdout.close() + os.close(1) + except IOError: + logging.error("%s failed to close standard output\n", sys.argv[0]) + sys.exit(EC_GENERIC_ERROR) + +def _add_dependency_options(options): + ## Add also options which are available for every fence agent + added_opt = [] + for opt in options + ["default"]: + if DEPENDENCY_OPT.has_key(opt): + added_opt.extend([y for y in DEPENDENCY_OPT[opt] if options.count(y) == 0]) + + if not "port" in (options + added_opt) and \ + not "nodename" in (options + added_opt) and \ + "ipaddr" in (options + added_opt): + added_opt.append("port_as_ip") + all_opt["port"]["help"] = "-n, --plug=[ip] IP address or hostname of fencing device " \ + "(together with --port-as-ip)" + + return added_opt + +def fail_usage(message="", stop=True): + if len(message) > 0: + logging.error("%s\n", message) + if stop: + logging.error("Please use '-h' for usage\n") + sys.exit(EC_GENERIC_ERROR) + +def fail(error_code): + message = { + EC_LOGIN_DENIED : "Unable to connect/login to fencing device", + EC_CONNECTION_LOST : "Connection lost", + EC_TIMED_OUT : "Connection timed out", + EC_WAITING_ON : "Failed: Timed out waiting to power ON", + EC_WAITING_OFF : "Failed: Timed out waiting to power OFF", + EC_STATUS : "Failed: Unable to obtain correct plug status or plug is not available", + EC_STATUS_HMC : "Failed: Either unable to obtain correct plug status, " + "partition is not available or incorrect HMC version used", + EC_PASSWORD_MISSING : "Failed: You have to set login password", + EC_INVALID_PRIVILEGES : "Failed: The user does not have the correct privileges to do the requested action." + }[error_code] + "\n" + logging.error("%s\n", message) + sys.exit(EC_GENERIC_ERROR) + +def usage(avail_opt): + print "Usage:" + print "\t" + os.path.basename(sys.argv[0]) + " [options]" + print "Options:" + + sorted_list = [(key, all_opt[key]) for key in avail_opt] + sorted_list.sort(lambda x, y: cmp(x[1]["order"], y[1]["order"])) + + for key, value in sorted_list: + if len(value["help"]) != 0: + print " " + _join_wrap([value["help"]], first_indent=3) + +def metadata(avail_opt, docs): + # avail_opt has to be unique, if there are duplicities then they should be removed + sorted_list = [(key, all_opt[key]) for key in list(set(avail_opt))] + sorted_list.sort(lambda x, y: cmp(x[0], y[0])) + sorted_list.sort(lambda x, y: cmp(x[1]["order"], y[1]["order"])) + + print "" + print "" + for (symlink, desc) in docs.get("symlink", []): + print "" + print "" + docs["longdesc"] + "" + print "" + docs["vendorurl"] + "" + print "" + for option, _ in sorted_list: + if all_opt[option].has_key("help") and len(all_opt[option]["help"]) > 0: + print "\t" + + default = "" + if all_opt[option].has_key("default"): + default = "default=\"" + _encode_html_entities(str(all_opt[option]["default"])) + "\" " + + mixed = all_opt[option]["help"] + ## split it between option and help text + res = re.compile(r"^(.*?--\S+)\s+", re.IGNORECASE | re.S).search(mixed) + if None != res: + mixed = res.group(1) + mixed = _encode_html_entities(mixed) + + if not "shortdesc" in all_opt[option]: + shortdesc = re.sub("\s\s+", " ", all_opt[option]["help"][31:]) + else: + shortdesc = all_opt[option]["shortdesc"] + + print "\t\t" + if all_opt[option].has_key("choices"): + print "\t\t" + for choice in all_opt[option]["choices"]: + print "\t\t\t" + elif all_opt[option]["getopt"].count(":") > 0: + print "\t\t" + else: + print "\t\t" + print "\t\t" + shortdesc + "" + print "\t" + print "" + print "" + + (available_actions, _) = _get_available_actions(avail_opt) + + if "on" in available_actions: + available_actions.remove("on") + on_target = ' on_target="1"' if avail_opt.count("on_target") else '' + print "\t" % (on_target, avail_opt.count("fabric_fencing")) + + for action in available_actions: + print "\t" % (action) + print "" + print "" + +def process_input(avail_opt): + avail_opt.extend(_add_dependency_options(avail_opt)) + + # @todo: this should be put elsewhere? + os.putenv("LANG", "C") + os.putenv("LC_ALL", "C") + + if "port_as_ip" in avail_opt: + avail_opt.append("port") + + if len(sys.argv) > 1: + opt = _parse_input_cmdline(avail_opt) + else: + opt = _parse_input_stdin(avail_opt) + + if "--port-as-ip" in opt and "--plug" in opt: + opt["--ip"] = opt["--plug"] + + return opt + +## +## This function checks input and answers if we want to have same answers +## in each of the fencing agents. It looks for possible errors and run +## password script to set a correct password +###### +def check_input(device_opt, opt, other_conditions = False): + device_opt.extend(_add_dependency_options(device_opt)) + + options = dict(opt) + options["device_opt"] = device_opt + + _update_metadata(options) + options = _set_default_values(options) + options["--action"] = options["--action"].lower() + + ## In special cases (show help, metadata or version) we don't need to check anything + ##### + # OCF compatibility + if options["--action"] == "meta-data": + options["--action"] = "metadata" + + if options["--action"] == "metadata" or any(options.has_key(k) for k in ("--help", "--version")): + return options + + if options.has_key("--verbose"): + logging.getLogger().setLevel(logging.DEBUG) + + ## add logging to syslog + logging.getLogger().addHandler(SyslogLibHandler()) + if not options.has_key("--quiet"): + ## add logging to stderr + logging.getLogger().addHandler(logging.StreamHandler(sys.stderr)) + + (acceptable_actions, _) = _get_available_actions(device_opt) + + if 1 == device_opt.count("fabric_fencing"): + acceptable_actions.extend(["enable", "disable"]) + + if 0 == acceptable_actions.count(options["--action"]): + fail_usage("Failed: Unrecognised action '" + options["--action"] + "'") + + ## Compatibility layer + ##### + if options["--action"] == "enable": + options["--action"] = "on" + if options["--action"] == "disable": + options["--action"] = "off" + + + if options["--action"] == "validate-all" and not other_conditions: + _validate_input(options, False) + sys.exit(EC_OK) + else: + _validate_input(options, True) + + if options.has_key("--debug-file"): + try: + debug_file = logging.FileHandler(options["--debug-file"]) + debug_file.setLevel(logging.DEBUG) + logging.getLogger().addHandler(debug_file) + except IOError: + logging.error("Unable to create file %s", options["--debug-file"]) + fail_usage("Failed: Unable to create file " + options["--debug-file"]) + + if options.has_key("--snmp-priv-passwd-script"): + options["--snmp-priv-passwd"] = os.popen(options["--snmp-priv-passwd-script"]).read().rstrip() + + if options.has_key("--password-script"): + options["--password"] = os.popen(options["--password-script"]).read().rstrip() + + return options + +## Obtain a power status from possibly more than one plug +## "on" is returned if at least one plug is ON +###### +def get_multi_power_fn(connection, options, get_power_fn): + status = "off" + plugs = options["--plugs"] if options.has_key("--plugs") else [""] + + for plug in plugs: + try: + options["--uuid"] = str(uuid.UUID(plug)) + except ValueError: + pass + except KeyError: + pass + + options["--plug"] = plug + plug_status = get_power_fn(connection, options) + if plug_status != "off": + status = plug_status + + return status + +def set_multi_power_fn(connection, options, set_power_fn, get_power_fn, retry_attempts=1): + plugs = options["--plugs"] if options.has_key("--plugs") else [""] + + for _ in range(retry_attempts): + for plug in plugs: + try: + options["--uuid"] = str(uuid.UUID(plug)) + except ValueError: + pass + except KeyError: + pass + + options["--plug"] = plug + set_power_fn(connection, options) + time.sleep(int(options["--power-wait"])) + + for _ in xrange(int(options["--power-timeout"])): + if get_multi_power_fn(connection, options, get_power_fn) != options["--action"]: + time.sleep(1) + else: + return True + return False + +def show_docs(options, docs=None): + device_opt = options["device_opt"] + + if docs == None: + docs = {} + docs["shortdesc"] = "Fence agent" + docs["longdesc"] = "" + + if options.has_key("--help"): + usage(device_opt) + sys.exit(0) + + if options.get("--action", "") == "metadata": + if "port_as_ip" in device_opt: + device_opt.remove("separator") + metadata(device_opt, docs) + sys.exit(0) + + if options.has_key("--version"): + print __main__.RELEASE_VERSION, __main__.BUILD_DATE + print __main__.REDHAT_COPYRIGHT + sys.exit(0) + +def fence_action(connection, options, set_power_fn, get_power_fn, get_outlet_list=None, reboot_cycle_fn=None): + result = 0 + + try: + if options.has_key("--plug"): + options["--plugs"] = options["--plug"].split(",") + + ## Process options that manipulate fencing device + ##### + if (options["--action"] in ["list", "list-status"]) or \ + ((options["--action"] == "monitor") and 1 == options["device_opt"].count("port") and \ + 0 == options["device_opt"].count("port_as_ip")): + + if 0 == options["device_opt"].count("port"): + print "N/A" + elif get_outlet_list == None: + ## @todo: exception? + ## This is just temporal solution, we will remove default value + ## None as soon as all existing agent will support this operation + print "NOTICE: List option is not working on this device yet" + else: + options["--original-action"] = options["--action"] + options["--action"] = "list" + outlets = get_outlet_list(connection, options) + options["--action"] = options["--original-action"] + del options["--original-action"] + + ## keys can be numbers (port numbers) or strings (names of VM, UUID) + for outlet_id in outlets.keys(): + (alias, status) = outlets[outlet_id] + if status is None or (not status.upper() in ["ON", "OFF"]): + status = "UNKNOWN" + status = status.upper() + + if options["--action"] == "list": + print outlet_id + options["--separator"] + alias + elif options["--action"] == "list-status": + print outlet_id + options["--separator"] + alias + options["--separator"] + status + + return + + if options["--action"] == "monitor" and not "port" in options["device_opt"] and "no_status" in options["device_opt"]: + # Unable to do standard monitoring because 'status' action is not available + return 0 + + status = None + if not "no_status" in options["device_opt"]: + status = get_multi_power_fn(connection, options, get_power_fn) + if status != "on" and status != "off": + fail(EC_STATUS) + + if options["--action"] == status: + if not (status == "on" and "force_on" in options["device_opt"]): + print "Success: Already %s" % (status.upper()) + return 0 + + if options["--action"] == "on": + if set_multi_power_fn(connection, options, set_power_fn, get_power_fn, 1 + int(options["--retry-on"])): + print "Success: Powered ON" + else: + fail(EC_WAITING_ON) + elif options["--action"] == "off": + if set_multi_power_fn(connection, options, set_power_fn, get_power_fn): + print "Success: Powered OFF" + else: + fail(EC_WAITING_OFF) + elif options["--action"] == "reboot": + power_on = False + if options.get("--method", "").lower() == "cycle" and reboot_cycle_fn is not None: + for _ in range(1, 1 + int(options["--retry-on"])): + if reboot_cycle_fn(connection, options): + power_on = True + break + + if not power_on: + fail(EC_TIMED_OUT) + + else: + if status != "off": + options["--action"] = "off" + if not set_multi_power_fn(connection, options, set_power_fn, get_power_fn): + fail(EC_WAITING_OFF) + + options["--action"] = "on" + + try: + power_on = set_multi_power_fn(connection, options, set_power_fn, get_power_fn, int(options["--retry-on"])) + except Exception, ex: + # an error occured during power ON phase in reboot + # fence action was completed succesfully even in that case + logging.warning("%s", str(ex)) + + if power_on == False: + # this should not fail as node was fenced succesfully + logging.error('Timed out waiting to power ON\n') + + print "Success: Rebooted" + elif options["--action"] == "status": + print "Status: " + status.upper() + if status.upper() == "OFF": + result = 2 + elif options["--action"] == "monitor": + pass + except pexpect.EOF: + fail(EC_CONNECTION_LOST) + except pexpect.TIMEOUT: + fail(EC_TIMED_OUT) + except pycurl.error, ex: + logging.error("%s\n", str(ex)) + fail(EC_TIMED_OUT) + except socket.timeout, ex: + logging.error("%s\n", str(ex)) + fail(EC_TIMED_OUT) + + return result + +def fence_login(options, re_login_string=r"(login\s*: )|((?!Last )Login Name: )|(username: )|(User Name :)"): + run_delay(options) + + if not options.has_key("eol"): + options["eol"] = "\r\n" + + if options.has_key("--command-prompt") and type(options["--command-prompt"]) is not list: + options["--command-prompt"] = [options["--command-prompt"]] + + try: + if options.has_key("--ssl"): + conn = _open_ssl_connection(options) + elif options.has_key("--ssh") and not options.has_key("--identity-file"): + conn = _login_ssh_with_password(options, re_login_string) + elif options.has_key("--ssh") and options.has_key("--identity-file"): + conn = _login_ssh_with_identity_file(options) + else: + conn = _login_telnet(options, re_login_string) + except pexpect.EOF, exception: + logging.debug("%s", str(exception)) + fail(EC_LOGIN_DENIED) + except pexpect.TIMEOUT, exception: + logging.debug("%s", str(exception)) + fail(EC_LOGIN_DENIED) + return conn + +def is_executable(path): + if os.path.exists(path): + stats = os.stat(path) + if stat.S_ISREG(stats.st_mode) and os.access(path, os.X_OK): + return True + return False + +def run_command(options, command, timeout=None, env=None, log_command=None): + if timeout is None and "--power-timeout" in options: + timeout = options["--power-timeout"] + if timeout is not None: + timeout = float(timeout) + + logging.info("Executing: %s\n", log_command or command) + + try: + process = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env) + except OSError: + fail_usage("Unable to run %s\n" % command) + + thread = threading.Thread(target=process.wait) + thread.start() + thread.join(timeout) + if thread.is_alive(): + process.kill() + fail(EC_TIMED_OUT) + + status = process.wait() + + (pipe_stdout, pipe_stderr) = process.communicate() + process.stdout.close() + process.stderr.close() + + logging.debug("%s %s %s\n", str(status), str(pipe_stdout), str(pipe_stderr)) + + return (status, pipe_stdout, pipe_stderr) + +def run_delay(options): + ## Delay is important for two-node clusters fencing but we do not need to delay 'status' operations + if options["--action"] in ["off", "reboot"]: + logging.info("Delay %s second(s) before logging in to the fence device", options["--delay"]) + time.sleep(int(options["--delay"])) + +def fence_logout(conn, logout_string, sleep=0): + # Logout is not required part of fencing but we should attempt to do it properly + # In some cases our 'exit' command is faster and we can not close connection as it + # was already closed by fencing device + try: + conn.send_eol(logout_string) + time.sleep(sleep) + conn.close() + except exceptions.OSError: + pass + except pexpect.ExceptionPexpect: + pass + +# Convert array of format [[key1, value1], [key2, value2], ... [keyN, valueN]] to dict, where key is +# in format a.b.c.d...z and returned dict has key only z +def array_to_dict(array): + return dict([[x[0].split(".")[-1], x[1]] for x in array]) + +## Own logger handler that uses old-style syslog handler as otherwise everything is sourced +## from /dev/syslog +class SyslogLibHandler(logging.StreamHandler): + """ + A handler class that correctly push messages into syslog + """ + def emit(self, record): + syslog_level = { + logging.CRITICAL:syslog.LOG_CRIT, + logging.ERROR:syslog.LOG_ERR, + logging.WARNING:syslog.LOG_WARNING, + logging.INFO:syslog.LOG_INFO, + logging.DEBUG:syslog.LOG_DEBUG, + logging.NOTSET:syslog.LOG_DEBUG, + }[record.levelno] + + msg = self.format(record) + + # syslos.syslog can not have 0x00 character inside or exception is thrown + syslog.syslog(syslog_level, msg.replace("\x00", "\n")) + return + +def _open_ssl_connection(options): + gnutls_opts = "" + ssl_opts = "" + + if options.has_key("--notls"): + gnutls_opts = "--priority \"NORMAL:-VERS-TLS1.2:-VERS-TLS1.1:-VERS-TLS1.0:+VERS-SSL3.0\"" + elif options.has_key("--tls1.0"): + gnutls_opts = "--priority \"NORMAL:-VERS-TLS1.2:-VERS-TLS1.1:+VERS-TLS1.0:%LATEST_RECORD_VERSION\"" + + # --ssl is same as the --ssl-secure; it means we want to verify certificate in these cases + if options.has_key("--ssl-insecure"): + ssl_opts = "--insecure" + + command = '%s %s %s --crlf -p %s %s' % \ + (options["--gnutlscli-path"], gnutls_opts, ssl_opts, options["--ipport"], options["--ip"]) + try: + conn = fspawn(options, command) + except pexpect.ExceptionPexpect, ex: + logging.error("%s\n", str(ex)) + sys.exit(EC_GENERIC_ERROR) + + return conn + +def _login_ssh_with_identity_file(options): + if options.has_key("--inet6-only"): + force_ipvx = "-6 " + elif options.has_key("--inet4-only"): + force_ipvx = "-4 " + else: + force_ipvx = "" + + command = '%s %s %s@%s -i %s -p %s' % \ + (options["--ssh-path"], force_ipvx, options["--username"], options["--ip"], \ + options["--identity-file"], options["--ipport"]) + if options.has_key("--ssh-options"): + command += ' ' + options["--ssh-options"] + + conn = fspawn(options, command) + + result = conn.log_expect(["Enter passphrase for key '" + options["--identity-file"] + "':", \ + "Are you sure you want to continue connecting (yes/no)?"] + \ + options["--command-prompt"], int(options["--login-timeout"])) + if result == 1: + conn.sendline("yes") + result = conn.log_expect( + ["Enter passphrase for key '" + options["--identity-file"]+"':"] + \ + options["--command-prompt"], int(options["--login-timeout"])) + if result == 0: + if options.has_key("--password"): + conn.sendline(options["--password"]) + conn.log_expect(options["--command-prompt"], int(options["--login-timeout"])) + else: + fail_usage("Failed: You have to enter passphrase (-p) for identity file") + + return conn + +def _login_telnet(options, re_login_string): + re_login = re.compile(re_login_string, re.IGNORECASE) + re_pass = re.compile("(password)|(pass phrase)", re.IGNORECASE) + + conn = fspawn(options, options["--telnet-path"]) + conn.send("set binary\n") + conn.send("open %s -%s\n"%(options["--ip"], options["--ipport"])) + + conn.log_expect(re_login, int(options["--login-timeout"])) + conn.send_eol(options["--username"]) + + ## automatically change end of line separator + screen = conn.read_nonblocking(size=100, timeout=int(options["--shell-timeout"])) + if re_login.search(screen) != None: + options["eol"] = "\n" + conn.send_eol(options["--username"]) + conn.log_expect(re_pass, int(options["--login-timeout"])) + elif re_pass.search(screen) == None: + conn.log_expect(re_pass, int(options["--shell-timeout"])) + + try: + conn.send_eol(options["--password"]) + valid_password = conn.log_expect([re_login] + \ + options["--command-prompt"], int(options["--shell-timeout"])) + if valid_password == 0: + ## password is invalid or we have to change EOL separator + options["eol"] = "\r" + conn.send_eol("") + screen = conn.read_nonblocking(size=100, timeout=int(options["--shell-timeout"])) + ## after sending EOL the fence device can either show 'Login' or 'Password' + if re_login.search(conn.after + screen) != None: + conn.send_eol("") + conn.send_eol(options["--username"]) + conn.log_expect(re_pass, int(options["--login-timeout"])) + conn.send_eol(options["--password"]) + conn.log_expect(options["--command-prompt"], int(options["--login-timeout"])) + except KeyError: + fail(EC_PASSWORD_MISSING) + + return conn + +def _login_ssh_with_password(options, re_login_string): + re_login = re.compile(re_login_string, re.IGNORECASE) + re_pass = re.compile("(password)|(pass phrase)", re.IGNORECASE) + + if options.has_key("--inet6-only"): + force_ipvx = "-6 " + elif options.has_key("--inet4-only"): + force_ipvx = "-4 " + else: + force_ipvx = "" + + command = '%s %s %s@%s -p %s -o PubkeyAuthentication=no' % \ + (options["--ssh-path"], force_ipvx, options["--username"], options["--ip"], options["--ipport"]) + if options.has_key("--ssh-options"): + command += ' ' + options["--ssh-options"] + + conn = fspawn(options, command) + + if options.has_key("telnet_over_ssh"): + # This is for stupid ssh servers (like ALOM) which behave more like telnet + # (ignore name and display login prompt) + result = conn.log_expect( \ + [re_login, "Are you sure you want to continue connecting (yes/no)?"], + int(options["--login-timeout"])) + if result == 1: + conn.sendline("yes") # Host identity confirm + conn.log_expect(re_login, int(options["--login-timeout"])) + + conn.sendline(options["--username"]) + conn.log_expect(re_pass, int(options["--login-timeout"])) + else: + result = conn.log_expect( \ + ["ssword:", "Are you sure you want to continue connecting (yes/no)?"], + int(options["--login-timeout"])) + if result == 1: + conn.sendline("yes") + conn.log_expect("ssword:", int(options["--login-timeout"])) + + conn.sendline(options["--password"]) + conn.log_expect(options["--command-prompt"], int(options["--login-timeout"])) + + return conn + +# +# To update metadata, we change values in all_opt +def _update_metadata(options): + device_opt = options["device_opt"] + + if device_opt.count("login") and device_opt.count("no_login") == 0: + all_opt["login"]["required"] = "1" + else: + all_opt["login"]["required"] = "0" + + if device_opt.count("port_as_ip"): + all_opt["ipaddr"]["required"] = "0" + all_opt["port"]["required"] = "0" + + (available_actions, default_value) = _get_available_actions(device_opt) + all_opt["action"]["default"] = default_value + + actions_with_default = \ + [x if not x == all_opt["action"]["default"] else x + " (default)" for x in available_actions] + all_opt["action"]["help"] = \ + "-o, --action=[action] Action: %s" % (_join_wrap(actions_with_default, last_separator=" or ")) + + if device_opt.count("ipport"): + default_value = None + default_string = None + + if all_opt["ipport"].has_key("default"): + default_value = all_opt["ipport"]["default"] + elif device_opt.count("web") and device_opt.count("ssl"): + default_value = "80" + default_string = "(default 80, 443 if --ssl option is used)" + elif device_opt.count("telnet") and device_opt.count("secure"): + default_value = "23" + default_string = "(default 23, 22 if --ssh option is used)" + else: + tcp_ports = {"community" : "161", "secure" : "22", "telnet" : "23", "web" : "80", "ssl" : "443"} + # all cases where next command returns multiple results are covered by previous blocks + protocol = [x for x in ["community", "secure", "ssl", "web", "telnet"] if device_opt.count(x)][0] + default_value = tcp_ports[protocol] + + if default_string is None: + all_opt["ipport"]["help"] = "-u, --ipport=[port] TCP/UDP port to use (default %s)" % \ + (default_value) + else: + all_opt["ipport"]["help"] = "-u, --ipport=[port] TCP/UDP port to use\n" + " "*40 + default_string + +def _set_default_values(options): + if "ipport" in options["device_opt"]: + if not "--ipport" in options: + if "default" in all_opt["ipport"]: + options["--ipport"] = all_opt["ipport"]["default"] + elif "community" in options["device_opt"]: + options["--ipport"] = "161" + elif "--ssh" in options or all_opt["secure"].get("default", "0") == "1": + options["--ipport"] = "22" + elif "--ssl" in options or all_opt["ssl"].get("default", "0") == "1": + options["--ipport"] = "443" + elif "--ssl-secure" in options or all_opt["ssl_secure"].get("default", "0") == "1": + options["--ipport"] = "443" + elif "--ssl-insecure" in options or all_opt["ssl_insecure"].get("default", "0") == "1": + options["--ipport"] = "443" + elif "web" in options["device_opt"]: + options["--ipport"] = "80" + elif "telnet" in options["device_opt"]: + options["--ipport"] = "23" + + if "--ipport" in options: + all_opt["ipport"]["default"] = options["--ipport"] + + for opt in options["device_opt"]: + if all_opt[opt].has_key("default") and not opt == "ipport": + getopt_long = "--" + all_opt[opt]["longopt"] + if not options.has_key(getopt_long): + options[getopt_long] = all_opt[opt]["default"] + + return options + +# stop = True/False : exit fence agent when problem is encountered +def _validate_input(options, stop = True): + device_opt = options["device_opt"] + valid_input = True + + if not options.has_key("--username") and \ + device_opt.count("login") and (device_opt.count("no_login") == 0): + valid_input = False + fail_usage("Failed: You have to set login name", stop) + + if device_opt.count("ipaddr") and not options.has_key("--ip") and not options.has_key("--managed"): + valid_input = False + fail_usage("Failed: You have to enter fence address", stop) + + if device_opt.count("no_password") == 0: + if 0 == device_opt.count("identity_file"): + if not (options.has_key("--password") or options.has_key("--password-script")): + valid_input = False + fail_usage("Failed: You have to enter password or password script", stop) + else: + if not (options.has_key("--password") or \ + options.has_key("--password-script") or options.has_key("--identity-file")): + valid_input = False + fail_usage("Failed: You have to enter password, password script or identity file", stop) + + if not options.has_key("--ssh") and options.has_key("--identity-file"): + valid_input = False + fail_usage("Failed: You have to use identity file together with ssh connection (-x)", stop) + + if options.has_key("--identity-file") and not os.path.isfile(options["--identity-file"]): + valid_input = False + fail_usage("Failed: Identity file " + options["--identity-file"] + " does not exist", stop) + + if (0 == ["list", "list-status", "monitor"].count(options["--action"])) and \ + not options.has_key("--plug") and device_opt.count("port") and \ + device_opt.count("no_port") == 0 and not device_opt.count("port_as_ip"): + valid_input = False + fail_usage("Failed: You have to enter plug number or machine identification", stop) + + if options.has_key("--plug") and len(options["--plug"].split(",")) > 1 and \ + options.has_key("--method") and options["--method"] == "cycle": + valid_input = False + fail_usage("Failed: Cannot use --method cycle for more than 1 plug", stop) + + for failed_opt in _get_opts_with_invalid_choices(options): + valid_input = False + fail_usage("Failed: You have to enter a valid choice for %s from the valid values: %s" % \ + ("--" + all_opt[failed_opt]["longopt"], str(all_opt[failed_opt]["choices"])), stop) + + return valid_input + +def _encode_html_entities(text): + return text.replace("&", "&").replace('"', """).replace('<', "<"). \ + replace('>', ">").replace("'", "'") + +def _prepare_getopt_args(options): + getopt_string = "" + longopt_list = [] + for k in options: + if all_opt.has_key(k) and all_opt[k]["getopt"] != ":": + # getopt == ":" means that opt is without short getopt, but has value + getopt_string += all_opt[k]["getopt"] + elif not all_opt.has_key(k): + fail_usage("Parse error: unknown option '"+k+"'") + + if all_opt.has_key(k) and all_opt[k].has_key("longopt"): + if all_opt[k]["getopt"].endswith(":"): + longopt_list.append(all_opt[k]["longopt"] + "=") + else: + longopt_list.append(all_opt[k]["longopt"]) + + return (getopt_string, longopt_list) + +def _parse_input_stdin(avail_opt): + opt = {} + name = "" + for line in sys.stdin.readlines(): + line = line.strip() + if (line.startswith("#")) or (len(line) == 0): + continue + + (name, value) = (line + "=").split("=", 1) + value = value[:-1] + + if avail_opt.count(name) == 0 and name in ["nodename"]: + continue + elif avail_opt.count(name) == 0: + logging.warning("Parse error: Ignoring unknown option '%s'\n", line) + continue + + if all_opt[name]["getopt"].endswith(":"): + opt["--"+all_opt[name]["longopt"].rstrip(":")] = value + elif value.lower() in ["1", "yes", "on", "true"]: + opt["--"+all_opt[name]["longopt"]] = "1" + else: + logging.warning("Parse error: Ignoring option '%s' because it does not have value\n", name) + return opt + +def _parse_input_cmdline(avail_opt): + filtered_opts = {} + _verify_unique_getopt(avail_opt) + (getopt_string, longopt_list) = _prepare_getopt_args(avail_opt) + + try: + (entered_opt, left_arg) = getopt.gnu_getopt(sys.argv[1:], getopt_string, longopt_list) + if len(left_arg) > 0: + logging.warning("Unused arguments on command line: %s" % (str(left_arg))) + except getopt.GetoptError, error: + fail_usage("Parse error: " + error.msg) + + for opt in avail_opt: + filtered_opts.update({opt : all_opt[opt]}) + + # Short and long getopt names are changed to consistent "--" + long name (e.g. --username) + long_opts = {} + for arg_name in dict(entered_opt).keys(): + all_key = [key for (key, value) in filtered_opts.items() \ + if "--" + value.get("longopt", "") == arg_name or "-" + value.get("getopt", "").rstrip(":") == arg_name][0] + long_opts["--" + filtered_opts[all_key]["longopt"]] = dict(entered_opt)[arg_name] + + # This test is specific because it does not apply to input on stdin + if "port_as_ip" in avail_opt and not "--port-as-ip" in long_opts and "--plug" in long_opts: + fail_usage("Parser error: option -n/--plug is not recognized") + + return long_opts + +# for ["John", "Mary", "Eli"] returns "John, Mary and Eli" +def _join2(words, normal_separator=", ", last_separator=" and "): + if len(words) <= 1: + return "".join(words) + else: + return last_separator.join([normal_separator.join(words[:-1]), words[-1]]) + +def _join_wrap(words, normal_separator=", ", last_separator=" and ", first_indent=42): + x = _join2(words, normal_separator, last_separator) + wrapper = textwrap.TextWrapper() + wrapper.initial_indent = " "*first_indent + wrapper.subsequent_indent = " "*40 + wrapper.width = 85 + wrapper.break_on_hyphens = False + wrapper.break_long_words = False + wrapped_text = "" + for line in wrapper.wrap(x): + wrapped_text += line + "\n" + return wrapped_text.lstrip().rstrip("\n") + +def _get_opts_with_invalid_choices(options): + options_failed = [] + device_opt = options["device_opt"] + + for opt in device_opt: + if all_opt[opt].has_key("choices"): + longopt = "--" + all_opt[opt]["longopt"] + possible_values_upper = [y.upper() for y in all_opt[opt]["choices"]] + if options.has_key(longopt): + options[longopt] = options[longopt].upper() + if not options["--" + all_opt[opt]["longopt"]] in possible_values_upper: + options_failed.append(opt) + return options_failed + +def _verify_unique_getopt(avail_opt): + used_getopt = set() + + for opt in avail_opt: + getopt_value = all_opt[opt].get("getopt", "").rstrip(":") + if getopt_value and getopt_value in used_getopt: + fail_usage("Short getopt for %s (-%s) is not unique" % (opt, getopt_value)) + else: + used_getopt.add(getopt_value) + +def _get_available_actions(device_opt): + available_actions = ["on", "off", "reboot", "status", "list", "list-status", \ + "monitor", "metadata", "validate-all"] + default_value = "reboot" + + if device_opt.count("fabric_fencing"): + available_actions.remove("reboot") + default_value = "off" + if device_opt.count("no_status"): + available_actions.remove("status") + if device_opt.count("no_on"): + available_actions.remove("on") + if device_opt.count("no_off"): + available_actions.remove("off") + if not device_opt.count("separator"): + available_actions.remove("list") + available_actions.remove("list-status") + + return (available_actions, default_value) diff --git a/agents/aws/fence_aws.py b/agents/aws/fence_aws.py new file mode 100644 index 0000000..c947bf2 --- /dev/null +++ b/agents/aws/fence_aws.py @@ -0,0 +1,223 @@ +#!@PYTHON@ -tt + +import sys, re +import logging +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, fail_usage, run_delay, EC_STATUS, SyslogLibHandler + +import requests +from requests import HTTPError + +try: + import boto3 + from botocore.exceptions import ConnectionError, ClientError, EndpointConnectionError, NoRegionError +except ImportError: + pass + +logger = logging.getLogger("fence_aws") +logger.propagate = False +logger.setLevel(logging.INFO) +logger.addHandler(SyslogLibHandler()) +logging.getLogger('botocore.vendored').propagate = False + +def get_instance_id(): + try: + token = requests.put('http://169.254.169.254/latest/api/token', headers={"X-aws-ec2-metadata-token-ttl-seconds" : "21600"}).content.decode("UTF-8") + r = requests.get('http://169.254.169.254/latest/meta-data/instance-id', headers={"X-aws-ec2-metadata-token" : token}).content.decode("UTF-8") + return r + except HTTPError as http_err: + logger.error('HTTP error occurred while trying to access EC2 metadata server: %s', http_err) + except Exception as err: + logger.error('A fatal error occurred while trying to access EC2 metadata server: %s', err) + return None + + +def get_nodes_list(conn, options): + logger.info("Starting monitor operation") + result = {} + try: + if "--filter" in options: + filter_key = options["--filter"].split("=")[0].strip() + filter_value = options["--filter"].split("=")[1].strip() + filter = [{ "Name": filter_key, "Values": [filter_value] }] + for instance in conn.instances.filter(Filters=filter): + result[instance.id] = ("", None) + else: + for instance in conn.instances.all(): + result[instance.id] = ("", None) + except ClientError: + fail_usage("Failed: Incorrect Access Key or Secret Key.") + except EndpointConnectionError: + fail_usage("Failed: Incorrect Region.") + except ConnectionError as e: + fail_usage("Failed: Unable to connect to AWS: " + str(e)) + except Exception as e: + logger.error("Failed to get node list: %s", e) + logger.debug("Monitor operation OK: %s",result) + return result + +def get_power_status(conn, options): + logger.debug("Starting status operation") + try: + instance = conn.instances.filter(Filters=[{"Name": "instance-id", "Values": [options["--plug"]]}]) + state = list(instance)[0].state["Name"] + logger.info("Status operation for EC2 instance %s returned state: %s",options["--plug"],state.upper()) + if state == "running": + return "on" + elif state == "stopped": + return "off" + else: + return "unknown" + + except ClientError: + fail_usage("Failed: Incorrect Access Key or Secret Key.") + except EndpointConnectionError: + fail_usage("Failed: Incorrect Region.") + except IndexError: + fail(EC_STATUS) + except Exception as e: + logging.error("Failed to get power status: %s", e) + fail(EC_STATUS) + +def get_self_power_status(conn, instance_id): + try: + instance = conn.instances.filter(Filters=[{"Name": "instance-id", "Values": [instance_id]}]) + state = list(instance)[0].state["Name"] + if state == "running": + logging.debug("Captured my (%s) state and it %s - returning OK - Proceeding with fencing",instance_id,state.upper()) + return "ok" + else: + logging.debug("Captured my (%s) state it is %s - returning Alert - Unable to fence other nodes",instance_id,state.upper()) + return "alert" + + except ClientError: + fail_usage("Failed: Incorrect Access Key or Secret Key.") + except EndpointConnectionError: + fail_usage("Failed: Incorrect Region.") + except IndexError: + return "fail" + +def set_power_status(conn, options): + my_instance = get_instance_id() + try: + if (options["--action"]=="off"): + if (get_self_power_status(conn,my_instance) == "ok"): + conn.instances.filter(InstanceIds=[options["--plug"]]).stop(Force=True) + logger.info("Called StopInstance API call for %s", options["--plug"]) + else: + logger.info("Skipping fencing as instance is not in running status") + elif (options["--action"]=="on"): + conn.instances.filter(InstanceIds=[options["--plug"]]).start() + except Exception as e: + logger.error("Failed to power %s %s: %s", \ + options["--action"], options["--plug"], e) + +def define_new_opts(): + all_opt["region"] = { + "getopt" : "r:", + "longopt" : "region", + "help" : "-r, --region=[region] Region, e.g. us-east-1", + "shortdesc" : "Region.", + "required" : "0", + "order" : 2 + } + all_opt["access_key"] = { + "getopt" : "a:", + "longopt" : "access-key", + "help" : "-a, --access-key=[key] Access Key", + "shortdesc" : "Access Key.", + "required" : "0", + "order" : 3 + } + all_opt["secret_key"] = { + "getopt" : "s:", + "longopt" : "secret-key", + "help" : "-s, --secret-key=[key] Secret Key", + "shortdesc" : "Secret Key.", + "required" : "0", + "order" : 4 + } + all_opt["filter"] = { + "getopt" : ":", + "longopt" : "filter", + "help" : "--filter=[key=value] Filter (e.g. vpc-id=[vpc-XXYYZZAA]", + "shortdesc": "Filter for list-action", + "required": "0", + "order": 5 + } + all_opt["boto3_debug"] = { + "getopt" : "b:", + "longopt" : "boto3_debug", + "help" : "-b, --boto3_debug=[option] Boto3 and Botocore library debug logging", + "shortdesc": "Boto Lib debug", + "required": "0", + "default": "False", + "order": 6 + } + +# Main agent method +def main(): + conn = None + + device_opt = ["port", "no_password", "region", "access_key", "secret_key", "filter", "boto3_debug"] + + atexit.register(atexit_handler) + + define_new_opts() + + all_opt["power_timeout"]["default"] = "60" + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for AWS (Amazon Web Services)" + docs["longdesc"] = "fence_aws is an I/O Fencing agent for AWS (Amazon Web\ +Services). It uses the boto3 library to connect to AWS.\ +\n.P\n\ +boto3 can be configured with AWS CLI or by creating ~/.aws/credentials.\n\ +For instructions see: https://boto3.readthedocs.io/en/latest/guide/quickstart.html#configuration" + docs["vendorurl"] = "http://www.amazon.com" + show_docs(options, docs) + + run_delay(options) + + if options.get("--verbose") is not None: + lh = logging.FileHandler('/var/log/fence_aws_debug.log') + logger.addHandler(lh) + lhf = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + lh.setFormatter(lhf) + logger.setLevel(logging.DEBUG) + + if options["--boto3_debug"].lower() not in ["1", "yes", "on", "true"]: + boto3.set_stream_logger('boto3',logging.INFO) + boto3.set_stream_logger('botocore',logging.CRITICAL) + logging.getLogger('botocore').propagate = False + logging.getLogger('boto3').propagate = False + else: + log_format = logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s') + logging.getLogger('botocore').propagate = False + logging.getLogger('boto3').propagate = False + fdh = logging.FileHandler('/var/log/fence_aws_boto3.log') + fdh.setFormatter(log_format) + logging.getLogger('boto3').addHandler(fdh) + logging.getLogger('botocore').addHandler(fdh) + logging.debug("Boto debug level is %s and sending debug info to /var/log/fence_aws_boto3.log", options["--boto3_debug"]) + + region = options.get("--region") + access_key = options.get("--access-key") + secret_key = options.get("--secret-key") + try: + conn = boto3.resource('ec2', region_name=region, + aws_access_key_id=access_key, + aws_secret_access_key=secret_key) + except Exception as e: + fail_usage("Failed: Unable to connect to AWS: " + str(e)) + + # Operate the fencing device + result = fence_action(conn, options, set_power_status, get_power_status, get_nodes_list) + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/azure_arm/fence_azure_arm.py b/agents/azure_arm/fence_azure_arm.py new file mode 100755 index 0000000..6908169 --- /dev/null +++ b/agents/azure_arm/fence_azure_arm.py @@ -0,0 +1,260 @@ +#!@PYTHON@ -tt + +import sys, re, pexpect +import logging +import atexit +import xml.etree.ElementTree as ET +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail_usage, run_command, run_delay +import azure_fence + +def get_nodes_list(clients, options): + result = {} + + if clients: + compute_client = clients[0] + rgName = options["--resourceGroup"] + vms = compute_client.virtual_machines.list(rgName) + try: + for vm in vms: + result[vm.name] = ("", None) + except Exception as e: + fail_usage("Failed: %s" % e) + + return result + +def check_unfence(clients, options): + if clients: + compute_client = clients[0] + network_client = clients[1] + rgName = options["--resourceGroup"] + + try: + vms = compute_client.virtual_machines.list(rgName) + except Exception as e: + fail_usage("Failed: %s" % e) + + for vm in vms: + vmName = vm.name + if azure_fence.get_network_state(compute_client, network_client, rgName, vmName) == "off": + logging.info("Found fenced node " + vmName) + # dont return "off" based on network-fencing status + options.pop("--network-fencing", None) + options["--plug"] = vmName + if get_power_status(clients, options) == "off": + logging.info("Unfencing " + vmName) + options["--network-fencing"] = "" + options["--action"] = "on" + set_power_status(clients, options) + options["--action"] = "monitor" + +def get_power_status(clients, options): + vmstate = { "running": "on", + "deallocated": "off", + "stopped": "off" } + logging.info("getting power status for VM " + options["--plug"]) + + if clients: + compute_client = clients[0] + rgName = options["--resourceGroup"] + vmName = options["--plug"] + + if "--network-fencing" in options: + network_client = clients[1] + netState = azure_fence.get_network_state(compute_client, network_client, rgName, vmName) + logging.info("Found network state of VM: " + netState) + + # return off quickly once network is fenced instead of waiting for vm state to change + if options["--action"] == "off" and netState == "off": + logging.info("Network fenced for " + vmName) + return netState + + powerState = "unknown" + try: + vmStatus = compute_client.virtual_machines.get(rgName, vmName, "instanceView") + except Exception as e: + fail_usage("Failed: %s" % e) + + for status in vmStatus.instance_view.statuses: + if status.code.startswith("PowerState"): + powerState = status.code.split("/")[1] + break + + vmState = vmstate.get(powerState, "unknown") + logging.info("Found power state of VM: %s (%s)" % (vmState, powerState)) + + if "--network-fencing" in options and netState == "off": + return "off" + + if options["--action"] != "on" and vmState != "off": + return "on" + + if vmState == "on": + return "on" + + return "off" + +def set_power_status(clients, options): + logging.info("setting power status for VM " + options["--plug"] + " to " + options["--action"]) + + if clients: + compute_client = clients[0] + rgName = options["--resourceGroup"] + vmName = options["--plug"] + + if "--network-fencing" in options: + network_client = clients[1] + + if (options["--action"]=="off"): + logging.info("Fencing network for " + vmName) + azure_fence.set_network_state(compute_client, network_client, rgName, vmName, "block") + elif (options["--action"]=="on"): + logging.info("Unfencing network for " + vmName) + azure_fence.set_network_state(compute_client, network_client, rgName, vmName, "unblock") + + if (options["--action"]=="off"): + logging.info("Poweroff " + vmName + " in resource group " + rgName) + try: + # try new API version first + compute_client.virtual_machines.begin_power_off(rgName, vmName, skip_shutdown=True) + except AttributeError: + # use older API verson if it fails + logging.debug("Poweroff " + vmName + " did not work via 'virtual_machines.begin_power_off. Trying virtual_machines.power_off'.") + compute_client.virtual_machines.power_off(rgName, vmName, skip_shutdown=True) + elif (options["--action"]=="on"): + logging.info("Starting " + vmName + " in resource group " + rgName) + try: + # try new API version first + compute_client.virtual_machines.begin_start(rgName, vmName) + except AttributeError: + # use older API verson if it fails + logging.debug("Starting " + vmName + " did not work via 'virtual_machines.begin_start. Trying virtual_machines.start'.") + compute_client.virtual_machines.start(rgName, vmName) + + +def define_new_opts(): + all_opt["resourceGroup"] = { + "getopt" : ":", + "longopt" : "resourceGroup", + "help" : "--resourceGroup=[name] Name of the resource group", + "shortdesc" : "Name of resource group. Metadata service is used if the value is not provided.", + "required" : "0", + "order" : 2 + } + all_opt["tenantId"] = { + "getopt" : ":", + "longopt" : "tenantId", + "help" : "--tenantId=[name] Id of the Azure Active Directory tenant", + "shortdesc" : "Id of Azure Active Directory tenant.", + "required" : "0", + "order" : 3 + } + all_opt["subscriptionId"] = { + "getopt" : ":", + "longopt" : "subscriptionId", + "help" : "--subscriptionId=[name] Id of the Azure subscription", + "shortdesc" : "Id of the Azure subscription. Metadata service is used if the value is not provided.", + "required" : "0", + "order" : 4 + } + all_opt["network-fencing"] = { + "getopt" : "", + "longopt" : "network-fencing", + "help" : "--network-fencing Use network fencing. See NOTE-section of\n\ + metadata for required Subnet/Network Security\n\ + Group configuration.", + "shortdesc" : "Use network fencing. See NOTE-section for configuration.", + "required" : "0", + "order" : 5 + } + all_opt["msi"] = { + "getopt" : "", + "longopt" : "msi", + "help" : "--msi Use Managed Service Identity instead of\n\ + username and password. If specified,\n\ + parameters tenantId, login and passwd are not\n\ + allowed.", + "shortdesc" : "Determines if Managed Service Identity should be used.", + "required" : "0", + "order" : 6 + } + all_opt["cloud"] = { + "getopt" : ":", + "longopt" : "cloud", + "help" : "--cloud=[name] Name of the cloud you want to use. Supported\n\ + values are china, germany or usgov. Do not use\n\ + this parameter if you want to use public\n\ + Azure.", + "shortdesc" : "Name of the cloud you want to use.", + "required" : "0", + "order" : 7 + } + +# Main agent method +def main(): + compute_client = None + network_client = None + + device_opt = ["login", "no_login", "no_password", "passwd", "port", "resourceGroup", "tenantId", "subscriptionId", "network-fencing", "msi", "cloud"] + + atexit.register(atexit_handler) + + define_new_opts() + + all_opt["power_timeout"]["default"] = "150" + + all_opt["login"]["help"] = "-l, --username=[appid] Application ID" + all_opt["passwd"]["help"] = "-p, --password=[authkey] Authentication key" + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for Azure Resource Manager" + docs["longdesc"] = "fence_azure_arm is an I/O Fencing agent for Azure Resource Manager. It uses Azure SDK for Python to connect to Azure.\ +\n.P\n\ +For instructions to setup credentials see: https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-service-principal-portal\ +\n.P\n\ +Username and password are application ID and authentication key from \"App registrations\".\ +\n.P\n\ +NOTE: NETWORK FENCING\n.br\n\ +Network fencing requires an additional Subnet named \"fence-subnet\" for the Virtual Network using a Network Security Group with the following rules:\n.br\n\ ++-----------+-----+-------------------------+------+------+-----+-----+--------+\n.br\n\ +| DIRECTION | PRI | NAME | PORT | PROT | SRC | DST | ACTION |\n.br\n\ ++-----------+-----+-------------------------+------+------+-----+-----+--------+\n.br\n\ +| Inbound | 100 | FENCE_DENY_ALL_INBOUND | Any | Any | Any | Any | Deny |\n.br\n\ +| Outbound | 100 | FENCE_DENY_ALL_OUTBOUND | Any | Any | Any | Any | Deny |\n.br\n\ ++-----------+-----+-------------------------+------+------+-----+-----+--------+\ +\n.P\n\ +When using network fencing the reboot-action will cause a quick-return once the network has been fenced (instead of waiting for the off-action to succeed). It will check the status during the monitor-action, and request power-on when the shutdown operation is complete." + docs["vendorurl"] = "http://www.microsoft.com" + show_docs(options, docs) + + run_delay(options) + + try: + config = azure_fence.get_azure_config(options) + options["--resourceGroup"] = config.RGName + compute_client = azure_fence.get_azure_compute_client(config) + if "--network-fencing" in options: + network_client = azure_fence.get_azure_network_client(config) + except ImportError: + fail_usage("Azure Resource Manager Python SDK not found or not accessible") + except Exception as e: + fail_usage("Failed: %s" % re.sub("^, ", "", str(e))) + + if "--network-fencing" in options: + # use off-action to quickly return off once network is fenced instead of + # waiting for vm state to change + if options["--action"] == "reboot": + options["--action"] = "off" + # check for devices to unfence in monitor-action + elif options["--action"] == "monitor": + check_unfence([compute_client, network_client], options) + + # Operate the fencing device + result = fence_action([compute_client, network_client], options, set_power_status, get_power_status, get_nodes_list) + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/bladecenter/fence_bladecenter.py b/agents/bladecenter/fence_bladecenter.py new file mode 100644 index 0000000..d670367 --- /dev/null +++ b/agents/bladecenter/fence_bladecenter.py @@ -0,0 +1,105 @@ +#!@PYTHON@ -tt + +##### +## +## The Following Agent Has Been Tested On: +## +## Model Firmware +## +--------------------+---------------------------+ +## (1) Main application BRET85K, rev 16 +## Boot ROM BRBR67D, rev 16 +## Remote Control BRRG67D, rev 16 +## +##### + +import sys, re +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, EC_STATUS, EC_GENERIC_ERROR + +def get_power_status(conn, options): + node_cmd = r"system:blade\[" + options["--plug"] + r"\]>" + + conn.send_eol("env -T system:blade[" + options["--plug"] + "]") + i = conn.log_expect([node_cmd, "system>"], int(options["--shell-timeout"])) + if i == 1: + ## Given blade number does not exist + if "--missing-as-off" in options: + return "off" + else: + fail(EC_STATUS) + conn.send_eol("power -state") + conn.log_expect(node_cmd, int(options["--shell-timeout"])) + status = conn.before.splitlines()[-1] + conn.send_eol("env -T system") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + return status.lower().strip() + +def set_power_status(conn, options): + node_cmd = r"system:blade\[" + options["--plug"] + r"\]>" + + conn.send_eol("env -T system:blade[" + options["--plug"] + "]") + i = conn.log_expect([node_cmd, "system>"], int(options["--shell-timeout"])) + if i == 1: + ## Given blade number does not exist + if "--missing-as-off" in options: + return + else: + fail(EC_GENERIC_ERROR) + + conn.send_eol("power -"+options["--action"]) + conn.log_expect(node_cmd, int(options["--shell-timeout"])) + conn.send_eol("env -T system") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + +def get_blades_list(conn, options): + outlets = {} + + node_cmd = "system>" + + conn.send_eol("env -T system") + conn.log_expect(node_cmd, int(options["--shell-timeout"])) + conn.send_eol("list -l 2") + conn.log_expect(node_cmd, int(options["--shell-timeout"])) + + lines = conn.before.split("\r\n") + filter_re = re.compile(r"^\s*blade\[(\d+)\]\s+(.*?)\s*$") + for blade_line in lines: + res = filter_re.search(blade_line) + if res != None: + outlets[res.group(1)] = (res.group(2), "") + + return outlets + +def main(): + device_opt = ["ipaddr", "login", "passwd", "cmd_prompt", "secure", \ + "port", "missing_as_off", "telnet"] + + atexit.register(atexit_handler) + + all_opt["power_wait"]["default"] = "10" + all_opt["cmd_prompt"]["default"] = ["system>"] + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for IBM BladeCenter" + docs["longdesc"] = "fence_bladecenter is an I/O Fencing agent \ +which can be used with IBM Bladecenters with recent enough firmware that \ +includes telnet support. It logs into a Brocade chasis via telnet or ssh \ +and uses the command line interface to power on and off blades." + docs["vendorurl"] = "http://www.ibm.com" + show_docs(options, docs) + + ## + ## Operate the fencing device + ###### + conn = fence_login(options, "(username\s*:\s*)") + result = fence_action(conn, options, set_power_status, get_power_status, get_blades_list) + fence_logout(conn, "exit") + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/brocade/fence_brocade.py b/agents/brocade/fence_brocade.py new file mode 100644 index 0000000..9f413db --- /dev/null +++ b/agents/brocade/fence_brocade.py @@ -0,0 +1,72 @@ +#!@PYTHON@ -tt + +import sys, re +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, EC_STATUS + +def set_power_status(conn, options): + action = { + 'on' : "portCfgPersistentEnable", + 'off': "portCfgPersistentDisable" + }[options["--action"]] + + conn.send_eol(action + " " + options["--plug"]) + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + +def get_power_status(conn, options): + line_re = re.compile(r'=========', re.IGNORECASE) + outlets = {} + in_index = False + + conn.send_eol("switchshow") + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + for line in str(conn.before).split("\n"): + if line_re.search(line): + in_index = True + elif in_index and line.lstrip()[0].isdigit(): + tokens = line.lstrip().split() + status = "off" if len(tokens) > 7 and tokens[7] == "Disabled" else "on" + outlets[tokens[0]] = ("", status) + + if ["list", "monitor"].count(options["--action"]) == 0: + (_, status) = outlets[options["--plug"]] + return status + else: + return outlets + +def main(): + device_opt = ["ipaddr", "login", "passwd", "cmd_prompt", "secure", \ + "port", "fabric_fencing", "telnet"] + + atexit.register(atexit_handler) + + all_opt["cmd_prompt"]["default"] = ["> "] + + options = check_input(device_opt, process_input(device_opt)) + options["eol"] = "\n" + + docs = {} + docs["shortdesc"] = "Fence agent for HP Brocade over telnet/ssh" + docs["longdesc"] = "fence_brocade is an I/O Fencing agent which can be used with Brocade FC switches. \ +It logs into a Brocade switch via telnet and disables a specified port. Disabling the port which a machine is \ +connected to effectively fences that machine. Lengthy telnet connections to the switch should be avoided while \ +a GFS cluster is running because the connection will block any necessary fencing actions. \ +\ +After a fence operation has taken place the fenced machine can no longer connect to the Brocade FC switch. \ +When the fenced machine is ready to be brought back into the GFS cluster (after reboot) the port on the Brocade \ +FC switch needs to be enabled. This can be done by running fence_brocade and specifying the enable action" + docs["vendorurl"] = "http://www.brocade.com" + show_docs(options, docs) + + ## + ## Operate the fencing device + #### + conn = fence_login(options) + result = fence_action(conn, options, set_power_status, get_power_status, get_power_status) + fence_logout(conn, "exit") + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/cdu/fence_cdu.py b/agents/cdu/fence_cdu.py new file mode 100644 index 0000000..483ac51 --- /dev/null +++ b/agents/cdu/fence_cdu.py @@ -0,0 +1,176 @@ +#!@PYTHON@ -tt +# fence_cdu - fence agent for a Sentry Switch CDU. +# +# Copyright (C) 2012 Canonical Ltd. +# Copyright (C) 2021 SUSE Linux GmbH +# +# Authors: Andres Rodriguez +# Thomas Renninger +# +# 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, version 3 of the License. +# +# 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, see . + +##### +## +## The Following Agent Has Been Tested On: +## +## Model Firmware +## +---------------------------------------------+ +## Sentry Switched CDU 6a +## Sentry Switched CDU 7.1c +## Sentry Switched CDU 7.1f +## Sentry Switched PDU 8.0i +## +## +##### + +import sys, re, pexpect, atexit, logging +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, EC_TIMED_OUT, run_command, frun, EC_STATUS + +def get_power_status(conn, options): + exp_result = 0 + outlets = {} + try: + if options["api-version"] == "8": + conn.send("STATUS ALL\r\n") + else: + conn.send("STATUS\r\n") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + lines = conn.before.split("\n") + if options["api-version"] == "8": + # AA13 Arm-Console3 Wake On On Normal + # AA14 Master_Outlet_14 Wake On On Normal + show_re = re.compile('(\w+)\s+(\S+)\s+(On|Idle On|Off|Wake On)\s+(On|Off)') + else: + # .A12 TowerA_Outlet12 On Idle On + # .A12 test-01 On Idle On + show_re = re.compile('(\.\w+)\s+(\w+|\w+\W\w+)\s+(On|Off)\s+(On|Idle On|Off|Wake On)') + for line in lines: + res = show_re.search(line) + if res != None: + plug_id = res.group(1) + plug_name = res.group(2) + print(plug_name) + plug_state = res.group(3) + if options["api-version"] == "8": + plug_state = res.group(4) + outlets[plug_name] = (plug_id, plug_state) + except pexpect.EOF: + fail(EC_CONNECTION_LOST) + except pexpect.TIMEOUT: + fail(EC_TIMED_OUT) + try: + (_, status) = outlets[options["--plug"]] + return status.lower().strip() + except KeyError: + fail(EC_STATUS) + +def set_power_status(conn, options): + outlets = {} + action = { 'on' : "on", 'off': "off" }[options["--action"]] + try: + conn.send("LIST OUTLETS\r\n") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + lines = conn.before.split("\n") + # if options["api-version"] == "8": + # AA13 Arm-Console3 + # AA14 Master_Outlet_14 + # else: + # .A12 TowerA_Outlet12 + # .A12 test-01 + show_re = re.compile('(\S+)\s+(\w+|\w+\W\w+)\s+') + for line in lines: + res = show_re.search(line) + if res != None: + outlets[res.group(2)] = (res.group(1)) + conn.send(action + " " + outlets[options["--plug"]] + "\r\n") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + except pexpect.EOF: + fail(EC_CONNECTION_LOST) + except pexpect.TIMEOUT: + fail(EC_TIMED_OUT) + +def disconnect(conn): + conn.sendline("LOGOUT") + conn.close() + +def get_version(conn, options): + api_ver = "6" + sub = "a" + minor = "" + conn.send("VERSION\r\n") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + lines = conn.before.split("\n") + show_re = re.compile('Sentry Switched [PC]DU Version (\d)(.\d|)(\w)\r') + for line in lines: + res = show_re.search(line) + if res != None: + api_ver = res.group(1) + if res.group(2): + sub = res.group(2).lstrip(".") + minor = res.group(3) + return (api_ver, sub, minor) + +def main(): + device_opt = [ "ipaddr", "login", "port", "switch", "passwd", "telnet" ] + + atexit.register(atexit_handler) + + options = check_input(device_opt, process_input(device_opt)) + + ## + ## Fence agent specific defaults + ##### + options["--command-prompt"] = "Switched [PC]DU: " + + docs = { } + docs["shortdesc"] = "Fence agent for a Sentry Switch CDU over telnet" + docs["longdesc"] = "fence_cdu is an I/O Fencing agent \ +which can be used with the Sentry Switch CDU. It logs into the device \ +via telnet and power's on/off an outlet." + docs["vendorurl"] = "http://www.servertech.com" + show_docs(options, docs) + + ## Support for --plug [switch]:[plug] notation that was used before + opt_n = options.get("--plug") + if opt_n and (-1 != opt_n.find(":")): + (switch, plug) = opt_n.split(":", 1) + options["--switch"] = switch; + options["--plug"] = plug; + + ## + ## Operate the fencing device + #### + conn = fence_login(options) + (api_ver, sub, minor) = get_version(conn, options) + options["api-version"] = api_ver + logging.debug("Using API version: %s" % api_ver) + if api_ver == "7": + # disable output paging + conn.sendline("set option more disabled") + conn.log_expect(options["--command-prompt"], int(options["--login-timeout"])) + result = fence_action(conn, options, set_power_status, get_power_status, get_power_status) + ## + ## Logout from system + ## + ## In some special unspecified cases it is possible that + ## connection will be closed before we run close(). This is not + ## a problem because everything is checked before. + ###### + atexit.register(disconnect, conn) + + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/cisco_mds/fence_cisco_mds.py b/agents/cisco_mds/fence_cisco_mds.py new file mode 100644 index 0000000..fbb876a --- /dev/null +++ b/agents/cisco_mds/fence_cisco_mds.py @@ -0,0 +1,94 @@ +#!@PYTHON@ -tt + +# The Following agent has been tested on: +# - Cisco MDS UROS 9134 FC (1 Slot) Chassis ("1/2/4 10 Gbps FC/Supervisor-2") Motorola, e500v2 +# with BIOS 1.0.16, kickstart 4.1(1c), system 4.1(1c) +# - Cisco MDS 9124 (1 Slot) Chassis ("1/2/4 Gbps FC/Supervisor-2") Motorola, e500 +# with BIOS 1.0.16, kickstart 4.1(1c), system 4.1(1c) + +import sys, re +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail_usage, array_to_dict +from fencing_snmp import FencingSnmp + +### CONSTANTS ### +# Cisco admin status +PORT_ADMIN_STATUS_OID = ".1.3.6.1.2.1.75.1.2.2.1.1" + +# IF-MIB trees for alias, status and port +ALIASES_OID = ".1.3.6.1.2.1.31.1.1.1.18" +PORTS_OID = ".1.3.6.1.2.1.2.2.1.2" + +### GLOBAL VARIABLES ### +# OID converted from fc port name (fc(x)/(y)) +PORT_OID = "" + +### FUNCTIONS ### + +# Convert cisco port name (fc(x)/(y)) to OID +def cisco_port2oid(port): + port = port.lower() + + nums = re.match(r'^fc(\d+)/(\d+)$', port) + + if nums and len(nums.groups()) == 2: + return "%s.%d.%d"% (PORT_ADMIN_STATUS_OID, int(nums.group(1))+21, int(nums.group(2))-1) + else: + fail_usage("Mangled port number: %s"%(port)) + +def get_power_status(conn, options): + (_, status) = conn.get(PORT_OID) + return status == "1" and "on" or "off" + +def set_power_status(conn, options): + conn.set(PORT_OID, (options["--action"] == "on" and 1 or 2)) + +def get_outlets_status(conn, options): + result = {} + + res_fc = conn.walk(PORTS_OID, 30) + res_aliases = array_to_dict(conn.walk(ALIASES_OID, 30)) + + fc_re = re.compile(r'^"fc\d+/\d+"$') + + for x in res_fc: + if fc_re.match(x[1]): + port_num = x[0].split('.')[-1] + + port_name = x[1].strip('"') + port_alias = (port_num in res_aliases and res_aliases[port_num].strip('"') or "") + port_status = "" + result[port_name] = (port_alias, port_status) + + return result + +# Main agent method +def main(): + global PORT_OID + + device_opt = ["fabric_fencing", "ipaddr", "login", "passwd", "no_login", "no_password", \ + "port", "snmp_version", "snmp"] + + atexit.register(atexit_handler) + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for Cisco MDS" + docs["longdesc"] = "fence_cisco_mds is an I/O Fencing agent \ +which can be used with any Cisco MDS 9000 series with SNMP enabled device." + docs["vendorurl"] = "http://www.cisco.com" + show_docs(options, docs) + + if not options["--action"] in ["list", "monitor"]: + PORT_OID = cisco_port2oid(options["--plug"]) + + # Operate the fencing device + result = fence_action(FencingSnmp(options), options, set_power_status, get_power_status, get_outlets_status) + + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/cisco_ucs/fence_cisco_ucs.py b/agents/cisco_ucs/fence_cisco_ucs.py new file mode 100644 index 0000000..b85379a --- /dev/null +++ b/agents/cisco_ucs/fence_cisco_ucs.py @@ -0,0 +1,198 @@ +#!@PYTHON@ -tt + +import sys, re +import pycurl, io +import logging +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, EC_STATUS, EC_LOGIN_DENIED, run_delay + +RE_COOKIE = re.compile("", int(options["--shell-timeout"])) + + result = RE_GET_PNDN.search(res) + if result == None: + pndn = "" + else: + pndn = result.group(1) + + if pndn.strip() == "": + if "--missing-as-off" in options: + return "off" + else: + fail(EC_STATUS) + + res = send_command(options, "", int(options["--shell-timeout"])) + + result = RE_GET_PRESENCE.search(res) + if result == None: + fail(EC_STATUS) + else: + presence_status = result.group(1) + + if presence_status in ["missing", "mismatch"]: + return "off" + else: + result = RE_GET_OPERPOWER.search(res) + if result == None: + fail(EC_STATUS) + else: + power_status = result.group(1) + + if power_status == "on": + return "on" + else: + return "off" + +def set_power_status(conn, options): + del conn + + action = { + 'on' : "admin-up", + 'off' : "admin-down" + }[options["--action"]] + + send_command(options, "" + + "" + "" + "", + int(options["--shell-timeout"])) + + return + +def get_list(conn, options): + del conn + outlets = {} + + try: + res = send_command(options, "", int(options["--shell-timeout"])) + + lines = res.split("", + int(options_global["--shell-timeout"])) + except Exception: + pass + +def main(): + global options_global + device_opt = ["ipaddr", "login", "passwd", "ssl", "notls", "port", "web", "suborg", "missing_as_off"] + + atexit.register(atexit_handler) + atexit.register(logout) + + define_new_opts() + + options_global = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for Cisco UCS" + docs["longdesc"] = "fence_cisco_ucs is an I/O Fencing agent which can be \ +used with Cisco UCS to fence machines." + docs["vendorurl"] = "http://www.cisco.com" + show_docs(options_global, docs) + + run_delay(options_global) + ### Login + try: + res = send_command(options_global, "", int(options_global["--login-timeout"])) + result = RE_COOKIE.search(res) + if result == None: + ## Cookie is absenting in response + fail(EC_LOGIN_DENIED) + except Exception as e: + logging.error("Failed: {}".format(str(e))) + fail(EC_LOGIN_DENIED) + + options_global["cookie"] = result.group(1) + + ## + ## Modify suborg to format /suborg + if options_global["--suborg"] != "": + options_global["--suborg"] = "/" + options_global["--suborg"].lstrip("/").rstrip("/") + + ## + ## Fence operations + #### + result = fence_action(None, options_global, set_power_status, get_power_status, get_list) + + ## Logout is done every time at atexit phase + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/compute/fence_compute.py b/agents/compute/fence_compute.py new file mode 100644 index 0000000..f53b97d --- /dev/null +++ b/agents/compute/fence_compute.py @@ -0,0 +1,516 @@ +#!@PYTHON@ -tt + +import sys +import time +import atexit +import logging +import inspect +import requests.exceptions + +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail_usage, is_executable, run_command, run_delay + +override_status = "" + +EVACUABLE_TAG = "evacuable" +TRUE_TAGS = ['true'] + +def get_power_status(connection, options): + + if len(override_status): + logging.debug("Pretending we're " + override_status) + return override_status + + status = "unknown" + logging.debug("get action: " + options["--action"]) + + if connection: + try: + services = connection.services.list(host=options["--plug"], binary="nova-compute") + for service in services: + logging.debug("Status of %s on %s is %s, %s" % (service.binary, options["--plug"], service.state, service.status)) + if service.state == "up" and service.status == "enabled": + # Up and operational + status = "on" + + elif service.state == "down" and service.status == "disabled": + # Down and fenced + status = "off" + + elif service.state == "down": + # Down and requires fencing + status = "failed" + + elif service.state == "up": + # Up and requires unfencing + status = "running" + else: + logging.warning("Unknown status detected from nova for %s: %s, %s" % (options["--plug"], service.state, service.status)) + status = "%s %s" % (service.state, service.status) + break + except requests.exception.ConnectionError as err: + logging.warning("Nova connection failed: " + str(err)) + logging.debug("Final status of %s is %s" % (options["--plug"], status)) + return status + +def get_power_status_simple(connection, options): + status = get_power_status(connection, options) + if status in [ "off" ]: + return status + return "on" + +def set_attrd_status(host, status, options): + logging.debug("Setting fencing status for %s to %s" % (host, status)) + run_command(options, "attrd_updater -p -n evacuate -Q -N %s -U %s" % (host, status)) + +def get_attrd_status(host, options): + (status, pipe_stdout, pipe_stderr) = run_command(options, "attrd_updater -p -n evacuate -Q -N %s" % (host)) + fields = pipe_stdout.split('"') + if len(fields) > 6: + return fields[5] + logging.debug("Got %s: o:%s e:%s n:%d" % (status, pipe_stdout, pipe_stderr, len(fields))) + return "" + +def set_power_status_on(connection, options): + # Wait for any evacuations to complete + while True: + current = get_attrd_status(options["--plug"], options) + if current in ["no", ""]: + logging.info("Evacuation complete for: %s '%s'" % (options["--plug"], current)) + break + else: + logging.info("Waiting for %s to complete evacuations: %s" % (options["--plug"], current)) + time.sleep(2) + + status = get_power_status(connection, options) + # Should we do it for 'failed' too? + if status in [ "off", "running", "failed" ]: + try: + # Forcing the host back up + logging.info("Forcing nova-compute back up on "+options["--plug"]) + connection.services.force_down(options["--plug"], "nova-compute", force_down=False) + logging.info("Forced nova-compute back up on "+options["--plug"]) + except Exception as e: + # In theory, if force_down=False fails, that's for the exact + # same possible reasons that below with force_down=True + # eg. either an incompatible version or an old client. + # Since it's about forcing back to a default value, there is + # no real worries to just consider it's still okay even if the + # command failed + logging.warn("Exception from attempt to force " + "host back up via nova API: " + "%s: %s" % (e.__class__.__name__, e)) + + # Forcing the service back up in case it was disabled + logging.info("Enabling nova-compute on "+options["--plug"]) + connection.services.enable(options["--plug"], 'nova-compute') + + # Pretend we're 'on' so that the fencing library doesn't loop forever waiting for the node to boot + override_status = "on" + elif status not in ["on"]: + # Not safe to unfence, don't waste time looping to see if the status changes to "on" + options["--power-timeout"] = "0" + +def set_power_status_off(connection, options): + status = get_power_status(connection, options) + if status in [ "off" ]: + return + + try: + # Until 2.53 + connection.services.force_down( + options["--plug"], "nova-compute", force_down=True) + connection.services.disable(options["--plug"], 'nova-compute') + except Exception as e: + # Something went wrong when we tried to force the host down. + # That could come from either an incompatible API version + # eg. UnsupportedVersion or VersionNotFoundForAPIMethod + # or because novaclient is old and doesn't include force_down yet + # eg. AttributeError + # In that case, fallbacking to wait for Nova to catch the right state. + + logging.error("Exception from attempt to force host down via nova API: " + "%s: %s" % (e.__class__.__name__, e)) + # need to wait for nova to update its internal status or we + # cannot call host-evacuate + while get_power_status(connection, options) not in ["off"]: + # Loop forever if need be. + # + # Some callers (such as Pacemaker) will have a timer + # running and kill us if necessary + logging.debug("Waiting for nova to update its internal state for %s" % options["--plug"]) + time.sleep(1) + + set_attrd_status(options["--plug"], "yes", options) + +def set_power_status(connection, options): + global override_status + + override_status = "" + logging.debug("set action: " + options["--action"]) + + if not connection: + return + + if options["--action"] in ["off", "reboot"]: + set_power_status_off(connection, options) + else: + set_power_status_on(connection, options) + logging.debug("set action passed: " + options["--action"]) + sys.exit(0) + +def fix_domain(connection, options): + domains = {} + last_domain = None + + if connection: + # Find it in nova + + services = connection.services.list(binary="nova-compute") + for service in services: + shorthost = service.host.split('.')[0] + + if shorthost == service.host: + # Nova is not using FQDN + calculated = "" + else: + # Compute nodes are named as FQDN, strip off the hostname + calculated = service.host.replace(shorthost+".", "") + + if calculated == last_domain: + # Avoid complaining for each compute node with the same name + # One hopes they don't appear interleaved as A.com B.com A.com B.com + logging.debug("Calculated the same domain from: %s" % service.host) + continue + + domains[calculated] = service.host + last_domain = calculated + + if "--domain" in options and options["--domain"] != calculated: + # Warn in case nova isn't available at some point + logging.warning("Supplied domain '%s' does not match the one calculated from: %s" + % (options["--domain"], service.host)) + + if len(domains) == 0 and "--domain" not in options: + logging.error("Could not calculate the domain names used by compute nodes in nova") + + elif len(domains) == 1 and "--domain" not in options: + options["--domain"] = last_domain + + elif len(domains) == 1 and options["--domain"] != last_domain: + logging.error("Overriding supplied domain '%s' as it does not match the one calculated from: %s" + % (options["--domain"], domains[last_domain])) + options["--domain"] = last_domain + + elif len(domains) > 1: + logging.error("The supplied domain '%s' did not match any used inside nova: %s" + % (options["--domain"], repr(domains))) + sys.exit(1) + + return last_domain + +def fix_plug_name(connection, options): + if options["--action"] == "list": + return + + if "--plug" not in options: + return + + calculated = fix_domain(connection, options) + if calculated is None or "--domain" not in options: + # Nothing supplied and nova not available... what to do... nothing + return + + short_plug = options["--plug"].split('.')[0] + logging.debug("Checking target '%s' against calculated domain '%s'"% (options["--plug"], calculated)) + + if options["--domain"] == "": + # Ensure any domain is stripped off since nova isn't using FQDN + options["--plug"] = short_plug + + elif options["--plug"].endswith(options["--domain"]): + # Plug already uses the domain, don't re-add + return + + else: + # Add the domain to the plug + options["--plug"] = short_plug + "." + options["--domain"] + +def get_plugs_list(connection, options): + result = {} + + if connection: + services = connection.services.list(binary="nova-compute") + for service in services: + longhost = service.host + shorthost = longhost.split('.')[0] + result[longhost] = ("", None) + result[shorthost] = ("", None) + return result + +def create_nova_connection(options): + nova = None + + try: + from novaclient import client + from novaclient.exceptions import NotAcceptable + except ImportError: + fail_usage("Nova not found or not accessible") + + from keystoneauth1 import loading + from keystoneauth1 import session + from keystoneclient import discover + + # Prefer the oldest and strip the leading 'v' + keystone_versions = discover.available_versions(options["--auth-url"]) + keystone_version = keystone_versions[0]['id'][1:] + kwargs = dict( + auth_url=options["--auth-url"], + username=options["--username"], + password=options["--password"] + ) + + if discover.version_match("2", keystone_version): + kwargs["tenant_name"] = options["--tenant-name"] + + elif discover.version_match("3", keystone_version): + kwargs["project_name"] = options["--tenant-name"] + kwargs["user_domain_name"] = options["--user-domain"] + kwargs["project_domain_name"] = options["--project-domain"] + + loader = loading.get_plugin_loader('password') + keystone_auth = loader.load_from_options(**kwargs) + keystone_session = session.Session(auth=keystone_auth, verify=not "--insecure" in options) + + nova_versions = [ "2.11", "2" ] + for version in nova_versions: + clientargs = inspect.getargspec(client.Client).varargs + # Some versions of Openstack prior to Ocata only + # supported positional arguments for username, + # password, and tenant. + # + # Versions since Ocata only support named arguments. + # + # So we need to use introspection to figure out how to + # create a Nova client. + # + # Happy days + # + if clientargs: + # OSP < 11 + # ArgSpec(args=['version', 'username', 'password', 'project_id', 'auth_url'], + # varargs=None, + # keywords='kwargs', defaults=(None, None, None, None)) + nova = client.Client(version, + None, # User + None, # Password + None, # Tenant + None, # Auth URL + insecure="--insecure" in options, + region_name=options["--region-name"], + endpoint_type=options["--endpoint-type"], + session=keystone_session, auth=keystone_auth, + http_log_debug="--verbose" in options) + else: + # OSP >= 11 + # ArgSpec(args=['version'], varargs='args', keywords='kwargs', defaults=None) + nova = client.Client(version, + region_name=options["--region-name"], + endpoint_type=options["--endpoint-type"], + session=keystone_session, auth=keystone_auth, + http_log_debug="--verbose" in options) + + try: + nova.hypervisors.list() + return nova + + except NotAcceptable as e: + logging.warning(e) + + except Exception as e: + logging.warning("Nova connection failed. %s: %s" % (e.__class__.__name__, e)) + + logging.warning("Couldn't obtain a supported connection to nova, tried: %s\n" % repr(nova_versions)) + return None + +def define_new_opts(): + all_opt["endpoint_type"] = { + "getopt" : "e:", + "longopt" : "endpoint-type", + "help" : "-e, --endpoint-type=[endpoint] Nova Endpoint type (publicURL, internalURL, adminURL)", + "required" : "0", + "shortdesc" : "Nova Endpoint type", + "default" : "internalURL", + "order": 1, + } + all_opt["tenant_name"] = { + "getopt" : "t:", + "longopt" : "tenant-name", + "help" : "-t, --tenant-name=[name] Keystone v2 Tenant or v3 Project Name", + "required" : "0", + "shortdesc" : "Keystone Admin Tenant or v3 Project", + "default" : "", + "order": 1, + } + all_opt["user-domain"] = { + "getopt" : "u:", + "longopt" : "user-domain", + "help" : "-u, --user-domain=[name] Keystone v3 User Domain", + "required" : "0", + "shortdesc" : "Keystone v3 User Domain", + "default" : "Default", + "order": 2, + } + all_opt["project-domain"] = { + "getopt" : "P:", + "longopt" : "project-domain", + "help" : "-P, --project-domain=[name] Keystone v3 Project Domain", + "required" : "0", + "shortdesc" : "Keystone v3 Project Domain", + "default" : "Default", + "order": 2, + } + all_opt["auth_url"] = { + "getopt" : "k:", + "longopt" : "auth-url", + "help" : "-k, --auth-url=[url] Keystone Admin Auth URL", + "required" : "0", + "shortdesc" : "Keystone Admin Auth URL", + "default" : "", + "order": 1, + } + all_opt["region_name"] = { + "getopt" : ":", + "longopt" : "region-name", + "help" : "--region-name=[region] Region Name", + "required" : "0", + "shortdesc" : "Region Name", + "default" : "", + "order": 1, + } + all_opt["insecure"] = { + "getopt" : "", + "longopt" : "insecure", + "help" : "--insecure Explicitly allow agent to perform \"insecure\" TLS (https) requests", + "required" : "0", + "shortdesc" : "Allow Insecure TLS Requests", + "order": 2, + } + all_opt["domain"] = { + "getopt" : "d:", + "longopt" : "domain", + "help" : "-d, --domain=[string] DNS domain in which hosts live, useful when the cluster uses short names and nova uses FQDN", + "required" : "0", + "shortdesc" : "DNS domain in which hosts live", + "order": 5, + } + all_opt["record_only"] = { + "getopt" : "r:", + "longopt" : "record-only", + "help" : "--record-only Record the target as needing evacuation but as yet do not intiate it", + "required" : "0", + "shortdesc" : "Only record the target as needing evacuation", + "default" : "False", + "order": 5, + } + all_opt["instance_filtering"] = { + "getopt" : "", + "longopt" : "instance-filtering", + "help" : "--instance-filtering Allow instances created from images and flavors with evacuable=true to be evacuated (or all if no images/flavors have been tagged)", + "required" : "0", + "shortdesc" : "Allow instances to be evacuated", + "default" : "True", + "order": 5, + } + all_opt["no_shared_storage"] = { + "getopt" : "", + "longopt" : "no-shared-storage", + "help" : "--no-shared-storage Disable functionality for shared storage", + "required" : "0", + "shortdesc" : "Disable functionality for dealing with shared storage", + "default" : "False", + "order": 5, + } + all_opt["compute-domain"] = { + "getopt" : ":", + "longopt" : "compute-domain", + "help" : "--compute-domain=[string] Replaced by --domain", + "required" : "0", + "shortdesc" : "Replaced by domain", + "order": 6, + } + +def set_multi_power_fn(connection, options, set_power_fn, get_power_fn, retry_attempts=1): + for _ in range(retry_attempts): + set_power_fn(connection, options) + time.sleep(int(options["--power-wait"])) + + for _ in range(int(options["--power-timeout"])): + if get_power_fn(connection, options) != options["--action"]: + time.sleep(1) + else: + return True + return False + +def main(): + global override_status + atexit.register(atexit_handler) + + device_opt = ["login", "passwd", "tenant_name", "auth_url", "fabric_fencing", "no_login", + "no_password", "port", "domain", "compute-domain", "project-domain", + "user-domain", "no_shared_storage", "endpoint_type", "record_only", + "instance_filtering", "insecure", "region_name"] + define_new_opts() + all_opt["shell_timeout"]["default"] = "180" + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for the automatic resurrection of OpenStack compute instances" + docs["longdesc"] = "Used to tell Nova that compute nodes are down and to reschedule flagged instances" + docs["vendorurl"] = "" + + show_docs(options, docs) + + if options["--record-only"] in [ "2", "Disabled", "disabled" ]: + sys.exit(0) + + run_delay(options) + + # workaround to avoid regressions + if "--compute-domain" in options and options["--compute-domain"]: + options["--domain"] = options["--compute-domain"] + del options["--domain"] + + # Disable insecure-certificate-warning message + if "--insecure" in options: + import urllib3 + urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + + logging.debug("Running "+options["--action"]) + connection = create_nova_connection(options) + + if options["--action"] in ["off", "on", "reboot", "status"]: + fix_plug_name(connection, options) + + + if options["--action"] in ["reboot"]: + options["--action"]="off" + + if options["--action"] in ["off", "on"]: + # No status first, call our own version + result = not set_multi_power_fn(connection, options, set_power_status, get_power_status_simple, + 1 + int(options["--retry-on"])) + elif options["--action"] in ["monitor"]: + result = 0 + else: + result = fence_action(connection, options, set_power_status, get_power_status_simple, get_plugs_list, None) + + logging.debug("Result for "+options["--action"]+": "+repr(result)) + if result == None: + result = 0 + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/crosslink/README.md b/agents/crosslink/README.md new file mode 100644 index 0000000..990b790 --- /dev/null +++ b/agents/crosslink/README.md @@ -0,0 +1,44 @@ +# Two node cross-link fence agent + +The problem that this fence agents tries to solve is the following: + +Given a two-node cluster with a direct crosslink ethernet cable +between the two nodes (in addition to the normal networking setup), we want to +be able to maintain quorum on node (A) when node (B) lost power. +The loss of power on node (B) in this case implies its BMC/IPMI is also +not available which would be normally used in fencing in this case. + +Note: An external PDU would be preferrable and would solve this +situation more elegantly. The assumption here is that something +like that won't be available in this environment. + +This works by creating a stonith level composed of a BMC/IPMI +fencing at level 1 and then the fence_crosslink agent at level 2. + +In case node (A) has lost power, then node (B) will do the following: +1. Try to fence node (B) via IPMI, which will fail since the node has no +power and the BMC is unavailable +2. Check via fence_crosslink the cross-cable interconnect. If the cross cable +IP is not reachable, then we know for "sure" (this is a potentially broad +assumption) that the node is really down and fence_crosslink tells pacemaker +that the fencing was successful, so pacemaker can work with that new +information. + +Here are some example configuration commands: +~~~ +pcs stonith create crosslink-controller-1 fence_crosslink crosscableip=1.1.1.2 pcmk_host_list=controller-1 pcmk_reboot_action=off +pcs stonith create crosslink-controller-0 fence_crosslink crosscableip=1.1.1.1 pcmk_host_list=controller-0 pcmk_reboot_action=off +# We make sure the stonith resource do not run on the same node as the fencing target +pcs constraint location crosslink-controller-1 avoids controller-1 +pcs constraint location crosslink-controller-0 avoids controller-0 +pcs stonith level add 2 controller-0 crosslink-controller-0 +pcs stonith level add 2 controller-1 crosslink-controller-1 +~~~ + +Testing done: +- Simulate power outage by turning off the controller-1 VM and its IPMI interface and leaving the crosslink intact. + + * Expected Outcome: + We should retain quorum on controller-0 and all services should be running on controller-0. No UNCLEAN resources should be observed on controller-0. + * Actual Outcome: + Matched the expected outcome. diff --git a/agents/crosslink/fence_crosslink.py b/agents/crosslink/fence_crosslink.py new file mode 100755 index 0000000..7cfc90c --- /dev/null +++ b/agents/crosslink/fence_crosslink.py @@ -0,0 +1,113 @@ +#!@PYTHON@ -tt + +# Copyright (c) 2020 Red Hat +# +# 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, see +# . + +import atexit +import logging +import sys +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import (all_opt, atexit_handler, check_input, # noqa: E402 + fence_action, process_input, run_command, run_delay, + show_docs) + +logger = logging.getLogger(__name__) +logger.setLevel("WARNING") + + +def get_power_status(conn, options): + logger.debug("get_power_status(): %s" % options) + ip = options['--crosscableip'] + timeout = options['--timeout'] + # This returns 'off' if not a single ICMP packet gets answered during the + # whole timeout window. (the ping executable will return 1 in such case and + # 0 if even a single packet gets replied to) + (status, stdout, stderr) = run_command(options, "ping -w%s -n %s" % + (timeout, ip)) + logger.debug("get_power_status(): %s - Stdout: %s - Stderr: %s" % + (status, stdout, stderr)) + if status == 0: + return "on" + else: + return "off" + + +def set_power_status(conn, options): + logger.debug("set_power_status(): %s" % options) + # If we got here it means the previous call to get_power_status() returned + # on At this point we've been invoked but the node is still reachable over + # the cross connect, so we can just error out. + ip = options['--crosscableip'] + if options['--action'] == 'off': + logger.error("We've been asked to turn off the node at %s but the " + "cross-cable link is up so erroring out" % ip) + sys.exit(1) + elif options['--action'] == 'on': + logger.error("We've been asked to turn on the node at %s but the " + "cross-cable link is off so erroring out" % ip) + sys.exit(1) + else: + logger.error("set_power_status() was called with action %s which " + "is not supported" % options['--action']) + sys.exit(1) + + +def define_new_opts(): + all_opt["crosscableip"] = { + "getopt": "a:", + "longopt": "crosscableip", + "help": "-a, --crosscableip=[IP] IP over the cross-cable link", + "required": "1", + "shortdesc": "Cross-cable IP", + "order": 1 + } + all_opt["timeout"] = { + "getopt": "T:", + "longopt": "timeout", + "help": "-T, --timeout=[seconds] timeout in seconds", + "required": "0", + "shortdesc": "No ICMP reply in 5 seconds -> Node is considered dead", + "default": "5", + "order": 1 + } + + +def main(): + atexit.register(atexit_handler) + + device_opt = ["crosscableip", "timeout", "no_password", "no_login", "port"] + define_new_opts() + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for cross-link two-node clusters" + docs["longdesc"] = "This agent helps two-node clusters to tackle the " \ + "situation where one node lost power, cannot be " \ + "fenced by telling pacemaker that if the node is not " \ + "reachable over the crosslink cable, we can assume " \ + "it is dead" + docs["vendorurl"] = "" + show_docs(options, docs) + + run_delay(options) + + result = fence_action(None, options, set_power_status, get_power_status) + sys.exit(result) + + +if __name__ == "__main__": + main() diff --git a/agents/cyberpower_ssh/fence_cyberpower_ssh.py b/agents/cyberpower_ssh/fence_cyberpower_ssh.py new file mode 100755 index 0000000..f0695d6 --- /dev/null +++ b/agents/cyberpower_ssh/fence_cyberpower_ssh.py @@ -0,0 +1,70 @@ +#!@PYTHON@ -tt + +##### +## +## Fence agent for CyberPower based SSH-capable power strip +## Tested with CyberPower model PDU41001, ePDU Firmware version 1.2.0 +## +##### + +import sys, re, time +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, EC_STATUS + +def set_power_status(conn, options): + conn.send_eol("oltctrl index " + options["--plug"] + " act delay" + options["--action"]) + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + +def get_power_status(conn, options): + outlets = {} + conn.send_eol("oltsta show") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + lines = conn.before.split("\n") + show_re = re.compile(r'(\s*)(\d)\s*(.*)\s*(On|Off)\s*') + for line in lines: + res = show_re.search(line) + if res != None: + outlets[res.group(2)] = (res.group(3), res.group(4)) + if ["list", "monitor"].count(options["--action"]) == 1: + return outlets + else: + try: + (_,status) = outlets[options["--plug"]] + return status.lower().strip() + except KeyError: + fail(EC_STATUS) + +def main(): + device_opt = ["ipaddr", "login", "passwd", "cmd_prompt", "secure", \ + "port"] + + atexit.register(atexit_handler) + + all_opt["cmd_prompt"]["default"] = ["\n>", "\nCyberPower >"] + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for CyberPower over ssh" + docs["longdesc"] = "fence_cyberpower_ssh is an I/O Fencing agent \ +which can be used with the CyberPower network power switch. It logs into \ +device via ssh and reboots a specified outlet. Lengthy ssh connections \ +should be avoided while a GFS cluster is running because the connection \ +will block any necessary fencing actions." + docs["vendorurl"] = "http://www.cyberpower.com" + show_docs(options, docs) + + ## + ## Operate the fencing device + #### + conn = fence_login(options) + + result = fence_action(conn, options, set_power_status, get_power_status, get_power_status) + + fence_logout(conn, "exit") + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/docker/fence_docker.py b/agents/docker/fence_docker.py new file mode 100644 index 0000000..0044025 --- /dev/null +++ b/agents/docker/fence_docker.py @@ -0,0 +1,161 @@ +#!@PYTHON@ -tt + +import atexit +import sys +import io +import logging +import pycurl +import json + +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import fail_usage, all_opt, fence_action, atexit_handler, check_input, process_input, show_docs, run_delay + +def get_power_status(conn, options): + del conn + status = send_cmd(options, "containers/%s/json" % options["--plug"]) + if status is None: + return None + return "on" if status["State"]["Running"] else "off" + + +def set_power_status(conn, options): + del conn + if options["--action"] == "on": + send_cmd(options, "containers/%s/start" % options["--plug"], True) + else: + send_cmd(options, "containers/%s/kill" % options["--plug"], True) + return + + +def reboot_cycle(conn, options): + del conn + send_cmd(options, "containers/%s/restart" % options["--plug"], True) + return get_power_status(conn, options) + + +def get_list(conn, options): + del conn + output = send_cmd(options, "containers/json?all=1") + containers = {} + for container in output: + containers[container["Id"]] = ({True:container["Names"][0][1:], False: container["Names"][0]}[container["Names"][0][0:1] == '/'], {True:"off", False: "on"}[container["Status"][:4].lower() == "exit"]) + return containers + + +def send_cmd(options, cmd, post = False): + url = "http%s://%s:%s/v%s/%s" % ("s" if "--ssl-secure" in options or "--ssl-insecure" in options else "", options["--ip"], options["--ipport"], options["--api-version"], cmd) + conn = pycurl.Curl() + output_buffer = io.BytesIO() + if logging.getLogger().getEffectiveLevel() < logging.WARNING: + conn.setopt(pycurl.VERBOSE, True) + conn.setopt(pycurl.HTTPGET, 1) + conn.setopt(pycurl.URL, url.encode("ascii")) + if post: + conn.setopt(pycurl.POST, 1) + conn.setopt(pycurl.POSTFIELDSIZE, 0) + conn.setopt(pycurl.WRITEFUNCTION, output_buffer.write) + conn.setopt(pycurl.TIMEOUT, int(options["--shell-timeout"])) + + if "--ssl-secure" in options: + if not (set(("--tlscert", "--tlskey", "--tlscacert")) <= set(options)): + fail_usage("Failed. If --ssl option is used, You have to also \ +specify: --tlscert, --tlskey and --tlscacert") + conn.setopt(pycurl.SSL_VERIFYPEER, 1) + conn.setopt(pycurl.SSLCERT, options["--tlscert"]) + conn.setopt(pycurl.SSLKEY, options["--tlskey"]) + conn.setopt(pycurl.CAINFO, options["--tlscacert"]) + elif "--ssl-insecure" in options: + conn.setopt(pycurl.SSL_VERIFYPEER, 0) + conn.setopt(pycurl.SSL_VERIFYHOST, 0) + + logging.debug("URL: " + url) + + try: + conn.perform() + result = output_buffer.getvalue().decode() + return_code = conn.getinfo(pycurl.RESPONSE_CODE) + + logging.debug("RESULT [" + str(return_code) + \ + "]: " + result) + conn.close() + if return_code == 200: + return json.loads(result) + except pycurl.error: + logging.error("Connection failed") + except: + if result is not None: + logging.error(result) + logging.error("Cannot parse json") + return None + + +def main(): + atexit.register(atexit_handler) + + all_opt["tlscert"] = { + "getopt" : ":", + "longopt" : "tlscert", + "help" : "--tlscert " + "Path to client certificate for TLS authentication", + "required" : "0", + "shortdesc" : "Path to client certificate (PEM format) \ +for TLS authentication. Required if --ssl option is used.", + "order": 2 + } + + all_opt["tlskey"] = { + "getopt" : ":", + "longopt" : "tlskey", + "help" : "--tlskey " + "Path to client key for TLS authentication", + "required" : "0", + "shortdesc" : "Path to client key (PEM format) for TLS \ +authentication. Required if --ssl option is used.", + "order": 2 + } + + all_opt["tlscacert"] = { + "getopt" : ":", + "longopt" : "tlscacert", + "help" : "--tlscacert " + "Path to CA certificate for TLS authentication", + "required" : "0", + "shortdesc" : "Path to CA certificate (PEM format) for \ +TLS authentication. Required if --ssl option is used.", + "order": 2 + } + + all_opt["api_version"] = { + "getopt" : ":", + "longopt" : "api-version", + "help" : "--api-version " + "Version of Docker Remote API (default: 1.11)", + "required" : "0", + "order" : 2, + "default" : "1.11", + } + + device_opt = ["ipaddr", "no_password", "no_login", "port", "method", "web", "tlscert", "tlskey", "tlscacert", "ssl", "api_version"] + + all_opt["ssl"]["default"] = "1" + + options = check_input(device_opt, process_input(device_opt)) + + docs = { } + docs["shortdesc"] = "Fence agent for Docker" + docs["longdesc"] = "fence_docker is I/O fencing agent which \ +can be used with the Docker Engine containers. You can use this \ +fence-agent without any authentication, or you can use TLS authentication \ +(use --ssl option, more info about TLS authentication in docker: \ +http://docs.docker.com/examples/https/)." + docs["vendorurl"] = "www.docker.io" + show_docs(options, docs) + + run_delay(options) + + result = fence_action(None, options, set_power_status, get_power_status, get_list, reboot_cycle) + + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/drac/fence_drac.py b/agents/drac/fence_drac.py new file mode 100644 index 0000000..be3e9a5 --- /dev/null +++ b/agents/drac/fence_drac.py @@ -0,0 +1,62 @@ +#!@PYTHON@ -tt + +import sys, re +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * + +def get_power_status(conn, options): + conn.send_eol("getmodinfo") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + status = re.compile(r"\s+(on|off)\s+", re.IGNORECASE).search(conn.before).group(1) + return status.lower().strip() + +def set_power_status(conn, options): + action = { + 'on' : "powerup", + 'off': "powerdown" + }[options["--action"]] + + conn.send_eol("serveraction -d 0 " + action) + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + +def main(): + device_opt = ["ipaddr", "login", "passwd", "cmd_prompt", "telnet"] + + atexit.register(atexit_handler) + + opt = process_input(device_opt) + if "--username" in opt: + all_opt["cmd_prompt"]["default"] = ["\\[" + opt["--username"] + "\\]# "] + else: + all_opt["cmd_prompt"]["default"] = ["\\[" "username" + "\\]# "] + + options = check_input(device_opt, opt) + + docs = {} + docs["shortdesc"] = "I/O Fencing agent for Dell DRAC IV" + docs["longdesc"] = "fence_drac is an I/O Fencing agent which can be used with \ +the Dell Remote Access Card (DRAC). This card provides remote access to controlling \ +power to a server. It logs into the DRAC through the telnet interface of the card. By \ +default, the telnet interface is not enabled. To enable the interface, you will need \ +to use the racadm command in the racser-devel rpm available from Dell. \ +\ +To enable telnet on the DRAC: \ +\ +[root]# racadm config -g cfgSerial -o cfgSerialTelnetEnable 1 \ +\ +[root]# racadm racreset \ +" + docs["vendorurl"] = "http://www.dell.com" + show_docs(options, docs) + + ## + ## Operate the fencing device + #### + conn = fence_login(options) + result = fence_action(conn, options, set_power_status, get_power_status, None) + fence_logout(conn, "exit") + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/drac5/fence_drac5.py b/agents/drac5/fence_drac5.py new file mode 100644 index 0000000..648ecd9 --- /dev/null +++ b/agents/drac5/fence_drac5.py @@ -0,0 +1,147 @@ +#!@PYTHON@ -tt + +##### +## +## The Following Agent Has Been Tested On: +## +## DRAC Version Firmware +## +-----------------+---------------------------+ +## DRAC 5 1.0 (Build 06.05.12) +## DRAC 5 1.21 (Build 07.05.04) +## +## @note: drac_version was removed +##### + +import sys, re, time +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail_usage + +def get_power_status(conn, options): + if options["--drac-version"] == "DRAC MC": + (_, status) = get_list_devices(conn, options)[options["--plug"]] + else: + if options["--drac-version"] == "DRAC CMC": + conn.send_eol("racadm serveraction powerstatus -m " + options["--plug"]) + elif options["--drac-version"] == "DRAC 5": + conn.send_eol("racadm serveraction powerstatus") + + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + status = re.compile(r"(^|: )(ON|OFF|Powering ON|Powering OFF)\s*$", + re.IGNORECASE | re.MULTILINE).search(conn.before).group(2) + + if status.lower().strip() in ["on", "powering on", "powering off"]: + return "on" + else: + return "off" + +def set_power_status(conn, options): + action = { + 'on' : "powerup", + 'off': "powerdown" + }[options["--action"]] + + if options["--drac-version"] == "DRAC CMC": + conn.send_eol("racadm serveraction " + action + " -m " + options["--plug"]) + elif options["--drac-version"] == "DRAC 5": + conn.send_eol("racadm serveraction " + action) + elif options["--drac-version"] == "DRAC MC": + conn.send_eol("racadm serveraction -s " + options["--plug"] + " " + action) + + ## Fix issue with double-enter [CR/LF] + ## We need to read two additional command prompts (one from get + one from set command) + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + if len(conn.before.strip()) == 0: + options["eol"] = options["eol"][:-1] + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + +def get_list_devices(conn, options): + outlets = {} + + if options["--drac-version"] == "DRAC CMC": + conn.send_eol("getmodinfo") + + list_re = re.compile(r"^([^\s]*?)\s+Present\s*(ON|OFF)\s*.*$") + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + for line in conn.before.splitlines(): + if list_re.search(line): + outlets[list_re.search(line).group(1)] = ("", list_re.search(line).group(2)) + elif options["--drac-version"] == "DRAC MC": + conn.send_eol("getmodinfo") + + list_re = re.compile(r"^\s*([^\s]*)\s*---->\s*(.*?)\s+Present\s*(ON|OFF)\s*.*$") + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + for line in conn.before.splitlines(): + if list_re.search(line): + outlets[list_re.search(line).group(2)] = ("", list_re.search(line).group(3)) + elif options["--drac-version"] == "DRAC 5": + ## DRAC 5 can be used only for one computer + ## standard fence library can't handle correctly situation + ## when some fence devices supported by fence agent + ## works with 'list' and other should returns 'N/A' + print("N/A") + + return outlets + +def define_new_opts(): + all_opt["drac_version"] = { + "getopt" : "d:", + "longopt" : "drac-version", + "help" : "-d, --drac-version=[version] Force DRAC version to use (DRAC 5|DRAC CMC|DRAC MC)", + "required" : "0", + "shortdesc" : "Force DRAC version to use", + "choices" : ["DRAC CMC", "DRAC MC", "DRAC 5"], + "order" : 1} + +def main(): + device_opt = ["ipaddr", "login", "passwd", "cmd_prompt", "secure", \ + "drac_version", "port", "no_port", "telnet"] + + atexit.register(atexit_handler) + + define_new_opts() + + all_opt["cmd_prompt"]["default"] = [r"\$", r"DRAC\/MC:"] + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for Dell DRAC CMC/5" + docs["longdesc"] = "fence_drac5 is an I/O Fencing agent \ +which can be used with the Dell Remote Access Card v5 or CMC (DRAC). \ +This device provides remote access to controlling power to a server. \ +It logs into the DRAC through the telnet/ssh interface of the card. \ +By default, the telnet interface is not enabled." + docs["vendorurl"] = "http://www.dell.com" + show_docs(options, docs) + + ## + ## Operate the fencing device + ###### + conn = fence_login(options) + + if "--drac-version" not in options: + ## autodetect from text issued by fence device + if conn.before.find("CMC") >= 0: + options["--drac-version"] = "DRAC CMC" + elif conn.before.find("DRAC 5") >= 0: + options["--drac-version"] = "DRAC 5" + elif conn.after.find("DRAC/MC") >= 0: + options["--drac-version"] = "DRAC MC" + else: + ## Assume this is DRAC 5 by default as we don't want to break anything + options["--drac-version"] = "DRAC 5" + + if options["--drac-version"] in ["DRAC MC", "DRAC CMC"]: + if "--plug" not in options and 0 == ["monitor", "list"].count(options["--action"]): + fail_usage("Failed: You have to enter module name (-n)") + + result = fence_action(conn, options, set_power_status, get_power_status, get_list_devices) + fence_logout(conn, "exit", 1) + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/dummy/fence_dummy.py b/agents/dummy/fence_dummy.py new file mode 100644 index 0000000..8fa2d9a --- /dev/null +++ b/agents/dummy/fence_dummy.py @@ -0,0 +1,133 @@ +#!@PYTHON@ -tt + +import sys, random +import logging +import time +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail_usage, run_delay + +plug_status = "on" + +def get_power_status_file(conn, options): + del conn + + try: + status_file = open(options["--status-file"], 'r') + except Exception: + return "off" + + status = status_file.read() + status_file.close() + + return status.lower() + +def set_power_status_file(conn, options): + del conn + + if not (options["--action"] in ["on", "off"]): + return + + status_file = open(options["--status-file"], 'w') + status_file.write(options["--action"]) + status_file.close() + +def get_power_status_fail(conn, options): + outlets = get_outlets_fail(conn, options) + + if len(outlets) == 0 or "--plug" not in options: + fail_usage("Failed: You have to enter existing machine!") + else: + return outlets[options["--plug"]][0] + +def set_power_status_fail(conn, options): + global plug_status + del conn + + plug_status = "unknown" + if options["--action"] == "on": + plug_status = "off" + +def get_outlets_fail(conn, options): + del conn + + result = {} + global plug_status + + if options["--action"] == "on": + plug_status = "off" + + # This fake agent has no port data to list, so we have to make + # something up for the list action. + if options.get("--action", None) == "list": + result["fake_port_1"] = [plug_status, "fake"] + result["fake_port_2"] = [plug_status, "fake"] + elif "--plug" not in options: + fail_usage("Failed: You have to enter existing machine!") + else: + port = options["--plug"] + result[port] = [plug_status, "fake"] + + return result + +def main(): + device_opt = ["no_password", "status_file", "random_sleep_range", "type", "no_port"] + + atexit.register(atexit_handler) + + all_opt["status_file"] = { + "getopt" : ":", + "longopt" : "status-file", + "help":"--status-file=[file] Name of file that holds current status", + "required" : "0", + "shortdesc" : "File with status", + "default" : "/tmp/fence_dummy.status", + "order": 1 + } + + all_opt["random_sleep_range"] = { + "getopt" : ":", + "longopt" : "random_sleep_range", + "help":"--random_sleep_range=[seconds] Issue a sleep between 1 and [seconds]", + "required" : "0", + "shortdesc" : "Issue a sleep between 1 and X seconds. Used for testing.", + "order": 1 + } + + all_opt["type"] = { + "getopt" : ":", + "longopt" : "type", + "help":"--type=[type] Possible types are: file and fail", + "required" : "0", + "shortdesc" : "Type of the dummy fence agent", + "default" : "file", + "order": 1 + } + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Dummy fence agent" + docs["longdesc"] = "fence_dummy" + docs["vendorurl"] = "http://www.example.com" + show_docs(options, docs) + + run_delay(options) + + # random sleep for testing + if "--random_sleep_range" in options: + val = int(options["--random_sleep_range"]) + ran = random.randint(1, val) + logging.info("Random sleep for %d seconds\n", ran) + time.sleep(ran) + + if options["--type"] == "fail": + result = fence_action(None, options, set_power_status_fail, get_power_status_fail, get_outlets_fail) + else: + result = fence_action(None, options, set_power_status_file, get_power_status_file, None) + + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/eaton_snmp/README b/agents/eaton_snmp/README new file mode 100644 index 0000000..82619d7 --- /dev/null +++ b/agents/eaton_snmp/README @@ -0,0 +1,20 @@ +This is an snmp based fence agent for Eaton power distribution units to be used +with RHEL4 Red Hat Cluster Suite. + +In order to use this agent, you will need to have net-snmp-utils installed +on every node in your cluster. net-snmp-utils is scheduled for inclusion +in the base RHEL distribution for Update 4, and is yummable in FC5. + +To use the agent, cp the agent to the /sbin directory on every +cluster node. + +Then define a in the cluster.conf file with +agent="fence_eaton_snmp" as an attribute, and use it that way. +Note, please, that the GUI does not support this agent yet, and you will have +to edit your cluster.conf by hand and then propagate it yourself. If you need +help with this, email me at the address below. + +The interface for the fence_eaton_snmp agent is identical to the existing +fence_apc_snmp agent, upon which it has been derived. + +--Arnaud Quette - ArnaudQuette@Eaton.com diff --git a/agents/eaton_snmp/fence_eaton_snmp.py b/agents/eaton_snmp/fence_eaton_snmp.py new file mode 100644 index 0000000..9fbc056 --- /dev/null +++ b/agents/eaton_snmp/fence_eaton_snmp.py @@ -0,0 +1,229 @@ +#!@PYTHON@ -tt + +# The Following agent has been tested on: +# - Eaton ePDU Managed - SNMP v1 +# EATON | Powerware ePDU model: Managed ePDU (PW104MA0UB99), firmware: 01.01.01 +# - Eaton ePDU Switched - SNMP v1 +# EATON | Powerware ePDU model: Switched ePDU (IPV3600), firmware: 2.0.K + +import sys +import atexit +import logging +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail_usage +from fencing_snmp import FencingSnmp + +### CONSTANTS ### +# oid defining fence device +OID_SYS_OBJECT_ID = '.1.3.6.1.2.1.1.2.0' + +### GLOBAL VARIABLES ### +# Device - see EatonManagedePDU, EatonSwitchedePDU +device = None + +# Port ID +port_id = None +# Switch ID +switch_id = None + +# Did we issue a set before get (to adjust OID with Switched ePDU) +after_set = False + +# Classes describing Device params +# Managed ePDU +class EatonManagedePDU(object): + status_oid = '.1.3.6.1.4.1.534.6.6.6.1.2.2.1.3.%d' + control_oid = '.1.3.6.1.4.1.534.6.6.6.1.2.2.1.3.%d' + outlet_table_oid = '.1.3.6.1.4.1.534.6.6.6.1.2.2.1.1' + ident_str = "Eaton Managed ePDU" + state_off = 0 + state_on = 1 + state_cycling = 2 # FIXME: not usable with fence-agents + turn_off = 0 + turn_on = 1 + turn_cycle = 2 # FIXME: not usable with fence-agents + has_switches = False + +# Switched ePDU (Pulizzi 2) +# NOTE: sysOID reports "20677.1", while data are actually at "20677.2" +class EatonSwitchedePDU(object): + status_oid = '.1.3.6.1.4.1.20677.2.6.3.%d.0' + control_oid = '.1.3.6.1.4.1.20677.2.6.2.%d.0' + outlet_table_oid = '.1.3.6.1.4.1.20677.2.6.3' + ident_str = "Eaton Switched ePDU" + state_off = 2 + state_on = 1 + state_cycling = 0 # Note: this status doesn't exist on this device + turn_off = 2 + turn_on = 1 + turn_cycle = 3 # FIXME: not usable with fence-agents + has_switches = False + +### FUNCTIONS ### +def eaton_set_device(conn): + global device + + agents_dir = {'.1.3.6.1.4.1.534.6.6.6':EatonManagedePDU, + '.1.3.6.1.4.1.20677.1':EatonSwitchedePDU, + '.1.3.6.1.4.1.20677.2':EatonSwitchedePDU} + + # First resolve type of Eaton + eaton_type = conn.walk(OID_SYS_OBJECT_ID) + + if not ((len(eaton_type) == 1) and (eaton_type[0][1] in agents_dir)): + eaton_type = [[None, None]] + + device = agents_dir[eaton_type[0][1]] + + logging.debug("Trying %s"%(device.ident_str)) + +def eaton_resolv_port_id(conn, options): + global port_id, switch_id + + if device == None: + eaton_set_device(conn) + + # Restore the increment, that was removed in main for ePDU Managed + if device.ident_str == "Eaton Switched ePDU": + options["--plug"] = str(int(options["--plug"]) + 1) + + # Now we resolv port_id/switch_id + if options["--plug"].isdigit() and ((not device.has_switches) or (options["--switch"].isdigit())): + port_id = int(options["--plug"]) + + if device.has_switches: + switch_id = int(options["--switch"]) + else: + table = conn.walk(device.outlet_table_oid, 30) + + for x in table: + if x[1].strip('"') == options["--plug"]: + t = x[0].split('.') + if device.has_switches: + port_id = int(t[len(t)-1]) + switch_id = int(t[len(t)-3]) + else: + if device.ident_str == "Eaton Switched ePDU": + port_id = int(t[len(t)-3]) + else: + port_id = int(t[len(t)-1]) + + if port_id == None: + # Restore index offset, to provide a valid error output on Managed ePDU + if device.ident_str != "Eaton Switched ePDU": + options["--plug"] = str(int(options["--plug"]) + 1) + fail_usage("Can't find port with name %s!"%(options["--plug"])) + +def get_power_status(conn, options): + global port_id, after_set + + if port_id == None: + eaton_resolv_port_id(conn, options) + + # Ajust OID for Switched ePDU when the get is after a set + if after_set and device.ident_str == "Eaton Switched ePDU": + port_id -= 1 + after_set = False + + oid = ((device.has_switches) and device.status_oid%(switch_id, port_id) or device.status_oid%(port_id)) + + try: + (oid, status) = conn.get(oid) + if status == str(device.state_on): + return "on" + elif status == str(device.state_off): + return "off" + else: + return None + except Exception: + return None + +def set_power_status(conn, options): + global port_id, after_set + + after_set = True + + if port_id == None: + eaton_resolv_port_id(conn, options) + + # Controls start at #2 on Switched ePDU, since #1 is the global command + if device.ident_str == "Eaton Switched ePDU": + port_id = int(port_id)+1 + + oid = ((device.has_switches) and device.control_oid%(switch_id, port_id) or device.control_oid%(port_id)) + + conn.set(oid, (options["--action"] == "on" and device.turn_on or device.turn_off)) + + +def get_outlets_status(conn, options): + outletCount = 0 + result = {} + + if device == None: + eaton_set_device(conn) + + res_ports = conn.walk(device.outlet_table_oid, 30) + + for x in res_ports: + outletCount += 1 + status = x[1] + t = x[0].split('.') + + # Plug indexing start from zero, so we substract '1' from the + # user's given plug number + if device.ident_str == "Eaton Managed ePDU": + port_num = str(int(((device.has_switches) and + "%s:%s"%(t[len(t)-3], t[len(t)-1]) or "%s"%(t[len(t)-1]))) + 1) + + # Plug indexing start from zero, so we add '1' + # for the user's exposed plug number + port_name = str(int(x[1].strip('"')) + 1) + port_status = "" + result[port_num] = (port_name, port_status) + else: + # Switched ePDU do not propose an outletCount OID! + # Invalid status (ie value == '0'), retrieved via the walk, + # means the outlet is absent + port_num = str(outletCount) + port_name = str(outletCount) + port_status = "" + if status != '0': + result[port_num] = (port_name, port_status) + + return result + +# Main agent method +def main(): + device_opt = ["ipaddr", "login", "passwd", "no_login", "no_password", \ + "port", "snmp_version", "snmp"] + + atexit.register(atexit_handler) + + all_opt["switch"]["default"] = 1 + all_opt["power_wait"]["default"] = 2 + all_opt["snmp_version"]["default"] = "1" + all_opt["community"]["default"] = "private" + options = check_input(device_opt, process_input(device_opt)) + + # Plug indexing start from zero on ePDU Managed, so we substract '1' from + # the user's given plug number. + # For Switched ePDU, we will add this back again later. + if "--plug" in options and options["--plug"].isdigit(): + options["--plug"] = str(int(options["--plug"]) - 1) + + docs = {} + docs["shortdesc"] = "Fence agent for Eaton over SNMP" + docs["longdesc"] = "fence_eaton_snmp is an I/O Fencing agent \ +which can be used with the Eaton network power switch. It logs \ +into a device via SNMP and reboots a specified outlet. It supports \ +SNMP v1 and v3 with all combinations of authenticity/privacy settings." + docs["vendorurl"] = "http://powerquality.eaton.com" + show_docs(options, docs) + + # Operate the fencing device + result = fence_action(FencingSnmp(options), options, set_power_status, get_power_status, get_outlets_status) + + sys.exit(result) +if __name__ == "__main__": + main() diff --git a/agents/ecloud/fence_ecloud.py b/agents/ecloud/fence_ecloud.py new file mode 100644 index 0000000..0707e10 --- /dev/null +++ b/agents/ecloud/fence_ecloud.py @@ -0,0 +1,169 @@ +#!@PYTHON@ -tt +# +# Fence agent for eCloud and eCloud VPC +# https://www.ans.co.uk/cloud-and-infrastructure/ecloud/ +# +# Copyright (c) 2022 ANS Group Limited +# +# 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, see +# . + +import sys +import time +import atexit +import logging +import requests +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import run_delay, fail_usage, fail, EC_TIMED_OUT + +API_BASE = "https://api.ukfast.io/ecloud" +API_MONITOR = API_BASE + "/ping" +API_VPC_INSTANCE_DATA = API_BASE + "/v2/instances/:ID" +API_VPC_POWER_ON = API_BASE + "/v2/instances/:ID/power-on" +API_VPC_POWER_OFF = API_BASE + "/v2/instances/:ID/power-off" +API_V1_INSTANCE_DATA = API_BASE + "/v1/vms/:ID" +API_V1_POWER_ON = API_BASE + "/v1/vms/:ID/power-on" +API_V1_POWER_OFF = API_BASE + "/v1/vms/:ID/power-off" + + +def set_power_fn(conn, options): + logging.debug("setting power {}".format(options['--action'])) + del conn + + action = options['--action'] + vpc = options['--ecloud-vpc'] + plug = options['--plug'] + + url = fence_url(vpc, action, plug) + hdrs = headers(options['--apikey']) + + logging.info("executing '{}' action on '{}'".format(action, plug)) + + retries = 0 + while True: + resp = requests.put(url, headers=hdrs) + if resp.status_code == 409: + # If we attempt to power the instance back on too soon after powering it off, + # e.g. during a reboot, the API will return a 409 because while the power status + # has changed, the task is still executing. Retry the action until we exceed + # retries or get a different status code. + if retries >= 6: + logging.error("timed out trying to execute '{}' action after repeated 409 codes from API", action) + fail(EC_TIMED_OUT) + + time.sleep(2) + retries += 1 + continue + + if resp.status_code != 202: + logging.error("unexpected status code '{}' from endpoint '{}': {}".format( + resp.status_code, url, resp.text + )) + + break + + +def get_power_fn(conn, options): + logging.debug("getting power state") + del conn + + vpc = options['--ecloud-vpc'] + plug = options['--plug'] + + url = instance_data_url(vpc, plug) + hdrs = headers(options['--apikey']) + + resp = requests.get(url, headers=hdrs) + if resp.status_code != 200: + logging.error("unexpected status code ('{}') from endpoint '{}': {}".format( + resp.status_code, url, resp.text + )) + return "bad status {}".format(resp.status_code) + + instance = resp.json()['data'] + if vpc: + logging.debug("power state return value: {}".format(instance['online'])) + return "on" if instance['online'] else "off" + else: + if instance['power_status'] == "Online": + return "on" + elif instance['power_status'] == "Offline": + return "off" + else: + # Could be 'Unknown' or other value + return instance['power_status'] + + +def headers(apikey): + return { + "Authorization": apikey, + "User-Agent": "fence_ecloud" + } + + +def itp(url, plug): + return url.replace(':ID', plug) + + +def fence_url(vpc, action, plug): + if action == "on": + return itp(API_VPC_POWER_ON, plug) if vpc else itp(API_V1_POWER_ON, plug) + if action == "off": + return itp(API_VPC_POWER_OFF, plug) if vpc else itp(API_V1_POWER_OFF, plug) + + fail_usage("no available API configured for action '{}'".format(action)) + + +def instance_data_url(vpc, plug): + return itp(API_VPC_INSTANCE_DATA, plug) if vpc else itp(API_V1_INSTANCE_DATA, plug) + + +def main(): + device_opt = ["apikey", "port", "no_login", "no_password"] + + all_opt["apikey"] = { + "getopt": ":", + "longopt": "apikey", + "help": "--apikey=[key] eCloud API Key", + "required": "1", + "shortdesc": "API Key", + "order": 0, + } + all_opt["port"]["help"] = "-n, --plug=[instance] Instance ID (VPC) or server ID (v1)" + + atexit.register(atexit_handler) + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence Agent for ANS eCloud" + docs["longdesc"] = "fence_ecloud is a fence agent for use with the ANS \ +eCloud platform which is compatible with eCloud VPC and eCloud v1." + docs["vendorurl"] = "https://www.ans.co.uk" + show_docs(options, docs) + + if options['--action'] in ['on', 'off', 'reboot', 'status']: + plug = options['--plug'] + + options['--ecloud-vpc'] = True + if not plug.startswith("i-"): + options['--ecloud-vpc'] = False + + run_delay(options) + fence_action(None, options, set_power_fn, get_power_fn) + + +if __name__ == '__main__': + main() diff --git a/agents/emerson/fence_emerson.py b/agents/emerson/fence_emerson.py new file mode 100644 index 0000000..2e65cda --- /dev/null +++ b/agents/emerson/fence_emerson.py @@ -0,0 +1,62 @@ +#!@PYTHON@ -tt + +import sys +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing_snmp import FencingSnmp + +### CONSTANTS ### +STATUSES_OID = ".1.3.6.1.4.1.476.1.42.3.8.50.20.1.95" +CONTROL_OID = ".1.3.6.1.4.1.476.1.42.3.8.50.20.1.100" +NAMES_OID = ".1.3.6.1.4.1.476.1.42.3.8.50.20.1.10" + +# Status constants returned as value from SNMP +STATUS_DOWN = 1 +STATUS_UP = 2 + +# Status constants to set as value to SNMP +STATUS_SET_OFF = 0 +STATUS_SET_ON = 1 + +def get_power_status(conn, options): + (_, status) = conn.get("%s.%s"% (STATUSES_OID, options["--plug"])) + return status == str(STATUS_UP) and "on" or "off" + +def set_power_status(conn, options): + conn.set("%s.%s" % (CONTROL_OID, options["--plug"]), + (options["--action"] == "on" and STATUS_SET_ON or STATUS_SET_OFF)) + +def get_outlets_status(conn, _): + result = {} + res_outlet = conn.walk(STATUSES_OID, 30) + + for outlet_info in res_outlet: + port_num = ".".join(outlet_info[0].split('.')[-3:]) + port_alias = conn.get("%s.%s"% (NAMES_OID, port_num))[1] + port_status = (outlet_info[1] == str(STATUS_UP) and "on" or "off") + result[port_num] = (port_alias, port_status) + return result + +def main(): + device_opt = ["ipaddr", "login", "passwd", "no_login", "no_password", \ + "port", "snmp_version", "snmp"] + + atexit.register(atexit_handler) + + all_opt["power_wait"]["default"] = "5" + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for Emerson over SNMP" + docs["longdesc"] = "fence_emerson is an I/O Fencing agent \ + which can be used with MPX and MPH2 managed rack PDU." + docs["vendorurl"] = "http://www.emersonnetworkpower.com" + show_docs(options, docs) + + # Operate the fencing device + result = fence_action(FencingSnmp(options), options, set_power_status, get_power_status, get_outlets_status) + + sys.exit(result) +if __name__ == "__main__": + main() diff --git a/agents/eps/fence_eps.py b/agents/eps/fence_eps.py new file mode 100644 index 0000000..f0df862 --- /dev/null +++ b/agents/eps/fence_eps.py @@ -0,0 +1,129 @@ +#!@PYTHON@ -tt + +# The Following Agent Has Been Tested On: +# ePowerSwitch 8M+ version 1.0.0.4 + +import sys, re +import base64, string, socket +import logging +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, fail_usage, EC_LOGIN_DENIED, EC_TIMED_OUT, run_delay + +if sys.version_info[0] > 2: + import http.client as httplib +else: + import httplib + +# Run command on EPS device. +# @param options Device options +# @param params HTTP GET parameters (without ?) +def eps_run_command(options, params): + try: + # New http connection + conn = httplib.HTTPConnection(options["--ip"]) + + request_str = "/"+options["--page"] + + if params != "": + request_str += "?"+params + + logging.debug("GET %s\n", request_str) + conn.putrequest('GET', request_str) + + if "--username" in options: + if "--password" not in options: + options["--password"] = "" # Default is empty password + + # String for Authorization header + auth_str = 'Basic ' + string.strip(base64.encodestring(options["--username"]+':'+options["--password"])) + logging.debug("Authorization: %s\n", auth_str) + conn.putheader('Authorization', auth_str) + + conn.endheaders() + + response = conn.getresponse() + + logging.debug("%d %s\n", response.status, response.reason) + + #Response != OK -> couldn't login + if response.status != 200: + fail(EC_LOGIN_DENIED) + + result = response.read() + logging.debug("%s \n", result) + conn.close() + except socket.timeout: + fail(EC_TIMED_OUT) + except socket.error as e: + logging.error("Failed: {}".format(str(e))) + fail(EC_LOGIN_DENIED) + + return result + +def get_power_status(conn, options): + del conn + ret_val = eps_run_command(options, "") + + result = {} + status = re.findall(r"p(\d{2})=(0|1)\s*\", ret_val.lower()) + for out_num, out_stat in status: + result[out_num] = ("", (out_stat == "1" and "on" or "off")) + + if not options["--action"] in ['monitor', 'list']: + if not options["--plug"] in result: + fail_usage("Failed: You have to enter existing physical plug!") + else: + return result[options["--plug"]][1] + else: + return result + +def set_power_status(conn, options): + del conn + eps_run_command(options, "P%s=%s"%(options["--plug"], (options["--action"] == "on" and "1" or "0"))) + +# Define new option +def eps_define_new_opts(): + all_opt["hidden_page"] = { + "getopt" : "c:", + "longopt" : "page", + "help":"-c, --page=[page] Name of hidden page (default: hidden.htm)", + "required" : "0", + "shortdesc" : "Name of hidden page", + "default" : "hidden.htm", + "order": 1 + } + +# Starting point of fence agent +def main(): + device_opt = ["ipaddr", "login", "passwd", "no_login", "no_password", \ + "port", "hidden_page", "web"] + + atexit.register(atexit_handler) + + eps_define_new_opts() + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for ePowerSwitch" + docs["longdesc"] = "fence_eps is an I/O Fencing agent \ +which can be used with the ePowerSwitch 8M+ power switch to fence \ +connected machines. Fence agent works ONLY on 8M+ device, because \ +this is only one, which has support for hidden page feature. \ +\n.TP\n\ +Agent basically works by connecting to hidden page and pass \ +appropriate arguments to GET request. This means, that hidden \ +page feature must be enabled and properly configured." + docs["vendorurl"] = "http://www.epowerswitch.com" + show_docs(options, docs) + + run_delay(options) + #Run fence action. Conn is None, beacause we always need open new http connection + result = fence_action(None, options, set_power_status, get_power_status, get_power_status) + + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/evacuate/fence_evacuate.py b/agents/evacuate/fence_evacuate.py new file mode 100644 index 0000000..53d6fd1 --- /dev/null +++ b/agents/evacuate/fence_evacuate.py @@ -0,0 +1,428 @@ +#!@PYTHON@ -tt + +import sys +import time +import atexit +import logging +import inspect +import requests.exceptions + +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail_usage, is_executable, run_command, run_delay + +EVACUABLE_TAG = "evacuable" +TRUE_TAGS = ['true'] + +def get_power_status(connection, options): + + status = "unknown" + logging.debug("get action: " + options["--action"]) + + if connection: + try: + services = connection.services.list(host=options["--plug"], binary="nova-compute") + for service in services: + logging.debug("Status of %s is %s, %s" % (service.binary, service.state, service.status)) + if service.state == "up" and service.status == "enabled": + # Up and operational + status = "on" + + elif service.state == "down" and service.status == "disabled": + # Down and fenced + status = "off" + + elif service.state == "down": + # Down and requires fencing + status = "failed" + + elif service.state == "up": + # Up and requires unfencing + status = "running" + else: + logging.warning("Unknown status detected from nova for %s: %s, %s" % (options["--plug"], service.state, service.status)) + status = "%s %s" % (service.state, service.status) + break + except requests.exception.ConnectionError as err: + logging.warning("Nova connection failed: " + str(err)) + return status + +# NOTE(sbauza); We mimic the host-evacuate module since it's only a contrib +# module which is not stable +def _server_evacuate(connection, server, on_shared_storage): + success = False + error_message = "" + try: + logging.debug("Resurrecting instance: %s" % server) + (response, dictionary) = connection.servers.evacuate(server=server, on_shared_storage=on_shared_storage) + + if response == None: + error_message = "No response while evacuating instance" + elif response.status_code == 200: + success = True + error_message = response.reason + else: + error_message = response.reason + + except Exception as e: + error_message = "Error while evacuating instance: %s" % e + + return { + "uuid": server, + "accepted": success, + "reason": error_message, + } + +def _is_server_evacuable(server, evac_flavors, evac_images): + reason = "flavor "+server.flavor.get('id') + if server.flavor.get('id') in evac_flavors: + return True + if hasattr(server.image, 'get'): + if server.image.get('id') in evac_images: + return True + reason = reason +" and image "+server.image.get('id') + + logging.debug("Instance is not evacuable: no match for %s" % reason) + return False + +def _get_evacuable_flavors(connection): + result = [] + flavors = connection.flavors.list(is_public=None) + # Since the detailed view for all flavors doesn't provide the extra specs, + # we need to call each of the flavor to get them. + for flavor in flavors: + tag = flavor.get_keys().get(EVACUABLE_TAG) + if tag and tag.strip().lower() in TRUE_TAGS: + result.append(flavor.id) + return result + +def _get_evacuable_images(connection): + result = [] + images = [] + if hasattr(connection, "images"): + images = connection.images.list(detailed=True) + elif hasattr(connection, "glance"): + # OSP12+ + images = connection.glance.list() + + for image in images: + if hasattr(image, 'metadata'): + tag = image.metadata.get(EVACUABLE_TAG) + if tag and tag.strip().lower() in TRUE_TAGS: + result.append(image.id) + elif hasattr(image, 'tags'): + # OSP12+ + if EVACUABLE_TAG in image.tags: + result.append(image.id) + return result + +def _host_evacuate(connection, options): + result = True + images = _get_evacuable_images(connection) + flavors = _get_evacuable_flavors(connection) + servers = connection.servers.list(search_opts={'host': options["--plug"], 'all_tenants': 1 }) + + if options["--instance-filtering"] == "False": + logging.debug("Not evacuating anything") + evacuables = [] + elif len(flavors) or len(images): + logging.debug("Filtering images and flavors: %s %s" % (repr(flavors), repr(images))) + # Identify all evacuable servers + logging.debug("Checking %s" % repr(servers)) + evacuables = [server for server in servers + if _is_server_evacuable(server, flavors, images)] + logging.debug("Evacuating %s" % repr(evacuables)) + else: + logging.debug("Evacuating all images and flavors") + evacuables = servers + + if options["--no-shared-storage"] != "False": + on_shared_storage = False + else: + on_shared_storage = True + + for server in evacuables: + logging.debug("Processing %s" % server) + if hasattr(server, 'id'): + response = _server_evacuate(connection, server.id, on_shared_storage) + if response["accepted"]: + logging.debug("Evacuated %s from %s: %s" % + (response["uuid"], options["--plug"], response["reason"])) + else: + logging.error("Evacuation of %s on %s failed: %s" % + (response["uuid"], options["--plug"], response["reason"])) + result = False + else: + logging.error("Could not evacuate instance: %s" % server.to_dict()) + # Should a malformed instance result in a failed evacuation? + # result = False + return result + +def set_attrd_status(host, status, options): + logging.debug("Setting fencing status for %s to %s" % (host, status)) + run_command(options, "attrd_updater -p -n evacuate -Q -N %s -U %s" % (host, status)) + +def set_power_status(connection, options): + logging.debug("set action: " + options["--action"]) + + if not connection: + return + + if options["--action"] == "off" and not _host_evacuate(options): + sys.exit(1) + + sys.exit(0) + +def get_plugs_list(connection, options): + result = {} + + if connection: + services = connection.services.list(binary="nova-compute") + for service in services: + longhost = service.host + shorthost = longhost.split('.')[0] + result[longhost] = ("", None) + result[shorthost] = ("", None) + return result + +def create_nova_connection(options): + nova = None + + try: + from novaclient import client + from novaclient.exceptions import NotAcceptable + except ImportError: + fail_usage("Nova not found or not accessible") + + from keystoneauth1 import loading + from keystoneauth1 import session + from keystoneclient import discover + + # Prefer the oldest and strip the leading 'v' + keystone_versions = discover.available_versions(options["--auth-url"]) + keystone_version = keystone_versions[0]['id'][1:] + kwargs = dict( + auth_url=options["--auth-url"], + username=options["--username"], + password=options["--password"] + ) + + if discover.version_match("2", keystone_version): + kwargs["tenant_name"] = options["--tenant-name"] + + elif discover.version_match("3", keystone_version): + kwargs["project_name"] = options["--tenant-name"] + kwargs["user_domain_name"] = options["--user-domain"] + kwargs["project_domain_name"] = options["--project-domain"] + + loader = loading.get_plugin_loader('password') + keystone_auth = loader.load_from_options(**kwargs) + keystone_session = session.Session(auth=keystone_auth, verify=not "--insecure" in options) + + versions = [ "2.11", "2" ] + for version in versions: + clientargs = inspect.getargspec(client.Client).varargs + + # Some versions of Openstack prior to Ocata only + # supported positional arguments for username, + # password, and tenant. + # + # Versions since Ocata only support named arguments. + # + # So we need to use introspection to figure out how to + # create a Nova client. + # + # Happy days + # + if clientargs: + # OSP < 11 + # ArgSpec(args=['version', 'username', 'password', 'project_id', 'auth_url'], + # varargs=None, + # keywords='kwargs', defaults=(None, None, None, None)) + nova = client.Client(version, + None, # User + None, # Password + None, # Tenant + None, # Auth URL + insecure="--insecure" in options, + region_name=options["--region-name"], + endpoint_type=options["--endpoint-type"], + session=keystone_session, auth=keystone_auth, + http_log_debug="--verbose" in options) + else: + # OSP >= 11 + # ArgSpec(args=['version'], varargs='args', keywords='kwargs', defaults=None) + nova = client.Client(version, + region_name=options["--region-name"], + endpoint_type=options["--endpoint-type"], + session=keystone_session, auth=keystone_auth, + http_log_debug="--verbose" in options) + + try: + nova.hypervisors.list() + return nova + + except NotAcceptable as e: + logging.warning(e) + + except Exception as e: + logging.warning("Nova connection failed. %s: %s" % (e.__class__.__name__, e)) + + logging.warning("Couldn't obtain a supported connection to nova, tried: %s\n" % repr(versions)) + return None + +def define_new_opts(): + all_opt["endpoint_type"] = { + "getopt" : "e:", + "longopt" : "endpoint-type", + "help" : "-e, --endpoint-type=[endpoint] Nova Endpoint type (publicURL, internalURL, adminURL)", + "required" : "0", + "shortdesc" : "Nova Endpoint type", + "default" : "internalURL", + "order": 1, + } + all_opt["tenant_name"] = { + "getopt" : "t:", + "longopt" : "tenant-name", + "help" : "-t, --tenant-name=[name] Keystone v2 Tenant or v3 Project Name", + "required" : "0", + "shortdesc" : "Keystone Admin Tenant or v3 Project", + "default" : "", + "order": 1, + } + all_opt["user-domain"] = { + "getopt" : "u:", + "longopt" : "user-domain", + "help" : "-u, --user-domain=[name] Keystone v3 User Domain", + "required" : "0", + "shortdesc" : "Keystone v3 User Domain", + "default" : "Default", + "order": 2, + } + all_opt["project-domain"] = { + "getopt" : "P:", + "longopt" : "project-domain", + "help" : "-P, --project-domain=[name] Keystone v3 Project Domain", + "required" : "0", + "shortdesc" : "Keystone v3 Project Domain", + "default" : "Default", + "order": 2, + } + all_opt["auth_url"] = { + "getopt" : "k:", + "longopt" : "auth-url", + "help" : "-k, --auth-url=[url] Keystone Admin Auth URL", + "required" : "0", + "shortdesc" : "Keystone Admin Auth URL", + "default" : "", + "order": 1, + } + all_opt["region_name"] = { + "getopt" : ":", + "longopt" : "region-name", + "help" : "--region-name=[region] Region Name", + "required" : "0", + "shortdesc" : "Region Name", + "default" : "", + "order": 1, + } + all_opt["insecure"] = { + "getopt" : "", + "longopt" : "insecure", + "help" : "--insecure Explicitly allow agent to perform \"insecure\" TLS (https) requests", + "required" : "0", + "shortdesc" : "Allow Insecure TLS Requests", + "order": 2, + } + all_opt["domain"] = { + "getopt" : "d:", + "longopt" : "domain", + "help" : "-d, --domain=[string] DNS domain in which hosts live, useful when the cluster uses short names and nova uses FQDN", + "required" : "0", + "shortdesc" : "DNS domain in which hosts live", + "order": 5, + } + all_opt["instance_filtering"] = { + "getopt" : "", + "longopt" : "instance-filtering", + "help" : "--instance-filtering Allow instances created from images and flavors with evacuable=true to be evacuated (or all if no images/flavors have been tagged)", + "required" : "0", + "shortdesc" : "Allow instances to be evacuated", + "default" : "True", + "order": 5, + } + all_opt["no_shared_storage"] = { + "getopt" : "", + "longopt" : "no-shared-storage", + "help" : "--no-shared-storage Disable functionality for shared storage", + "required" : "0", + "shortdesc" : "Disable functionality for dealing with shared storage", + "default" : "False", + "order": 5, + } + all_opt["compute-domain"] = { + "getopt" : ":", + "longopt" : "compute-domain", + "help" : "--compute-domain=[string] Replaced by --domain", + "required" : "0", + "shortdesc" : "Replaced by domain", + "order": 6, + } + +def main(): + atexit.register(atexit_handler) + + device_opt = ["login", "passwd", "tenant_name", "auth_url", + "no_login", "no_password", "port", "domain", "compute-domain", + "project-domain", "user-domain", "no_shared_storage", + "endpoint_type", "instance_filtering", "insecure", "region_name"] + define_new_opts() + all_opt["shell_timeout"]["default"] = "180" + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for the automatic resurrection of OpenStack compute instances" + docs["longdesc"] = "Used to reschedule flagged instances" + docs["vendorurl"] = "" + + show_docs(options, docs) + + run_delay(options) + + # workaround to avoid regressions + if "--compute-domain" in options and options["--compute-domain"]: + options["--domain"] = options["--compute-domain"] + del options["--domain"] + + + # Disable insecure-certificate-warning message + if "--insecure" in options: + import urllib3 + urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + + connection = create_nova_connection(options) + + # Un-evacuating a server doesn't make sense + if options["--action"] in ["on"]: + logging.error("Action %s is not supported by this agent" % (options["--action"])) + sys.exit(1) + + if options["--action"] in ["off", "reboot"]: + status = get_power_status(connection, options) + if status != "off": + logging.error("Cannot resurrect instances from %s in state '%s'" % (options["--plug"], status)) + sys.exit(1) + + elif not _host_evacuate(connection, options): + logging.error("Resurrection of instances from %s failed" % (options["--plug"])) + sys.exit(1) + + logging.info("Resurrection of instances from %s complete" % (options["--plug"])) + sys.exit(0) + + result = fence_action(connection, options, set_power_status, get_power_status, get_plugs_list, None) + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/gce/fence_gce.py b/agents/gce/fence_gce.py new file mode 100644 index 0000000..2c815b8 --- /dev/null +++ b/agents/gce/fence_gce.py @@ -0,0 +1,632 @@ +#!@PYTHON@ -tt + +# +# Requires the googleapiclient and oauth2client +# RHEL 7.x: google-api-python-client==1.6.7 python-gflags==2.0 pyasn1==0.4.8 rsa==3.4.2 pysocks==1.7.1 httplib2==0.19.0 +# RHEL 8.x: pysocks==1.7.1 httplib2==0.19.0 +# SLES 12.x: python-google-api-python-client python-oauth2client python-oauth2client-gce pysocks==1.7.1 httplib2==0.19.0 +# SLES 15.x: python3-google-api-python-client python3-oauth2client pysocks==1.7.1 httplib2==0.19.0 +# + +import atexit +import logging +import json +import re +import os +import socket +import sys +import time + +from ssl import SSLError + +if sys.version_info >= (3, 0): + # Python 3 imports. + import urllib.parse as urlparse + import urllib.request as urlrequest +else: + # Python 2 imports. + import urllib as urlparse + import urllib2 as urlrequest +sys.path.append("@FENCEAGENTSLIBDIR@") + +from fencing import fail_usage, run_delay, all_opt, atexit_handler, check_input, process_input, show_docs, fence_action, run_command +try: + import httplib2 + import googleapiclient.discovery + import socks + try: + from google.oauth2.credentials import Credentials as GoogleCredentials + except: + from oauth2client.client import GoogleCredentials +except: + pass + +VERSION = '1.0.5' +ACTION_IDS = { + 'on': 1, 'off': 2, 'reboot': 3, 'status': 4, 'list': 5, 'list-status': 6, + 'monitor': 7, 'metadata': 8, 'manpage': 9, 'validate-all': 10 +} +USER_AGENT = 'sap-core-eng/fencegce/%s/%s/ACTION/%s' +METADATA_SERVER = 'http://metadata.google.internal/computeMetadata/v1/' +METADATA_HEADERS = {'Metadata-Flavor': 'Google'} +INSTANCE_LINK = 'https://www.googleapis.com/compute/v1/projects/{}/zones/{}/instances/{}' + +def run_on_fail(options): + if "--runonfail" in options: + run_command(options, options["--runonfail"]) + +def fail_fence_agent(options, message): + run_on_fail(options) + fail_usage(message) + +def raise_fence_agent(options, message): + run_on_fail(options) + raise Exception(message) + +# +# Will use baremetalsolution setting or the environment variable +# FENCE_GCE_URI_REPLACEMENTS to replace the uri for calls to *.googleapis.com. +# +def replace_api_uri(options, http_request): + uri_replacements = [] + # put any env var replacements first, then baremetalsolution if in options + if "FENCE_GCE_URI_REPLACEMENTS" in os.environ: + logging.debug("FENCE_GCE_URI_REPLACEMENTS environment variable exists") + env_uri_replacements = os.environ["FENCE_GCE_URI_REPLACEMENTS"] + try: + uri_replacements_json = json.loads(env_uri_replacements) + if isinstance(uri_replacements_json, list): + uri_replacements = uri_replacements_json + else: + logging.warning("FENCE_GCE_URI_REPLACEMENTS exists, but is not a JSON List") + except ValueError as e: + logging.warning("FENCE_GCE_URI_REPLACEMENTS exists but is not valid JSON") + if "--baremetalsolution" in options: + uri_replacements.append( + { + "matchlength": 4, + "match": "https://compute.googleapis.com/compute/v1/projects/(.*)/zones/(.*)/instances/(.*)/reset(.*)", + "replace": "https://baremetalsolution.googleapis.com/v1/projects/\\1/locations/\\2/instances/\\3:resetInstance\\4" + }) + for uri_replacement in uri_replacements: + # each uri_replacement should have matchlength, match, and replace + if "matchlength" not in uri_replacement or "match" not in uri_replacement or "replace" not in uri_replacement: + logging.warning("FENCE_GCE_URI_REPLACEMENTS missing matchlength, match, or replace in %s" % uri_replacement) + continue + match = re.match(uri_replacement["match"], http_request.uri) + if match is None or len(match.groups()) != uri_replacement["matchlength"]: + continue + replaced_uri = re.sub(uri_replacement["match"], uri_replacement["replace"], http_request.uri) + match = re.match("https:\/\/.*.googleapis.com", replaced_uri) + if match is None or match.start() != 0: + logging.warning("FENCE_GCE_URI_REPLACEMENTS replace is not " + "targeting googleapis.com, ignoring it: %s" % replaced_uri) + continue + logging.debug("Replacing googleapis uri %s with %s" % (http_request.uri, replaced_uri)) + http_request.uri = replaced_uri + break + return http_request + +def retry_api_execute(options, http_request): + replaced_http_request = replace_api_uri(options, http_request) + action = ACTION_IDS[options["--action"]] if options["--action"] in ACTION_IDS else 0 + try: + user_agent_header = USER_AGENT % (VERSION, options["image"], action) + except ValueError: + user_agent_header = USER_AGENT % (VERSION, options["image"], 0) + replaced_http_request.headers["User-Agent"] = user_agent_header + logging.debug("User agent set as %s" % (user_agent_header)) + retries = 3 + if options.get("--retries"): + retries = int(options.get("--retries")) + retry_sleep = 5 + if options.get("--retrysleep"): + retry_sleep = int(options.get("--retrysleep")) + retry = 0 + current_err = None + while retry <= retries: + if retry > 0: + time.sleep(retry_sleep) + try: + return replaced_http_request.execute() + except Exception as err: + current_err = err + logging.warning("Could not execute api call to: %s, retry: %s, " + "err: %s" % (replaced_http_request.uri, retry, str(err))) + retry += 1 + raise current_err + + +def translate_status(instance_status): + "Returns on | off | unknown." + if instance_status == "RUNNING": + return "on" + elif instance_status == "TERMINATED": + return "off" + return "unknown" + + +def get_nodes_list(conn, options): + result = {} + plug = options["--plug"] if "--plug" in options else "" + zones = options["--zone"] if "--zone" in options else "" + if not zones: + zones = get_zone(conn, options, plug) if "--plugzonemap" not in options else options["--plugzonemap"][plug] + try: + for zone in zones.split(","): + instanceList = retry_api_execute(options, conn.instances().list( + project=options["--project"], + zone=zone)) + for instance in instanceList["items"]: + result[instance["id"]] = (instance["name"], translate_status(instance["status"])) + except Exception as err: + fail_fence_agent(options, "Failed: get_nodes_list: {}".format(str(err))) + + return result + + +def get_power_status(conn, options): + logging.debug("get_power_status") + # if this is bare metal we need to just send back the opposite of the + # requested action: if on send off, if off send on + if "--baremetalsolution" in options: + if options.get("--action") == "on": + return "off" + else: + return "on" + # If zone is not listed for an entry we attempt to get it automatically + instance = options["--plug"] + zone = get_zone(conn, options, instance) if "--plugzonemap" not in options else options["--plugzonemap"][instance] + instance_status = get_instance_power_status(conn, options, instance, zone) + # If any of the instances do not match the intended status we return the + # the opposite status so that the fence agent can change it. + if instance_status != options.get("--action"): + return instance_status + + return options.get("--action") + + +def get_instance_power_status(conn, options, instance, zone): + try: + instance = retry_api_execute( + options, + conn.instances().get(project=options["--project"], zone=zone, instance=instance)) + return translate_status(instance["status"]) + except Exception as err: + fail_fence_agent(options, "Failed: get_instance_power_status: {}".format(str(err))) + + +def check_for_existing_operation(conn, options, instance, zone, operation_type): + logging.debug("check_for_existing_operation") + if "--baremetalsolution" in options: + # There is no API for checking in progress operations + return False + + project = options["--project"] + target_link = INSTANCE_LINK.format(project, zone, instance) + query_filter = '(targetLink = "{}") AND (operationType = "{}") AND (status = "RUNNING")'.format(target_link, operation_type) + result = retry_api_execute( + options, + conn.zoneOperations().list(project=project, zone=zone, filter=query_filter, maxResults=1)) + + if "items" in result and result["items"]: + logging.info("Existing %s operation found", operation_type) + return result["items"][0] + + +def wait_for_operation(conn, options, zone, operation): + if 'name' not in operation: + logging.warning('Cannot wait for operation to complete, the' + ' requested operation will continue asynchronously') + return False + + wait_time = 0 + project = options["--project"] + while True: + result = retry_api_execute(options, conn.zoneOperations().get( + project=project, + zone=zone, + operation=operation['name'])) + if result['status'] == 'DONE': + if 'error' in result: + raise_fence_agent(options, result['error']) + return True + + if "--errortimeout" in options and wait_time > int(options["--errortimeout"]): + raise_fence_agent(options, "Operation did not complete before the timeout.") + + if "--warntimeout" in options and wait_time > int(options["--warntimeout"]): + logging.warning("Operation did not complete before the timeout.") + if "--runonwarn" in options: + run_command(options, options["--runonwarn"]) + return False + + wait_time = wait_time + 1 + time.sleep(1) + + +def set_power_status(conn, options): + logging.debug("set_power_status") + instance = options["--plug"] + # If zone is not listed for an entry we attempt to get it automatically + zone = get_zone(conn, options, instance) if "--plugzonemap" not in options else options["--plugzonemap"][instance] + set_instance_power_status(conn, options, instance, zone, options["--action"]) + + +def set_instance_power_status(conn, options, instance, zone, action): + logging.info("Setting power status of %s in zone %s", instance, zone) + project = options["--project"] + + try: + if action == "off": + logging.info("Issuing poweroff of %s in zone %s", instance, zone) + operation = check_for_existing_operation(conn, options, instance, zone, "stop") + if operation and "--earlyexit" in options: + return + if not operation: + operation = retry_api_execute( + options, + conn.instances().stop(project=project, zone=zone, instance=instance)) + logging.info("Poweroff command completed, waiting for the operation to complete") + if wait_for_operation(conn, options, zone, operation): + logging.info("Poweroff of %s in zone %s complete", instance, zone) + elif action == "on": + logging.info("Issuing poweron of %s in zone %s", instance, zone) + operation = check_for_existing_operation(conn, options, instance, zone, "start") + if operation and "--earlyexit" in options: + return + if not operation: + operation = retry_api_execute( + options, + conn.instances().start(project=project, zone=zone, instance=instance)) + if wait_for_operation(conn, options, zone, operation): + logging.info("Poweron of %s in zone %s complete", instance, zone) + except Exception as err: + fail_fence_agent(options, "Failed: set_instance_power_status: {}".format(str(err))) + +def power_cycle(conn, options): + logging.debug("power_cycle") + instance = options["--plug"] + # If zone is not listed for an entry we attempt to get it automatically + zone = get_zone(conn, options, instance) if "--plugzonemap" not in options else options["--plugzonemap"][instance] + return power_cycle_instance(conn, options, instance, zone) + + +def power_cycle_instance(conn, options, instance, zone): + logging.info("Issuing reset of %s in zone %s", instance, zone) + project = options["--project"] + + try: + operation = check_for_existing_operation(conn, options, instance, zone, "reset") + if operation and "--earlyexit" in options: + return True + if not operation: + operation = retry_api_execute( + options, + conn.instances().reset(project=project, zone=zone, instance=instance)) + logging.info("Reset command sent, waiting for the operation to complete") + if wait_for_operation(conn, options, zone, operation): + logging.info("Reset of %s in zone %s complete", instance, zone) + return True + except Exception as err: + logging.exception("Failed: power_cycle") + raise err + + +def get_zone(conn, options, instance): + logging.debug("get_zone"); + project = options['--project'] + fl = 'name="%s"' % instance + request = replace_api_uri(options, conn.instances().aggregatedList(project=project, filter=fl)) + while request is not None: + response = request.execute() + zones = response.get('items', {}) + for zone in zones.values(): + for inst in zone.get('instances', []): + if inst['name'] == instance: + return inst['zone'].split("/")[-1] + request = replace_api_uri(options, conn.instances().aggregatedList_next( + previous_request=request, previous_response=response)) + raise_fence_agent(options, "Unable to find instance %s" % (instance)) + + +def get_metadata(metadata_key, params=None, timeout=None): + """Performs a GET request with the metadata headers. + + Args: + metadata_key: string, the metadata to perform a GET request on. + params: dictionary, the query parameters in the GET request. + timeout: int, timeout in seconds for metadata requests. + + Returns: + HTTP response from the GET request. + + Raises: + urlerror.HTTPError: raises when the GET request fails. + """ + logging.debug("get_metadata"); + timeout = timeout or 60 + metadata_url = os.path.join(METADATA_SERVER, metadata_key) + params = urlparse.urlencode(params or {}) + url = '%s?%s' % (metadata_url, params) + request = urlrequest.Request(url, headers=METADATA_HEADERS) + request_opener = urlrequest.build_opener(urlrequest.ProxyHandler({})) + return request_opener.open(request, timeout=timeout * 1.1).read().decode("utf-8") + + +def define_new_opts(): + all_opt["zone"] = { + "getopt" : ":", + "longopt" : "zone", + "help" : "--zone=[name] Zone, e.g. us-central1-b", + "shortdesc" : "Zone.", + "required" : "0", + "order" : 2 + } + all_opt["project"] = { + "getopt" : ":", + "longopt" : "project", + "help" : "--project=[name] Project ID", + "shortdesc" : "Project ID.", + "required" : "0", + "order" : 3 + } + all_opt["stackdriver-logging"] = { + "getopt" : "", + "longopt" : "stackdriver-logging", + "help" : "--stackdriver-logging Enable Logging to Stackdriver", + "shortdesc" : "Stackdriver-logging support.", + "longdesc" : "If enabled IP failover logs will be posted to stackdriver logging.", + "required" : "0", + "order" : 4 + } + all_opt["baremetalsolution"] = { + "getopt" : "", + "longopt" : "baremetalsolution", + "help" : "--baremetalsolution Enable on bare metal", + "shortdesc" : "If enabled this is a bare metal offering from google.", + "required" : "0", + "order" : 5 + } + all_opt["apitimeout"] = { + "getopt" : ":", + "type" : "second", + "longopt" : "apitimeout", + "help" : "--apitimeout=[seconds] Timeout to use for API calls", + "shortdesc" : "Timeout in seconds to use for API calls, default is 60.", + "required" : "0", + "default" : 60, + "order" : 6 + } + all_opt["retries"] = { + "getopt" : ":", + "type" : "integer", + "longopt" : "retries", + "help" : "--retries=[retries] Number of retries on failure for API calls", + "shortdesc" : "Number of retries on failure for API calls, default is 3.", + "required" : "0", + "default" : 3, + "order" : 7 + } + all_opt["retrysleep"] = { + "getopt" : ":", + "type" : "second", + "longopt" : "retrysleep", + "help" : "--retrysleep=[seconds] Time to sleep between API retries", + "shortdesc" : "Time to sleep in seconds between API retries, default is 5.", + "required" : "0", + "default" : 5, + "order" : 8 + } + all_opt["serviceaccount"] = { + "getopt" : ":", + "longopt" : "serviceaccount", + "help" : "--serviceaccount=[filename] Service account json file location e.g. serviceaccount=/somedir/service_account.json", + "shortdesc" : "Service Account to use for authentication to the google cloud APIs.", + "required" : "0", + "order" : 9 + } + all_opt["plugzonemap"] = { + "getopt" : ":", + "longopt" : "plugzonemap", + "help" : "--plugzonemap=[plugzonemap] Comma separated zone map when fencing multiple plugs", + "shortdesc" : "Comma separated zone map when fencing multiple plugs.", + "required" : "0", + "order" : 10 + } + all_opt["proxyhost"] = { + "getopt" : ":", + "longopt" : "proxyhost", + "help" : "--proxyhost=[proxy_host] The proxy host to use, if one is needed to access the internet (Example: 10.122.0.33)", + "shortdesc" : "If a proxy is used for internet access, the proxy host should be specified.", + "required" : "0", + "order" : 11 + } + all_opt["proxyport"] = { + "getopt" : ":", + "type" : "integer", + "longopt" : "proxyport", + "help" : "--proxyport=[proxy_port] The proxy port to use, if one is needed to access the internet (Example: 3127)", + "shortdesc" : "If a proxy is used for internet access, the proxy port should be specified.", + "required" : "0", + "order" : 12 + } + all_opt["earlyexit"] = { + "getopt" : "", + "longopt" : "earlyexit", + "help" : "--earlyexit Return early if reset is already in progress", + "shortdesc" : "If an existing reset operation is detected, the fence agent will return before the operation completes with a 0 return code.", + "required" : "0", + "order" : 13 + } + all_opt["warntimeout"] = { + "getopt" : ":", + "type" : "second", + "longopt" : "warntimeout", + "help" : "--warntimeout=[warn_timeout] Timeout seconds before logging a warning and returning a 0 status code", + "shortdesc" : "If the operation is not completed within the timeout, the cluster operations are allowed to continue.", + "required" : "0", + "order" : 14 + } + all_opt["errortimeout"] = { + "getopt" : ":", + "type" : "second", + "longopt" : "errortimeout", + "help" : "--errortimeout=[error_timeout] Timeout seconds before failing and returning a non-zero status code", + "shortdesc" : "If the operation is not completed within the timeout, cluster is notified of the operation failure.", + "required" : "0", + "order" : 15 + } + all_opt["runonwarn"] = { + "getopt" : ":", + "longopt" : "runonwarn", + "help" : "--runonwarn=[run_on_warn] If a timeout occurs and warning is generated, run the supplied command", + "shortdesc" : "If a timeout would occur while running the agent, then the supplied command is run.", + "required" : "0", + "order" : 16 + } + all_opt["runonfail"] = { + "getopt" : ":", + "longopt" : "runonfail", + "help" : "--runonfail=[run_on_fail] If a failure occurs, run the supplied command", + "shortdesc" : "If a failure would occur while running the agent, then the supplied command is run.", + "required" : "0", + "order" : 17 + } + + +def main(): + conn = None + + device_opt = ["port", "no_password", "zone", "project", "stackdriver-logging", + "method", "baremetalsolution", "apitimeout", "retries", "retrysleep", + "serviceaccount", "plugzonemap", "proxyhost", "proxyport", "earlyexit", + "warntimeout", "errortimeout", "runonwarn", "runonfail"] + + atexit.register(atexit_handler) + + define_new_opts() + + all_opt["power_timeout"]["default"] = "60" + all_opt["method"]["default"] = "cycle" + all_opt["method"]["help"] = "-m, --method=[method] Method to fence (onoff|cycle) (Default: cycle)" + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for GCE (Google Cloud Engine)" + docs["longdesc"] = "fence_gce is an I/O Fencing agent for GCE (Google Cloud " \ + "Engine). It uses the googleapiclient library to connect to GCE.\n" \ + "googleapiclient can be configured with Google SDK CLI or by " \ + "executing 'gcloud auth application-default login'.\n" \ + "For instructions see: https://cloud.google.com/compute/docs/tutorials/python-guide" + docs["vendorurl"] = "http://cloud.google.com" + show_docs(options, docs) + + run_delay(options) + + # Prepare logging + if options.get('--verbose') is None: + logging.getLogger('googleapiclient').setLevel(logging.ERROR) + logging.getLogger('oauth2client').setLevel(logging.ERROR) + if options.get('--stackdriver-logging') is not None and options.get('--plug'): + try: + import google.cloud.logging.handlers + client = google.cloud.logging.Client() + handler = google.cloud.logging.handlers.CloudLoggingHandler(client, name=options['--plug']) + handler.setLevel(logging.INFO) + formatter = logging.Formatter('gcp:stonith "%(message)s"') + handler.setFormatter(formatter) + root_logger = logging.getLogger() + if options.get('--verbose') is None: + root_logger.setLevel(logging.INFO) + root_logger.addHandler(handler) + except ImportError: + logging.error('Couldn\'t import google.cloud.logging, ' + 'disabling Stackdriver-logging support') + + # if apitimeout is defined we set the socket timeout, if not we keep the + # socket default which is 60s + if options.get("--apitimeout"): + socket.setdefaulttimeout(options["--apitimeout"]) + + # Prepare cli + try: + serviceaccount = options.get("--serviceaccount") + if serviceaccount: + scope = ['https://www.googleapis.com/auth/cloud-platform'] + logging.debug("using credentials from service account") + try: + from google.oauth2.service_account import Credentials as ServiceAccountCredentials + credentials = ServiceAccountCredentials.from_service_account_file(filename=serviceaccount, scopes=scope) + except ImportError: + from oauth2client.service_account import ServiceAccountCredentials + credentials = ServiceAccountCredentials.from_json_keyfile_name(serviceaccount, scope) + else: + try: + from googleapiclient import _auth + credentials = _auth.default_credentials(); + except: + credentials = GoogleCredentials.get_application_default() + logging.debug("using application default credentials") + + if options.get("--proxyhost") and options.get("--proxyport"): + proxy_info = httplib2.ProxyInfo( + proxy_type=socks.PROXY_TYPE_HTTP, + proxy_host=options.get("--proxyhost"), + proxy_port=int(options.get("--proxyport"))) + http = credentials.authorize(httplib2.Http(proxy_info=proxy_info)) + conn = googleapiclient.discovery.build( + 'compute', 'v1', http=http, cache_discovery=False) + else: + conn = googleapiclient.discovery.build( + 'compute', 'v1', credentials=credentials, cache_discovery=False) + except SSLError as err: + fail_fence_agent(options, "Failed: Create GCE compute v1 connection: {}\n\nThis might be caused by old versions of httplib2.".format(str(err))) + except Exception as err: + fail_fence_agent(options, "Failed: Create GCE compute v1 connection: {}".format(str(err))) + + # Get project and zone + if not options.get("--project"): + try: + options["--project"] = get_metadata('project/project-id') + except Exception as err: + fail_fence_agent(options, "Failed retrieving GCE project. Please provide --project option: {}".format(str(err))) + + try: + image = get_metadata('instance/image') + options["image"] = image[image.rindex('/')+1:] + except Exception as err: + options["image"] = "unknown" + + if "--baremetalsolution" in options: + options["--zone"] = "none" + + # Populates zone automatically if missing from the command + zones = [] if not "--zone" in options else options["--zone"].split(",") + options["--plugzonemap"] = {} + if "--plug" in options: + for i, instance in enumerate(options["--plug"].split(",")): + if len(zones) == 1: + # If only one zone is specified, use it across all plugs + options["--plugzonemap"][instance] = zones[0] + continue + + if len(zones) - 1 >= i: + # If we have enough zones specified with the --zone flag use the zone at + # the same index as the plug + options["--plugzonemap"][instance] = zones[i] + continue + + try: + # In this case we do not have a zone specified so we attempt to detect it + options["--plugzonemap"][instance] = get_zone(conn, options, instance) + except Exception as err: + fail_fence_agent(options, "Failed retrieving GCE zone. Please provide --zone option: {}".format(str(err))) + + # Operate the fencing device + result = fence_action(conn, options, set_power_status, get_power_status, get_nodes_list, power_cycle) + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/hds_cb/fence_hds_cb.py b/agents/hds_cb/fence_hds_cb.py new file mode 100755 index 0000000..375054c --- /dev/null +++ b/agents/hds_cb/fence_hds_cb.py @@ -0,0 +1,132 @@ +#!@PYTHON@ -tt + +##### +## +## The Following Agent Has Been Tested On: +## +## Model Modle/Firmware +## +--------------------+---------------------------+ +## (1) Main application CB2000/A0300-E-6617 +## +##### + +import sys, re +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * + +RE_STATUS_LINE = r"^([0-9]+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+).*$" + +def get_power_status(conn, options): + #### Maybe should put a conn.log_expect here to make sure + #### we have properly entered into the main menu + conn.sendline("S") # Enter System Command Mode + conn.log_expect("SVP>", int(options["--shell-timeout"])) + conn.sendline("PC") # Enter partition control + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + result = {} + # Status can now be obtained from the output of the PC + # command. Line looks like the following: + # "P Power Condition LID lamp Mode Auto power on" + # "0 On Normal Off Basic Synchronized" + # "1 On Normal Off Basic Synchronized" + for line in conn.before.splitlines(): + # populate the relevant fields based on regex + partition = re.search(RE_STATUS_LINE, line) + if partition != None: + # find the blade number defined in args + if partition.group(1) == options["--plug"]: + result = partition.group(2).lower() + # We must make sure we go back to the main menu as the + # status is checked before any fencing operations are + # executed. We could in theory save some time by staying in + # the partition control, but the logic is a little cleaner + # this way. + conn.sendline("Q") # Back to system command mode + conn.log_expect("SVP>", int(options["--shell-timeout"])) + conn.sendline("EX") # Back to system console main menu + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + return result + +def set_power_status(conn, options): + action = { + 'on' : "P", + 'off': "F", + 'reboot' : "H", + }[options["--action"]] + + conn.sendline("S") # Enter System Command Mode + conn.log_expect("SVP>", int(options["--shell-timeout"])) + conn.sendline("PC") # Enter partition control + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + conn.sendline("P") # Enter power control menu + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + conn.sendline(action) # Execute action from array above + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + conn.sendline(options["--plug"]) # Select blade number from args + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + conn.sendline("Y") # Confirm action + conn.log_expect("Hit enter key.", int(options["--shell-timeout"])) + conn.sendline("") # Press the any key + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + conn.sendline("Q") # Quit back to partition control + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + conn.sendline("Q") # Quit back to system command mode + conn.log_expect("SVP>", int(options["--shell-timeout"])) + conn.sendline("EX") # Quit back to system console menu + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + +def get_blades_list(conn, options): + outlets = {} + + conn.sendline("S") # Enter System Command Mode + conn.log_expect("SVP>", int(options["--shell-timeout"])) + conn.sendline("PC") # Enter partition control + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + # Status can now be obtained from the output of the PC + # command. Line looks like the following: + # "P Power Condition LID lamp Mode Auto power on" + # "0 On Normal Off Basic Synchronized" + # "1 On Normal Off Basic Synchronized" + for line in conn.before.splitlines(): + partition = re.search(RE_STATUS_LINE, line) + if partition != None: + outlets[partition.group(1)] = (partition.group(2), "") + conn.sendline("Q") # Quit back to system command mode + conn.log_expect("SVP>", int(options["--shell-timeout"])) + conn.sendline("EX") # Quit back to system console menu + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + return outlets + +def main(): + device_opt = ["ipaddr", "login", "passwd", "cmd_prompt", "secure", \ + "port", "missing_as_off", "telnet"] + + atexit.register(atexit_handler) + + all_opt["power_wait"]["default"] = "5" + all_opt["cmd_prompt"]["default"] = [r"\) :"] + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for Hitachi Compute Blade systems" + docs["longdesc"] = "fence_hds_cb is an I/O Fencing agent \ +which can be used with Hitachi Compute Blades with recent enough firmware that \ +includes telnet support." + docs["vendorurl"] = "http://www.hds.com" + show_docs(options, docs) + + ## + ## Operate the fencing device + ###### + conn = fence_login(options) + result = fence_action(conn, options, set_power_status, get_power_status, get_blades_list) + + fence_logout(conn, "X") + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/heuristics_ping/fence_heuristics_ping.py b/agents/heuristics_ping/fence_heuristics_ping.py new file mode 100644 index 0000000..5b2c61d --- /dev/null +++ b/agents/heuristics_ping/fence_heuristics_ping.py @@ -0,0 +1,198 @@ +#!@PYTHON@ -tt + +# The Following Agent Has Been Tested On: +# +# RHEL 7.4 +# + +import io +import re +import subprocess +import shlex +import sys, stat +import logging +import os +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import fail_usage, run_command, fence_action, all_opt +from fencing import atexit_handler, check_input, process_input, show_docs +from fencing import run_delay + +def ping_test(con, options): + # Send pings to the targets + + if options["--action"] == "on": + # we want unfencing to always succeed + return True + + if not "--ping-targets" in options or options["--ping-targets"] == "": + # "off" was requested so fake "on" to provoke failure + logging.error("ping target required") + return False + + timeout = int(options["--ping-timeout"]) + count = int(options["--ping-count"]) + interval = int(options["--ping-interval"]) + good_required = int(options["--ping-good-count"]) + maxfail = int(options["--ping-maxfail"]) + targets = options["--ping-targets"].split(",") + exitcode = True + p = {} + failcount = 0 + # search string for parsing the results of the ping-executable + packet_count = re.compile(r".*transmitted, ([0-9]*)( packets)? received.*") + + # start a ping-process per target + for target in targets: + ping_path = '@PING_CMD@' + target_mangled = target + if target.startswith('inet6:'): + if '@PING6_CMD@' == '': + p[target] = None + continue + ping_path = '@PING6_CMD@' + target_mangled = target.split(':',2)[1] + elif target.startswith('inet:'): + ping_path = '@PING4_CMD@' + target_mangled = target.split(':',2)[1] + + ping_cmd = "%s -n -q -W %d -c %d -i %d %s" % ( + ping_path, timeout, count, interval, target_mangled) + logging.info("Running command: %s", ping_cmd) + try: + p[target] = subprocess.Popen(shlex.split(ping_cmd), + stdout=subprocess.PIPE); + except OSError: + p[target] = None + + # collect the results of the ping-processes + for target in targets: + good = 0 + if p[target] != None: + p[target].wait() + if p[target].returncode == 0: + for line in p[target].stdout: + searchres = packet_count.search(line.decode()) + if searchres: + good = int(searchres.group(1)) + break + if good >= good_required: + logging.info("ping target %s received %d of %d" \ + % (target, good, count)) + continue + failcount += 1 + logging.info("ping target %s received %d of %d and thus failed" + % (target, good, count)) + else: + failcount += 1 + logging.error("ping target %s failed on OS level" % target) + + if failcount > maxfail: + exitcode = False + + return exitcode + + +def define_new_opts(): + all_opt["ping_count"] = { + "getopt" : ":", + "longopt" : "ping-count", + "required" : "0", + "help" : "--ping-count=[number] Number of ping-probes to send", + "shortdesc" : "The number of ping-probes that is being sent per target", + "default" : "10", + "order" : 1 + } + + all_opt["ping_good_count"] = { + "getopt" : ":", + "longopt" : "ping-good-count", + "required" : "0", + "help" : "--ping-good-count=[number] Number of positive ping-probes required", + "shortdesc" : "The number of positive ping-probes required to account a target as available", + "default" : "8", + "order" : 1 + } + + all_opt["ping_interval"] = { + "getopt" : ":", + "longopt" : "ping-interval", + "required" : "0", + "help" : "--ping-interval=[seconds] Seconds between ping-probes", + "shortdesc" : "The interval in seconds between ping-probes", + "default" : "1", + "order" : 1 + } + + all_opt["ping_timeout"] = { + "getopt" : ":", + "longopt" : "ping-timeout", + "required" : "0", + "help" : "--ping-timeout=[seconds] Timeout for individual ping-probes", + "shortdesc" : "The timeout in seconds till an individual ping-probe is accounted as lost", + "default" : "2", + "order" : 1 + } + + all_opt["ping_maxfail"] = { + "getopt" : ":", + "longopt" : "ping-maxfail", + "required" : "0", + "help" : "--ping-maxfail=[number] Number of failed ping-targets allowed", + "shortdesc" : "The number of failed ping-targets to still account as overall success", + "default" : "0", + "order" : 1 + } + + all_opt["ping_targets"] = { + "getopt" : ":", + "longopt" : "ping-targets", + "required" : "1", + "help" : "--ping-targets=tgt1,[inet6:]tgt2 Comma separated list of ping-targets", + "shortdesc" : "A comma separated list of ping-targets (optionally prepended by 'inet:' or 'inet6:') to be probed", + "default" : "", + "order" : 1 + } + + +def main(): + device_opt = ["no_status", "no_password", "ping_count", "ping_good_count", + "ping_interval", "ping_timeout", "ping_maxfail", "ping_targets", "method"] + define_new_opts() + atexit.register(atexit_handler) + + all_opt["method"]["default"] = "cycle" + all_opt["method"]["help"] = "-m, --method=[method] Method to fence (cycle|onoff) (Default: cycle)" + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for ping-heuristic based fencing" + docs["longdesc"] = "fence_heuristics_ping uses ping-heuristics to control execution of another fence agent on the same fencing level.\ +\n.P\n\ +This is not a fence agent by itself! \ +Its only purpose is to enable/disable another fence agent that lives on the same fencing level but after fence_heuristics_ping." + docs["vendorurl"] = "" + show_docs(options, docs) + + # move ping-test to the end of the time-window set via --delay + # as to give the network time to settle after the incident that has + # caused fencing and have the results as current as possible + max_pingcheck = (int(options["--ping-count"]) - 1) * \ + int(options["--ping-interval"]) + int(options["--ping-timeout"]) + run_delay(options, reserve=max_pingcheck) + + result = fence_action(\ + None, \ + options, \ + None, \ + None, \ + reboot_cycle_fn = ping_test, + sync_set_power_fn = ping_test) + + # execute the remaining delay + run_delay(options, result=result) + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/hpblade/fence_hpblade.py b/agents/hpblade/fence_hpblade.py new file mode 100644 index 0000000..fbc89f6 --- /dev/null +++ b/agents/hpblade/fence_hpblade.py @@ -0,0 +1,134 @@ +#!@PYTHON@ -tt + +##### +## +## The Following Agent Has Been Tested On: +## * HP BladeSystem c7000 Enclosure +## * HP Integrity Superdome X (BL920s) +##### + +import sys, re +import pexpect +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, EC_STATUS + +def get_enclosure_type(conn, options): + conn.send_eol("show enclosure info") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + type_re=re.compile(r"^\s*Enclosure Type: (\w+)(.*?)\s*$") + enclosure="unknown" + for line in conn.before.splitlines(): + res = type_re.search(line) + if res != None: + enclosure=res.group(1) + + if enclosure == "unknown": + fail(EC_GENERIC_ERROR) + + return enclosure.lower().strip() + +def get_power_status(conn, options): + if options["enc_type"] == "superdome": + cmd_send = "parstatus -M -p " + options["--plug"] + powrestr = "^partition:\\d\\s+:\\w+\\s+/(\\w+)\\s.*$" + else: + cmd_send = "show server status " + options["--plug"] + powrestr = "^\\s*Power: (.*?)\\s*$" + + conn.send_eol(cmd_send) + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + power_re = re.compile(powrestr) + status = "unknown" + for line in conn.before.splitlines(): + res = power_re.search(line) + if res != None: + if options["enc_type"] == "superdome": + if res.group(1) == "DOWN": + status = "off" + else: + status = "on" + else: + status = res.group(1) + + if status == "unknown": + if "--missing-as-off" in options: + return "off" + else: + fail(EC_STATUS) + + return status.lower().strip() + +def set_power_status(conn, options): + if options["enc_type"] == "superdome": + dev="partition " + else: + dev="server " + + if options["--action"] == "on": + conn.send_eol("poweron " + dev + options["--plug"]) + elif options["--action"] == "off": + conn.send_eol("poweroff " + dev + options["--plug"] + " force") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + +def get_instances_list(conn, options): + outlets = {} + if options["enc_type"] == "superdome": + cmd_send = "parstatus -P -M" + listrestr = "^partition:(\\d+)\\s+:\\w+\\s+/(\\w+)\\s+:OK.*?:(\\w+)\\s*$" + else: + cmd_send = "show server list" + listrestr = "^\\s*(\\d+)\\s+(.*?)\\s+(.*?)\\s+OK\\s+(.*?)\\s+(.*?)\\s*$" + + conn.send_eol(cmd_send) + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + list_re = re.compile(listrestr) + for line in conn.before.splitlines(): + res = list_re.search(line) + if res != None: + if options["enc_type"] == "superdome": + outlets[res.group(1)] = (res.group(3), res.group(2).lower()) + else: + outlets[res.group(1)] = (res.group(2), res.group(4).lower()) + + return outlets + +def main(): + device_opt = ["ipaddr", "login", "passwd", "cmd_prompt", "secure", \ + "port", "missing_as_off", "telnet"] + + atexit.register(atexit_handler) + + all_opt["cmd_prompt"]["default"] = ["c7000oa>"] + all_opt["login_timeout"]["default"] = "10" + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for HP BladeSystem" + docs["longdesc"] = "fence_hpblade is an I/O Fencing agent \ +which can be used with HP BladeSystem and HP Integrity Superdome X. \ +It logs into the onboard administrator of an enclosure via telnet or \ +ssh and uses the command line interface to power blades or partitions \ +on or off." + docs["vendorurl"] = "http://www.hp.com" + show_docs(options, docs) + + ## + ## Operate the fencing device + ###### + options["eol"] = "\n" + conn = fence_login(options) + + options["enc_type"] = get_enclosure_type(conn, options) + + result = fence_action(conn, options, set_power_status, get_power_status, get_instances_list) + fence_logout(conn, "exit") + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/ibm_powervs/fence_ibm_powervs.py b/agents/ibm_powervs/fence_ibm_powervs.py new file mode 100755 index 0000000..1838936 --- /dev/null +++ b/agents/ibm_powervs/fence_ibm_powervs.py @@ -0,0 +1,267 @@ +#!@PYTHON@ -tt + +import sys +import pycurl, io, json +import logging +import atexit +import time +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, run_delay, EC_LOGIN_DENIED, EC_STATUS + +state = { + "ACTIVE": "on", + "SHUTOFF": "off", + "ERROR": "unknown" +} + +def get_token(conn, options): + try: + command = "identity/token" + action = "grant_type=urn%3Aibm%3Aparams%3Aoauth%3Agrant-type%3Aapikey&apikey={}".format(options["--token"]) + res = send_command(conn, command, "POST", action, printResult=False) + except Exception as e: + logging.debug("Failed: {}".format(e)) + return "TOKEN_IS_MISSING_OR_WRONG" + + return res["access_token"] + +def get_list(conn, options): + outlets = {} + + try: + command = "cloud-instances/{}/pvm-instances".format(options["--instance"]) + res = send_command(conn, command) + except Exception as e: + logging.debug("Failed: {}".format(e)) + return outlets + + for r in res["pvmInstances"]: + if "--verbose" in options: + logging.debug(json.dumps(r, indent=2)) + outlets[r["pvmInstanceID"]] = (r["serverName"], state[r["status"]]) + + return outlets + +def get_power_status(conn, options): + try: + command = "cloud-instances/{}/pvm-instances/{}".format( + options["--instance"], options["--plug"]) + res = send_command(conn, command) + result = get_list(conn, options)[options["--plug"]][1] + except KeyError as e: + logging.debug("Failed: Unable to get status for {}".format(e)) + fail(EC_STATUS) + + return result + +def set_power_status(conn, options): + action = { + "on" : '{"action" : "start"}', + "off" : '{"action" : "immediate-shutdown"}', + }[options["--action"]] + + try: + send_command(conn, "cloud-instances/{}/pvm-instances/{}/action".format( + options["--instance"], options["--plug"]), "POST", action) + except Exception as e: + logging.debug("Failed: Unable to set power to {} for {}".format(options["--action"], e)) + fail(EC_STATUS) + +def connect(opt, token): + conn = pycurl.Curl() + + ## setup correct URL + conn.base_url = "https://" + opt["--region"] + ".power-iaas.cloud.ibm.com/pcloud/v1/" + if opt["--api-type"] == "private": + conn.base_url = "https://private." + opt["--region"] + ".power-iaas.cloud.ibm.com/pcloud/v1/" + + if opt["--verbose-level"] < 3: + conn.setopt(pycurl.VERBOSE, 0) + + conn.setopt(pycurl.CONNECTTIMEOUT,int(opt["--shell-timeout"])) + conn.setopt(pycurl.TIMEOUT, int(opt["--shell-timeout"])) + conn.setopt(pycurl.SSL_VERIFYPEER, 1) + conn.setopt(pycurl.SSL_VERIFYHOST, 2) + conn.setopt(pycurl.PROXY, "{}".format(opt["--proxy"])) + + # set auth token for later requests + conn.setopt(pycurl.HTTPHEADER, [ + "Content-Type: application/json", + "Authorization: Bearer {}".format(token), + "CRN: {}".format(opt["--crn"]), + "User-Agent: curl", + ]) + + return conn + +def auth_connect(opt): + conn = pycurl.Curl() + + # setup correct URL + conn.base_url = "https://iam.cloud.ibm.com/" + + if opt["--verbose-level"] > 1: + conn.setopt(pycurl.VERBOSE, 1) + + conn.setopt(pycurl.CONNECTTIMEOUT,int(opt["--shell-timeout"])) + conn.setopt(pycurl.TIMEOUT, int(opt["--shell-timeout"])) + conn.setopt(pycurl.SSL_VERIFYPEER, 1) + conn.setopt(pycurl.SSL_VERIFYHOST, 2) + conn.setopt(pycurl.PROXY, "{}".format(opt["--proxy"])) + + # set auth token for later requests + conn.setopt(pycurl.HTTPHEADER, [ + "Content-type: application/x-www-form-urlencoded", + "Accept: application/json", + "User-Agent: curl", + ]) + + return conn + +def disconnect(conn): + conn.close() + +def send_command(conn, command, method="GET", action=None, printResult=True): + url = conn.base_url + command + + conn.setopt(pycurl.URL, url.encode("ascii")) + + web_buffer = io.BytesIO() + + if method == "GET": + conn.setopt(pycurl.POST, 0) + if method == "POST": + conn.setopt(pycurl.POSTFIELDS, action) + if method == "DELETE": + conn.setopt(pycurl.CUSTOMREQUEST, "DELETE") + + conn.setopt(pycurl.WRITEFUNCTION, web_buffer.write) + + try: + conn.perform() + except Exception as e: + logging.error("send_command(): {}".format(e)) + raise(e) + + rc = conn.getinfo(pycurl.HTTP_CODE) + result = web_buffer.getvalue().decode("UTF-8") + + web_buffer.close() + + if rc != 200: + if len(result) > 0: + raise Exception("{}: {}".format(rc,result)) + else: + raise Exception("Remote returned {} for request to {}".format(rc, url)) + + if len(result) > 0: + result = json.loads(result) + + logging.debug("url: {}".format(url)) + logging.debug("method: {}".format(method)) + logging.debug("response code: {}".format(rc)) + if printResult: + logging.debug("result: {}\n".format(result)) + + return result + +def define_new_opts(): + all_opt["token"] = { + "getopt" : ":", + "longopt" : "token", + "help" : "--token=[token] API Token", + "required" : "1", + "shortdesc" : "API Token", + "order" : 0 + } + all_opt["crn"] = { + "getopt" : ":", + "longopt" : "crn", + "help" : "--crn=[crn] CRN", + "required" : "1", + "shortdesc" : "CRN", + "order" : 0 + } + all_opt["instance"] = { + "getopt" : ":", + "longopt" : "instance", + "help" : "--instance=[instance] PowerVS Instance", + "required" : "1", + "shortdesc" : "PowerVS Instance", + "order" : 0 + } + all_opt["region"] = { + "getopt" : ":", + "longopt" : "region", + "help" : "--region=[region] Region", + "required" : "1", + "shortdesc" : "Region", + "order" : 0 + } + all_opt["api-type"] = { + "getopt" : ":", + "longopt" : "api-type", + "help" : "--api-type=[public|private] API-type: 'public' (default) or 'private'", + "required" : "0", + "shortdesc" : "API-type (public|private)", + "order" : 0 + } + all_opt["proxy"] = { + "getopt" : ":", + "longopt" : "proxy", + "help" : "--proxy=[http://:] Proxy: 'http://:'", + "required" : "0", + "shortdesc" : "Network proxy", + "order" : 0 + } + + +def main(): + device_opt = [ + "token", + "crn", + "instance", + "region", + "api-type", + "proxy", + "port", + "no_password", + ] + + atexit.register(atexit_handler) + define_new_opts() + + all_opt["shell_timeout"]["default"] = "500" + all_opt["power_timeout"]["default"] = "30" + all_opt["power_wait"]["default"] = "1" + all_opt["stonith_status_sleep"]["default"] = "2" + all_opt["api-type"]["default"] = "private" + all_opt["proxy"]["default"] = "" + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for IBM PowerVS" + docs["longdesc"] = """fence_ibm_powervs is an I/O Fencing agent which can be \ +used with IBM PowerVS to fence virtual machines.""" + docs["vendorurl"] = "https://www.ibm.com" + show_docs(options, docs) + + #### + ## Fence operations + #### + run_delay(options) + + auth_conn = auth_connect(options) + token = get_token(auth_conn, options) + disconnect(auth_conn) + conn = connect(options, token) + atexit.register(disconnect, conn) + + result = fence_action(conn, options, set_power_status, get_power_status, get_list) + + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/ibm_vpc/fence_ibm_vpc.py b/agents/ibm_vpc/fence_ibm_vpc.py new file mode 100755 index 0000000..8470105 --- /dev/null +++ b/agents/ibm_vpc/fence_ibm_vpc.py @@ -0,0 +1,316 @@ +#!@PYTHON@ -tt + +import sys +import pycurl, io, json +import logging +import atexit +import hashlib +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, run_delay, EC_LOGIN_DENIED, EC_STATUS, EC_GENERIC_ERROR + +state = { + "running": "on", + "stopped": "off", + "starting": "unknown", + "stopping": "unknown", + "restarting": "unknown", + "pending": "unknown", +} + +def get_list(conn, options): + outlets = {} + + try: + command = "instances?version=2021-05-25&generation=2&limit={}".format(options["--limit"]) + res = send_command(conn, options, command) + except Exception as e: + logging.debug("Failed: Unable to get list: {}".format(e)) + return outlets + + for r in res["instances"]: + if options["--verbose-level"] > 1: + logging.debug("Node:\n{}".format(json.dumps(r, indent=2))) + logging.debug("Status: " + state[r["status"]]) + outlets[r["id"]] = (r["name"], state[r["status"]]) + + return outlets + +def get_power_status(conn, options): + try: + command = "instances/{}?version=2021-05-25&generation=2".format(options["--plug"]) + res = send_command(conn, options, command) + result = state[res["status"]] + if options["--verbose-level"] > 1: + logging.debug("Result:\n{}".format(json.dumps(res, indent=2))) + logging.debug("Status: " + result) + except Exception as e: + logging.debug("Failed: Unable to get status for {}: {}".format(options["--plug"], e)) + fail(EC_STATUS) + + return result + +def set_power_status(conn, options): + action = { + "on" : '{"type" : "start"}', + "off" : '{"type" : "stop"}', + }[options["--action"]] + + try: + command = "instances/{}/actions?version=2021-05-25&generation=2".format(options["--plug"]) + send_command(conn, options, command, "POST", action, 201) + except Exception as e: + logging.debug("Failed: Unable to set power to {} for {}".format(options["--action"], e)) + fail(EC_STATUS) + +def get_bearer_token(conn, options): + import os, errno + + try: + # FIPS requires usedforsecurity=False and might not be + # available on all distros: https://bugs.python.org/issue9216 + hash = hashlib.sha256(options["--apikey"].encode("utf-8"), usedforsecurity=False).hexdigest() + except (AttributeError, TypeError): + hash = hashlib.sha256(options["--apikey"].encode("utf-8")).hexdigest() + file_path = options["--token-file"].replace("[hash]", hash) + token = None + + if not os.path.isdir(os.path.dirname(file_path)): + os.makedirs(os.path.dirname(file_path)) + + # For security, remove file with potentially elevated mode + try: + os.remove(file_path) + except OSError: + pass + + try: + oldumask = os.umask(0) + file_handle = os.open(file_path, os.O_CREAT | os.O_EXCL | os.O_WRONLY, 0o600) + except OSError as e: + if e.errno == errno.EEXIST: # Failed as the file already exists. + logging.error("Failed: File already exists: {}".format(e)) + sys.exit(EC_GENERIC_ERROR) + else: # Something unexpected went wrong + logging.error("Failed: Unable to open file: {}".format(e)) + sys.exit(EC_GENERIC_ERROR) + else: # No exception, so the file must have been created successfully. + with os.fdopen(file_handle, 'w') as file_obj: + try: + conn.setopt(pycurl.HTTPHEADER, [ + "Content-Type: application/x-www-form-urlencoded", + "User-Agent: curl", + ]) + token = send_command(conn, options, "https://iam.cloud.ibm.com/identity/token", "POST", "grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey={}".format(options["--apikey"]))["access_token"] + except Exception as e: + logging.error("Failed: Unable to authenticate: {}".format(e)) + fail(EC_LOGIN_DENIED) + file_obj.write(token) + finally: + os.umask(oldumask) + + return token + +def set_bearer_token(conn, bearer_token): + conn.setopt(pycurl.HTTPHEADER, [ + "Content-Type: application/json", + "Authorization: Bearer {}".format(bearer_token), + "User-Agent: curl", + ]) + + return conn + +def connect(opt): + conn = pycurl.Curl() + bearer_token = "" + + ## setup correct URL + conn.base_url = "https://" + opt["--region"] + ".iaas.cloud.ibm.com/v1/" + + if opt["--verbose-level"] > 1: + conn.setopt(pycurl.VERBOSE, 1) + + conn.setopt(pycurl.TIMEOUT, int(opt["--shell-timeout"])) + conn.setopt(pycurl.SSL_VERIFYPEER, 1) + conn.setopt(pycurl.SSL_VERIFYHOST, 2) + conn.setopt(pycurl.PROXY, "{}".format(opt["--proxy"])) + + # get bearer token + try: + try: + # FIPS requires usedforsecurity=False and might not be + # available on all distros: https://bugs.python.org/issue9216 + hash = hashlib.sha256(opt["--apikey"].encode("utf-8"), usedforsecurity=False).hexdigest() + except (AttributeError, TypeError): + hash = hashlib.sha256(opt["--apikey"].encode("utf-8")).hexdigest() + f = open(opt["--token-file"].replace("[hash]", hash)) + bearer_token = f.read() + f.close() + except IOError: + bearer_token = get_bearer_token(conn, opt) + + # set auth token for later requests + conn = set_bearer_token(conn, bearer_token) + + return conn + +def disconnect(conn): + conn.close() + +def send_command(conn, options, command, method="GET", action=None, expected_rc=200): + if not command.startswith("https"): + url = conn.base_url + command + else: + url = command + + conn.setopt(pycurl.URL, url.encode("ascii")) + + web_buffer = io.BytesIO() + + if method == "GET": + conn.setopt(pycurl.POST, 0) + if method == "POST": + conn.setopt(pycurl.POSTFIELDS, action) + if method == "DELETE": + conn.setopt(pycurl.CUSTOMREQUEST, "DELETE") + + conn.setopt(pycurl.WRITEFUNCTION, web_buffer.write) + + try: + conn.perform() + except Exception as e: + raise(e) + + rc = conn.getinfo(pycurl.HTTP_CODE) + + # auth if token has expired + if rc in [400, 401, 415]: + tokenconn = pycurl.Curl() + token = get_bearer_token(tokenconn, options) + tokenconn.close() + conn = set_bearer_token(conn, token) + + # flush web_buffer + web_buffer.close() + web_buffer = io.BytesIO() + conn.setopt(pycurl.WRITEFUNCTION, web_buffer.write) + + try: + conn.perform() + except Exception as e: + raise(e) + + rc = conn.getinfo(pycurl.HTTP_CODE) + + result = web_buffer.getvalue().decode("UTF-8") + + web_buffer.close() + + # actions (start/stop/reboot) report 201 when they've been created + if rc != expected_rc: + logging.debug("rc: {}, result: {}".format(rc, result)) + if len(result) > 0: + raise Exception("{}: {}".format(rc, + result["value"]["messages"][0]["default_message"])) + else: + raise Exception("Remote returned {} for request to {}".format(rc, url)) + + if len(result) > 0: + result = json.loads(result) + + logging.debug("url: {}".format(url)) + logging.debug("method: {}".format(method)) + logging.debug("response code: {}".format(rc)) + logging.debug("result: {}\n".format(result)) + + return result + +def define_new_opts(): + all_opt["apikey"] = { + "getopt" : ":", + "longopt" : "apikey", + "help" : "--apikey=[key] API Key", + "required" : "1", + "shortdesc" : "API Key", + "order" : 0 + } + all_opt["region"] = { + "getopt" : ":", + "longopt" : "region", + "help" : "--region=[region] Region", + "required" : "1", + "shortdesc" : "Region", + "order" : 0 + } + all_opt["proxy"] = { + "getopt" : ":", + "longopt" : "proxy", + "help" : "--proxy=[http://:] Proxy: 'http://:'", + "required" : "0", + "default": "", + "shortdesc" : "Network proxy", + "order" : 0 + } + all_opt["limit"] = { + "getopt" : ":", + "longopt" : "limit", + "help" : "--limit=[number] Limit number of nodes returned by API", + "required" : "0", + "default": 50, + "shortdesc" : "Number of nodes returned by API", + "order" : 0 + } + all_opt["token_file"] = { + "getopt" : ":", + "longopt" : "token-file", + "help" : "--token-file=[path] Path to the token cache file\n" + "\t\t\t\t (Default: @FENCETMPDIR@/fence_ibm_vpc/[hash].token)\n" + "\t\t\t\t [hash] will be replaced by a hashed value", + "required" : "0", + "default": "@FENCETMPDIR@/fence_ibm_vpc/[hash].token", + "shortdesc" : "Path to the token cache file", + "order" : 0 + } + + +def main(): + device_opt = [ + "apikey", + "region", + "proxy", + "limit", + "token_file", + "port", + "no_password", + ] + + atexit.register(atexit_handler) + define_new_opts() + + all_opt["shell_timeout"]["default"] = "15" + all_opt["power_timeout"]["default"] = "30" + all_opt["power_wait"]["default"] = "1" + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for IBM Cloud VPC" + docs["longdesc"] = """fence_ibm_vpc is an I/O Fencing agent which can be \ +used with IBM Cloud VPC to fence virtual machines.""" + docs["vendorurl"] = "https://www.ibm.com" + show_docs(options, docs) + + #### + ## Fence operations + #### + run_delay(options) + + conn = connect(options) + atexit.register(disconnect, conn) + + result = fence_action(conn, options, set_power_status, get_power_status, get_list) + + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/ibmblade/fence_ibmblade.py b/agents/ibmblade/fence_ibmblade.py new file mode 100644 index 0000000..d623fff --- /dev/null +++ b/agents/ibmblade/fence_ibmblade.py @@ -0,0 +1,72 @@ +#!@PYTHON@ -tt + +import sys +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing_snmp import FencingSnmp + +### CONSTANTS ### +# From fence_ibmblade.pl +STATUSES_OID = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.4" # remoteControlBladePowerState +CONTROL_OID = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7" # powerOnOffBlade + +# Status constants returned as value from SNMP +STATUS_DOWN = 0 +STATUS_UP = 1 + +# Status constants to set as value to SNMP +STATUS_SET_OFF = 0 +STATUS_SET_ON = 1 + +### FUNCTIONS ### + +def get_power_status(conn, options): + (_, status) = conn.get("%s.%s"% (STATUSES_OID, options["--plug"])) + return status == str(STATUS_UP) and "on" or "off" + +def set_power_status(conn, options): + conn.set("%s.%s" % (CONTROL_OID, options["--plug"]), + (options["--action"] == "on" and STATUS_SET_ON or STATUS_SET_OFF)) + +def get_outlets_status(conn, _): + result = {} + + res_blades = conn.walk(STATUSES_OID, 30) + + for blade_info in res_blades: + port_num = blade_info[0].split('.')[-1] + + port_alias = "" + port_status = (blade_info[1] == str(STATUS_UP) and "on" or "off") + + result[port_num] = (port_alias, port_status) + + return result + +# Main agent method +def main(): + device_opt = ["ipaddr", "login", "passwd", "no_login", "no_password", \ + "port", "snmp_version", "snmp"] + + atexit.register(atexit_handler) + + all_opt["snmp_version"]["default"] = "1" + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for IBM BladeCenter over SNMP" + docs["longdesc"] = "fence_ibmblade is an I/O Fencing agent \ +which can be used with IBM BladeCenter chassis. It issues SNMP Set \ +request to BladeCenter chassis, rebooting, powering up or down \ +the specified Blade Server." + docs["vendorurl"] = "http://www.ibm.com" + show_docs(options, docs) + + # Operate the fencing device + result = fence_action(FencingSnmp(options), options, set_power_status, get_power_status, get_outlets_status) + + sys.exit(result) +if __name__ == "__main__": + main() diff --git a/agents/ibmz/fence_ibmz.py b/agents/ibmz/fence_ibmz.py new file mode 100644 index 0000000..d477ade --- /dev/null +++ b/agents/ibmz/fence_ibmz.py @@ -0,0 +1,566 @@ +#!@PYTHON@ -tt + +# Copyright (c) 2020 IBM Corp. +# +# 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, see +# . + +import atexit +import logging +import time +import sys + +import requests +from requests.packages import urllib3 + +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail_usage, run_delay, EC_GENERIC_ERROR + +DEFAULT_POWER_TIMEOUT = '300' +ERROR_NOT_FOUND = ("{obj_type} {obj_name} not found in this HMC. " + "Attention: names are case-sensitive.") + +class ApiClientError(Exception): + """ + Base exception for all API Client related errors. + """ + +class ApiClientRequestError(ApiClientError): + """ + Raised when an API request ends in error + """ + + def __init__(self, req_method, req_uri, status, reason, message): + self.req_method = req_method + self.req_uri = req_uri + self.status = status + self.reason = reason + self.message = message + super(ApiClientRequestError, self).__init__() + + def __str__(self): + return ( + "API request failed, details:\n" + "HTTP Request : {req_method} {req_uri}\n" + "HTTP Response status: {status}\n" + "Error reason: {reason}\n" + "Error message: {message}\n".format( + req_method=self.req_method, req_uri=self.req_uri, + status=self.status, reason=self.reason, message=self.message) + ) + +class APIClient(object): + DEFAULT_CONFIG = { + # how many connection-related errors to retry on + 'connect_retries': 3, + # how many times to retry on read errors (after request was sent to the + # server) + 'read_retries': 3, + # http methods that should be retried + 'method_whitelist': ['HEAD', 'GET', 'OPTIONS'], + # limit of redirects to perform to avoid loops + 'redirect': 5, + # how long to wait while establishing a connection + 'connect_timeout': 30, + # how long to wait for asynchronous operations (jobs) to complete + 'operation_timeout': 900, + # how long to wait between bytes sent by the remote side + 'read_timeout': 300, + # default API port + 'port': 6794, + # validate ssl certificates + 'ssl_verify': False, + # load on activate is set in the HMC activation profile and therefore + # no additional load is executed by the fence agent + 'load_on_activate': False + } + LABEL_BY_OP_MODE = { + 'classic': { + 'nodes': 'logical-partitions', + 'state-on': 'operating', + 'start': 'load', + 'stop': 'deactivate' + }, + 'dpm': { + 'nodes': 'partitions', + 'state-on': 'active', + 'start': 'start', + 'stop': 'stop' + } + } + def __init__(self, host, user, passwd, config=None): + self.host = host + if not passwd: + raise ValueError('Password cannot be empty') + self.passwd = passwd + if not user: + raise ValueError('Username cannot be empty') + self.user = user + self._cpc_cache = {} + self._session = None + self._config = self.DEFAULT_CONFIG.copy() + # apply user defined values + if config: + self._config.update(config) + + def _create_session(self): + """ + Create a new requests session and apply config values + """ + session = requests.Session() + retry_obj = urllib3.Retry( + # setting a total is necessary to cover SSL related errors + total=max(self._config['connect_retries'], + self._config['read_retries']), + connect=self._config['connect_retries'], + read=self._config['read_retries'], + method_whitelist=self._config['method_whitelist'], + redirect=self._config['redirect'] + ) + session.mount('http://', requests.adapters.HTTPAdapter( + max_retries=retry_obj)) + session.mount('https://', requests.adapters.HTTPAdapter( + max_retries=retry_obj)) + return session + + def _get_mode_labels(self, cpc): + """ + Return the map of labels that corresponds to the cpc operation mode + """ + if self.is_dpm_enabled(cpc): + return self.LABEL_BY_OP_MODE['dpm'] + return self.LABEL_BY_OP_MODE['classic'] + + def _get_partition(self, cpc, partition): + """ + Return the properties of the specified partition. Raises ValueError if + it cannot be found. + """ + # HMC API's documentation says it'll return an empty array when no + # matches are found but for a CPC in classic mode it returns in fact + # 404, so we handle this accordingly. Remove the extra handling below + # once this behavior has been fixed on the API's side. + label_map = self._get_mode_labels(cpc) + resp = self._request('get', '{}/{}?name={}'.format( + self._cpc_cache[cpc]['object-uri'], label_map['nodes'], partition), + valid_codes=[200, 404]) + + if label_map['nodes'] not in resp or not resp[label_map['nodes']]: + raise ValueError(ERROR_NOT_FOUND.format( + obj_type='LPAR/Partition', obj_name=partition)) + return resp[label_map['nodes']][0] + + def _partition_switch_power(self, cpc, partition, action): + """ + Perform the API request to start (power on) or stop (power off) the + target partition and wait for the job to finish. + """ + # retrieve partition's uri + part_uri = self._get_partition(cpc, partition)['object-uri'] + label_map = self._get_mode_labels(cpc) + + # in dpm mode the request must have empty body + if self.is_dpm_enabled(cpc): + body = None + # in classic mode we make sure the operation is executed + # even if the partition is already on + else: + body = {'force': True} + # when powering on the partition must be activated first + if action == 'start': + op_uri = '{}/operations/activate'.format(part_uri) + job_resp = self._request( + 'post', op_uri, body=body, valid_codes=[202]) + # always wait for activate otherwise the load (start) + # operation will fail + if self._config['operation_timeout'] == 0: + timeout = self.DEFAULT_CONFIG['operation_timeout'] + else: + timeout = self._config['operation_timeout'] + logging.debug( + 'waiting for activate (timeout %s secs)', timeout) + self._wait_for_job('post', op_uri, job_resp['job-uri'], + timeout=timeout) + if self._config['load_on_activate']: + return + + # trigger the start job + op_uri = '{}/operations/{}'.format(part_uri, label_map[action]) + job_resp = self._request('post', op_uri, body=body, valid_codes=[202]) + if self._config['operation_timeout'] == 0: + return + logging.debug('waiting for %s (timeout %s secs)', + label_map[action], self._config['operation_timeout']) + self._wait_for_job('post', op_uri, job_resp['job-uri'], + timeout=self._config['operation_timeout']) + + def _request(self, method, uri, body=None, headers=None, valid_codes=None): + """ + Perform a request to the HMC API + """ + assert method in ('delete', 'head', 'get', 'post', 'put') + + url = 'https://{host}:{port}{uri}'.format( + host=self.host, port=self._config['port'], uri=uri) + if not headers: + headers = {} + + if self._session is None: + raise ValueError('You need to log on first') + method = getattr(self._session, method) + timeout = ( + self._config['connect_timeout'], self._config['read_timeout']) + response = method(url, json=body, headers=headers, + verify=self._config['ssl_verify'], timeout=timeout) + + if valid_codes and response.status_code not in valid_codes: + reason = '(no reason)' + message = '(no message)' + if response.headers.get('content-type') == 'application/json': + try: + json_resp = response.json() + except ValueError: + pass + else: + reason = json_resp.get('reason', reason) + message = json_resp.get('message', message) + else: + message = '{}...'.format(response.text[:500]) + raise ApiClientRequestError( + response.request.method, response.request.url, + response.status_code, reason, message) + + if response.status_code == 204: + return dict() + try: + json_resp = response.json() + except ValueError: + raise ApiClientRequestError( + response.request.method, response.request.url, + response.status_code, '(no reason)', + 'Invalid JSON content in response') + + return json_resp + + def _update_cpc_cache(self, cpc_props): + self._cpc_cache[cpc_props['name']] = { + 'object-uri': cpc_props['object-uri'], + 'dpm-enabled': cpc_props.get('dpm-enabled', False) + } + + def _wait_for_job(self, req_method, req_uri, job_uri, timeout): + """ + Perform API requests to check for job status until it has completed + or the specified timeout is reached + """ + op_timeout = time.time() + timeout + while time.time() < op_timeout: + job_resp = self._request("get", job_uri) + if job_resp['status'] == 'complete': + if job_resp['job-status-code'] in (200, 201, 204): + return + raise ApiClientRequestError( + req_method, req_uri, + job_resp.get('job-status-code', '(no status)'), + job_resp.get('job-reason-code', '(no reason)'), + job_resp.get('job-results', {}).get( + 'message', '(no message)') + ) + time.sleep(1) + raise ApiClientError('Timed out while waiting for job completion') + + def cpc_list(self): + """ + Return a list of CPCs in the format {'name': 'cpc-name', 'status': + 'operating'} + """ + list_resp = self._request("get", "/api/cpcs", valid_codes=[200]) + ret = [] + for cpc_props in list_resp['cpcs']: + self._update_cpc_cache(cpc_props) + ret.append({ + 'name': cpc_props['name'], 'status': cpc_props['status']}) + return ret + + def is_dpm_enabled(self, cpc): + """ + Return True if CPC is in DPM mode, False for classic mode + """ + if cpc in self._cpc_cache: + return self._cpc_cache[cpc]['dpm-enabled'] + list_resp = self._request("get", "/api/cpcs?name={}".format(cpc), + valid_codes=[200]) + if not list_resp['cpcs']: + raise ValueError(ERROR_NOT_FOUND.format( + obj_type='CPC', obj_name=cpc)) + self._update_cpc_cache(list_resp['cpcs'][0]) + return self._cpc_cache[cpc]['dpm-enabled'] + + def logon(self): + """ + Open a session with the HMC API and store its ID + """ + self._session = self._create_session() + logon_body = {"userid": self.user, "password": self.passwd} + logon_resp = self._request("post", "/api/sessions", body=logon_body, + valid_codes=[200, 201]) + self._session.headers["X-API-Session"] = logon_resp['api-session'] + + def logoff(self): + """ + Close/delete the HMC API session + """ + if self._session is None: + return + self._request("delete", "/api/sessions/this-session", + valid_codes=[204]) + self._cpc_cache = {} + self._session = None + + def partition_list(self, cpc): + """ + Return a list of partitions in the format {'name': 'part-name', + 'status': 'on'} + """ + label_map = self._get_mode_labels(cpc) + list_resp = self._request( + 'get', '{}/{}'.format( + self._cpc_cache[cpc]['object-uri'], label_map['nodes']), + valid_codes=[200]) + status_map = {label_map['state-on']: 'on'} + return [{'name': part['name'], + 'status': status_map.get(part['status'].lower(), 'off')} + for part in list_resp[label_map['nodes']]] + + def partition_start(self, cpc, partition): + """ + Power on a partition + """ + self._partition_switch_power(cpc, partition, 'start') + + def partition_status(self, cpc, partition): + """ + Return the current status of a partition (on or off) + """ + label_map = self._get_mode_labels(cpc) + + part_props = self._get_partition(cpc, partition) + if part_props['status'].lower() == label_map['state-on']: + return 'on' + return 'off' + + def partition_stop(self, cpc, partition): + """ + Power off a partition + """ + self._partition_switch_power(cpc, partition, 'stop') + +def parse_plug(options): + """ + Extract cpc and partition from specified plug value + """ + try: + cpc, partition = options['--plug'].strip().split('/', 1) + except ValueError: + fail_usage('Please specify nodename in format cpc/partition') + cpc = cpc.strip() + if not cpc or not partition: + fail_usage('Please specify nodename in format cpc/partition') + return cpc, partition + +def get_power_status(conn, options): + logging.debug('executing get_power_status') + status = conn.partition_status(*parse_plug(options)) + return status + +def set_power_status(conn, options): + logging.debug('executing set_power_status') + if options['--action'] == 'on': + conn.partition_start(*parse_plug(options)) + elif options['--action'] == 'off': + conn.partition_stop(*parse_plug(options)) + else: + fail_usage('Invalid action {}'.format(options['--action'])) + +def get_outlet_list(conn, options): + logging.debug('executing get_outlet_list') + result = {} + for cpc in conn.cpc_list(): + for part in conn.partition_list(cpc['name']): + result['{}/{}'.format(cpc['name'], part['name'])] = ( + part['name'], part['status']) + return result + +def disconnect(conn): + """ + Close the API session + """ + try: + conn.logoff() + except Exception as exc: + logging.exception('Logoff failed: ') + sys.exit(str(exc)) + +def set_opts(): + """ + Define the options supported by this agent + """ + device_opt = [ + "ipaddr", + "ipport", + "login", + "passwd", + "port", + "connect_retries", + "connect_timeout", + "operation_timeout", + "read_retries", + "read_timeout", + "ssl_secure", + "load_on_activate", + ] + + all_opt["ipport"]["default"] = APIClient.DEFAULT_CONFIG['port'] + all_opt["power_timeout"]["default"] = DEFAULT_POWER_TIMEOUT + port_desc = ("Physical plug id in the format cpc-name/partition-name " + "(case-sensitive)") + all_opt["port"]["shortdesc"] = port_desc + all_opt["port"]["help"] = ( + "-n, --plug=[id] {}".format(port_desc)) + all_opt["connect_retries"] = { + "getopt" : ":", + "longopt" : "connect-retries", + "help" : "--connect-retries=[number] How many times to " + "retry on connection errors", + "default" : APIClient.DEFAULT_CONFIG['connect_retries'], + "type" : "integer", + "required" : "0", + "shortdesc" : "How many times to retry on connection errors", + "order" : 2 + } + all_opt["read_retries"] = { + "getopt" : ":", + "longopt" : "read-retries", + "help" : "--read-retries=[number] How many times to " + "retry on errors related to reading from server", + "default" : APIClient.DEFAULT_CONFIG['read_retries'], + "type" : "integer", + "required" : "0", + "shortdesc" : "How many times to retry on read errors", + "order" : 2 + } + all_opt["connect_timeout"] = { + "getopt" : ":", + "longopt" : "connect-timeout", + "help" : "--connect-timeout=[seconds] How long to wait to " + "establish a connection", + "default" : APIClient.DEFAULT_CONFIG['connect_timeout'], + "type" : "second", + "required" : "0", + "shortdesc" : "How long to wait to establish a connection", + "order" : 2 + } + all_opt["operation_timeout"] = { + "getopt" : ":", + "longopt" : "operation-timeout", + "help" : "--operation-timeout=[seconds] How long to wait for " + "power operation to complete (0 = do not wait)", + "default" : APIClient.DEFAULT_CONFIG['operation_timeout'], + "type" : "second", + "required" : "0", + "shortdesc" : "How long to wait for power operation to complete", + "order" : 2 + } + all_opt["read_timeout"] = { + "getopt" : ":", + "longopt" : "read-timeout", + "help" : "--read-timeout=[seconds] How long to wait " + "to read data from server", + "default" : APIClient.DEFAULT_CONFIG['read_timeout'], + "type" : "second", + "required" : "0", + "shortdesc" : "How long to wait for server data", + "order" : 2 + } + all_opt["load_on_activate"] = { + "getopt" : "", + "longopt" : "load-on-activate", + "help" : "--load-on-activate Rely on the HMC to perform " + "a load operation on activation", + "required" : "0", + "order" : 3 + } + return device_opt + +def main(): + """ + Agent entry point + """ + # register exit handler used by pacemaker + atexit.register(atexit_handler) + + # prepare accepted options + device_opt = set_opts() + + # parse options provided on input + options = check_input(device_opt, process_input(device_opt)) + + docs = { + "shortdesc": "Fence agent for IBM z LPARs", + "longdesc": ( + "fence_ibmz is a power fencing agent which uses the HMC Web " + "Services API to fence IBM z LPARs."), + "vendorurl": "http://www.ibm.com" + } + show_docs(options, docs) + + run_delay(options) + + # set underlying library's logging and ssl config according to specified + # options + requests_log = logging.getLogger("urllib3") + requests_log.propagate = True + if "--verbose" in options: + requests_log.setLevel(logging.DEBUG) + if "--ssl-insecure" in options: + urllib3.disable_warnings( + category=urllib3.exceptions.InsecureRequestWarning) + + hmc_address = options["--ip"] + hmc_userid = options["--username"] + hmc_password = options["--password"] + config = { + 'connect_retries': int(options['--connect-retries']), + 'read_retries': int(options['--read-retries']), + 'operation_timeout': int(options['--operation-timeout']), + 'connect_timeout': int(options['--connect-timeout']), + 'read_timeout': int(options['--read-timeout']), + 'port': int(options['--ipport']), + 'ssl_verify': bool('--ssl-insecure' not in options), + 'load_on_activate': bool('--load-on-activate' in options), + } + try: + conn = APIClient(hmc_address, hmc_userid, hmc_password, config) + conn.logon() + atexit.register(disconnect, conn) + result = fence_action(conn, options, set_power_status, + get_power_status, get_outlet_list) + except Exception: + logging.exception('Exception occurred: ') + result = EC_GENERIC_ERROR + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/ifmib/README b/agents/ifmib/README new file mode 100644 index 0000000..6fe8a2b --- /dev/null +++ b/agents/ifmib/README @@ -0,0 +1,45 @@ +Intro: +------ +This is an SNMP-based fencing agent for RHCS. It was designed with the use-case +of disabling ethernet ports on an iSCSI SAN, but could be used to disable any +port on any SNMP v1/2c/3 device that implementes the IF-MIB. + +The script requires NetSNMP to be installed and working on all nodes +in the cluster. There are no requirements for any MIBs to be setup --- all of +the required OIDs are hard-coded into the script. Since the IF-MIB is an IETF +standard, these identifiers are very widely supported and will not change. + + +Typical usage: +-------------- +To use this agent with the switch used on the iSCSI network, you'll need: + 1) A managed switch running SNMP. + 2) An SNMP community with write privileges. + 3) Permission to send SNMP through any ACLs or firewalls from the nodes. + 4) The ifIndex or ifPort associated with the ports being used by the cluster nodes. + +Consider a three-node cluster composed of A, B, and C. Each node has two +network interfaces - one used for network and cluster communication, the second +used for iSCSI traffic. If A needs to be fenced, B and C will run this script +to administratively disable the switchport for A's connection to the iSCSI +storage. + +If you are using a single interface for cluster and iSCSI traffic, this will +still work, but you will lose network connectivity to the fenced host. + + +cluster.conf: +------------- +There is no GUI support for this fence agent at this time. To use it, you will +need something like this cluster.conf + + + +In a node's fencing methods, you'll include a line like this: + + + +This node will be fenced by disabling the port with ifIndex 43 on the host sw1. +In SNMP speak, we set IF-MIB::ifAdminStatus.43 = down(2). + +If you will use port name (like fc1/1), script will try to find ifIndex. diff --git a/agents/ifmib/fence_ifmib.py b/agents/ifmib/fence_ifmib.py new file mode 100644 index 0000000..d119134 --- /dev/null +++ b/agents/ifmib/fence_ifmib.py @@ -0,0 +1,116 @@ +#!@PYTHON@ -tt + +# The Following agent has been tested on: +# - Cisco MDS UROS 9134 FC (1 Slot) Chassis ("1/2/4 10 Gbps FC/Supervisor-2") Motorola, e500v2 +# with BIOS 1.0.16, kickstart 4.1(1c), system 4.1(1c) +# - Cisco MDS 9124 (1 Slot) Chassis ("1/2/4 Gbps FC/Supervisor-2") Motorola, e500 +# with BIOS 1.0.16, kickstart 4.1(1c), system 4.1(1c) +# - Partially with APC PDU (Network Management Card AOS v2.7.0, Rack PDU APP v2.7.3) +# Only lance if is visible + +import sys +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail_usage, array_to_dict +from fencing_snmp import FencingSnmp + +### CONSTANTS ### +# IF-MIB trees for alias, status and port +ALIASES_OID = ".1.3.6.1.2.1.31.1.1.1.18" +PORTS_OID = ".1.3.6.1.2.1.2.2.1.2" +STATUSES_OID = ".1.3.6.1.2.1.2.2.1.7" + +# Status constants returned as value from SNMP +STATUS_UP = 1 +STATUS_DOWN = 2 +STATUS_TESTING = 3 + +### GLOBAL VARIABLES ### +# Port number converted from port name or index +port_num = None + +### FUNCTIONS ### + +# Convert port index or name to port index +def port2index(conn, port): + res = None + + if port.isdigit(): + res = int(port) + else: + ports = conn.walk(PORTS_OID, 30) + + for x in ports: + if x[1].strip('"') == port: + res = int(x[0].split('.')[-1]) + break + + if res == None: + fail_usage("Can't find port with name %s!"%(port)) + + return res + +def get_power_status(conn, options): + global port_num + + if port_num == None: + port_num = port2index(conn, options["--plug"]) + + (_, status) = conn.get("%s.%d"%(STATUSES_OID, port_num)) + return status == str(STATUS_UP) and "on" or "off" + +def set_power_status(conn, options): + global port_num + + if port_num == None: + port_num = port2index(conn, options["--plug"]) + + conn.set("%s.%d" % (STATUSES_OID, port_num), (options["--action"] == "on" and STATUS_UP or STATUS_DOWN)) + +def get_outlets_status(conn, options): + result = {} + + res_fc = conn.walk(PORTS_OID, 30) + res_aliases = array_to_dict(conn.walk(ALIASES_OID, 30)) + + for x in res_fc: + port_number = x[0].split('.')[-1] + + port_name = x[1].strip('"') + port_alias = (port_number in res_aliases and res_aliases[port_number].strip('"') or "") + port_status = "" + result[port_name] = (port_alias, port_status) + + return result + +# Main agent method +def main(): + device_opt = ["fabric_fencing", "ipaddr", "login", "passwd", "no_login", "no_password", \ + "port", "snmp_version", "snmp"] + + atexit.register(atexit_handler) + + all_opt["snmp_version"]["default"] = "2c" + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for IF MIB" + docs["longdesc"] = "fence_ifmib is an I/O Fencing agent \ +which can be used with any SNMP IF-MIB capable device. \ +\n.P\n\ +It was written with managed ethernet switches in mind, in order to \ +fence iSCSI SAN connections. However, there are many devices that \ +support the IF-MIB interface. The agent uses IF-MIB::ifAdminStatus \ +to control the state of an interface." + docs["vendorurl"] = "http://www.ietf.org/wg/concluded/ifmib.html" + show_docs(options, docs) + + # Operate the fencing device + result = fence_action(FencingSnmp(options), options, set_power_status, get_power_status, get_outlets_status) + + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/ilo/fence_ilo.py b/agents/ilo/fence_ilo.py new file mode 100644 index 0000000..6124505 --- /dev/null +++ b/agents/ilo/fence_ilo.py @@ -0,0 +1,143 @@ +#!@PYTHON@ -tt + +##### +## +## The Following Agent Has Been Tested On: +## +## iLO Version +## +---------------------------------------------+ +## iLO / firmware 1.91 / RIBCL 2.22 +## iLO2 / firmware 1.22 / RIBCL 2.22 +## iLO2 / firmware 1.50 / RIBCL 2.22 +##### + +import sys, re, pexpect +import atexit +from xml.sax.saxutils import quoteattr +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, EC_LOGIN_DENIED + +def get_power_status(conn, options): + conn.send("\r\n") + conn.send("\r\n") + conn.send("\r\n") + conn.log_expect("HOST_POWER=\"(.*?)\"", int(options["--power-timeout"])) + + status = conn.match.group(1) + return status.lower().strip() + +def set_power_status(conn, options): + conn.send("\r\n") + conn.send("") + + if options.get("fw_processor", None) == "iLO2": + if options["fw_version"] > 1.29: + conn.send("\r\n") + else: + conn.send("\r\n") + elif options["--ribcl-version"] < 2.21: + conn.send("\r\n") + else: + if options["--action"] == "off": + conn.send("\r\n") + else: + conn.send("\r\n") + conn.send("\r\n") + + return + +def define_new_opts(): + all_opt["ribcl"] = { + "getopt" : "r:", + "longopt" : "ribcl-version", + "help" : "-r, --ribcl-version=[version] Force ribcl version to use", + "required" : "0", + "shortdesc" : "Force ribcl version to use", + "order" : 1} + +def main(): + device_opt = ["ipaddr", "login", "passwd", "ssl", "notls", "tls1.0", "ribcl"] + + atexit.register(atexit_handler) + + define_new_opts() + + all_opt["login_timeout"]["default"] = "10" + all_opt["retry_on"]["default"] = "3" + all_opt["ssl"]["default"] = "1" + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for HP iLO" + docs["longdesc"] = "fence_ilo is an I/O Fencing agent \ +used for HP servers with the Integrated Light Out (iLO) PCI card.\ +The agent opens an SSL connection to the iLO card. Once the SSL \ +connection is established, the agent is able to communicate with \ +the iLO card through an XML stream." + docs["vendorurl"] = "http://www.hp.com" + docs["symlink"] = [("fence_ilo2", "Fence agent for HP iLO2")] + show_docs(options, docs) + + ## + ## Login and get version number + #### + conn = fence_login(options) + try: + conn.send("\r\n") + conn.log_expect(["", ""], int(options["--login-timeout"])) + except pexpect.TIMEOUT: + fail(EC_LOGIN_DENIED) + except pexpect.EOF: + if "--tls1.0" in options: + fail(EC_LOGIN_DENIED) + options["--tls1.0"] = "1" + conn.close() + conn = fence_login(options) + try: + conn.send("\r\n") + conn.log_expect(["", ""], int(options["--login-timeout"])) + except pexpect.TIMEOUT: + fail(EC_LOGIN_DENIED) + except pexpect.EOF: + fail(EC_LOGIN_DENIED) + + try: + version = re.compile("= 2: + conn.send("\r\n") + else: + conn.send("\r\n") + + conn.send("\r\n") + if options["--ribcl-version"] >= 2: + conn.send("\r\n") + conn.send("\r\n") + conn.log_expect(r"", int(options["--shell-timeout"])) + options["fw_version"] = float(re.compile(r"FIRMWARE_VERSION\s*=\s*\"(.*?)\"", + re.IGNORECASE).search(conn.before).group(1)) + options["fw_processor"] = re.compile(r"MANAGEMENT_PROCESSOR\s*=\s*\"(.*?)\"", + re.IGNORECASE).search(conn.before).group(1) + conn.send("\r\n") + except pexpect.TIMEOUT: + fail(EC_LOGIN_DENIED) + except pexpect.EOF: + fail(EC_LOGIN_DENIED) + + ## + ## Fence operations + #### + result = fence_action(conn, options, set_power_status, get_power_status, None) + + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/ilo_moonshot/fence_ilo_moonshot.py b/agents/ilo_moonshot/fence_ilo_moonshot.py new file mode 100644 index 0000000..1923eeb --- /dev/null +++ b/agents/ilo_moonshot/fence_ilo_moonshot.py @@ -0,0 +1,65 @@ +#!@PYTHON@ -tt + +import sys +import logging +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, EC_STATUS + +def get_power_status(conn, options): + conn.send_eol("show node list") + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) + + nodes = {} + for line in conn.before.splitlines(): + if len(line.split()) == 10: + nodes[line.split()[1]] = ("", line.split()[8].lower().strip()) + + if ["list", "monitor"].count(options["--action"]) == 1: + return nodes + else: + try: + (_, status) = nodes[options["--plug"]] + return status.lower() + except KeyError as e: + logging.error("Failed: {}".format(str(e))) + fail(EC_STATUS) + +def set_power_status(conn, options): + if options["--action"] == "on": + conn.send_eol("set node power on %s" % (options["--plug"])) + else: + conn.send_eol("set node power off force %s" % (options["--plug"])) + + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + + return + +def main(): + device_opt = ["ipaddr", "login", "passwd", "secure", "cmd_prompt", "port"] + + atexit.register(atexit_handler) + + all_opt["secure"]["default"] = "1" + all_opt["cmd_prompt"]["default"] = ["MP>", "hpiLO->"] + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for HP Moonshot iLO" + docs["longdesc"] = "" + docs["vendorurl"] = "http://www.hp.com" + show_docs(options, docs) + + conn = fence_login(options) + + ## + ## Fence operations + #### + result = fence_action(conn, options, set_power_status, get_power_status, get_power_status) + fence_logout(conn, "exit") + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/ilo_mp/fence_ilo_mp.py b/agents/ilo_mp/fence_ilo_mp.py new file mode 100644 index 0000000..1ae4d3e --- /dev/null +++ b/agents/ilo_mp/fence_ilo_mp.py @@ -0,0 +1,58 @@ +#!@PYTHON@ -tt + +import sys, re +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * + +def get_power_status(conn, options): + conn.send_eol("show /system1") + + re_state = re.compile('EnabledState=(.*)', re.IGNORECASE) + conn.log_expect(re_state, int(options["--shell-timeout"])) + + status = conn.match.group(1).lower() + + if status.startswith("enabled"): + return "on" + else: + return "off" + +def set_power_status(conn, options): + if options["--action"] == "on": + conn.send_eol("start /system1") + else: + conn.send_eol("stop -f /system1") + + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + + return + +def main(): + device_opt = ["ipaddr", "login", "passwd", "secure", "cmd_prompt", "telnet"] + + atexit.register(atexit_handler) + + all_opt["cmd_prompt"]["default"] = ["MP>", "hpiLO->"] + all_opt["power_wait"]["default"] = 5 + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for HP iLO MP" + docs["longdesc"] = "" + docs["vendorurl"] = "http://www.hp.com" + show_docs(options, docs) + + conn = fence_login(options) + conn.send_eol("SMCLP") + + ## + ## Fence operations + #### + result = fence_action(conn, options, set_power_status, get_power_status) + fence_logout(conn, "exit") + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/ilo_ssh/fence_ilo_ssh.py b/agents/ilo_ssh/fence_ilo_ssh.py new file mode 100644 index 0000000..a27e341 --- /dev/null +++ b/agents/ilo_ssh/fence_ilo_ssh.py @@ -0,0 +1,77 @@ +#!@PYTHON@ -tt + +import sys, re +import atexit +import logging +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * + +def get_power_status(conn, options): + conn.send_eol("show /system1") + + re_state = re.compile('EnabledState=(.*)', re.IGNORECASE) + conn.log_expect(re_state, int(options["--shell-timeout"])) + + status = conn.match.group(1).lower() + + if status.startswith("enabled"): + return "on" + else: + return "off" + +def set_power_status(conn, options): + if options["--action"] == "on": + conn.send_eol("start /system1") + else: + conn.send_eol("power off hard") + + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + + return + +def reboot_cycle(conn, options): + conn.send_eol("reset /system1 hard") + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + + if get_power_status(conn, options) == "off": + logging.error("Timed out waiting to power ON\n") + + return True + +def main(): + device_opt = ["ipaddr", "login", "passwd", "secure", "cmd_prompt", "method", "telnet"] + + atexit.register(atexit_handler) + + all_opt["cmd_prompt"]["default"] = ["MP>", "hpiLO->"] + all_opt["power_wait"]["default"] = 5 + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for HP iLO over SSH" + docs["longdesc"] = "fence_ilo_ssh is a fence agent that connects to iLO device. It logs into \ +device via ssh and reboot a specified outlet.\ +\n.P\n\ +WARNING: The monitor-action is prone to timeouts. Use the fence_ilo-equivalent \ +to avoid this issue." + docs["vendorurl"] = "http://www.hp.com" + docs["symlink"] = [("fence_ilo3_ssh", "Fence agent for HP iLO3 over SSH"), + ("fence_ilo4_ssh", "Fence agent for HP iLO4 over SSH"), + ("fence_ilo5_ssh", "Fence agent for HP iLO5 over SSH")] + show_docs(options, docs) + + options["eol"] = "\r" + + conn = fence_login(options) + conn.send_eol("SMCLP") + + ## + ## Fence operations + #### + result = fence_action(conn, options, set_power_status, get_power_status, None, reboot_cycle) + fence_logout(conn, "exit") + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/intelmodular/fence_intelmodular.py b/agents/intelmodular/fence_intelmodular.py new file mode 100644 index 0000000..294ea4d --- /dev/null +++ b/agents/intelmodular/fence_intelmodular.py @@ -0,0 +1,86 @@ +#!@PYTHON@ -tt + +# Tested with an Intel MFSYS25 using firmware package 2.6 Should work with an +# MFSYS35 as well. +# +# Notes: +# +# The manual and firmware release notes says SNMP is read only. This is not +# true, as per the MIBs that ship with the firmware you can write to +# the bladePowerLed oid to control the servers. +# +# Thanks Matthew Kent for original agent and testing. + +import sys +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing_snmp import FencingSnmp + +### CONSTANTS ### +# From INTELCORPORATION-MULTI-FLEX-SERVER-BLADES-MIB.my that ships with +# firmware updates +STATUSES_OID = ".1.3.6.1.4.1.343.2.19.1.2.10.202.1.1.6" + +# Status constants returned as value from SNMP +STATUS_UP = 2 +STATUS_DOWN = 0 + +# Status constants to set as value to SNMP +STATUS_SET_ON = 2 +STATUS_SET_OFF = 3 + +### FUNCTIONS ### + +def get_power_status(conn, options): + (_, status) = conn.get("%s.%s"% (STATUSES_OID, options["--plug"])) + return status == str(STATUS_UP) and "on" or "off" + +def set_power_status(conn, options): + conn.set("%s.%s" % (STATUSES_OID, options["--plug"]), + (options["--action"] == "on" and STATUS_SET_ON or STATUS_SET_OFF)) + +def get_outlets_status(conn, options): + result = {} + + res_blades = conn.walk(STATUSES_OID, 30) + + for x in res_blades: + port_num = x[0].split('.')[-1] + + port_alias = "" + port_status = (x[1] == str(STATUS_UP) and "on" or "off") + + result[port_num] = (port_alias, port_status) + + return result + +# Main agent method +def main(): + device_opt = ["ipaddr", "login", "passwd", "no_login", "no_password", + "port", "snmp_version", "snmp"] + + atexit.register(atexit_handler) + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for Intel Modular" + docs["longdesc"] = "fence_intelmodular is an I/O Fencing agent \ +which can be used with Intel Modular device (tested on Intel MFSYS25, should \ +work with MFSYS35 as well). \ +\n.P\n\ +Note: Since firmware update version 2.7, SNMP v2 write support is \ +removed, and replaced by SNMP v3 support. So agent now has default \ +SNMP version 3. If you are using older firmware, please supply -d \ +for command line and snmp_version option for your cluster.conf." + docs["vendorurl"] = "http://www.intel.com" + show_docs(options, docs) + + # Operate the fencing device + result = fence_action(FencingSnmp(options), options, set_power_status, get_power_status, get_outlets_status) + + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/ipdu/fence_ipdu.py b/agents/ipdu/fence_ipdu.py new file mode 100644 index 0000000..da34d2b --- /dev/null +++ b/agents/ipdu/fence_ipdu.py @@ -0,0 +1,153 @@ +#!@PYTHON@ -tt + +# The Following agent has been tested on: +# IBM iPDU model 46M4002 +# Firmware release OPDP_sIBM_v01.2_1 +# + +import sys +import atexit +import logging +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail_usage +from fencing_snmp import FencingSnmp + +### CONSTANTS ### +# oid defining fence device +OID_SYS_OBJECT_ID = '.1.3.6.1.2.1.1.2.0' + +### GLOBAL VARIABLES ### +# Device - see IBM iPDU +device = None + +# Port ID +port_id = None +# Switch ID +switch_id = None + +# Classes describing Device params +class IBMiPDU(object): + # iPDU + status_oid = '.1.3.6.1.4.1.2.6.223.8.2.2.1.11.%d' + control_oid = '.1.3.6.1.4.1.2.6.223.8.2.2.1.11.%d' + outlet_table_oid = '.1.3.6.1.4.1.2.6.223.8.2.2.1.2' + ident_str = "IBM iPDU" + state_on = 1 + state_off = 0 + turn_on = 1 + turn_off = 0 + has_switches = False + +### FUNCTIONS ### +def ipdu_set_device(conn, options): + global device + + agents_dir = {'.1.3.6.1.4.1.2.6.223':IBMiPDU, + None:IBMiPDU} + + # First resolve type of PDU device + pdu_type = conn.walk(OID_SYS_OBJECT_ID) + + if not ((len(pdu_type) == 1) and (pdu_type[0][1] in agents_dir)): + pdu_type = [[None, None]] + + device = agents_dir[pdu_type[0][1]] + + logging.debug("Trying %s"%(device.ident_str)) + +def ipdu_resolv_port_id(conn, options): + global port_id, switch_id + + if device == None: + ipdu_set_device(conn, options) + + # Now we resolv port_id/switch_id + if options["--plug"].isdigit() and ((not device.has_switches) or (options["--switch"].isdigit())): + port_id = int(options["--plug"]) + + if device.has_switches: + switch_id = int(options["--switch"]) + else: + table = conn.walk(device.outlet_table_oid, 30) + + for x in table: + if x[1].strip('"') == options["--plug"]: + t = x[0].split('.') + if device.has_switches: + port_id = int(t[len(t)-1]) + switch_id = int(t[len(t)-3]) + else: + port_id = int(t[len(t)-1]) + + if port_id == None: + fail_usage("Can't find port with name %s!"%(options["--plug"])) + +def get_power_status(conn, options): + if port_id == None: + ipdu_resolv_port_id(conn, options) + + oid = ((device.has_switches) and device.status_oid%(switch_id, port_id) or device.status_oid%(port_id)) + + (oid, status) = conn.get(oid) + return status == str(device.state_on) and "on" or "off" + +def set_power_status(conn, options): + if port_id == None: + ipdu_resolv_port_id(conn, options) + + oid = ((device.has_switches) and device.control_oid%(switch_id, port_id) or device.control_oid%(port_id)) + + conn.set(oid, (options["--action"] == "on" and device.turn_on or device.turn_off)) + + +def get_outlets_status(conn, options): + result = {} + + if device == None: + ipdu_set_device(conn, options) + + res_ports = conn.walk(device.outlet_table_oid, 30) + + for x in res_ports: + t = x[0].split('.') + + port_num = ((device.has_switches) and "%s:%s"%(t[len(t)-3], t[len(t)-1]) or "%s"%(t[len(t)-1])) + + port_name = x[1].strip('"') + port_status = "" + result[port_num] = (port_name, port_status) + + return result + +# Main agent method +def main(): + global device + + device_opt = ["ipaddr", "login", "passwd", "no_login", "no_password", \ + "port", "snmp_version", "snmp"] + + atexit.register(atexit_handler) + + all_opt["snmp_version"]["default"] = "3" + all_opt["community"]["default"] = "private" + all_opt["switch"]["default"] = "1" + device = IBMiPDU + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for iPDU over SNMP" + docs["longdesc"] = "fence_ipdu is an I/O Fencing agent \ +which can be used with the IBM iPDU network power switch. It logs \ +into a device via SNMP and reboots a specified outlet. It supports \ +SNMP v3 with all combinations of authenticity/privacy settings." + docs["vendorurl"] = "http://www.ibm.com" + show_docs(options, docs) + + # Operate the fencing device + result = fence_action(FencingSnmp(options), options, set_power_status, get_power_status, get_outlets_status) + + sys.exit(result) +if __name__ == "__main__": + main() diff --git a/agents/ipmilan/fence_ipmilan.py b/agents/ipmilan/fence_ipmilan.py new file mode 100644 index 0000000..f751de6 --- /dev/null +++ b/agents/ipmilan/fence_ipmilan.py @@ -0,0 +1,233 @@ +#!@PYTHON@ -tt + +import sys, re, os +import atexit +from pipes import quote +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail_usage, is_executable, run_command, run_delay + +def get_power_status(_, options): + output = _run_command(options, "status") + match = re.search('[Cc]hassis [Pp]ower is [\\s]*([a-zA-Z]{2,3})', str(output)) + status = match.group(1) if match else None + return status + +def set_power_status(_, options): + _run_command(options, options["--action"]) + return + +def reboot_cycle(_, options): + output = _run_command(options, "cycle") + return bool(re.search('chassis power control: cycle', str(output).lower())) + +def reboot_diag(_, options): + output = _run_command(options, "diag") + return bool(re.search('chassis power control: diag', str(output).lower())) + +def _run_command(options, action): + cmd, log_cmd = create_command(options, action) + return run_command(options, cmd, log_command=log_cmd) + +def create_command(options, action): + class Cmd: + cmd = "" + log = "" + + @classmethod + def append(cls, cmd, log=None): + cls.cmd += cmd + cls.log += (cmd if log is None else log) + + # --use-sudo / -d + if "--use-sudo" in options: + Cmd.append(options["--sudo-path"] + " ") + + Cmd.append(options["--ipmitool-path"]) + + # --lanplus / -L + if "--lanplus" in options and options["--lanplus"] in ["", "1"]: + Cmd.append(" -I lanplus") + else: + Cmd.append(" -I lan") + + # --ip / -a + Cmd.append(" -H " + options["--ip"]) + + # --port / -n + if "--ipport" in options: + Cmd.append(" -p " + options["--ipport"]) + + # --target + if "--target" in options: + Cmd.append(" -t " + options["--target"]) + + # --username / -l + if "--username" in options and len(options["--username"]) != 0: + Cmd.append(" -U " + quote(options["--username"])) + + # --auth / -A + if "--auth" in options: + Cmd.append(" -A " + options["--auth"]) + + # --password / -p + if "--password" in options: + Cmd.append(" -P " + quote(options["--password"]), " -P [set]") + else: + Cmd.append(" -P ''", " -P [set]") + + # --cipher / -C + if "--cipher" in options: + Cmd.append(" -C " + options["--cipher"]) + + if "--privlvl" in options: + Cmd.append(" -L " + options["--privlvl"]) + + if "--hexadecimal-kg" in options: + Cmd.append(" -y " + options["--hexadecimal-kg"]) + + if "--ipmitool-timeout" in options: + Cmd.append(" -N " + options["--ipmitool-timeout"]) + + # --action / -o + Cmd.append(" chassis power " + action) + + # --verbose-level + if options["--verbose-level"] > 1: + Cmd.append(" -" + "v" * (options["--verbose-level"] - 1)) + + return (Cmd.cmd, Cmd.log) + +def define_new_opts(): + all_opt["lanplus"] = { + "getopt" : "P", + "longopt" : "lanplus", + "help" : "-P, --lanplus Use Lanplus to improve security of connection", + "required" : "0", + "default" : "0", + "shortdesc" : "Use Lanplus to improve security of connection", + "order": 1 + } + all_opt["auth"] = { + "getopt" : "A:", + "longopt" : "auth", + "help" : "-A, --auth=[auth] IPMI Lan Auth type (md5|password|none)", + "required" : "0", + "shortdesc" : "IPMI Lan Auth type.", + "choices" : ["md5", "password", "none"], + "order": 1 + } + all_opt["cipher"] = { + "getopt" : "C:", + "longopt" : "cipher", + "help" : "-C, --cipher=[cipher] Ciphersuite to use (same as ipmitool -C parameter)", + "required" : "0", + "shortdesc" : "Ciphersuite to use (same as ipmitool -C parameter)", + "order": 1 + } + all_opt["privlvl"] = { + "getopt" : "L:", + "longopt" : "privlvl", + "help" : "-L, --privlvl=[level] " + "Privilege level on IPMI device (callback|user|operator|administrator)", + "required" : "0", + "shortdesc" : "Privilege level on IPMI device", + "default" : "administrator", + "choices" : ["callback", "user", "operator", "administrator"], + "order": 1 + } + all_opt["ipmitool_path"] = { + "getopt" : ":", + "longopt" : "ipmitool-path", + "help" : "--ipmitool-path=[path] Path to ipmitool binary", + "required" : "0", + "shortdesc" : "Path to ipmitool binary", + "default" : "@IPMITOOL_PATH@", + "order": 200 + } + all_opt["ipmitool_timeout"] = { + "getopt" : ":", + "longopt" : "ipmitool-timeout", + "help" : "--ipmitool-timeout=[timeout] Timeout (sec) for IPMI operation", + "required" : "0", + "shortdesc" : "Timeout (sec) for IPMI operation", + "default" : "2", + "order": 201 + } + all_opt["target"] = { + "getopt" : ":", + "longopt" : "target", + "help" : "--target=[targetaddress] Bridge IPMI requests to the remote target address", + "required" : "0", + "shortdesc" : "Bridge IPMI requests to the remote target address", + "order": 1 + } + all_opt["hexadecimal_kg"] = { + "getopt" : ":", + "longopt" : "hexadecimal-kg", + "help" : "--hexadecimal-kg=[key] Hexadecimal-encoded Kg key for IPMIv2 authentication", + "required" : "0", + "shortdesc" : "Hexadecimal-encoded Kg key for IPMIv2 authentication", + "order": 1 + } + +def main(): + atexit.register(atexit_handler) + + device_opt = ["ipaddr", "login", "no_login", "no_password", "passwd", + "diag", "lanplus", "auth", "cipher", "privlvl", "sudo", + "ipmitool_path", "ipmitool_timeout", "method", "target", "hexadecimal_kg"] + define_new_opts() + + all_opt["power_wait"]["default"] = 2 + if os.path.basename(sys.argv[0]) == "fence_ilo3": + all_opt["power_wait"]["default"] = "4" + all_opt["lanplus"]["default"] = "1" + elif os.path.basename(sys.argv[0]) == "fence_ilo4": + all_opt["lanplus"]["default"] = "1" + elif os.path.basename(sys.argv[0]) == "fence_ilo5": + all_opt["lanplus"]["default"] = "1" + elif os.path.basename(sys.argv[0]) == "fence_ipmilanplus": + all_opt["lanplus"]["default"] = "1" + + all_opt["ipport"]["default"] = "623" + all_opt["method"]["help"] = "-m, --method=[method] Method to fence (onoff|cycle) (Default: onoff)\n" \ + "WARNING! This fence agent might report success before the node is powered off. " \ + "You should use -m/method onoff if your fence device works correctly with that option." + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for IPMI" + docs["longdesc"] = "fence_ipmilan is an I/O Fencing agent\ +which can be used with machines controlled by IPMI.\ +This agent calls support software ipmitool (http://ipmitool.sf.net/). \ +WARNING! This fence agent might report success before the node is powered off. \ +You should use -m/method onoff if your fence device works correctly with that option." + docs["vendorurl"] = "" + docs["symlink"] = [("fence_ilo3", "Fence agent for HP iLO3"), + ("fence_ilo4", "Fence agent for HP iLO4"), + ("fence_ilo5", "Fence agent for HP iLO5"), + ("fence_ipmilanplus", "Fence agent for IPMIv2 lanplus"), + ("fence_imm", "Fence agent for IBM Integrated Management Module"), + ("fence_idrac", "Fence agent for Dell iDRAC")] + show_docs(options, docs) + + run_delay(options) + + if not is_executable(options["--ipmitool-path"]): + fail_usage("Ipmitool not found or not accessible") + + reboot_fn = reboot_cycle + if options["--action"] == "diag": + # Diag is a special action that can't be verified so we will reuse reboot functionality + # to minimize impact on generic library + options["--action"] = "reboot" + options["--method"] = "cycle" + reboot_fn = reboot_diag + + result = fence_action(None, options, set_power_status, get_power_status, None, reboot_fn) + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/ironic/fence_ironic.py b/agents/ironic/fence_ironic.py new file mode 100644 index 0000000..66d84fc --- /dev/null +++ b/agents/ironic/fence_ironic.py @@ -0,0 +1,130 @@ +#!@PYTHON@ -tt + +import atexit +import logging +import os +import re +import sys +from pipes import quote +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail_usage, is_executable, run_command, run_delay + +def get_name_or_uuid(options): + return options["--uuid"] if "--uuid" in options else options["--plug"] + +def get_power_status(_, options): + output = ironic_run_command(options, "status") + stdout = output[1] + match = re.search('power[\\s]*([a-zA-Z]{2,3})', str(stdout)) + status = match.group(1) if match else None + return status + +def set_power_status(_, options): + ironic_run_command(options, options["--action"]) + return + +def get_devices_list(_, options): + nodes = {} + output = ironic_run_command(options, "list") + stdout = output[1] + for line in stdout.splitlines(): + uuid = "UUID" + try: + (uuid, name, state) = line.split(',') + except ValueError: + pass + if "UUID" in uuid: + continue # skip line header + match = re.search('power[\\s]*([a-zA-Z]{2,3})', state) + status = match.group(1) if match else None + nodes[uuid] = (name, status) + + return nodes + +def ironic_run_command(options, action, timeout=None): + cmd = options["--openstack-path"] + " baremetal" + env = os.environ.copy() + # --username / -l + if "--username" in options and len(options["--username"]) != 0: + env["OS_USERNAME"] = options["--username"] + + # --password / -p + if "--password" in options: + env["OS_PASSWORD"] = options["--password"] + + # --tenant-name -t + if "--tenant-name" in options: + env["OS_TENANT_NAME"] = options["--tenant-name"] + + # --auth-url + if "--auth-url" in options: + env["OS_AUTH_URL"] = options["--auth-url"] + + # --action / -o + if action == "status": + cmd += " show %s -c power_state --format value" % (get_name_or_uuid(options)) + elif action in ["on", "off"]: + cmd += " power %s %s" % (action, get_name_or_uuid(options)) + elif action == "list": + cmd += " list -c 'Instance UUID' -c Name -c 'Power State' --format csv --quote minimal" + + + logging.debug("cmd -> %s" % cmd) + return run_command(options, cmd, timeout, env) + +def define_new_opts(): + all_opt["auth-url"] = { + "getopt" : ":", + "longopt" : "auth-url", + "help" : "--auth-url=[authurl] Auth URL", + "required" : "1", + "shortdesc" : "Keystone Admin Auth URL", + "order": 1 + } + all_opt["tenant-name"] = { + "getopt" : "t:", + "longopt" : "tenant-name", + "help" : "-t, --tenant-name=[tenant] Tenantname", + "required" : "0", + "shortdesc" : "Keystone Admin Tenant", + "default": "admin", + "order": 1 + } + all_opt["openstack-path"] = { + "getopt" : ":", + "longopt" : "openstack-path", + "help" : "--openstack-path=[path] Path to openstack binary", + "required" : "0", + "shortdesc" : "Path to the OpenStack binary", + "default" : "@OPENSTACK_PATH@", + "order": 200 + } + +def main(): + atexit.register(atexit_handler) + + device_opt = ["login", "passwd", "port", "auth-url", "tenant-name", "openstack-path"] + define_new_opts() + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for OpenStack's Ironic (Bare Metal as a service) service" + docs["longdesc"] = "fence_ironic is a Fencing agent \ +which can be used with machines controlled by the Ironic service. \ +This agent calls the openstack CLI. \ +WARNING! This fence agent is not intended for production use. Relying on a functional ironic service for fencing is not a good design choice." + docs["vendorurl"] = "https://wiki.openstack.org/wiki/Ironic" + show_docs(options, docs) + + run_delay(options) + + if not is_executable(options["--openstack-path"]): + fail_usage("openstack tool not found or not accessible") + + result = fence_action(None, options, set_power_status, get_power_status, get_devices_list) + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/kdump/fence_kdump.c b/agents/kdump/fence_kdump.c new file mode 100644 index 0000000..eda1559 --- /dev/null +++ b/agents/kdump/fence_kdump.c @@ -0,0 +1,592 @@ +/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- + * + * Copyright (c) Ryan O'Hara (rohara@redhat.com) + * Copyright (c) Red Hat, Inc. + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "options.h" +#include "message.h" +#include "version.h" + +static int verbose = 0; + +#define log_debug(lvl, fmt, args...) \ +do { \ + if (lvl <= verbose) { \ + fprintf (stdout, "[debug]: " fmt, ##args); \ + syslog (LOG_INFO, fmt, ##args); \ + } \ +} while (0); + +#define log_error(lvl, fmt, args...) \ +do { \ + if (lvl <= verbose) { \ + fprintf (stderr, "[error]: " fmt, ##args); \ + syslog (LOG_ERR, fmt, ##args); \ + } \ +} while (0); + +static int +trim (char *str) +{ + char *p; + int len; + + if (!str) return (0); + + len = strlen (str); + + while (len--) { + if (isspace (str[len])) { + str[len] = 0; + } else { + break; + } + } + + for (p = str; *p && isspace (*p); p++); + + memmove (str, p, strlen (p) + 1); + + return (strlen (str)); +} + +static int +do_action_monitor (void) +{ + const char cmdline_path[] = "/proc/cmdline"; + FILE *procFile; + size_t sz = 0; + char *lines = NULL; + int result = 1; + + procFile = fopen(cmdline_path, "r"); + + if (procFile == NULL) { + log_error (0, "Unable to open file %s (%s)\n", cmdline_path, strerror (errno)); + return 1; + } + + while (!feof (procFile)) { + ssize_t rv = getline (&lines, &sz, procFile); + if ((rv != -1) && (strstr(lines, "crashkernel=") != NULL)) { + result = 0; + } + } + + free (lines); + fclose (procFile); + + return result; +} + +static int +do_action_off (const fence_kdump_opts_t *opts) +{ + int error; + fd_set rfds; + fence_kdump_msg_t msg; + fence_kdump_node_t *node; + struct timeval timeout; + struct addrinfo hints; + fence_kdump_node_t *check_node; + char addr[NI_MAXHOST]; + char port[NI_MAXSERV]; + struct sockaddr_storage ss; + socklen_t size = sizeof (ss); + + if (list_empty (&opts->nodes)) { + return (1); + } else { + node = list_first_entry (&opts->nodes, fence_kdump_node_t, list); + } + + timeout.tv_sec = opts->timeout; + timeout.tv_usec = 0; + + FD_ZERO (&rfds); + FD_SET (node->socket, &rfds); + + // create listening socket + memset (&hints, 0, sizeof (hints)); + + hints.ai_family = opts->family; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_protocol = IPPROTO_UDP; + hints.ai_flags = AI_NUMERICSERV; + + hints.ai_family = node->info->ai_family; + hints.ai_flags |= AI_PASSIVE; + + freeaddrinfo (node->info); + + node->info = NULL; + error = getaddrinfo (NULL, node->port, &hints, &node->info); + if (error != 0) { + log_error (2, "getaddrinfo (%s)\n", gai_strerror (error)); + free_node (node); + return (1); + } + + error = bind (node->socket, node->info->ai_addr, node->info->ai_addrlen); + if (error != 0) { + log_error (2, "bind (%s)\n", strerror (errno)); + free_node (node); + return (1); + } + + list_for_each_entry (check_node, &opts->nodes, list) { + log_debug (0, "waiting for message from '%s'\n", check_node->addr); + if (node->info->ai_family != check_node->info->ai_family) { + log_error (0, "mixing IPv4 and IPv6 nodes is not supported\n"); + return (1); + } + } + + for (;;) { + error = select (node->socket + 1, &rfds, NULL, NULL, &timeout); + if (error < 0) { + log_error (2, "select (%s)\n", strerror (errno)); + break; + } + if (error == 0) { + log_debug (0, "timeout after %d seconds\n", opts->timeout); + break; + } + + error = recvfrom (node->socket, &msg, sizeof (msg), 0, (struct sockaddr *) &ss, &size); + if (error < 0) { + log_error (2, "recvfrom (%s)\n", strerror (errno)); + continue; + } + + error = getnameinfo ((struct sockaddr *) &ss, size, + addr, sizeof (addr), + port, sizeof (port), + NI_NUMERICHOST | NI_NUMERICSERV); + if (error != 0) { + log_error (2, "getnameinfo (%s)\n", gai_strerror (error)); + continue; + } + + if (msg.magic != FENCE_KDUMP_MAGIC) { + log_debug (1, "invalid magic number '0x%X'\n", msg.magic); + continue; + } + + // check if we have matched messages from any known node + list_for_each_entry (check_node, &opts->nodes, list) { + error = strcasecmp (check_node->addr, addr); + if (error == 0 ) { + switch (msg.version) { + case FENCE_KDUMP_MSGV1: + log_debug (0, "received valid message from '%s'\n", addr); + return (0); + default: + log_debug (1, "invalid message version '0x%X'\n", msg.version); + continue; + } + } + } + log_debug (1, "discard message from '%s'\n", addr); + + } + + return (1); +} + +static int +do_action_metadata (const char *self) +{ + fprintf (stdout, "\n"); + fprintf (stdout, "\n"); + fprintf (stdout, ""); + fprintf (stdout, "fence_kdump is an I/O fencing agent to be used with the kdump\n" + "crash recovery service. When the fence_kdump agent is invoked,\n" + "it will listen for a message from the failed node that acknowledges\n" + "that the failed node is executing the kdump crash kernel.\n" + "Note that fence_kdump is not a replacement for traditional\n" + "fencing methods. The fence_kdump agent can only detect that a\n" + "node has entered the kdump crash recovery service. This allows the\n" + "kdump crash recovery service complete without being preempted by\n" + "traditional power fencing methods.\n\n" + "Note: the \"off\" action listen for message from failed node that\n" + "acknowledges node has entered kdump crash recovery service. If a valid\n" + "message is received from the failed node, the node is considered to be\n" + "fenced and the agent returns success. Failure to receive a valid\n" + "message from the failed node in the given timeout period results in\n" + "fencing failure. When multiple node names/IP addresses are specified\n" + "a single valid message is sufficient for success. This is useful when\n" + "single node can send message via several different IP addresses.\n"); + fprintf (stdout, "\n"); + fprintf (stdout, "http://www.kernel.org/pub/linux/utils/kernel/kexec/\n"); + + fprintf (stdout, "\n"); + + fprintf (stdout, "\t\n"); + fprintf (stdout, "\t\t\n"); + fprintf (stdout, "\t\t\n"); + fprintf (stdout, "\t\t%s\n", + "List of names or IP addresses of node to be fenced. This option is\n" + "required for the \"off\" action. Multiple values separated by commas\n" + "can be specified. All values must be of same IP network family." ); + fprintf (stdout, "\t\n"); + + fprintf (stdout, "\t\n"); + fprintf (stdout, "\t\t\n"); + fprintf (stdout, "\t\t\n"); + fprintf (stdout, "\t\t%s\n", + "IP port number that the fence_kdump agent will use to listen for\n" + "messages."); + fprintf (stdout, "\t\n"); + + fprintf (stdout, "\t\n"); + fprintf (stdout, "\t\t\n"); + fprintf (stdout, "\t\t\n"); + fprintf (stdout, "\t\t%s\n", + "IP network family. Force the fence_kdump agent to use a specific\n" + "family. The value for FAMILY can be \"auto\", \"ipv4\", or\n" + "\"ipv6\"."); + fprintf (stdout, "\t\n"); + + fprintf (stdout, "\t\n"); + fprintf (stdout, "\t\t\n"); + fprintf (stdout, "\t\t\n"); + fprintf (stdout, "\t\t%s\n", + "Fencing action to perform. The value for ACTION can be either\n" + "\"off\" or \"metadata\"."); + fprintf (stdout, "\t\n"); + + fprintf (stdout, "\t\n"); + fprintf (stdout, "\t\t\n"); + fprintf (stdout, "\t\t\n"); + fprintf (stdout, "\t\t%s\n", + "Number of seconds to wait for message from failed node. If no message\n" + "is received within TIMEOUT seconds, the fence_kdump agent\n" + "returns failure."); + fprintf (stdout, "\t\n"); + + fprintf (stdout, "\t\n"); + fprintf (stdout, "\t\t\n"); + fprintf (stdout, "\t\t\n"); + fprintf (stdout, "\t\t%s\n", + "Print verbose output"); + fprintf (stdout, "\t\n"); + + fprintf (stdout, "\t\n"); + fprintf (stdout, "\t\t\n"); + fprintf (stdout, "\t\t\n"); + fprintf (stdout, "\t\t%s\n", + "Print version"); + fprintf (stdout, "\t\n"); + + fprintf (stdout, "\t\n"); + fprintf (stdout, "\t\t\n"); + fprintf (stdout, "\t\t\n"); + fprintf (stdout, "\t\t%s\n", + "Print usage"); + fprintf (stdout, "\t\n"); + + fprintf (stdout, "\n"); + + fprintf (stdout, "\n"); + fprintf (stdout, "\t\n"); + fprintf (stdout, "\t\n"); + fprintf (stdout, "\t\n"); + fprintf (stdout, "\t\n"); + fprintf (stdout, "\n"); + + fprintf (stdout, "\n"); + + return (0); +} + +static void +print_usage (const char *self) +{ + fprintf (stdout, "Usage: %s [options]\n", basename (self)); + fprintf (stdout, "\n"); + fprintf (stdout, "Options:\n"); + fprintf (stdout, "\n"); + fprintf (stdout, "%s\n", + " -n, --nodename=NODE[,NODE...]List of names or IP addresses of node to be fenced"); + fprintf (stdout, "%s\n", + " -p, --ipport=PORT IP port number (default: 7410)"); + fprintf (stdout, "%s\n", + " -f, --family=FAMILY Network family: ([auto], ipv4, ipv6)"); + fprintf (stdout, "%s\n", + " -o, --action=ACTION Fencing action: ([off], monitor, metadata, validate-all)"); + fprintf (stdout, "%s\n", + " -t, --timeout=TIMEOUT Timeout in seconds (default: 60)"); + fprintf (stdout, "%s\n", + " -v, --verbose Print verbose output"); + fprintf (stdout, "%s\n", + " -V, --version Print version"); + fprintf (stdout, "%s\n", + " -h, --help Print usage"); + fprintf (stdout, "\n"); + + return; +} + +static int +get_options_node (fence_kdump_opts_t *opts) +{ + int error; + struct addrinfo hints; + fence_kdump_node_t *node; + + node = malloc (sizeof (fence_kdump_node_t)); + if (!node) { + log_error (2, "malloc (%s)\n", strerror (errno)); + return (1); + } + + memset (node, 0, sizeof (fence_kdump_node_t)); + memset (&hints, 0, sizeof (hints)); + + hints.ai_family = opts->family; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_protocol = IPPROTO_UDP; + hints.ai_flags = AI_NUMERICSERV; + + strncpy (node->name, opts->nodename, sizeof (node->name) - 1); + snprintf (node->port, sizeof (node->port), "%d", opts->ipport); + + node->info = NULL; + error = getaddrinfo (node->name, node->port, &hints, &node->info); + if (error != 0) { + log_error (2, "getaddrinfo (%s)\n", gai_strerror (error)); + free_node (node); + return (1); + } + + error = getnameinfo (node->info->ai_addr, node->info->ai_addrlen, + node->addr, sizeof (node->addr), + node->port, sizeof (node->port), + NI_NUMERICHOST | NI_NUMERICSERV); + if (error != 0) { + log_error (2, "getnameinfo (%s)\n", gai_strerror (error)); + free_node (node); + return (1); + } + + node->socket = socket (node->info->ai_family, + node->info->ai_socktype, + node->info->ai_protocol); + if (node->socket < 0) { + log_error (2, "socket (%s)\n", strerror (errno)); + free_node (node); + return (1); + } + + list_add_tail (&node->list, &opts->nodes); + + return (0); +} + +static void +get_options (int argc, char **argv, fence_kdump_opts_t *opts) +{ + int opt; + + struct option options[] = { + { "nodename", required_argument, NULL, 'n' }, + { "ipport", required_argument, NULL, 'p' }, + { "family", required_argument, NULL, 'f' }, + { "action", required_argument, NULL, 'o' }, + { "timeout", required_argument, NULL, 't' }, + { "verbose", optional_argument, NULL, 'v' }, + { "version", no_argument, NULL, 'V' }, + { "help", no_argument, NULL, 'h' }, + { 0, 0, 0, 0 } + }; + + while ((opt = getopt_long (argc, argv, "n:p:f:o:t:v::Vh", options, NULL)) != EOF) { + switch (opt) { + case 'n': + set_option_nodename (opts, optarg); + break; + case 'p': + set_option_ipport (opts, optarg); + break; + case 'f': + set_option_family (opts, optarg); + break; + case 'o': + set_option_action (opts, optarg); + break; + case 't': + set_option_timeout (opts, optarg); + break; + case 'v': + set_option_verbose (opts, optarg); + break; + case 'V': + print_version (argv[0]); + exit (0); + case 'h': + print_usage (argv[0]); + exit (0); + default: + print_usage (argv[0]); + exit (1); + } + } + + verbose = opts->verbose; + + return; +} + +static void +get_options_stdin (fence_kdump_opts_t *opts) +{ + char buf[1024]; + char *opt; + char *arg; + + while (fgets (buf, sizeof (buf), stdin) != 0) { + if (trim (buf) == 0) { + continue; + } + if (buf[0] == '#') { + continue; + } + + opt = buf; + + if ((arg = strchr (opt, '=')) != 0) { + *arg = 0; + arg += 1; + } else { + continue; + } + + if (!strcasecmp (opt, "nodename")) { + set_option_nodename (opts, arg); + continue; + } + if (!strcasecmp (opt, "ipport")) { + set_option_ipport (opts, arg); + continue; + } + if (!strcasecmp (opt, "family")) { + set_option_family (opts, arg); + continue; + } + if (!strcasecmp (opt, "action")) { + set_option_action (opts, arg); + continue; + } + if (!strcasecmp (opt, "timeout")) { + set_option_timeout (opts, arg); + continue; + } + if (!strcasecmp (opt, "verbose")) { + set_option_verbose (opts, arg); + continue; + } + } + + verbose = opts->verbose; + + return; +} + +int +main (int argc, char **argv) +{ + int error = 1; + fence_kdump_opts_t opts; + char *ptr; + char *node_list; + + init_options (&opts); + + if (argc > 1) { + get_options (argc, argv, &opts); + } else { + get_options_stdin (&opts); + } + + openlog ("fence_kdump", LOG_CONS|LOG_PID, LOG_DAEMON); + + if (opts.action == FENCE_KDUMP_ACTION_OFF) { + if (opts.nodename == NULL) { + log_error (0, "action 'off' requires nodename\n"); + exit (1); + } + node_list = (char *)malloc(strlen(opts.nodename)+1); + + strcpy(node_list, opts.nodename); //make local copy of nodename on which we can safely iterate + // iterate through node_list + for (ptr = strtok(node_list, ","); ptr != NULL; ptr = strtok(NULL, ",")) { + set_option_nodename (&opts, ptr); //overwrite nodename for next function + if (get_options_node (&opts) != 0) { + log_error (0, "failed to get node '%s'\n", opts.nodename); + exit (1); + } + } + free(node_list); + } + + if (verbose != 0) { + //clear nodename to avoid showing just last nodename here + free(opts.nodename); + opts.nodename = NULL; + print_options (&opts); + } + + switch (opts.action) { + case FENCE_KDUMP_ACTION_OFF: + error = do_action_off (&opts); + break; + case FENCE_KDUMP_ACTION_METADATA: + error = do_action_metadata (argv[0]); + break; + case FENCE_KDUMP_ACTION_MONITOR: + error = do_action_monitor (); + break; + case FENCE_KDUMP_ACTION_VALIDATE: + error = 0; + break; + default: + break; + } + + free_options (&opts); + + return (error); +} diff --git a/agents/kdump/fence_kdump_send.8 b/agents/kdump/fence_kdump_send.8 new file mode 100644 index 0000000..ab95836 --- /dev/null +++ b/agents/kdump/fence_kdump_send.8 @@ -0,0 +1,50 @@ +.TH fence_kdump_send 8 +.SH NAME +fence_kdump_send - send kdump acknowlegement message to cluster nodes +.SH SYNOPSIS +.B +fence_kdump_send +[\fIOPTIONS]\fR... [NODE]... +.SH DESCRIPTION +\fIfence_kdump_send\fP is a utility used to send messages that +acknowledge that the node has entered the kdump crash recovery +service. This utility is intended to be used the the \fIfence_kdump\fP +agent as a means detect that a failed node has entered the kdump crash +recovery service. +The \fIfence_kdump_send\fP utility is typically run from within the +kdump kernel after a cluster node has encountered a kernel panic. Once +the cluster node has entered the kdump crash recovery service, +\fIfence_kdump_send\fP will periodically send messages to all cluster +nodes. When the \fIfence_kdump\fP agent receives a valid message from +the failed node, fencing is complete. +.SH OPTIONS +.TP +.B -p, --ipport=\fIPORT\fP +IP port number that the \fIfence_kdump\fP agent is using to listen for +messages. (default: 7410) +.TP +.B -f, --family=\fIFAMILY\fP +IP network family. Force the \fIfence_kdump_send\fP utility to use a +particular network family. Value for \fIFAMILY\fP can be "auto", +"ipv4", or "ipv6". (default: auto) +.TP +.B -c, --count=\fICOUNT\fP +Number of messages to send. If \fICOUNT\fP is zero, +\fIfence_kdump_send\fP will send messages indefinitely. (default: 0) +.TP +.B -i, --interval=\fIINTERVAL\fP +Time to wait between sending a message. The value for \fIINTERVAL\fP +must be greater than zero. (default: 10) +.TP +.B -v, --verbose +Print verbose output. +.TP +.B -V, --version +Print version and exit. +.TP +.B -h, --help +Print usage and exit. +.SH AUTHOR +Ryan O'Hara +.SH SEE ALSO +fence_kdump(8), mkdumprd(8), kdump.conf(5) diff --git a/agents/kdump/fence_kdump_send.c b/agents/kdump/fence_kdump_send.c new file mode 100644 index 0000000..638f8c9 --- /dev/null +++ b/agents/kdump/fence_kdump_send.c @@ -0,0 +1,255 @@ +/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- + * + * Copyright (c) Ryan O'Hara (rohara@redhat.com) + * Copyright (c) Red Hat, Inc. + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "options.h" +#include "message.h" +#include "version.h" + +static int verbose = 0; + +#define log_debug(lvl, fmt, args...) \ +do { \ + if (lvl <= verbose) \ + fprintf (stdout, "[debug]: " fmt, ##args); \ +} while (0); + +#define log_error(lvl, fmt, args...) \ +do { \ + if (lvl <= verbose) \ + fprintf (stderr, "[error]: " fmt, ##args); \ +} while (0); + +static int +send_message (const fence_kdump_node_t *node, void *msg, int len) +{ + int error; + + error = sendto (node->socket, msg, len, 0, node->info->ai_addr, node->info->ai_addrlen); + if (error < 0) { + log_error (2, "sendto (%s)\n", strerror (errno)); + goto out; + } + + log_debug (1, "message sent to node '%s'\n", node->addr); + +out: + return (error); +} + +static void +print_usage (const char *self) +{ + fprintf (stdout, "Usage: %s [options] [nodes]\n", basename (self)); + fprintf (stdout, "\n"); + fprintf (stdout, "Options:\n"); + fprintf (stdout, "\n"); + fprintf (stdout, "%s\n", + " -p, --ipport=PORT Port number (default: 7410)"); + fprintf (stdout, "%s\n", + " -f, --family=FAMILY Network family ([auto], ipv4, ipv6)"); + fprintf (stdout, "%s\n", + " -c, --count=COUNT Number of messages to send (default: 0)"); + fprintf (stdout, "%s\n", + " -i, --interval=INTERVAL Interval in seconds (default: 10)"); + fprintf (stdout, "%s\n", + " -v, --verbose Print verbose output"); + fprintf (stdout, "%s\n", + " -V, --version Print version"); + fprintf (stdout, "%s\n", + " -h, --help Print usage"); + fprintf (stdout, "\n"); + + return; +} + +static int +get_options_node (fence_kdump_opts_t *opts) +{ + int error; + struct addrinfo hints; + fence_kdump_node_t *node; + + node = malloc (sizeof (fence_kdump_node_t)); + if (!node) { + log_error (2, "malloc (%s)\n", strerror (errno)); + return (1); + } + + memset (node, 0, sizeof (fence_kdump_node_t)); + memset (&hints, 0, sizeof (hints)); + + hints.ai_family = opts->family; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_protocol = IPPROTO_UDP; + hints.ai_flags = AI_NUMERICSERV; + + strncpy (node->name, opts->nodename, sizeof (node->name) - 1); + snprintf (node->port, sizeof (node->port), "%d", opts->ipport); + + node->info = NULL; + error = getaddrinfo (node->name, node->port, &hints, &node->info); + if (error != 0) { + log_error (2, "getaddrinfo (%s)\n", gai_strerror (error)); + free_node (node); + return (1); + } + + error = getnameinfo (node->info->ai_addr, node->info->ai_addrlen, + node->addr, sizeof (node->addr), + node->port, sizeof (node->port), + NI_NUMERICHOST | NI_NUMERICSERV); + if (error != 0) { + log_error (2, "getnameinfo (%s)\n", gai_strerror (error)); + free_node (node); + return (1); + } + + node->socket = socket (node->info->ai_family, + node->info->ai_socktype, + node->info->ai_protocol); + if (node->socket < 0) { + log_error (2, "socket (%s)\n", strerror (errno)); + free_node (node); + return (1); + } + + list_add_tail (&node->list, &opts->nodes); + + return (0); +} + +static void +get_options (int argc, char **argv, fence_kdump_opts_t *opts) +{ + int opt; + + struct option options[] = { + { "ipport", required_argument, NULL, 'p' }, + { "family", required_argument, NULL, 'f' }, + { "count", required_argument, NULL, 'c' }, + { "interval", required_argument, NULL, 'i' }, + { "verbose", optional_argument, NULL, 'v' }, + { "version", no_argument, NULL, 'V' }, + { "help", no_argument, NULL, 'h' }, + { 0, 0, 0, 0 } + }; + + while ((opt = getopt_long (argc, argv, "p:f:c:i:v::Vh", options, NULL)) != EOF) { + switch (opt) { + case 'p': + set_option_ipport (opts, optarg); + break; + case 'f': + set_option_family (opts, optarg); + break; + case 'c': + set_option_count (opts, optarg); + break; + case 'i': + set_option_interval (opts, optarg); + break; + case 'v': + set_option_verbose (opts, optarg); + break; + case 'V': + print_version (argv[0]); + exit (0); + case 'h': + print_usage (argv[0]); + exit (0); + default: + print_usage (argv[0]); + exit (1); + } + } + + verbose = opts->verbose; + + return; +} + +int +main (int argc, char **argv) +{ + int count = 1; + fence_kdump_msg_t msg; + fence_kdump_opts_t opts; + fence_kdump_node_t *node; + + init_options (&opts); + + if (argc > 1) { + get_options (argc, argv, &opts); + } else { + print_usage (argv[0]); + exit (1); + } + + for (; optind < argc; optind++) { + opts.nodename = argv[optind]; + if (get_options_node (&opts) != 0) { + log_error (1, "failed to get node '%s'\n", opts.nodename); + } + opts.nodename = NULL; + } + + if (list_empty (&opts.nodes)) { + print_usage (argv[0]); + exit (1); + } + + if (verbose != 0) { + print_options (&opts); + } + + init_message (&msg); + + for (;;) { + list_for_each_entry (node, &opts.nodes, list) { + send_message (node, &msg, sizeof (msg)); + } + + if ((opts.count != 0) && (++count > opts.count)) { + break; + } + + sleep (opts.interval); + } + + free_options (&opts); + + return (0); +} diff --git a/agents/kdump/list.h b/agents/kdump/list.h new file mode 100644 index 0000000..8945a62 --- /dev/null +++ b/agents/kdump/list.h @@ -0,0 +1,573 @@ +#ifndef _LINUX_LIST_H +#define _LINUX_LIST_H + +#include + +/* + * These are non-NULL pointers that will result in page faults + * under normal circumstances, used to verify that nobody uses + * non-initialized list entries. + */ +#define LIST_POISON1 ((void *) 0x00100100) +#define LIST_POISON2 ((void *) 0x00200200) + +/* + * Simple doubly linked list implementation. + * + * Some of the internal functions ("__xxx") are useful when + * manipulating whole lists rather than single entries, as + * sometimes we already know the next/prev entries and we can + * generate better code by using them directly rather than + * using the generic single-entry routines. + */ +struct list_head { + struct list_head *next, *prev; +}; + +#define LIST_HEAD_INIT(name) { &(name), &(name) } + +#define LIST_HEAD(name) \ + struct list_head name = LIST_HEAD_INIT(name) + +static inline void INIT_LIST_HEAD(struct list_head *list) +{ + list->next = list; + list->prev = list; +} + +/* + * Insert a new entry between two known consecutive entries. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static inline void __list_add(struct list_head *new, + struct list_head *prev, + struct list_head *next) +{ + next->prev = new; + new->next = next; + new->prev = prev; + prev->next = new; +} + +/** + * list_add - add a new entry + * @new: new entry to be added + * @head: list head to add it after + * + * Insert a new entry after the specified head. + * This is good for implementing stacks. + */ +static inline void list_add(struct list_head *new, + struct list_head *head) +{ + __list_add(new, head, head->next); +} + +/** + * list_add_tail - add a new entry + * @new: new entry to be added + * @head: list head to add it before + * + * Insert a new entry before the specified head. + * This is useful for implementing queues. + */ +static inline void list_add_tail(struct list_head *new, + struct list_head *head) +{ + __list_add(new, head->prev, head); +} + +/* + * Delete a list entry by making the prev/next entries + * point to each other. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static inline void __list_del(struct list_head * prev, + struct list_head * next) +{ + next->prev = prev; + prev->next = next; +} + +/** + * list_del - deletes entry from list. + * @entry: the element to delete from the list. + * Note: list_empty() on entry does not return true after this, the entry is + * in an undefined state. + */ +static inline void __list_del_entry(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); +} + +static inline void list_del(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); + entry->next = LIST_POISON1; + entry->prev = LIST_POISON2; +} + +/** + * list_replace - replace old entry by new one + * @old : the element to be replaced + * @new : the new element to insert + * + * If @old was empty, it will be overwritten. + */ +static inline void list_replace(struct list_head *old, + struct list_head *new) +{ + new->next = old->next; + new->next->prev = new; + new->prev = old->prev; + new->prev->next = new; +} + +static inline void list_replace_init(struct list_head *old, + struct list_head *new) +{ + list_replace(old, new); + INIT_LIST_HEAD(old); +} + +/** + * list_del_init - deletes entry from list and reinitialize it. + * @entry: the element to delete from the list. + */ +static inline void list_del_init(struct list_head *entry) +{ + __list_del_entry(entry); + INIT_LIST_HEAD(entry); +} + +/** + * list_move - delete from one list and add as another's head + * @list: the entry to move + * @head: the head that will precede our entry + */ +static inline void list_move(struct list_head *list, + struct list_head *head) +{ + __list_del_entry(list); + list_add(list, head); +} + +/** + * list_move_tail - delete from one list and add as another's tail + * @list: the entry to move + * @head: the head that will follow our entry + */ +static inline void list_move_tail(struct list_head *list, + struct list_head *head) +{ + __list_del_entry(list); + list_add_tail(list, head); +} + +/** + * list_is_last - tests whether @list is the last entry in list @head + * @list: the entry to test + * @head: the head of the list + */ +static inline int list_is_last(const struct list_head *list, + const struct list_head *head) +{ + return list->next == head; +} + +/** + * list_empty - tests whether a list is empty + * @head: the list to test. + */ +static inline int list_empty(const struct list_head *head) +{ + return head->next == head; +} + +/** + * list_empty_careful - tests whether a list is empty and not being modified + * @head: the list to test + * + * Description: + * tests whether a list is empty _and_ checks that no other CPU might be + * in the process of modifying either member (next or prev) + * + * NOTE: using list_empty_careful() without synchronization + * can only be safe if the only activity that can happen + * to the list entry is list_del_init(). Eg. it cannot be used + * if another CPU could re-list_add() it. + */ +static inline int list_empty_careful(const struct list_head *head) +{ + struct list_head *next = head->next; + + return (next == head) && (next == head->prev); +} + +/** + * list_rotate_left - rotate the list to the left + * @head: the head of the list + */ +static inline void list_rotate_left(struct list_head *head) +{ + struct list_head *first; + + if (!list_empty(head)) { + first = head->next; + list_move_tail(first, head); + } +} + +/** + * list_is_singular - tests whether a list has just one entry. + * @head: the list to test. + */ +static inline int list_is_singular(const struct list_head *head) +{ + return !list_empty(head) && (head->next == head->prev); +} + +static inline void __list_cut_position(struct list_head *list, + struct list_head *head, + struct list_head *entry) +{ + struct list_head *new_first = entry->next; + + list->next = head->next; + list->next->prev = list; + list->prev = entry; + entry->next = list; + head->next = new_first; + new_first->prev = head; +} + +/** + * list_cut_position - cut a list into two + * @list: a new list to add all removed entries + * @head: a list with entries + * @entry: an entry within head, could be the head itself + * and if so we won't cut the list + * + * This helper moves the initial part of @head, up to and + * including @entry, from @head to @list. You should + * pass on @entry an element you know is on @head. @list + * should be an empty list or a list you do not care about + * losing its data. + */ +static inline void list_cut_position(struct list_head *list, + struct list_head *head, + struct list_head *entry) +{ + if (list_empty(head)) + return; + if (list_is_singular(head) && + (head->next != entry && head != entry)) + return; + if (entry == head) + INIT_LIST_HEAD(list); + else + __list_cut_position(list, head, entry); +} + +static inline void __list_splice(const struct list_head *list, + struct list_head *prev, + struct list_head *next) +{ + struct list_head *first = list->next; + struct list_head *last = list->prev; + + first->prev = prev; + prev->next = first; + last->next = next; + next->prev = last; +} + +/** + * list_splice - join two lists, this is designed for stacks + * @list: the new list to add. + * @head: the place to add it in the first list. + */ +static inline void list_splice(const struct list_head *list, + struct list_head *head) +{ + if (!list_empty(list)) + __list_splice(list, head, head->next); +} + +/** + * list_splice_tail - join two lists, each list being a queue + * @list: the new list to add. + * @head: the place to add it in the first list. + */ +static inline void list_splice_tail(struct list_head *list, + struct list_head *head) +{ + if (!list_empty(list)) + __list_splice(list, head->prev, head); +} + +/** + * list_splice_init - join two lists and reinitialise the emptied list. + * @list: the new list to add. + * @head: the place to add it in the first list. + * + * The list at @list is reinitialised + */ +static inline void list_splice_init(struct list_head *list, + struct list_head *head) +{ + if (!list_empty(list)) { + __list_splice(list, head, head->next); + INIT_LIST_HEAD(list); + } +} + +/** + * list_splice_tail_init - join two lists and reinitialise the emptied list + * @list: the new list to add. + * @head: the place to add it in the first list. + * + * Each of the lists is a queue. + * The list at @list is reinitialised + */ +static inline void list_splice_tail_init(struct list_head *list, + struct list_head *head) +{ + if (!list_empty(list)) { + __list_splice(list, head->prev, head); + INIT_LIST_HEAD(list); + } +} + +/** + * container_of - cast a member of a structure out to the containing structure + * @ptr: the pointer to the member. + * @type: the type of the container struct this is embedded in. + * @member: the name of the member within the struct. + */ +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + +/** + * list_entry - get the struct for this entry + * @ptr: the &struct list_head pointer. + * @type: the type of the struct this is embedded in. + * @member: the name of the list_struct within the struct. + */ +#define list_entry(ptr, type, member) \ + container_of(ptr, type, member) + +/** + * list_first_entry - get the first element from a list + * @ptr: the list head to take the element from. + * @type: the type of the struct this is embedded in. + * @member: the name of the list_struct within the struct. + * + * Note, that list is expected to be not empty. + */ +#define list_first_entry(ptr, type, member) \ + list_entry((ptr)->next, type, member) + +/** + * list_for_each - iterate over a list + * @pos: the &struct list_head to use as a loop cursor. + * @head: the head for your list. + */ +#define list_for_each(pos, head) \ + for (pos = (head)->next; pos != (head); pos = pos->next) + +/** + * __list_for_each - iterate over a list + * @pos: the &struct list_head to use as a loop cursor. + * @head: the head for your list. + * + * This variant differs from list_for_each() in that it's the + * simplest possible list iteration code, no prefetching is done. + * Use this for code that knows the list to be very short (empty + * or 1 entry) most of the time. + */ +#define __list_for_each(pos, head) \ + for (pos = (head)->next; pos != (head); pos = pos->next) + +/** + * list_for_each_prev - iterate over a list backwards + * @pos: the &struct list_head to use as a loop cursor. + * @head: the head for your list. + */ +#define list_for_each_prev(pos, head) \ + for (pos = (head)->prev; pos != (head); pos = pos->prev) + +/** + * list_for_each_safe - iterate over a list safe against removal of list entry + * @pos: the &struct list_head to use as a loop cursor. + * @n: another &struct list_head to use as temporary storage + * @head: the head for your list. + */ +#define list_for_each_safe(pos, n, head) \ + for (pos = (head)->next, n = pos->next; pos != (head); \ + pos = n, n = pos->next) + +/** + * list_for_each_prev_safe - iterate over a list backwards safe against removal of list entry + * @pos: the &struct list_head to use as a loop cursor. + * @n: another &struct list_head to use as temporary storage + * @head: the head for your list. + */ +#define list_for_each_prev_safe(pos, n, head) \ + for (pos = (head)->prev, n = pos->prev; pos != (head); \ + pos = n, n = pos->prev) + +/** + * list_for_each_entry - iterate over list of given type + * @pos: the type * to use as a loop cursor. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry(pos, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = list_entry(pos->member.next, typeof(*pos), member)) + +/** + * list_for_each_entry_reverse - iterate backwards over list of given type. + * @pos: the type * to use as a loop cursor. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry_reverse(pos, head, member) \ + for (pos = list_entry((head)->prev, typeof(*pos), member); \ + &pos->member != (head); \ + pos = list_entry(pos->member.prev, typeof(*pos), member)) + +/** + * list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue() + * @pos: the type * to use as a start point + * @head: the head of the list + * @member: the name of the list_struct within the struct. + * + * Prepares a pos entry for use as a start point in list_for_each_entry_continue(). + */ +#define list_prepare_entry(pos, head, member) \ + ((pos) ? : list_entry(head, typeof(*pos), member)) + +/** + * list_for_each_entry_continue - continue iteration over list of given type + * @pos: the type * to use as a loop cursor. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + * + * Continue to iterate over list of given type, continuing after + * the current position. + */ +#define list_for_each_entry_continue(pos, head, member) \ + for (pos = list_entry(pos->member.next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = list_entry(pos->member.next, typeof(*pos), member)) + +/** + * list_for_each_entry_continue_reverse - iterate backwards from the given point + * @pos: the type * to use as a loop cursor. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + * + * Start to iterate over list of given type backwards, continuing after + * the current position. + */ +#define list_for_each_entry_continue_reverse(pos, head, member) \ + for (pos = list_entry(pos->member.prev, typeof(*pos), member); \ + &pos->member != (head); \ + pos = list_entry(pos->member.prev, typeof(*pos), member)) + +/** + * list_for_each_entry_from - iterate over list of given type from the current point + * @pos: the type * to use as a loop cursor. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + * + * Iterate over list of given type, continuing from current position. + */ +#define list_for_each_entry_from(pos, head, member) \ + for (; &pos->member != (head); \ + pos = list_entry(pos->member.next, typeof(*pos), member)) + +/** + * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry + * @pos: the type * to use as a loop cursor. + * @n: another type * to use as temporary storage + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry_safe(pos, n, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member), \ + n = list_entry(pos->member.next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.next, typeof(*n), member)) + +/** + * list_for_each_entry_safe_continue - continue list iteration safe against removal + * @pos: the type * to use as a loop cursor. + * @n: another type * to use as temporary storage + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + * + * Iterate over list of given type, continuing after current point, + * safe against removal of list entry. + */ +#define list_for_each_entry_safe_continue(pos, n, head, member) \ + for (pos = list_entry(pos->member.next, typeof(*pos), member), \ + n = list_entry(pos->member.next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.next, typeof(*n), member)) + +/** + * list_for_each_entry_safe_from - iterate over list from current point safe against removal + * @pos: the type * to use as a loop cursor. + * @n: another type * to use as temporary storage + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + * + * Iterate over list of given type from current point, safe against + * removal of list entry. + */ +#define list_for_each_entry_safe_from(pos, n, head, member) \ + for (n = list_entry(pos->member.next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.next, typeof(*n), member)) + +/** + * list_for_each_entry_safe_reverse - iterate backwards over list safe against removal + * @pos: the type * to use as a loop cursor. + * @n: another type * to use as temporary storage + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + * + * Iterate backwards over list of given type, safe against removal + * of list entry. + */ +#define list_for_each_entry_safe_reverse(pos, n, head, member) \ + for (pos = list_entry((head)->prev, typeof(*pos), member), \ + n = list_entry(pos->member.prev, typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.prev, typeof(*n), member)) + +/** + * list_safe_reset_next - reset a stale list_for_each_entry_safe loop + * @pos: the loop cursor used in the list_for_each_entry_safe loop + * @n: temporary storage used in list_for_each_entry_safe + * @member: the name of the list_struct within the struct. + * + * list_safe_reset_next is not safe to use in general if the list may be + * modified concurrently (eg. the lock is dropped in the loop body). An + * exception to this is if the cursor element (pos) is pinned in the list, + * and list_safe_reset_next is called after re-taking the lock and before + * completing the current iteration of the loop body. + */ +#define list_safe_reset_next(pos, n, member) \ + n = list_entry(pos->member.next, typeof(*pos), member) + +#endif /* _LINUX_LIST_H */ diff --git a/agents/kdump/message.h b/agents/kdump/message.h new file mode 100644 index 0000000..2c82229 --- /dev/null +++ b/agents/kdump/message.h @@ -0,0 +1,41 @@ +/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- + * + * Copyright (c) Ryan O'Hara (rohara@redhat.com) + * Copyright (c) Red Hat, Inc. + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _FENCE_KDUMP_MESSAGE_H +#define _FENCE_KDUMP_MESSAGE_H + +#define FENCE_KDUMP_MAGIC 0x1B302A40 + +#define FENCE_KDUMP_MSGV1 0x1 + +typedef struct __attribute__ ((packed)) fence_kdump_msg { + uint32_t magic; + uint32_t version; +} fence_kdump_msg_t; + +static inline void +init_message (fence_kdump_msg_t *msg) +{ + msg->magic = FENCE_KDUMP_MAGIC; + msg->version = FENCE_KDUMP_MSGV1; +} + +#endif /* _FENCE_KDUMP_MESSAGE_H */ diff --git a/agents/kdump/options.h b/agents/kdump/options.h new file mode 100644 index 0000000..3cf7b43 --- /dev/null +++ b/agents/kdump/options.h @@ -0,0 +1,260 @@ +/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- + * + * Copyright (c) Ryan O'Hara (rohara@redhat.com) + * Copyright (c) Red Hat, Inc. + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _FENCE_KDUMP_OPTIONS_H +#define _FENCE_KDUMP_OPTIONS_H + +#include "list.h" + +#define FENCE_KDUMP_NAME_LEN 256 +#define FENCE_KDUMP_ADDR_LEN 46 +#define FENCE_KDUMP_PORT_LEN 6 + +enum { + FENCE_KDUMP_ACTION_OFF = 0, + FENCE_KDUMP_ACTION_ON = 1, + FENCE_KDUMP_ACTION_REBOOT = 2, + FENCE_KDUMP_ACTION_STATUS = 3, + FENCE_KDUMP_ACTION_LIST = 4, + FENCE_KDUMP_ACTION_MONITOR = 5, + FENCE_KDUMP_ACTION_METADATA = 6, + FENCE_KDUMP_ACTION_VALIDATE = 7, +}; + +enum { + FENCE_KDUMP_FAMILY_AUTO = AF_UNSPEC, + FENCE_KDUMP_FAMILY_IPV6 = AF_INET6, + FENCE_KDUMP_FAMILY_IPV4 = AF_INET, +}; + +#define FENCE_KDUMP_DEFAULT_IPPORT 7410 +#define FENCE_KDUMP_DEFAULT_FAMILY 0 +#define FENCE_KDUMP_DEFAULT_ACTION 0 +#define FENCE_KDUMP_DEFAULT_COUNT 0 +#define FENCE_KDUMP_DEFAULT_INTERVAL 10 +#define FENCE_KDUMP_DEFAULT_TIMEOUT 60 +#define FENCE_KDUMP_DEFAULT_VERBOSE 0 + +typedef struct fence_kdump_opts { + char *nodename; + int ipport; + int family; + int action; + int count; + int interval; + int timeout; + int verbose; + struct list_head nodes; +} fence_kdump_opts_t; + +typedef struct fence_kdump_node { + char name[FENCE_KDUMP_NAME_LEN]; + char addr[FENCE_KDUMP_ADDR_LEN]; + char port[FENCE_KDUMP_PORT_LEN]; + int socket; + struct addrinfo *info; + struct list_head list; +} fence_kdump_node_t; + +static inline void +init_node (fence_kdump_node_t *node) +{ + node->info = NULL; +} + +static inline void +free_node (fence_kdump_node_t *node) +{ + freeaddrinfo (node->info); + free (node); +} + +static inline void +print_node (const fence_kdump_node_t *node) +{ + fprintf (stdout, "[debug]: node { \n"); + fprintf (stdout, "[debug]: name = %s\n", node->name); + fprintf (stdout, "[debug]: addr = %s\n", node->addr); + fprintf (stdout, "[debug]: port = %s\n", node->port); + fprintf (stdout, "[debug]: info = %p\n", node->info); + fprintf (stdout, "[debug]: } \n"); +} + +static inline void +init_options (fence_kdump_opts_t *opts) +{ + opts->nodename = NULL; + opts->ipport = FENCE_KDUMP_DEFAULT_IPPORT; + opts->family = FENCE_KDUMP_DEFAULT_FAMILY; + opts->action = FENCE_KDUMP_DEFAULT_ACTION; + opts->count = FENCE_KDUMP_DEFAULT_COUNT; + opts->interval = FENCE_KDUMP_DEFAULT_INTERVAL; + opts->timeout = FENCE_KDUMP_DEFAULT_TIMEOUT; + opts->verbose = FENCE_KDUMP_DEFAULT_VERBOSE; + + INIT_LIST_HEAD (&opts->nodes); +} + +static inline void +free_options (fence_kdump_opts_t *opts) +{ + fence_kdump_node_t *node; + fence_kdump_node_t *safe; + + list_for_each_entry_safe (node, safe, &opts->nodes, list) { + list_del (&node->list); + free_node (node); + } + + free (opts->nodename); +} + +static inline void +print_options (fence_kdump_opts_t *opts) +{ + fence_kdump_node_t *node; + + fprintf (stdout, "[debug]: options { \n"); + fprintf (stdout, "[debug]: nodename = %s\n", opts->nodename); + fprintf (stdout, "[debug]: ipport = %d\n", opts->ipport); + fprintf (stdout, "[debug]: family = %d\n", opts->family); + fprintf (stdout, "[debug]: count = %d\n", opts->count); + fprintf (stdout, "[debug]: interval = %d\n", opts->interval); + fprintf (stdout, "[debug]: timeout = %d\n", opts->timeout); + fprintf (stdout, "[debug]: verbose = %d\n", opts->verbose); + fprintf (stdout, "[debug]: } \n"); + + list_for_each_entry (node, &opts->nodes, list) { + print_node (node); + } +} + +static inline void +set_option_nodename (fence_kdump_opts_t *opts, const char *arg) +{ + if (opts->nodename != NULL) { + free (opts->nodename); + } + + opts->nodename = strdup (arg); +} + +static inline void +set_option_ipport (fence_kdump_opts_t *opts, const char *arg) +{ + opts->ipport = atoi (arg); + + if ((opts->ipport < 1) || (opts->ipport > 65535)) { + fprintf (stderr, "[error]: invalid ipport '%s'\n", arg); + exit (1); + } +} + +static inline void +set_option_family (fence_kdump_opts_t *opts, const char *arg) +{ + if (!strcasecmp (arg, "auto")) { + opts->family = FENCE_KDUMP_FAMILY_AUTO; + } else if (!strcasecmp (arg, "ipv6")) { + opts->family = FENCE_KDUMP_FAMILY_IPV6; + } else if (!strcasecmp (arg, "ipv4")) { + opts->family = FENCE_KDUMP_FAMILY_IPV4; + } else { + fprintf (stderr, "[error]: unsupported family '%s'\n", arg); + exit (1); + } +} + +static inline void +set_option_action (fence_kdump_opts_t *opts, const char *arg) +{ + if (!strcasecmp (arg, "off")) { + opts->action = FENCE_KDUMP_ACTION_OFF; + } else if (!strcasecmp (arg, "metadata")) { + opts->action = FENCE_KDUMP_ACTION_METADATA; + } else if (!strcasecmp (arg, "monitor")) { + opts->action = FENCE_KDUMP_ACTION_MONITOR; + } else if (!strcasecmp (arg, "validate-all")) { + opts->action = FENCE_KDUMP_ACTION_VALIDATE; + } else { + fprintf (stderr, "[error]: unsupported action '%s'\n", arg); + exit (1); + } +} + +static inline void +set_option_count (fence_kdump_opts_t *opts, const char *arg) +{ + opts->count = atoi (arg); + + if (opts->count < 0) { + fprintf (stderr, "[error]: invalid count '%s'\n", arg); + exit (1); + } +} + +static inline void +set_option_interval (fence_kdump_opts_t *opts, const char *arg) +{ + opts->interval = atoi (arg); + + if (opts->interval < 1) { + fprintf (stderr, "[error]: invalid interval '%s'\n", arg); + exit (1); + } +} + +static inline void +set_option_timeout (fence_kdump_opts_t *opts, const char *arg) +{ + opts->timeout = atoi (arg); + + if (opts->timeout < 1) { + fprintf (stderr, "[error]: invalid timeout '%s'\n", arg); + exit (1); + } +} + +static inline void +set_option_verbose (fence_kdump_opts_t *opts, const char *arg) +{ + int i; + + if (arg != NULL) { + if (isdigit(arg[0])) { + opts->verbose += atoi (arg); + } else { + opts->verbose += 1; /* initial -v */ + for (i = 0; i < strlen(arg); i++) { + if (arg[i] == 'v') { + opts->verbose += 1; + } else { + fprintf (stderr, "[error]: invalid value '%c' for verbose\n", arg[i]); + return; + } + } + } + } else { + opts->verbose += 1; + } +} + +#endif /* _FENCE_KDUMP_OPTIONS_H */ diff --git a/agents/kdump/version.h b/agents/kdump/version.h new file mode 100644 index 0000000..ed178b1 --- /dev/null +++ b/agents/kdump/version.h @@ -0,0 +1,33 @@ +/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- + * + * Copyright (c) Ryan O'Hara (rohara@redhat.com) + * Copyright (c) Red Hat, Inc. + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _FENCE_KDUMP_VERSION_H +#define _FENCE_KDUMP_VERSION_H + +#define FENCE_KDUMP_VERSION "0.1" + +static inline void +print_version (const char *self) +{ + fprintf (stdout, "%s %s\n", basename (self), FENCE_KDUMP_VERSION); +} + +#endif /* _FENCE_KDUMP_VERSION_H */ diff --git a/agents/kubevirt/fence_kubevirt.py b/agents/kubevirt/fence_kubevirt.py new file mode 100755 index 0000000..8c27a03 --- /dev/null +++ b/agents/kubevirt/fence_kubevirt.py @@ -0,0 +1,154 @@ +#!@PYTHON@ -tt + +import sys +import logging +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, fail_usage, run_delay, EC_STATUS, EC_FETCH_VM_UUID + +try: + from kubernetes.client.exceptions import ApiException +except ImportError: + logging.error("Couldn\'t import kubernetes.client.exceptions.ApiException - not found or not accessible") + +def _get_namespace(options): + from kubernetes import config + + ns = options.get("--namespace") + if ns is None: + ns = config.kube_config.list_kube_config_contexts()[1]['context']['namespace'] + + return ns + +def get_nodes_list(conn, options): + logging.debug("Starting list/monitor operation") + result = {} + try: + apiversion = options.get("--apiversion") + namespace = _get_namespace(options) + include_uninitialized = True + vm_api = conn.resources.get(api_version=apiversion, kind='VirtualMachine') + vm_list = vm_api.get(namespace=namespace) + for vm in vm_list.items: + result[vm.metadata.name] = ("", None) + except Exception as e: + logging.error("Exception when calling VirtualMachine list: %s", e) + return result + +def get_power_status(conn, options): + logging.debug("Starting get status operation") + try: + apiversion = options.get("--apiversion") + namespace = _get_namespace(options) + name = options.get("--plug") + vmi_api = conn.resources.get(api_version=apiversion, + kind='VirtualMachineInstance') + vmi = vmi_api.get(name=name, namespace=namespace) + return translate_status(vmi.status.phase) + except ApiException as e: + if e.status == 404: + try: + vm_api = conn.resources.get(api_version=apiversion, kind='VirtualMachine') + vm = vm_api.get(name=name, namespace=namespace) + except ApiException as e: + logging.error("VM %s doesn't exist", name) + fail(EC_FETCH_VM_UUID) + return "off" + logging.error("Failed to get power status, with API Exception: %s", e) + fail(EC_STATUS) + except Exception as e: + logging.error("Failed to get power status, with Exception: %s", e) + fail(EC_STATUS) + +def translate_status(instance_status): + if instance_status == "Running": + return "on" + return "unknown" + +def set_power_status(conn, options): + logging.debug("Starting set status operation") + try: + apiversion= options.get("--apiversion") + namespace = _get_namespace(options) + name = options.get("--plug") + action = 'start' if options["--action"] == "on" else 'stop' + virtctl_vm_action(conn, action, namespace, name, apiversion) + except Exception as e: + logging.error("Failed to set power status, with Exception: %s", e) + fail(EC_STATUS) + +def define_new_opts(): + all_opt["namespace"] = { + "getopt" : ":", + "longopt" : "namespace", + "help" : "--namespace=[namespace] Namespace of the KubeVirt machine", + "shortdesc" : "Namespace of the KubeVirt machine.", + "required" : "0", + "order" : 2 + } + all_opt["kubeconfig"] = { + "getopt" : ":", + "longopt" : "kubeconfig", + "help" : "--kubeconfig=[kubeconfig] Kubeconfig file path", + "shortdesc": "Kubeconfig file path", + "required": "0", + "order": 4 + } + all_opt["apiversion"] = { + "getopt" : ":", + "longopt" : "apiversion", + "help" : "--apiversion=[apiversion] Version of the KubeVirt API", + "shortdesc" : "Version of the KubeVirt API.", + "required" : "0", + "default" : "kubevirt.io/v1", + "order" : 5 + } + +def virtctl_vm_action(conn, action, namespace, name, apiversion): + path = '/apis/subresources.{api_version}/namespaces/{namespace}/virtualmachines/{name}/{action}' + path = path.format(api_version=apiversion, namespace=namespace, name=name, action=action) + return conn.request('put', path, header_params={'accept': '*/*'}) + +# Main agent method +def main(): + conn = None + + device_opt = ["port", "namespace", "kubeconfig", "ssl_insecure", "no_password", "apiversion"] + + atexit.register(atexit_handler) + define_new_opts() + + all_opt["power_timeout"]["default"] = "40" + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for KubeVirt" + docs["longdesc"] = "fence_kubevirt is an I/O Fencing agent for KubeVirt." + docs["vendorurl"] = "https://kubevirt.io/" + show_docs(options, docs) + + run_delay(options) + + # Disable insecure-certificate-warning message + if "--ssl-insecure" in options: + import urllib3 + urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + + try: + from kubernetes import config + from openshift.dynamic import DynamicClient + kubeconfig = options.get('--kubeconfig') + k8s_client = config.new_client_from_config(config_file=kubeconfig) + conn = DynamicClient(k8s_client) + except ImportError: + logging.error("Couldn\'t import kubernetes.config or " + "openshift.dynamic.DynamicClient - not found or not accessible") + + # Operate the fencing device + result = fence_action(conn, options, set_power_status, get_power_status, get_nodes_list) + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/ldom/fence_ldom.py b/agents/ldom/fence_ldom.py new file mode 100644 index 0000000..0cb3320 --- /dev/null +++ b/agents/ldom/fence_ldom.py @@ -0,0 +1,102 @@ +#!@PYTHON@ -tt + +## +## The Following Agent Has Been Tested On - LDOM 1.0.3 +## The interface is backward compatible so it will work +## with 1.0, 1.0.1 and .2 too. +## +##### + +import sys, re, pexpect +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail_usage + +COMMAND_PROMPT_REG = r"\[PEXPECT\]$" +COMMAND_PROMPT_NEW = "[PEXPECT]" + +# Start comunicating after login. Prepare good environment. +def start_communication(conn, options): + conn.send_eol("PS1='" + COMMAND_PROMPT_NEW + "'") + res = conn.expect([pexpect.TIMEOUT, COMMAND_PROMPT_REG], int(options["--shell-timeout"])) + if res == 0: + #CSH stuff + conn.send_eol("set prompt='" + COMMAND_PROMPT_NEW + "'") + conn.log_expect(COMMAND_PROMPT_REG, int(options["--shell-timeout"])) + +def get_power_status(conn, options): + start_communication(conn, options) + + conn.send_eol("ldm ls") + + conn.log_expect(COMMAND_PROMPT_REG, int(options["--shell-timeout"])) + + result = {} + + #This is status of mini finite automata. 0 = we didn't found NAME and STATE, 1 = we did + fa_status = 0 + + for line in conn.before.splitlines(): + domain = re.search(r"^(\S+)\s+(\S+)\s+.*$", line) + + if domain != None: + if fa_status == 0 and domain.group(1) == "NAME" and domain.group(2) == "STATE": + fa_status = 1 + elif fa_status == 1: + result[domain.group(1)] = ("", (domain.group(2).lower() == "bound" and "off" or "on")) + + if not options["--action"] in ['monitor', 'list']: + if not options["--plug"] in result: + fail_usage("Failed: You have to enter existing logical domain!") + else: + return result[options["--plug"]][1] + else: + return result + +def set_power_status(conn, options): + start_communication(conn, options) + + cmd_line = "ldm "+ (options["--action"] == "on" and "start" or "stop -f") + " \"" + options["--plug"] + "\"" + + conn.send_eol(cmd_line) + + conn.log_expect(COMMAND_PROMPT_REG, int(options["--power-timeout"])) + +def main(): + device_opt = ["ipaddr", "login", "passwd", "cmd_prompt", "secure", "port"] + + atexit.register(atexit_handler) + + all_opt["secure"]["default"] = "1" + all_opt["cmd_prompt"]["default"] = [r"\ $"] + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for Sun LDOM" + docs["longdesc"] = "fence_ldom is an I/O Fencing agent \ +which can be used with LDoms virtual machines. This agent works \ +so, that run ldm command on host machine. So ldm must be directly \ +runnable.\ +\n.P\n\ +Very useful parameter is -c (or cmd_prompt in stdin mode). This \ +must be set to something, what is displayed after successful login \ +to host machine. Default string is space on end of string (default \ +for root in bash). But (for example) csh use ], so in that case you \ +must use parameter -c with argument ]. Very similar situation is, \ +if you use bash and login to host machine with other user than \ +root. Than prompt is $, so again, you must use parameter -c." + docs["vendorurl"] = "http://www.sun.com" + show_docs(options, docs) + + ## + ## Operate the fencing device + #### + conn = fence_login(options) + result = fence_action(conn, options, set_power_status, get_power_status, get_power_status) + fence_logout(conn, "logout") + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/lindy_pdu/fence_lindypdu.py b/agents/lindy_pdu/fence_lindypdu.py new file mode 100644 index 0000000..432b741 --- /dev/null +++ b/agents/lindy_pdu/fence_lindypdu.py @@ -0,0 +1,206 @@ +#!@PYTHON@ -tt + +# 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, see +# . + +# The Following agent has been tested on: +# Lindy PDU model 32657 +# Firmware release s4.82-091012-1cb08s +# Probably works on different models with same MIB .. but is better test on them +# +# (C) 2021 Daimonlab -- Damiano Scaramuzza (cesello) cesello@daimonlab.it + +import sys +import atexit +import logging +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail_usage +from fencing_snmp import FencingSnmp + +### CONSTANTS ### +# oid defining fence device +OID_SYS_OBJECT_ID = '.1.3.6.1.2.1.1.2.0' + +### GLOBAL VARIABLES ### +# Device - see Lindy PDU +device = None + +# Port ID +port_id = None +# Switch ID +switch_id = None + +# Classes describing Device params +# Here I follow the MIBS specs that use "switch" and "plug" concepts but +# the pdu really have one switch only and 8-16 plugs. +# Probably the "switch" term is used for future uses or more advanced pdus +class LindyPDU(object): + # PDU + status_oid = '.1.3.6.1.4.1.17420.1.2.9.%d.13.0' + control_oid = '.1.3.6.1.4.1.17420.1.2.9.%d.13.0' + outlet_table_oid = '.1.3.6.1.4.1.17420.1.2.9.%d.14' + pdu_table_oid = '.1.3.6.1.4.1.17420.1.2.9' + attached_pdus = '.1.3.6.1.4.1.17420.1.2.5.0' + ident_str = "Lindy 32657 PDU" + state_on = 1 + state_off = 0 + turn_on = 1 + turn_off = 0 + has_switches = True + +### FUNCTIONS ### +def lpdu_set_device(conn, options): + global device + + agents_dir = {'.1.3.6.1.4.1.17420':LindyPDU} + + # First resolve type of PDU device + pdu_type = conn.walk(OID_SYS_OBJECT_ID) + + if not ((len(pdu_type) == 1) and (pdu_type[0][1] in agents_dir)): + pdu_type = [[None, None]] + + device = agents_dir[pdu_type[0][1]] + + logging.debug("Trying %s"%(device.ident_str)) + +def lpdu_resolv_port_id(conn, options): + + if device == None: + lpdu_set_device(conn, options) + + port_id=switch_id=None + # Now we resolv port_id/switch_id + if options["--plug"].isdigit() and ((not device.has_switches) or (options["--switch"].isdigit())): + port_id = int(options["--plug"]) + + if device.has_switches: + switch_id = int(options["--switch"]) + else: + table = conn.walk(device.pdu_table_oid, 30) + + for x in table: + if x[1].strip('"').split(',')[0] == options["--plug"]: + t = x[0].split('.') + if device.has_switches: + port_id = int(t[len(t)-1]) + switch_id = int(t[len(t)-3]) + else: + port_id = int(t[len(t)-1]) + + if port_id == None: + fail_usage("Can't find port with name %s!"%(options["--plug"])) + + return (switch_id,port_id) + +def get_power_status(conn, options): + + (switch_id,port_id)=lpdu_resolv_port_id(conn, options) + + oid = ((device.has_switches) and device.status_oid%(switch_id) or device.status_oid%(port_id)) + + + try: + (oid, status) = conn.get(oid) + # status is a comma separated string + # one line only as "1,1,1,0,1,1,1,1". + state=status.strip('"').split(',')[port_id-1] + if state == str(device.state_on): + return "on" + elif state == str(device.state_off): + return "off" + else: + return None + except Exception: + return None + +def set_power_status(conn, options): + + (switch_id,port_id)=lpdu_resolv_port_id(conn, options) + + oid = ((device.has_switches) and device.control_oid%(switch_id) or device.control_oid%(port_id)) + + (oid, status) = conn.get(oid) + # status is a comma separated string + state=status.strip('"').split(',') + state[port_id-1]=str((options["--action"] == "on" and device.turn_on or device.turn_off)) + conn.set(oid, ",".join(state)) + + +def get_outlets_status(conn, options): + result = {} + pdu_id=[] + + if device == None: + lpdu_set_device(conn, options) + + if (device.has_switches and options["--switch"].isdigit()): + pdu_id.append(options["--switch"]) + + elif (device.has_switches): + #search for all pdu + pdus=conn.walk(device.attached_pdus, 30) + pdus_info=pdus[0][1].strip('"').split(',') + pdu_id=pdus_info[1:] + else: + #I really don't know what to do with this case. I haven't a different lindy pdu to test + table_oid=device.pdu_table_oid + + + for switch in pdu_id: + table_oid = device.outlet_table_oid % int(switch) + res_ports = conn.walk(table_oid, 30) + status_oid=device.status_oid % int(switch) + port_status=conn.walk(status_oid, 30) + state=port_status[0][1].strip('"').split(',') + for x in res_ports: + t = x[0].split('.') + port_num = ((device.has_switches) and "%s:%s"%(t[len(t)-4], t[len(t)-2]) or "%s"%(t[len(t)-2])) + port_name = x[1].strip('"').split(',')[0] + result[port_num] = (port_name, "on" if state[int(t[len(t)-2])-1]=='1' else "off") + + return result + +# Main agent method +def main(): + global device + + device_opt = ["ipaddr", "login", "passwd", "no_login", "no_password", \ + "port", "snmp_version", "snmp","switch"] + + atexit.register(atexit_handler) + + all_opt["snmp_version"]["default"] = "1" + all_opt["community"]["default"] = "public" + all_opt["switch"]["default"] = "1" + device = LindyPDU + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for Lindy over SNMP" + docs["longdesc"] = "fence_lindypdu is an I/O Fencing agent \ +which can be used with the Lindy PDU network power switch. It logs \ +into a device via SNMP and reboots a specified outlet. It supports \ +SNMP v1 with all combinations of authenticity/privacy settings." + docs["vendorurl"] = "http://www.lindy.co.uk" + show_docs(options, docs) + + # Operate the fencing device + result = fence_action(FencingSnmp(options), options, set_power_status, get_power_status, get_outlets_status) + + sys.exit(result) +if __name__ == "__main__": + main() diff --git a/agents/lpar/fence_lpar.py b/agents/lpar/fence_lpar.py new file mode 100644 index 0000000..975971a --- /dev/null +++ b/agents/lpar/fence_lpar.py @@ -0,0 +1,197 @@ +#!@PYTHON@ -tt + +##### +## +## The Following Agent Has Been Tested On: +## +## Version +## +---------------------------------------------+ +## Tested on HMC +## +##### + +import sys, re +import atexit +import logging +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, fail_usage, EC_STATUS_HMC + +## +## Transformation to standard ON/OFF status if possible +def _normalize_status(status): + if status in ["Running", "Open Firmware", "Shutting Down", "Starting"]: + status = "on" + else: + status = "off" + + return status + +def get_power_status(conn, options): + if options["--hmc-version"] == "3": + command = "lssyscfg -r lpar -m " + options["--managed"] + " -n " + options["--plug"] + " -F name,state\n" + elif options["--hmc-version"] in ["4", "IVM"]: + command = "lssyscfg -r lpar -m "+ options["--managed"] + \ + " --filter 'lpar_names=" + options["--plug"] + "'\n" + else: + # Bad HMC Version cannot be reached + fail(EC_STATUS_HMC) + + conn.send(command) + # First line (command) may cause parsing issues if long + conn.readline() + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + + try: + if options["--hmc-version"] == "3": + status = re.compile("^" + options["--plug"] + ",(.*?),.*$", + re.IGNORECASE | re.MULTILINE).search(conn.before).group(1) + elif options["--hmc-version"] in ["4", "IVM"]: + status = re.compile(",state=(.*?),", re.IGNORECASE).search(conn.before).group(1) + except AttributeError as e: + logging.debug("Command on HMC failed: {}\n{}".format(command, str(e))) + fail(EC_STATUS_HMC) + + return _normalize_status(status) + +def is_comanaged(conn, options): + conn.send("lscomgmt -m " + options["--managed"] + "\n" ) + conn.readline() + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + + try: + cm = re.compile(",curr_master_mtms=(.*?),", re.IGNORECASE).search(conn.before).group(1) + except AttributeError as e: + cm = False + + return cm + +def set_power_status(conn, options): + if options["--hmc-version"] == "3": + conn.send("chsysstate -o " + options["--action"] + " -r lpar -m " + options["--managed"] + + " -n " + options["--plug"] + "\n") + + # First line (command) may cause parsing issues if long + conn.readline() + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + elif options["--hmc-version"] in ["4", "IVM"]: + if options["--action"] == "on": + if is_comanaged(conn, options): + profile = "" + else: + profile = " -f `lssyscfg -r lpar -F curr_profile " + \ + " -m " + options["--managed"] + \ + " --filter \"lpar_names=" + options["--plug"] + "\"`" + conn.send("chsysstate -o on -r lpar" + + " -m " + options["--managed"] + + " -n " + options["--plug"] + + profile + + "\n") + else: + conn.send("chsysstate -o shutdown -r lpar --immed" + + " -m " + options["--managed"] + " -n " + options["--plug"] + "\n") + + # First line (command) may cause parsing issues if long + conn.readline() + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + +def get_lpar_list(conn, options): + outlets = {} + if options["--hmc-version"] == "3": + conn.send("query_partition_names -m " + options["--managed"] + "\n") + + ## We have to remove first line (command) + conn.readline() + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + + ## We have to remove next 2 lines (header) and last line (part of new prompt) + #### + res = re.search("^(.+?\n){2}(.*)\n.*$", conn.before, re.S) + + if res == None: + fail_usage("Unable to parse output of list command") + + lines = res.group(2).split("\n") + for outlet_line in lines: + outlets[outlet_line.rstrip()] = ("", "") + elif options["--hmc-version"] in ["4", "IVM"]: + sep = ":" if options["--hmc-version"] == "4" else "," + + conn.send("lssyscfg -r lpar -m " + options["--managed"] + + " -F name" + sep + "state\n") + + ## We have to remove first line (command) + conn.readline() + conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) + + ## We have to remove last line (part of new prompt) + #### + res = re.search("^(.*)\n.*$", conn.before, re.S) + + if res == None: + fail_usage("Unable to parse output of list command") + + lines = res.group(1).split("\n") + for outlet_line in lines: + try: + (port, status) = outlet_line.rstrip().split(sep) + except ValueError: + fail_usage('Output does not match expected HMC version, try different one'); + outlets[port] = ("", _normalize_status(status)) + + return outlets + +def define_new_opts(): + all_opt["managed"] = { + "getopt" : "s:", + "longopt" : "managed", + "help" : "-s, --managed=[id] Name of the managed system", + "required" : "1", + "shortdesc" : "Managed system name", + "order" : 1} + all_opt["hmc_version"] = { + "getopt" : "H:", + "longopt" : "hmc-version", + "help" : "-H, --hmc-version=[version] Force HMC version to use: (3|4|ivm) (default: 4)", + "required" : "0", + "shortdesc" : "Force HMC version to use", + "default" : "4", + "choices" : ["3", "4", "ivm"], + "order" : 1} + +def main(): + device_opt = ["ipaddr", "login", "passwd", "secure", "cmd_prompt", \ + "port", "managed", "hmc_version"] + + atexit.register(atexit_handler) + + define_new_opts() + + all_opt["login_timeout"]["default"] = "15" + all_opt["secure"]["default"] = "1" + all_opt["cmd_prompt"]["default"] = [r":~>", r"]\$", r"\$ "] + + options = check_input(device_opt, process_input(device_opt), other_conditions = True) + + docs = {} + docs["shortdesc"] = "Fence agent for IBM LPAR" + docs["longdesc"] = "" + docs["vendorurl"] = "http://www.ibm.com" + show_docs(options, docs) + + if "--managed" not in options: + fail_usage("Failed: You have to enter name of managed system") + + if options["--action"] == "validate-all": + sys.exit(0) + + ## + ## Operate the fencing device + #### + conn = fence_login(options) + result = fence_action(conn, options, set_power_status, get_power_status, get_lpar_list) + fence_logout(conn, "quit\r\n") + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/manual/fence_ack_manual.8 b/agents/manual/fence_ack_manual.8 new file mode 100644 index 0000000..6b4cd14 --- /dev/null +++ b/agents/manual/fence_ack_manual.8 @@ -0,0 +1,39 @@ +.TH FENCE_ACK_MANUAL 8 2009-12-21 cluster cluster + +.SH NAME +fence_ack_manual \- a program to override fenced fencing operations + +.SH SYNOPSIS +.B fence_ack_manual +[OPTIONS] +.I nodename + +.SH DESCRIPTION +When +.BR fenced (8) +fails to fence a node, it retries indefinately. +.BR fence_ack_manual (8) +tells fenced to stop retrying and consider the node fenced. + +.P +It is important that this only be done after the node has been manually +turned off or prevented from writing to shared storage. +Without this manual action and verification, the storage that fencing +protects may become corrupted. + +.P +When fenced fences a node that has no fence devices defined in the cluster +configuration, the fencing operation fails. This failure will be repeated +indefinately until fence_ack_manual is run by an operator to indicate +the node is in a safe state to proceed. +(Defining no fencing devices for node is the equivalent of using the +fence_manual agent in previous versions.) + +.SH OPTIONS +.TP +.B \-h +Print a help message describing available options, then exit. + +.SH SEE ALSO +.BR fenced (8) + diff --git a/agents/manual/fence_ack_manual.in b/agents/manual/fence_ack_manual.in new file mode 100644 index 0000000..e8b4998 --- /dev/null +++ b/agents/manual/fence_ack_manual.in @@ -0,0 +1,37 @@ +#!/bin/bash +# +# Manual override after fencing has failed. +# + +if [ "$1" = "-n" ]; then + shift +fi + +if [ -z "$1" ] || [ "${1:0:1}" = "-" ]; then + echo "usage:" + echo " $0 " + echo " $0 -n " + echo + echo "The -n flag exists to preserve compatibility with previous " + echo "releases of $0, and is no longer required." + exit 1 +fi + +declare answer + +echo "About to override fencing for $1." +echo "Improper use of this command can cause severe file system damage." +echo +read -p "Continue [NO/absolutely]? " answer + +if [ "$answer" != "absolutely" ]; then + echo "Aborted." + exit 1 +fi + +while ! [ -e @clustervarrun@/fenced_override ]; do + sleep 1 +done + +echo $1>@clustervarrun@/fenced_override +echo Done diff --git a/agents/mpath/fence_mpath.py b/agents/mpath/fence_mpath.py new file mode 100644 index 0000000..ee81eab --- /dev/null +++ b/agents/mpath/fence_mpath.py @@ -0,0 +1,341 @@ +#!@PYTHON@ -tt + +import sys +import stat +import re +import os +import time +import logging +import atexit +import ctypes +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import fail_usage, run_command, atexit_handler, check_input, process_input, show_docs +from fencing import fence_action, all_opt, run_delay + +def get_status(conn, options): + del conn + status = "off" + for dev in options["devices"]: + is_block_device(dev) + if options["--plug"] in get_registration_keys(options, dev): + status = "on" + else: + logging.debug("No registration for key "\ + + options["--plug"] + " on device " + dev + "\n") + + if options["--action"] == "monitor": + dev_read(options) + + return status + + +def set_status(conn, options): + del conn + count = 0 + if options["--action"] == "on": + for dev in options["devices"]: + is_block_device(dev) + + register_dev(options, dev) + if options["--plug"] not in get_registration_keys(options, dev): + count += 1 + logging.debug("Failed to register key "\ + + options["--plug"] + "on device " + dev + "\n") + continue + dev_write(options, dev) + + if get_reservation_key(options, dev) is None \ + and not reserve_dev(options, dev) \ + and get_reservation_key(options, dev) is None: + count += 1 + logging.debug("Failed to create reservation (key="\ + + options["--plug"] + ", device=" + dev + ")\n") + + else: + dev_keys = dev_read(options) + + for dev in options["devices"]: + is_block_device(dev) + + if options["--plug"] in get_registration_keys(options, dev): + preempt_abort(options, dev_keys[dev], dev) + + for dev in options["devices"]: + if options["--plug"] in get_registration_keys(options, dev): + count += 1 + logging.debug("Failed to remove key "\ + + options["--plug"] + " on device " + dev + "\n") + continue + + if not get_reservation_key(options, dev): + count += 1 + logging.debug("No reservation exists on device " + dev + "\n") + if count: + logging.error("Failed to verify " + str(count) + " device(s)") + sys.exit(1) + + +# run command, returns dict, ret["rc"] = exit code; ret["out"] = output; +# ret["err"] = error +def run_cmd(options, cmd): + ret = {} + + if "--use-sudo" in options: + prefix = options["--sudo-path"] + " " + else: + prefix = "" + + (ret["rc"], ret["out"], ret["err"]) = run_command(options, + prefix + cmd) + ret["out"] = "".join([i for i in ret["out"] if i is not None]) + ret["err"] = "".join([i for i in ret["err"] if i is not None]) + return ret + + +# check if device exist and is block device +def is_block_device(dev): + if not os.path.exists(dev): + fail_usage("Failed: device \"" + dev + "\" does not exist") + if not stat.S_ISBLK(os.stat(dev).st_mode): + fail_usage("Failed: device \"" + dev + "\" is not a block device") + +# cancel registration +def preempt_abort(options, host, dev): + cmd = options["--mpathpersist-path"] + " -o --preempt-abort --prout-type=5 --param-rk=" + host +" --param-sark=" + options["--plug"] +" -d " + dev + return not bool(run_cmd(options, cmd)["rc"]) + +def register_dev(options, dev): + cmd = options["--mpathpersist-path"] + " -o --register --param-sark=" + options["--plug"] + " -d " + dev + #cmd return code != 0 but registration can be successful + return not bool(run_cmd(options, cmd)["rc"]) + +def reserve_dev(options, dev): + cmd = options["--mpathpersist-path"] + " -o --reserve --prout-type=5 --param-rk=" + options["--plug"] + " -d " + dev + return not bool(run_cmd(options, cmd)["rc"]) + +def get_reservation_key(options, dev): + cmd = options["--mpathpersist-path"] + " -i -r -d " + dev + out = run_cmd(options, cmd) + if out["rc"]: + fail_usage('Cannot get reservation key on device "' + dev + + '": ' + out["err"]) + match = re.search(r"\s+key\s*=\s*0x(\S+)\s+", out["out"], re.IGNORECASE) + return match.group(1) if match else None + +def get_registration_keys(options, dev, fail=True): + keys = [] + cmd = options["--mpathpersist-path"] + " -i -k -d " + dev + out = run_cmd(options, cmd) + if out["rc"]: + fail_usage('Cannot get registration keys on device "' + dev + + '": ' + out["err"], fail) + if not fail: + return [] + for line in out["out"].split("\n"): + match = re.search(r"\s+0x(\S+)\s*", line) + if match: + keys.append(match.group(1)) + return keys + +def dev_write(options, dev): + file_path = options["--store-path"] + "/mpath.devices" + + if not os.path.isdir(options["--store-path"]): + os.makedirs(options["--store-path"]) + + try: + store_fh = open(file_path, "a+") + except IOError: + fail_usage("Failed: Cannot open file \""+ file_path + "\"") + out = store_fh.read() + if not re.search(r"^" + dev + r"\s+", out): + store_fh.write(dev + "\t" + options["--plug"] + "\n") + store_fh.close() + +def dev_read(options, fail=True): + dev_key = {} + file_path = options["--store-path"] + "/mpath.devices" + try: + store_fh = open(file_path, "r") + except IOError: + if fail: + fail_usage("Failed: Cannot open file \"" + file_path + "\"") + else: + return None + # get not empty lines from file + for (device, key) in [line.strip().split() for line in store_fh if line.strip()]: + dev_key[device] = key + store_fh.close() + return dev_key + +def mpath_check_get_options(options): + try: + f = open("/etc/sysconfig/stonith", "r") + except IOError: + return options + + match = re.findall(r"^\s*(\S*)\s*=\s*(\S*)\s*", "".join(f.readlines()), re.MULTILINE) + + for m in match: + options[m[0].lower()] = m[1].lower() + + f.close() + + return options + +def mpath_check(hardreboot=False): + if len(sys.argv) >= 3 and sys.argv[1] == "repair": + return int(sys.argv[2]) + options = {} + options["--mpathpersist-path"] = "/usr/sbin/mpathpersist" + options["--store-path"] = "@STORE_PATH@" + options["--power-timeout"] = "5" + options["retry"] = "0" + options["retry-sleep"] = "1" + options = mpath_check_get_options(options) + if "verbose" in options and options["verbose"] == "yes": + logging.getLogger().setLevel(logging.DEBUG) + devs = dev_read(options, fail=False) + if not devs: + if "--suppress-errors" not in options: + logging.error("No devices found") + return 0 + for dev, key in list(devs.items()): + for n in range(int(options["retry"]) + 1): + if n > 0: + logging.debug("retry: " + str(n) + " of " + options["retry"]) + if key in get_registration_keys(options, dev, fail=False): + logging.debug("key " + key + " registered with device " + dev) + return 0 + else: + logging.debug("key " + key + " not registered with device " + dev) + + if n < int(options["retry"]): + time.sleep(float(options["retry-sleep"])) + logging.debug("key " + key + " registered with any devices") + + if hardreboot == True: + libc = ctypes.cdll['libc.so.6'] + libc.reboot(0x1234567) + return 2 + +def define_new_opts(): + all_opt["devices"] = { + "getopt" : "d:", + "longopt" : "devices", + "help" : "-d, --devices=[devices] List of devices to use for current operation", + "required" : "0", + "shortdesc" : "List of devices to use for current operation. Devices can \ +be comma-separated list of device-mapper multipath devices (eg. /dev/mapper/3600508b400105df70000e00000ac0000 or /dev/mapper/mpath1). \ +Each device must support SCSI-3 persistent reservations.", + "order": 1 + } + all_opt["key"] = { + "getopt" : "k:", + "longopt" : "key", + "help" : "-k, --key=[key] Replaced by -n, --plug", + "required" : "0", + "shortdesc" : "Replaced by port/-n/--plug", + "order": 1 + } + all_opt["suppress-errors"] = { + "getopt" : "", + "longopt" : "suppress-errors", + "help" : "--suppress-errors Suppress error log. Suppresses error logging when run from the watchdog service before pacemaker starts.", + "required" : "0", + "shortdesc" : "Error log suppression.", + "order": 4 + } + all_opt["mpathpersist_path"] = { + "getopt" : ":", + "longopt" : "mpathpersist-path", + "help" : "--mpathpersist-path=[path] Path to mpathpersist binary", + "required" : "0", + "shortdesc" : "Path to mpathpersist binary", + "default" : "@MPATH_PATH@", + "order": 200 + } + all_opt["store_path"] = { + "getopt" : ":", + "longopt" : "store-path", + "help" : "--store-path=[path] Path to directory containing cached keys", + "required" : "0", + "shortdesc" : "Path to directory where fence agent can store information", + "default" : "@STORE_PATH@", + "order": 200 + } + +def main(): + atexit.register(atexit_handler) + + device_opt = ["no_login", "no_password", "devices", "key", "sudo", \ + "fabric_fencing", "on_target", "store_path", \ + "suppress-errors", "mpathpersist_path", "force_on", "port", "no_port"] + + define_new_opts() + + all_opt["port"]["required"] = "0" + all_opt["port"]["help"] = "-n, --plug=[key] Key to use for the current operation" + all_opt["port"]["shortdesc"] = "Key to use for the current operation. \ +This key should be unique to a node and have to be written in \ +/etc/multipath.conf. For the \"on\" action, the key specifies the key use to \ +register the local node. For the \"off\" action, this key specifies the key to \ +be removed from the device(s)." + + # fence_mpath_check + if os.path.basename(sys.argv[0]) == "fence_mpath_check": + sys.exit(mpath_check()) + elif os.path.basename(sys.argv[0]) == "fence_mpath_check_hardreboot": + sys.exit(mpath_check(hardreboot=True)) + + options = check_input(device_opt, process_input(device_opt), other_conditions=True) + + # hack to remove list/list-status actions which are not supported + options["device_opt"] = [ o for o in options["device_opt"] if o != "separator" ] + + # workaround to avoid regressions + if "--key" in options: + options["--plug"] = options["--key"] + del options["--key"] + elif "--help" not in options and options["--action"] in ["off", "on", \ + "reboot", "status", "validate-all"] and "--plug" not in options: + stop_after_error = False if options["--action"] == "validate-all" else True + fail_usage("Failed: You have to enter plug number or machine identification", stop_after_error) + + docs = {} + docs["shortdesc"] = "Fence agent for multipath persistent reservation" + docs["longdesc"] = "fence_mpath is an I/O fencing agent that uses SCSI-3 \ +persistent reservations to control access multipath devices. Underlying \ +devices must support SCSI-3 persistent reservations (SPC-3 or greater) as \ +well as the \"preempt-and-abort\" subcommand.\nThe fence_mpath agent works by \ +having a unique key for each node that has to be set in /etc/multipath.conf. \ +Once registered, a single node will become the reservation holder \ +by creating a \"write exclusive, registrants only\" reservation on the \ +device(s). The result is that only registered nodes may write to the \ +device(s). When a node failure occurs, the fence_mpath agent will remove the \ +key belonging to the failed node from the device(s). The failed node will no \ +longer be able to write to the device(s). A manual reboot is required.\ +\n.P\n\ +When used as a watchdog device you can define e.g. retry=1, retry-sleep=2 and \ +verbose=yes parameters in /etc/sysconfig/stonith if you have issues with it \ +failing." + docs["vendorurl"] = "https://www.sourceware.org/dm/" + show_docs(options, docs) + + run_delay(options) + + # Input control BEGIN + if options["--action"] == "validate-all": + sys.exit(0) + + if not ("--devices" in options and options["--devices"]): + fail_usage("Failed: No devices found") + + options["devices"] = [d for d in re.split("\s*,\s*|\s+", options["--devices"].strip()) if d] + # Input control END + + result = fence_action(None, options, set_status, get_status) + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/netio/fence_netio.py b/agents/netio/fence_netio.py new file mode 100755 index 0000000..4fb59cf --- /dev/null +++ b/agents/netio/fence_netio.py @@ -0,0 +1,94 @@ +#!@PYTHON@ -tt + +import sys, re, pexpect +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fspawn, fail, EC_LOGIN_DENIED, run_delay + +def get_power_status(conn, options): + conn.send_eol("port %s" % options["--plug"]) + re_status = re.compile("250 [01imt]") + conn.log_expect(re_status, int(options["--shell-timeout"])) + status = { + "0" : "off", + "1" : "on", + "i" : "reboot", + "m" : "manual", + "t" : "timer" + }[conn.after.split()[1]] + + return status + +def set_power_status(conn, options): + action = { + "on" : "1", + "off" : "0", + "reboot" : "i" + }[options["--action"]] + + conn.send_eol("port %s %s" % (options["--plug"], action)) + conn.log_expect("250 OK", int(options["--shell-timeout"])) + +def get_outlet_list(conn, options): + result = {} + + try: + # the NETIO-230B has 4 ports, counting start at 1 + for plug in ["1", "2", "3", "4"]: + conn.send_eol("port setup %s" % plug) + conn.log_expect("250 .+", int(options["--shell-timeout"])) + # the name is enclosed in "", drop those with [1:-1] + name = conn.after.split()[1][1:-1] + result[plug] = (name, "unknown") + except Exception as exn: + print(str(exn)) + + return result + +def main(): + device_opt = ["ipaddr", "login", "passwd", "port", "telnet"] + + atexit.register(atexit_handler) + + all_opt["ipport"]["default"] = "1234" + + opt = process_input(device_opt) + opt["eol"] = "\r\n" + options = check_input(device_opt, opt) + + docs = {} + docs["shortdesc"] = "I/O Fencing agent for Koukaam NETIO-230B" + docs["longdesc"] = "fence_netio is an I/O Fencing agent which can be \ +used with the Koukaam NETIO-230B Power Distribution Unit. It logs into \ +device via telnet and reboots a specified outlet. Lengthy telnet connections \ +should be avoided while a GFS cluster is running because the connection will \ +block any necessary fencing actions." + docs["vendorurl"] = "http://www.koukaam.se/" + show_docs(options, docs) + + ## + ## Operate the fencing device + ## We can not use fence_login(), username and passwd are sent on one line + #### + run_delay(options) + try: + conn = fspawn(options, options["--telnet-path"]) + conn.send("set binary\n") + conn.send("open %s -%s\n"%(options["--ip"], options["--ipport"])) + + conn.read_nonblocking(size=100, timeout=int(options["--shell-timeout"])) + conn.log_expect("100 HELLO .*", int(options["--shell-timeout"])) + conn.send_eol("login %s %s" % (options["--username"], options["--password"])) + conn.log_expect("250 OK", int(options["--shell-timeout"])) + except pexpect.EOF: + fail(EC_LOGIN_DENIED) + except pexpect.TIMEOUT: + fail(EC_LOGIN_DENIED) + + result = fence_action(conn, options, set_power_status, get_power_status, get_outlet_list) + fence_logout(conn, "quit\n") + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/openstack/fence_openstack.py b/agents/openstack/fence_openstack.py new file mode 100644 index 0000000..666016d --- /dev/null +++ b/agents/openstack/fence_openstack.py @@ -0,0 +1,381 @@ +#!@PYTHON@ -tt + +import atexit +import logging +import sys +import os + +import urllib3 + +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail_usage, run_delay, source_env + +try: + from novaclient import client + from novaclient.exceptions import Conflict, NotFound +except ImportError: + pass + +urllib3.disable_warnings(urllib3.exceptions.SecurityWarning) + + +def translate_status(instance_status): + if instance_status == "ACTIVE": + return "on" + elif instance_status == "SHUTOFF": + return "off" + return "unknown" + +def get_cloud(options): + import yaml + + clouds_yaml = "~/.config/openstack/clouds.yaml" + if not os.path.exists(os.path.expanduser(clouds_yaml)): + clouds_yaml = "/etc/openstack/clouds.yaml" + if not os.path.exists(os.path.expanduser(clouds_yaml)): + fail_usage("Failed: ~/.config/openstack/clouds.yaml and /etc/openstack/clouds.yaml does not exist") + + clouds_yaml = os.path.expanduser(clouds_yaml) + if os.path.exists(clouds_yaml): + with open(clouds_yaml, "r") as yaml_stream: + try: + clouds = yaml.safe_load(yaml_stream) + except yaml.YAMLError as exc: + fail_usage("Failed: Unable to read: " + clouds_yaml) + + cloud = clouds.get("clouds").get(options["--cloud"]) + if not cloud: + fail_usage("Cloud: {} not found.".format(options["--cloud"])) + + return cloud + + +def get_nodes_list(conn, options): + logging.info("Running %s action", options["--action"]) + result = {} + response = conn.servers.list(detailed=True) + if response is not None: + for item in response: + instance_id = item.id + instance_name = item.name + instance_status = item.status + result[instance_id] = (instance_name, translate_status(instance_status)) + return result + + +def get_power_status(conn, options): + logging.info("Running %s action on %s", options["--action"], options["--plug"]) + server = None + try: + server = conn.servers.get(options["--plug"]) + except NotFound as e: + fail_usage("Failed: Not Found: " + str(e)) + if server is None: + fail_usage("Server %s not found", options["--plug"]) + state = server.status + status = translate_status(state) + logging.info("get_power_status: %s (state: %s)" % (status, state)) + return status + + +def set_power_status(conn, options): + logging.info("Running %s action on %s", options["--action"], options["--plug"]) + action = options["--action"] + server = None + try: + server = conn.servers.get(options["--plug"]) + except NotFound as e: + fail_usage("Failed: Not Found: " + str(e)) + if server is None: + fail_usage("Server %s not found", options["--plug"]) + if action == "on": + logging.info("Starting instance " + server.name) + try: + server.start() + except Conflict as e: + fail_usage(e) + logging.info("Called start API call for " + server.id) + if action == "off": + logging.info("Stopping instance " + server.name) + try: + server.stop() + except Conflict as e: + fail_usage(e) + logging.info("Called stop API call for " + server.id) + if action == "reboot": + logging.info("Rebooting instance " + server.name) + try: + server.reboot("HARD") + except Conflict as e: + fail_usage(e) + logging.info("Called reboot hard API call for " + server.id) + + +def nova_login(username, password, projectname, auth_url, user_domain_name, + project_domain_name, ssl_insecure, cacert, apitimeout): + legacy_import = False + + try: + from keystoneauth1 import loading + from keystoneauth1 import session as ksc_session + from keystoneauth1.exceptions.discovery import DiscoveryFailure + from keystoneauth1.exceptions.http import Unauthorized + except ImportError: + try: + from keystoneclient import session as ksc_session + from keystoneclient.auth.identity import v3 + + legacy_import = True + except ImportError: + fail_usage("Failed: Keystone client not found or not accessible") + + if not legacy_import: + loader = loading.get_plugin_loader("password") + auth = loader.load_from_options( + auth_url=auth_url, + username=username, + password=password, + project_name=projectname, + user_domain_name=user_domain_name, + project_domain_name=project_domain_name, + ) + else: + auth = v3.Password( + auth_url=auth_url, + username=username, + password=password, + project_name=projectname, + user_domain_name=user_domain_name, + project_domain_name=project_domain_name, + cacert=cacert, + ) + + caverify=True + if ssl_insecure: + caverify=False + elif cacert: + caverify=cacert + + session = ksc_session.Session(auth=auth, verify=caverify, timeout=apitimeout) + nova = client.Client("2", session=session, timeout=apitimeout) + apiversion = None + try: + apiversion = nova.versions.get_current() + except DiscoveryFailure as e: + fail_usage("Failed: Discovery Failure: " + str(e)) + except Unauthorized as e: + fail_usage("Failed: Unauthorized: " + str(e)) + except Exception as e: + logging.error(e) + logging.debug("Nova version: %s", apiversion) + return nova + + +def define_new_opts(): + all_opt["auth-url"] = { + "getopt": ":", + "longopt": "auth-url", + "help": "--auth-url=[authurl] Keystone Auth URL", + "required": "0", + "shortdesc": "Keystone Auth URL", + "order": 2, + } + all_opt["project-name"] = { + "getopt": ":", + "longopt": "project-name", + "help": "--project-name=[project] Tenant Or Project Name", + "required": "0", + "shortdesc": "Keystone Project", + "default": "admin", + "order": 3, + } + all_opt["user-domain-name"] = { + "getopt": ":", + "longopt": "user-domain-name", + "help": "--user-domain-name=[domain] Keystone User Domain Name", + "required": "0", + "shortdesc": "Keystone User Domain Name", + "default": "Default", + "order": 4, + } + all_opt["project-domain-name"] = { + "getopt": ":", + "longopt": "project-domain-name", + "help": "--project-domain-name=[domain] Keystone Project Domain Name", + "required": "0", + "shortdesc": "Keystone Project Domain Name", + "default": "Default", + "order": 5, + } + all_opt["cloud"] = { + "getopt": ":", + "longopt": "cloud", + "help": "--cloud=[cloud] Openstack cloud (from ~/.config/openstack/clouds.yaml or /etc/openstack/clouds.yaml).", + "required": "0", + "shortdesc": "Cloud from clouds.yaml", + "order": 6, + } + all_opt["openrc"] = { + "getopt": ":", + "longopt": "openrc", + "help": "--openrc=[openrc] Path to the openrc config file", + "required": "0", + "shortdesc": "openrc config file", + "order": 7, + } + all_opt["uuid"] = { + "getopt": ":", + "longopt": "uuid", + "help": "--uuid=[uuid] Replaced by -n, --plug", + "required": "0", + "shortdesc": "Replaced by port/-n/--plug", + "order": 8, + } + all_opt["cacert"] = { + "getopt": ":", + "longopt": "cacert", + "help": "--cacert=[cacert] Path to the PEM file with trusted authority certificates (override global CA trust)", + "required": "0", + "shortdesc": "SSL X.509 certificates file", + "default": "", + "order": 9, + } + all_opt["apitimeout"] = { + "getopt": ":", + "type": "second", + "longopt": "apitimeout", + "help": "--apitimeout=[seconds] Timeout to use for API calls", + "shortdesc": "Timeout in seconds to use for API calls, default is 60.", + "required": "0", + "default": 60, + "order": 10, + } + + +def main(): + conn = None + + device_opt = [ + "login", + "no_login", + "passwd", + "no_password", + "auth-url", + "project-name", + "user-domain-name", + "project-domain-name", + "cloud", + "openrc", + "port", + "no_port", + "uuid", + "ssl_insecure", + "cacert", + "apitimeout", + ] + + atexit.register(atexit_handler) + + define_new_opts() + + all_opt["port"]["required"] = "0" + all_opt["port"]["help"] = "-n, --plug=[UUID] UUID of the node to be fenced" + all_opt["port"]["shortdesc"] = "UUID of the node to be fenced." + all_opt["power_timeout"]["default"] = "60" + + options = check_input(device_opt, process_input(device_opt)) + + # workaround to avoid regressions + if "--uuid" in options: + options["--plug"] = options["--uuid"] + del options["--uuid"] + elif ("--help" not in options + and options["--action"] in ["off", "on", "reboot", "status", "validate-all"] + and "--plug" not in options): + stop_after_error = False if options["--action"] == "validate-all" else True + fail_usage( + "Failed: You have to enter plug number or machine identification", + stop_after_error, + ) + + docs = {} + docs["shortdesc"] = "Fence agent for OpenStack's Nova service" + docs["longdesc"] = "fence_openstack is a Fencing agent \ +which can be used with machines controlled by the Openstack's Nova service. \ +This agent calls the python-novaclient and it is mandatory to be installed " + docs["vendorurl"] = "https://wiki.openstack.org/wiki/Nova" + show_docs(options, docs) + + run_delay(options) + + if options.get("--cloud"): + cloud = get_cloud(options) + username = cloud.get("auth").get("username") + password = cloud.get("auth").get("password") + projectname = cloud.get("auth").get("project_name") + auth_url = None + try: + auth_url = cloud.get("auth").get("auth_url") + except KeyError: + fail_usage("Failed: You have to set the Keystone service endpoint for authorization") + user_domain_name = cloud.get("auth").get("user_domain_name") + project_domain_name = cloud.get("auth").get("project_domain_name") + caverify = cloud.get("verify") + if caverify in [True, False]: + options["--ssl-insecure"] = caverify + else: + options["--cacert"] = caverify + elif options.get("--openrc"): + if not os.path.exists(os.path.expanduser(options["--openrc"])): + fail_usage("Failed: {} does not exist".format(options.get("--openrc"))) + source_env(options["--openrc"]) + env = os.environ + username = env.get("OS_USERNAME") + password = env.get("OS_PASSWORD") + projectname = env.get("OS_PROJECT_NAME") + auth_url = None + try: + auth_url = env["OS_AUTH_URL"] + except KeyError: + fail_usage("Failed: You have to set the Keystone service endpoint for authorization") + user_domain_name = env.get("OS_USER_DOMAIN_NAME") + project_domain_name = env.get("OS_PROJECT_DOMAIN_NAME") + else: + username = options["--username"] + password = options["--password"] + projectname = options["--project-name"] + auth_url = None + try: + auth_url = options["--auth-url"] + except KeyError: + fail_usage("Failed: You have to set the Keystone service endpoint for authorization") + user_domain_name = options["--user-domain-name"] + project_domain_name = options["--project-domain-name"] + + ssl_insecure = "--ssl-insecure" in options + cacert = options["--cacert"] + apitimeout = options["--apitimeout"] + + try: + conn = nova_login( + username, + password, + projectname, + auth_url, + user_domain_name, + project_domain_name, + ssl_insecure, + cacert, + apitimeout, + ) + except Exception as e: + fail_usage("Failed: Unable to connect to Nova: " + str(e)) + + # Operate the fencing device + result = fence_action(conn, options, set_power_status, get_power_status, get_nodes_list) + sys.exit(result) + + +if __name__ == "__main__": + main() diff --git a/agents/ovh/fence_ovh.py b/agents/ovh/fence_ovh.py new file mode 100644 index 0000000..2b7eb86 --- /dev/null +++ b/agents/ovh/fence_ovh.py @@ -0,0 +1,164 @@ +#!@PYTHON@ -tt +# Copyright 2013 Adrian Gibanel Lopez (bTactic) +# Adrian Gibanel improved this script at 2013 to add verification of success and to output metadata + +# Based on: +# This is a fence agent for use at OVH +# As there are no other fence devices available, we must use OVH's SOAP API #Quick-and-dirty +# assemled by Dennis Busch, secofor GmbH, Germany +# This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. + +import sys, time +import shutil, tempfile +import logging +import atexit +from datetime import datetime +from suds.client import Client +from suds.xsd.doctor import ImportDoctor, Import +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, fail_usage, EC_LOGIN_DENIED, run_delay + +OVH_RESCUE_PRO_NETBOOT_ID = '28' +OVH_HARD_DISK_NETBOOT_ID = '1' + +STATUS_HARD_DISK_SLEEP = 240 # Wait 4 minutes to SO to boot +STATUS_RESCUE_PRO_SLEEP = 150 # Wait 2 minutes 30 seconds to Rescue-Pro to run + +def define_new_opts(): + all_opt["email"] = { + "getopt" : "Z:", + "longopt" : "email", + "help" : "-Z, --email=[email] email for reboot message: admin@domain.com", + "required" : "1", + "shortdesc" : "Reboot email", + "order" : 1} + +def netboot_reboot(conn, options, mode): + # dedicatedNetbootModifyById changes the mode of the next reboot + conn.service.dedicatedNetbootModifyById(options["session"], options["--plug"], mode, '', options["--email"]) + + # dedicatedHardRebootDo initiates a hard reboot on the given node + conn.service.dedicatedHardRebootDo(options["session"], + options["--plug"], 'Fencing initiated by cluster', '', 'en') + + conn.logout(options["session"]) + +def reboot_time(conn, options): + result = conn.service.dedicatedHardRebootStatus(options["session"], options["--plug"]) + tmpstart = datetime.strptime(result.start, '%Y-%m-%d %H:%M:%S') + tmpend = datetime.strptime(result.end, '%Y-%m-%d %H:%M:%S') + result.start = tmpstart + result.end = tmpend + + return result + +def soap_login(options): + imp = Import('http://schemas.xmlsoap.org/soap/encoding/') + url = 'https://www.ovh.com/soapi/soapi-re-1.59.wsdl' + imp.filter.add('http://soapi.ovh.com/manager') + d = ImportDoctor(imp) + + tmp_dir = tempfile.mkdtemp() + tempfile.tempdir = tmp_dir + atexit.register(remove_tmp_dir, tmp_dir) + + try: + soap = Client(url, doctor=d) + session = soap.service.login(options["--username"], options["--password"], 'en', 0) + except Exception as e: + logging.error("Failed: {}".format(str(e))) + fail(EC_LOGIN_DENIED) + + options["session"] = session + return soap + +def remove_tmp_dir(tmp_dir): + shutil.rmtree(tmp_dir) + +def main(): + device_opt = ["login", "passwd", "port", "email", "no_status", "web"] + + atexit.register(atexit_handler) + + define_new_opts() + options = check_input(device_opt, process_input(device_opt), other_conditions=True) + + docs = {} + docs["shortdesc"] = "Fence agent for OVH" + docs["longdesc"] = "fence_ovh is an Power Fencing agent \ +which can be used within OVH datecentre. \ +Poweroff is simulated with a reboot into rescue-pro mode." + + docs["vendorurl"] = "http://www.ovh.net" + show_docs(options, docs) + + if options["--action"] == "list": + fail_usage("Action 'list' is not supported in this fence agent") + + if options["--action"] == "list-status": + fail_usage("Action 'list-status' is not supported in this fence agent") + + if "--email" not in options: + fail_usage("You have to enter e-mail address which is notified by fence agent") + + if options["--action"] == "validate-all": + sys.exit(0) + + if options["--action"] != "monitor" and not options["--plug"].endswith(".ovh.net"): + options["--plug"] += ".ovh.net" + + run_delay(options) + + conn = soap_login(options) + + if options["--action"] == 'monitor': + try: + conn.service.logout(options["session"]) + except Exception: + pass + sys.exit(0) + + # Save datetime just before changing netboot + before_netboot_reboot = datetime.now() + + if options["--action"] == 'off': + # Reboot in Rescue-pro + netboot_reboot(conn, options, OVH_RESCUE_PRO_NETBOOT_ID) + time.sleep(STATUS_RESCUE_PRO_SLEEP) + elif options["--action"] in ['on', 'reboot']: + # Reboot from HD + netboot_reboot(conn, options, OVH_HARD_DISK_NETBOOT_ID) + time.sleep(STATUS_HARD_DISK_SLEEP) + + # Save datetime just after reboot + after_netboot_reboot = datetime.now() + + # Verify that action was completed sucesfully + reboot_t = reboot_time(conn, options) + + logging.debug("reboot_start_end.start: %s\n", + reboot_t.start.strftime('%Y-%m-%d %H:%M:%S')) + logging.debug("before_netboot_reboot: %s\n", + before_netboot_reboot.strftime('%Y-%m-%d %H:%M:%S')) + logging.debug("reboot_start_end.end: %s\n", + reboot_t.end.strftime('%Y-%m-%d %H:%M:%S')) + logging.debug("after_netboot_reboot: %s\n", + after_netboot_reboot.strftime('%Y-%m-%d %H:%M:%S')) + + if reboot_t.start < after_netboot_reboot < reboot_t.end: + result = 0 + logging.debug("Netboot reboot went OK.\n") + else: + result = 1 + logging.debug("ERROR: Netboot reboot wasn't OK.\n") + + try: + conn.service.logout(options["session"]) + except Exception: + pass + + sys.exit(result) + +if __name__ == "__main__": + main() diff --git a/agents/powerman/fence_powerman.py b/agents/powerman/fence_powerman.py new file mode 100755 index 0000000..7aeeaf1 --- /dev/null +++ b/agents/powerman/fence_powerman.py @@ -0,0 +1,257 @@ +#!@PYTHON@ -tt +import os +import time +from datetime import datetime +import sys +import subprocess +import re +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import is_executable, fail_usage, run_delay +import logging + +#### important!!! ####### +class PowerMan: + """Python wrapper for calling powerman commands + + This class makes calls to a powerman deamon for a cluster of computers. + The make-up of such a call looks something like: + $ pm -h elssd1:10101