hokaido 0.0.4 → 0.0.5
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 +4 -4
- data/Rakefile +1 -2
- data/bin/hokaido +1 -1
- data/hokaido.gemspec +3 -2
- data/lib/hokaido.rb +4 -0
- data/lib/hokaido/broadcast.rb +80 -0
- data/lib/hokaido/cli.rb +6 -65
- data/lib/hokaido/server.rb +69 -0
- data/lib/hokaido/version.rb +1 -1
- data/lib/hokaido/watcher.rb +19 -0
- metadata +20 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ba9d4544676c2a17748b534f434b318b223331c6
|
4
|
+
data.tar.gz: a1602cea4d9d03375373f6eacab8f82bb96d0cb3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 713597c50d91a3ec475322f6fadfc27a166f0f1cc1841ad6e00c52492585789bdc57ed33f1d48bfc20a6b0b72e3bc277da054ff51633e24c558de483bc6c051f
|
7
|
+
data.tar.gz: 9baffd608a5d42bc64b2a546f22f986d437bcf9903324f01427811c555b688da329e03ba411bef6aa7e6002f9171ad113359ef10429b5db8ddaad0382bb0b73e
|
data/Rakefile
CHANGED
@@ -1,2 +1 @@
|
|
1
|
-
require
|
2
|
-
|
1
|
+
require 'bundler/gem_tasks'
|
data/bin/hokaido
CHANGED
data/hokaido.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'hokaido/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'hokaido'
|
8
8
|
spec.version = Hokaido::VERSION
|
9
9
|
spec.authors = %w(ursm hibariya)
|
10
10
|
spec.email = %w(ursm@ursm.jp celluloid.key@gmail.com)
|
@@ -17,8 +17,9 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
18
|
spec.require_paths = ['lib']
|
19
19
|
|
20
|
-
spec.add_runtime_dependency '
|
20
|
+
spec.add_runtime_dependency 'celluloid'
|
21
21
|
spec.add_runtime_dependency 'ruby-terminfo'
|
22
|
+
spec.add_runtime_dependency 'thor'
|
22
23
|
|
23
24
|
spec.add_development_dependency 'bundler', '~> 1.7'
|
24
25
|
spec.add_development_dependency 'rake', '~> 10.0'
|
data/lib/hokaido.rb
CHANGED
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'celluloid'
|
2
|
+
require 'io/console'
|
3
|
+
require 'pty'
|
4
|
+
require 'socket'
|
5
|
+
require 'terminfo'
|
6
|
+
|
7
|
+
module Hokaido
|
8
|
+
class Broadcast
|
9
|
+
class Connection
|
10
|
+
include Celluloid
|
11
|
+
|
12
|
+
def initialize(host, port)
|
13
|
+
@socket = TCPSocket.new(host, port)
|
14
|
+
|
15
|
+
@socket.puts 'broadcast'
|
16
|
+
end
|
17
|
+
|
18
|
+
def send(data)
|
19
|
+
@socket.write data
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class OutputHandler
|
24
|
+
include Celluloid
|
25
|
+
|
26
|
+
def initialize(ptyout, connection)
|
27
|
+
@ptyout, @connection = ptyout, connection
|
28
|
+
|
29
|
+
async.run
|
30
|
+
end
|
31
|
+
|
32
|
+
def run
|
33
|
+
while chunk = @ptyout.readpartial(4096)
|
34
|
+
$stdout.write chunk
|
35
|
+
@connection.async.send chunk
|
36
|
+
end
|
37
|
+
|
38
|
+
terminate
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class InputHandler
|
43
|
+
include Celluloid
|
44
|
+
|
45
|
+
def initialize(ptyin)
|
46
|
+
@ptyin = ptyin
|
47
|
+
|
48
|
+
async.run
|
49
|
+
end
|
50
|
+
|
51
|
+
def run
|
52
|
+
while char = $stdin.getch
|
53
|
+
@ptyin.putc char
|
54
|
+
end
|
55
|
+
|
56
|
+
terminate
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class Command
|
61
|
+
include Celluloid
|
62
|
+
|
63
|
+
def initialize(command, host, port)
|
64
|
+
ptyout, ptyin, pid = PTY.getpty(command)
|
65
|
+
connection = Connection.new_link(host, port)
|
66
|
+
|
67
|
+
OutputHandler.new_link ptyout, connection
|
68
|
+
InputHandler.new_link ptyin
|
69
|
+
|
70
|
+
async.wait_for_exit pid
|
71
|
+
end
|
72
|
+
|
73
|
+
def wait_for_exit(pid)
|
74
|
+
Process.waitpid pid
|
75
|
+
|
76
|
+
terminate
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/lib/hokaido/cli.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
|
-
require '
|
2
|
-
require 'pty'
|
1
|
+
require 'celluloid/autostart'
|
3
2
|
require 'socket'
|
4
3
|
require 'terminfo'
|
5
4
|
require 'thor'
|
6
|
-
require 'thread'
|
7
5
|
|
8
6
|
module Hokaido
|
9
7
|
class CLI < Thor
|
@@ -12,79 +10,22 @@ module Hokaido
|
|
12
10
|
|
13
11
|
desc :broadcast, 'Broadcast a session'
|
14
12
|
def broadcast(command = ENV['SHELL'])
|
15
|
-
|
16
|
-
nonbloq = Queue.new
|
17
|
-
|
18
|
-
trap :SIGWINCH do
|
19
|
-
TermInfo.tiocswinsz pty_in, *TermInfo.screen_size
|
20
|
-
end
|
21
|
-
|
22
|
-
Thread.abort_on_exception = true
|
23
|
-
|
24
|
-
Thread.start do
|
25
|
-
server = TCPSocket.open(*options.values_at(:host, :port))
|
26
|
-
server.puts 'write'
|
27
|
-
|
28
|
-
while chunk = nonbloq.deq
|
29
|
-
server.write chunk
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
Thread.start do
|
34
|
-
while chunk = pty_out.readpartial(4096)
|
35
|
-
$stdout.write chunk
|
36
|
-
nonbloq.enq chunk
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
Thread.start do
|
41
|
-
TermInfo.tiocswinsz pty_in, *TermInfo.screen_size
|
42
|
-
|
43
|
-
while char = $stdin.getch
|
44
|
-
pty_in.putc char
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
Process.waitpid pid
|
13
|
+
Hokaido::Broadcast::Command.run command, *options.values_at(:host, :port)
|
49
14
|
end
|
50
15
|
|
51
16
|
desc :server, 'Start server'
|
52
17
|
def server
|
53
|
-
|
54
|
-
server = TCPServer.open(*options.values_at(:host, :port))
|
55
|
-
|
56
|
-
loop do
|
57
|
-
Thread.start server.accept do |client|
|
58
|
-
case client.gets.chomp
|
59
|
-
when 'write'
|
60
|
-
client.puts ':)'
|
61
|
-
|
62
|
-
while chunk = client.readpartial(4096)
|
63
|
-
queue.enq chunk
|
64
|
-
end
|
65
|
-
when 'read'
|
66
|
-
client.puts '=)'
|
67
|
-
|
68
|
-
while chunk = queue.deq
|
69
|
-
client.write chunk
|
70
|
-
end
|
71
|
-
else
|
72
|
-
client.puts ':('
|
73
|
-
end
|
74
|
-
|
75
|
-
client.close
|
76
|
-
end
|
77
|
-
end
|
18
|
+
server = Server.run(*options.values_at(:host, :port))
|
78
19
|
rescue Interrupt
|
79
|
-
server.close
|
80
|
-
|
81
20
|
exit
|
21
|
+
ensure
|
22
|
+
server.terminate if server
|
82
23
|
end
|
83
24
|
|
84
25
|
desc :watch, 'Watch a session'
|
85
26
|
def watch
|
86
27
|
server = TCPSocket.open(*options.values_at(:host, :port))
|
87
|
-
server.puts '
|
28
|
+
server.puts 'watch'
|
88
29
|
|
89
30
|
while chunk = server.readpartial(4096)
|
90
31
|
$stdout.write chunk
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'celluloid'
|
2
|
+
require 'celluloid/notifications'
|
3
|
+
require 'socket'
|
4
|
+
|
5
|
+
module Hokaido
|
6
|
+
class ConnectionHandler
|
7
|
+
include Celluloid
|
8
|
+
include Celluloid::Notifications
|
9
|
+
|
10
|
+
def initialize(connection)
|
11
|
+
@connection = connection
|
12
|
+
|
13
|
+
async.run
|
14
|
+
end
|
15
|
+
|
16
|
+
def run
|
17
|
+
_, port, host = @connection.peeraddr
|
18
|
+
|
19
|
+
puts "#{host}:#{port} connected"
|
20
|
+
|
21
|
+
case @connection.gets.chomp
|
22
|
+
when 'broadcast'
|
23
|
+
@connection.puts ':)'
|
24
|
+
|
25
|
+
loop do
|
26
|
+
publish 'broadcast', @connection.readpartial(4096)
|
27
|
+
end
|
28
|
+
when 'watch'
|
29
|
+
@connection.puts '=)'
|
30
|
+
|
31
|
+
watcher = Watcher.new_link(@connection)
|
32
|
+
|
33
|
+
loop do
|
34
|
+
@connection.readpartial(4096) # XXX wait for connection closed
|
35
|
+
end
|
36
|
+
else
|
37
|
+
@connection.puts ':('
|
38
|
+
end
|
39
|
+
rescue Errno::ECONNRESET
|
40
|
+
# do nothing, connetion reset by peer
|
41
|
+
ensure
|
42
|
+
puts "#{host}:#{port} disconnected"
|
43
|
+
|
44
|
+
@connection.close
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
class Server
|
49
|
+
include Celluloid
|
50
|
+
|
51
|
+
finalizer :shutdown
|
52
|
+
|
53
|
+
def initialize(host, port)
|
54
|
+
@server = TCPServer.new(host, port)
|
55
|
+
|
56
|
+
async.run
|
57
|
+
end
|
58
|
+
|
59
|
+
def shutdown
|
60
|
+
@server.close if @server
|
61
|
+
end
|
62
|
+
|
63
|
+
def run
|
64
|
+
loop do
|
65
|
+
ConnectionHandler.new_link @server.accept
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/lib/hokaido/version.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'celluloid'
|
2
|
+
require 'celluloid/notifications'
|
3
|
+
|
4
|
+
module Hokaido
|
5
|
+
class Watcher
|
6
|
+
include Celluloid
|
7
|
+
include Celluloid::Notifications
|
8
|
+
|
9
|
+
def initialize(socket)
|
10
|
+
@socket = socket
|
11
|
+
|
12
|
+
subscribe 'broadcast', :received
|
13
|
+
end
|
14
|
+
|
15
|
+
def received(topic, chunk)
|
16
|
+
@socket.write chunk
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hokaido
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ursm
|
@@ -9,10 +9,10 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-12-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: celluloid
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
18
|
- - ">="
|
@@ -39,6 +39,20 @@ dependencies:
|
|
39
39
|
- - ">="
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: thor
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
42
56
|
- !ruby/object:Gem::Dependency
|
43
57
|
name: bundler
|
44
58
|
requirement: !ruby/object:Gem::Requirement
|
@@ -84,8 +98,11 @@ files:
|
|
84
98
|
- bin/hokaido
|
85
99
|
- hokaido.gemspec
|
86
100
|
- lib/hokaido.rb
|
101
|
+
- lib/hokaido/broadcast.rb
|
87
102
|
- lib/hokaido/cli.rb
|
103
|
+
- lib/hokaido/server.rb
|
88
104
|
- lib/hokaido/version.rb
|
105
|
+
- lib/hokaido/watcher.rb
|
89
106
|
homepage: https://github.com/ursmhbry/hokaido
|
90
107
|
licenses:
|
91
108
|
- MIT
|