#
# (c) Jan Gehring <jan.gehring@gmail.com>
# 
# vim: set ts=3 sw=3 tw=0:
# vim: set expandtab:

package Rex::Inventory::Hal::Object::Storage;

use strict;
use warnings;
use Data::Dumper;

use Rex::Inventory::Hal::Object;
use Rex::Commands::Gather;
use Rex::Commands::Run;

use base qw(Rex::Inventory::Hal::Object);

__PACKAGE__->has([

   { key => "block.device",   accessor => "dev", },
   #{ key => "storage.size",   accessor => "size", },
   { key => "info.product",   accessor => "product" },
   { key => ["storage.vendor", "info.vendor"], accessor => "vendor" },
   { key => "storage.bus",    accessor => "bus" },

]);



sub new {
   my $that = shift;
   my $proto = ref($that) || $that;
   my $self = { @_ };

   bless($self, $proto);

   return $self;
}

sub is_cdrom {

   my ($self) = @_;
   if( grep { /^storage\.cdrom$/ } $self->get('info.capabilities') ) {
      return 1;
   }

}

sub is_volume {
   
   my ($self) = @_;
   if( grep { ! /^false$/ } $self->get('block.is_volume') ) {
      return 1;
   }

}

sub is_floppy {
   
   my ($self) = @_;
   if( grep { /^floppy$/ } $self->get('storage.drive_type') ) {
      return 1;
   }

}

sub get_size {

   my ($self) = @_;

   my $os = get_operating_system();

   if($os =~ m/BSD/) {
      my ($info_line) = run "diskinfo " . $self->get_dev;
      my ($dev_name, $sector, $size, $sectors, $stripesize, $stripeoffset, $cylinders, $heads) = split(/\s+/, $info_line);

      return $size;
   }
   else {
      return $self->get("storage.size");
   }

}

1;
