#!/usr/bin/ruby
#
# DO NOT MODIFY!!!!
# This file is automatically generated by racc 1.4.5
# from racc grammer file "drbd.rb.yy".
#

require 'racc/parser'


$drbd = Hash.new()


class DrbdParser < Racc::Parser

module_eval <<'..end drbd.rb.yy modeval..id54d2f8d750', 'drbd.rb.yy', 100
	def parse(str)
#		@yydebug = true
		@q = []
		until str.empty? || !str
			case str
			when /\A\s+/
			when /\Adisable-ip-verification/
				@q.push [:TK_DISABLE_IP_VERIFICATION, 'disable-ip-verification']
			when /\Adisable-io-hints/
				@q.push [:TK_DISABLE_IO_HINTS, 'disable-io-hints']
			when /\Aincon-degr-cmd/
				@q.push [:TK_INCON_DEGR_CMD, 'incon-degr-cmd']
			when /\Adialog-refresh/
				@q.push [:TK_DIALOG_REFRESH, 'dialog-refresh']	
			when /\Aon-disconnect/
				@q.push [:TK_ON_DISCONNECT, 'on-disconnect']
			when /\Aon-io-error/
				@q.push [:TK_ON_IO_ERROR, 'on-io-error']
			when /\Aglobal/
				@q.push [:TK_GLOBAL, 'global']
			when /\Aminor-count/
				@q.push [:TK_MINOR_COUNT, 'minor-count']
			when /\Aresource/
				@q.push [:TK_RESOURCE, 'resource']
			when /\Aprotocol/
				@q.push [:TK_PROTOCOL, 'protocol']
			when /\Adisk\s*\{/
				@q.push [:TK_DISK_S, 'disk']
			when /\Adisk/
				@q.push [:TK_DISK, 'disk']
			when /\Anet/
				@q.push [:TK_NET, 'net']
			when /\Asyncer/
				@q.push [:TK_SYNCER, 'syncer']
			when /\Astartup/
				@q.push [:TK_STARTUP, 'startup']
			when /\Asize/
				@q.push [:TK_SIZE, 'size']
			when /\Atimeout/
				@q.push [:TK_TIMEOUT, 'timeout']
			when /\Aconnect-int/
				@q.push [:TK_CONNECT_INT, 'connect-int']
			when /\Aping-int/
				@q.push [:TK_PING_INT, 'ping-int']
			when /\Amax-buffers/
				@q.push [:TK_MAX_BUFFERS, 'max-buffers']
			when /\Aunplug-watermark/
				@q.push [:TK_UNPLUG_WATERMARK, 'unplug-watermark']
			when /\Amax-epoch-size/
				@q.push [:TK_MAX_EPOCH_SIZE, 'max-epoch-size']
			when /\Asndbuf-size/
				@q.push [:TK_SNDBUF_SIZE, 'sndbuf-size']
			when /\Ako-count/
				@q.push [:TK_KO_COUNT, 'ko-count']
			when /\Askip-sync/
				@q.push [:TK_SKIP_SYNC, 'skip-sync']
			when /\Ause-csums/
				@q.push [:TK_USE_CSUMS, 'use-csums']
			when /\Arate/
				@q.push [:TK_RATE, 'rate']
			when /\Agroup/
				@q.push [:TK_SYNC_GROUP, 'group']
			when /\Aal-extents/
				@q.push [:TK_AL_EXTENTS, 'al-extents']
			when /\Adevice/
				@q.push [:TK_DEVICE, 'device']
			when /\Aaddress/
				@q.push [:TK_ADDRESS, 'address']
			when /\Ameta-disk/
				@q.push [:TK_META_DISK, 'meta-disk']
			when /\Awfc-timeout/
				@q.push [:TK_WFC_TIMEOUT, 'wfc-timeout']
			when /\Adegr-wfc-timeout/
				@q.push [:TK_DEGR_WFC_TIMEOUT, 'degr-wfc-timeout']
			when /\Aon\s*/
				@q.push [:TK_ON, 'on']
			when /\A"[^"]*"/
				@q.push [:TK_STRING, $&]
			when /\A[\w\.\/\[\]-]+/
				@q.push [:TK_STRING, $&]	
			when /\A.|\n/o
				s = $&
				@q.push [s, s]
			end
			str = $'
		end
		@q.push [false, '$end']	
		do_parse
	end

	def next_token
		@q.shift
	end	
			
..end drbd.rb.yy modeval..id54d2f8d750

##### racc 1.4.5 generates ###

racc_reduce_table = [
 0, 0, :racc_error,
 2, 45, :_reduce_1,
 0, 46, :_reduce_2,
 4, 46, :_reduce_3,
 0, 48, :_reduce_4,
 3, 48, :_reduce_5,
 1, 49, :_reduce_6,
 1, 49, :_reduce_7,
 2, 49, :_reduce_8,
 2, 49, :_reduce_9,
 0, 47, :_reduce_10,
 2, 47, :_reduce_11,
 5, 50, :_reduce_12,
 1, 51, :_reduce_13,
 0, 52, :_reduce_14,
 3, 52, :_reduce_15,
 2, 52, :_reduce_16,
 2, 53, :_reduce_17,
 2, 53, :_reduce_18,
 3, 54, :_reduce_19,
 4, 54, :_reduce_20,
 4, 54, :_reduce_21,
 4, 54, :_reduce_22,
 5, 54, :_reduce_23,
 1, 59, :_reduce_24,
 0, 55, :_reduce_25,
 3, 55, :_reduce_26,
 2, 61, :_reduce_27,
 2, 61, :_reduce_28,
 0, 56, :_reduce_29,
 3, 56, :_reduce_30,
 2, 62, :_reduce_31,
 2, 62, :_reduce_32,
 2, 62, :_reduce_33,
 2, 62, :_reduce_34,
 2, 62, :_reduce_35,
 2, 62, :_reduce_36,
 2, 62, :_reduce_37,
 2, 62, :_reduce_38,
 2, 62, :_reduce_39,
 0, 57, :_reduce_40,
 3, 57, :_reduce_41,
 1, 63, :_reduce_42,
 1, 63, :_reduce_43,
 2, 63, :_reduce_44,
 2, 63, :_reduce_45,
 2, 63, :_reduce_46,
 0, 60, :_reduce_47,
 3, 60, :_reduce_48,
 2, 64, :_reduce_49,
 2, 64, :_reduce_50,
 2, 64, :_reduce_51,
 2, 64, :_reduce_52,
 3, 65, :_reduce_53,
 2, 66, :_reduce_54,
 1, 66, :_reduce_55,
 0, 58, :_reduce_56,
 3, 58, :_reduce_57,
 2, 67, :_reduce_58,
 2, 67, :_reduce_59 ]

racc_reduce_n = 60

racc_shift_n = 110

racc_action_table = [
    26,    27,    28,    29,    30,    47,    48,    24,    25,    15,
    16,     2,    77,    78,    79,    80,    20,    13,    21,    22,
    68,    71,    72,    66,    67,    18,    46,    52,    53,    54,
    55,    70,    58,    59,    60,    34,    35,    31,    37,    12,
    81,    14,    56,    57,    74,    75,    62,    38,    40,    41,
    76,    42,    43,     9,     7,    63,    64,    65,     5,    19,
     4,    83,    84,    85,    86,    87,    88,    89,    90,    91,
    92,    93,    94,    95,    96,    97,    98,    99,   100,   102,
   103,   105,   106,   107,   108,   109 ]

racc_action_check = [
    23,    23,    23,    23,    23,    39,    39,    23,    23,     8,
     8,     0,    51,    51,    51,    51,    12,     8,    13,    17,
    49,    49,    49,    49,    49,     9,    39,    44,    44,    44,
    44,    49,    44,    44,    44,    24,    25,    23,    26,     8,
    51,     8,    44,    44,    50,    50,    44,    27,    29,    30,
    50,    32,    36,     6,     4,    45,    47,    48,     2,    11,
     1,    52,    53,    54,    55,    56,    57,    58,    59,    60,
    61,    66,    67,    69,    72,    73,    74,    75,    77,    78,
    79,    80,    82,   100,   105,   107 ]

racc_action_pointer = [
     9,    60,    18,   nil,    54,   nil,    50,   nil,     0,     6,
   nil,    17,    -3,    -1,   nil,   nil,   nil,   -21,   nil,   nil,
   nil,   nil,   nil,    -4,    16,    17,    19,     7,   nil,     8,
     9,   nil,     9,   nil,   nil,   nil,    12,   nil,   nil,   -15,
   nil,   nil,   nil,   nil,     5,    13,   nil,    37,    38,   -10,
     9,    -1,    42,    43,    44,    45,    46,    47,    48,    49,
    50,    28,   nil,   nil,   nil,   nil,    52,    53,   nil,    31,
   nil,   nil,    55,    33,    57,    58,   nil,    59,    60,    61,
    62,   nil,    40,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
    40,   nil,   nil,   nil,   nil,    65,   nil,    66,   nil,   nil ]

racc_action_default = [
    -2,   -60,   -60,   -10,   -60,    -4,    -1,   110,   -60,   -60,
   -11,   -60,   -60,   -60,    -3,    -6,    -7,   -60,   -13,    -5,
    -9,    -8,   -14,   -60,   -60,   -60,   -60,   -60,   -25,   -60,
   -60,   -12,   -60,   -16,   -17,   -18,   -60,   -24,   -29,   -60,
   -40,   -56,   -15,   -47,   -60,   -60,   -19,   -60,   -60,   -60,
   -60,   -60,   -60,   -60,   -60,   -60,   -60,   -60,   -60,   -60,
   -60,   -60,   -20,   -26,   -27,   -28,   -60,   -60,   -42,   -60,
   -21,   -43,   -60,   -60,   -60,   -60,   -22,   -60,   -60,   -60,
   -60,   -23,   -60,   -31,   -32,   -33,   -34,   -38,   -39,   -35,
   -36,   -37,   -30,   -45,   -46,   -41,   -44,   -57,   -58,   -59,
   -60,   -51,   -49,   -50,   -52,   -55,   -48,   -60,   -54,   -53 ]

racc_goto_table = [
     1,     3,     6,     8,    11,    10,    17,    23,    32,    33,
    39,    44,    49,    50,    36,    51,    45,    61,    69,    82,
   101,   104,    73 ]

racc_goto_check = [
     1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
    11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
    21,    22,    23 ]

racc_goto_pointer = [
   nil,     0,     1,    -1,    -2,    -4,    -1,    -3,   -15,   -15,
   -14,   -18,   -27,   -28,   -28,   -12,   -28,   -23,   -27,   -31,
   -32,   -57,   -59,   -28 ]

racc_goto_default = [
   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
   nil,   nil,   nil,   nil ]

racc_token_table = {
 false => 0,
 Object.new => 1,
 :TK_GLOBAL => 2,
 :TK_RESOURCE => 3,
 :TK_ON => 4,
 :TK_NET => 5,
 :TK_DISK_S => 6,
 :TK_SYNCER => 7,
 :TK_STARTUP => 8,
 :TK_DISABLE_IO_HINTS => 9,
 :TK_DISABLE_IP_VERIFICATION => 10,
 :TK_PROTOCOL => 11,
 :TK_INCON_DEGR_CMD => 12,
 :TK_ADDRESS => 13,
 :TK_DISK => 14,
 :TK_DEVICE => 15,
 :TK_META_DISK => 16,
 :TK_MINOR_COUNT => 17,
 :TK_INTEGER => 18,
 :TK_STRING => 19,
 :TK_ON_IO_ERROR => 20,
 :TK_SIZE => 21,
 :TK_TIMEOUT => 22,
 :TK_CONNECT_INT => 23,
 :TK_PING_INT => 24,
 :TK_MAX_BUFFERS => 25,
 :TK_IPADDR => 26,
 :TK_UNPLUG_WATERMARK => 27,
 :TK_MAX_EPOCH_SIZE => 28,
 :TK_SNDBUF_SIZE => 29,
 :TK_SKIP_SYNC => 30,
 :TK_USE_CSUMS => 31,
 :TK_RATE => 32,
 :TK_SYNC_GROUP => 33,
 :TK_AL_EXTENTS => 34,
 :TK_WFC_TIMEOUT => 35,
 :TK_DEGR_WFC_TIMEOUT => 36,
 :TK_KO_COUNT => 37,
 :TK_ON_DISCONNECT => 38,
 :TK_DIALOG_REFRESH => 39,
 "{" => 40,
 "}" => 41,
 ";" => 42,
 ":" => 43 }

racc_use_result_var = true

racc_nt_base = 44

Racc_arg = [
 racc_action_table,
 racc_action_check,
 racc_action_default,
 racc_action_pointer,
 racc_goto_table,
 racc_goto_check,
 racc_goto_default,
 racc_goto_pointer,
 racc_nt_base,
 racc_reduce_table,
 racc_token_table,
 racc_shift_n,
 racc_reduce_n,
 racc_use_result_var ]

Racc_token_to_s_table = [
'$end',
'error',
'TK_GLOBAL',
'TK_RESOURCE',
'TK_ON',
'TK_NET',
'TK_DISK_S',
'TK_SYNCER',
'TK_STARTUP',
'TK_DISABLE_IO_HINTS',
'TK_DISABLE_IP_VERIFICATION',
'TK_PROTOCOL',
'TK_INCON_DEGR_CMD',
'TK_ADDRESS',
'TK_DISK',
'TK_DEVICE',
'TK_META_DISK',
'TK_MINOR_COUNT',
'TK_INTEGER',
'TK_STRING',
'TK_ON_IO_ERROR',
'TK_SIZE',
'TK_TIMEOUT',
'TK_CONNECT_INT',
'TK_PING_INT',
'TK_MAX_BUFFERS',
'TK_IPADDR',
'TK_UNPLUG_WATERMARK',
'TK_MAX_EPOCH_SIZE',
'TK_SNDBUF_SIZE',
'TK_SKIP_SYNC',
'TK_USE_CSUMS',
'TK_RATE',
'TK_SYNC_GROUP',
'TK_AL_EXTENTS',
'TK_WFC_TIMEOUT',
'TK_DEGR_WFC_TIMEOUT',
'TK_KO_COUNT',
'TK_ON_DISCONNECT',
'TK_DIALOG_REFRESH',
'"{"',
'"}"',
'";"',
'":"',
'$start',
'config',
'global_sec',
'resources',
'glob_stmts',
'glob_stmt',
'resource',
'resource_name',
'res_stmts',
'res_stmt',
'section',
'disk_stmts',
'net_stmts',
'sync_stmts',
'startup_stmts',
'hostname',
'host_stmts',
'disk_stmt',
'net_stmt',
'sync_stmt',
'host_stmt',
'ip_and_port',
'meta_disk_and_index',
'startup_stmt']

Racc_debug_parser = true

##### racc system variables end #####

 # reduce 0 omitted

module_eval <<'.,.,', 'drbd.rb.yy', 6
  def _reduce_1( val, _values, result )
 $drbd['global'] = val[0]; $drbd['resources'] = val[1]; return $drbd;
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 8
  def _reduce_2( val, _values, result )
 return {};
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 9
  def _reduce_3( val, _values, result )
 return val[2];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 10
  def _reduce_4( val, _values, result )
 return {};
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 11
  def _reduce_5( val, _values, result )
 nk = val[1][0]; val[0][nk] = val[1][1]; return val[0];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 12
  def _reduce_6( val, _values, result )
 return ["#{val[0]}", true];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 13
  def _reduce_7( val, _values, result )
 return ["#{val[0]}", true];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 14
  def _reduce_8( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 15
  def _reduce_9( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 17
  def _reduce_10( val, _values, result )
 return {};
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 18
  def _reduce_11( val, _values, result )
 nk = val[1][0]; val[0][nk] = val[1][1]; return val[0];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 20
  def _reduce_12( val, _values, result )
 return ["#{val[1]}", val[3]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 22
  def _reduce_13( val, _values, result )
 return val[0];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 24
  def _reduce_14( val, _values, result )
 return {};
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 25
  def _reduce_15( val, _values, result )
 nk = val[1][0]; val[0][nk] = val[1][1]; return val[0];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 33
  def _reduce_16( val, _values, result )
nk = val[1][0]; 
                                  if nk == "on" then 
				      if (!val[0]["on"]) then val[0]["on"] = {}; end
                                      val[0]["on"][val[1][1]] = val[1][2];  
                                  else
                                      val[0][nk] = val[1][1]; 
                                  end
                                  return val[0];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 35
  def _reduce_17( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 36
  def _reduce_18( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 38
  def _reduce_19( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 39
  def _reduce_20( val, _values, result )
 return ["#{val[0]}", val[2]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 40
  def _reduce_21( val, _values, result )
 return ["#{val[0]}", val[2]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 41
  def _reduce_22( val, _values, result )
 return ["#{val[0]}", val[2]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 42
  def _reduce_23( val, _values, result )
 return ["#{val[0]}", "#{val[1]}", val[3]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 44
  def _reduce_24( val, _values, result )
 return val[0];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 46
  def _reduce_25( val, _values, result )
 return {};
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 47
  def _reduce_26( val, _values, result )
 nk = val[1][0]; val[0][nk] = val[1][1]; return val[0];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 49
  def _reduce_27( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 50
  def _reduce_28( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 52
  def _reduce_29( val, _values, result )
 return {};
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 53
  def _reduce_30( val, _values, result )
 nk = val[1][0]; val[0][nk] = val[1][1]; return val[0];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 55
  def _reduce_31( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 56
  def _reduce_32( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 57
  def _reduce_33( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 58
  def _reduce_34( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 59
  def _reduce_35( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 60
  def _reduce_36( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 61
  def _reduce_37( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 62
  def _reduce_38( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 63
  def _reduce_39( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 65
  def _reduce_40( val, _values, result )
 return {};
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 66
  def _reduce_41( val, _values, result )
 nk = val[1][0]; val[0][nk] = val[1][1]; return val[0];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 68
  def _reduce_42( val, _values, result )
 return ["#{val[0]}", true];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 69
  def _reduce_43( val, _values, result )
 return ["#{val[0]}", true];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 70
  def _reduce_44( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 71
  def _reduce_45( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 72
  def _reduce_46( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 74
  def _reduce_47( val, _values, result )
 return {};
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 75
  def _reduce_48( val, _values, result )
 nk = val[1][0]; val[0][nk] = val[1][1]; return val[0];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 77
  def _reduce_49( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 78
  def _reduce_50( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 79
  def _reduce_51( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 80
  def _reduce_52( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 82
  def _reduce_53( val, _values, result )
 return "#{val[0]}:#{val[2]}";
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 84
  def _reduce_54( val, _values, result )
 return "#{val[0]} #{val[1]}";
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 85
  def _reduce_55( val, _values, result )
 return val[0];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 87
  def _reduce_56( val, _values, result )
 return {};
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 88
  def _reduce_57( val, _values, result )
 nk = val[1][0]; val[0][nk] = val[1][1]; return val[0];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 90
  def _reduce_58( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

module_eval <<'.,.,', 'drbd.rb.yy', 91
  def _reduce_59( val, _values, result )
 return ["#{val[0]}", val[1]];
   result
  end
.,.,

 def _reduce_none( val, _values, result )
  result
 end

end   # class DrbdParser

dp = DrbdParser.new

$drbdcfg = "/etc/drbd.conf"
$configstr = ""
in_skip = false

if !File.exist?($drbdcfg)
	file = File.open($drbdcfg, "w")
        file.close
end


File.open($drbdcfg, "r") do |file|
   file.each_line do |line| 
      line = line.gsub(/#.*$/, '').chomp
      if (line =~ /^skip\s+/) then in_skip = true end
      if (line =~ /^\}/ && in_skip == true) then 
      	 in_skip = false 
         line = ""
      end
      if (! in_skip ) then
         $configstr += line.gsub(/#.*$/, '').chomp
      end
   end
end

dp.parse($configstr)



$debug = 0
def errlog (str)
    if $debug == 1 then
	$stderr.puts str
    end
end	

def convertYcp (str)
    return str.gsub(/"/, '\"')
end

def doList (path)
  if path.length == 0 then
    puts "[ \"global\", \"resources\" ]"
    return
  end

  res = $drbd
  begin
    path.each do |it|
	  errlog it.to_s
	  errlog "xxx"+res.to_s
	  if res.has_key?(it.chomp) then
		res = res[it.chomp]
      else
	    errlog "quit as not key. " + it
        puts "nil"
        return
      end
    end

	errlog "xxx"+res.to_s
	errlog "xxx"+$drbd.to_s

	if res == nil then
		puts "nil"
		return
	end

    if res.length == 0 then
       str = "[]"
    else
       str = "[ "
       res.keys.each do |key|
          str = str + "\"" + convertYcp(key.to_s) + "\", "
       end
       str = str.chop.chop + " ]"
    end
	puts str
    return

  rescue NoMethodError
    errlog "quit as exceptions happends."
    puts "nil"
    return
  end
end

def doRead(path)
  if path.length == 0 then
    puts "nil"
    return
  end

  res = $drbd
  begin
    path.each do |it|
      if res.has_key?(it.chomp) then
        res = res[it.chomp]
      else
        puts "nil"
        return
      end
    end

    puts '"'+convertYcp(res.to_s)+'"'
    return 
  rescue NoMethodError
    puts "nil"
    return
  end

end

def stripQuote(path)
  path.each_index do |it|
    if ! path[it] == "" and path[it][0] == '"' then
	  path[it]=path[it][1..-2]
	end
  end
  return path
end

def doWrite(path, args)
  errlog "write path is "+path.to_s
  errlog "write args is "+args

  if path.length == 0 then
    commitChange()
    puts "nil"
    return
  end

  path.each_index do |it|
    errlog "found "+path[it]
    if path[it] != "" and path[it][0] == 34 then
	  errlog path[it]+" is changed to "+path[it].chomp()[1..-2]
      path[it]=path[it].chomp()[1..-2]
    end
  end

  if args[0..1] == "\\\"" then
    errlog "args is changed to " + args[1..-3] + "\""
	args = args.chomp()[1..-3]+"\""
  end

  errlog path.to_s

  if path.length < 2 then
    puts "nil"
    return
  end

  if path[-2].chomp == "on" then
    errlog "prepare to change the node name"
    res = $drbd
    res_b = res
    begin
      path.each do |it|
        if res.has_key?(it.chomp) then
          res_b = res
          res = res[it.chomp]
        else
		  puts "nil"
		  return
        end
      end

      errlog "found the node name, change it"
	  if args != "nil" then
        res_b.delete(args)
        res_b[args] = res_b[path[-1].chomp]
        res_b.delete(path[-1].chomp)
	  else
	    res_b.delete(path[-1].chomp)
	  end
      writeFile
      puts "nil"
      return
    rescue
      puts "nil"
      return
    end

  elsif path[-2].chomp == "resources" then
    errlog "prepare to change the resource name"
    if $drbd["resources"].has_key?(path[-1].chomp) then
	  if args != "nil" then
        $drbd["resources"].delete(args)
        $drbd["resources"][args] = $drbd["resources"][path[-1].chomp]
        $drbd["resources"].delete(path[-1].chomp)
	  else
	    $drbd["resources"].delete(path[-1].chomp)
      end	  
      writeFile
      puts "nil"
      return
    end

  else
    errlog "prepare to change the attribute"
    res = $drbd
    res_b = res
    begin
      path.each do |it|
        if res.has_key?(it.chomp) then
          res_b = res
          res = res[it.chomp]
        else
		  res[it.chomp] = Hash.new()
		  res_b = res
		  res = res[it.chomp]
        end
      end

      errlog "found the attribute name, change it"
	  if args != "nil" then
        res_b[path[-1].chomp] = args
	  else
        res_b.delete(path[-1].chomp)
      end	
      writeFile
      puts "nil"
      return
    rescue
      puts "nil"
      return
    end
  end
  puts "nil"
end

def writeFile()
  errlog $drbd.to_s	
  errlog "start to writeFile"
  File.open($drbdcfg+".YaST2new", "w") do |file|
    if $drbd.has_key?("global") then
      file.puts "global {"
      $drbd["global"].each_key do |key|
	    if key == "disable-ip-verification" or key == "disable-io-hints" then
		  if $drbd["global"][key] == "" or $drbd["global"][key] == "true" then
		    file.puts "   "+key+";"
		  end
		else
          file.puts "   "+key+"\t"+$drbd["global"][key]+";"
		end
      end
      file.puts "}"
    end
    if $drbd.has_key?("resources") then
      $drbd["resources"].each_key do |res_name|
        file.puts "resource "+res_name+" {"

        if $drbd["resources"][res_name].has_key?("protocol") then
          file.puts "   protocol\t"+$drbd["resources"][res_name]["protocol"]+";"
        end

        if $drbd["resources"][res_name].has_key?("incon-degr-cmd") then
          file.puts "   incon-degr-cmd\t"+$drbd["resources"][res_name]["incon-degr-cmd"]+";"
        end

        if $drbd["resources"][res_name].has_key?("disk") then
          file.puts "   disk {"
          $drbd["resources"][res_name]["disk"].each_key do |key|
            file.puts "      "+key+"\t"+$drbd["resources"][res_name]["disk"][key]+";"
          end
          file.puts "   }"
        end

        if $drbd["resources"][res_name].has_key?("syncer") then
          file.puts "   syncer {"
          $drbd["resources"][res_name]["syncer"].each_key do |key|
            file.puts "      "+key+"\t"+$drbd["resources"][res_name]["syncer"][key]+";"
          end
          file.puts "   }"
        end

        if $drbd["resources"][res_name].has_key?("net") then
          file.puts "   net {"
          $drbd["resources"][res_name]["net"].each_key do |key|
            file.puts "      "+key+"\t"+$drbd["resources"][res_name]["net"][key]+";"
          end
          file.puts "   }"
        end

        if $drbd["resources"][res_name].has_key?("startup") then
          file.puts "   startup {"
          $drbd["resources"][res_name]["startup"].each_key do |key|
            file.puts "      "+key+"\t"+$drbd["resources"][res_name]["startup"][key]+";"
          end
          file.puts "   }"
        end

        if $drbd["resources"][res_name].has_key?("on") then
          $drbd["resources"][res_name]["on"].each_key do |node_name|
            file.puts "   on "+node_name+" {"
            $drbd["resources"][res_name]["on"][node_name].each_key do |key|
              file.puts "      "+key+"\t"+$drbd["resources"][res_name]["on"][node_name][key]+";"
            end
            file.puts "   }"
          end
        end

        file.puts "}"
      end
    end
  end
end

def commitChange()
  if not File.exist?($drbdcfg+".YaST2new") then
    return
  elsif File.exist?($drbdcfg) then
    File.rename($drbdcfg, $drbdcfg+".YaST2save")
  end
  File.rename($drbdcfg+".YaST2new", $drbdcfg)
end

# `Write (.drbd) means to write the file, other wise, the file is not written anyway

$stdin.each do |line|
  errlog(line)
  line.chomp
  cmd = line.gsub(/^`?([a-zA-Z]+)\s.*$/, '\1')
  path = line.gsub(/^`?([a-zA-Z]+)\s+\(([^,]*)(,.*)?\)$/, '\2').split('.')-[""]-["\n"]
  args = line.gsub(/^`?([a-zA-Z]+)\s+\(([^,]*)(,.*)?\)$/, '\3')
  if args.length != 0 then
    args[0] = ' '
    args = args.lstrip().rstrip()
    if args[0] == 34 then
      args = args[1..-2]
    end
  end
  case cmd
    when /Dir/
      doList(path)
    when /Read/
      doRead(path)
	when /Write/
	  doWrite(path, args)
	when /result/
	  exit
    when /.*/
      puts "nil"
  end
  $stdout.flush
end

