vzcdn 0.1.0 → 0.1.1
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 +4 -4
- data/bin/ec +16 -0
- data/bin/vzcdn +8 -2
- data/lib/args.rb +280 -0
- data/lib/clui_config.rb +19 -90
- data/lib/command_proc.rb +2 -5
- data/lib/common.rb +4 -2
- data/lib/config_handler.rb +94 -0
- data/lib/config_reader.rb +2 -1
- data/lib/route.rb +59 -14
- data/lib/vzcdn.rb +4 -2
- data/lib/vzcdn/version.rb +1 -1
- data/lib/zone.rb +132 -14
- data/test/test_clui.rb +21 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c28ee09c103b4974e38dba49773a359e40ce951c
|
4
|
+
data.tar.gz: 5d0d324809e812c3ae1f72ade9eec631b9208ef7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bd6e695da176af1359ecd409a4d8f40b4ae5c3fc0e6af82060004ae7c3f6910b110d9a508977f396db78b82f48cad43ef10504e85a7ce1f5719c56f6e6234831
|
7
|
+
data.tar.gz: 7eeb4be4cf567de6ea2eab1e103c62d5897b09527c7d570b005c1c50b39ee3473301bed9d84310a48495e569517e99a1880fe8560bd571bae42e8aa9e3b163a7
|
data/bin/ec
ADDED
data/bin/vzcdn
CHANGED
@@ -1,10 +1,16 @@
|
|
1
|
-
|
1
|
+
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'vzcdn'
|
4
|
+
require 'vzcdn/version'
|
5
|
+
|
6
|
+
if ARGV[0] == "-v"
|
7
|
+
puts "vzcdn version:" + Vzcdn::VERSION
|
8
|
+
exit
|
9
|
+
end
|
4
10
|
|
5
11
|
args = []
|
6
12
|
ARGV.each { |arg|
|
7
13
|
args << arg
|
8
14
|
}
|
9
15
|
|
10
|
-
|
16
|
+
VzcdnApp.invoke(args)
|
data/lib/args.rb
ADDED
@@ -0,0 +1,280 @@
|
|
1
|
+
require_relative 'route'
|
2
|
+
|
3
|
+
class Arg
|
4
|
+
attr_accessor :desc, :required, :default, :validator, :name, :next_node, :value
|
5
|
+
|
6
|
+
def initialize(name, hash={ })
|
7
|
+
@name = name
|
8
|
+
hash.each {|k,v| instance_variable_set("@#{k}",v)}
|
9
|
+
end
|
10
|
+
|
11
|
+
# return true on success
|
12
|
+
# error message on failure
|
13
|
+
|
14
|
+
def validate?(value)
|
15
|
+
vclass = @validator.class
|
16
|
+
if vclass == Regexp
|
17
|
+
test = (value =~ @validator)
|
18
|
+
on_error = "Invalid Format for " + @name
|
19
|
+
elsif vclass == Array
|
20
|
+
test = @validator.include? value
|
21
|
+
on_error = "Invalid choice for " + @name + ", must be one of " + @validator.to_s
|
22
|
+
elsif vclass == Hash
|
23
|
+
test = @validator.has_key? value
|
24
|
+
on_error = "Invalid choice for " + @name + ", must be one of " + @validator.keys.to_s
|
25
|
+
elsif vclass == String
|
26
|
+
result = {}
|
27
|
+
Route.new.send("get_available_" + @validator).each { |hash|
|
28
|
+
result[hash["Name"]] = hash["Id"]
|
29
|
+
}
|
30
|
+
@validator = result
|
31
|
+
test = validate? value
|
32
|
+
if (test.class == String)
|
33
|
+
on_error = test
|
34
|
+
test = false
|
35
|
+
end
|
36
|
+
else
|
37
|
+
test = false
|
38
|
+
on_error = "unknown type of validator:" + @validator.to_s + ", class=" + @validator.class.to_s
|
39
|
+
end
|
40
|
+
if test
|
41
|
+
true
|
42
|
+
else
|
43
|
+
on_error
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
class Decision
|
49
|
+
attr_accessor :flow
|
50
|
+
|
51
|
+
def initialize(decider, *symbols)
|
52
|
+
@decider = decider
|
53
|
+
@tree = { }
|
54
|
+
symbols.each { |symbol|
|
55
|
+
@tree[symbol] = Flow.new(nil)
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
def chosen
|
60
|
+
vars = @flow.find(self)
|
61
|
+
arr = @decider.decide(vars, @tree.keys).map { |symbol|
|
62
|
+
@tree[symbol].root
|
63
|
+
}
|
64
|
+
arr
|
65
|
+
end
|
66
|
+
|
67
|
+
def children
|
68
|
+
@tree.values
|
69
|
+
end
|
70
|
+
|
71
|
+
def add(child, arg)
|
72
|
+
@tree[child].add arg
|
73
|
+
end
|
74
|
+
|
75
|
+
def to_s
|
76
|
+
result = "branch names:"
|
77
|
+
@tree.keys.each { |child|
|
78
|
+
result = result + child.to_s + " "
|
79
|
+
}
|
80
|
+
result += "\nbranches are of classes:"
|
81
|
+
@tree.keys.each { |child|
|
82
|
+
result = result + @tree[child].class.to_s + " "
|
83
|
+
}
|
84
|
+
result
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
class Flow
|
89
|
+
attr_reader :root
|
90
|
+
|
91
|
+
def initialize(root)
|
92
|
+
@root = root
|
93
|
+
end
|
94
|
+
|
95
|
+
def iargs(node, args)
|
96
|
+
if node.nil?
|
97
|
+
return args
|
98
|
+
end
|
99
|
+
if (node.class == Arg)
|
100
|
+
if node.value
|
101
|
+
new_args = args.clone
|
102
|
+
new_args[node.name] = node.value
|
103
|
+
args = new_args
|
104
|
+
end
|
105
|
+
iargs(node.next_node, args)
|
106
|
+
elsif (node.class == Decision)
|
107
|
+
node.chosen.each { |child|
|
108
|
+
return iargs(child, args)
|
109
|
+
}
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def ifind(elt, node, args)
|
114
|
+
if node.nil?
|
115
|
+
return nil
|
116
|
+
end
|
117
|
+
if (node == elt)
|
118
|
+
return args
|
119
|
+
elsif (node.class == Arg)
|
120
|
+
if node.value
|
121
|
+
new_args = args.clone
|
122
|
+
new_args[node.name] = node.value
|
123
|
+
args = new_args
|
124
|
+
end
|
125
|
+
ifind(elt, node.next_node, args)
|
126
|
+
elsif (node.class == Decision)
|
127
|
+
found = false
|
128
|
+
node.children.each { |child|
|
129
|
+
result = ifind(elt, child, args)
|
130
|
+
if (result)
|
131
|
+
return result
|
132
|
+
end
|
133
|
+
}
|
134
|
+
return nil
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
|
139
|
+
def find(elt)
|
140
|
+
return ifind(elt, @root, {})
|
141
|
+
end
|
142
|
+
|
143
|
+
# return true for success
|
144
|
+
# false for unable to find arg name
|
145
|
+
# String for invalid arg
|
146
|
+
|
147
|
+
def iset(name, value, node)
|
148
|
+
if node.nil?
|
149
|
+
return false
|
150
|
+
end
|
151
|
+
if (node.class == Arg )
|
152
|
+
if (node.name == name)
|
153
|
+
response = node.validate?(value)
|
154
|
+
if (response.class == String)
|
155
|
+
return response
|
156
|
+
else
|
157
|
+
node.value = value
|
158
|
+
return true
|
159
|
+
end
|
160
|
+
else
|
161
|
+
iset(name, value, node.next_node)
|
162
|
+
end
|
163
|
+
elsif (node.class == Decision)
|
164
|
+
result = false
|
165
|
+
node.children.each { |flow|
|
166
|
+
response = iset(name, value, flow.root)
|
167
|
+
if (response == true)
|
168
|
+
result = true
|
169
|
+
elsif (response.class == String)
|
170
|
+
return response
|
171
|
+
end
|
172
|
+
}
|
173
|
+
result
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
def set(name, value)
|
178
|
+
response = iset(name, value, @root)
|
179
|
+
if (response == false)
|
180
|
+
puts "ERROR: could not find argument with name " + name
|
181
|
+
elsif (response.class == String)
|
182
|
+
puts "ERROR: " + response
|
183
|
+
end
|
184
|
+
response
|
185
|
+
end
|
186
|
+
|
187
|
+
def iadd(arg, node)
|
188
|
+
if node.next_node.nil?
|
189
|
+
node.next_node = arg
|
190
|
+
else
|
191
|
+
iadd(arg, node.next_node)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
def add(arg)
|
196
|
+
if @root.nil?
|
197
|
+
@root = arg
|
198
|
+
else
|
199
|
+
iadd(arg, @root)
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
def to_s
|
204
|
+
args = iargs(@root, {})
|
205
|
+
args.each { |name, value|
|
206
|
+
puts name + ":" + value
|
207
|
+
}
|
208
|
+
end
|
209
|
+
|
210
|
+
def print_flow(node)
|
211
|
+
if node.nil?
|
212
|
+
return
|
213
|
+
end
|
214
|
+
result = node.name + " - " + node.desc
|
215
|
+
if (node.value)
|
216
|
+
result += ":" + node.value
|
217
|
+
end
|
218
|
+
puts result
|
219
|
+
print_flow(node.next_node)
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
|
224
|
+
def get_named(array, name)
|
225
|
+
array.each { |elt|
|
226
|
+
if elt.name == name
|
227
|
+
return elt
|
228
|
+
end
|
229
|
+
}
|
230
|
+
end
|
231
|
+
|
232
|
+
class HTTPDecider
|
233
|
+
def decide(args, children)
|
234
|
+
result = children
|
235
|
+
if (args.has_key? "type")
|
236
|
+
result =
|
237
|
+
if (args["type"] == "CNAME")
|
238
|
+
[:url]
|
239
|
+
else
|
240
|
+
[:ip]
|
241
|
+
end
|
242
|
+
end
|
243
|
+
result
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
http_decider = HTTPDecider.new
|
248
|
+
|
249
|
+
flow = Flow.new(Arg.new("root", desc: "description of method"))
|
250
|
+
flow.add(Arg.new("ttl", desc: "time to live in seconds", required: true, validator: /\A\d+\Z/))
|
251
|
+
flow.add(Arg.new("ipv", desc: "ip version", required: true, validator: "ip_versions"))
|
252
|
+
flow.add(Arg.new("type", desc: "record type", required: true, validator: ["A", "AAAA", "CNAME"]))
|
253
|
+
http_decision = Decision.new(http_decider, :ip, :url)
|
254
|
+
flow.add(http_decision)
|
255
|
+
http_decision.add(:ip, Arg.new("ip", desc: "IP address", required: false, validator: /\A\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\Z/))
|
256
|
+
http_decision.add(:url, Arg.new("url", desc: "URL of cname", required: false, validator: /.*/))
|
257
|
+
email = Arg.new("email", desc: "Email Address", required: false, validator: /.*/)
|
258
|
+
http_decision.add(:url, email)
|
259
|
+
http_decision.add(:ip, email)
|
260
|
+
|
261
|
+
http_decision.flow = flow
|
262
|
+
|
263
|
+
puts flow.to_s
|
264
|
+
|
265
|
+
def parse_line(line)
|
266
|
+
idx = line.index('=')
|
267
|
+
if (idx)
|
268
|
+
return line[0...idx], line[idx+1..-1]
|
269
|
+
else
|
270
|
+
line
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
ARGV.each { |arg|
|
275
|
+
name, value = parse_line(arg)
|
276
|
+
flow.set(name,value)
|
277
|
+
}
|
278
|
+
|
279
|
+
puts "after args:"
|
280
|
+
puts flow.to_s
|
data/lib/clui_config.rb
CHANGED
@@ -1,59 +1,11 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require_relative 'command_proc'
|
3
3
|
|
4
|
-
class
|
4
|
+
class ConfigCommand
|
5
5
|
include CommandProc
|
6
6
|
|
7
7
|
def initialize(name)
|
8
|
-
@
|
9
|
-
:init => "Initializes config file with <acct-num> and <token>.",
|
10
|
-
:get => "get a configuration parameter.",
|
11
|
-
:set => "set a configuration parameter."
|
12
|
-
}
|
13
|
-
end
|
14
|
-
|
15
|
-
CONFIG_DIRECTORY = ".vdms.d"
|
16
|
-
CONFIG_FILENAME = "config"
|
17
|
-
|
18
|
-
def get_config_file
|
19
|
-
if (! File.directory?(CONFIG_DIRECTORY))
|
20
|
-
FileUtils.mkdir(CONFIG_DIRECTORY)
|
21
|
-
end
|
22
|
-
CONFIG_DIRECTORY + File::SEPARATOR + CONFIG_FILENAME
|
23
|
-
end
|
24
|
-
|
25
|
-
def parse_line(line)
|
26
|
-
idx = line.index('=')
|
27
|
-
if (idx)
|
28
|
-
return line[0...idx], line[idx+1..-1]
|
29
|
-
else
|
30
|
-
line
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def replace_nv(name, value, new_file, old_file_contents)
|
35
|
-
new_config_line = name + '=' + value
|
36
|
-
wrote_line = false
|
37
|
-
old_file_contents.each { |line|
|
38
|
-
old_name, old_value = parse_line(line)
|
39
|
-
if (old_name == name)
|
40
|
-
new_file.puts(new_config_line)
|
41
|
-
wrote_line = true
|
42
|
-
else
|
43
|
-
new_file.puts(line)
|
44
|
-
end
|
45
|
-
}
|
46
|
-
if ( ! wrote_line)
|
47
|
-
new_file.puts(new_config_line)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def file_contents(filename)
|
52
|
-
if (File.file? filename)
|
53
|
-
File.open(filename, "r")
|
54
|
-
else
|
55
|
-
[]
|
56
|
-
end
|
8
|
+
@handler = ConfigHandler.new
|
57
9
|
end
|
58
10
|
|
59
11
|
def init(args)
|
@@ -61,42 +13,18 @@ class Configure
|
|
61
13
|
puts "usage: init <account-num> <token>"
|
62
14
|
puts "go to my.edgecast.com --> Settings to find it"
|
63
15
|
else
|
64
|
-
set(
|
65
|
-
set(
|
66
|
-
set(
|
16
|
+
@handler.set("acct-num", args[0])
|
17
|
+
@handler.set("token", args[1])
|
18
|
+
@handler.set("rest_base_url", "https://api.edgecast.com/v2/")
|
67
19
|
end
|
68
20
|
end
|
69
21
|
|
70
|
-
def load_config_values
|
71
|
-
if defined? @@config_values
|
72
|
-
return
|
73
|
-
else
|
74
|
-
@@config_values = {}
|
75
|
-
if (! File.file?(get_config_file))
|
76
|
-
return
|
77
|
-
end
|
78
|
-
File.open(get_config_file).each { |line|
|
79
|
-
line = line.strip
|
80
|
-
if line[0] == '#'
|
81
|
-
continue
|
82
|
-
end
|
83
|
-
name, value = parse_line(line)
|
84
|
-
if value
|
85
|
-
@@config_values[name] = value
|
86
|
-
end
|
87
|
-
}
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def self.config_parameter(name)
|
92
|
-
instance = get_instance(nil)
|
93
|
-
instance.load_config_values
|
94
|
-
result = @@config_values[name]
|
95
|
-
result = result ? result : ""
|
96
|
-
end
|
97
|
-
|
98
22
|
def get(args)
|
99
|
-
|
23
|
+
if (args.length != 1)
|
24
|
+
puts "usage: get <name>"
|
25
|
+
error
|
26
|
+
end
|
27
|
+
puts @handler.get(args[0])
|
100
28
|
end
|
101
29
|
|
102
30
|
def set(args)
|
@@ -104,13 +32,14 @@ class Configure
|
|
104
32
|
puts "usage: set <name> <value>"
|
105
33
|
error
|
106
34
|
end
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
35
|
+
@handler.set(args[0], args[1])
|
36
|
+
end
|
37
|
+
|
38
|
+
def delete(args)
|
39
|
+
if (args.length != 1)
|
40
|
+
puts "usage: delete <name>"
|
41
|
+
error
|
42
|
+
end
|
43
|
+
@handler.delete(args[0])
|
115
44
|
end
|
116
45
|
end
|
data/lib/command_proc.rb
CHANGED
@@ -1,8 +1,4 @@
|
|
1
|
-
require_relative 'config_reader'
|
2
|
-
|
3
1
|
module CommandProc
|
4
|
-
include ConfigReader
|
5
|
-
|
6
2
|
def help(args)
|
7
3
|
puts "Available commands:"
|
8
4
|
@usage.each { |method|
|
@@ -48,7 +44,8 @@ module CommandProc
|
|
48
44
|
else
|
49
45
|
name = command
|
50
46
|
instance = get_instance(name)
|
51
|
-
|
47
|
+
command = args.shift
|
48
|
+
instance.send(command, args)
|
52
49
|
end
|
53
50
|
end
|
54
51
|
|
data/lib/common.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
require 'rest_client'
|
2
2
|
require 'json'
|
3
|
+
require 'config_reader'
|
3
4
|
|
4
5
|
class CommonRestUtils
|
6
|
+
include ConfigReader
|
5
7
|
def callMethod(url_suffix, http_method, body=nil)
|
6
8
|
url = @uri_prefix + url_suffix
|
7
9
|
if (body)
|
@@ -40,12 +42,12 @@ class CommonRestUtils
|
|
40
42
|
|
41
43
|
def initialize(uri_prefix)
|
42
44
|
@uri_prefix = uri_prefix
|
43
|
-
proxy =
|
45
|
+
proxy = param("proxy")
|
44
46
|
if proxy != ""
|
45
47
|
RestClient.proxy = proxy
|
46
48
|
end
|
47
49
|
@headers = {:Content_type => "Application/json",
|
48
|
-
:Authorization => "TOK:" +
|
50
|
+
:Authorization => "TOK:" + param("token"),
|
49
51
|
:Accept => "Application/json"}
|
50
52
|
end
|
51
53
|
|
@@ -0,0 +1,94 @@
|
|
1
|
+
class ConfigHandler
|
2
|
+
CONFIG_DIRECTORY = ".vdms.d"
|
3
|
+
CONFIG_FILENAME = "config"
|
4
|
+
|
5
|
+
def get_config_file
|
6
|
+
if (! File.directory?(CONFIG_DIRECTORY))
|
7
|
+
FileUtils.mkdir(CONFIG_DIRECTORY)
|
8
|
+
end
|
9
|
+
CONFIG_DIRECTORY + File::SEPARATOR + CONFIG_FILENAME
|
10
|
+
end
|
11
|
+
|
12
|
+
def parse_line(line)
|
13
|
+
idx = line.index('=')
|
14
|
+
if (idx)
|
15
|
+
return line[0...idx], line[idx+1..-1]
|
16
|
+
else
|
17
|
+
line
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def replace_nv(name, value, new_file, old_file_contents)
|
22
|
+
new_config_line = name + '=' + value
|
23
|
+
wrote_line = false
|
24
|
+
old_file_contents.each { |line|
|
25
|
+
old_name, old_value = parse_line(line)
|
26
|
+
if (old_name == name)
|
27
|
+
if ! value.nil?
|
28
|
+
new_file.puts(new_config_line)
|
29
|
+
end
|
30
|
+
wrote_line = true
|
31
|
+
else
|
32
|
+
new_file.puts(line)
|
33
|
+
end
|
34
|
+
}
|
35
|
+
if ( ! wrote_line)
|
36
|
+
new_file.puts(new_config_line)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def file_contents(filename)
|
41
|
+
if (File.file? filename)
|
42
|
+
File.open(filename, "r")
|
43
|
+
else
|
44
|
+
[]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def load_config_values
|
49
|
+
if defined? @@config_values
|
50
|
+
return
|
51
|
+
else
|
52
|
+
@@config_values = {}
|
53
|
+
if (! File.file?(get_config_file))
|
54
|
+
return
|
55
|
+
end
|
56
|
+
File.open(get_config_file).each { |line|
|
57
|
+
line = line.strip
|
58
|
+
if line[0] == '#'
|
59
|
+
continue
|
60
|
+
end
|
61
|
+
name, value = parse_line(line)
|
62
|
+
if value
|
63
|
+
@@config_values[name] = value
|
64
|
+
end
|
65
|
+
}
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.config_parameter(name)
|
70
|
+
instance = ConfigHandler.new
|
71
|
+
instance.load_config_values
|
72
|
+
result = @@config_values[name]
|
73
|
+
result = result ? result : ""
|
74
|
+
end
|
75
|
+
|
76
|
+
def get(name)
|
77
|
+
load_config_values
|
78
|
+
@@config_values[name]
|
79
|
+
end
|
80
|
+
|
81
|
+
def set(name, value)
|
82
|
+
config_file = get_config_file
|
83
|
+
new_config_file = config_file + ".tmp"
|
84
|
+
updated_file = File.open(new_config_file, "w")
|
85
|
+
replace_nv(name, value, updated_file, file_contents(config_file))
|
86
|
+
updated_file.close
|
87
|
+
FileUtils.mv(new_config_file, config_file, :force => true)
|
88
|
+
end
|
89
|
+
|
90
|
+
def delete(name)
|
91
|
+
set(name, nil)
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
data/lib/config_reader.rb
CHANGED
data/lib/route.rb
CHANGED
@@ -1,12 +1,24 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
require_relative '
|
2
|
+
require_relative 'config_reader'
|
3
|
+
require_relative 'common'
|
3
4
|
require 'pp'
|
4
5
|
|
5
6
|
class Route
|
6
7
|
include ConfigReader
|
7
8
|
|
9
|
+
@@instance = nil
|
10
|
+
|
11
|
+
def self.do
|
12
|
+
if @@instance
|
13
|
+
@@instance
|
14
|
+
else
|
15
|
+
@@instance = Route.new
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
8
19
|
def initialize
|
9
20
|
@common = CommonRestUtils.new(param("rest_base_url") + "mcc/")
|
21
|
+
@availables = { }
|
10
22
|
end
|
11
23
|
|
12
24
|
def customer_suffix(suffix)
|
@@ -31,52 +43,85 @@ class Route
|
|
31
43
|
|
32
44
|
def get_zone(id, name)
|
33
45
|
suffix = "dns/routezone?id=" + id + "&name=" + name
|
34
|
-
callMethod(customer_suffix(suffix), :get)
|
46
|
+
@common.callMethod(customer_suffix(suffix), :get)
|
35
47
|
end
|
36
48
|
|
37
49
|
def copy_zone(from, to)
|
38
50
|
suffix = customer_suffix("dns/routezone/copy")
|
39
51
|
body = {:FromDomainName => from, :ToDomainName => to}
|
40
|
-
callMethod(suffix, :post, body)
|
52
|
+
@common.callMethod(suffix, :post, body)
|
41
53
|
end
|
42
54
|
|
43
55
|
def delete_zone(id)
|
44
56
|
suffix = customer_suffix("dns/routezone/" + id)
|
45
|
-
callMethod(suffix, :delete)
|
57
|
+
@common.callMethod(suffix, :delete)
|
46
58
|
end
|
47
59
|
|
48
60
|
def add_zone()
|
49
61
|
end
|
50
62
|
|
63
|
+
def xlate_name(symbol, name)
|
64
|
+
get_available(symbol).each { |hash|
|
65
|
+
if hash["Name"] == name
|
66
|
+
return hash["Id"]
|
67
|
+
end
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
def xlate_id(symbol, id)
|
72
|
+
get_available(symbol).each { |hash|
|
73
|
+
if hash["Id"] == id
|
74
|
+
return hash["Name"]
|
75
|
+
end
|
76
|
+
}
|
77
|
+
end
|
78
|
+
|
79
|
+
def get_available(data)
|
80
|
+
if @availables[data]
|
81
|
+
@availables[data]
|
82
|
+
else
|
83
|
+
suffix =
|
84
|
+
{:zone_type => "routezonetypes",
|
85
|
+
:record_type => "routezonerecordtypes",
|
86
|
+
:zone_status => "routezonestatus",
|
87
|
+
:route_group => "routegrouptypes",
|
88
|
+
:http_method => "routehttpmethodtypes",
|
89
|
+
:ip_version => "routehealthcheckipversion",
|
90
|
+
:hc_type => "routehealthchecktypes",
|
91
|
+
:hc_rm => "routereintegrationmethodtypes"}[data]
|
92
|
+
@availables[data] = @common.callMethod(non_customer_suffix(suffix), :get)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
51
96
|
def get_available_zone_types()
|
52
|
-
|
97
|
+
get_available(:zone_type)
|
53
98
|
end
|
54
99
|
|
55
100
|
def get_available_record_types()
|
56
|
-
|
101
|
+
get_available(:record_type, "routezonerecordtypes")
|
57
102
|
end
|
58
103
|
|
59
104
|
def get_available_zone_statuses()
|
60
|
-
|
105
|
+
get_available(:zone_status, "routezonestatus")
|
61
106
|
end
|
62
107
|
|
63
108
|
def get_available_route_groups()
|
64
|
-
|
109
|
+
get_available(:route_group, "routegrouptypes")
|
65
110
|
end
|
66
111
|
|
67
112
|
def get_available_http_methods()
|
68
|
-
|
113
|
+
get_available(:http_method, "routehttpmethodtypes")
|
69
114
|
end
|
70
115
|
|
71
116
|
def get_available_ip_versions()
|
72
|
-
|
117
|
+
get_available(:ip_version, "routehealthcheckipversion")
|
73
118
|
end
|
74
119
|
|
75
|
-
def
|
76
|
-
|
120
|
+
def get_available_hc_types()
|
121
|
+
get_available(:hc_type, "routehealthchecktypes")
|
77
122
|
end
|
78
123
|
|
79
|
-
def
|
80
|
-
|
124
|
+
def get_available_hc_rm()
|
125
|
+
get_available(:hc_rm, "routereintegrationmethodtypes")
|
81
126
|
end
|
82
127
|
end
|
data/lib/vzcdn.rb
CHANGED
@@ -3,7 +3,7 @@ require_relative 'command_proc'
|
|
3
3
|
require_relative 'clui_config'
|
4
4
|
require_relative 'zone'
|
5
5
|
|
6
|
-
class
|
6
|
+
class VzcdnApp
|
7
7
|
include CommandProc
|
8
8
|
|
9
9
|
def initialize(name)
|
@@ -11,6 +11,8 @@ class Vzcdn
|
|
11
11
|
:zone => "zone related command",
|
12
12
|
:config => "config related command"
|
13
13
|
}
|
14
|
+
@argtree = [ {:name => "zone", :usage => "zone related commands", :args=>[]},
|
15
|
+
{:name => "config", :usage => "config related commands", :args=>[]}]
|
14
16
|
end
|
15
17
|
|
16
18
|
def zone(args)
|
@@ -18,7 +20,7 @@ class Vzcdn
|
|
18
20
|
end
|
19
21
|
|
20
22
|
def config(args)
|
21
|
-
|
23
|
+
ConfigCommand.invoke(args)
|
22
24
|
end
|
23
25
|
end
|
24
26
|
|
data/lib/vzcdn/version.rb
CHANGED
data/lib/zone.rb
CHANGED
@@ -4,38 +4,156 @@ class Zone
|
|
4
4
|
include CommandProc
|
5
5
|
|
6
6
|
def initialize(name)
|
7
|
+
@lines = nil
|
7
8
|
@zname = name
|
8
9
|
@usage = { :list => "list zones"}
|
9
|
-
|
10
|
+
@argflows = [ {:name => "list", :usage => "list zones", :args=>[]},
|
11
|
+
{:name => "add", :usage => "", :args=>[]}]
|
10
12
|
end
|
11
13
|
|
12
14
|
def list(args)
|
13
15
|
if @zname
|
14
16
|
puts "unimplemented"
|
15
17
|
else
|
16
|
-
zones = Route.
|
17
|
-
|
18
|
-
lines << ["ZONE", "ID"]
|
18
|
+
zones = Route.do.get_all_zones
|
19
|
+
pp_table_start("ZONE", "ID", "STATUS")
|
19
20
|
zones.each {|zone|
|
20
|
-
|
21
|
+
pp_table_append(zone["DomainName"], zone["ZoneId"].to_s, Route.do.xlate_id(:zone_status, zone["Status"]))
|
22
|
+
}
|
23
|
+
pp_table
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def structure_print(struct, args, header)
|
28
|
+
if (struct.class == Array)
|
29
|
+
# puts "printing array of " + struct.length.to_s + " elts"
|
30
|
+
struct.each { |elt|
|
31
|
+
# puts "calling struct_print with header = " + header.to_s + ", and elt = " + elt.to_s
|
32
|
+
structure_print(elt, args, header)
|
33
|
+
header = false
|
34
|
+
}
|
35
|
+
elsif (struct.class == Hash)
|
36
|
+
if (args.length == 0)
|
37
|
+
# print top level elements of hash
|
38
|
+
if (header)
|
39
|
+
pp_table_start_cols struct.keys
|
40
|
+
end
|
41
|
+
values = []
|
42
|
+
struct.keys.each { |key|
|
43
|
+
value = struct[key]
|
44
|
+
if (value.class == Array)
|
45
|
+
value = value.length.to_s + " elements"
|
46
|
+
elsif (value.class == String)
|
47
|
+
elsif (value.class == Fixnum)
|
48
|
+
value = value.to_s
|
49
|
+
elsif (value.class == Hash)
|
50
|
+
value = "object"
|
51
|
+
else
|
52
|
+
value = "<" + value.class.to_s + ">"
|
53
|
+
end
|
54
|
+
values << value
|
21
55
|
}
|
22
|
-
|
56
|
+
pp_table_append_cols(values)
|
57
|
+
else
|
58
|
+
key = args.shift
|
59
|
+
structure_print(struct[key], args, header)
|
60
|
+
end
|
61
|
+
else
|
62
|
+
if (args.length == 0)
|
63
|
+
puts struct.to_s
|
64
|
+
else
|
65
|
+
puts "unknown class <" + struct.class.to_s + ">"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def print(args)
|
71
|
+
if @zname
|
72
|
+
if @zname =~ /\d+/
|
73
|
+
zone = Route.do.get_zone(@zname, "")
|
74
|
+
else
|
75
|
+
zone = Route.do.get_zone("", @zname)
|
76
|
+
end
|
77
|
+
if (args.length > 0 && args[0] == "-l")
|
78
|
+
puts JSON.pretty_generate(zone)
|
79
|
+
else
|
80
|
+
structure_print(zone, args, true)
|
81
|
+
pp_table
|
82
|
+
end
|
83
|
+
else
|
84
|
+
puts "pull command needs zone name or id"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def add(args)
|
89
|
+
if @zname
|
90
|
+
puts "unimplemented"
|
91
|
+
else
|
92
|
+
@zone = {
|
93
|
+
:Comment => "",
|
94
|
+
:DomainName => @zname,
|
95
|
+
:FailoverGroups => [ ],
|
96
|
+
:LoadBalancingGroups => [ ],
|
97
|
+
:Records => null,
|
98
|
+
:Status => 1,
|
99
|
+
:ZoneType => 1
|
100
|
+
}
|
101
|
+
|
23
102
|
end
|
24
103
|
end
|
25
104
|
|
26
|
-
def
|
27
|
-
|
105
|
+
def char_repeat(n, char)
|
106
|
+
result = ""
|
107
|
+
(1..n).each { |i|
|
108
|
+
result = result + char
|
109
|
+
}
|
110
|
+
result
|
111
|
+
end
|
112
|
+
|
113
|
+
def spaces(n)
|
114
|
+
char_repeat(n, ' ')
|
115
|
+
end
|
116
|
+
|
117
|
+
def pp_table_start_cols(titles)
|
118
|
+
@lines = []
|
119
|
+
@lines << titles
|
120
|
+
separator = []
|
121
|
+
titles.each { |title|
|
122
|
+
separator << char_repeat(title.length, '-')
|
123
|
+
}
|
124
|
+
@lines << separator
|
125
|
+
end
|
126
|
+
|
127
|
+
def pp_table_start(*titles)
|
128
|
+
pp_table_start_cols(titles)
|
129
|
+
end
|
130
|
+
|
131
|
+
def pp_table_append_cols(columns)
|
132
|
+
@lines << columns
|
133
|
+
end
|
134
|
+
|
135
|
+
def pp_table_append(*columns)
|
136
|
+
@lines << columns
|
137
|
+
end
|
138
|
+
|
139
|
+
def pp_table
|
140
|
+
if @lines.nil?
|
141
|
+
return
|
142
|
+
end
|
143
|
+
ncols = @lines[0].length
|
28
144
|
maxwidths = Array.new(ncols, 0)
|
29
|
-
lines.each { |line|
|
145
|
+
@lines.each { |line|
|
30
146
|
line.each_with_index { |col, index|
|
31
|
-
maxwidths[index] = [col.length, maxwidths[index]].max
|
147
|
+
maxwidths[index] = [col.to_s.length, maxwidths[index]].max
|
32
148
|
}
|
33
149
|
}
|
34
|
-
lines.each { |line|
|
150
|
+
@lines.each { |line|
|
151
|
+
output = ""
|
35
152
|
line.each_with_index {|col, index|
|
36
|
-
|
37
|
-
|
38
|
-
|
153
|
+
output = output + col.to_s + spaces(maxwidths[index] - col.to_s.length + 2)
|
154
|
+
}
|
155
|
+
puts output
|
39
156
|
}
|
157
|
+
@lines = nil
|
40
158
|
end
|
41
159
|
end
|
data/test/test_clui.rb
CHANGED
@@ -1,8 +1,28 @@
|
|
1
1
|
require 'clui_config'
|
2
|
+
require 'route'
|
2
3
|
require 'test/unit'
|
4
|
+
require 'tmpdir'
|
5
|
+
require 'tempfile'
|
3
6
|
|
4
7
|
class TestClui < Test::Unit::TestCase
|
5
8
|
def test_config
|
6
|
-
|
9
|
+
Dir.mktmpdir do |dir|
|
10
|
+
Dir.chdir(dir)
|
11
|
+
`ec config init BED3 e22db149-7369-4d7b-9c53-38d38746ccea`
|
12
|
+
assert(File.directory?(".vdms.d"), "missing .vdms.d directory")
|
13
|
+
assert(File.exists?(".vdms.d/config"), "missing config file")
|
14
|
+
assert_equal("BED3", `ec config get acct-num`.chomp, "get account-num failed")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
def ctest_availables
|
18
|
+
route = Route.new
|
19
|
+
puts "zone types:" + route.get_available_zone_types.to_s
|
20
|
+
puts "record types:" + route.get_available_record_types.to_s
|
21
|
+
puts "zone status:" + route.get_available_zone_statuses.to_s
|
22
|
+
puts "route groups:" + route.get_available_route_groups.to_s
|
23
|
+
puts "http:" + route.get_available_http_methods.to_s
|
24
|
+
puts "ip vers:" + route.get_available_ip_versions.to_s
|
25
|
+
puts "hc types:" + route.get_available_health_check_types.to_s
|
26
|
+
puts "hc reints:" + route.get_available_health_check_reintegration_methods.to_s
|
7
27
|
end
|
8
28
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vzcdn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steve Preston
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-03
|
13
|
+
date: 2014-04-03 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rest-client
|
@@ -60,6 +60,7 @@ email:
|
|
60
60
|
- thomas.goes@verizon.com
|
61
61
|
- nitin.khanna@verizon.com
|
62
62
|
executables:
|
63
|
+
- ec
|
63
64
|
- vzcdn
|
64
65
|
extensions: []
|
65
66
|
extra_rdoc_files: []
|
@@ -68,10 +69,13 @@ files:
|
|
68
69
|
- LICENSE.txt
|
69
70
|
- README.md
|
70
71
|
- Rakefile
|
72
|
+
- bin/ec
|
71
73
|
- bin/vzcdn
|
74
|
+
- lib/args.rb
|
72
75
|
- lib/clui_config.rb
|
73
76
|
- lib/command_proc.rb
|
74
77
|
- lib/common.rb
|
78
|
+
- lib/config_handler.rb
|
75
79
|
- lib/config_reader.rb
|
76
80
|
- lib/mediaManagment.rb
|
77
81
|
- lib/realTimeStats.rb
|