flydata 0.0.1.2011102401 → 0.0.1.2011102601
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/cli.rb +4 -0
- data/lib/flydata/command/base.rb +1 -1
- data/lib/flydata/command/login.rb +23 -6
- data/lib/flydata/command/sender.rb +33 -4
- data/lib/flydata/command/setlogdel.rb +6 -1
- data/lib/flydata/command/setup.rb +34 -10
- data/lib/flydata/credentials.rb +6 -3
- data/lib/flydata/cron.rb +79 -5
- data/lib/flydata/log_monitor.rb +1 -1
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.1.
|
1
|
+
0.0.1.2011102601
|
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.1.
|
8
|
+
s.version = "0.0.1.2011102601"
|
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 = "2012-10-
|
12
|
+
s.date = "2012-10-26"
|
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
@@ -31,6 +31,10 @@ module Flydata
|
|
31
31
|
puts <<-EOM
|
32
32
|
Usage: flydata COMMAND
|
33
33
|
setup # setup initially
|
34
|
+
start # start flydata process
|
35
|
+
stop # stop flydata process
|
36
|
+
restart # restart flydata process
|
37
|
+
setlogdel # show and change log deletion settting
|
34
38
|
EOM
|
35
39
|
end
|
36
40
|
end
|
data/lib/flydata/command/base.rb
CHANGED
@@ -9,7 +9,7 @@ module Flydata
|
|
9
9
|
# retrieve models on servers
|
10
10
|
def retrieve_data_entries
|
11
11
|
data_entries = flydata.get('/data_entries')
|
12
|
-
unless flydata.response.code == 200
|
12
|
+
unless flydata.response.code == 200
|
13
13
|
raise "Failed to retrieve data_entries"
|
14
14
|
end
|
15
15
|
data_entries
|
@@ -1,21 +1,38 @@
|
|
1
1
|
module Flydata
|
2
2
|
module Command
|
3
3
|
class Login < Base
|
4
|
+
LOGIN_TRIAL_TIMES=3
|
4
5
|
def run
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
login
|
6
|
+
ret = login(LOGIN_TRIAL_TIMES)
|
7
|
+
raise "Login failed #{LOGIN_TRIAL_TIMES} times." unless ret
|
8
|
+
ret
|
10
9
|
end
|
11
10
|
|
12
11
|
private
|
13
|
-
def login
|
12
|
+
def login(times=3)
|
13
|
+
1.upto(times) do |i|
|
14
|
+
begin
|
15
|
+
return true if login_once
|
16
|
+
rescue Exception => e
|
17
|
+
puts e
|
18
|
+
end
|
19
|
+
end
|
20
|
+
false
|
21
|
+
end
|
22
|
+
def login_once
|
23
|
+
# Ask login info
|
24
|
+
email = ask("FlyData Email: ")
|
25
|
+
password = ask("FlyData password: ") {|q| q.echo = false}
|
26
|
+
flydata.credentials = Flydata::Credentials.new(email, password)
|
27
|
+
# Auth request
|
14
28
|
flydata.post('/users/sign_in')
|
15
29
|
if flydata.response.code == 201 # 201: Created
|
16
30
|
say("Login succeeded!")
|
17
31
|
flydata.credentials.authenticate!
|
32
|
+
return true
|
18
33
|
end
|
34
|
+
say("Login failed!")
|
35
|
+
false
|
19
36
|
end
|
20
37
|
end
|
21
38
|
end
|
@@ -16,13 +16,21 @@ module Flydata
|
|
16
16
|
end
|
17
17
|
|
18
18
|
say('Starting sender process.')
|
19
|
-
|
19
|
+
Dir.chdir(FLYDATA_HOME){
|
20
|
+
system("fluentd -d #{FLYDATA_HOME}/flydata.pid -l #{FLYDATA_HOME}/flydata.log -c #{FLYDATA_HOME}/flydata.conf")
|
21
|
+
}
|
20
22
|
|
21
23
|
sleep 5
|
24
|
+
|
25
|
+
data_port = flydata.data_port.get
|
26
|
+
data_port_id = data_port['id']
|
27
|
+
|
22
28
|
retry_count = 10
|
29
|
+
ready = false
|
23
30
|
1.upto(retry_count) do |i|
|
24
|
-
if client_ready?
|
31
|
+
if (ready or ready = client_ready?) and uploaded_successfully?(data_port_id)
|
25
32
|
say('Done.')
|
33
|
+
say("Go to your Dashboard! http://#{Flydata::FLYDATA_API_HOST}")
|
26
34
|
return true
|
27
35
|
end
|
28
36
|
say("Waiting client side active... (#{i}/#{retry_count})")
|
@@ -30,8 +38,14 @@ module Flydata
|
|
30
38
|
end
|
31
39
|
|
32
40
|
say('Something wrong..')
|
41
|
+
false
|
33
42
|
end
|
34
43
|
def stop
|
44
|
+
unless process_exist?
|
45
|
+
say("Process doesn't exist.")
|
46
|
+
return true
|
47
|
+
end
|
48
|
+
|
35
49
|
say('Stopping sender process.')
|
36
50
|
if system("kill `cat #{FLYDATA_HOME}/flydata.pid`")
|
37
51
|
say('Done.')
|
@@ -39,10 +53,21 @@ module Flydata
|
|
39
53
|
else
|
40
54
|
say('Something wrong..')
|
41
55
|
end
|
56
|
+
false
|
42
57
|
end
|
43
58
|
def restart
|
44
|
-
|
45
|
-
|
59
|
+
if process_exist?
|
60
|
+
say('Restarting sender process.')
|
61
|
+
if system("kill -HUP `cat #{FLYDATA_HOME}/flydata.pid`")
|
62
|
+
say('Done.')
|
63
|
+
return true
|
64
|
+
else
|
65
|
+
say('Something wrong..')
|
66
|
+
end
|
67
|
+
else
|
68
|
+
say("Process doesn't exist.")
|
69
|
+
start
|
70
|
+
end
|
46
71
|
end
|
47
72
|
|
48
73
|
private
|
@@ -57,6 +82,10 @@ module Flydata
|
|
57
82
|
process_count = `ps aux|grep -v grep|grep "\\.flydata/flydata\\.conf"|grep fluentd|wc -l`.to_i
|
58
83
|
process_count > 0
|
59
84
|
end
|
85
|
+
def uploaded_successfully?(data_port_id)
|
86
|
+
res = flydata.get("/data_ports/#{data_port_id}/tail.json")
|
87
|
+
res and res['logs'] and res['logs'].size > 0
|
88
|
+
end
|
60
89
|
end
|
61
90
|
end
|
62
91
|
end
|
@@ -15,8 +15,13 @@ module Flydata
|
|
15
15
|
private
|
16
16
|
def choose_data_entry
|
17
17
|
data_entries = retrieve_data_entries
|
18
|
+
if data_entries.size < 1
|
19
|
+
puts("There are no registered entries.")
|
20
|
+
puts("You need to create a data entry by flydata setup command.")
|
21
|
+
return nil
|
22
|
+
end
|
18
23
|
choices = data_entries.map {|e|
|
19
|
-
"#{e['
|
24
|
+
"#{e['name']}\t#{e['log_path']}\t -- Log deletion:#{boolToOnOff e['log_deletion']}"
|
20
25
|
}
|
21
26
|
choices << "Cancel"
|
22
27
|
|
@@ -18,23 +18,47 @@ module Flydata
|
|
18
18
|
# login
|
19
19
|
Flydata::Command::Login.new.run unless flydata.credentials.authenticated?
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
21
|
+
# choose entries
|
22
|
+
unless shown = show_registered_entries and !(more_entry?)
|
23
|
+
begin
|
24
|
+
unless shown
|
25
|
+
show_registered_entries
|
26
|
+
shown = false
|
27
|
+
end
|
28
|
+
path = choose_log_path_from_examples
|
29
|
+
case path
|
30
|
+
when OTHER; ask_log_path
|
31
|
+
else; create_log_entry(path, ask_log_deletion)
|
32
|
+
end
|
33
|
+
newline
|
34
|
+
end while more_entry?
|
35
|
+
end
|
29
36
|
|
30
37
|
# start client process
|
31
|
-
|
32
|
-
sender.start
|
38
|
+
Flydata::Command::Sender.new.restart
|
33
39
|
end
|
34
40
|
|
35
41
|
private
|
42
|
+
def show_registered_entries
|
43
|
+
data_entries = retrieve_data_entries
|
44
|
+
@last_fetched_entries = data_entries
|
45
|
+
if data_entries and data_entries.size > 0
|
46
|
+
puts('Registered entries. ')
|
47
|
+
data_entries.each { |data_entry|
|
48
|
+
say(" - #{data_entry['name']}\t#{data_entry['log_path']}")
|
49
|
+
}
|
50
|
+
true
|
51
|
+
else
|
52
|
+
false
|
53
|
+
end
|
54
|
+
end
|
36
55
|
def choose_log_path_from_examples
|
37
56
|
candidates = (`ls #{LOG_PATH_EXAMPLES.join(' ')} 2>/dev/null`).split(/\s+/)
|
57
|
+
candidates = candidates.find_all{|path| File.readable?(path)}
|
58
|
+
if @last_fetched_entries
|
59
|
+
candidates = candidates - @last_fetched_entries.map{|v| v['log_path']}
|
60
|
+
end
|
61
|
+
return OTHER unless candidates.size > 0
|
38
62
|
candidates << OTHER
|
39
63
|
choice = nil
|
40
64
|
say('Please select your log path for sending FlyData')
|
data/lib/flydata/credentials.rb
CHANGED
@@ -4,9 +4,12 @@ module Flydata
|
|
4
4
|
attr_reader :user, :password
|
5
5
|
def initialize(user=nil, password=nil)
|
6
6
|
read_credentials
|
7
|
-
|
8
|
-
@user = user
|
9
|
-
@password = password
|
7
|
+
if user && password
|
8
|
+
@user = user
|
9
|
+
@password = password
|
10
|
+
elsif !(@authenticated)
|
11
|
+
@user = ENV['FLYDATA_LOGIN']
|
12
|
+
@password = ENV['FLYDATA_PASSWORD']
|
10
13
|
end
|
11
14
|
end
|
12
15
|
def authenticate!
|
data/lib/flydata/cron.rb
CHANGED
@@ -1,14 +1,88 @@
|
|
1
1
|
module Flydata
|
2
2
|
class Cron
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
FLYDATA_HOME=Flydata::HOME_DIR
|
4
|
+
CRON_TMP_PATH="#{FLYDATA_HOME}/cron_list.tmp"
|
5
|
+
CRON_BACKUP_PATH="#{FLYDATA_HOME}/cron_list.back"
|
6
|
+
LOG_PATH="#{FLYDATA_HOME}/flydata_cron.log"
|
7
|
+
ROUTINE_BASE_COMMAND="#{FLYDATA_HOME}/bin/flydata routine >> #{LOG_PATH} 2>&1"
|
8
|
+
if ENV['FLYDATA_API_HOST'] and ENV['FLYDATA_API_HOST'] != ""
|
9
|
+
ROUTINE_COMMAND="export FLYDATA_API_HOST=#{ENV['FLYDATA_API_HOST']} && #{ROUTINE_BASE_COMMAND}"
|
10
|
+
else
|
11
|
+
ROUTINE_COMMAND=ROUTINE_BASE_COMMAND
|
12
|
+
end
|
13
|
+
|
14
|
+
#CRON_LINE="15 4 * * * #{ROUTINE_COMMAND}"
|
15
|
+
CRON_LINE="* * * * * #{ROUTINE_COMMAND}"
|
16
|
+
REMOVE_OPTION="-r"
|
17
|
+
|
6
18
|
def initialize
|
7
19
|
end
|
8
20
|
def update(option=nil)
|
9
21
|
arg = option ? option : ''
|
10
|
-
|
11
|
-
|
22
|
+
|
23
|
+
# Check condition
|
24
|
+
check_crontab_command
|
25
|
+
dump_cron_setting
|
26
|
+
reagistered = check_cron_setting
|
27
|
+
|
28
|
+
# Remove mode
|
29
|
+
if arg == REMOVE_OPTION
|
30
|
+
unless reagistered
|
31
|
+
puts "Skip removing. There are no flydata jobs in crontab."
|
32
|
+
else
|
33
|
+
remove_cron_setting
|
34
|
+
puts "Updated crontab to remove the deletion of your log data."
|
35
|
+
end
|
36
|
+
# Add mode
|
37
|
+
else
|
38
|
+
if reagistered
|
39
|
+
puts "Skip register. Already cron setup done."
|
40
|
+
else
|
41
|
+
add_cron_setting
|
42
|
+
puts "Updated crontab to manage the deletion of your log data."
|
43
|
+
end
|
44
|
+
end
|
45
|
+
true
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
def check_crontab_command
|
50
|
+
raise "Failed to update. Crontab is not installed." unless system("which crontab > /dev/null")
|
51
|
+
end
|
52
|
+
def dump_cron_setting
|
53
|
+
system("crontab -l > #{CRON_BACKUP_PATH}")
|
54
|
+
end
|
55
|
+
def check_cron_setting
|
56
|
+
already_exist = false
|
57
|
+
File.open(CRON_BACKUP_PATH, 'r') { |file|
|
58
|
+
while l = file.gets
|
59
|
+
if l =~ /#{ROUTINE_COMMAND}/
|
60
|
+
already_exist = true
|
61
|
+
break
|
62
|
+
end
|
63
|
+
end
|
64
|
+
}
|
65
|
+
already_exist
|
66
|
+
end
|
67
|
+
def add_cron_setting
|
68
|
+
FileUtils.copy(CRON_BACKUP_PATH, CRON_TMP_PATH)
|
69
|
+
File.open(CRON_TMP_PATH, "a") { |file|
|
70
|
+
file.puts(CRON_LINE)
|
71
|
+
}
|
72
|
+
ret = system("crontab #{CRON_TMP_PATH}")
|
73
|
+
raise "Failed to register flydata routine job to crontab." unless ret
|
74
|
+
end
|
75
|
+
def remove_cron_setting
|
76
|
+
File.open(CRON_TMP_PATH, "w") { |dst|
|
77
|
+
File.open(CRON_BACKUP_PATH, 'r') { |src|
|
78
|
+
while l = src.gets
|
79
|
+
dst.puts(l) unless l =~ /#{ROUTINE_COMMAND}/
|
80
|
+
end
|
81
|
+
}
|
82
|
+
}
|
83
|
+
ret = system("crontab #{CRON_TMP_PATH}")
|
84
|
+
raise "Failed to remove flydata routine job from crontab." unless ret
|
12
85
|
end
|
86
|
+
|
13
87
|
end
|
14
88
|
end
|
data/lib/flydata/log_monitor.rb
CHANGED
@@ -28,7 +28,7 @@ module Flydata
|
|
28
28
|
# initialize paths
|
29
29
|
@flydata_path = File.join(File.dirname(@log_path),
|
30
30
|
FLYDATA_DIR,
|
31
|
-
File.basename(@log_path))
|
31
|
+
File.basename(@log_path) + ".d")
|
32
32
|
@backup_path = File.join(@flydata_path, BACKUP_DIR)
|
33
33
|
@trash_path = File.join(@flydata_path, TRASH_DIR)
|
34
34
|
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.1.
|
4
|
+
version: 0.0.1.2011102601
|
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: 2012-10-
|
12
|
+
date: 2012-10-26 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: 2346901440603012980
|
279
279
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
280
280
|
none: false
|
281
281
|
requirements:
|