vzcdn 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fa03b9dd6ce28e23205b0fcd1566161f77f7a645
4
- data.tar.gz: 2f80cd48ef0370d6883f88e00577c49949cd8189
3
+ metadata.gz: 17369072c6982f75c6051118810f9a5a2ff1360f
4
+ data.tar.gz: 5b5b170030343d0c6cef577dec0e4749a80d5641
5
5
  SHA512:
6
- metadata.gz: 42954d3a9a42f74f425badf5affbc7786d15f7c932b6c1b00681a19c751455f50af9609354fe1c759b510f714d733944c4d325ea66d29b8846e3391c0da7f191
7
- data.tar.gz: 7aeb9bd7874345bd38a610f4f715c0ac85382db9a0fc3e14734e70f76c45d8a9587beab5a955e69c702eacc8f15370e3f48c84ada71ec54b293fe44a853d991d
6
+ metadata.gz: 87b87d36051c63cb48c92824bae3f2993040f17ba15b02acd0740621c2a49c9b4cc67c38ddff91f16da1c7c5b535c6a6e3f7bcf908edfb397fe0cd7cc2734ac2
7
+ data.tar.gz: a66b939d4ffdf552500f46546e960a5bb9b621909a9f77400be7756a377036ea5739a9f612d754e51dd281e2a379e6d986aecbed28e70df161df870de38fc3b7
data/bin/ec CHANGED
@@ -8,9 +8,26 @@ if ARGV[0] == "-v"
8
8
  exit
9
9
  end
10
10
 
11
+ if ARGV[0] == "-d"
12
+ $debug = true
13
+ ARGV.shift
14
+ else
15
+ $debug = false
16
+ end
17
+
11
18
  args = []
12
19
  ARGV.each { |arg|
13
20
  args << arg
14
21
  }
15
22
 
16
- VzcdnApp.invoke(args)
23
+ begin
24
+ VzcdnApp.invoke(args)
25
+ rescue Exception => e
26
+ if e.class != SystemExit
27
+ puts "ERROR:" + e.message
28
+ if $debug
29
+ raise e
30
+ else
31
+ end
32
+ end
33
+ end
data/bin/vzcdn CHANGED
@@ -8,9 +8,26 @@ if ARGV[0] == "-v"
8
8
  exit
9
9
  end
10
10
 
11
+ if ARGV[0] == "-d"
12
+ $debug = true
13
+ ARGV.shift
14
+ else
15
+ $debug = false
16
+ end
17
+
11
18
  args = []
12
19
  ARGV.each { |arg|
13
20
  args << arg
14
21
  }
15
22
 
16
- VzcdnApp.invoke(args)
23
+ begin
24
+ VzcdnApp.invoke(args)
25
+ rescue Exception => e
26
+ if e.class != SystemExit
27
+ puts "ERROR:" + e.message
28
+ if $debug
29
+ raise e
30
+ else
31
+ end
32
+ end
33
+ end
@@ -218,63 +218,21 @@ class Flow
218
218
  puts result
219
219
  print_flow(node.next_node)
220
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
221
 
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
222
+ def parse_line(line)
223
+ idx = line.index('=')
224
+ if (idx)
225
+ return line[0...idx], line[idx+1..-1]
226
+ else
227
+ line
242
228
  end
243
- result
244
229
  end
245
- end
246
230
 
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
231
+ def parse(args)
232
+ args.each { |arg|
233
+ name, value = parse_line(arg)
234
+ set(name, value)
235
+ }
271
236
  end
272
- end
273
237
 
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
238
+ end
@@ -41,15 +41,16 @@ module CommandProc
41
41
  end
42
42
  if instance.respond_to?(command)
43
43
  instance.send(command, args)
44
- else
44
+ elsif args.length >= 1 && instance.respond_to?(args[0])
45
45
  name = command
46
46
  instance = get_instance(name)
47
47
  command = args.shift
48
48
  instance.send(command, args)
49
+ else
50
+ puts "argument '" + command + "' not recognized as command"
49
51
  end
50
52
  end
51
-
52
- end
53
-
54
53
 
54
+ end
55
+
55
56
  end
@@ -23,20 +23,23 @@ class CommonRestUtils
23
23
  else
24
24
  "unsupported http method:" + http_method
25
25
  end
26
- rescue RestClient::Exception => e
27
- puts "URL is:" + url
28
- if (body)
29
- puts "body is: json_body"
26
+ rescue Exception => e
27
+ puts "Unable to connect to REST server " + param("rest_base_url")
28
+ if $debug
29
+ puts "full URL is:" + url
30
+ if (body)
31
+ puts "body is: json_body"
32
+ end
30
33
  end
31
- raise("Exception occurred:" + e.message)
34
+ raise e.message + " (" + e.class.to_s + ")"
32
35
  end
33
- if (response.code != 200)
36
+ if ( ! response.nil? && response.respond_to?(:code) && response.code != 200)
34
37
  raise "Bad response code:" + response.code.to_s
35
38
  end
36
39
  if (response.length > 0)
37
40
  JSON.parse response
38
41
  else
39
- response
42
+ nil
40
43
  end
41
44
  end
42
45
 
@@ -18,10 +18,10 @@ class ConfigHandler
18
18
  end
19
19
  end
20
20
 
21
- def replace_nv(name, value, new_file, old_file_contents)
22
- new_config_line = name + '=' + value
21
+ def replace_nv(name, value, new_file, orig_file)
22
+ new_config_line = name + '=' + value.to_s
23
23
  wrote_line = false
24
- old_file_contents.each { |line|
24
+ orig_file.each { |line|
25
25
  old_name, old_value = parse_line(line)
26
26
  if (old_name == name)
27
27
  if ! value.nil?
@@ -37,14 +37,6 @@ class ConfigHandler
37
37
  end
38
38
  end
39
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
40
  def load_config_values
49
41
  if defined? @@config_values
50
42
  return
@@ -80,10 +72,16 @@ class ConfigHandler
80
72
 
81
73
  def set(name, value)
82
74
  config_file = get_config_file
75
+ if ! File.exists? config_file
76
+ # make empty file
77
+ File.open(config_file, "w").close
78
+ end
83
79
  new_config_file = config_file + ".tmp"
84
80
  updated_file = File.open(new_config_file, "w")
85
- replace_nv(name, value, updated_file, file_contents(config_file))
81
+ orig_file = File.open(config_file)
82
+ replace_nv(name, value, updated_file, orig_file)
86
83
  updated_file.close
84
+ orig_file.close
87
85
  FileUtils.rm(config_file, force: true)
88
86
  FileUtils.mv(new_config_file, config_file, :force => true)
89
87
  end
@@ -3,4 +3,20 @@ module ConfigReader
3
3
  def param(name)
4
4
  ConfigHandler.config_parameter(name)
5
5
  end
6
+
7
+ def config_dir
8
+ ConfigHandler::CONFIG_DIRECTORY
9
+ end
10
+
11
+ def mkdir(*dirs)
12
+ path = config_file(*dirs)
13
+ if ! Dir.exists?(path)
14
+ Dir.mkdir path
15
+ end
16
+ path
17
+ end
18
+
19
+ def config_file(*dirs_file)
20
+ File.join(config_dir, *dirs_file)
21
+ end
6
22
  end
@@ -1,7 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  require_relative 'config_reader'
3
3
  require_relative 'common'
4
- require 'pp'
5
4
 
6
5
  class Route
7
6
  include ConfigReader
@@ -17,7 +16,11 @@ class Route
17
16
  end
18
17
 
19
18
  def initialize
20
- @common = CommonRestUtils.new(param("rest_base_url") + "mcc/")
19
+ rest_base_url = param("rest_base_url")
20
+ if (rest_base_url.nil? || rest_base_url.length == 0)
21
+ raise "configuration file does not contain expected parameters -- try config init"
22
+ end
23
+ @common = CommonRestUtils.new(rest_base_url + "mcc/")
21
24
  @availables = { }
22
25
  end
23
26
 
@@ -42,9 +45,80 @@ class Route
42
45
  end
43
46
 
44
47
  def get_zone(id, name)
45
- suffix = "dns/routezone?id=" + id + "&name=" + name
48
+ suffix = "dns/routezone?"
49
+ if id
50
+ suffix = suffix + "id=" + id.to_s
51
+ else
52
+ suffix = suffix + "name=" + name
53
+ end
46
54
  @common.callMethod(customer_suffix(suffix), :get)
47
55
  end
56
+
57
+ def translate_value(data, hash, key)
58
+ if hash.has_key?(key)
59
+ hash[key] = xlate_id(data, hash[key])
60
+ end
61
+ end
62
+
63
+ def untranslate_value(data, hash, key)
64
+ if hash.has_key?(key)
65
+ hash[key] = xlate_name(data, hash[key])
66
+ end
67
+ end
68
+
69
+ def translate_hc(rec_array)
70
+ rec_array.each { |rec|
71
+ hc = rec["HealthCheck"]
72
+ translate_value(:hc_type, hc, "CheckTypeId")
73
+ translate_value(:http_method, hc, "HTTPMethodId")
74
+ translate_value(:ip_version, hc, "IPVersion")
75
+ translate_value(:hc_rm, hc, "ReintegrationMethodId")
76
+ }
77
+ end
78
+
79
+ def untranslate_hc(rec_array)
80
+ rec_array.each { |rec|
81
+ hc = rec["HealthCheck"]
82
+ untranslate_value(:hc_type, hc, "CheckTypeId")
83
+ untranslate_value(:http_method, hc, "HTTPMethodId")
84
+ untranslate_value(:ip_version, hc, "IPVersion")
85
+ untranslate_value(:hc_rm, hc, "ReintegrationMethodId")
86
+ }
87
+ end
88
+
89
+ def translate_groups(group_array)
90
+ group_array.each { |group|
91
+ group_element = group["Group"]
92
+ ["A", "AAAA", "CNAME"].each { |record_type|
93
+ translate_hc(group_element[record_type])
94
+ }
95
+ }
96
+ end
97
+
98
+ def untranslate_groups(group_array)
99
+ group_array.each { |group|
100
+ group_element = group["Group"]
101
+ ["A", "AAAA", "CNAME"].each { |record_type|
102
+ untranslate_hc(group_element[record_type])
103
+ }
104
+ }
105
+ end
106
+
107
+ def translate_zone(zone)
108
+ return nil if zone.nil?
109
+ translate_value(:zone_status, zone, "Status")
110
+ translate_value(:zone_type, zone, "ZoneType")
111
+ translate_groups zone["LoadBalancingGroups"]
112
+ translate_groups zone["FailoverGroups"]
113
+ end
114
+
115
+ def untranslate_zone(zone)
116
+ return nil if zone.nil?
117
+ untranslate_value(:zone_status, zone, "Status")
118
+ untranslate_value(:zone_type, zone, "ZoneType")
119
+ untranslate_groups zone["LoadBalancingGroups"]
120
+ untranslate_groups zone["FailoverGroups"]
121
+ end
48
122
 
49
123
  def copy_zone(from, to)
50
124
  suffix = customer_suffix("dns/routezone/copy")
@@ -59,6 +133,11 @@ class Route
59
133
 
60
134
  def add_zone()
61
135
  end
136
+
137
+ def update_zone(zone)
138
+ suffix = customer_suffix("dns/routezone")
139
+ @common.callMethod(suffix, :put, zone)
140
+ end
62
141
 
63
142
  def xlate_name(symbol, name)
64
143
  get_available(symbol).each { |hash|
@@ -76,9 +155,25 @@ class Route
76
155
  }
77
156
  end
78
157
 
158
+ def cache_filename(data)
159
+ config_file(data.to_s + ".data")
160
+ end
161
+
162
+ def available_file(data)
163
+ fname = cache_filename(data)
164
+ if File.exists?(fname)
165
+ days_old = (Time.new - File.mtime(fname)) / (24*60*60)
166
+ if days_old < 7.0
167
+ fname
168
+ end
169
+ end
170
+ end
171
+
79
172
  def get_available(data)
80
173
  if @availables[data]
81
174
  @availables[data]
175
+ elsif available_file(data)
176
+ @availables[data] = JSON.parse File.read(cache_filename(data))
82
177
  else
83
178
  suffix =
84
179
  {:zone_type => "routezonetypes",
@@ -89,7 +184,9 @@ class Route
89
184
  :ip_version => "routehealthcheckipversion",
90
185
  :hc_type => "routehealthchecktypes",
91
186
  :hc_rm => "routereintegrationmethodtypes"}[data]
92
- @availables[data] = @common.callMethod(non_customer_suffix(suffix), :get)
187
+ result = @common.callMethod(non_customer_suffix(suffix), :get)
188
+ File.write(cache_filename(data), JSON.generate(result))
189
+ @availables[data] = result
93
190
  end
94
191
  end
95
192
 
@@ -0,0 +1,176 @@
1
+ require_relative 'util'
2
+
3
+ class TablePrint
4
+ DELIM = '|'
5
+
6
+ def char_repeat(n, char)
7
+ result = ""
8
+ (1..n).each { |i|
9
+ result = result + char
10
+ }
11
+ result
12
+ end
13
+
14
+ def spaces(n)
15
+ char_repeat(n, ' ')
16
+ end
17
+
18
+ def initialize(*titles)
19
+ @ncols = titles.length
20
+ @lines = [ ]
21
+ @width = nil
22
+ @lines << titles
23
+ separator = [ ]
24
+ titles.each { |title|
25
+ separator << char_repeat(title.length, '-')
26
+ }
27
+ @lines << separator
28
+ end
29
+
30
+ def append(*columns)
31
+ @lines << columns
32
+ end
33
+
34
+ def indent(column)
35
+ if column == 0
36
+ ""
37
+ else
38
+ segment = spaces(@width-1) + DELIM
39
+ segment * column
40
+ end
41
+ end
42
+
43
+ def strip(line)
44
+ regexp = Regexp.new(' *' + Regexp.escape(DELIM) + '*\Z')
45
+ line.sub(regexp, "")
46
+ end
47
+
48
+ def calc_column(line)
49
+ line.length / @width
50
+ end
51
+
52
+ def fill_to_next_column(line)
53
+ tab = @width - (line.length % @width)
54
+ line = line + spaces(tab-1) + DELIM
55
+ end
56
+
57
+ # prints a line with DELIMs following in proper columns
58
+ def println(line)
59
+ column = calc_column(line)
60
+ if (column < @ncols)
61
+ line = fill_to_next_column(line)
62
+ column = calc_column(line)
63
+ end
64
+ if (column < @ncols)
65
+ segment = spaces(@width-1) + DELIM
66
+ line = line + segment * (@ncols - column)
67
+ end
68
+ puts strip(line)
69
+ end
70
+
71
+ def next_unprinted_column(col_array, start=0)
72
+ for i in (start...col_array.length)
73
+ return i if col_array[i]
74
+ end
75
+ nil
76
+ end
77
+
78
+ def calc_max_widths
79
+ maxwidth = Array.new(@ncols, 0)
80
+ @lines.each { |line|
81
+ line.each_with_index { |value, index|
82
+ maxwidth[index] = [value.to_s.length, maxwidth[index]].max
83
+ }
84
+ }
85
+ maxwidth
86
+ end
87
+
88
+ def print_table_normally(maxwidth)
89
+ @lines.each { |line|
90
+ output = ""
91
+ line.each_with_index { |value, index|
92
+ output = output + value.to_s + spaces(maxwidth[index] - value.to_s.length + 2)
93
+ }
94
+ puts output[0...-2]
95
+ }
96
+ end
97
+
98
+ def separator(width)
99
+ char_repeat(width, '-')
100
+ end
101
+
102
+ def print_staggered(maxwidth, term_width)
103
+ minw = term_width
104
+ maxwidth.each_with_index { |w, index|
105
+ next if index == 0
106
+ width = (term_width - w) / index
107
+ minw = [width, minw].min
108
+ }
109
+ @width = minw
110
+ puts separator(term_width)
111
+ @lines.each_with_index { |line, lineno|
112
+ next if lineno == 1 # skip line of separators
113
+ output = ""
114
+ cols_left = Array.new(@ncols, true)
115
+ while column = next_unprinted_column(cols_left)
116
+ output = indent(column) if output.length == 0
117
+ while column
118
+ value = line[column].to_s
119
+ cols_left[column] = false # indicate this column has been printed
120
+ output = output + value
121
+ output = fill_to_next_column(output)
122
+ next_column = calc_column(output)
123
+ column = next_unprinted_column(cols_left, next_column)
124
+ if column && (column > next_column)
125
+ output = output + (spaces(@width-1) + DELIM) * (column - next_column)
126
+ end
127
+ end
128
+ println(output)
129
+ output = ""
130
+ end
131
+ puts separator(term_width)
132
+ }
133
+ end
134
+
135
+ def print_old_staggered(maxwidth, term_width)
136
+ puts separator(term_width)
137
+ @lines.each_with_index { |line, index|
138
+ next if index == 1
139
+ output = ""
140
+ column = 0
141
+ line.each_with_index { |value, column|
142
+ value = value.to_s
143
+ output = indent(column) if output.length == 0
144
+ if value.length > (@width - 1)
145
+ output = output + value
146
+ println(output)
147
+ output = ""
148
+ else
149
+ output = output + value + spaces(@width - value.length - 1) + DELIM
150
+ end
151
+ column += 1
152
+ }
153
+ println(output) if output.length > 0
154
+ puts separator(term_width)
155
+ }
156
+ end
157
+
158
+ def print_table
159
+ return if @lines.nil?
160
+ return if @ncols == 0
161
+ if @ncols == 1
162
+ @lines.each { |line| puts line }
163
+ return
164
+ end
165
+
166
+ maxwidth = calc_max_widths
167
+ # will lines fit in terminal
168
+ width_needed = maxwidth.reduce(:+) + (@ncols-1) * 2
169
+ term_width, h = Util.detect_terminal_size
170
+ if width_needed <= term_width
171
+ print_table_normally(maxwidth)
172
+ else
173
+ print_staggered(maxwidth, term_width)
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,29 @@
1
+ class Util
2
+ # Determines if a shell command exists by searching for it in ENV['PATH'].
3
+ def self.command_exists?(command)
4
+ ENV['PATH'].split(File::PATH_SEPARATOR).any? {|d| File.exists? File.join(d, command) }
5
+ end
6
+
7
+ # Returns [width, height] of terminal when detected, nil if not detected.
8
+ # Think of this as a simpler version of Highline's Highline::SystemExtensions.terminal_size()
9
+ def self.detect_terminal_size
10
+ if (ENV['COLUMNS'] =~ /^\d+$/) && (ENV['LINES'] =~ /^\d+$/)
11
+ [ENV['COLUMNS'].to_i, ENV['LINES'].to_i]
12
+ elsif (RUBY_PLATFORM =~ /java/ || (!STDIN.tty? && ENV['TERM'])) && command_exists?('tput')
13
+ [`tput cols`.to_i, `tput lines`.to_i]
14
+ elsif STDIN.tty? && command_exists?('stty')
15
+ `stty size`.scan(/\d+/).map { |s| s.to_i }.reverse
16
+ else
17
+ nil
18
+ end
19
+ rescue
20
+ nil
21
+ end
22
+ end
23
+
24
+ class String
25
+ def full_match(re)
26
+ m = re.match(self)
27
+ m && (m.begin(0) == 0) && (m.end(0) == self.length)
28
+ end
29
+ end
@@ -1,3 +1,3 @@
1
1
  module Vzcdn
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
@@ -1,10 +1,12 @@
1
1
  require_relative 'route'
2
+ require_relative 'util'
3
+ require_relative 'table_print'
2
4
 
3
5
  class Zone
4
6
  include CommandProc
7
+ include ConfigReader
5
8
 
6
9
  def initialize(name)
7
- @lines = nil
8
10
  @zname = name
9
11
  @usage = { :list => "list zones"}
10
12
  @argflows = [ {:name => "list", :usage => "list zones", :args=>[]},
@@ -16,14 +18,32 @@ class Zone
16
18
  puts "unimplemented"
17
19
  else
18
20
  zones = Route.do.get_all_zones
19
- pp_table_start("ZONE", "ID", "STATUS")
21
+ table = TablePrint.new("ZONE", "ID", "STATUS")
20
22
  zones.each {|zone|
21
- pp_table_append(zone["DomainName"], zone["ZoneId"].to_s, Route.do.xlate_id(:zone_status, zone["Status"]))
23
+ table.append(zone["DomainName"], zone["ZoneId"].to_s, Route.do.xlate_id(:zone_status, zone["Status"]))
22
24
  }
23
- pp_table
25
+ table.print_table
24
26
  end
25
27
  end
26
28
 
29
+ # let user lowercase and abbreviate key; abbreviation must match one key
30
+ def match_key(abbrev, struct)
31
+ abbrev = abbrev.downcase
32
+ key = nil
33
+ struct.keys.each { |fullkey|
34
+ testkey = fullkey.downcase
35
+ return fullkey if abbrev == testkey
36
+ if fullkey.downcase.start_with?(abbrev)
37
+ if (! key)
38
+ key = fullkey
39
+ else
40
+ return nil
41
+ end
42
+ end
43
+ }
44
+ key
45
+ end
46
+
27
47
  def structure_print(struct, args, header)
28
48
  if (struct.class == Array)
29
49
  # puts "printing array of " + struct.length.to_s + " elts"
@@ -36,12 +56,14 @@ class Zone
36
56
  if (args.length == 0)
37
57
  # print top level elements of hash
38
58
  if (header)
39
- pp_table_start_cols struct.keys
59
+ @table = TablePrint.new(*struct.keys)
40
60
  end
41
61
  values = []
42
62
  struct.keys.each { |key|
43
63
  value = struct[key]
44
- if (value.class == Array)
64
+ if (value.nil?)
65
+ value = "null"
66
+ elsif (value.class == Array)
45
67
  value = value.length.to_s + " elements"
46
68
  elsif (value.class == String)
47
69
  elsif (value.class == Fixnum)
@@ -53,10 +75,13 @@ class Zone
53
75
  end
54
76
  values << value
55
77
  }
56
- pp_table_append_cols(values)
78
+ @table.append(*values)
57
79
  else
80
+ args = args.clone
58
81
  key = args.shift
59
- structure_print(struct[key], args, header)
82
+ fullkey = match_key(key, struct)
83
+ raise "no (unique) key matches " + key if ! fullkey
84
+ structure_print(struct[fullkey], args, header)
60
85
  end
61
86
  else
62
87
  if (args.length == 0)
@@ -67,21 +92,79 @@ class Zone
67
92
  end
68
93
  end
69
94
 
95
+ def id_and_name
96
+ id = name = nil
97
+ if @zname.full_match /\d+/
98
+ id = @zname
99
+ else
100
+ name = @zname
101
+ end
102
+ name = name.sub(/\.\Z/, "")
103
+ return id, name
104
+ end
105
+
106
+ def get_zone(forceRest = false)
107
+ zonedir = mkdir("zones")
108
+ zone = nil
109
+ id, name = id_and_name
110
+ if @zname
111
+ if ! forceRest
112
+ if id.nil?
113
+ r = name + '\.\d+'
114
+ else
115
+ r = '.*\.' + id
116
+ end
117
+ regex = Regexp.new(r)
118
+ Dir.new(zonedir).each { |file|
119
+ if file.full_match regex
120
+ path = File.join(zonedir, file)
121
+ zone = JSON.parse(File.open(path).read)
122
+ end
123
+ }
124
+ end
125
+ if (zone.nil?)
126
+ zone = Route.do.get_zone(id, name)
127
+ File.open("orig.zone", "w").write(JSON.pretty_generate zone)
128
+ Route.do.translate_zone(zone)
129
+ end
130
+ end
131
+ zone
132
+ end
133
+
134
+ def push(args)
135
+ zone = get_zone
136
+ Route.do.untranslate_zone(zone)
137
+ File.open("untranslated.zone","w").write(JSON.pretty_generate zone)
138
+ Route.do.update_zone(zone)
139
+ end
140
+
141
+ def pull(args)
142
+ raise("Illegal arguments:" + args.to_s) if args.length != 0
143
+ raise("Must specify zone") if @zname.nil?
144
+ zone = get_zone(true)
145
+ file_name = zone["DomainName"].sub(/\.\Z/, '')
146
+ file_name = file_name + '.' + zone["ZoneId"].to_s
147
+ file_name = config_file("zones", file_name)
148
+ File.delete(file_name) if File.exists?(file_name)
149
+ File.open(file_name, "w").write(JSON.pretty_generate zone)
150
+ end
151
+
70
152
  def print(args)
71
153
  if @zname
72
- if @zname =~ /\d+/
73
- zone = Route.do.get_zone(@zname, "")
74
- else
75
- zone = Route.do.get_zone("", @zname)
154
+ zone = get_zone
155
+ if (zone.nil?)
156
+ puts "zone empty"
157
+ return
76
158
  end
77
- if (args.length > 0 && args[0] == "-l")
159
+ if (args.length == 1 && args[0] == "-l")
78
160
  puts JSON.pretty_generate(zone)
79
161
  else
162
+ @table = nil
80
163
  structure_print(zone, args, true)
81
- pp_table
164
+ @table.print_table if @table
82
165
  end
83
166
  else
84
- puts "pull command needs zone name or id"
167
+ puts "need zone name or id"
85
168
  end
86
169
  end
87
170
 
@@ -101,59 +184,4 @@ class Zone
101
184
 
102
185
  end
103
186
  end
104
-
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
144
- maxwidths = Array.new(ncols, 0)
145
- @lines.each { |line|
146
- line.each_with_index { |col, index|
147
- maxwidths[index] = [col.to_s.length, maxwidths[index]].max
148
- }
149
- }
150
- @lines.each { |line|
151
- output = ""
152
- line.each_with_index {|col, index|
153
- output = output + col.to_s + spaces(maxwidths[index] - col.to_s.length + 2)
154
- }
155
- puts output
156
- }
157
- @lines = nil
158
- end
159
187
  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.2
4
+ version: 0.1.3
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-04-03 00:00:00.000000000 Z
13
+ date: 2014-04-08 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rest-client
@@ -81,9 +81,10 @@ files:
81
81
  - lib/realTimeStats.rb
82
82
  - lib/reporting.rb
83
83
  - lib/route.rb
84
- - lib/t.rb
84
+ - lib/table_print.rb
85
85
  - lib/upload.rb
86
86
  - lib/userInfo.rb
87
+ - lib/util.rb
87
88
  - lib/vzcdn.rb
88
89
  - lib/vzcdn/version.rb
89
90
  - lib/zone.rb
data/lib/t.rb DELETED
@@ -1,3 +0,0 @@
1
- require_relative 'clui_config'
2
-
3
- puts CluiConfig.get_config("acct-num")