blob: b48bc78b7c523b6e9997c52623c31fb18fa14243 [file] [log] [blame]
Ratan Guptaaaf87de2018-04-16 15:25:13 +05301/**
2 * @brief SNMP Error Notification class.
3 *
4 * This file is part of phosphor-snmp project.
5 *
6 * Copyright (c) 2018 IBM Corporation
7 *
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 *
20 * Note: In near future this file will be autogenerated by the custom parser.
21 *
22 */
23
24#pragma once
25
Patrick Williams1334b7b2021-02-22 17:15:12 -060026// net-snmp requires a very specific header include order.
27// disable clang-format around this block
28// clang-format off
Ratan Guptaaaf87de2018-04-16 15:25:13 +053029#include <net-snmp/net-snmp-config.h>
30#include <net-snmp/net-snmp-includes.h>
31#include <net-snmp/agent/net-snmp-agent-includes.h>
Patrick Williams1334b7b2021-02-22 17:15:12 -060032// clang-format on
Ratan Guptaaaf87de2018-04-16 15:25:13 +053033
34#include <sdbusplus/server.hpp>
35
Ratan Guptaaaf87de2018-04-16 15:25:13 +053036#include <sstream>
37#include <string>
38#include <tuple>
39#include <vector>
40
Ratan Guptaaaf87de2018-04-16 15:25:13 +053041namespace phosphor
42{
43namespace network
44{
45namespace snmp
46{
47
48using OID = std::array<oid, MAX_OID_LEN>;
49using OID_LEN = size_t;
50using Type = u_char;
51
Patrick Williamse5d90c32020-05-13 18:00:44 -050052using Value = std::variant<uint32_t, uint64_t, int32_t, std::string>;
Ratan Guptaaaf87de2018-04-16 15:25:13 +053053// Generic snmp trap ID
54oid SNMPTrapOID[] = {1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0};
Ratan Gupta0d5094b2021-03-05 19:25:26 +053055oid sysuptimeOID[] = {1, 3, 6, 1, 2, 1, 1, 3, 0};
Ratan Guptaaaf87de2018-04-16 15:25:13 +053056
57using Object = std::tuple<OID, OID_LEN, Type, Value>;
58
59/** @brief Get the ASN object type from the given templatized type.
60 * Specialize this template for handling a specific type.
61 * @tparam T - type of object from ASN type would be decided.
62 * @returns the ASN object type.
63 */
Patrick Williams1334b7b2021-02-22 17:15:12 -060064template <typename T>
65u_char getASNType() = delete;
Ratan Guptaaaf87de2018-04-16 15:25:13 +053066
Patrick Williams1334b7b2021-02-22 17:15:12 -060067template <>
68u_char getASNType<uint32_t>()
Ratan Guptaaaf87de2018-04-16 15:25:13 +053069{
70 return ASN_UNSIGNED;
71}
72
Patrick Williams1334b7b2021-02-22 17:15:12 -060073template <>
74u_char getASNType<uint64_t>()
Ratan Guptaaaf87de2018-04-16 15:25:13 +053075{
76 return ASN_OPAQUE_U64;
77}
78
Patrick Williams1334b7b2021-02-22 17:15:12 -060079template <>
80u_char getASNType<int32_t>()
Ratan Guptaaaf87de2018-04-16 15:25:13 +053081{
82 return ASN_INTEGER;
83}
84
Patrick Williams1334b7b2021-02-22 17:15:12 -060085template <>
86u_char getASNType<std::string>()
Ratan Guptaaaf87de2018-04-16 15:25:13 +053087{
88 return ASN_OCTET_STR;
89}
90
91/** @class Notification
92 * @brief Notification interface.
93 *
94 * This class implements the sendTrap function which
95 * send the list of objects defined by the specific notification
96 * to the configured SNMP manager.
97 */
98
99class Notification
100{
Ratan Guptaaaf87de2018-04-16 15:25:13 +0530101 public:
102 Notification() = default;
Patrick Williams1334b7b2021-02-22 17:15:12 -0600103 Notification(const Notification&) = delete;
104 Notification(Notification&&) = default;
105 Notification& operator=(const Notification&) = delete;
106 Notification& operator=(Notification&&) = default;
Ratan Guptaaaf87de2018-04-16 15:25:13 +0530107 virtual ~Notification() = default;
108
109 /** @brief Send the snmp trap to the configured
110 * manager.
111 */
112 void sendTrap();
113
114 protected:
Ratan Guptaec26fa62018-04-16 15:28:36 +0530115 /** @brief Add the variable in the snmp pdu object.
116 * @param[in] pdu - SNMP pdu object.
117 * @param[in] objID - SNMP object identifier.
118 * @param[in] objIDLen - Object identifier length.
119 * @param[in] type - ASN type of object.
120 * @param[in] val - Value of the object.
121 * @returns true on success otherwise false.
122 */
Patrick Williams1334b7b2021-02-22 17:15:12 -0600123 bool addPDUVar(netsnmp_pdu& pdu, const OID& objID, size_t objIDLen,
Ratan Guptaec26fa62018-04-16 15:28:36 +0530124 u_char type, Value val);
125
Ratan Guptaaaf87de2018-04-16 15:25:13 +0530126 /** @brief get the SNMP notification type in the mib
127 * defined format.
128 * This is pure virtual function all the subclasses
129 * need to provide its own defined type.
130 * @returns the notification type string.
131 */
132 virtual std::pair<OID, OID_LEN> getTrapOID() = 0;
133
134 /** @brief get all the objects meta data defined under
135 * this notification.
136 */
137 virtual std::vector<Object> getFieldOIDList() = 0;
138};
139
Ratan Guptaec26fa62018-04-16 15:28:36 +0530140class TestErrorNotification;
141
Ratan Guptaaaf87de2018-04-16 15:25:13 +0530142/** @class ErrorNotification
143 * @brief subclass of Notification
144 *
145 * A Error Notification represents the objects needed by the
146 * Error Object.
147 */
148class OBMCErrorNotification : public Notification
149{
Ratan Guptaaaf87de2018-04-16 15:25:13 +0530150 private:
Ed Tanous6d421732023-07-12 14:00:51 -0700151 uint32_t OBMCErrorID = 0;
152 uint64_t OBMCErrorTimestamp = 0;
153 int32_t OBMCErrorSeverity = 0;
Ratan Guptaaaf87de2018-04-16 15:25:13 +0530154 std::string OBMCErrorMessage;
155
156 public:
Ed Tanous69cea062023-07-12 14:23:37 -0700157 OBMCErrorNotification() = delete;
Patrick Williams1334b7b2021-02-22 17:15:12 -0600158 OBMCErrorNotification(const OBMCErrorNotification&) = delete;
159 OBMCErrorNotification(OBMCErrorNotification&&) = default;
160 OBMCErrorNotification& operator=(const OBMCErrorNotification&) = delete;
161 OBMCErrorNotification& operator=(OBMCErrorNotification&&) = default;
Ratan Guptaaaf87de2018-04-16 15:25:13 +0530162 ~OBMCErrorNotification() = default;
163
164 /** @brief Constructor
165 * @param[in] id - The error entry id.
166 * @param[in] ts - The commit timestamp.
167 * @param[in] sev - The severity of the error.
168 * @param[in] msg - The message of the error.
169 */
170 OBMCErrorNotification(uint32_t id, uint64_t ts, int32_t sev,
171 std::string msg) :
172 OBMCErrorID(id),
173 OBMCErrorTimestamp(ts), OBMCErrorSeverity(sev), OBMCErrorMessage(msg)
Patrick Williams1334b7b2021-02-22 17:15:12 -0600174 {}
Ratan Guptaaaf87de2018-04-16 15:25:13 +0530175
176 protected:
177 std::pair<OID, OID_LEN> getTrapOID() override
178 {
179 // notification sub types
180 OID id = {1, 3, 6, 1, 4, 1, 49871, 1, 0, 0, 1};
181 OID_LEN idLen = 11;
182 return std::make_pair<OID, OID_LEN>(std::move(id), std::move(idLen));
183 }
184
185 std::vector<Object> getFieldOIDList() override
186 {
187 std::vector<Object> objectList;
Ed Tanous69cea062023-07-12 14:23:37 -0700188 objectList.reserve(4);
189 {
190 OID_LEN idLen = 11;
191 OID id = {1, 3, 6, 1, 4, 1, 49871, 1, 0, 1, 1};
192 u_char type = getASNType<decltype(OBMCErrorID)>();
Ratan Guptaaaf87de2018-04-16 15:25:13 +0530193
Ed Tanous69cea062023-07-12 14:23:37 -0700194 objectList.emplace_back(id, idLen, type, OBMCErrorID);
195 }
196 {
197 OID_LEN idLen = 11;
198 OID id = {1, 3, 6, 1, 4, 1, 49871, 1, 0, 1, 2};
199 u_char type = getASNType<decltype(OBMCErrorTimestamp)>();
Ratan Guptaaaf87de2018-04-16 15:25:13 +0530200
Ed Tanous69cea062023-07-12 14:23:37 -0700201 objectList.emplace_back(id, idLen, type, OBMCErrorTimestamp);
202 }
203 {
204 OID_LEN idLen = 11;
205 OID id = {1, 3, 6, 1, 4, 1, 49871, 1, 0, 1, 3};
206 u_char type = getASNType<decltype(OBMCErrorSeverity)>();
Ratan Guptaaaf87de2018-04-16 15:25:13 +0530207
Ed Tanous69cea062023-07-12 14:23:37 -0700208 objectList.emplace_back(id, idLen, type, OBMCErrorSeverity);
209 }
210 {
211 OID_LEN idLen = 11;
212 OID id = {1, 3, 6, 1, 4, 1, 49871, 1, 0, 1, 4};
213 u_char type = getASNType<decltype(OBMCErrorMessage)>();
Ratan Guptaaaf87de2018-04-16 15:25:13 +0530214
Ed Tanous69cea062023-07-12 14:23:37 -0700215 objectList.emplace_back(id, idLen, type, OBMCErrorMessage);
216 }
Ratan Guptaaaf87de2018-04-16 15:25:13 +0530217 return objectList;
218 }
Ratan Guptaec26fa62018-04-16 15:28:36 +0530219
220 friend class TestErrorNotification;
Ratan Guptaaaf87de2018-04-16 15:25:13 +0530221};
222
223} // namespace snmp
224} // namespace network
225} // namespace phosphor