class Dribbled::DrbdSet

Constants

PROCDRBD_ACTIVITY_RE
PROCDRBD_ACTIVITY_STATUS_RE
PROCDRBD_RESOURCE_RE
PROCDRBD_URESOURCE_RE
PROCDRBD_VERSION_RE

Attributes

resources_cfg_raw[R]
resources_run_raw[R]

Public Class Methods

new(options) click to toggle source
# File lib/dribbled/drbd.rb, line 17
def initialize(options)
  @log = options[:log].nil? ? nil : options[:log]
  @hostname = options[:hostname]

  resources_run_src = options[:procdrbd]
  @resources_run_raw = nil
  @resources_run = _read_procdrbd(resources_run_src) # sets @resources_run_raw as side-effect; it shouldn't
  @resources_run.each do |r,res|
    self[res.id] = res unless res.nil?
  end

  resources_cfg_src = options[:xmldump].nil? ? IO.popen("#{options[:drbdadm]} dump-xml 2>/dev/null") : options[:xmldump]
  @resources_cfg_raw = nil
  @resources_cfg = _read_xmldump(resources_cfg_src)  # sets @resources_cfg_raw as side-effect; it shouldn't

  @resources_cfg.each do |name,res|
    _process_xml_resource(name,res)
  end

end

Public Instance Methods

version() click to toggle source
# File lib/dribbled/drbd.rb, line 38
def version
  "#{@version_major}.#{@version_minor}.#{@version_path}"
end

Protected Instance Methods

_process_xml_resource(name,res) click to toggle source
# File lib/dribbled/drbd.rb, line 86
def _process_xml_resource(name,res)
  res['host'].each_key do |hostname|
    @log.debug "  resource xml processing: host #{hostname}"
    if res['host'][hostname]['device'][0]['minor'].nil?
      r = res['host'][hostname]['device'][0].split('drbd')[1].to_i
      @log.debug "    #{version}: #{res['host'][hostname]['device'][0]}; r = #{r}"
      disk = res['host'][hostname]['disk'][0]
      device =  res['host'][hostname]['device'][0]
    else
      r = res['host'][hostname]['device'][0]['minor'].to_i
      @log.debug "    #{version}: #{res['host'][hostname]['device'][0]}; r = #{r}"
      disk = res['host'][hostname]['disk'][0]
      device = res['host'][hostname]['device'][0]['content']
    end
    if self[r].nil?
      self[r] = DrbdResource.new r, @hostname
      self[r].cs = 'StandAlone'
      self[r].ds = 'DUnknown'
      self[r].ro = 'Unknown'
    end
    self[r].name = name
    self[r].in_configuration = true
    @log.debug "    resource: #{r}, state: #{self[r].ro}"
    if self[r].ro == 'Primary/Secondary'
      if hostname == @hostname
        @log.debug "    resource: #{r}, primary"
        self[r].primary[:disk] = disk
        self[r].primary[:device] = device
        self[r].primary[:hostname] = hostname
      else
        @log.debug "    resource: #{r}, secondary"
        self[r].secondary[:disk] = disk
        self[r].secondary[:device] = device
        self[r].secondary[:hostname] = hostname
      end
    elsif self[r].ro == 'Secondary/Primary' or self[r].ro == 'Unknown'
      if hostname == @hostname
        @log.debug "    resource: #{r}, secondary"
        self[r].secondary[:disk] = disk
        self[r].secondary[:device] = device
        self[r].secondary[:hostname] = hostname
      else
        @log.debug "    resource: #{r}, primary"
        self[r].primary[:disk] = disk
        self[r].primary[:device] = device
        self[r].primary[:hostname] = hostname
      end
    end
  end
end
_read_procdrbd(resources_run_src) click to toggle source
# File lib/dribbled/drbd.rb, line 44
def _read_procdrbd(resources_run_src)
  @log.debug "Running configuration source: #{resources_run_src}" unless @log.nil?
  resources_run = {}
  @resources_run_raw = File.open(resources_run_src,'r') { |f| f.read }
  r = nil
  @resources_run_raw.each_line do |line|
    if /^\s*(\d+):/.match(line)
      r = $1.to_i
      resources_run[r] = DrbdResource.new r, @hostname
      resources_run[r].in_kernel = true
      if PROCDRBD_RESOURCE_RE.match(line)
        m = PROCDRBD_RESOURCE_RE.match(line)
        resources_run[r].cs = m[:cs]
        resources_run[r].ro  = m[:ro]
        resources_run[r].ds = m[:ds]
      elsif PROCDRBD_URESOURCE_RE.match(line)
        resources_run[r].cs = PROCDRBD_URESOURCE_RE.match(line)[:cs]
      end
      @log.debug "  #{resources_run[r].inspect}" unless @log.nil?
    elsif PROCDRBD_ACTIVITY_RE.match(line)
      m = PROCDRBD_ACTIVITY_RE.match(line)
      resources_run[r].activity = m[:activity].gsub(/'/,"").to_sym
      resources_run[r].percent = m[:percent].to_f
      resources_run[r].finish = m[:finish]
    elsif PROCDRBD_ACTIVITY_STATUS_RE.match(line)
      m = PROCDRBD_ACTIVITY_STATUS_RE.match(line)
      resources_run[r].finish = m[:finish]
    elsif PROCDRBD_VERSION_RE.match(line)
      @version_major = $1
      @version_minor = $2
      @version_path = $3
    end
  end
  resources_run
end
_read_xmldump(resources_cfg_src) click to toggle source
# File lib/dribbled/drbd.rb, line 80
def _read_xmldump(resources_cfg_src)
  @log.debug "Stable configuration source: #{resources_cfg_src}" unless @log.nil?
  @resources_cfg_raw = resources_cfg_src.is_a?(String) ? File.open(resources_cfg_src,"r") { |f| f.read } : resources_cfg_src.read
  XmlSimple.xml_in(@resources_cfg_raw, { 'KeyAttr' => 'name' })['resource']
end