tiebreaker 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/classes/NaElement.rb +396 -0
- data/classes/NaErrno.rb +1170 -0
- data/classes/NaServer.rb +789 -0
- data/classes/common.rb +37 -0
- data/classes/confreader.rb +16 -0
- data/classes/main.rb +79 -0
- data/classes/ntap.rb +610 -0
- data/classes/worker.rb +265 -0
- data/config.json +90 -0
- data/logs/config0.log +0 -0
- data/pids/pid +0 -0
- data/tiebreaker.rb +12 -0
- metadata +136 -0
data/classes/worker.rb
ADDED
@@ -0,0 +1,265 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require "ntap"
|
4
|
+
require 'net/ping'
|
5
|
+
require "common"
|
6
|
+
require 'logger'
|
7
|
+
|
8
|
+
|
9
|
+
class WORKER
|
10
|
+
|
11
|
+
|
12
|
+
def initialize(config)
|
13
|
+
@config = config
|
14
|
+
|
15
|
+
@logger = Logger.new(File.join(File.dirname(__FILE__),"../logs/#{@config['config_name']}.log"), 'weekly')
|
16
|
+
@logger.datetime_format = "%Y-%m-%d %H:%M:%S"
|
17
|
+
@logger.info "Started"
|
18
|
+
|
19
|
+
@allvars = ALLVARS.new
|
20
|
+
@mtex = @allvars.mutex
|
21
|
+
|
22
|
+
@checkofseparation = {}
|
23
|
+
#@logger.info @allvars.isseparated
|
24
|
+
@primary_vsm_properties = {"luns"=>[]}
|
25
|
+
@secondary_vsm_properties = {"management_lifs"=>[],"data_lifs"=>[]}
|
26
|
+
|
27
|
+
fillup_svm_details(true)
|
28
|
+
|
29
|
+
@vsms_properties = {"primary_vsm_properties"=>@primary_vsm_properties, "secondary_vsm_properties"=>@secondary_vsm_properties}
|
30
|
+
#puts @vsms_properties.inspect
|
31
|
+
lun_scan_cycle = 0
|
32
|
+
while true & (not @allvars.isseparated)
|
33
|
+
@logger.info "In while"
|
34
|
+
@checkofseparation = checkifseparated
|
35
|
+
if @checkofseparation["primary_is_alive"] | @checkofseparation["secondary_is_alive"] then # ha nem separated
|
36
|
+
if not @checkofseparation["primary_is_alive"] then # ha a primary nem erheto el a 3. site-rol, akkor megnezi, hogy a secondary-rol elerheto e a primary
|
37
|
+
@logger.warn "#{@config['config_name']}: Primary site is not alive from 3. site check wheter netapp on secondary site is able to reach"
|
38
|
+
netappinst = NETAPP.new(@config, @logger,@vsms_properties)
|
39
|
+
if not netappinst.ping_primary_from_secondary then
|
40
|
+
@logger.error "#{@config['config_name']}: Failover started..."
|
41
|
+
if netappinst.failover then
|
42
|
+
@logger.info "#{@config_name}: Failover has been succeeded"
|
43
|
+
exit
|
44
|
+
else
|
45
|
+
@logger.fatal "#{@config_name}: Failover has not been succeeded"
|
46
|
+
exit
|
47
|
+
end
|
48
|
+
|
49
|
+
end # do site failover
|
50
|
+
end
|
51
|
+
end # if ( @checkofseparation["primary_is_alive"] | @checkofseparation["secondary_is_alive"] )
|
52
|
+
|
53
|
+
lun_scan_cycle+=1
|
54
|
+
|
55
|
+
if lun_scan_cycle==5 then
|
56
|
+
fillup_svm_details(false)
|
57
|
+
lun_scan_cycle = 0
|
58
|
+
end
|
59
|
+
|
60
|
+
sleep 2
|
61
|
+
end # while true & (not @allvars.isseparated
|
62
|
+
end
|
63
|
+
|
64
|
+
def checkifseparated
|
65
|
+
# egyik ip sem ok. felteszem
|
66
|
+
primary_is_alive = false
|
67
|
+
secondary_is_alive = false
|
68
|
+
|
69
|
+
# a primary ipk netan elerhetok
|
70
|
+
@config["ips_to_check_on_primary"].each do |ip_to_check_on_primary|
|
71
|
+
if not primary_is_alive then
|
72
|
+
# primary_is_alive = Net::Ping::External.new(ip_to_check_on_primary).ping?
|
73
|
+
primary_is_alive = do_ping(ip_to_check_on_primary,1)
|
74
|
+
if primary_is_alive then
|
75
|
+
@logger.info "#{@config['config_name']}: The IP on primary site: #{ip_to_check_on_primary} is alive from 3. site"
|
76
|
+
else
|
77
|
+
@logger.warn "#{@config['config_name']}: The IP on primary site: #{ip_to_check_on_primary} is not alive from 3. site"
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
@config["ips_to_check_on_secondary"].each do |ip_to_check_on_secondary|
|
84
|
+
if not secondary_is_alive then
|
85
|
+
#secondary_is_alive = Net::Ping::External.new(ip_to_check_on_secondary).ping?
|
86
|
+
secondary_is_alive = do_ping(ip_to_check_on_secondary,1)
|
87
|
+
if secondary_is_alive then
|
88
|
+
@logger.info "#{@config['config_name']}: The IP on secondary site: #{ip_to_check_on_secondary} is alive = #{secondary_is_alive} from 3. site"
|
89
|
+
else
|
90
|
+
@logger.warn "#{@config['config_name']}: The IP on secondary site: #{ip_to_check_on_secondary} is not alive = #{secondary_is_alive} from 3. site"
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
sitestate={"primary_is_alive"=>primary_is_alive, "secondary_is_alive"=>secondary_is_alive}
|
97
|
+
|
98
|
+
if not primary_is_alive then # ha az elsodleges site nem megy, akkor megnezi, hogy a masodlagos megy e
|
99
|
+
if not secondary_is_alive then # ha a masodlagos sem megy, akkor beallitja a setseparated-et true-ra
|
100
|
+
@mtex.synchronize do
|
101
|
+
if ! @allvars.isseparated then
|
102
|
+
@logger.fatal "#{@config['config_name']}: Setting separated!!!!"
|
103
|
+
@allvars.setseparated(true)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
else
|
107
|
+
# dummy
|
108
|
+
end
|
109
|
+
end
|
110
|
+
@logger.info "#{@config['config_name']}: The state of sites: #{sitestate}"
|
111
|
+
return sitestate # azert van return, hogy 1 forduloban lehessen is ellenorizni
|
112
|
+
end
|
113
|
+
|
114
|
+
|
115
|
+
def do_ping(hostname,ping_count)
|
116
|
+
pcount=0
|
117
|
+
ping = Net::Ping::External.new(host = hostname, timeout = 10, count=10)
|
118
|
+
while !ping.ping? && pcount < ping_count
|
119
|
+
pcount+=1
|
120
|
+
end
|
121
|
+
return ping.ping?
|
122
|
+
end # do_ping
|
123
|
+
|
124
|
+
|
125
|
+
def svm_get_management_lifs(primary_or_secondary)
|
126
|
+
netappinst = NETAPP.new(@config, @logger,{})
|
127
|
+
return netappinst.get_management_interfaces(primary_or_secondary)
|
128
|
+
end # first_check_health
|
129
|
+
|
130
|
+
def svm_get_data_lifs(primary_or_secondary,protocol)
|
131
|
+
netappinst = NETAPP.new(@config, @logger,{})
|
132
|
+
return netappinst.get_data_interfaces(primary_or_secondary,protocol)
|
133
|
+
end # first_check_health
|
134
|
+
|
135
|
+
def svm_get_luns_primary
|
136
|
+
netappinst = NETAPP.new(@config, @logger,{})
|
137
|
+
return netappinst.get_primary_luns
|
138
|
+
end # first_check_health
|
139
|
+
|
140
|
+
def check_connection_to_netapp(destination,caller)
|
141
|
+
netappinst = NETAPP.new(@config, @logger,{})
|
142
|
+
return netappinst.test_connection(destination, caller)
|
143
|
+
end # first_check_health
|
144
|
+
|
145
|
+
|
146
|
+
def fillup_svm_details(isfirst)
|
147
|
+
if isfirst then
|
148
|
+
|
149
|
+
###################
|
150
|
+
# query manaement interfaces, trouble if no results
|
151
|
+
|
152
|
+
=begin for future use
|
153
|
+
primary_svm_management_lifs = svm_get_management_lifs("primary")
|
154
|
+
puts primary_svm_management_lifs.inspect
|
155
|
+
if ! (primary_svm_management_lifs.class.name.eql?("NilClass") ) then
|
156
|
+
if primary_svm_management_lifs.count > 0 then
|
157
|
+
anymanagementinterfaceisup = false
|
158
|
+
primary_svm_management_lifs.each { |vsm_management_interface|
|
159
|
+
anymanagementinterfaceisup = true if vsm_management_interface["operational-status"].eql?("up")
|
160
|
+
}
|
161
|
+
if ! anymanagementinterfaceisup then
|
162
|
+
@logger.fatal "#{@config_name}: No management interfaces have operational-status UP"
|
163
|
+
exit
|
164
|
+
end #! anymanagementinterfaceisup then
|
165
|
+
else
|
166
|
+
@logger.fatal "#{@config_name}: No management interfaces definied on primary SVM"
|
167
|
+
exit
|
168
|
+
end #if primary_svm_management_lifs.count == 0 then
|
169
|
+
else #! (primary_svm_management_lifs.class.name.eql?("NilClass") ) then
|
170
|
+
@logger.fatal "#{@config_name}: Unable to retrieve management interfaces from primary SVM"
|
171
|
+
exit
|
172
|
+
end
|
173
|
+
=end # for future use
|
174
|
+
secondary_svm_management_lifs = svm_get_management_lifs("secondary")
|
175
|
+
if ! (secondary_svm_management_lifs.class.name.eql?("NilClass") ) then
|
176
|
+
if secondary_svm_management_lifs.count > 0 then
|
177
|
+
any_management_interfaces_are_admin_up = false
|
178
|
+
secondary_svm_management_lifs.each { |vsm_management_interface|
|
179
|
+
any_management_interfaces_are_admin_up= true if vsm_management_interface["administrative-status"].eql?("up")
|
180
|
+
}
|
181
|
+
if ! any_management_interfaces_are_admin_up then
|
182
|
+
@logger.fatal "#{@config_name}: No management interfaces have administrative-status UP on secondary"
|
183
|
+
exit
|
184
|
+
end #! any_management_interfaces_are_admin_up then
|
185
|
+
else
|
186
|
+
@logger.fatal "#{@config_name}: No management interfaces definied on secondary SVM"
|
187
|
+
exit
|
188
|
+
end
|
189
|
+
else
|
190
|
+
@logger.fatal "#{@config_name}: Unable to retrieve management interfaces of secondary SVM"
|
191
|
+
end
|
192
|
+
@secondary_vsm_properties["management_lifs"] = secondary_svm_management_lifs
|
193
|
+
# / query management interfaces, trouble if no results
|
194
|
+
|
195
|
+
# query data interfaces, no trouble if no results
|
196
|
+
|
197
|
+
=begin # for future use
|
198
|
+
primary_svm_data_lifs = []
|
199
|
+
data_protocols = ["nfs","cifs","iscsi","fcp","fcache"]
|
200
|
+
data_protocols.each{ |protocol|
|
201
|
+
primary_svm_data_lifs.concat(svm_get_data_lifs("primary",protocol))
|
202
|
+
}
|
203
|
+
=end # for future use
|
204
|
+
|
205
|
+
secondary_svm_data_lifs = []
|
206
|
+
data_protocols = ["nfs","cifs","iscsi","fcp","fcache"]
|
207
|
+
data_protocols.each{ |protocol|
|
208
|
+
secondary_svm_data_lifs.concat(svm_get_data_lifs("secondary",protocol))
|
209
|
+
}
|
210
|
+
@secondary_vsm_properties["data_lifs"] = secondary_svm_data_lifs
|
211
|
+
|
212
|
+
#get luns from primary
|
213
|
+
@primary_vsm_properties["luns"] = svm_get_luns_primary
|
214
|
+
|
215
|
+
else # if isfirst then
|
216
|
+
|
217
|
+
# @primary_vsm_properties["luns"] = svm_get_luns_primary if check_connection_to_netapp("primary_cluster", "Refreshing luns on primary SVM")
|
218
|
+
|
219
|
+
##### ===== @primary_vsm_properties["luns"] = svm_get_luns_primary if check_connection_to_netapp("primary_cluster", "Refreshing luns on primary SVM")
|
220
|
+
if check_connection_to_netapp("primary_cluster", "Refreshing luns of primary SVM") then
|
221
|
+
#puts "sleeping for 10 sec: luns"
|
222
|
+
#sleep 10
|
223
|
+
#puts "end sleeping"
|
224
|
+
tmp = svm_get_luns_primary
|
225
|
+
if ! tmp.class.name.eql?("NilClass") then
|
226
|
+
@primary_vsm_properties["luns"] = tmp
|
227
|
+
else #! tmp.class.name.eql?("NilClass") then
|
228
|
+
|
229
|
+
end # ! tmp.class.name.eql?("NilClass") then
|
230
|
+
end
|
231
|
+
##### /===== @primary_vsm_properties["luns"] = svm_get_luns_primary if check_connection_to_netapp("primary_cluster", "Refreshing luns on primary SVM")
|
232
|
+
|
233
|
+
## periodical data lif checking
|
234
|
+
if check_connection_to_netapp("secondary_cluster", "Refreshing data lifs of secondary SVM") then
|
235
|
+
#puts "sleeping for 10 sec: data lifs"
|
236
|
+
#sleep 10
|
237
|
+
#puts "end sleeping"
|
238
|
+
|
239
|
+
secondary_svm_data_lifs = []
|
240
|
+
data_protocols = ["nfs","cifs","iscsi","fcp","fcache"]
|
241
|
+
tmp_error = false
|
242
|
+
data_protocols.each{ |protocol|
|
243
|
+
if ! tmp_error then
|
244
|
+
tmp = svm_get_data_lifs("secondary",protocol)
|
245
|
+
if ! tmp.class.name.eql?("NilClass") then
|
246
|
+
secondary_svm_data_lifs.concat(tmp)
|
247
|
+
else # if ! tmp.class.name.eql?("NilClass") then
|
248
|
+
tmp_error = true
|
249
|
+
end # if ! tmp.class.name.eql?("NilClass") then
|
250
|
+
end # if ! tmp_error then
|
251
|
+
}
|
252
|
+
@secondary_vsm_properties["data_lifs"] = secondary_svm_data_lifs if ! tmp_error
|
253
|
+
end # if check_connection_to_netapp("secondary_cluster", "Refreshing data lifs from secondary SVM") then
|
254
|
+
## data lif checking
|
255
|
+
|
256
|
+
end
|
257
|
+
|
258
|
+
|
259
|
+
|
260
|
+
end # fillup_svm_details(isfirst)
|
261
|
+
|
262
|
+
|
263
|
+
|
264
|
+
end # end class
|
265
|
+
|
data/config.json
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
{
|
2
|
+
"configs":[
|
3
|
+
{
|
4
|
+
"config_name":"config0",
|
5
|
+
"primary_site_name":"siteA",
|
6
|
+
"primary_ip":"X.X.X.X",
|
7
|
+
"primary_user":"admin",
|
8
|
+
"primary_password":"netapp_cluster_admin_password",
|
9
|
+
"secondary_ip":"Y.Y.Y.X",
|
10
|
+
"secondary_user":"admin",
|
11
|
+
"secondary_password":"netapp_cluster_admin_password",
|
12
|
+
"primary_svm":"NAME_OF_PRIMARY_SVM",
|
13
|
+
"secondary_svm":"NAME_OF_DR_SVM",
|
14
|
+
"primary_svm_user":"vsadmin",
|
15
|
+
"primary_svm_password":"netapp_cluster_vsadmin_password",
|
16
|
+
"secondary_svm_user":"vsadmin",
|
17
|
+
"secondary_svm_password":"netapp_cluster_vsadmin_password",
|
18
|
+
"fc_topology_check":true,
|
19
|
+
"ips_to_check_on_primary":
|
20
|
+
[
|
21
|
+
"X.X.X.X",
|
22
|
+
"X.X.X.Y",
|
23
|
+
"X.X.X.Z"
|
24
|
+
],
|
25
|
+
"ips_to_check_on_secondary":
|
26
|
+
[
|
27
|
+
"Y.Y.Y.X",
|
28
|
+
"Y.Y.Y.Y",
|
29
|
+
"Y.Y.Y.Z"
|
30
|
+
],
|
31
|
+
"ips_to_check_on_primary_from_secondary":
|
32
|
+
[
|
33
|
+
"X.X.X.X",
|
34
|
+
"X.X.X.Y",
|
35
|
+
"X.X.X.Z",
|
36
|
+
"Z.Z.Z.X",
|
37
|
+
"Z.Z.Z.Y",
|
38
|
+
"Z.Z.Z.Z"
|
39
|
+
],
|
40
|
+
"check_fc_switches_on_primary":
|
41
|
+
[
|
42
|
+
"FC_SWITCH_NAME_ON_PRIMARY_SITE#1",
|
43
|
+
"FC_SWITCH_NAME_ON_PRIMARY_SITE#2"
|
44
|
+
]
|
45
|
+
},
|
46
|
+
{
|
47
|
+
"config_name":"config1",
|
48
|
+
"primary_site_name":"siteB",
|
49
|
+
"primary_ip":"Y.Y.Y.X",
|
50
|
+
"primary_user":"admin",
|
51
|
+
"primary_password":"netapp_cluster_admin_password",
|
52
|
+
"secondary_ip":"X.X.X.X",
|
53
|
+
"secondary_user":"admin",
|
54
|
+
"secondary_password":"netapp_cluster_admin_password",
|
55
|
+
"primary_svm":"NAME_OF_PRIMARY_SVM",
|
56
|
+
"secondary_svm":"NAME_OF_DR_SVM",
|
57
|
+
"primary_svm_user":"vsadmin",
|
58
|
+
"primary_svm_password":"netapp_cluster_vsadmin_password",
|
59
|
+
"secondary_svm_user":"vsadmin",
|
60
|
+
"secondary_svm_password":"netapp_cluster_vsadmin_password",
|
61
|
+
"fc_topology_check":true,
|
62
|
+
"ips_to_check_on_primary":
|
63
|
+
[
|
64
|
+
"Y.Y.Y.X",
|
65
|
+
"Y.Y.Y.Y",
|
66
|
+
"Y.Y.Y.Z"
|
67
|
+
],
|
68
|
+
"ips_to_check_on_secondary":
|
69
|
+
[
|
70
|
+
"X.X.X.X",
|
71
|
+
"X.X.X.Y",
|
72
|
+
"X.X.X.Z"
|
73
|
+
],
|
74
|
+
"ips_to_check_on_primary_from_secondary":
|
75
|
+
[
|
76
|
+
"Y.Y.Y.X",
|
77
|
+
"Y.Y.Y.Y",
|
78
|
+
"Y.Y.Y.Z",
|
79
|
+
"Z.Z.Z.X",
|
80
|
+
"Z.Z.Z.Y",
|
81
|
+
"Z.Z.Z.Z"
|
82
|
+
],
|
83
|
+
"check_fc_switches_on_primary":
|
84
|
+
[
|
85
|
+
"FC_SWITCH_NAME_ON_PRIMARY_SITE#1",
|
86
|
+
"FC_SWITCH_NAME_ON_PRIMARY_SITE#2"
|
87
|
+
]
|
88
|
+
}
|
89
|
+
]
|
90
|
+
}
|
data/logs/config0.log
ADDED
File without changes
|
data/pids/pid
ADDED
File without changes
|
data/tiebreaker.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
$:.unshift File.dirname(__FILE__)
|
3
|
+
|
4
|
+
require 'daemons'
|
5
|
+
options = {
|
6
|
+
:dir => '../pids',
|
7
|
+
:ontop => true,
|
8
|
+
:logfilename => 'clog.log',
|
9
|
+
:output_logfilename => 'cout.txt'
|
10
|
+
}
|
11
|
+
|
12
|
+
Daemons.run(File.join(File.dirname(__FILE__), 'classes/main.rb'), options)
|
metadata
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tiebreaker
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Akos Kuczi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-03-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: net-ssh
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.0'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 3.0.2
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.0'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 3.0.2
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: net-ping
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '1.7'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 1.7.8
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '1.7'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 1.7.8
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: json
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '1.8'
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 1.8.1
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '1.8'
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 1.8.1
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: daemons
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '1.2'
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.2.3
|
83
|
+
type: :runtime
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.2'
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 1.2.3
|
93
|
+
description: Tiebreaker for NetApp SVM DR
|
94
|
+
email: akos.kuczi@dimensiondata.com
|
95
|
+
executables: []
|
96
|
+
extensions: []
|
97
|
+
extra_rdoc_files: []
|
98
|
+
files:
|
99
|
+
- "./classes/NaElement.rb"
|
100
|
+
- "./classes/NaErrno.rb"
|
101
|
+
- "./classes/NaServer.rb"
|
102
|
+
- "./classes/common.rb"
|
103
|
+
- "./classes/confreader.rb"
|
104
|
+
- "./classes/main.rb"
|
105
|
+
- "./classes/ntap.rb"
|
106
|
+
- "./classes/worker.rb"
|
107
|
+
- "./config.json"
|
108
|
+
- "./logs/config0.log"
|
109
|
+
- "./pids/pid"
|
110
|
+
- "./tiebreaker.rb"
|
111
|
+
homepage: http://www.dimensiondata.com
|
112
|
+
licenses:
|
113
|
+
- MIT
|
114
|
+
metadata: {}
|
115
|
+
post_install_message:
|
116
|
+
rdoc_options: []
|
117
|
+
require_paths:
|
118
|
+
- "./logs"
|
119
|
+
- "./pids"
|
120
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - ">="
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '0'
|
130
|
+
requirements: []
|
131
|
+
rubyforge_project:
|
132
|
+
rubygems_version: 2.4.8
|
133
|
+
signing_key:
|
134
|
+
specification_version: 4
|
135
|
+
summary: tiebreaker
|
136
|
+
test_files: []
|