4fc47538aa6ce32f78f4520cbef2f5572dfe9080
[cli.git] / profiles / snmp / src / main / java / org / onap / cli / fw / snmp / cmd / OnapSnmpCommand.java
1 /*
2  * Copyright 2017 Huawei Technologies Co., Ltd.
3  *
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
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 package org.onap.cli.fw.snmp.cmd;
18
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;
38
39 import java.io.IOException;
40 import java.util.ArrayList;
41 import java.util.List;
42 import java.util.Map;
43 import java.util.Optional;
44 import java.util.Vector;
45
46 /**
47  * Oclip snmp Command.
48  *
49  */
50 @OnapCommandSchema(type = OnapCommandSnmpConstants.SNMP_SCHEMA_PROFILE)
51 public class OnapSnmpCommand extends OnapCommand {
52
53     private List<Map<String, String>> resultMap;
54
55     private String version;
56
57     private String command;
58
59     public OnapSnmpCommand() {
60         super.addDefaultSchemas(OnapCommandSnmpConstants.DEFAULT_PARAMETER_SNMP_FILE_NAME);
61     }
62
63     private String getAgent() {
64         OnapCommandParameter onapCommandParameter = this.getParametersMap().get(OnapCommandSnmpConstants.SNMP_AGENT);
65         return (String) onapCommandParameter.getValue();
66     }
67
68     private PDU getPDU(Integer commandType, String[] oids) {
69         PDU pdu = new PDU();
70         for (String oid: oids) {
71             pdu.add(new VariableBinding(new OID(oid)));
72         }
73
74         pdu.setType(commandType);
75         return pdu;
76     }
77
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);
85
86         switch (this.getSnmpVersion()) {
87             case OnapCommandSnmpConstants.SNMP_VERSION_V1:
88                 target.setVersion(SnmpConstants.version1);
89                 break;
90
91             case OnapCommandSnmpConstants.SNMP_VERSION_V2C:
92                 target.setVersion(SnmpConstants.version2c);
93                 break;
94
95             default:
96                 break;
97         }
98         return target;
99     }
100
101     @Override
102     protected void run() throws OnapCommandException {
103         try {
104
105             // set JVM constant to avoid delay by snmp4j
106             System.setProperty("java.security.egd", "file:data/./urandom");
107
108             DefaultUdpTransportMapping defaultUdpTransportMapping = new DefaultUdpTransportMapping();
109             defaultUdpTransportMapping.listen();
110             Snmp snmp = new Snmp(defaultUdpTransportMapping);
111
112             List<String> oids = new ArrayList<>();
113             for (Map<String, String> map: resultMap) {
114                 oids.addAll(map.values());
115             }
116
117             String[] oidStrArr = oids.toArray(new String[oids.size()]);
118
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());
127                                 if (key != null) {
128                                     this.getResult().getRecordsMap().get(key).getValues().add(
129                                             varBinding.getVariable().toString());
130                                 }
131                             });
132                         } else {
133                             throw new OnapSnmpErrorResponse("Error response from SNMP agent",
134                                 responseEvent.getResponse().getErrorStatus());
135                         }
136                     } else {
137                         throw new OnapSnmpErrorResponse("Failed to send SNMP GET command");
138                     }
139             }
140             snmp.close();
141         } catch (IOException ex) {
142             throw new OnapSnmpErrorResponse(ex);
143         }
144     }
145
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()) {
149             return null;
150         }
151         return mapOptional.get().keySet().iterator().next();
152     }
153
154     @Override
155     protected List<String> initializeProfileSchema(Map<String, ?> schemaMap, boolean validate) throws OnapCommandException {
156         return OnapCommandSchemaSnmpLoader.parseSnmpSchema(this, schemaMap, validate);
157     }
158
159     public String getSnmpVersion() {
160         return version;
161     }
162
163     public void setSnmpVersion(String version) {
164         this.version = version;
165     }
166
167     public String getCommand() {
168         return command;
169     }
170
171     public void setCommand(String command) {
172         this.command = command;
173     }
174
175
176     public List<Map<String, String>> getResultMap() {
177         return resultMap;
178     }
179
180     public void setResultMap(List<Map<String, String>> resultMap) {
181         this.resultMap = resultMap;
182     }
183
184 }