Menu

#10 'dromom info options' on DroboElite doesn't work

open-accepted
psilva
None
5
2010-03-11
2010-03-10
Anonymous
No

Hello,

i did the right thing and installed a fresh ubuntu 9.10 and updated it to the last available packages.
I installed the distributions drobo-utils package and that couldn't detect the elite so i downloaded the deb of 0.6.2.2 and installed it.
I also installed python-qt4 for the GUI component.

$ domom -V
0.6.2.2

$ python -V
python 2.6.4

Here are the backtraces that i got:

$ drobom info options
---------------------------------------------------------
Drobo Name: DroboElite Devices: /dev/sdb
Time: Wed Mar 10 13:14:34 2010
---------------------------------------------------------
query options result:
Traceback (most recent call last):
File "/usr/sbin/drobom", line 392, in <module>
info(d,args[1].split(','))
File "/usr/sbin/drobom", line 217, in info
eval( "print" + c + "(d)" )
File "<string>", line 1, in <module>
File "/usr/sbin/drobom", line 190, in printoptions
for i in options.keys():
AttributeError: 'NoneType' object has no attribute 'keys'

$ drobom view
Traceback (most recent call last):
File "/usr/sbin/drobom", line 451, in <module>
tb = DroboGUI(d)
File "/usr/lib/pymodules/python2.6/DroboGUI.py", line 777, in __init__
self.__initOptionsTab()
File "/usr/lib/pymodules/python2.6/DroboGUI.py", line 657, in __initOptionsTab
self.Options.DDRCheckBox.setChecked( self.options['DualDiskRedundancy'] )
TypeError: 'NoneType' object is unsubscriptable

It looks like the Options can't be retrieved right on the DroboElite.

I can help on getting support for it done if someone guides me in what to do...

Thanks,

Marc

Discussion

  • psilva

    psilva - 2010-03-11

    OK, so the problem is that in Drobo.py, GetOption() has an if statement based on the firmware version number. Before firmware 1.1.0, there was no support for options queries. on the Elite, they restarted the version numbers.... hmm...

    quick test: go into Drobo.py and find the line #1321. It looks like:

    if self.fw[7] >= '1.1.0':

    change 1.1.0 to 1.0.0 and it see if it replies. This isn't a proper fix,
    just a test to see if I know what the problem is.

     
  • psilva

    psilva - 2010-03-11
    • assigned_to: nobody --> peter_silva
     
  • psilva

    psilva - 2010-03-11

    I added a check for the hardware version, in addition to the firmware version.
    It's in git. If you could install from git, that would give you a more robust fix.

     
  • psilva

    psilva - 2010-03-11

    the stack trace is a bad error handling method :-)
    Added code to drobom to handle lack of option support gracefully.
    in git now.

     
  • psilva

    psilva - 2010-03-11
    • status: open --> open-accepted
     
  • Wraiden

    Wraiden - 2010-03-12

    The changed check for a firmware level helped alot, thanks :)

    I will checkout a fresh git version soon an report back here if all went well with it.

    $ drobom info options
    ---------------------------------------------------------
    Drobo Name: DroboElite Devices: /dev/sdc
    Time: Fri Mar 12 13:31:12 2010
    ---------------------------------------------------------
    query options result:
    UseStaticIPAddress True
    UseManualVolumeManagement True
    YellowThreshold 85
    SpinDownDelayMinutes 0
    RedThreshold 95
    SpinDownDelay False
    NetMask 255.255.0.0
    DualDiskRedundancy False
    IPAddress 10.0.200.20
    ---------------------------------------------------------

    The DoboElite has two NICs and the one listed is the second one (as configured over the windows dashboard).

    Should i open another bug or feature request for access to the remaining options?

    How can i provide additional informations about that options we are able to fetch from the device?

    Thanks,

    Marc

     
  • psilva

    psilva - 2010-03-12

    The options read are based on Drobo Management Interface Resource Package (DMI-RP) as published by DRI

    http://www.drobospace.com/forums/showthread.php?tid=37

    There is no documentation of a second IP address information.
    All the documented features, except manual volume management, are implemented.

    If you are willing to do some development,, then we can continue.

    sample development:
    in Drobo.py... go into "GetOptions" and look at the line (near the fw check)

    self.__getsubpage(0x31, 'QHLLB' ) ... try changing the format to QHLLLLB
    and adding more IP fields, and see if it works. decoding is in the following lines... should be a copy/paste affair.

    If you fix GetOptions thusly, it should show up in drobom.

    If that works, then we need to put in if statements with hw levels in them... (because other drobos OPTIONS2 records are shorter than that.)

    If it doesn't work, we'll have to shrug... I dunno...

     
  • Wraiden

    Wraiden - 2010-03-12

    I tested the git version but it doesn't work as expected with your check.
    I added a "print self.inquiry" above the check in Drobo.py to show you whats what ;)

    $ drobom info options
    ---------------------------------------------------------
    Drobo Name: DroboElite Devices: /dev/sdc
    Time: Fri Mar 12 14:13:46 2010
    ---------------------------------------------------------
    (0, 0, 5, 18, 32, 0, 0, 82, 'Drobo ', 'DroboElite ', '1.00')
    options not supported on this hardware
    ---------------------------------------------------------

    Marc

     
  • Wraiden

    Wraiden - 2010-03-12

    I'll try to cook something up over the weekend.

    Maybe we should in parallel try to get some updated infos from Data Robotics.
    Do you know a way to contact them in order to get more/updated informations?

    Will be my first contact with Python code but well i wanted to learn it anyway,
    so why not just doing something useful with it right from the start.

    Thanks for the guidance Peter,

    Marc

     
  • Wraiden

    Wraiden - 2010-03-12

    Got it to print useful values pretty fast :)

    Here is what i use now in GetOptions:

    if self.inquiry[10] >= '1.00' or self.fw[7] >= '1.1.0':
    # insert try/except for compatibility with firmware <= 1.1.0
    o = self.__getsubpage(0x30, 'BBBIBB' )
    d = { "YellowThreshold": o[0], "RedThreshold": o[1] }
    if ( 'SUPPORTS_OPTIONS2' in self.features ):
    ( flags, d['SpinDownDelayMinutes'], rawipb, rawnmb, rawgwb, \
    d['ReservedValue'], rawipa, rawnma, rawgwa ) = \
    self.__getsubpage(0x31, 'QHLLLHLLL' )
    d["DualDiskRedundancy"] = ( flags & 0x0001 ) > 0
    d["SpinDownDelay"] = ( flags & 0x0002 ) > 0
    d["UseManualVolumeManagement"] = ( flags & 0x0004 ) > 0
    d["UseStaticIPAddress"] = ( flags & 0x0008 ) > 0
    ipb = socket.ntohl(rawipb)
    maskb = socket.ntohl(rawnmb)
    gwb = socket.ntohl(rawgwb)
    ipa = socket.ntohl(rawipa)
    maska = socket.ntohl(rawnma)
    gwa = socket.ntohl(rawgwa)
    d["IPAddressB"]=socket.inet_ntoa(struct.pack('I',ipb))
    d["NetMaskB"]=socket.inet_ntoa(struct.pack('I',maskb))
    d["GatewayB"]=socket.inet_ntoa(struct.pack('I',gwb))
    d["IPAddressA"]=socket.inet_ntoa(struct.pack('I',ipa))
    d["NetMaskA"]=socket.inet_ntoa(struct.pack('I',maska))
    d["GatewayA"]=socket.inet_ntoa(struct.pack('I',gwa))
    return d
    else:
    return None

    And here is the output:

    $ drobom info options
    ---------------------------------------------------------
    Drobo Name: DroboElite Devices: /dev/sdc
    Time: Fri Mar 12 15:17:12 2010
    ---------------------------------------------------------
    ReservedValue 1500
    GatewayB 10.0.200.1
    UseManualVolumeManagement True
    YellowThreshold 85
    GatewayA 10.0.200.1
    SpinDownDelayMinutes 0
    RedThreshold 95
    NetMaskA 255.255.0.0
    SpinDownDelay False
    UseStaticIPAddress True
    IPAddressA 10.0.200.10
    NetMaskB 255.255.0.0
    DualDiskRedundancy False
    IPAddressB 10.0.200.20
    ---------------------------------------------------------

    I think one of the unknown features is the thing that we need to test for to find out if we have support for a second NIC:

    $ drobom info firmware
    ---------------------------------------------------------
    Drobo Name: DroboElite Devices: /dev/sdc
    Time: Fri Mar 12 15:26:02 2010
    ---------------------------------------------------------
    Firmware: 1.0.1
    Revision: 3.13 ( 25426 ) built: Dec 22 2009,18:43:18
    Features: NO_AUTO_REBOOT,NO_FAT32_FORMAT,USED_CAPACITY_FROM_HOST,DISKPACKSTATUS,ENCRYPT_NOHEADER,CMD_STATUS_QUERIABLE,VARIABLE_LUN_SIZE_1_16,PARTITION_LUN_GPT_MBR,FAT32_FORMAT_VOLNAME,SUPPORTS_NEW_LUNINFO2,feature x0800,LUN_MANAGEMENT,feature x2000 ,SUPPORTS_OPTIONS2,SUPPORTS_SHUTDOWN,leftovers (0x60000)
    ---------------------------------------------------------

    But without input from data robotics we get stuck on this one i think.

    Marc

     
  • Wraiden

    Wraiden - 2010-03-12

    Next thing on my list is to look at the windows dashboard an look for things that are new to DroboElite (based on comparion to the manual prints from DroboElite an DroboPro) maybe i can get some information out of it about what the values in the Reserved field are...

    Marc

     
  • Wraiden

    Wraiden - 2010-03-12

    Got it, so the last values are the MTU for boot interfaces (for Jumbo-Frames...).
    Here is my latest code (will post it to the devel list after some cleanup and with option setting support included over the weekend):

    if self.inquiry[10] >= '1.00' or self.fw[7] >= '1.1.0':
    # insert try/except for compatibility with firmware <= 1.1.0
    o = self.__getsubpage(0x30, 'BBBIBB' )
    d = { "YellowThreshold": o[0], "RedThreshold": o[1] }
    if ( 'SUPPORTS_OPTIONS2' in self.features ):
    ( flags, d['SpinDownDelayMinutes'], rawipb, rawnmb, rawgwb, \
    d['MTU_B'], rawipa, rawnma, rawgwa, d['MTU_A'] ) = \
    self.__getsubpage(0x31, 'QHLLLHLLLH' )
    d['Flags'] = flags
    d['DualDiskRedundancy'] = ( flags & 0x0001 ) > 0
    d['SpinDownDelay'] = ( flags & 0x0002 ) > 0
    d['UseManualVolumeManagement'] = ( flags & 0x0004 ) > 0
    d['UseStaticIPAddress'] = ( flags & 0x0008 ) > 0
    ipb = socket.ntohl(rawipb)
    d['IPAddressB']=socket.inet_ntoa(struct.pack('I',ipb))
    maskb = socket.ntohl(rawnmb)
    d['NetMaskB']=socket.inet_ntoa(struct.pack('I',maskb))
    gwb = socket.ntohl(rawgwb)
    d['GatewayB']=socket.inet_ntoa(struct.pack('I',gwb))
    ipa = socket.ntohl(rawipa)
    d['IPAddressA']=socket.inet_ntoa(struct.pack('I',ipa))
    maska = socket.ntohl(rawnma)
    d['NetMaskA']=socket.inet_ntoa(struct.pack('I',maska))
    gwa = socket.ntohl(rawgwa)
    d['GatewayA']=socket.inet_ntoa(struct.pack('I',gwa))
    return d
    else:
    return None

    Marc

     
  • Wraiden

    Wraiden - 2010-03-12

    ...for both interfaces...

     
  • psilva

    psilva - 2010-03-13

    looking forward to a patch!

     
  • Wraiden

    Wraiden - 2010-03-15

    still working on it...
    Got a bit distracted over the weekend...

     
  • Wraiden

    Wraiden - 2010-03-15

    Hello,

    i found a 'drobom info firmware' output of a DroboPro in the drobo-talk archives:

    DroboPro:
    NO_AUTO_REBOOT,NO_FAT32_FORMAT,USED_CAPACITY_FROM_HOST,DISKPACKSTATUS,ENCRYPT_NOHEADER,CMD_STATUS_QUERIABLE,VARIABLE_LUN_SIZE_1_16,PARTITION_LUN_GPT_MBR,FAT32_FORMAT_VOLNAME,SUPPORTS_NEW_LUNINFO2,feature
    x0800,LUN_MANAGEMENT,feature x2000,SUPPORTS_OPTIONS2,SUPPORTS_SHUTDOWN,leftovers (0x20000)

    DroboElite:
    NO_AUTO_REBOOT,NO_FAT32_FORMAT,USED_CAPACITY_FROM_HOST,DISKPACKSTATUS,ENCRYPT_NOHEADER,CMD_STATUS_QUERIABLE,VARIABLE_LUN_SIZE_1_16,PARTITION_LUN_GPT_MBR,FAT32_FORMAT_VOLNAME,SUPPORTS_NEW_LUNINFO2,feature x0800,LUN_MANAGEMENT,feature x2000,SUPPORTS_OPTIONS2,SUPPORTS_SHUTDOWN,leftovers (0x60000)

    I think x40000 is what we need to check for the second NIC configuration on the DroboElite.

    The information stored in the leftover options looks like it could be the following:

    x20000 = SUPPORTS_ISCSI
    x40000 = SUPPORTS_DUALNIC

    If we get more input from Data Robotics we can alter the feature names later and adapt the code to it.

    I dropped the option setting support for the first revision which i will post to the dev list later today...

    Marc

     

Log in to post a comment.

Auth0 Logo