oterm 1.0.0 → 1.0.1
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/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
|
[](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.
|