2 * Copyright 2017 Huawei Technologies Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.onap.cli.fw.snmp.cmd;
19 import org.onap.cli.fw.cmd.OnapCommand;
20 import org.onap.cli.fw.error.OnapCommandException;
21 import org.onap.cli.fw.input.OnapCommandParameter;
22 import org.onap.cli.fw.schema.OnapCommandSchema;
23 import org.onap.cli.fw.snmp.conf.OnapCommandSnmpConstants;
24 import org.onap.cli.fw.snmp.exception.OnapSnmpErrorResponse;
25 import org.onap.cli.fw.snmp.schema.OnapCommandSchemaSnmpLoader;
26 import org.snmp4j.CommunityTarget;
27 import org.snmp4j.PDU;
28 import org.snmp4j.Snmp;
29 import org.snmp4j.Target;
30 import org.snmp4j.event.ResponseEvent;
31 import org.snmp4j.mp.SnmpConstants;
32 import org.snmp4j.smi.Address;
33 import org.snmp4j.smi.GenericAddress;
34 import org.snmp4j.smi.OID;
35 import org.snmp4j.smi.OctetString;
36 import org.snmp4j.smi.VariableBinding;
37 import org.snmp4j.transport.DefaultUdpTransportMapping;
39 import java.io.IOException;
40 import java.util.ArrayList;
41 import java.util.List;
43 import java.util.Optional;
44 import java.util.Vector;
50 @OnapCommandSchema(type = OnapCommandSnmpConstants.SNMP_SCHEMA_PROFILE)
51 public class OnapSnmpCommand extends OnapCommand {
53 private List<Map<String, String>> resultMap;
55 private String version;
57 private String command;
59 public OnapSnmpCommand() {
60 super.addDefaultSchemas(OnapCommandSnmpConstants.DEFAULT_PARAMETER_SNMP_FILE_NAME);
63 private String getAgent() {
64 OnapCommandParameter onapCommandParameter = this.getParametersMap().get(OnapCommandSnmpConstants.SNMP_AGENT);
65 return (String) onapCommandParameter.getValue();
68 private PDU getPDU(Integer commandType, String[] oids) {
70 for (String oid: oids) {
71 pdu.add(new VariableBinding(new OID(oid)));
74 pdu.setType(commandType);
78 private Target getTarget() throws OnapCommandException { //NOSONAR
79 Address targetAddress = GenericAddress.parse(this.getAgent()); //udp:127.0.0.1/161
80 CommunityTarget target = new CommunityTarget();
81 target.setCommunity(new OctetString(OnapCommandSnmpConstants.SNMP_COMMNUNITY_STRING));
82 target.setAddress(targetAddress);
83 target.setRetries(OnapCommandSnmpConstants.RETRY_COUNT);
84 target.setTimeout(OnapCommandSnmpConstants.TIMEOUT);
86 switch (this.getSnmpVersion()) {
87 case OnapCommandSnmpConstants.SNMP_VERSION_V1:
88 target.setVersion(SnmpConstants.version1);
91 case OnapCommandSnmpConstants.SNMP_VERSION_V2C:
92 target.setVersion(SnmpConstants.version2c);
102 protected void run() throws OnapCommandException {
105 // set JVM constant to avoid delay by snmp4j
106 System.setProperty("java.security.egd", "file:data/./urandom");
108 DefaultUdpTransportMapping defaultUdpTransportMapping = new DefaultUdpTransportMapping();
109 defaultUdpTransportMapping.listen();
110 Snmp snmp = new Snmp(defaultUdpTransportMapping);
112 List<String> oids = new ArrayList<>();
113 for (Map<String, String> map: resultMap) {
114 oids.addAll(map.values());
117 String[] oidStrArr = oids.toArray(new String[oids.size()]);
119 if (OnapCommandSnmpConstants.SNMP_CMD_GET.equals(this.command)) {
120 ResponseEvent responseEvent = snmp.send(getPDU(PDU.GET, oidStrArr), getTarget(), null);
121 if ( responseEvent != null) {
122 if (responseEvent.getResponse().getErrorStatus() == PDU.noError) {
123 Vector<? extends VariableBinding> variableBindings = responseEvent.
124 getResponse().getVariableBindings();
125 variableBindings.stream().forEach(varBinding -> { //NOSONAR
126 String key = getKeyForValue(varBinding.getOid().toString());
128 this.getResult().getRecordsMap().get(key).getValues().add(
129 varBinding.getVariable().toString());
133 throw new OnapSnmpErrorResponse("Error response from SNMP agent",
134 responseEvent.getResponse().getErrorStatus());
137 throw new OnapSnmpErrorResponse("Failed to send SNMP GET command");
141 } catch (IOException ex) {
142 throw new OnapSnmpErrorResponse(ex);
146 private String getKeyForValue(String value) {
147 Optional<Map<String, String>> mapOptional = resultMap.stream().filter(map -> map.values().contains(value)).findFirst(); //NOSONAR
148 if (!mapOptional.isPresent()) {
151 return mapOptional.get().keySet().iterator().next();
155 protected List<String> initializeProfileSchema(Map<String, ?> schemaMap, boolean validate) throws OnapCommandException {
156 return OnapCommandSchemaSnmpLoader.parseSnmpSchema(this, schemaMap, validate);
159 public String getSnmpVersion() {
163 public void setSnmpVersion(String version) {
164 this.version = version;
167 public String getCommand() {
171 public void setCommand(String command) {
172 this.command = command;
176 public List<Map<String, String>> getResultMap() {
180 public void setResultMap(List<Map<String, String>> resultMap) {
181 this.resultMap = resultMap;