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;
49 @OnapCommandSchema(type = OnapCommandSnmpConstants.SNMP_SCHEMA_PROFILE)
50 public class OnapSnmpCommand extends OnapCommand {
52 private List<Map<String, String>> resultMap;
54 private String version;
56 private String command;
58 public OnapSnmpCommand() {
59 super.addDefaultSchemas(OnapCommandSnmpConstants.DEFAULT_PARAMETER_SNMP_FILE_NAME);
62 private String getAgent() {
63 OnapCommandParameter onapCommandParameter = this.getParametersMap().get(OnapCommandSnmpConstants.SNMP_AGENT);
64 return (String) onapCommandParameter.getValue();
67 private PDU getPDU(Integer commandType, String[] oids) {
69 for (String oid: oids) {
70 pdu.add(new VariableBinding(new OID(oid)));
73 pdu.setType(commandType);
77 private Target getTarget() throws OnapCommandException { //NOSONAR
78 Address targetAddress = GenericAddress.parse(this.getAgent()); //udp:127.0.0.1/161
79 CommunityTarget target = new CommunityTarget();
80 target.setCommunity(new OctetString(OnapCommandSnmpConstants.SNMP_COMMNUNITY_STRING));
81 target.setAddress(targetAddress);
82 target.setRetries(OnapCommandSnmpConstants.RETRY_COUNT);
83 target.setTimeout(OnapCommandSnmpConstants.TIMEOUT);
85 switch (this.getSnmpVersion()) {
86 case OnapCommandSnmpConstants.SNMP_VERSION_V1:
87 target.setVersion(SnmpConstants.version1);
90 case OnapCommandSnmpConstants.SNMP_VERSION_V2C:
91 target.setVersion(SnmpConstants.version2c);
101 protected void run() throws OnapCommandException {
104 // set JVM constant to avoid delay by snmp4j
105 System.setProperty("java.security.egd", "file:data/./urandom");
107 DefaultUdpTransportMapping defaultUdpTransportMapping = new DefaultUdpTransportMapping();
108 defaultUdpTransportMapping.listen();
109 Snmp snmp = new Snmp(defaultUdpTransportMapping);
111 List<String> oids = new ArrayList<>();
112 for (Map<String, String> map: resultMap) {
113 oids.addAll(map.values());
116 String[] oidStrArr = oids.toArray(new String[oids.size()]);
118 if (OnapCommandSnmpConstants.SNMP_CMD_GET.equals(this.command)) {
119 ResponseEvent responseEvent = snmp.send(getPDU(PDU.GET, oidStrArr), getTarget(), null);
120 if ( responseEvent != null) {
121 if (responseEvent.getResponse().getErrorStatus() == PDU.noError) {
122 List<? extends VariableBinding> variableBindings = responseEvent.
123 getResponse().getVariableBindings();
124 variableBindings.stream().forEach(varBinding -> { //NOSONAR
125 String key = getKeyForValue(varBinding.getOid().toString());
127 this.getResult().getRecordsMap().get(key).getValues().add(
128 varBinding.getVariable().toString());
132 throw new OnapSnmpErrorResponse("Error response from SNMP agent",
133 responseEvent.getResponse().getErrorStatus());
136 throw new OnapSnmpErrorResponse("Failed to send SNMP GET command");
140 } catch (IOException ex) {
141 throw new OnapSnmpErrorResponse(ex);
145 private String getKeyForValue(String value) {
146 Optional<Map<String, String>> mapOptional = resultMap.stream().filter(map -> map.values().contains(value)).findFirst(); //NOSONAR
147 if (!mapOptional.isPresent()) {
150 return mapOptional.get().keySet().iterator().next();
154 protected List<String> initializeProfileSchema(Map<String, ?> schemaMap, boolean validate) throws OnapCommandException {
155 return OnapCommandSchemaSnmpLoader.parseSnmpSchema(this, schemaMap, validate);
158 public String getSnmpVersion() {
162 public void setSnmpVersion(String version) {
163 this.version = version;
166 public String getCommand() {
170 public void setCommand(String command) {
171 this.command = command;
175 public List<Map<String, String>> getResultMap() {
179 public void setResultMap(List<Map<String, String>> resultMap) {
180 this.resultMap = resultMap;