flydata 0.0.3.8 → 0.0.4.0
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.
- data/VERSION +1 -1
- data/flydata.gemspec +2 -2
- data/lib/flydata/api/data_port.rb +4 -0
- data/lib/flydata/cli.rb +3 -1
- data/lib/flydata/command/base.rb +19 -2
- data/lib/flydata/command/setup.rb +128 -24
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.4.0
|
data/flydata.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "flydata"
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.4.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Koichi Fujikawa"]
|
12
|
-
s.date = "2013-
|
12
|
+
s.date = "2013-02-13"
|
13
13
|
s.description = "FlyData Command Line Interface"
|
14
14
|
s.email = "sysadmin@flydata.co"
|
15
15
|
s.executables = ["flydata"]
|
data/lib/flydata/cli.rb
CHANGED
@@ -19,7 +19,10 @@ module Flydata
|
|
19
19
|
#raise e
|
20
20
|
puts "! #{e.to_s}"
|
21
21
|
puts
|
22
|
+
puts
|
23
|
+
puts '-' * 64
|
22
24
|
print_usage
|
25
|
+
puts '-' * 64
|
23
26
|
end
|
24
27
|
end
|
25
28
|
|
@@ -43,7 +46,6 @@ please setup flydata again by following commands.
|
|
43
46
|
|
44
47
|
You can check the logs of sender(flydata) process.
|
45
48
|
Log path: ~/.flydata/flydata.log
|
46
|
-
|
47
49
|
EOM
|
48
50
|
end
|
49
51
|
end
|
data/lib/flydata/command/base.rb
CHANGED
@@ -22,9 +22,14 @@ module Flydata
|
|
22
22
|
|
23
23
|
# print console
|
24
24
|
def newline; puts end
|
25
|
-
def
|
25
|
+
def separator(str="=")
|
26
|
+
puts str * 64
|
27
|
+
end
|
28
|
+
def ask_yes_no(message, default_yes=true)
|
29
|
+
suffix = default_yes ? "(Y/n)" : "(y/n)"
|
26
30
|
loop do
|
27
|
-
ans = ask("#{message}
|
31
|
+
ans = ask("#{message} #{suffix}: ")
|
32
|
+
return true if default_yes and ans == ''
|
28
33
|
if ans.size > 0
|
29
34
|
case ans[0].downcase
|
30
35
|
when 'y'; return true
|
@@ -35,6 +40,18 @@ module Flydata
|
|
35
40
|
newline
|
36
41
|
end
|
37
42
|
end
|
43
|
+
def choose_one(message, prompt, menu_list, value_list=[])
|
44
|
+
choice = nil
|
45
|
+
value_list = menu_list unless menu_list.size == value_list.size
|
46
|
+
say(message) if message
|
47
|
+
choose do |menu|
|
48
|
+
menu.index = :number
|
49
|
+
menu.index_suffix = ") "
|
50
|
+
menu.prompt = prompt ? prompt : ">> "
|
51
|
+
menu.choices(*menu_list) {|item| choice = value_list[menu_list.index(item)]}
|
52
|
+
end
|
53
|
+
choice
|
54
|
+
end
|
38
55
|
end
|
39
56
|
end
|
40
57
|
end
|
@@ -15,9 +15,94 @@ module Flydata
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def run
|
18
|
-
#login
|
19
18
|
Flydata::Command::Login.new.run unless flydata.credentials.authenticated?
|
19
|
+
ret = _run
|
20
|
+
Flydata::Command::Sender.new.restart if ret
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
def _run
|
25
|
+
ret = nil
|
26
|
+
#ask redshift
|
27
|
+
case ask_data_entry_type
|
28
|
+
when :redshift
|
29
|
+
ret = start_redshift_mode
|
30
|
+
else
|
31
|
+
ret = start_s3_backup_mode
|
32
|
+
end
|
33
|
+
ret
|
34
|
+
end
|
35
|
+
def ask_data_entry_type
|
36
|
+
choose_one('Please select a setup type', nil,
|
37
|
+
["Redshift and S3 Backup", "S3 Buckup only"],
|
38
|
+
[:redshift, :s3backup])
|
39
|
+
end
|
40
|
+
|
41
|
+
#### redshift buckup mode
|
42
|
+
def start_redshift_mode
|
43
|
+
newline
|
44
|
+
shown = show_registered_entries('RedshiftFileDataEntry') do |de|
|
45
|
+
say(" - #{de['display_name']}: \t#{de['log_path']} -> #{de['redshift_table_name']}")
|
46
|
+
end
|
47
|
+
newline
|
48
|
+
ask_adding_new_redshift
|
49
|
+
end
|
50
|
+
|
51
|
+
def ask_adding_new_redshift
|
52
|
+
puts "Start to register a new entry."
|
53
|
+
newline
|
54
|
+
# select table on redshift
|
55
|
+
puts "[Select a Table Name on Redshift]"
|
56
|
+
table_name = ask_redshift_table_name
|
57
|
+
return unless table_name
|
58
|
+
newline
|
59
|
+
# enter the log path
|
60
|
+
puts "[Enter a Local Log Path]"
|
61
|
+
puts "Enter the absolute path of your local log for uploading to '#{table_name}' table on Redshift."
|
62
|
+
log_path = ask_log_path("Log path (tab:completion, return:cancel) >> ")
|
63
|
+
return unless log_path and not log_path.empty?
|
64
|
+
newline
|
65
|
+
# select the log type
|
66
|
+
puts "[Select a Log Format]"
|
67
|
+
log_file_type = choose_log_file_type(log_path)
|
68
|
+
# confirm and save
|
69
|
+
newline
|
70
|
+
puts "[Confirm]"
|
71
|
+
separator
|
72
|
+
puts " table(redshift) -> #{table_name}"
|
73
|
+
puts " local log path -> #{log_path}"
|
74
|
+
puts " log file format -> #{log_file_type}"
|
75
|
+
separator
|
76
|
+
return unless ask_yes_no("Register a new entry?", true)
|
77
|
+
create_redshift_log_entry(log_path, log_file_type, table_name)
|
78
|
+
end
|
79
|
+
|
80
|
+
def choose_log_file_type(target_path)
|
81
|
+
choose_one("Please select your log file format of (#{target_path})", nil,
|
82
|
+
%w(csv tsv json))
|
83
|
+
end
|
84
|
+
|
85
|
+
def ask_redshift_table_name
|
86
|
+
ret = flydata.data_port.redshift_table_list
|
87
|
+
if ret['table_list'].size < 1
|
88
|
+
raise "Could not find tables on Redshift. Please create tables on your Redshift cluster."
|
89
|
+
end
|
90
|
+
choose_one("Please select the table name on Redshift to store your local data.", nil, ret['table_list'])
|
91
|
+
end
|
92
|
+
|
93
|
+
def create_redshift_log_entry(log_path, log_file_type, redshift_table_name)
|
94
|
+
data_port = flydata.data_port.get
|
95
|
+
flydata.data_entry.create(
|
96
|
+
data_port_id: data_port['id'],
|
97
|
+
log_path: log_path,
|
98
|
+
log_file_type: log_file_type,
|
99
|
+
redshift_table_name: redshift_table_name)
|
100
|
+
say("Process added successfuly!")
|
101
|
+
return true
|
102
|
+
end
|
20
103
|
|
104
|
+
#### s3 buckup mode
|
105
|
+
def start_s3_backup_mode
|
21
106
|
# choose entries
|
22
107
|
unless (shown = show_registered_entries)
|
23
108
|
list = build_recommended_entries
|
@@ -32,25 +117,30 @@ module Flydata
|
|
32
117
|
newline
|
33
118
|
end while more_entry?
|
34
119
|
end
|
35
|
-
|
36
|
-
# start client process
|
37
|
-
Flydata::Command::Sender.new.restart
|
120
|
+
return true
|
38
121
|
end
|
39
122
|
|
40
|
-
|
41
|
-
def show_registered_entries
|
123
|
+
def show_registered_entries(type='FileDataEntry', &block)
|
42
124
|
data_entries = retrieve_data_entries
|
43
125
|
@last_fetched_entries = data_entries
|
126
|
+
data_entries = data_entries.select {|de| de['type'] == type}
|
44
127
|
if data_entries and data_entries.size > 0
|
45
|
-
puts('Registered entries. ')
|
128
|
+
puts('Registered entries on FlyData. ')
|
129
|
+
separator
|
46
130
|
data_entries.each { |data_entry|
|
47
|
-
|
131
|
+
if block_given?
|
132
|
+
yield data_entry
|
133
|
+
else
|
134
|
+
say(" - #{data_entry['display_name']}\t#{data_entry['log_path']}")
|
135
|
+
end
|
48
136
|
}
|
137
|
+
separator
|
49
138
|
true
|
50
139
|
else
|
51
140
|
false
|
52
141
|
end
|
53
142
|
end
|
143
|
+
|
54
144
|
def choose_log_path_from_examples
|
55
145
|
candidates = (`ls #{LOG_PATH_EXAMPLES.join(' ')} 2>/dev/null`).split(/\s+/)
|
56
146
|
candidates = candidates.find_all{|path| File.readable?(path)}
|
@@ -71,22 +161,12 @@ module Flydata
|
|
71
161
|
newline
|
72
162
|
choice
|
73
163
|
end
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
path = Readline.readline("Enter the absolute path of your log (return to cancel): ")
|
78
|
-
return if path.empty?
|
79
|
-
if not (FileTest.file?(path) and FileTest.readable?(path))
|
80
|
-
say(" ! #{path} is not a readable file!")
|
81
|
-
elsif @last_fetched_entries and @last_fetched_entries.any?{|e| e['log_path'] == path}
|
82
|
-
say(" ! #{path} has been registered already.")
|
83
|
-
else
|
84
|
-
break
|
85
|
-
end
|
86
|
-
newline
|
87
|
-
end
|
164
|
+
|
165
|
+
def ask_and_create_data_entry
|
166
|
+
path = ask_log_path
|
88
167
|
create_log_entry(path)
|
89
168
|
end
|
169
|
+
|
90
170
|
def build_recommended_entries
|
91
171
|
path_options=[]
|
92
172
|
Dir['/var/log*/**/*log'].each{|f| if (FileTest.file?(f) and
|
@@ -96,6 +176,7 @@ module Flydata
|
|
96
176
|
then path_options << f end}
|
97
177
|
path_options
|
98
178
|
end
|
179
|
+
|
99
180
|
def print_recommended(list, options=false)
|
100
181
|
newline
|
101
182
|
puts " Recommended list:"
|
@@ -107,12 +188,14 @@ module Flydata
|
|
107
188
|
end
|
108
189
|
newline
|
109
190
|
end
|
191
|
+
|
110
192
|
def register_all(list)
|
111
193
|
list.each{ |item|
|
112
194
|
create_log_entry(item)
|
113
195
|
}
|
114
196
|
list.reject!{|x| x}
|
115
197
|
end
|
198
|
+
|
116
199
|
def choose_log_selection(list)
|
117
200
|
path = nil
|
118
201
|
list = build_recommended_entries unless list
|
@@ -120,14 +203,14 @@ module Flydata
|
|
120
203
|
|
121
204
|
loop do
|
122
205
|
if path_options.empty?
|
123
|
-
|
206
|
+
ask_and_create_data_entry
|
124
207
|
return
|
125
208
|
end
|
126
209
|
print_recommended(path_options, true)
|
127
210
|
choice = Readline.readline("Here are some common logs, enter the number next to the logs to add the log. Input nothing to cancel.")
|
128
211
|
return if choice.empty?
|
129
212
|
if choice.to_i==path_options.length+1
|
130
|
-
|
213
|
+
ask_and_create_data_entry
|
131
214
|
return
|
132
215
|
elsif (path_options[choice.to_i-1] != nil )
|
133
216
|
path = path_options[choice.to_i-1]
|
@@ -139,6 +222,7 @@ module Flydata
|
|
139
222
|
end
|
140
223
|
create_log_entry(path)
|
141
224
|
end
|
225
|
+
|
142
226
|
def ask_log_deletion(path)
|
143
227
|
unless File.writable?(path)
|
144
228
|
say("Skip log deletion setting...")
|
@@ -153,14 +237,34 @@ module Flydata
|
|
153
237
|
say("For more details - http://docs.hapyrus.com/faq/how-log-deletion-works/")
|
154
238
|
ask_yes_no("Set auto log deletion mode?")
|
155
239
|
end
|
240
|
+
|
156
241
|
def create_log_entry(path, log_deletion=false)
|
157
242
|
data_port = flydata.data_port.get
|
158
243
|
flydata.data_entry.create(data_port_id: data_port['id'], log_path: path, log_deletion: log_deletion)
|
159
244
|
say("Process added successfuly!") if flydata.response.code == 200
|
160
245
|
end
|
246
|
+
|
161
247
|
def more_entry?
|
162
248
|
ask_yes_no("Do you want to add another log path?")
|
163
249
|
end
|
250
|
+
|
251
|
+
def ask_log_path(message = nil)
|
252
|
+
path = nil
|
253
|
+
message = "Enter the absolute path of your log (return to cancel): " unless message
|
254
|
+
loop do
|
255
|
+
path = Readline.readline(message)
|
256
|
+
return if path.empty?
|
257
|
+
if not (FileTest.file?(path) and FileTest.readable?(path))
|
258
|
+
say(" ! #{path} is not a readable file!")
|
259
|
+
elsif @last_fetched_entries and @last_fetched_entries.any?{|e| e['log_path'] == path}
|
260
|
+
say(" ! #{path} has been registered already.")
|
261
|
+
else
|
262
|
+
break
|
263
|
+
end
|
264
|
+
newline
|
265
|
+
end
|
266
|
+
path
|
267
|
+
end
|
164
268
|
end
|
165
269
|
end
|
166
270
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flydata
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-02-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rest-client
|
@@ -275,7 +275,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
275
275
|
version: '0'
|
276
276
|
segments:
|
277
277
|
- 0
|
278
|
-
hash:
|
278
|
+
hash: -2366646516811496353
|
279
279
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
280
280
|
none: false
|
281
281
|
requirements:
|