View Javadoc
1   package org.metricshub.ipmi.core.coding;
2   
3   /*-
4    * ╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲
5    * IPMI Java Client
6    * ჻჻჻჻჻჻
7    * Copyright 2023 Verax Systems, MetricsHub
8    * ჻჻჻჻჻჻
9    * This program is free software: you can redistribute it and/or modify
10   * it under the terms of the GNU Lesser General Public License as
11   * published by the Free Software Foundation, either version 3 of the
12   * License, or (at your option) any later version.
13   *
14   * This program is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   * GNU General Lesser Public License for more details.
18   *
19   * You should have received a copy of the GNU General Lesser Public
20   * License along with this program.  If not, see
21   * <http://www.gnu.org/licenses/lgpl-3.0.html>.
22   * ╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱
23   */
24  
25  import org.metricshub.ipmi.core.coding.commands.IpmiVersion;
26  import org.metricshub.ipmi.core.coding.commands.PrivilegeLevel;
27  import org.metricshub.ipmi.core.coding.commands.chassis.GetChassisStatus;
28  import org.metricshub.ipmi.core.coding.commands.chassis.GetChassisStatusResponseData;
29  import org.metricshub.ipmi.core.coding.commands.fru.BaseUnit;
30  import org.metricshub.ipmi.core.coding.commands.fru.GetFruInventoryAreaInfo;
31  import org.metricshub.ipmi.core.coding.commands.fru.GetFruInventoryAreaInfoResponseData;
32  import org.metricshub.ipmi.core.coding.commands.fru.ReadFruData;
33  import org.metricshub.ipmi.core.coding.commands.fru.ReadFruDataResponseData;
34  import org.metricshub.ipmi.core.coding.commands.fru.record.BoardInfo;
35  import org.metricshub.ipmi.core.coding.commands.fru.record.ChassisInfo;
36  import org.metricshub.ipmi.core.coding.commands.fru.record.FruRecord;
37  import org.metricshub.ipmi.core.coding.commands.fru.record.ProductInfo;
38  import org.metricshub.ipmi.core.coding.commands.sdr.GetSdr;
39  import org.metricshub.ipmi.core.coding.commands.sdr.GetSdrRepositoryInfo;
40  import org.metricshub.ipmi.core.coding.commands.sdr.GetSdrRepositoryInfoResponseData;
41  import org.metricshub.ipmi.core.coding.commands.sdr.GetSdrResponseData;
42  import org.metricshub.ipmi.core.coding.commands.sdr.GetSensorReading;
43  import org.metricshub.ipmi.core.coding.commands.sdr.GetSensorReadingResponseData;
44  import org.metricshub.ipmi.core.coding.commands.sdr.ReserveSdrRepository;
45  import org.metricshub.ipmi.core.coding.commands.sdr.ReserveSdrRepositoryResponseData;
46  import org.metricshub.ipmi.core.coding.commands.sdr.record.CompactSensorRecord;
47  import org.metricshub.ipmi.core.coding.commands.sdr.record.FruDeviceLocatorRecord;
48  import org.metricshub.ipmi.core.coding.commands.sdr.record.FullSensorRecord;
49  import org.metricshub.ipmi.core.coding.commands.sdr.record.RateUnit;
50  import org.metricshub.ipmi.core.coding.commands.sdr.record.ReadingType;
51  import org.metricshub.ipmi.core.coding.commands.sdr.record.SensorRecord;
52  import org.metricshub.ipmi.core.coding.commands.sel.GetSelEntry;
53  import org.metricshub.ipmi.core.coding.commands.sel.GetSelEntryResponseData;
54  import org.metricshub.ipmi.core.coding.commands.sel.GetSelInfo;
55  import org.metricshub.ipmi.core.coding.commands.sel.GetSelInfoResponseData;
56  import org.metricshub.ipmi.core.coding.commands.sel.ReserveSel;
57  import org.metricshub.ipmi.core.coding.commands.sel.ReserveSelResponseData;
58  import org.metricshub.ipmi.core.coding.commands.sel.SelRecord;
59  import org.metricshub.ipmi.core.coding.commands.session.CloseSession;
60  import org.metricshub.ipmi.core.coding.commands.session.GetChannelAuthenticationCapabilities;
61  import org.metricshub.ipmi.core.coding.commands.session.GetChannelAuthenticationCapabilitiesResponseData;
62  import org.metricshub.ipmi.core.coding.commands.session.GetChannelCipherSuites;
63  import org.metricshub.ipmi.core.coding.commands.session.GetChannelCipherSuitesResponseData;
64  import org.metricshub.ipmi.core.coding.commands.session.OpenSession;
65  import org.metricshub.ipmi.core.coding.commands.session.OpenSessionResponseData;
66  import org.metricshub.ipmi.core.coding.commands.session.Rakp1;
67  import org.metricshub.ipmi.core.coding.commands.session.Rakp1ResponseData;
68  import org.metricshub.ipmi.core.coding.commands.session.Rakp3;
69  import org.metricshub.ipmi.core.coding.commands.session.Rakp3ResponseData;
70  import org.metricshub.ipmi.core.coding.protocol.AuthenticationType;
71  import org.metricshub.ipmi.core.coding.protocol.decoder.PlainCommandv20Decoder;
72  import org.metricshub.ipmi.core.coding.protocol.decoder.Protocolv15Decoder;
73  import org.metricshub.ipmi.core.coding.protocol.decoder.Protocolv20Decoder;
74  import org.metricshub.ipmi.core.coding.protocol.encoder.Protocolv15Encoder;
75  import org.metricshub.ipmi.core.coding.protocol.encoder.Protocolv20Encoder;
76  import org.metricshub.ipmi.core.coding.security.CipherSuite;
77  import org.metricshub.ipmi.core.coding.security.SecurityConstants;
78  import org.metricshub.ipmi.core.common.TypeConverter;
79  
80  import javax.crypto.NoSuchPaddingException;
81  
82  import org.slf4j.Logger;
83  import org.slf4j.LoggerFactory;
84  
85  import java.io.FileInputStream;
86  import java.io.IOException;
87  import java.net.DatagramPacket;
88  import java.net.DatagramSocket;
89  import java.net.InetAddress;
90  import java.security.InvalidKeyException;
91  import java.security.NoSuchAlgorithmException;
92  import java.text.DateFormat;
93  import java.util.ArrayList;
94  import java.util.Date;
95  import java.util.List;
96  import java.util.Properties;
97  
98  /**
99   * Test driver for Encoder/Decoder
100  */
101 public class DecoderRunner extends Thread {
102 
103     private DatagramSocket socket;
104 
105     private static int managedSeqNum;
106     private static boolean lock;
107 
108     private static Rakp1 r1;
109     private static Rakp1ResponseData r1rd;
110     private static CipherSuite cs = new CipherSuite((byte) 0,
111             SecurityConstants.AA_RAKP_HMAC_SHA1, (byte) 0, (byte) 0);
112 
113     private static Logger logger = LoggerFactory.getLogger(DecoderRunner.class);
114 
115     private static int cssrcv = 16;
116 
117     private static int reservation;
118 
119     private static int nextRecId = 0;
120 
121     private static byte[] cssrec;
122 
123     private static int fruId = 0;
124 
125     private static int fruSize = 528;
126 
127     public static void main(String[] args) throws IOException, InterruptedException, NoSuchAlgorithmException, InvalidKeyException {
128 
129         logger.info(DateFormat.getInstance().format(
130                 new Date(new Date().getTime())));
131 
132         lock = true;
133 
134         DecoderRunner dr = new DecoderRunner();
135 
136         dr.socket = new DatagramSocket(6666);
137 
138         dr.start();
139 
140         Properties properties = new Properties();
141         properties.load(new FileInputStream("src/test/resources/test.properties"));
142 
143         Thread.sleep(100);
144 
145         InetAddress ad = InetAddress.getByName((String)properties.get("testIp"));
146 
147         byte index = 0;
148 
149         while (cssrcv >= 16) {
150 
151             Thread.sleep(300);
152 
153             lock = true;
154 
155             byte[] outmsg = Encoder.encode(new Protocolv20Encoder(),
156                     new GetChannelCipherSuites(TypeConverter.intToByte(0xE),
157                             index), 0, 0,0);
158 
159             ++index;
160             DatagramPacket packet = new DatagramPacket(outmsg, outmsg.length,
161                     ad, 0x26F);
162 
163             dr.socket.send(packet);
164 
165             while (lock) {
166                 Thread.sleep(1);
167             }
168         }
169 
170         List<CipherSuite> csl = CipherSuite.getCipherSuites(cssrec);
171 
172         for (CipherSuite c : csl) {
173             try {
174                 logger.info(c.getId() + ": "
175                         + c.getAuthenticationAlgorithm().getCode() + " "
176                         + c.getIntegrityAlgorithm().getCode() + " "
177                         + c.getConfidentialityAlgorithm().getCode());
178             } catch (Exception e) {
179                 logger.error(e.getMessage(), e);
180             }
181         }
182 
183         cs = csl.get(2);
184 
185         Thread.sleep(300);
186 
187         byte[] outmsg = Encoder
188                 .encode(new Protocolv15Encoder(),
189                         new GetChannelAuthenticationCapabilities(IpmiVersion.V15,
190                                 IpmiVersion.V20, cs, PrivilegeLevel.User,
191                                 TypeConverter.intToByte(14)), 0, 0, 0);
192 
193         DatagramPacket packet = new DatagramPacket(outmsg, outmsg.length, ad,
194                 0x26F);
195 
196         dr.socket.send(packet);
197 
198         Thread.sleep(150);
199 
200         outmsg = Encoder.encode(new Protocolv20Encoder(), new OpenSession(44,
201                 PrivilegeLevel.MaximumAvailable, cs), 0, 0, 0);
202 
203         packet = new DatagramPacket(outmsg, outmsg.length, ad, 0x26F);
204 
205         dr.socket.send(packet);
206 
207         Thread.sleep(300);
208 
209         while (lock) {
210             Thread.sleep(1);
211         }
212 
213         lock = true;
214 
215 
216         r1 = new Rakp1(managedSeqNum, PrivilegeLevel.User, (String)properties.get("username"), (String)properties.get("password"),
217                 null, cs);
218 
219         outmsg = Encoder.encode(new Protocolv20Encoder(), r1, 1, 1,0);
220 
221         packet = new DatagramPacket(outmsg, outmsg.length, ad, 0x26F);
222 
223         dr.socket.send(packet);
224 
225         Thread.sleep(150);
226 
227         while (lock) {
228             Thread.sleep(1);
229         }
230 
231         try {
232             cs.initializeAlgorithms(r1.calculateSik(r1rd));
233         } catch (NoSuchPaddingException e) {
234             logger.error(e.getMessage(), e);
235         }
236 
237         outmsg = Encoder.encode(new Protocolv20Encoder(), new Rakp3((byte) 0,
238                 managedSeqNum, cs, r1, r1rd), 1, 1, 0);
239 
240         packet = new DatagramPacket(outmsg, outmsg.length, ad, 0x26F);
241 
242         dr.socket.send(packet);
243 
244         Thread.sleep(150);
245 
246         outmsg = Encoder.encode(new Protocolv20Encoder(), new GetChassisStatus(
247                 IpmiVersion.V20, cs, AuthenticationType.RMCPPlus), 1, 1, r1
248                 .getManagedSystemSessionId());
249 
250         packet = new DatagramPacket(outmsg, outmsg.length, ad, 0x26F);
251 
252         dr.socket.send(packet);
253 
254         Thread.sleep(300);
255 
256         outmsg = Encoder.encode(new Protocolv20Encoder(),
257                 new GetSdrRepositoryInfo(IpmiVersion.V20, cs,
258                         AuthenticationType.RMCPPlus), 2, 2, r1
259                         .getManagedSystemSessionId());
260 
261         packet = new DatagramPacket(outmsg, outmsg.length, ad, 0x26F);
262 
263         dr.socket.send(packet);
264         Thread.sleep(300);
265 
266         outmsg = Encoder.encode(new Protocolv20Encoder(),
267                 new ReserveSdrRepository(IpmiVersion.V20, cs,
268                         AuthenticationType.RMCPPlus), 3, 3, r1
269                         .getManagedSystemSessionId());
270 
271         packet = new DatagramPacket(outmsg, outmsg.length, ad, 0x26F);
272 
273         dr.socket.send(packet);
274 
275         int seq = 4;
276 
277         lock = true;
278 
279         while (lock) {
280             Thread.sleep(1);
281         }
282 
283         while (nextRecId < 65535) {
284 
285             Thread.sleep(200);
286 
287             logger.info(">>Sending request for record " + nextRecId);
288 
289             int sequence = seq++;
290 
291             outmsg = Encoder.encode(new Protocolv20Encoder(), new GetSdr(
292                     IpmiVersion.V20, cs, AuthenticationType.RMCPPlus,
293                     reservation, nextRecId), sequence, sequence, r1
294                     .getManagedSystemSessionId());
295 
296             packet = new DatagramPacket(outmsg, outmsg.length, ad, 0x26F);
297 
298             dr.socket.send(packet);
299             lock = true;
300 
301             while (lock) {
302                 Thread.sleep(1);
303             }
304 
305             if (nextRecId > 0) {
306                 logger.info(">>Sending request for reading " + nextRecId);
307 
308                 sequence = seq++;
309 
310                 outmsg = Encoder.encode(new Protocolv20Encoder(),
311                         new GetSensorReading(IpmiVersion.V20, cs,
312                                 AuthenticationType.RMCPPlus, nextRecId), sequence, sequence,
313                         r1.getManagedSystemSessionId());
314 
315                 packet = new DatagramPacket(outmsg, outmsg.length, ad, 0x26F);
316 
317                 dr.socket.send(packet);
318 
319                 lock = true;
320 
321                 while (lock && nextRecId < 65535) {
322                     Thread.sleep(1);
323                 }
324             }
325 
326         }
327 
328          nextRecId = 0;
329 
330         Thread.sleep(300);
331 
332         logger.info(">>Sending GetSelInfo");
333 
334         int sequence = seq++;
335 
336         outmsg = Encoder.encode(new Protocolv20Encoder(), new GetSelInfo(
337                 IpmiVersion.V20, cs, AuthenticationType.RMCPPlus), sequence, sequence, r1
338                 .getManagedSystemSessionId());
339 
340         packet = new DatagramPacket(outmsg, outmsg.length, ad, 0x26F);
341 
342         dr.socket.send(packet);
343 
344         Thread.sleep(300);
345 
346         logger.info(">>Sending Reserve SEL");
347 
348         sequence = seq++;
349 
350         outmsg = Encoder.encode(new Protocolv20Encoder(), new ReserveSel(
351                 IpmiVersion.V20, cs, AuthenticationType.RMCPPlus), sequence, sequence, r1
352                 .getManagedSystemSessionId());
353 
354         packet = new DatagramPacket(outmsg, outmsg.length, ad, 0x26F);
355 
356         dr.socket.send(packet);
357 
358         lock = true;
359 
360         while (lock) {
361             Thread.sleep(1);
362         }
363 
364         while (nextRecId < 65535) {
365 
366             Thread.sleep(200);
367 
368             logger.info(">>Sending request for SEL record " + nextRecId);
369 
370             sequence = seq++;
371 
372             outmsg = Encoder.encode(new Protocolv20Encoder(), new GetSelEntry(
373                     IpmiVersion.V20, cs, AuthenticationType.RMCPPlus,
374                     reservation, nextRecId), sequence, sequence, r1
375                     .getManagedSystemSessionId());
376 
377             packet = new DatagramPacket(outmsg, outmsg.length, ad, 0x26F);
378 
379             dr.socket.send(packet);
380             lock = true;
381 
382             while (lock) {
383                 Thread.sleep(1);
384             }
385         }
386 
387         Thread.sleep(300);
388 
389         logger.info(">>Sending GetFruInventoryAreaInfo");
390 
391         sequence = seq++;
392 
393         outmsg = Encoder.encode(new Protocolv20Encoder(),
394                 new GetFruInventoryAreaInfo(IpmiVersion.V20, cs,
395                         AuthenticationType.RMCPPlus, fruId), sequence, sequence, r1
396                         .getManagedSystemSessionId());
397 
398         packet = new DatagramPacket(outmsg, outmsg.length, ad, 0x26F);
399 
400         dr.socket.send(packet);
401 
402         for(int i = 0; i < fruSize; i += 100) {
403 
404 
405             Thread.sleep(300);
406 
407             logger.info(">>Sending ReadFruData");
408 
409             int cnt = 100;
410             if(i + cnt > fruSize) {
411                 cnt = fruSize % 100;
412             }
413 
414             sequence = seq++;
415 
416             outmsg = Encoder.encode(new Protocolv20Encoder(),
417                     new ReadFruData(IpmiVersion.V20, cs,
418                             AuthenticationType.RMCPPlus, fruId, BaseUnit.Bytes, i, cnt), sequence, sequence, r1
419                             .getManagedSystemSessionId());
420 
421             packet = new DatagramPacket(outmsg, outmsg.length, ad, 0x26F);
422 
423             dr.socket.send(packet);
424 
425         }
426 
427         Thread.sleep(300);
428 
429         sequence = seq + 1;
430 
431         outmsg = Encoder.encode(
432                 new Protocolv20Encoder(),
433                 new CloseSession(IpmiVersion.V20, cs,
434                         AuthenticationType.RMCPPlus, r1
435                                 .getManagedSystemSessionId()), sequence, sequence, r1
436                         .getManagedSystemSessionId());
437 
438         packet = new DatagramPacket(outmsg, outmsg.length, ad, 0x26F);
439 
440         dr.socket.send(packet);
441 
442         Thread.sleep(1000);
443 
444         dr.socket.close();
445 
446     }
447 
448     @Override
449     public void run() {
450 
451         super.run();
452 
453         cssrec = new byte[0];
454 
455         byte[] buffer = null;
456 
457         while (cssrcv >= 16) {
458             DatagramPacket resp = new DatagramPacket(new byte[256], 256);
459 
460             try {
461                 socket.receive(resp);
462                 buffer = new byte[resp.getLength()];
463                 System.arraycopy(resp.getData(), 0, buffer, 0, buffer.length);
464             } catch (IOException e) {
465                 logger.error(e.getMessage(), e);
466             }
467 
468             GetChannelCipherSuitesResponseData data = null;
469 
470             try {
471                 data = (GetChannelCipherSuitesResponseData) Decoder.decode(
472                         buffer, new Protocolv20Decoder(CipherSuite.getEmpty()),
473                         new GetChannelCipherSuites());
474             } catch (Exception e) {
475                 logger.error(e.getMessage(), e);
476             }
477 
478             if (data != null && data.getCipherSuiteData() != null) {
479                 cssrcv = data.getCipherSuiteData().length;
480 
481                 logger.info("{}", data.getCipherSuiteData().length);
482 
483                 byte[] temp = new byte[cssrec.length + cssrcv];
484 
485                 System.arraycopy(cssrec, 0, temp, 0, cssrec.length);
486                 System.arraycopy(data.getCipherSuiteData(), 0, temp,
487                         cssrec.length, cssrcv);
488                 cssrec = temp;
489 
490             } else {
491                 cssrcv = 0;
492                 logger.info("{}", 0);
493             }
494 
495             lock = false;
496         }
497 
498         DatagramPacket resp = new DatagramPacket(new byte[256], 256);
499 
500         try {
501             socket.receive(resp);
502             buffer = new byte[resp.getLength()];
503             System.arraycopy(resp.getData(), 0, buffer, 0, buffer.length);
504         } catch (IOException e) {
505             logger.error(e.getMessage(), e);
506         }
507 
508         GetChannelAuthenticationCapabilitiesResponseData data = null;
509 
510         try {
511             data = (GetChannelAuthenticationCapabilitiesResponseData) Decoder
512                     .decode(buffer, new Protocolv15Decoder(),
513                             new GetChannelAuthenticationCapabilities(
514                                     IpmiVersion.V15, IpmiVersion.V20, cs));
515         } catch (Exception e) {
516             logger.error(e.getMessage(), e);
517         }
518 
519         logger.info("---------------------------------------------");
520 
521         logger.info("{}", data.getChannelNumber());
522         logger.info("{}", data.isIpmiv20Support());
523         logger.info("{}", data.getAuthenticationTypes().toString());
524         logger.info("{}", data.isKgEnabled());
525         logger.info("{}", data.isPerMessageAuthenticationEnabled());
526         logger.info("{}", data.isUserLevelAuthenticationEnabled());
527         logger.info("{}", data.isNonNullUsernamesEnabled());
528         logger.info("{}", data.isNullUsernamesEnabled());
529         logger.info("{}", data.isAnonymusLoginEnabled());
530         logger.info("{}", data.getOemId());
531         logger.info("{}", data.getOemData());
532 
533         logger.info("##############################################");
534 
535         resp = new DatagramPacket(new byte[256], 256);
536 
537         try {
538             socket.receive(resp);
539             buffer = new byte[resp.getLength()];
540             System.arraycopy(resp.getData(), 0, buffer, 0, buffer.length);
541             logger.info(">>>> " + resp.getLength());
542         } catch (IOException e) {
543             logger.error(e.getMessage(), e);
544         }
545 
546         OpenSessionResponseData data2 = null;
547 
548         try {
549             data2 = (OpenSessionResponseData) Decoder.decode(buffer,
550                     new PlainCommandv20Decoder(CipherSuite.getEmpty()),
551                     new OpenSession(CipherSuite.getEmpty()));
552         } catch (Exception e) {
553             logger.error(e.getMessage(), e);
554         }
555 
556         logger.info("{}", data2.getMessageTag());
557         logger.info("{}", data2.getStatusCode());
558         logger.info("{}", data2.getPrivilegeLevel());
559         logger.info("{}", data2.getRemoteConsoleSessionId());
560         logger.info("{}", data2.getManagedSystemSessionId());
561         logger.info("{}", data2.getAuthenticationAlgorithm());
562         logger.info("{}", data2.getConfidentialityAlgorithm());
563         logger.info("{}", data2.getIntegrityAlgorithm());
564 
565         managedSeqNum = data2.getManagedSystemSessionId();
566         lock = false;
567 
568         logger.info("---------------------------------------------");
569 
570         resp = new DatagramPacket(new byte[256], 256);
571 
572         try {
573             socket.receive(resp);
574             buffer = new byte[resp.getLength()];
575             System.arraycopy(resp.getData(), 0, buffer, 0, buffer.length);
576         } catch (IOException e) {
577             logger.error(e.getMessage(), e);
578         }
579 
580         Rakp1ResponseData data3 = null;
581 
582         try {
583             data3 = (Rakp1ResponseData) Decoder.decode(buffer,
584                     new PlainCommandv20Decoder(CipherSuite.getEmpty()), r1);
585         } catch (Exception e) {
586             logger.error(e.getMessage(), e);
587         }
588 
589         r1rd = data3;
590 
591         logger.info("{}", data3.getMessageTag());
592         logger.info("{}", data3.getStatusCode());
593         logger.info("{}", data3.getRemoteConsoleSessionId());
594         logger.info("{}", data3.getManagedSystemGuid());
595 
596         logger.info("---------------------------------------------");
597         lock = false;
598 
599         resp = new DatagramPacket(new byte[256], 256);
600 
601         try {
602             socket.receive(resp);
603             buffer = new byte[resp.getLength()];
604             System.arraycopy(resp.getData(), 0, buffer, 0, buffer.length);
605         } catch (IOException e) {
606             logger.error(e.getMessage(), e);
607         }
608 
609         Rakp3ResponseData data4 = null;
610 
611         try {
612             data4 = (Rakp3ResponseData) Decoder.decode(buffer,
613                     new PlainCommandv20Decoder(CipherSuite.getEmpty()),
614                     new Rakp3(cs, r1, r1rd));
615         } catch (Exception e) {
616             logger.error(e.getMessage(), e);
617         }
618 
619         logger.info("{}", data4.getMessageTag());
620         logger.info("{}", data4.getStatusCode());
621         logger.info("{}", data4.getConsoleSessionId());
622 
623         logger.info("---------------------------------------------");
624 
625         resp = new DatagramPacket(new byte[256], 256);
626 
627         try {
628             socket.receive(resp);
629             buffer = new byte[resp.getLength()];
630             System.arraycopy(resp.getData(), 0, buffer, 0, buffer.length);
631         } catch (IOException e) {
632             logger.error(e.getMessage(), e);
633         }
634 
635         GetChassisStatusResponseData data5 = null;
636 
637         try {
638             data5 = (GetChassisStatusResponseData) Decoder.decode(buffer,
639                     new Protocolv20Decoder(cs), new GetChassisStatus(
640                             IpmiVersion.V20, cs, AuthenticationType.RMCPPlus));
641         } catch (Exception e) {
642             logger.error(e.getMessage(), e);
643         }
644 
645         logger.info("{}", data5.getPowerRestorePolicy());
646         logger.info("{}", data5.isPowerControlFault());
647         logger.info("{}", data5.isPowerFault());
648         logger.info("{}", data5.isInterlock());
649         logger.info("{}", data5.isPowerOverload());
650         logger.info("{}", data5.isPowerOn());
651 
652         logger.info("________");
653 
654         logger.info("{}", data5.wasIpmiPowerOn());
655         logger.info("{}", data5.wasPowerFault());
656         logger.info("{}", data5.wasInterlock());
657         logger.info("{}", data5.wasPowerOverload());
658 
659         logger.info("________");
660 
661         logger.info("{}", data5.isChassisIdentifyCommandSupported());
662         if (data5.isChassisIdentifyCommandSupported()) {
663             logger.info("{}", data5.getChassisIdentifyState());
664         }
665         logger.info("{}", data5.coolingFaultDetected());
666         logger.info("{}", data5.driveFaultDetected());
667         logger.info("{}", data5.isFrontPanelLockoutActive());
668         logger.info("{}", data5.isChassisIntrusionActive());
669 
670         logger.info("________");
671 
672         logger.info("{}", data5.isFrontPanelButtonCapabilitiesSet());
673 
674         if (data5.isFrontPanelButtonCapabilitiesSet()) {
675             try {
676                 logger.info("{}", data5.isStandbyButtonDisableAllowed());
677                 logger.info("{}", data5
678                         .isDiagnosticInterruptButtonDisableAllowed());
679                 logger.info("{}", data5.isResetButtonDisableAllowed());
680                 logger.info("{}", data5.isPowerOffButtonDisableAllowed());
681                 logger.info("{}", data5.isStandbyButtonDisabled());
682                 logger.info("{}", data5.isDiagnosticInterruptButtonDisabled());
683                 logger.info("{}", data5.isResetButtonDisabled());
684                 logger.info("{}", data5.isPowerOffButtonDisabled());
685             } catch (IllegalAccessException e) {
686                 logger.error(e.getMessage(), e);
687             }
688 
689         }
690 
691         logger.info("---------------------------------------------");
692 
693         resp = new DatagramPacket(new byte[256], 256);
694 
695         try {
696             socket.receive(resp);
697             buffer = new byte[resp.getLength()];
698             System.arraycopy(resp.getData(), 0, buffer, 0, buffer.length);
699         } catch (IOException e) {
700             logger.error(e.getMessage(), e);
701         }
702 
703         GetSdrRepositoryInfoResponseData data6 = null;
704 
705         try {
706             data6 = (GetSdrRepositoryInfoResponseData) Decoder.decode(buffer,
707                     new Protocolv20Decoder(cs), new GetSdrRepositoryInfo(
708                             IpmiVersion.V20, cs, AuthenticationType.RMCPPlus));
709         } catch (Exception e) {
710             logger.error(e.getMessage(), e);
711         }
712 
713         logger.info("{}", data6.getSdrVersion());
714         logger.info("{}", data6.getRecordCount());
715         logger.info("{}", data6.getAddTimestamp());
716         logger.info("{}", data6.getDelTimestamp());
717         logger.info("{}", data6.isReserveSupported());
718 
719         logger.info("---------------------------------------------");
720 
721         resp = new DatagramPacket(new byte[256], 256);
722 
723         try {
724             socket.receive(resp);
725             buffer = new byte[resp.getLength()];
726             System.arraycopy(resp.getData(), 0, buffer, 0, buffer.length);
727         } catch (IOException e) {
728             logger.error(e.getMessage(), e);
729         }
730 
731         ReserveSdrRepositoryResponseData data7 = null;
732 
733         try {
734             data7 = (ReserveSdrRepositoryResponseData) Decoder.decode(buffer,
735                     new Protocolv20Decoder(cs), new ReserveSdrRepository(
736                             IpmiVersion.V20, cs, AuthenticationType.RMCPPlus));
737         } catch (Exception e) {
738             logger.error(e.getMessage(), e);
739         }
740 
741         logger.info("{}", data7.getReservationId());
742 
743         reservation = data7.getReservationId();
744 
745         logger.info("<<Received ReserveSdrRepo response");
746 
747         lock = false;
748 
749         logger.info("---------------------------------------------");
750 
751         while (nextRecId < 65535) {
752 
753             resp = new DatagramPacket(new byte[256], 256);
754 
755             try {
756                 socket.receive(resp);
757                 buffer = new byte[resp.getLength()];
758                 System.arraycopy(resp.getData(), 0, buffer, 0, buffer.length);
759             } catch (IOException e) {
760                 logger.error(e.getMessage(), e);
761             }
762             GetSdrResponseData data8 = null;
763 
764             try {
765                 data8 = (GetSdrResponseData) Decoder.decode(buffer,
766                         new Protocolv20Decoder(cs), new GetSdr(IpmiVersion.V20,
767                                 cs, AuthenticationType.RMCPPlus, 0, 0));
768             } catch (Exception e) {
769                 logger.error(e.getMessage(), e);
770             }
771 
772             SensorRecord record = SensorRecord.populateSensorRecord(data8.getSensorRecordData());
773             logger.info(record.toString());
774 
775             if (record instanceof FullSensorRecord) {
776                 nextRecId = TypeConverter.byteToInt(((FullSensorRecord) record).getSensorNumber());
777             } else if (record instanceof CompactSensorRecord) {
778                 nextRecId = TypeConverter
779                         .byteToInt(((CompactSensorRecord) record).getSensorNumber());
780             } else {
781                 nextRecId = -1;
782             }
783 
784             logger.info("<<Reading Id " + nextRecId);
785 
786             if (record instanceof FullSensorRecord) {
787                 FullSensorRecord rec = (FullSensorRecord) record;
788                 logger.info("*" + rec.getName());
789                 logger.info("Reading type: " + rec.getEventReadingType());
790                 logger.info("Lower critical threshold: "
791                         + rec.getLowerCriticalThreshold());
792                 logger.info("Upper critical threshold: "
793                         + rec.getUpperCriticalThreshold());
794                 logger.info("Tolerance: +/- "
795                         + rec.getTolerance()
796                         + " "
797                         + rec.getSensorBaseUnit().toString()
798                         + (rec.getRateUnit() != RateUnit.None ? " per "
799                                 + rec.getRateUnit() : ""));
800                 logger.info("Resolution: "
801                         + rec.getSensorResolution()
802                         + " "
803                         + rec.getSensorBaseUnit().toString()
804                         + (rec.getRateUnit() != RateUnit.None ? " per "
805                                 + rec.getRateUnit() : ""));
806             }
807             if (record instanceof CompactSensorRecord) {
808                 CompactSensorRecord rec = (CompactSensorRecord) record;
809                 logger.info("*" + rec.getName());
810                 logger.info("Reading type: " + rec.getEventReadingType());
811                 logger.info("Sensor type: " + rec.getSensorType());
812             }
813             if (record instanceof FruDeviceLocatorRecord) {
814                 FruDeviceLocatorRecord rec = (FruDeviceLocatorRecord) record;
815                 logger.info(rec.getName());
816                 logger.info("{}", rec.getDeviceType());
817                 logger.info("FRU entity ID: " + rec.getFruEntityId());
818                 logger.info("FRU access address: " + rec.getDeviceAccessAddress());
819                 logger.info("FRU device ID: " + rec.getDeviceId());
820                 logger.info("FRU logical: " + rec.isLogical());
821             }
822 
823             lock = false;
824             if (nextRecId > 0) {
825                 resp = new DatagramPacket(new byte[256], 256);
826 
827                 try {
828                     socket.receive(resp);
829                     buffer = new byte[resp.getLength()];
830                     System.arraycopy(resp.getData(), 0, buffer, 0,
831                             buffer.length);
832                 } catch (IOException e) {
833                     logger.error(e.getMessage(), e);
834                 }
835                 GetSensorReadingResponseData data9 = null;
836 
837                 try {
838                     data9 = (GetSensorReadingResponseData) Decoder.decode(
839                             buffer, new Protocolv20Decoder(cs),
840                             new GetSensorReading(IpmiVersion.V20, cs, AuthenticationType.RMCPPlus, 0));
841 
842                     if (record instanceof FullSensorRecord) {
843                         FullSensorRecord rec = (FullSensorRecord) record;
844                         logger.info(data9.getSensorReading(rec)
845                                 + " "
846                                 + rec.getSensorBaseUnit().toString()
847                                 + (rec.getRateUnit() != RateUnit.None ? " per "
848                                         + rec.getRateUnit() : ""));
849                     }
850                     if (record instanceof CompactSensorRecord) {
851                         CompactSensorRecord rec = (CompactSensorRecord) record;
852                         List<ReadingType> events = data9.getStatesAsserted(
853                                 rec.getSensorType(), rec.getEventReadingType());
854                         StringBuilder s = new StringBuilder();
855                         for (int i = 0; i < events.size(); ++i) {
856                             s.append(events.get(i)).append(", ");
857                         }
858                         logger.info(s.toString());
859 
860                     }
861                 } catch (Exception e) {
862                     logger.error(e.getMessage(), e);
863                 }
864             }
865 
866             try {
867                 Thread.sleep(100);
868             } catch (InterruptedException e) {
869                 logger.error(e.getMessage(), e);
870             }
871 
872             nextRecId = data8.getNextRecordId();
873 
874             logger.info("---------------------------------------------");
875 
876             lock = false;
877         }
878 
879         resp = new DatagramPacket(new byte[256], 256);
880 
881         try {
882             socket.receive(resp);
883             buffer = new byte[resp.getLength()];
884             System.arraycopy(resp.getData(), 0, buffer, 0, buffer.length);
885         } catch (IOException e) {
886             logger.error(e.getMessage(), e);
887         }
888 
889         GetSelInfoResponseData data10 = null;
890 
891         try {
892             data10 = (GetSelInfoResponseData) Decoder.decode(buffer,
893                     new Protocolv20Decoder(cs), new GetSelInfo(IpmiVersion.V20,
894                             cs, AuthenticationType.RMCPPlus));
895         } catch (Exception e) {
896             logger.error(e.getMessage(), e);
897         }
898 
899         logger.info("{}", data10.getSelVersion());
900         logger.info("{}", data10.getEntriesCount());
901         logger.info(DateFormat.getInstance().format(
902                 data10.getAdditionTimestamp()));
903         logger.info(DateFormat.getInstance().format(
904                 data10.getEraseTimestamp()));
905 
906         logger.info("---------------------------------------------");
907 
908         resp = new DatagramPacket(new byte[256], 256);
909 
910         try {
911             socket.receive(resp);
912             buffer = new byte[resp.getLength()];
913             System.arraycopy(resp.getData(), 0, buffer, 0, buffer.length);
914         } catch (IOException e) {
915             logger.error(e.getMessage(), e);
916         }
917 
918         ReserveSelResponseData data11 = null;
919 
920         try {
921             data11 = (ReserveSelResponseData) Decoder.decode(buffer,
922                     new Protocolv20Decoder(cs), new ReserveSel(IpmiVersion.V20,
923                             cs, AuthenticationType.RMCPPlus));
924         } catch (Exception e) {
925             logger.error(e.getMessage(), e);
926         }
927 
928         logger.info("{}", data11.getReservationId());
929 
930         reservation = data11.getReservationId();
931         reservation = 0;
932 
933         lock = false;
934 
935         logger.info("---------------------------------------------");
936 
937         while (nextRecId < 65535) {
938 
939             resp = new DatagramPacket(new byte[256], 256);
940 
941             try {
942                 socket.receive(resp);
943                 buffer = new byte[resp.getLength()];
944                 System.arraycopy(resp.getData(), 0, buffer, 0, buffer.length);
945             } catch (IOException e) {
946                 logger.error(e.getMessage(), e);
947             }
948             GetSelEntryResponseData data12 = null;
949 
950             try {
951                 data12 = (GetSelEntryResponseData) Decoder.decode(buffer,
952                         new Protocolv20Decoder(cs), new GetSelEntry(
953                                 IpmiVersion.V20, cs, AuthenticationType.RMCPPlus, 0, 0));
954             } catch (Exception e) {
955                 logger.error(e.getMessage(), e);
956             }
957 
958             logger.info(data12.getSelRecord().toString());
959 
960             SelRecord rec = data12.getSelRecord();
961 
962             logger.info("Sensor: " + rec.getSensorType());
963             logger.info("{}", rec.getTimestamp());
964             logger.info("{}", rec.getEventDirection());
965             logger.info("{}", rec.getEvent());
966 
967             nextRecId = data12.getNextRecordId();
968 
969             lock = false;
970 
971             logger.info("---------------------------------------------");
972         }
973 
974         resp = new DatagramPacket(new byte[256], 256);
975 
976         try {
977             socket.receive(resp);
978             buffer = new byte[resp.getLength()];
979             System.arraycopy(resp.getData(), 0, buffer, 0, buffer.length);
980         } catch (IOException e) {
981             logger.error(e.getMessage(), e);
982         }
983 
984         GetFruInventoryAreaInfoResponseData data13 = null;
985 
986         try {
987             data13 = (GetFruInventoryAreaInfoResponseData) Decoder.decode(
988                     buffer, new Protocolv20Decoder(cs),
989                     new GetFruInventoryAreaInfo(IpmiVersion.V20, cs, AuthenticationType.RMCPPlus, 0));
990         } catch (Exception e) {
991             logger.error(e.getMessage(), e);
992         }
993 
994         logger.info("FRU inventory area size: "
995                 + data13.getFruInventoryAreaSize());
996 
997         logger.info("FRU Unit: " + data13.getFruUnit());
998 
999         logger.info("---------------------------------------------");
1000 
1001         List<ReadFruDataResponseData> rd = new ArrayList<ReadFruDataResponseData>();
1002 
1003         for(int i = 0; i < fruSize; i += 100) {
1004             resp = new DatagramPacket(new byte[256], 256);
1005 
1006             try {
1007                 socket.receive(resp);
1008                 buffer = new byte[resp.getLength()];
1009                 System.arraycopy(resp.getData(), 0, buffer, 0, buffer.length);
1010             } catch (IOException e) {
1011                 logger.error(e.getMessage(), e);
1012             }
1013 
1014             ReadFruDataResponseData data14 = null;
1015 
1016             try {
1017                 data14 = (ReadFruDataResponseData) Decoder.decode(buffer,
1018                         new Protocolv20Decoder(cs), new ReadFruData(IpmiVersion.V20,
1019                                 cs, AuthenticationType.RMCPPlus, 0, BaseUnit.Bytes, 0, 0));
1020             } catch (Exception e) {
1021                 logger.error(e.getMessage(), e);
1022             }
1023 
1024             rd.add(data14);
1025 
1026             logger.info("{}", data14.getFruData().length);
1027 
1028             logger.info("---------------------------------------------");
1029 
1030         }
1031 
1032             List<FruRecord> records = ReadFruData.decodeFruData(rd);
1033 
1034             for(FruRecord r : records) {
1035                 if(r instanceof ChassisInfo) {
1036                     ChassisInfo chassisInfo = (ChassisInfo) r;
1037                     logger.info("Chassis info:");
1038                     logger.info("Chassis type: " + chassisInfo.getChassisType());
1039                     logger.info("Chassis part number: " + chassisInfo.getChassisPartNumber());
1040                     logger.info("Chassis serial number: " + chassisInfo.getChassisSerialNumber());
1041                     for(String info : chassisInfo.getCustomChassisInfo()) {
1042                         logger.info("Custom chassis info: " + info);
1043                     }
1044                     logger.info("---------------------------------------------");
1045                 } else if(r instanceof BoardInfo) {
1046                     BoardInfo boardInfo = (BoardInfo) r;
1047                     logger.info("Board info:");
1048                     logger.info("Board MFG date: " + boardInfo.getMfgDate().toString());
1049                     logger.info("Board manufacturer: " + boardInfo.getBoardManufacturer());
1050                     logger.info("Board product name: " + boardInfo.getBoardProductName());
1051                     logger.info("Board part number: " + boardInfo.getBoardPartNumber());
1052                     logger.info("Board serial number: " + boardInfo.getBoardSerialNumber());
1053                     for(String info : boardInfo.getCustomBoardInfo()) {
1054                         logger.info("Custom board info: " + info);
1055                     }
1056                     logger.info("---------------------------------------------");
1057                 } else if(r instanceof ProductInfo) {
1058                     ProductInfo productInfo = (ProductInfo) r;
1059                     logger.info("Product info:");
1060                     logger.info("Product manufacturer: " + productInfo.getManufacturerName());
1061                     logger.info("Product product name: " + productInfo.getProductName());
1062                     logger.info("Product part number: " + productInfo.getProductModelNumber());
1063                     logger.info("Product version: " + productInfo.getProductVersion());
1064                     logger.info("Product serial number: " + productInfo.getProductSerialNumber());
1065                     logger.info("Product asset tag: " + productInfo.getAssetTag());
1066                     for(String info : productInfo.getCustomProductInfo()) {
1067                         logger.info("Custom board info: " + info);
1068                     }
1069                     logger.info("---------------------------------------------");
1070                 }
1071             }
1072     }
1073 }