bixby-agent 0.3.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.
- checksums.yaml +7 -0
- data/.document +5 -0
- data/.testguardrc +1 -0
- data/.travis.yml +25 -0
- data/Gemfile +61 -0
- data/Gemfile.lock +237 -0
- data/LICENSE +21 -0
- data/Rakefile +13 -0
- data/VERSION +1 -0
- data/bin/bixby-agent +15 -0
- data/bixby-agent.gemspec +186 -0
- data/etc/bixby-god.initd +70 -0
- data/etc/bixby.god +20 -0
- data/etc/god.d/bixby-agent.god +71 -0
- data/lib/bixby-agent.rb +16 -0
- data/lib/bixby-agent/agent.rb +98 -0
- data/lib/bixby-agent/agent/config.rb +109 -0
- data/lib/bixby-agent/agent/crypto.rb +73 -0
- data/lib/bixby-agent/agent/handshake.rb +81 -0
- data/lib/bixby-agent/agent/shell_exec.rb +111 -0
- data/lib/bixby-agent/agent_handler.rb +38 -0
- data/lib/bixby-agent/app.rb +208 -0
- data/lib/bixby-agent/app/cli.rb +112 -0
- data/lib/bixby-agent/config_exception.rb +5 -0
- data/lib/bixby-agent/help/system_time.rb +41 -0
- data/lib/bixby-agent/version.rb +8 -0
- data/lib/bixby-agent/websocket/client.rb +186 -0
- data/tasks/cane.rake +14 -0
- data/tasks/coverage.rake +2 -0
- data/tasks/coveralls.rake +11 -0
- data/tasks/jeweler.rake +21 -0
- data/tasks/test.rake +5 -0
- data/tasks/yard.rake +6 -0
- data/test/base.rb +92 -0
- data/test/helper.rb +29 -0
- data/test/stub_eventmachine.rb +38 -0
- data/test/support/root_dir/bixby.yml +8 -0
- data/test/support/root_dir/id_rsa +27 -0
- data/test/support/root_dir/server +27 -0
- data/test/support/root_dir/server.pub +9 -0
- data/test/support/test_bundle/bin/cat +2 -0
- data/test/support/test_bundle/bin/echo +2 -0
- data/test/support/test_bundle/digest +17 -0
- data/test/support/test_bundle/manifest.json +0 -0
- data/test/test_agent.rb +110 -0
- data/test/test_agent_exec.rb +53 -0
- data/test/test_agent_handler.rb +72 -0
- data/test/test_app.rb +138 -0
- data/test/test_bixby_common.rb +18 -0
- data/test/test_crypto.rb +78 -0
- data/test/websocket/test_client.rb +110 -0
- metadata +557 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
MIIEpAIBAAKCAQEA30PBCsqplS1HmJ91OQEGYuNyZw3Qf7WQ2eAvesPbVecXxBru
|
3
|
+
oRditkBeVMivLem2FK6TNao3ps+5gQR6N50pG2sRI+Itxepo2VVUhztxRwysPfED
|
4
|
+
8pkCP0LS4uzF11Lb9VIHDdQTvgNmayqGYq5/PuiioKzDkIsHiR3V6FT/sXbGAMRi
|
5
|
+
pAmzMDjNa0OVZCbr8zXh76MPL+bVTJHvn0BysNhCdvn5tHSvHPw54y5WAbC5FEie
|
6
|
+
5nySThSR0IsFWrOAiE+PPbmHy7YCC7ROIjJDvI9dfesmBn2KH2aesaP/6QLzZsft
|
7
|
+
iF/9D4hItQVRTk5yzXYeZFsC4be3sVyO4iOIiQIDAQABAoIBAQDMpoWHx9cEd9nd
|
8
|
+
66R+2RKqiIQwNHh+58ZcAGRlKqydpFOjnXBJV29TUdNl8gKpmkYd1Rv5IAsdK+GF
|
9
|
+
gr4oxjWM/WpbsxJ0DXeIZ/AweWtPTi2AJbGRqXFm3XEDMzfyNPCMgWEX6uMh1GoI
|
10
|
+
J5XBVOQsnP+dOl+U2evRYvjVmzw5xMfM8GKWLj+qcAVyyzHrl4yTu/o6phRwdflh
|
11
|
+
805+XC6knuKj7rDfrXnoR1TX6MbMBWMLlvdNB+Hd6ZB+sDOvQezycSJ3nE2AVyqQ
|
12
|
+
n1otVbL7xhfKiKrfdGz4d/CcvbrCpDyMLBdkvXBWn35XW334u1SAb8DE89gjF2mn
|
13
|
+
1iFCEplRAoGBAPs6iUw0S1t7HT1b/BhdO/lEpirR87WIwrDRiFElpfZlvIliJSgy
|
14
|
+
Z6VmbfkrmaXctkHg3VtAVRE9Eb19UMWA+OMNkQ9Du2EIo8SvgCqI4+LMOsZBDDzh
|
15
|
+
ilfjgv2Skx8/qCHbHlr/Tlc8Qj/sbz3hDRRCQFYs4zxnmZxr7UGxjk4lAoGBAOOB
|
16
|
+
QggYHYlHQatdIShW6YyrWIrDmI4fSaK8YVTLoCYl+/lMZTcb0zPv2awHWmWBZXeG
|
17
|
+
Wx0bs8aJun0vbIH7hAH1mjFFtjZ+HhzSBW4H/pKR/DNywD9kVpfuLnKnz6hg6fGg
|
18
|
+
5h38D7z/u/zu2LYWKpp9tWiI7YCrgpW3H52ckcmVAoGAe556IL06t3EFGkRA79ww
|
19
|
+
vp9BBKD6wsDgzBDOet+DopK9Cvz4O6dRyNl2E72YhTztkc0MHvKw6SKbsBoRvJ2R
|
20
|
+
2me6kUBK25xcuVOCRWvGdrr30MYBN5PjdwvEUPHm4uF34fDoJu6ppdNI5ht5QYGT
|
21
|
+
5fwTnFPKHNb9hzK0NDciRuECgYAHZOIShUYgehJmUWaMexaoHcGI8QZ6SAYKpfi7
|
22
|
+
2spfswhXd+YqPltE6ty2PJ7xgZ0cn19CuO3E3CEVhH8QUm5d6e+S/mMHrl2oLiND
|
23
|
+
Cjt55AjAW1BoPwiZc4JK861KGaxA0CvqeZDBYcZoWBLvCBVmZAOLXDfr4Kcj2onK
|
24
|
+
g5YxaQKBgQC0UDAALa7yW8W4rHyIOs4u5Fthrk3cYWx8bM7Vy4rOWmXNL1rseD3B
|
25
|
+
dwM51dqrnvqW0XtgJlfgCXbzAqFY+xz33fSxqueojA0N7QcgnBy8mm9SE9RPOSVG
|
26
|
+
7HWlwi7dbepPK7+3mnLGathE6xcl6EddZiLSvqlWkjJB/asY3iZvyQ==
|
27
|
+
-----END RSA PRIVATE KEY-----
|
@@ -0,0 +1,27 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
MIIEpAIBAAKCAQEAu9t/atvz1Xzb3cLPkiNXFj25CF7BucYLbEmNG7ctjJuuchiG
|
3
|
+
Vm8D0hq2aar6P7DZIrIRYd/Z6iK7F/6e4m2aP2AMkJF1Ypp1I0nADLHB1+A1kyCt
|
4
|
+
w61csJYzTdUNlOnE3Qno8s2iLNvRDv7S/pYUw4aJNZG9JyBextpDeRc2q6NTEwU+
|
5
|
+
TjvynS2oWAO/te+wbiTpX0uOM5mtgggmHU3b2I+HhQQ1w4XTfivZbhzgB3hKtAAL
|
6
|
+
aMI5ycamCK+OMSjZU0YA7xcQbmYXZPgLT29YB11GSqjULOBqVyvJX/AREFQDiLU0
|
7
|
+
SKLtx60G6NgBGPwHUvSBxOcAUzlBrtBek6OHMQIDAQABAoIBAFCnH2BYiKpKzfa6
|
8
|
+
0fVTGOuimlNeo1vIDFV0ipGwpmys1kuD/gET7pcBAvoA/ynjGoZL3yyfN+bO/HaD
|
9
|
+
yeE63zOAYESdPsGTwODipAKPOsMdLsM5D4FoZ9gk1GgBJbCeYPfpbkr4QD10LqB6
|
10
|
+
hUnqU4XSuAv4wzYOLsK/KKLPdZhgbQmKfBV3AWaJFGFnZ/ByKakR1hHyleJOJS/y
|
11
|
+
fxb6PIx0G5aqMfFYwaEMI67NEBn1WYHp/XDPzdtDHMEQbgHpiIPKzldmX8yRV9Gu
|
12
|
+
tsT1P6hrT5dkLvuey6EzDahhf+BB9Bwfi6GoK17awg7fuw7x/A8u3bantkfONM60
|
13
|
+
KBtt8hUCgYEA6BpKIq2VuaycbEqBgylXfBKUiM4Z8T3M8tnEET5CnEYZCD8eaJED
|
14
|
+
bicIE8BFgMXJ7vGi4taPHaPskQiTUXLGpktoy1YqWwrRzDL2kvfV+HcX9KDJzWtL
|
15
|
+
YhLOvschVtl98a62xVyC/j8frIyCE+PWjrVMSzB7l4vAlar+92X7mWsCgYEAzzMA
|
16
|
+
Qjt07chSLLxhergxX8XYpOEk4IHZp0SUC+ez3PLtNkB3ybnU6wPWYlgL19YwbuQB
|
17
|
+
ShBa4b649G+U3MfG+k8HRRAK7nH4t7qtGNlXXkr1vFgkkhlbGdOu8in2BVK+C/kq
|
18
|
+
/XbXAM1FUCfbvIsku/Epjl++0s55AMRLL6CtPNMCgYEA4QUD1MT3gJBBApflIfUF
|
19
|
+
tOsKh+tQqVpiBRtsg88ZowouoJkY8QWODs/We9ePSn32/SnU4hhjnbfb1Ow8bt1Y
|
20
|
+
i8ZWLbQ20hcWOOM7vFZ8YiuL1QXBP98CsW1MdRb3Uoz/Fj1tQsAi2zz1h0KdpYzg
|
21
|
+
6XAJLGgvmkfKCRBDqjR8DUsCgYAUqSpCcHlVaJ9BFLvHp+xMd4cF0emCdZBFjKIS
|
22
|
+
mdUmmBatTTpkpCImGSjcf5kWuaX0uMmkIANf9UuuHB5E8arWtOCts07TvgumDnhK
|
23
|
+
PQnoPiNI16U16E9cQO51+Vct6rVGrl7qDVqdGtrphj/0Cg/sqbySFNwLW0lXmTtC
|
24
|
+
EYyUvwKBgQCYV6AaO/6YtNO9GlYjQdm3EIxwuZTylM58ylPuuaw+lORpJpYqPnOR
|
25
|
+
7OgXui6Unh/1UtYDtoISOXNVr/K6T3wMQwZjpn4gRyJFs0ADs7/HoQIo3KeP1sY9
|
26
|
+
6rIr8iVsdb/fZW7MaFv4nEMMJPVvzUsHRLA/a+wVTa/Mo/doZkYITQ==
|
27
|
+
-----END RSA PRIVATE KEY-----
|
@@ -0,0 +1,9 @@
|
|
1
|
+
-----BEGIN PUBLIC KEY-----
|
2
|
+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu9t/atvz1Xzb3cLPkiNX
|
3
|
+
Fj25CF7BucYLbEmNG7ctjJuuchiGVm8D0hq2aar6P7DZIrIRYd/Z6iK7F/6e4m2a
|
4
|
+
P2AMkJF1Ypp1I0nADLHB1+A1kyCtw61csJYzTdUNlOnE3Qno8s2iLNvRDv7S/pYU
|
5
|
+
w4aJNZG9JyBextpDeRc2q6NTEwU+TjvynS2oWAO/te+wbiTpX0uOM5mtgggmHU3b
|
6
|
+
2I+HhQQ1w4XTfivZbhzgB3hKtAALaMI5ycamCK+OMSjZU0YA7xcQbmYXZPgLT29Y
|
7
|
+
B11GSqjULOBqVyvJX/AREFQDiLU0SKLtx60G6NgBGPwHUvSBxOcAUzlBrtBek6OH
|
8
|
+
MQIDAQAB
|
9
|
+
-----END PUBLIC KEY-----
|
@@ -0,0 +1,17 @@
|
|
1
|
+
{
|
2
|
+
"digest": "c1af0e59a74367e83492a7501f6bdd7ed33de005c3f727a302c5ddfafa8c6f70",
|
3
|
+
"files": [
|
4
|
+
{
|
5
|
+
"file": "bin/cat",
|
6
|
+
"digest": "6d14ab63802f3ef51bdc16db1cfeb6df93167fe7a2aa09a6c737293d42c118b2"
|
7
|
+
},
|
8
|
+
{
|
9
|
+
"file": "bin/echo",
|
10
|
+
"digest": "5ca36fa0f9bd59e8169cc379215e6a481363df5b1e745f0442170fe6a56e1118"
|
11
|
+
},
|
12
|
+
{
|
13
|
+
"file": "manifest.json",
|
14
|
+
"digest": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
15
|
+
}
|
16
|
+
]
|
17
|
+
}
|
File without changes
|
data/test/test_agent.rb
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
|
2
|
+
require 'helper'
|
3
|
+
|
4
|
+
module Bixby
|
5
|
+
module Test
|
6
|
+
|
7
|
+
class TestAgent < TestCase
|
8
|
+
|
9
|
+
def setup
|
10
|
+
super
|
11
|
+
ENV["BIXBY_HOME"] = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def teardown
|
15
|
+
super
|
16
|
+
ENV["BIXBY_HOME"] = nil
|
17
|
+
ENV["BIXBY_LOG"] = nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_create_new_agent
|
21
|
+
@agent = create_new_agent()
|
22
|
+
@agent.save_config()
|
23
|
+
assert(@agent.new?)
|
24
|
+
assert( File.exists? File.join(@root_dir, "etc", "bixby.yml") )
|
25
|
+
assert ENV["BIXBY_HOME"]
|
26
|
+
assert_equal ENV["BIXBY_HOME"], @root_dir
|
27
|
+
|
28
|
+
assert_equal 1, Logging::Logger.root.level # default is info
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_load_existing_agent
|
32
|
+
setup_existing_agent()
|
33
|
+
@agent = create_new_agent()
|
34
|
+
assert(!@agent.new?)
|
35
|
+
assert ENV["BIXBY_HOME"]
|
36
|
+
assert_equal ENV["BIXBY_HOME"], @root_dir
|
37
|
+
|
38
|
+
assert_equal 1, Logging::Logger.root.level # info level is in yaml
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_load_existing_agent_override_log
|
42
|
+
ENV["BIXBY_LOG"] = "debug"
|
43
|
+
setup_existing_agent()
|
44
|
+
@agent = create_new_agent()
|
45
|
+
assert(!@agent.new?)
|
46
|
+
assert ENV["BIXBY_HOME"]
|
47
|
+
assert_equal ENV["BIXBY_HOME"], @root_dir
|
48
|
+
|
49
|
+
assert_equal 0, Logging::Logger.root.level
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_load_existing_agent_using_env
|
53
|
+
setup_existing_agent()
|
54
|
+
ENV["BIXBY_HOME"] = @root_dir
|
55
|
+
|
56
|
+
@agent = Agent.create()
|
57
|
+
assert @agent
|
58
|
+
assert(!@agent.new?)
|
59
|
+
assert ENV["BIXBY_HOME"]
|
60
|
+
assert_equal ENV["BIXBY_HOME"], @root_dir
|
61
|
+
assert_equal @root_dir, Bixby.root
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_register_with_manager
|
65
|
+
@agent = create_new_agent()
|
66
|
+
|
67
|
+
response_str = MultiJson.dump({
|
68
|
+
:data => {:server_key => "-----BEGIN RSA PUBLIC KEY-----",
|
69
|
+
:access_key => "foo",
|
70
|
+
:secret_key => "bar"},
|
71
|
+
:code => nil,
|
72
|
+
:status => "success",
|
73
|
+
:message => nil })
|
74
|
+
|
75
|
+
# stub out http request
|
76
|
+
stub_request(:post, "#{@manager_uri}/api").with { |req|
|
77
|
+
req.body =~ /inventory:register_agent/ and req.body =~ /"tenant":"pixelcop"/
|
78
|
+
|
79
|
+
}.to_return(:body => response_str, :status => 200)
|
80
|
+
|
81
|
+
response = @agent.register_agent(@manager_uri, @tenant, @password)
|
82
|
+
assert response.status == "success"
|
83
|
+
|
84
|
+
key_file = Bixby.path("etc", "server.pub")
|
85
|
+
assert File.exists? key_file
|
86
|
+
assert File.read(key_file).include? "PUBLIC KEY"
|
87
|
+
|
88
|
+
assert_equal "foo", @agent.access_key
|
89
|
+
assert_equal "bar", @agent.secret_key
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_bad_config
|
93
|
+
setup_existing_agent()
|
94
|
+
File.open(config_file(), 'w') { |f| f.write("foo") }
|
95
|
+
assert_throws(SystemExit) do
|
96
|
+
Agent.create
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
private
|
102
|
+
|
103
|
+
def config_file
|
104
|
+
File.join(@root_dir, "etc", "bixby.yml")
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
|
2
|
+
require 'helper'
|
3
|
+
|
4
|
+
module Bixby
|
5
|
+
module Test
|
6
|
+
|
7
|
+
class AgentExec < TestCase
|
8
|
+
|
9
|
+
def setup
|
10
|
+
super
|
11
|
+
setup_test_bundle("support", "test_bundle", "echo",
|
12
|
+
"c1af0e59a74367e83492a7501f6bdd7ed33de005c3f727a302c5ddfafa8c6f70")
|
13
|
+
@agent = create_new_agent()
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_exec_error
|
17
|
+
# throws the first time
|
18
|
+
assert_throws(BundleNotFound) do
|
19
|
+
@agent.shell_exec(@c.to_hash)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_exec_pass
|
24
|
+
setup_root()
|
25
|
+
@c.args = "foo bar baz"
|
26
|
+
@c.user = `whoami`.strip
|
27
|
+
@c.group = `groups`.strip.split(/ /).first
|
28
|
+
ret = @agent.shell_exec(@c.to_hash)
|
29
|
+
assert ret
|
30
|
+
assert_kind_of CommandResponse, ret
|
31
|
+
assert_kind_of Fixnum, ret.status
|
32
|
+
assert_equal 0, ret.status
|
33
|
+
assert ret.stdout
|
34
|
+
assert ret.stderr
|
35
|
+
assert_equal "foo bar baz\n", ret.stdout
|
36
|
+
assert_equal "", ret.stderr
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_execute_stdin
|
40
|
+
setup_root()
|
41
|
+
@c.command = "cat"
|
42
|
+
@c.stdin = "hi"
|
43
|
+
ret = @agent.shell_exec(@c.to_hash)
|
44
|
+
assert_equal 0, ret.status
|
45
|
+
assert_equal "hi", ret.stdout
|
46
|
+
assert_equal "", ret.stderr
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
|
2
|
+
require 'helper'
|
3
|
+
|
4
|
+
module Bixby
|
5
|
+
module Test
|
6
|
+
class TestAgentHandler < TestCase
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
ENV["BIXBY_HOME"] = nil
|
11
|
+
|
12
|
+
setup_existing_agent()
|
13
|
+
@agent = create_new_agent()
|
14
|
+
assert(!@agent.new?)
|
15
|
+
assert ENV["BIXBY_HOME"]
|
16
|
+
assert_equal ENV["BIXBY_HOME"], @root_dir
|
17
|
+
|
18
|
+
# more setup
|
19
|
+
setup_test_bundle("support", "test_bundle", "echo",
|
20
|
+
"c1af0e59a74367e83492a7501f6bdd7ed33de005c3f727a302c5ddfafa8c6f70")
|
21
|
+
setup_root()
|
22
|
+
end
|
23
|
+
|
24
|
+
def teardown
|
25
|
+
ENV["BIXBY_HOME"] = nil
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_handle
|
29
|
+
@c.args = "foobar"
|
30
|
+
req = JsonRequest.new("shell_exec", @c.to_hash)
|
31
|
+
|
32
|
+
res = AgentHandler.new(nil).handle(req) # this is the actual test call
|
33
|
+
assert res
|
34
|
+
assert_kind_of JsonResponse, res
|
35
|
+
assert res.success? # shell exec succeeded
|
36
|
+
|
37
|
+
res = CommandResponse.from_json_response(res)
|
38
|
+
assert_kind_of CommandResponse, res
|
39
|
+
assert res.success? # actual command succeeded
|
40
|
+
assert_equal 0, res.status
|
41
|
+
assert_equal "foobar\n", res.stdout
|
42
|
+
assert_equal "", res.stderr
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_handle_bundle_not_found
|
46
|
+
@c.bundle = "foo"
|
47
|
+
req = JsonRequest.new("shell_exec", @c.to_hash)
|
48
|
+
|
49
|
+
res = AgentHandler.new(nil).handle(req)
|
50
|
+
puts res.to_s
|
51
|
+
refute res.success?
|
52
|
+
assert_equal 404, res.code
|
53
|
+
assert res.message =~ /bundle not found/
|
54
|
+
assert_equal nil, res.data
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_handle_command_not_found
|
58
|
+
@c.command = "foo"
|
59
|
+
req = JsonRequest.new("shell_exec", @c.to_hash)
|
60
|
+
|
61
|
+
res = AgentHandler.new(nil).handle(req)
|
62
|
+
puts res.to_s
|
63
|
+
refute res.success?
|
64
|
+
assert_equal 404, res.code
|
65
|
+
assert res.message =~ /command not found/
|
66
|
+
assert_equal nil, res.data
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/test/test_app.rb
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
|
2
|
+
require 'helper'
|
3
|
+
require 'timeout'
|
4
|
+
|
5
|
+
module Bixby
|
6
|
+
module Test
|
7
|
+
|
8
|
+
class TestApp < TestCase
|
9
|
+
|
10
|
+
def teardown
|
11
|
+
ENV["BIXBY_LOG"] = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_load_agent
|
15
|
+
ARGV.clear
|
16
|
+
ARGV << "--register" << @manager_uri
|
17
|
+
ARGV << "-d" << @root_dir
|
18
|
+
ARGV << "--tenant" << "mytenant"
|
19
|
+
ARGV << "--password" << "mypass"
|
20
|
+
|
21
|
+
response_str = MultiJson.dump({
|
22
|
+
:data => {:server_key => "-----BEGIN RSA PUBLIC KEY-----",
|
23
|
+
:access_key => "foo",
|
24
|
+
:secret_key => "bar"},
|
25
|
+
:code => nil,
|
26
|
+
:status => "success",
|
27
|
+
:message => nil })
|
28
|
+
|
29
|
+
stub_request(:post, "http://localhost:3000/api").
|
30
|
+
to_return(:status => 200, :body => response_str)
|
31
|
+
|
32
|
+
# stub out daemons & sinatra server
|
33
|
+
Daemons.expects(:run_proc).once().with{ |name,opts|
|
34
|
+
name == "bixby-agent" && opts.kind_of?(Hash) &&
|
35
|
+
opts[:dir] == File.join(@root_dir, "var")
|
36
|
+
}
|
37
|
+
|
38
|
+
app = App.new.run!
|
39
|
+
|
40
|
+
assert_requested(:post, @manager_uri + "/api", :times => 1)
|
41
|
+
conf_file = File.join(@root_dir, "etc", "bixby.yml")
|
42
|
+
assert File.exists? conf_file
|
43
|
+
assert File.exists? File.join(@root_dir, "etc", "server.pub")
|
44
|
+
|
45
|
+
# verify yaml config file
|
46
|
+
conf = File.read(conf_file)
|
47
|
+
assert conf
|
48
|
+
assert_includes conf, "uuid"
|
49
|
+
assert_includes conf, "mac_address"
|
50
|
+
assert_includes conf, "access_key"
|
51
|
+
assert_includes conf, "secret_key"
|
52
|
+
assert_includes conf, "log_level"
|
53
|
+
Bixby::Agent::Config::KEYS.each{ |k| assert_includes conf, k }
|
54
|
+
|
55
|
+
assert_includes conf, "foo"
|
56
|
+
assert_includes conf, "bar"
|
57
|
+
assert_kind_of Hash, YAML.load(conf)
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_run_agent
|
61
|
+
|
62
|
+
ARGV.clear
|
63
|
+
ARGV << "--register" # uri should default to bixby.io
|
64
|
+
ARGV << "--debug"
|
65
|
+
ARGV << "--directory" << @root_dir
|
66
|
+
ARGV << "--tenant" << "mytenant"
|
67
|
+
ARGV << "--password" << "mypass"
|
68
|
+
|
69
|
+
Bixby::WebSocket::Client.any_instance.expects(:start).once()
|
70
|
+
|
71
|
+
response_str = MultiJson.dump({
|
72
|
+
:data => {:server_key => "-----BEGIN RSA PUBLIC KEY-----",
|
73
|
+
:access_key => "foo",
|
74
|
+
:secret_key => "bar"},
|
75
|
+
:code => nil,
|
76
|
+
:status => "success",
|
77
|
+
:message => nil })
|
78
|
+
|
79
|
+
stub_request(:post, "https://bixby.io/api").
|
80
|
+
to_return(:status => 200, :body => response_str)
|
81
|
+
|
82
|
+
App.new.run!
|
83
|
+
|
84
|
+
assert_equal "debug", ENV["BIXBY_LOG"]
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_run_with_bad_manager_uri
|
88
|
+
ARGV.clear
|
89
|
+
ARGV << "--register" << "asdf"
|
90
|
+
ARGV << "-d" << @root_dir
|
91
|
+
|
92
|
+
assert_throws(ConfigException) do
|
93
|
+
App.new.run!
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_register_failed
|
98
|
+
|
99
|
+
ARGV.clear
|
100
|
+
ARGV << "-d"
|
101
|
+
ARGV << @root_dir
|
102
|
+
ARGV << @manager_uri
|
103
|
+
|
104
|
+
stub_request(:post, "http://localhost:3000/api").to_return(:status => 200, :body => MultiJson.dump({:status => "fail"}))
|
105
|
+
|
106
|
+
app = App.new
|
107
|
+
assert_throws(SystemExit) do
|
108
|
+
app.load_agent()
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_register_agent_with_old_date
|
114
|
+
|
115
|
+
ARGV.clear
|
116
|
+
ARGV << "--register" # uri should default to bixby.io
|
117
|
+
ARGV << "--debug"
|
118
|
+
ARGV << "--directory" << @root_dir
|
119
|
+
ARGV << "--tenant" << "mytenant"
|
120
|
+
ARGV << "--password" << "mypass"
|
121
|
+
|
122
|
+
stub_request(:get, "http://google.com/").to_return(:status => 200, :body => "", :headers => {"Date" => (Time.new+1).utc.to_s})
|
123
|
+
|
124
|
+
ret = Bixby::JsonResponse.new("fail", "request is more than 900 seconds old", nil, 401).to_json
|
125
|
+
stub_request(:post, "https://bixby.io/api").
|
126
|
+
to_return(:status => 200, :body => ret)
|
127
|
+
|
128
|
+
assert_output(nil, /current time.*sudo ntpdate/m) do
|
129
|
+
assert_throws(SystemExit) do
|
130
|
+
App.new.run!
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
end
|