diff --git a/html/includes/graphs/device/pulse_sessions.inc.php b/html/includes/graphs/device/pulse_sessions.inc.php
new file mode 100644
index 000000000..bedbdb0cc
--- /dev/null
+++ b/html/includes/graphs/device/pulse_sessions.inc.php
@@ -0,0 +1,19 @@
+
+ * 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 3 of the License, or (at your
+ * option) any later version. Please see LICENSE.txt at the top level of
+ * the source code distribution for details.
+ */
+//
+// Hardcoded discovery of Memory usage on Pulse Secure devices.
+//
+if ($device['os'] == 'pulse') {
+ echo 'PULSE-MEMORY-POOL: ';
+
+ $usage = str_replace('"', "", snmp_get($device, 'PULSESECURE-PSG-MIB::iveMemoryUtil.0', '-OvQ'));
+
+ if (is_numeric($usage)) {
+ discover_mempool($valid_mempool, $device, 0, 'pulse-mem', 'Main Memory', '100', null, null);
+ }
+}
diff --git a/includes/discovery/os/pulse.inc.php b/includes/discovery/os/pulse.inc.php
new file mode 100644
index 000000000..608403dc0
--- /dev/null
+++ b/includes/discovery/os/pulse.inc.php
@@ -0,0 +1,16 @@
+
+ * 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 3 of the License, or (at your
+ * option) any later version. Please see LICENSE.txt at the top level of
+ * the source code distribution for details.
+ */
+if (!$os) {
+ if (strstr($sysDescr, 'Pulse Connect Secure')) {
+ $os = 'pulse';
+ }
+}
diff --git a/includes/discovery/processors/pulse.inc.php b/includes/discovery/processors/pulse.inc.php
new file mode 100644
index 000000000..4faa47dbb
--- /dev/null
+++ b/includes/discovery/processors/pulse.inc.php
@@ -0,0 +1,25 @@
+
+ * 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 3 of the License, or (at your
+ * option) any later version. Please see LICENSE.txt at the top level of
+ * the source code distribution for details.
+*/
+//
+// Hardcoded discovery of CPU usage on Pulse Secure devices.
+//
+if ($device['os'] == 'pulse') {
+ echo 'Pulse Secure : ';
+
+ $descr = 'Processor';
+ $usage = str_replace('"', "", snmp_get($device, 'PULSESECURE-PSG-MIB::iveCpuUtil.0', '-OvQ'));
+
+ if (is_numeric($usage)) {
+ discover_processor($valid['processor'], $device, 'PULSESECURE-PSG-MIB::iveCpuUtil.0', '0', 'pulse-cpu', $descr,
+ '100', $usage, null, null);
+ }
+}
diff --git a/includes/polling/mempools/pulse-mem.inc.php b/includes/polling/mempools/pulse-mem.inc.php
new file mode 100644
index 000000000..cfee9f7ee
--- /dev/null
+++ b/includes/polling/mempools/pulse-mem.inc.php
@@ -0,0 +1,30 @@
+
+ * 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 3 of the License, or (at your
+ * option) any later version. Please see LICENSE.txt at the top level of
+ * the source code distribution for details.
+ */
+// Simple hard-coded poller for Pulse Secure
+// Yes, it really can be this simple.
+
+echo 'Pulse Secure MemPool'.'\n';
+
+if ($device['os'] == 'pulse') {
+ $perc = str_replace('"', "", snmp_get($device, "PULSESECURE-PSG-MIB::iveMemoryUtil.0", '-OvQ'));
+ $memory_available = str_replace('"', "", snmp_get($device, "UCD-SNMP-MIB::memTotalReal.0", '-OvQ'));
+ $mempool['total'] = $memory_available;
+
+ if (is_numeric($perc)) {
+ $mempool['used'] = ($memory_available / 100 * $perc);
+ $mempool['free'] = ($memory_available - $mempool['used']);
+ }
+
+ echo "PERC " .$perc."%\n";
+ echo "Avail " .$mempool['total']."\n";
+
+}
diff --git a/includes/polling/os/pulse.inc.php b/includes/polling/os/pulse.inc.php
new file mode 100644
index 000000000..f52d9ac0c
--- /dev/null
+++ b/includes/polling/os/pulse.inc.php
@@ -0,0 +1,37 @@
+
+ * 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 3 of the License, or (at your
+ * option) any later version. Please see LICENSE.txt at the top level of
+ * the source code distribution for details.
+*/
+
+$version = trim(snmp_get($device, "productVersion.0", "-OQv", "PULSESECURE-PSG-MIB"),'"');
+$hardware = "Juniper " . trim(snmp_get($device, "productName.0", "-OQv", "PULSESECURE-PSG-MIB"),'"');
+$hostname = trim(snmp_get($device, "sysName.0", "-OQv", "SNMPv2-MIB"),'"');
+
+$usersrrd = $config['rrd_dir'].'/'.$device['hostname'].'/pulse_users.rrd';
+$users = snmp_get($device, 'PULSESECURE-PSG-MIB::iveConcurrentUsers.0', '-OQv');
+
+if (is_numeric($users)) {
+ if (!is_file($usersrrd)) {
+ rrdtool_create($usersrrd, ' DS:users:GAUGE:600:0:U'.$config['rrd_rra']);
+ }
+ rrdtool_update($usersrrd, "N:$users");
+ $graphs['pulse_users'] = true;
+}
+
+$sessrrd = $config['rrd_dir'].'/'.$device['hostname'].'/pulse_sessions.rrd';
+$sessions = snmp_get($device, 'PULSESECURE-PSG-MIB::iveConcurrentUsers.0', '-OQv');
+
+if (is_numeric($sessions)) {
+ if (!is_file($sessrrd)) {
+ rrdtool_create($sessrrd, ' DS:sessions:GAUGE:600:0:U '.$config['rrd_rra']);
+ }
+ rrdtool_update($sessrrd, "N:$sessions");
+ $graphs['pulse_sessions'] = true;
+}
diff --git a/includes/polling/processors/pulse-cpu.inc.php b/includes/polling/processors/pulse-cpu.inc.php
new file mode 100644
index 000000000..03413c3b9
--- /dev/null
+++ b/includes/polling/processors/pulse-cpu.inc.php
@@ -0,0 +1,23 @@
+
+ * 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 3 of the License, or (at your
+ * option) any later version. Please see LICENSE.txt at the top level of
+ * the source code distribution for details.
+ */
+// Simple hard-coded poller for Pulse Secure
+// Yes, it really can be this simple.
+
+echo 'Pulse Secure CPU Usage';
+
+if ($device['os'] == 'pulse') {
+ $usage = str_replace('"', "", snmp_get($device, 'PULSESECURE-PSG-MIB::iveCpuUtil.0', '-OvQ'));
+
+ if (is_numeric($usage)) {
+ $proc = ($usage * 100);
+ }
+}
diff --git a/mibs/PULSESECURE-PSG-MIB b/mibs/PULSESECURE-PSG-MIB
new file mode 100644
index 000000000..24df6882e
--- /dev/null
+++ b/mibs/PULSESECURE-PSG-MIB
@@ -0,0 +1,755 @@
+PULSESECURE-PSG-MIB DEFINITIONS ::= BEGIN
+ IMPORTS
+ NOTIFICATION-TYPE, MODULE-IDENTITY, enterprises
+ FROM SNMPv2-SMI
+ NetworkAddress
+ FROM RFC1155-SMI
+ IpAddress
+ FROM RFC1155-SMI;
+
+pulsesecure-gateway MODULE-IDENTITY
+ LAST-UPDATED "201410161000Z"
+ ORGANIZATION "Pulse Secure"
+ CONTACT-INFO
+ "Internet: https://www.pulsesecure.net"
+ DESCRIPTION
+ "This file defines the private Pulse Secure MIB extensions."
+ REVISION "201410161000Z"
+ DESCRIPTION
+ "Initial Version"
+ ::= { enterprises 12532 }
+
+
+logFullPercent OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Percentage of log file full"
+ ::= { pulsesecure-gateway 1 }
+
+signedInWebUsers OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Number of Signed-In Web Users"
+ ::= { pulsesecure-gateway 2 }
+
+signedInMailUsers OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Number of Signed-In Mail Users"
+ ::= { pulsesecure-gateway 3 }
+
+blockedIP OBJECT-TYPE
+ SYNTAX IpAddress
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "IP Address that is blocked due to consecutive failed login attempts"
+ ::= { pulsesecure-gateway 4 }
+
+authServerName OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "Name of an external authentication server"
+ ::= { pulsesecure-gateway 5 }
+
+productName OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "IVE Licensed Product Name"
+ ::= { pulsesecure-gateway 6 }
+
+productVersion OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "IVE System Software Version"
+ ::= { pulsesecure-gateway 7 }
+
+fileName OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "File name"
+ ::= { pulsesecure-gateway 8 }
+
+meetingUserCount OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "the number of concurrent meeting users"
+ ::= { pulsesecure-gateway 9 }
+
+
+iveCpuUtil OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The CPU Utilization of the IVE system"
+ ::= { pulsesecure-gateway 10 }
+
+iveMemoryUtil OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The Memory Utilization of the IVE system"
+ ::= { pulsesecure-gateway 11 }
+
+iveConcurrentUsers OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The Total number of Concurrent user Licenses used for the IVE Node"
+ ::= { pulsesecure-gateway 12 }
+
+clusterConcurrentUsers OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The Total number of Concurrent user Licenses used for the Cluster"
+ ::= { pulsesecure-gateway 13 }
+
+iveTotalHits OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The Total number of hits to the IVE since last reboot"
+ ::= { pulsesecure-gateway 14 }
+
+iveFileHits OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The Total number of File hits to the IVE since last reboot"
+ ::= { pulsesecure-gateway 15 }
+
+iveWebHits OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The Total number of hits via the Web Interface since the last reboot"
+ ::= { pulsesecure-gateway 16 }
+
+iveAppletHits OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The Total number of applet hits to the IVE since last reboot"
+ ::= { pulsesecure-gateway 17 }
+
+ivetermHits OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The Total number of terminal hits to the IVE since last reboot"
+ ::= { pulsesecure-gateway 18 }
+
+iveSAMHits OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The Total number of SAM(Secure Application manager)hits of since last
+reboot"
+ ::= { pulsesecure-gateway 19 }
+
+iveNCHits OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The Total number of NC(Network Connect) hits of since last reboot"
+ ::= { pulsesecure-gateway 20 }
+
+meetingHits OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The Total number of Meeting hits of since last reboot"
+ ::= { pulsesecure-gateway 21 }
+
+meetingCount OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "the number of concurrent meetings"
+ ::= { pulsesecure-gateway 22 }
+
+logName OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "Name of the log (admin/user/event)"
+ ::= { pulsesecure-gateway 23 }
+
+iveSwapUtil OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The Swap Utilization of the IVE system"
+ ::= { pulsesecure-gateway 24 }
+
+diskFullPercent OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Percentage of disk space full"
+ ::= { pulsesecure-gateway 25 }
+
+blockedIPList OBJECT-TYPE
+ SYNTAX SEQUENCE OF IPEntry
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Table of 10 most recently blocked IPs"
+ ::= { pulsesecure-gateway 26 }
+
+ipEntry OBJECT-TYPE
+ SYNTAX IPEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "An entry containing a blocked IP"
+ INDEX { ipIndex }
+ ::= { blockedIPList 1 }
+
+IPEntry ::= SEQUENCE {
+ ipIndex Integer32,
+ ipValue NetworkAddress
+}
+
+ipIndex OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Index for IP Table"
+ ::= { ipEntry 1 }
+
+ipValue OBJECT-TYPE
+ SYNTAX NetworkAddress
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Blocked IP Entry"
+ ::= { ipEntry 2 }
+
+logID OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "The unique ID of the log message."
+ ::= { pulsesecure-gateway 27 }
+
+logType OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "String stating whether log message is major or critical."
+ ::= { pulsesecure-gateway 28 }
+
+logDescription OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "The actual log message string."
+ ::= { pulsesecure-gateway 29 }
+
+ivsName OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "Virtual System name"
+ ::= { pulsesecure-gateway 30 }
+
+ocspResponderURL OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "Name of an OCSP Responder"
+ ::= { pulsesecure-gateway 31 }
+
+fanDescription OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "The status of the fans"
+ ::= { pulsesecure-gateway 32 }
+
+psDescription OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "The status of the power supplies"
+ ::= { pulsesecure-gateway 33 }
+
+raidDescription OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "The status of the RAID"
+ ::= { pulsesecure-gateway 34 }
+
+
+
+-- J&J traps
+
+clusterName OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "Cluster Name"
+ ::= { pulsesecure-gateway 35 }
+
+
+nodeList OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "List of disabled nodes"
+ ::= { pulsesecure-gateway 36 }
+
+
+vipType OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "Whether the VIP is external or internal"
+ ::= { pulsesecure-gateway 37 }
+
+currentVIP OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "Current value of VIP being changed"
+ ::= { pulsesecure-gateway 38 }
+
+newVIP OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "New value for the VIp being changed"
+ ::= { pulsesecure-gateway 39 }
+
+
+nicEvent OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "Type of event that generated a the Trap: admin, external"
+ ::= { pulsesecure-gateway 40 }
+
+nodeName OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "Node Name"
+ ::= { pulsesecure-gateway 41 }
+
+iveTemperature OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The Temperature of MAG application blade. Other platform such as SA
+and IC will return 0"
+ ::= { pulsesecure-gateway 42 }
+
+iveVPNTunnels OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of concurrent Pulse IPSec and NC users"
+ ::= { pulsesecure-gateway 43 }
+
+iveSSLConnections OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Total number of SSL connection "
+ ::= { pulsesecure-gateway 44 }
+
+esapVersion OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Active ESAP Version"
+ ::= { pulsesecure-gateway 45 }
+
+vipChangeReason OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "Reason for the VIP node change"
+ ::= { pulsesecure-gateway 46 }
+
+processName OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "Process Name"
+ ::= { pulsesecure-gateway 47 }
+
+iveTotalSignedInUsers OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The Total number of Users Logged In for the Cluster"
+ ::= { pulsesecure-gateway 48 }
+
+iveTraps OBJECT IDENTIFIER ::= { pulsesecure-gateway 251 }
+
+-- iveTraps.1 and iveTraps.2 are loaded incorrectly in HP OpenView
+-- so avoid defining them
+
+iveLogNearlyFull NOTIFICATION-TYPE
+ OBJECTS { logFullPercent, logName }
+ STATUS current
+ DESCRIPTION
+ "Log file nearly full"
+ ::= { iveTraps 4 }
+
+iveLogFull NOTIFICATION-TYPE
+ OBJECTS { logName }
+ STATUS current
+ DESCRIPTION
+ "Log file full"
+ ::= { iveTraps 5 }
+
+iveMaxConcurrentUsersSignedIn NOTIFICATION-TYPE
+ STATUS current
+ DESCRIPTION
+ "Maximum number of concurrent users signed in"
+ ::= { iveTraps 6 }
+
+iveTooManyFailedLoginAttempts NOTIFICATION-TYPE
+ OBJECTS { blockedIP }
+ STATUS current
+ DESCRIPTION
+ "Too many failed login attempts"
+ ::= { iveTraps 7 }
+
+externalAuthServerUnreachable NOTIFICATION-TYPE
+ OBJECTS { authServerName }
+ STATUS current
+ DESCRIPTION
+ "External authentication server is not responding"
+ ::= { iveTraps 8 }
+
+iveStart NOTIFICATION-TYPE
+ STATUS current
+ DESCRIPTION
+ "IVE startup under administrator's instruction."
+ ::= { iveTraps 9 }
+
+iveShutdown NOTIFICATION-TYPE
+ STATUS current
+ DESCRIPTION
+ "IVE shutdown under administrator's instruction."
+ ::= { iveTraps 10 }
+
+iveReboot NOTIFICATION-TYPE
+ STATUS current
+ DESCRIPTION
+ "IVE reboot under administrator's instruction."
+ ::= { iveTraps 11 }
+
+archiveServerUnreachable NOTIFICATION-TYPE
+ STATUS current
+ DESCRIPTION
+ "Archive server is not responding"
+ ::= { iveTraps 12 }
+
+archiveServerLoginFailed NOTIFICATION-TYPE
+ STATUS current
+ DESCRIPTION
+ "Could not login into archive server. Verify FTP username and
+password."
+ ::= { iveTraps 13 }
+
+archiveFileTransferFailed NOTIFICATION-TYPE
+ OBJECTS { fileName }
+ STATUS current
+ DESCRIPTION
+ "Could not store file on archive server"
+ ::= { iveTraps 14 }
+
+
+meetingUserLimit NOTIFICATION-TYPE
+ OBJECTS { meetingUserCount }
+ STATUS current
+ DESCRIPTION
+ "Concurrent user count over license limit"
+ ::= { iveTraps 15 }
+
+iveRestart NOTIFICATION-TYPE
+ STATUS current
+ DESCRIPTION
+ "IVE has restarted under administrator's instruction."
+ ::= { iveTraps 16 }
+
+meetingLimit NOTIFICATION-TYPE
+ OBJECTS { meetingCount }
+ STATUS current
+ DESCRIPTION
+ "Concurrent meeting count over license limit"
+ ::= { iveTraps 17 }
+
+iveDiskNearlyFull NOTIFICATION-TYPE
+ OBJECTS { diskFullPercent }
+ STATUS current
+ DESCRIPTION
+ "Disk space nearly full"
+ ::= { iveTraps 18 }
+
+iveDiskFull NOTIFICATION-TYPE
+ STATUS current
+ DESCRIPTION
+ "Disk space full"
+ ::= { iveTraps 19 }
+
+logMessageTrap NOTIFICATION-TYPE
+ OBJECTS { logID, logType, logDescription }
+ STATUS current
+ DESCRIPTION
+ "The TRAP generated from a log message."
+ ::= { iveTraps 20 }
+
+memUtilNotify NOTIFICATION-TYPE
+ OBJECTS { iveMemoryUtil }
+ STATUS current
+ DESCRIPTION
+ "IVE memory utilization above threshold"
+ ::= { iveTraps 21 }
+
+cpuUtilNotify NOTIFICATION-TYPE
+ OBJECTS { iveCpuUtil }
+ STATUS current
+ DESCRIPTION
+ "IVE CPU utilization above threshold"
+ ::= { iveTraps 22 }
+
+swapUtilNotify NOTIFICATION-TYPE
+ OBJECTS { iveSwapUtil }
+ STATUS current
+ DESCRIPTION
+ "IVE swap utilization above threshold"
+ ::= { iveTraps 23 }
+
+iveMaxConcurrentUsersVirtualSystem NOTIFICATION-TYPE
+ OBJECTS { ivsName }
+ STATUS current
+ DESCRIPTION
+ "Maximum number of concurrent Virtual System users signed in"
+ ::= { iveTraps 24 }
+
+ocspResponderConnectionFailed NOTIFICATION-TYPE
+ OBJECTS { ocspResponderURL }
+ STATUS current
+ DESCRIPTION
+ "OCSP Responder cannot be connected"
+ ::= { iveTraps 25 }
+
+iveFanNotify NOTIFICATION-TYPE
+ OBJECTS { fanDescription }
+ STATUS current
+ DESCRIPTION
+ "The status of the fans has changed"
+ ::= { iveTraps 26 }
+
+ivePowerSupplyNotify NOTIFICATION-TYPE
+ OBJECTS { psDescription }
+ STATUS current
+ DESCRIPTION
+ "The status of the power supplies has changed"
+ ::= { iveTraps 27 }
+
+iveRaidNotify NOTIFICATION-TYPE
+ OBJECTS { raidDescription }
+ STATUS current
+ DESCRIPTION
+ "The status of the RAID has changed"
+ ::= { iveTraps 28 }
+
+iveClusterDisableNodeTrap NOTIFICATION-TYPE
+ OBJECTS { clusterName, nodeList }
+ STATUS current
+ DESCRIPTION
+ "A Given node(s) in a cluster has(have) been disabled"
+ ::= { iveTraps 29 }
+
+iveClusterChangedVIPTrap NOTIFICATION-TYPE
+ OBJECTS { vipType, currentVIP, newVIP }
+ STATUS current
+ DESCRIPTION
+ "A external/internal VIP has changed from its current value to a new
+one"
+ ::= { iveTraps 30 }
+
+iveNetExternalInterfaceDownTrap NOTIFICATION-TYPE
+ OBJECTS { nicEvent }
+ STATUS current
+ DESCRIPTION
+ "The External interface has gone down, reason is in nicEvent"
+ ::= { iveTraps 31 }
+
+iveClusterDeleteTrap NOTIFICATION-TYPE
+ OBJECTS { nodeName }
+ STATUS current
+ DESCRIPTION
+ "Cluster delete inititaed by nodeName"
+ ::= { iveTraps 32 }
+
+iveNetInternalInterfaceDownTrap NOTIFICATION-TYPE
+ OBJECTS { nicEvent }
+ STATUS current
+ DESCRIPTION
+ "The Internal interface has gone down, reason is in nicEvent"
+ ::= { iveTraps 33 }
+
+iveNetManagementInterfaceDownTrap NOTIFICATION-TYPE
+ OBJECTS { nicEvent }
+ STATUS current
+ DESCRIPTION
+ "The Management interface has gone down, reason is in nicEvent"
+ ::= { iveTraps 34 }
+
+iveTemperatureNotify NOTIFICATION-TYPE
+ OBJECTS { iveTemperature }
+ STATUS current
+ DESCRIPTION
+ "IVE Temperature is above threshold"
+ ::= { iveTraps 35 }
+
+iveVIPNodeChanged NOTIFICATION-TYPE
+ OBJECTS { nodeName, vipChangeReason}
+ STATUS current
+ DESCRIPTION
+ "Notifies that VIP node has changed.
+ nodeName is the new node which is hosting the VIP.
+ vipChangeReason specifies the reason for the change."
+ ::= { iveTraps 36 }
+
+iveProcessesNearMaxLimit NOTIFICATION-TYPE
+ OBJECTS { processName }
+ STATUS current
+ DESCRIPTION
+ "The count of processes (by processName) is about reach to maximum
+limit"
+ ::= { iveTraps 37 }
+
+iveProcessesReachedMaxLimit NOTIFICATION-TYPE
+ OBJECTS { processName }
+ STATUS current
+ DESCRIPTION
+ "The count of processes (by processName) has reached to maximum limit"
+ ::= { iveTraps 38 }
+
+-- Product Name
+iveSAProduct OBJECT IDENTIFIER ::= { pulsesecure-gateway 252 }
+iveICProduct OBJECT IDENTIFIER ::= { pulsesecure-gateway 253 }
+iveMAGProduct OBJECT IDENTIFIER ::= { pulsesecure-gateway 254 }
+iveVAProduct OBJECT IDENTIFIER ::= { pulsesecure-gateway 255 }
+
+iveProductSA700 OBJECT IDENTIFIER ::= {iveSAProduct 1}
+iveProductSA2000 OBJECT IDENTIFIER ::= {iveSAProduct 2 }
+iveProductSA2500 OBJECT IDENTIFIER ::= {iveSAProduct 3 }
+iveProductSA4000 OBJECT IDENTIFIER ::= {iveSAProduct 4 }
+iveProductSA4500 OBJECT IDENTIFIER ::= {iveSAProduct 5 }
+iveProductSA6000 OBJECT IDENTIFIER ::= {iveSAProduct 6 }
+iveProductSA6500 OBJECT IDENTIFIER ::= {iveSAProduct 7 }
+
+iveProductIC4000 OBJECT IDENTIFIER ::= {iveICProduct 1 }
+iveProductIC4500 OBJECT IDENTIFIER ::= {iveICProduct 2 }
+iveProductIC6000 OBJECT IDENTIFIER ::= {iveICProduct 3 }
+iveProductIC6500 OBJECT IDENTIFIER ::= {iveICProduct 4 }
+
+--MAG platform
+iveProductMAG2600 OBJECT IDENTIFIER ::= {iveMAGProduct 1 }
+iveProductMAG4610 OBJECT IDENTIFIER ::= {iveMAGProduct 2 }
+iveProductSM160 OBJECT IDENTIFIER ::= {iveMAGProduct 3 }
+iveProductSM360 OBJECT IDENTIFIER ::= {iveMAGProduct 4 }
+
+--VA platform
+iveProductVASPE OBJECT IDENTIFIER ::= {iveVAProduct 1 }
+iveProductVADTE OBJECT IDENTIFIER ::= {iveVAProduct 2 }
+
+--SA
+iveSA700 OBJECT IDENTIFIER ::= {iveProductSA700 1}
+iveSA2000 OBJECT IDENTIFIER ::= {iveProductSA2000 1}
+iveSA2500 OBJECT IDENTIFIER ::= {iveProductSA2500 1}
+iveSA4000 OBJECT IDENTIFIER ::= {iveProductSA4000 1}
+iveSA4500 OBJECT IDENTIFIER ::= {iveProductSA4500 1}
+iveSA4000FIPS OBJECT IDENTIFIER ::= {iveProductSA4000 2}
+iveSA4500FIPS OBJECT IDENTIFIER ::= {iveProductSA4500 2}
+iveSA6000 OBJECT IDENTIFIER ::= {iveProductSA6000 1}
+iveSA6500 OBJECT IDENTIFIER ::= {iveProductSA6500 1}
+iveSA6000FIPS OBJECT IDENTIFIER ::= {iveProductSA6000 2}
+iveSA6500FIPS OBJECT IDENTIFIER ::= {iveProductSA6500 2}
+
+--IC
+iveIC4000 OBJECT IDENTIFIER ::= {iveProductIC4000 1}
+iveIC6000 OBJECT IDENTIFIER ::= {iveProductIC6000 1}
+iveIC4500 OBJECT IDENTIFIER ::= {iveProductIC4500 1}
+iveIC6500 OBJECT IDENTIFIER ::= {iveProductIC6500 1}
+iveIC6000FIPS OBJECT IDENTIFIER ::= {iveProductIC6000 2}
+
+--MAG platform incase we have other rev
+iveMAG2600 OBJECT IDENTIFIER ::= {iveProductMAG2600 1}
+iveMAG4610 OBJECT IDENTIFIER ::= {iveProductMAG4610 1}
+iveMAGSM160 OBJECT IDENTIFIER ::= {iveProductSM160 1}
+iveMAGSM360 OBJECT IDENTIFIER ::= {iveProductSM360 1}
+
+--VA platform incase we have to extend further
+iveVASPE OBJECT IDENTIFIER ::= {iveProductVASPE 1}
+iveVADTE OBJECT IDENTIFIER ::= {iveProductVADTE 1}
+
+
+END
diff --git a/sql-schema/073.sql b/sql-schema/073.sql
new file mode 100644
index 000000000..635de4cb4
--- /dev/null
+++ b/sql-schema/073.sql
@@ -0,0 +1,2 @@
+INSERT INTO `graph_types`(`graph_type`, `graph_subtype`, `graph_section`, `graph_descr`, `graph_order`) VALUES ('device', 'pulse_users', 'firewall', 'Active Users', '');
+INSERT INTO `graph_types`(`graph_type`, `graph_subtype`, `graph_section`, `graph_descr`, `graph_order`) VALUES ('device', 'pulse_sessions', 'firewall', 'Active Sessions', '');