{"id":1052,"date":"2014-10-12T02:49:29","date_gmt":"2014-10-12T02:49:29","guid":{"rendered":"https:\/\/trouble.org\/?p=1052"},"modified":"2014-10-12T23:13:32","modified_gmt":"2014-10-12T23:13:32","slug":"get-device-id-moar-ipmi-yawn","status":"publish","type":"post","link":"https:\/\/trouble.org\/?p=1052","title":{"rendered":"Get Device ID (moar IPMI&#8230; yawn&#8230;.)"},"content":{"rendered":"<p>I&#8217;d had this sitting around for awhile and thought I&#8217;d take another look at it; in this I simply toss out an IPMI\u00a0Get Device ID command and see what happens. This is an interesting one; the GUID is a Vendor Specific ID &#8211; the specification says that it&#8217;s &#8220;a unique number per device&#8221;, and that &#8220;a Device GUID should never change over the lifetime of the device&#8221;, which makes it a remarkable thing if true; IP addresses, even MAC addrs, are crummy\u00a0network IDs. Having a remote one would be a handy thing indeed for auditing, scanning, and the like.<\/p>\n<figure style=\"width: 256px\" class=\"wp-caption alignright\"><img decoding=\"async\" src=\"http:\/\/www.its.caltech.edu\/~atomic\/snowcrystals\/photos\/w031230a113.jpg\" alt=\"snowflakery\" width=\"256\" \/><figcaption class=\"wp-caption-text\">every flake is sacred<\/figcaption><\/figure>\n<p>Keeping in line with the spec in general, this does not require authentication, and is &#8220;highly recommended&#8221;, but not mandatory. I think some require auth despite spec, which is what I&#8217;d recommend vendors to do, it&#8217;s actually a bit of a nasty thing to have a system pigeonholed with a high veracity.<\/p>\n<p>The GUID is a weird one; it&#8217;s mostly taken from RFC 4122, and can mean various things (look in the comments below for more on this if you&#8217;re really interested.) Sometimes it&#8217;s immediately and obviously interesting; for instance, you might see something like this from a BMC:<\/p>\n<p>44454c4c-4b00-1046-8035-c6c04f574c31<\/p>\n<p>The first 4 hex pairs, if decoded, spell out &#8220;DELL&#8221;, which presumably has something to do with the manufacturer :)<\/p>\n<p>Others might use the <a href=\"http:\/\/www.iana.org\/assignments\/enterprise-numbers\/enterprise-numbers\">IANA manufacturing<\/a> #&#8217;s, but I haven&#8217;t delved deeply into analyzing all this.<\/p>\n<p>A quick survey of a couple hundred thousand BMCs on the internet showed that about 90% (186291\/207833, or 89.6%) seem to indicate a GUID, although at times its garbage, like all 0&#8217;s or F&#8217;s.<\/p>\n<p>p.s.Good job for you in the 19\/8 block, you know who you are!<\/p>\n<div class=\"codecolorer-container python blackboard\" style=\"overflow:auto;white-space:nowrap;height:800px;\"><div class=\"python codecolorer\"><span class=\"co1\">#!\/usr\/bin\/env python<\/span><br \/>\n<br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># Do a Get Device ID (see p250 of the IPMI v 2 spec) on a host<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># Usage: $0 ip-address<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># Outputs the target and the GUID in one long string as well as broken<\/span><br \/>\n<span class=\"co1\"># up (tab sep'd); something that looks like:<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># 10.0.0.1 373030314d530025903eeba000000000 37303031-4d53-0025-903e-eba000000000<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># (Usually I'd simply emit the GUID, but I was lazy and this made it<\/span><br \/>\n<span class=\"co1\"># easier when scripting, just change the print at the bottom if you<\/span><br \/>\n<span class=\"co1\"># want to change it.)<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># RFC 4122 specifies four different versions of UUID formats and<\/span><br \/>\n<span class=\"co1\"># generation algorightms suitable for use for a Device GUID in<\/span><br \/>\n<span class=\"co1\"># IPMI. These are version 1 (0001b) &quot;time based&quot; - and three<\/span><br \/>\n<span class=\"co1\"># &quot;name-based&quot; versions: version 3 (0011b) &quot;MD5 hash&quot;, version 4<\/span><br \/>\n<span class=\"co1\"># (0100b) &quot;Pseudo-random&quot;, and version 5 &quot;SHA1 hash&quot;. The version 1<\/span><br \/>\n<span class=\"co1\"># format is recommended. However, versions 3, 4, or 5 formats are<\/span><br \/>\n<span class=\"co1\"># also allowed.<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># Supposedly this is something like this - which illustrates the<\/span><br \/>\n<span class=\"co1\"># time-based version... they aren't grouped like that in ipmiutil,<\/span><br \/>\n<span class=\"co1\"># but who knows, really.<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># Table 20-10, GUID Format<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># GUID byte Field MSbyte<\/span><br \/>\n<span class=\"co1\"># 1 node<\/span><br \/>\n<span class=\"co1\"># 2 node<\/span><br \/>\n<span class=\"co1\"># 3 node<\/span><br \/>\n<span class=\"co1\"># 4 node<\/span><br \/>\n<span class=\"co1\"># 5 node<\/span><br \/>\n<span class=\"co1\"># 6 node MSbyte<\/span><br \/>\n<span class=\"co1\"># 7 clock seq and reserved<\/span><br \/>\n<span class=\"co1\"># 8 clock seq and reserved MSbyte<\/span><br \/>\n<span class=\"co1\"># 9 time high and version<\/span><br \/>\n<span class=\"co1\"># 10 time high and version MSbyte<\/span><br \/>\n<span class=\"co1\"># 11 time mid<\/span><br \/>\n<span class=\"co1\"># 12 time mid MSbyte<\/span><br \/>\n<span class=\"co1\"># 13 time low<\/span><br \/>\n<span class=\"co1\"># 14 time low<\/span><br \/>\n<span class=\"co1\"># 15 time low<\/span><br \/>\n<span class=\"co1\"># 16 time low MSbyte<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># The RFC shows it as:<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># 0 1 2 3<\/span><br \/>\n<span class=\"co1\"># 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1<\/span><br \/>\n<span class=\"co1\"># +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<\/span><br \/>\n<span class=\"co1\"># | time_low |<\/span><br \/>\n<span class=\"co1\"># +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<\/span><br \/>\n<span class=\"co1\"># | time_mid | time_hi_and_version |<\/span><br \/>\n<span class=\"co1\"># +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<\/span><br \/>\n<span class=\"co1\"># |clk_seq_hi_res | clk_seq_low | node (0-1) |<\/span><br \/>\n<span class=\"co1\"># +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<\/span><br \/>\n<span class=\"co1\"># | node (2-5) |<\/span><br \/>\n<span class=\"co1\"># +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># Name-based ones can be, among other things, derived from X500,<\/span><br \/>\n<span class=\"co1\"># ISO OIDs, URLs, or FQDNs (appendix C in RFC 4122.)<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># Anyway, back to the fun.<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># This DOES NOT USE AUTHENTICATION. This is as per spec; the command is<\/span><br \/>\n<span class=\"co1\"># &quot;highly recommended&quot;, but not mandatory. I think some require auth<\/span><br \/>\n<span class=\"co1\"># despite spec, which is what I'd recommend vendors use :)<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># The GUID is a Vendor Specific ID - &quot;A unique number per device&quot;.<\/span><br \/>\n<span class=\"co1\"># &quot;A Device GUID should never change over the lifetime of the device&quot;,<\/span><br \/>\n<span class=\"co1\"># which makes it a remarkable thing if true; IP addresses, even MAC addrs,<\/span><br \/>\n<span class=\"co1\"># are crappy network IDs.<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># This script simply sends request, tears up response, does a little sanity<\/span><br \/>\n<span class=\"co1\"># checking, prints out some stuff. Comments are often quotes from<\/span><br \/>\n<span class=\"co1\"># the IPMI 2.0 spec. The output steals the format from ipmiutil...<\/span><br \/>\n<span class=\"co1\"># no idea why some bytes are reversed and others aren't, even after<\/span><br \/>\n<span class=\"co1\"># studying spec. Par for the course.<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<br \/>\n<span class=\"kw1\">import<\/span> <span class=\"kw3\">sys<\/span><br \/>\n<span class=\"kw1\">from<\/span> <span class=\"kw3\">socket<\/span> <span class=\"kw1\">import<\/span> *<br \/>\n<br \/>\n<span class=\"kw1\">try<\/span>:<br \/>\ntarget <span class=\"sy0\">=<\/span> <span class=\"kw3\">sys<\/span>.<span class=\"me1\">argv<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"kw1\">except<\/span>:<br \/>\n<span class=\"kw1\">print<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;usage: %s target&quot;<\/span> % <span class=\"kw3\">sys<\/span>.<span class=\"me1\">argv<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><br \/>\nexit<span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<span class=\"co1\"># in seconds<\/span><br \/>\ntimeout <span class=\"sy0\">=<\/span> <span class=\"nu0\">10<\/span><br \/>\ntimeout <span class=\"sy0\">=<\/span> <span class=\"nu0\">5<\/span><br \/>\n<span class=\"co1\"># udp<\/span><br \/>\nPORT <span class=\"sy0\">=<\/span> <span class=\"nu0\">623<\/span><br \/>\n<br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># parts of the packet below<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<br \/>\n<span class=\"co1\"># RMCP class IPMI<\/span><br \/>\nrmcp_class <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;<span class=\"es0\">\\x<\/span>06<span class=\"es0\">\\x<\/span>00<span class=\"es0\">\\x<\/span>ff<span class=\"es0\">\\x<\/span>07&quot;<\/span><br \/>\nauth_type <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;<span class=\"es0\">\\x<\/span>00&quot;<\/span><br \/>\nsession_num <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;<span class=\"es0\">\\x<\/span>00<span class=\"es0\">\\x<\/span>00<span class=\"es0\">\\x<\/span>00<span class=\"es0\">\\x<\/span>00&quot;<\/span><br \/>\nsession_id <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;<span class=\"es0\">\\x<\/span>00<span class=\"es0\">\\x<\/span>00<span class=\"es0\">\\x<\/span>00<span class=\"es0\">\\x<\/span>00&quot;<\/span><br \/>\n<br \/>\nmessage_len <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;<span class=\"es0\">\\x<\/span>07&quot;<\/span> <span class=\"co1\"># bytes of stuff below<\/span><br \/>\n<br \/>\ntarget_addr <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;<span class=\"es0\">\\x<\/span>20&quot;<\/span><br \/>\nlun_netfn <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;<span class=\"es0\">\\x<\/span>18&quot;<\/span> <span class=\"co1\"># LUN &amp; NetFn<\/span><br \/>\nheader_chksm <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;<span class=\"es0\">\\x<\/span>c8&quot;<\/span><br \/>\nsource_addr <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;<span class=\"es0\">\\x<\/span>81&quot;<\/span><br \/>\nsource_lun <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;<span class=\"es0\">\\x<\/span>00&quot;<\/span><br \/>\n<br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># 08h = get device guid - works unauth'd on SM!<\/span><br \/>\n<span class=\"co1\"># 37h = get system guid<\/span><br \/>\n<span class=\"co1\"># 25h = get watchdog timer - works on HP ilo2<\/span><br \/>\n<span class=\"co1\"># 0ah = get command support<\/span><br \/>\n<span class=\"co1\"># 2fh = get BMC global enables<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\nipmi_cmd <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;<span class=\"es0\">\\x<\/span>37&quot;<\/span><br \/>\n<br \/>\n<span class=\"co1\"># checksum fu swiped from jarrod\/xcat - http:\/\/sourceforge.net\/p\/xcat\/code\/HEAD\/tree\/xcat-core\/trunk\/xCAT-server\/lib\/perl\/xCAT\/IPMI.pm<\/span><br \/>\n<span class=\"kw2\">sum<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">for<\/span> byte <span class=\"kw1\">in<\/span> target_addr + lun_netfn + header_chksm + source_addr + source_lun + ipmi_cmd:<br \/>\n<span class=\"kw2\">sum<\/span> +<span class=\"sy0\">=<\/span> <span class=\"kw2\">ord<\/span><span class=\"br0\">&#40;<\/span>byte<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"kw2\">sum<\/span> <span class=\"sy0\">=<\/span> <span class=\"sy0\">~<\/span><span class=\"kw2\">sum<\/span> + <span class=\"nu0\">1<\/span><br \/>\nchecksum <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;%s&quot;<\/span> % <span class=\"kw2\">chr<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw2\">sum<\/span> &amp; <span class=\"nu0\">0xff<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<span class=\"co1\"># IPMI v1.5 session wrapper<\/span><br \/>\npayload <span class=\"sy0\">=<\/span> rmcp_class + auth_type + session_num + session_id + message_len + \\<br \/>\ntarget_addr + lun_netfn + header_chksm + source_addr + source_lun + \\<br \/>\nipmi_cmd + checksum<br \/>\n<br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># create socket &amp; bind to local port<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<br \/>\nudp <span class=\"sy0\">=<\/span> <span class=\"kw3\">socket<\/span><span class=\"br0\">&#40;<\/span>AF_INET<span class=\"sy0\">,<\/span> SOCK_DGRAM<span class=\"br0\">&#41;<\/span><br \/>\nsake <span class=\"sy0\">=<\/span> udp.<span class=\"me1\">getsockname<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\nudp.<span class=\"me1\">bind<\/span><span class=\"br0\">&#40;<\/span>sake<span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># swap pairs of hex digits<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"kw1\">def<\/span> swap<span class=\"br0\">&#40;<\/span>s<span class=\"br0\">&#41;<\/span>:<br \/>\n<span class=\"co1\"># print('\\tbefore ' + s)<\/span><br \/>\ns <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;&quot;<\/span>.<span class=\"me1\">join<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw2\">reversed<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#91;<\/span>s<span class=\"br0\">&#91;<\/span>i:i+<span class=\"nu0\">2<\/span><span class=\"br0\">&#93;<\/span> <span class=\"kw1\">for<\/span> i <span class=\"kw1\">in<\/span> <span class=\"kw2\">range<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> <span class=\"kw2\">len<\/span><span class=\"br0\">&#40;<\/span>s<span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">2<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"co1\"># print('\\tafter ' + s)<\/span><br \/>\n<span class=\"kw1\">return<\/span><span class=\"br0\">&#40;<\/span>s<span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># send packet... or die trying<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"kw1\">try<\/span>:<br \/>\nudp.<span class=\"me1\">settimeout<\/span><span class=\"br0\">&#40;<\/span>timeout<span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<span class=\"co1\"># if udp.sendto(&quot; &quot;, (target, PORT)) &lt;= 0:<\/span><br \/>\n<span class=\"kw1\">if<\/span> udp.<span class=\"me1\">sendto<\/span><span class=\"br0\">&#40;<\/span>payload<span class=\"sy0\">,<\/span> <span class=\"br0\">&#40;<\/span>target<span class=\"sy0\">,<\/span> PORT<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&lt;=<\/span> <span class=\"nu0\">0<\/span>:<br \/>\n<span class=\"kw1\">print<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;couldn't send packet to %s&quot;<\/span> % target<span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<span class=\"co1\"># catch response<\/span><br \/>\ndata<span class=\"sy0\">,<\/span>addr <span class=\"sy0\">=<\/span> udp.<span class=\"me1\">recvfrom<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">512<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<span class=\"co1\"># print(data)<\/span><br \/>\n<br \/>\n<span class=\"co1\"># skip the header<\/span><br \/>\ndata <span class=\"sy0\">=<\/span> data<span class=\"br0\">&#91;<\/span><span class=\"nu0\">21<\/span>:-<span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><br \/>\n<br \/>\nguid <span class=\"sy0\">=<\/span> data.<span class=\"me1\">encode<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'hex'<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># in &quot;Wired for Management Baseline&quot;, they say:<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># Field Data Type Octet # Note<\/span><br \/>\n<span class=\"co1\"># ------ ---------- -------- -----<\/span><br \/>\n<span class=\"co1\"># time_low unsigned 32 bit integer 0-3 The low field of the timestamp.<\/span><br \/>\n<span class=\"co1\"># time_mid unsigned 16 bit integer 4-5 The middle field of the timestamp.<\/span><br \/>\n<span class=\"co1\"># time_hi_and_version unsigned 16 bit integer 6-7 The high field of the timestamp multiplexed with the version number.<\/span><br \/>\n<span class=\"co1\"># clock_seq_hi_and_reserved unsigned 8 bit integer 8 The high field of the clock sequence multiplexed with the variant.<\/span><br \/>\n<span class=\"co1\"># clock_seq_low unsigned 8 bit integer 9 The low field of the clock sequence.<\/span><br \/>\n<span class=\"co1\"># node unsigned 48 bit integer 10-15 The spatially unique node identifier.<\/span><br \/>\n<br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># IPMI reverses some of these... sure, why not... that makes sense<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<br \/>\n<span class=\"co1\"># print('len of data to work with: %s\\n' % len(data))<\/span><br \/>\n<br \/>\n<span class=\"co1\"># node = swap(data[0:4].encode('hex'))<\/span><br \/>\n<br \/>\nnode <span class=\"sy0\">=<\/span> data<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span>:<span class=\"nu0\">4<\/span><span class=\"br0\">&#93;<\/span>.<span class=\"me1\">encode<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'hex'<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<span class=\"co1\"># print('nodey ' + node)<\/span><br \/>\n<br \/>\nclock_seq <span class=\"sy0\">=<\/span> swap<span class=\"br0\">&#40;<\/span>data<span class=\"br0\">&#91;<\/span><span class=\"nu0\">4<\/span>:<span class=\"nu0\">5<\/span><span class=\"br0\">&#93;<\/span>.<span class=\"me1\">encode<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'hex'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\nreserved <span class=\"sy0\">=<\/span> swap<span class=\"br0\">&#40;<\/span>data<span class=\"br0\">&#91;<\/span><span class=\"nu0\">5<\/span>:<span class=\"nu0\">6<\/span><span class=\"br0\">&#93;<\/span>.<span class=\"me1\">encode<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'hex'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\ntime_hi <span class=\"sy0\">=<\/span> swap<span class=\"br0\">&#40;<\/span>data<span class=\"br0\">&#91;<\/span><span class=\"nu0\">6<\/span>:<span class=\"nu0\">7<\/span><span class=\"br0\">&#93;<\/span>.<span class=\"me1\">encode<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'hex'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\nversion <span class=\"sy0\">=<\/span> swap<span class=\"br0\">&#40;<\/span>data<span class=\"br0\">&#91;<\/span><span class=\"nu0\">7<\/span>:<span class=\"nu0\">8<\/span><span class=\"br0\">&#93;<\/span>.<span class=\"me1\">encode<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'hex'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\ntime_mid <span class=\"sy0\">=<\/span> data<span class=\"br0\">&#91;<\/span><span class=\"nu0\">8<\/span>:<span class=\"nu0\">10<\/span><span class=\"br0\">&#93;<\/span>.<span class=\"me1\">encode<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'hex'<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\ntime_low <span class=\"sy0\">=<\/span> data<span class=\"br0\">&#91;<\/span><span class=\"nu0\">10<\/span>:<span class=\"br0\">&#93;<\/span>.<span class=\"me1\">encode<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'hex'<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<span class=\"co1\"># one big string &amp; IPMIutil formatting style<\/span><br \/>\n<span class=\"kw1\">print<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;%s<span class=\"es0\">\\t<\/span>%s<span class=\"es0\">\\t<\/span>%s-%s%s-%s%s-%s-%s&quot;<\/span> %<br \/>\n<span class=\"br0\">&#40;<\/span>target<span class=\"sy0\">,<\/span> node + clock_seq + reserved + time_hi + version + time_mid + time_low<span class=\"sy0\">,<\/span><br \/>\nnode<span class=\"sy0\">,<\/span> clock_seq<span class=\"sy0\">,<\/span> reserved<span class=\"sy0\">,<\/span> time_hi<span class=\"sy0\">,<\/span> version<span class=\"sy0\">,<\/span> time_mid<span class=\"sy0\">,<\/span> time_low<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\nudp.<span class=\"me1\">close<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># ... this should also catch parsing stuff in parse_response<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"kw1\">except<\/span> <span class=\"kw2\">Exception<\/span><span class=\"sy0\">,<\/span> e:<br \/>\n<span class=\"kw3\">sys<\/span>.<span class=\"me1\">stderr<\/span>.<span class=\"me1\">write<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;%s - hmmm.... problems in IPMI paradise, tonto: %s, bailin'<span class=\"es0\">\\n<\/span>&quot;<\/span> % <span class=\"br0\">&#40;<\/span>target<span class=\"sy0\">,<\/span> e<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;d had this sitting around for awhile and thought I&#8217;d take another look at it; in this I simply toss out an IPMI\u00a0Get Device ID command and see what happens. This is an interesting one; the GUID is a Vendor Specific ID &#8211; the specification says that it&#8217;s &#8220;a unique number per device&#8221;, and that [&hellip;]<\/p>\n","protected":false},"author":44,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[31,88,176,154,172,4,6],"tags":[289,113,290],"class_list":["post-1052","post","type-post","status-publish","format-standard","hentry","category-code","category-dinosaurs","category-embedded","category-ipmi-2","category-python","category-security","category-tech","tag-guid","tag-ipmi","tag-same-ol-same-ol"],"_links":{"self":[{"href":"https:\/\/trouble.org\/index.php?rest_route=\/wp\/v2\/posts\/1052","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trouble.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trouble.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trouble.org\/index.php?rest_route=\/wp\/v2\/users\/44"}],"replies":[{"embeddable":true,"href":"https:\/\/trouble.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1052"}],"version-history":[{"count":3,"href":"https:\/\/trouble.org\/index.php?rest_route=\/wp\/v2\/posts\/1052\/revisions"}],"predecessor-version":[{"id":1055,"href":"https:\/\/trouble.org\/index.php?rest_route=\/wp\/v2\/posts\/1052\/revisions\/1055"}],"wp:attachment":[{"href":"https:\/\/trouble.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1052"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trouble.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1052"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trouble.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1052"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}