oterm 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +7 -1
- data/lib/oterm/executor.rb +35 -5
- data/lib/oterm/listener.rb +39 -20
- data/lib/oterm/output.rb +2 -0
- data/lib/oterm/server.rb +4 -0
- data/lib/oterm/version.rb +1 -1
- data/lib/oterm/vt100.rb +5 -2
- data/test/server_test.rb +4 -2
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c4ffb3d022acd1a1c9d19c8fe681e244bd5776c4
|
4
|
+
data.tar.gz: 9ccc958e6be60b2901b09d1d7cae2149d0abe2d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29ce77069d8db5bc35118f5019136fce4d411855cb94b5fc3610e1909b45d7f389b2d015c39d4597924af04e4b1e44d472303f203a62b5a5d69f7e4e6e3a8a84
|
7
|
+
data.tar.gz: 9fa38ef102e1fcd4de434e016c256efa6cecfcae73d119aec5e056eb8eb783b58130f627e1fef4f36980da0086888f297dbd195d7860b980b906a11ec9b53fa7
|
data/README.md
CHANGED
@@ -35,12 +35,18 @@ soon in the ODisk application and later in a more interesting project.
|
|
35
35
|
|
36
36
|
*RubyGems* *repo*: https://rubygems.org/gems/oterm
|
37
37
|
|
38
|
-
Follow [@peterohler on Twitter](http://twitter.com/#!/peterohler) for announcements and news about the
|
38
|
+
Follow [@peterohler on Twitter](http://twitter.com/#!/peterohler) for announcements and news about the OTerm gem.
|
39
39
|
|
40
40
|
## <a name="build_status">Build Status</a>
|
41
41
|
|
42
42
|
[![Build Status](https://secure.travis-ci.org/ohler55/oterm.png?branch=master)](http://travis-ci.org/ohler55/oterm)
|
43
43
|
|
44
|
+
### Current Release 1.0.1 - December 27, 2013
|
45
|
+
|
46
|
+
- Improved completion handling
|
47
|
+
|
48
|
+
- Fixed some bugs
|
49
|
+
|
44
50
|
### Current Release 1.0.0 - December 22, 2013
|
45
51
|
|
46
52
|
- First release. There will be rough edges.
|
data/lib/oterm/executor.rb
CHANGED
@@ -20,7 +20,7 @@ module OTerm
|
|
20
20
|
def execute(cmd, listener)
|
21
21
|
name, args = cmd.split(' ', 2)
|
22
22
|
c = @cmds[name]
|
23
|
-
if nil
|
23
|
+
if c.nil?
|
24
24
|
missing(cmd, listener)
|
25
25
|
return
|
26
26
|
end
|
@@ -29,9 +29,9 @@ module OTerm
|
|
29
29
|
|
30
30
|
def help(listener, arg=nil)
|
31
31
|
listener.out.pl()
|
32
|
-
if nil
|
32
|
+
if !arg.nil?
|
33
33
|
c = @cmds[arg]
|
34
|
-
if nil
|
34
|
+
if !c.nil?
|
35
35
|
listener.out.pl("#{arg} - #{c.summary}")
|
36
36
|
c.desc.each do |line|
|
37
37
|
listener.out.pl(" #{line}")
|
@@ -81,6 +81,8 @@ module OTerm
|
|
81
81
|
@cmds.each_key do |name|
|
82
82
|
comp << name if name.start_with?(cmd)
|
83
83
|
end
|
84
|
+
return if 0 == comp.size
|
85
|
+
|
84
86
|
if 1 == comp.size
|
85
87
|
listener.move_col(1000)
|
86
88
|
listener.insert(comp[0][listener.buf.size..-1])
|
@@ -91,7 +93,15 @@ module OTerm
|
|
91
93
|
comp.each do |name|
|
92
94
|
listener.out.pl(name)
|
93
95
|
end
|
94
|
-
|
96
|
+
best = best_completion(cmd, comp)
|
97
|
+
if best == cmd
|
98
|
+
listener.update_cmd(0)
|
99
|
+
else
|
100
|
+
listener.move_col(1000)
|
101
|
+
listener.insert(best[listener.buf.size..-1])
|
102
|
+
listener.out.prompt()
|
103
|
+
listener.out.p(listener.buf)
|
104
|
+
end
|
95
105
|
end
|
96
106
|
end
|
97
107
|
|
@@ -99,6 +109,22 @@ module OTerm
|
|
99
109
|
@cmds[cmd] = Cmd.new(target, op, summary, desc)
|
100
110
|
end
|
101
111
|
|
112
|
+
def best_completion(pre, names)
|
113
|
+
plen = pre.size
|
114
|
+
# Must make a copy as pre is not frozen.
|
115
|
+
pre = String.new(pre)
|
116
|
+
target = names[0]
|
117
|
+
names = names[1..-1]
|
118
|
+
for i in plen..target.size
|
119
|
+
c = target[i]
|
120
|
+
names.each do |n|
|
121
|
+
return pre unless c == n[i]
|
122
|
+
end
|
123
|
+
pre << c
|
124
|
+
end
|
125
|
+
pre
|
126
|
+
end
|
127
|
+
|
102
128
|
class Cmd
|
103
129
|
attr_accessor :target
|
104
130
|
attr_accessor :op
|
@@ -109,7 +135,11 @@ module OTerm
|
|
109
135
|
@target = target
|
110
136
|
@op = op
|
111
137
|
@summary = summary
|
112
|
-
|
138
|
+
if desc.nil?
|
139
|
+
@desc = summary
|
140
|
+
else
|
141
|
+
@desc = desc.split("\n")
|
142
|
+
end
|
113
143
|
end
|
114
144
|
end # Cmd
|
115
145
|
|
data/lib/oterm/listener.rb
CHANGED
@@ -27,13 +27,13 @@ module OTerm
|
|
27
27
|
@done = false
|
28
28
|
|
29
29
|
greeting = executor.greeting()
|
30
|
-
@out.pl(greeting)
|
30
|
+
@out.pl(greeting) unless greeting.nil?
|
31
31
|
|
32
32
|
# initiate negotiations for single character mode and no echo
|
33
33
|
@out.p(Telnet.msg(Telnet::DO, Telnet::SGA) + Telnet.msg(Telnet::DO, Telnet::ECHO))
|
34
34
|
|
35
35
|
out.prompt()
|
36
|
-
|
36
|
+
until @done
|
37
37
|
line = con.recv(100)
|
38
38
|
begin
|
39
39
|
len = line.size()
|
@@ -104,8 +104,19 @@ module OTerm
|
|
104
104
|
end
|
105
105
|
|
106
106
|
def vt100_cmd(line)
|
107
|
-
|
108
|
-
|
107
|
+
# Possible arrow key.
|
108
|
+
if 3 == line.size() && '[' == line[1]
|
109
|
+
case line[2]
|
110
|
+
when 'A' # up arrow
|
111
|
+
history_back()
|
112
|
+
when 'B' # down arrow
|
113
|
+
history_forward()
|
114
|
+
when 'C' # right arrow
|
115
|
+
move_col(1)
|
116
|
+
when 'D' # left arrow
|
117
|
+
move_col(-1)
|
118
|
+
end
|
119
|
+
end
|
109
120
|
end
|
110
121
|
|
111
122
|
def exec_cmd(cmd)
|
@@ -156,23 +167,9 @@ module OTerm
|
|
156
167
|
update_cmd(blen)
|
157
168
|
end
|
158
169
|
when 14 # ^n
|
159
|
-
|
160
|
-
@hp -= 1
|
161
|
-
blen = @buf.size()
|
162
|
-
if 0 == @hp
|
163
|
-
@buf = ''
|
164
|
-
else
|
165
|
-
@buf = @history[-@hp]
|
166
|
-
end
|
167
|
-
update_cmd(blen)
|
168
|
-
end
|
170
|
+
history_forward()
|
169
171
|
when 16 # ^p
|
170
|
-
|
171
|
-
@hp += 1
|
172
|
-
blen = @buf.size()
|
173
|
-
@buf = @history[-@hp]
|
174
|
-
update_cmd(blen)
|
175
|
-
end
|
172
|
+
history_back()
|
176
173
|
when 21 # ^u
|
177
174
|
@hp -= 1
|
178
175
|
@buf = ''
|
@@ -210,6 +207,28 @@ module OTerm
|
|
210
207
|
end
|
211
208
|
end
|
212
209
|
|
210
|
+
def history_back()
|
211
|
+
if @hp < @history.size()
|
212
|
+
@hp += 1
|
213
|
+
blen = @buf.size()
|
214
|
+
@buf = @history[-@hp]
|
215
|
+
update_cmd(blen)
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
def history_forward()
|
220
|
+
if 0 < @hp && @hp <= @history.size()
|
221
|
+
@hp -= 1
|
222
|
+
blen = @buf.size()
|
223
|
+
if 0 == @hp
|
224
|
+
@buf = ''
|
225
|
+
else
|
226
|
+
@buf = @history[-@hp]
|
227
|
+
end
|
228
|
+
update_cmd(blen)
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
213
232
|
def insert(str)
|
214
233
|
# TBD be smarter with vt100
|
215
234
|
if 0 == @col
|
data/lib/oterm/output.rb
CHANGED
data/lib/oterm/server.rb
CHANGED
data/lib/oterm/version.rb
CHANGED
data/lib/oterm/vt100.rb
CHANGED
@@ -3,7 +3,7 @@ module OTerm
|
|
3
3
|
|
4
4
|
class VT100
|
5
5
|
ESC = 27.chr
|
6
|
-
MAX_DIM =
|
6
|
+
MAX_DIM = 9999
|
7
7
|
|
8
8
|
# graphic font characters
|
9
9
|
BLANK = '_'
|
@@ -140,7 +140,6 @@ module OTerm
|
|
140
140
|
def bold()
|
141
141
|
@con.print("\x1b[1m") if @is_vt100
|
142
142
|
end
|
143
|
-
alias bright bold
|
144
143
|
|
145
144
|
def dim()
|
146
145
|
@con.print("\x1b[2m") if @is_vt100
|
@@ -158,6 +157,10 @@ module OTerm
|
|
158
157
|
@con.print("\x1b[7m") if @is_vt100
|
159
158
|
end
|
160
159
|
|
160
|
+
def invisible()
|
161
|
+
@con.print("\x1b[8m") if @is_vt100
|
162
|
+
end
|
163
|
+
|
161
164
|
def big_top()
|
162
165
|
@con.print("\x1b#3") if @is_vt100
|
163
166
|
end
|
data/test/server_test.rb
CHANGED
@@ -39,13 +39,15 @@ class Ex < OTerm::Executor
|
|
39
39
|
o.restore_cursor()
|
40
40
|
end
|
41
41
|
|
42
|
+
=begin
|
42
43
|
def missing(cmd, listener)
|
43
|
-
|
44
|
+
listener.out.pl("'#{cmd}' is not a recognized command.")
|
44
45
|
end
|
46
|
+
=end
|
45
47
|
|
46
48
|
end # Ex
|
47
49
|
|
48
50
|
executor = Ex.new()
|
49
51
|
|
50
52
|
server = OTerm::Server.new(executor, 6060, true)
|
51
|
-
server.
|
53
|
+
server.join()
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oterm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Ohler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-12-
|
11
|
+
date: 2013-12-27 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: 'A remote terminal that can be used for interacting with an application
|
14
14
|
and invoking operations remotely. Telnet and VT100 over a telnet connection are
|
@@ -19,6 +19,9 @@ extensions: []
|
|
19
19
|
extra_rdoc_files:
|
20
20
|
- README.md
|
21
21
|
files:
|
22
|
+
- LICENSE
|
23
|
+
- README.md
|
24
|
+
- lib/oterm.rb
|
22
25
|
- lib/oterm/errors.rb
|
23
26
|
- lib/oterm/executor.rb
|
24
27
|
- lib/oterm/listener.rb
|
@@ -28,10 +31,7 @@ files:
|
|
28
31
|
- lib/oterm/telnet.rb
|
29
32
|
- lib/oterm/version.rb
|
30
33
|
- lib/oterm/vt100.rb
|
31
|
-
- lib/oterm.rb
|
32
34
|
- test/server_test.rb
|
33
|
-
- LICENSE
|
34
|
-
- README.md
|
35
35
|
homepage: http://www.ohler.com/oterm
|
36
36
|
licenses:
|
37
37
|
- MIT
|
@@ -39,23 +39,23 @@ licenses:
|
|
39
39
|
metadata: {}
|
40
40
|
post_install_message:
|
41
41
|
rdoc_options:
|
42
|
-
- --main
|
42
|
+
- "--main"
|
43
43
|
- README.md
|
44
44
|
require_paths:
|
45
45
|
- lib
|
46
46
|
required_ruby_version: !ruby/object:Gem::Requirement
|
47
47
|
requirements:
|
48
|
-
- -
|
48
|
+
- - ">="
|
49
49
|
- !ruby/object:Gem::Version
|
50
50
|
version: '0'
|
51
51
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- -
|
53
|
+
- - ">="
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '0'
|
56
56
|
requirements: []
|
57
57
|
rubyforge_project: oterm
|
58
|
-
rubygems_version: 2.0
|
58
|
+
rubygems_version: 2.2.0
|
59
59
|
signing_key:
|
60
60
|
specification_version: 4
|
61
61
|
summary: A operations terminal server.
|