a4tools 1.2.7

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.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/.bundle/install.log +38 -0
  3. data/.gitignore +2 -0
  4. data/Gemfile +3 -0
  5. data/Gemfile.lock +38 -0
  6. data/a4tools.gemspec +38 -0
  7. data/bin/deploy_latest_clients +32 -0
  8. data/bin/devsite_config_server +48 -0
  9. data/bin/netshell +23 -0
  10. data/bin/update_server +101 -0
  11. data/bin/usher +54 -0
  12. data/lib/a4tools.rb +61 -0
  13. data/lib/a4tools/version.rb +3 -0
  14. data/lib/acres_client.rb +376 -0
  15. data/lib/clients/caching_client.rb +151 -0
  16. data/lib/clients/deployment_client.rb +53 -0
  17. data/lib/clients/kai_config_client.rb +39 -0
  18. data/lib/clients/usher_client.rb +72 -0
  19. data/lib/clients/usher_mgmt_client.rb +201 -0
  20. data/lib/event_manager.rb +24 -0
  21. data/lib/events.json +1 -0
  22. data/lib/net_shell/builtin_command.rb +312 -0
  23. data/lib/net_shell/builtin_commands/build.rb +251 -0
  24. data/lib/net_shell/builtin_commands/cd.rb +12 -0
  25. data/lib/net_shell/builtin_commands/connect.rb +122 -0
  26. data/lib/net_shell/builtin_commands/deploy.rb +280 -0
  27. data/lib/net_shell/builtin_commands/disconnect.rb +15 -0
  28. data/lib/net_shell/builtin_commands/excerpt.rb +97 -0
  29. data/lib/net_shell/builtin_commands/exit.rb +7 -0
  30. data/lib/net_shell/builtin_commands/get.rb +38 -0
  31. data/lib/net_shell/builtin_commands/help.rb +40 -0
  32. data/lib/net_shell/builtin_commands/host.rb +126 -0
  33. data/lib/net_shell/builtin_commands/inject.rb +42 -0
  34. data/lib/net_shell/builtin_commands/jsoncache.rb +80 -0
  35. data/lib/net_shell/builtin_commands/kai_event.rb +151 -0
  36. data/lib/net_shell/builtin_commands/persist.rb +24 -0
  37. data/lib/net_shell/builtin_commands/pwd.rb +6 -0
  38. data/lib/net_shell/builtin_commands/recap.rb +188 -0
  39. data/lib/net_shell/builtin_commands/references.rb +63 -0
  40. data/lib/net_shell/builtin_commands/select.rb +36 -0
  41. data/lib/net_shell/builtin_commands/send.rb +74 -0
  42. data/lib/net_shell/builtin_commands/set.rb +29 -0
  43. data/lib/net_shell/builtin_commands/show.rb +183 -0
  44. data/lib/net_shell/builtin_commands/site.rb +122 -0
  45. data/lib/net_shell/builtin_commands/ssh.rb +62 -0
  46. data/lib/net_shell/builtin_commands/talk.rb +90 -0
  47. data/lib/net_shell/builtin_commands/translate.rb +45 -0
  48. data/lib/net_shell/builtin_commands/unset.rb +14 -0
  49. data/lib/net_shell/builtin_commands/usher.rb +55 -0
  50. data/lib/net_shell/builtin_commands/usher_device.rb +39 -0
  51. data/lib/net_shell/builtin_commands/usher_site.rb +245 -0
  52. data/lib/net_shell/builtin_commands/usherm_connect.rb +21 -0
  53. data/lib/net_shell/colors.rb +149 -0
  54. data/lib/net_shell/command.rb +97 -0
  55. data/lib/net_shell/io.rb +132 -0
  56. data/lib/net_shell/net_shell.rb +396 -0
  57. data/lib/net_shell/prompt.rb +335 -0
  58. data/lib/object_builder/definitions/app_info_for_script.rb +83 -0
  59. data/lib/object_builder/definitions/connection_request.rb +28 -0
  60. data/lib/object_builder/definitions/device_info_for_system.rb +37 -0
  61. data/lib/object_builder/object_builder.rb +145 -0
  62. data/lib/talk.json +1 -0
  63. data/lib/talk_consumer.rb +235 -0
  64. metadata +279 -0
@@ -0,0 +1,335 @@
1
+ require 'curses'
2
+ Curses.init_screen()
3
+
4
+ class String
5
+ def shellsplit_partial
6
+ begin
7
+ shellsplit
8
+ rescue ArgumentError
9
+ begin
10
+ (self + "\"").shellsplit
11
+ rescue
12
+ (self + "'").shellsplit rescue []
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ module A4Tools
19
+ class Prompt
20
+ attr_accessor :tab, :prompt, :keystroke, :history, :history_file, :history_length
21
+ attr_accessor :autosuggest
22
+
23
+ def initialize(params={})
24
+ @history = []
25
+ @autosuggest = true
26
+ reset_line
27
+
28
+ @prompt = params[:prompt] || lambda { ">" }
29
+ @tab = params[:tab] || lambda { |cmdline| [] }
30
+ self.history_file = File.expand_path(params[:history_file]) || nil
31
+ @history_length = params[:history_length] || 100
32
+ end
33
+
34
+ def quoted_argument(argument)
35
+ argument.match(/\s+/) ? "\"#{argument}\"" : argument
36
+ end
37
+
38
+ def prompt=(new_prompt)
39
+ @prompt = new_prompt
40
+ end
41
+
42
+ def prompt
43
+ @prompt.call() rescue ">"
44
+ end
45
+
46
+ def show_prompt(force_newline=false)
47
+ puts if force_newline
48
+ print prompt
49
+ STDOUT.flush
50
+ end
51
+
52
+ def history_file=(file)
53
+ @history_file = file
54
+ @history = IO.read(file).split("\n") if File.exist?(file)
55
+ end
56
+
57
+ def add_to_history(line)
58
+ return if(history.last == line or line.match(/^\s*$/))
59
+ @history.push(line)
60
+ @history = @history[1 .. @history_length] unless @history_length.nil? or @history.length <= @history_length
61
+ File.write(@history_file, @history.join("\n")) if @history_file
62
+ end
63
+
64
+ def history_at_offset(offset=nil)
65
+ offset ||= @offset
66
+ history = (offset == -1) ? @saved_cmd : @history.reverse[offset]
67
+ history || ""
68
+ end
69
+
70
+ def show_history(offset)
71
+ print "\r#{prompt}#{history_at_offset(offset)}"
72
+ end
73
+
74
+ def refresh_prompt
75
+ @last_prompt = prompt
76
+ end
77
+
78
+ def redraw_line
79
+ clear_line
80
+ print "#{@last_prompt}#{@line}#{@suggestion.colorize(:light_black)}"
81
+ print "\b"*(@suggestion.length-@cursor)
82
+ end
83
+
84
+ def clear_line
85
+ print "\r"
86
+ print " "*Curses.cols + "\r"
87
+ end
88
+
89
+ def tab_completion(cmdline)
90
+ if @last_tab.nil?
91
+ @last_tab = @tab.call(cmdline)
92
+ end
93
+
94
+ @last_tab
95
+ end
96
+
97
+ def common_denominator(set)
98
+ return "" if set.empty?
99
+ denom = set[0].to_s
100
+ set.each do |item|
101
+ while(not item.to_s.start_with?(denom)) do
102
+ denom = denom[0..-2]
103
+ end
104
+ end
105
+
106
+ denom
107
+ end
108
+
109
+ def read_char
110
+ STDIN.echo = false
111
+
112
+ input = STDIN.getc.chr
113
+ if input == "\e" then
114
+ input << STDIN.read_nonblock(4) rescue nil
115
+ input << STDIN.read_nonblock(3) rescue nil
116
+ input << STDIN.read_nonblock(2) rescue nil
117
+ end
118
+ ensure
119
+ STDIN.echo = true
120
+
121
+ return input
122
+ end
123
+
124
+ def add_argument_from_tab(new_arg, add_space = true)
125
+ if @line.match(/\s$/) then
126
+ # Last character is a space; we're adding a brand new argument
127
+ @line += quoted_argument(new_arg)
128
+ else
129
+ # We're completing an existing argument
130
+ last = split_args.last || ""
131
+ true_last = split_args(false).last || ""
132
+ last = "\"" + last if last.match(/\s/) or true_last.start_with? "\""
133
+ @line = @line[0..(-1 - last.length)] + quoted_argument(new_arg)
134
+ end
135
+
136
+ @line += " " if add_space
137
+ end
138
+
139
+ def handle_ctrl_c
140
+ puts ""
141
+ reset_line
142
+ end
143
+
144
+ def handle_ctrl_d
145
+ exit 0 if @line.length == 0
146
+ print "\a"
147
+ end
148
+
149
+ def handle_backspace
150
+ print "\a" if @cursor >= @line.length
151
+ if @cursor == 0 then
152
+ @line = @line[0 .. -2] || ""
153
+ else
154
+ @line = (@line[0 .. @cursor-2] + @line[@cursor .. -1]) || ""
155
+ end
156
+ end
157
+
158
+ def handle_up_arrow
159
+ if @autosuggest and not at_suggestion_boundary then
160
+ @suggestion_offset -= 1
161
+ else
162
+ print "\a" if @offset == @history.length - 1
163
+ @saved_cmd = @line if @offset == -1
164
+ @offset = [@offset + 1, @history.length - 1].min
165
+ @line = pad_line(history_at_offset)
166
+ end
167
+ end
168
+
169
+ def handle_down_arrow
170
+ if @autosuggest and not at_suggestion_boundary then
171
+ @suggestion_offset += 1
172
+ else
173
+ print "\a" if @offset == -1
174
+ @offset = [@offset - 1, -1].max
175
+ @line = pad_line(history_at_offset)
176
+ end
177
+ end
178
+
179
+ def handle_right_arrow
180
+ if @cursor >= 0 then
181
+ return unless @autosuggest
182
+ opts = tab_completion(@line)
183
+ if opts.empty?
184
+ print "\a"
185
+ else
186
+ suggestion = opts[@suggestion_offset % opts.length]
187
+ add_argument_from_tab(suggestion) unless suggestion.nil? or suggestion.empty?
188
+ end
189
+ else
190
+ @cursor += 1
191
+ end
192
+ end
193
+
194
+ def handle_left_arrow
195
+ @cursor = [-@line.length, @cursor - 1].max
196
+ end
197
+
198
+ def handle_newline
199
+ add_to_history(@line)
200
+ @suggestion = "" # clear the ghost text off the screen
201
+ redraw_line
202
+ puts "\r"
203
+ end
204
+
205
+ def handle_tab
206
+ opts = tab_completion(@line)
207
+ forced = common_denominator(opts)
208
+ add_argument_from_tab(forced, opts.length == 1) unless forced.empty?
209
+
210
+ print "\a" if opts.length != 1
211
+ puts "\r\n"+opts.sort.join(", ") if opts.length > 1
212
+ end
213
+
214
+ def handle_character(c)
215
+ if @cursor == 0 then
216
+ @line += c
217
+ else
218
+ @line = (@line[0 .. @cursor-1] + c + @line[@cursor .. -1]) || ""
219
+ end
220
+ end
221
+
222
+ def handle_home
223
+ @cursor = -@line.length
224
+ end
225
+
226
+ def handle_end
227
+ @cursor = 0
228
+ end
229
+
230
+ def handle_pgdown
231
+ @offset = -1
232
+ clear_line
233
+ @line = history_at_offset
234
+ end
235
+
236
+ def split_args(partial=true)
237
+ partial ? @line.shellsplit_partial : @line.split(/\s+/)
238
+ end
239
+
240
+ def pad_line(line)
241
+ line += " " unless line.empty? or line.match(/\s$/)
242
+ line
243
+ end
244
+
245
+ def at_suggestion_boundary
246
+ return true if @line.length == 0
247
+ return true if @line.match(/\s$/)
248
+ false
249
+ end
250
+
251
+ def suggest(str)
252
+ str ||= ""
253
+ @suggestion = str.style(:light_black)
254
+ end
255
+
256
+ def update_autosuggest
257
+ opts = tab_completion(@line)
258
+ suggested = opts[@suggestion_offset % opts.length] rescue nil
259
+ if suggested.nil? or at_suggestion_boundary
260
+ suggest("")
261
+ return
262
+ end
263
+
264
+ suggested = suggested[ (split_args.last.length rescue 0) .. -1] unless at_suggestion_boundary
265
+ suggest(suggested) unless suggested.nil?
266
+ end
267
+
268
+ def scan_line
269
+ c = nil
270
+ while c != "\r"
271
+ redraw_line
272
+ c = read_char
273
+
274
+ start_line = @line
275
+ case c
276
+ when "\u0003" # CTRL+C
277
+ handle_ctrl_c
278
+ when "\u0004" # CTRL+D
279
+ handle_ctrl_d
280
+ when "\177" # backspace
281
+ handle_backspace
282
+ when "\e[A" # up arrow
283
+ handle_up_arrow
284
+ when "\e[B" # down arrow
285
+ handle_down_arrow
286
+ when "\e[C" # right arrow
287
+ handle_right_arrow
288
+ when "\e[D" # left arrow
289
+ handle_left_arrow
290
+ when "\e[H" # home
291
+ handle_home
292
+ when "\e[F" # end
293
+ handle_end
294
+ when "\e[6~" # page down
295
+ handle_pgdown
296
+ when "\r" # newline
297
+ handle_newline
298
+ when "\t" # tab
299
+ handle_tab
300
+ else
301
+ handle_character(c) if c.length == 1 # guard against other weird metacharacters
302
+ end
303
+
304
+ @last_tab = nil if start_line != @line # altering the line invalidated tab complete cache
305
+ @suggestion_offset = 0 if at_suggestion_boundary
306
+ @keystroke.call(@line) unless @keystroke.nil?
307
+ update_autosuggest if @autosuggest
308
+ end
309
+
310
+ @line
311
+ end
312
+
313
+ def reset_line
314
+ @line = ""
315
+ @suggestion = ""
316
+ @suggestion_offset = 0
317
+ @offset = -1
318
+ @cursor = 0
319
+ @last_prompt = prompt
320
+ @last_tab = nil
321
+ end
322
+
323
+ def read_line
324
+ reset_line
325
+ begin
326
+ system("stty raw -echo")
327
+ scan_line
328
+ ensure
329
+ system("stty -raw echo")
330
+ end
331
+
332
+ @line
333
+ end
334
+ end
335
+ end
@@ -0,0 +1,83 @@
1
+ require 'jebediah'
2
+
3
+ description "Populated from git and version info"
4
+ generate do
5
+ version = get_version.split(".")
6
+ commits = get_commits
7
+
8
+ {
9
+ __class:"com.acres4.common.info.AppInfo",
10
+ appName:"netshell",
11
+ product:"Mercury",
12
+
13
+ major: version[0].to_i,
14
+ minor: version[1].to_i,
15
+ revision: version[2].to_i,
16
+ sourceRevision: commits.first[:sha1],
17
+ buildId: commits.first[:jeb],
18
+ supportingRevisions: (commits.map do |commit|
19
+ {
20
+ repository: commit[:repository],
21
+ revision: commit[:sha1],
22
+ alias: commit[:jeb],
23
+ timestamp: commit[:timestamp],
24
+ author: commit[:author],
25
+ commitNotes: commit[:notes],
26
+ branches: commit[:branches]
27
+ }
28
+ end),
29
+
30
+ sha1sum:nil,
31
+ currentTalkVersion:"mike",
32
+ }
33
+ end
34
+
35
+ ###
36
+
37
+ def repo_info(directory, repository=nil)
38
+ begin
39
+ info = {}
40
+ info[:repository] = repository || File.basename(directory)
41
+ info[:sha1] = `cd "#{directory}"; git log --format="%H" -n1`.chomp
42
+ info[:jeb] = Jebediah.new.process(info[:sha1])[:result].join(" ")
43
+ info[:timestamp] = `cd "#{directory}"; git log --format="%at" -n1`.chomp.to_i
44
+ info[:author] = `cd "#{directory}"; git log --format="%an" -n1`.chomp
45
+ info[:notes] = `cd "#{directory}"; git log --format="%s" -n1`.chomp
46
+
47
+ info[:branches] = (`cd "#{directory}"; git branch --contains #{info[:sha1]}`.split("\n").map do |line|
48
+ line.length > 0 ? line.gsub(/^[\s*]*/, "").gsub(/\s*$/, "") : nil
49
+ end).compact
50
+ return info
51
+ rescue
52
+ return nil
53
+ end
54
+ end
55
+
56
+ def fake_repo_info
57
+ {
58
+ repository: "a4tools",
59
+ sha1:"67021ff1f82c941454a6d2bffa7a2ffde0a6320a",
60
+ jeb:"exquisitely eased cougar",
61
+ timestamp:1399271669,
62
+ author:"Jonas Acres",
63
+ notes:"Progress commit",
64
+ branches:["master"]
65
+ }
66
+ end
67
+
68
+ def get_a4tools
69
+ repo_info(File.dirname(__FILE__), "a4tools")
70
+ end
71
+
72
+ def get_talk
73
+ repo_info(File.join(File.dirname(__FILE__), "../../../../talk"), "talk")
74
+ end
75
+
76
+ def get_commits
77
+ #list = [ get_a4tools, get_talk ].compact
78
+ list = [ fake_repo_info ] if list.nil? or list.empty?
79
+ end
80
+
81
+ def get_version
82
+ VERSION
83
+ end
@@ -0,0 +1,28 @@
1
+ description "ConnectionRequest based on default AppInfo and DeviceInfo"
2
+ cache false
3
+ generate do
4
+ {
5
+ __class:"com.acres4.common.info.ConnectionRequest",
6
+ appInfo: ObjectBuilder[:app_info_for_script].value,
7
+ deviceInfo: ObjectBuilder[:device_info_for_system].value,
8
+ }
9
+ end
10
+
11
+ ###
12
+
13
+ def device_type
14
+ "Ruby #{RUBY_VERSION}"
15
+ end
16
+
17
+ def serial_number
18
+ return $config[:serial] unless $config.nil? or $config[:serial].nil?
19
+ "1234"
20
+ end
21
+
22
+ def hostname
23
+ `hostname`.chomp
24
+ end
25
+
26
+ def os_name
27
+ `uname`.chomp
28
+ end
@@ -0,0 +1,37 @@
1
+ description "Populated from local configuration and host info"
2
+ cache false
3
+
4
+ generate do
5
+ {
6
+ __class:"com.acres4.common.info.DeviceInfo",
7
+ identifier:0,
8
+ serialNumber:serial_number,
9
+ deviceType:"ruby_script",
10
+ deviceName:hostname,
11
+ osName:os_name,
12
+ osVersion:os_version
13
+ }
14
+ end
15
+
16
+ ###
17
+
18
+ def device_type
19
+ "Ruby"
20
+ end
21
+
22
+ def serial_number
23
+ return $config[:serial] unless $config.nil? or $config[:serial].nil?
24
+ "1234"
25
+ end
26
+
27
+ def hostname
28
+ `hostname`.chomp
29
+ end
30
+
31
+ def os_name
32
+ `uname`.chomp
33
+ end
34
+
35
+ def os_version
36
+ RUBY_VERSION
37
+ end