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
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.
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.
the stack trace is a bad error handling method :-)
Added code to drobom to handle lack of option support gracefully.
in git now.
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
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...
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
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
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
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
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
...for both interfaces...
looking forward to a patch!
still working on it...
Got a bit distracted over the weekend...
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