mtik 4.0.5 → 4.1.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 +4 -4
- data/CHANGELOG.txt +16 -1
- data/README.txt +1 -1
- data/VERSION.txt +1 -1
- data/bin/tikcli +39 -3
- data/bin/tikcommand +40 -9
- data/bin/tikfetch +40 -7
- data/lib/mtik.rb +27 -16
- data/lib/mtik/connection.rb +16 -15
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ce416fc9ce5a6d6768f40c11b68fc983fcf75ba69e10e3bc660a0b405fc1bcc
|
4
|
+
data.tar.gz: 910a34bcb91770ea3f5607fd91297fa1d518f0020e35e27e810deb4eb797cd71
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 86879188b9b9af32b1d61f61d3c539a3f8482ef1da078f4a347ea548e1480e0c5b6502d73784a7acda610a17d4b6be141dae93a20b07c1c85959aec538834be5
|
7
|
+
data.tar.gz: 6778bcf64f479677ccdaec744a8356b936527471870e21aa6878749ceb22d79d43452415113a2e15de4d4be0bbc133d7a32b1d0c7d70807cf7066eb94acab91e
|
data/CHANGELOG.txt
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
2020-08-23 (23 AUG 2020) VERSION 4.1.0
|
2
|
+
* Minor version bump due to changing argument passing for the call to
|
3
|
+
MTik.interactive_client()
|
4
|
+
* Updated tikcli, tikcommand, and tikfetch commands to add options for
|
5
|
+
enabling SSL and/or to use unencrypted plaintext logins (newer API
|
6
|
+
login style). Also one can set environment variables MTIK_SSL to
|
7
|
+
specify SSL use, or MTIK_UNENCRYPTED_PLAINTEXT to enable unencrypted
|
8
|
+
plaintext logins if SSL is NOT used for compatibility with cleartext
|
9
|
+
API usage on RouterOS versions 6.43+
|
10
|
+
* THANKS to Zdenek Crha (zdenek-crha on github) for pointing out that
|
11
|
+
the binary commands were lacking proper argument passing to allow
|
12
|
+
for SSL and/or unencrypted plaintext options, and for suggesting the
|
13
|
+
use of environment variables as an alterative to CLI options for
|
14
|
+
enabling such.
|
15
|
+
|
1
16
|
2020-08-22 (22 AUG 2020) VERSION 4.0.5
|
2
17
|
* This is a cosmetic version bump for the purpose of updating the gem for wider
|
3
18
|
availability via rubygems in addition to directly from github prior to some
|
@@ -66,7 +81,7 @@
|
|
66
81
|
* Fixed RDoc formatting in several files, and added an RDocTask to the Rakefile
|
67
82
|
|
68
83
|
2010-04-23 (23 APR 2010) VERSION 3.0.5 Aaron D. Gifford (http://www.aarongifford.com)
|
69
|
-
* Double bug-fix (typo fix and logic fix) to request.rb thanks to Allan Eising and
|
84
|
+
* Double bug-fix (typo fix and logic fix) to request.rb thanks to Allan Eising and
|
70
85
|
Søren Daugaard. Thank you both for the patch!
|
71
86
|
* Added a brief sanity-check in request.rb to help spotlight logic errors.
|
72
87
|
|
data/README.txt
CHANGED
@@ -27,7 +27,7 @@ The latest version of MTik can be found at
|
|
27
27
|
|
28
28
|
Ruby RDoc documentation can be found online at
|
29
29
|
|
30
|
-
* http://www.aarongifford.com/computers/mtik/latest/doc/
|
30
|
+
* http://www.aarongifford.com/computers/mtik/latest/doc/
|
31
31
|
|
32
32
|
Additional documentation is available at
|
33
33
|
|
data/VERSION.txt
CHANGED
@@ -1 +1 @@
|
|
1
|
-
4.0
|
1
|
+
4.1.0
|
data/bin/tikcli
CHANGED
@@ -42,10 +42,46 @@ $LOAD_PATH.unshift(File.dirname(__FILE__)+'/../lib')
|
|
42
42
|
require 'rubygems'
|
43
43
|
require 'mtik'
|
44
44
|
|
45
|
-
|
46
|
-
STDERR.print(
|
45
|
+
def usage(msg='')
|
46
|
+
STDERR.print(
|
47
|
+
(msg.size > 0 ? msg + "\n\n" : '') +
|
48
|
+
"Usage: #{$0} [-s|--ssl] [-u|--unencrypted_plaintext] <host> <user> <pass>\n" +
|
49
|
+
" --unencrypted_plaintext OR -u - Use the 6.43+ login API even if NOT\n" +
|
50
|
+
" using SSL.\n" +
|
51
|
+
" --ssl OR -s - Use SSL for the API connection.\n"
|
52
|
+
)
|
47
53
|
exit(-1)
|
48
54
|
end
|
49
55
|
|
50
|
-
|
56
|
+
use_ssl = unencrypted_plaintext = false
|
57
|
+
while !ARGV[0].nil? && ARGV[0][0] == '-'
|
58
|
+
arg = ARGV.shift
|
59
|
+
case arg
|
60
|
+
when '--ssl', '-s'
|
61
|
+
usage("Please do not repeat the --ssl (or -s) parameter") if use_ssl
|
62
|
+
use_ssl = true
|
63
|
+
when '--unencrypted_plaintext', '-u'
|
64
|
+
usage("Please do not repeat the --unencrypted_plaintext (or -u) parameter") if unencrypted_plaintext
|
65
|
+
unencrypted_plaintext = true
|
66
|
+
else
|
67
|
+
usage("Unknown argument #{arg.inspect}")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
usage("Too many arguments.") if ARGV.size > 3
|
71
|
+
usage("Insufficient arguments.") if ARGV.size < 3
|
72
|
+
|
73
|
+
## Permit setting use_ssl and unencrypted_plaintext via environment variables:
|
74
|
+
use_ssl = true if ENV['MTIK_SSL']
|
75
|
+
unencrypted_plaintext = true if ENV['MTIK_UNENCRYPTED_PLAINTEXT']
|
76
|
+
|
77
|
+
args = {
|
78
|
+
:host => ARGV[0],
|
79
|
+
:user => ARGV[1],
|
80
|
+
:pass => ARGV[2],
|
81
|
+
:ssl => use_ssl,
|
82
|
+
:unencrypted_plaintext => unencrypted_plaintext
|
83
|
+
}
|
84
|
+
p args
|
85
|
+
|
86
|
+
MTik::interactive_client(args)
|
51
87
|
|
data/bin/tikcommand
CHANGED
@@ -42,12 +42,39 @@ $LOAD_PATH.unshift(File.dirname(__FILE__)+'/../lib')
|
|
42
42
|
require 'rubygems'
|
43
43
|
require 'mtik'
|
44
44
|
|
45
|
-
|
46
|
-
STDERR.print(
|
45
|
+
def usage(msg='')
|
46
|
+
STDERR.print(
|
47
|
+
(msg.size > 0 ? msg + "\n\n" : '') +
|
48
|
+
"Usage: #{$0} [-s|--ssl] [-u|--unencrypted_plaintext] <host> <user> <pass> <command> [<args>...] [<command> [<args> ...]]\n" +
|
49
|
+
" --unencrypted_plaintext OR -u - Use the 6.43+ login API even if NOT\n" +
|
50
|
+
" using SSL.\n" +
|
51
|
+
" --ssl OR -s - Use SSL for the API connection.\n"
|
52
|
+
)
|
47
53
|
exit(-1)
|
48
54
|
end
|
49
55
|
|
50
|
-
MTik::verbose = true ## Set how you want
|
56
|
+
MTik::verbose = true ## Set how verbose you want things
|
57
|
+
|
58
|
+
use_ssl = unencrypted_plaintext = false
|
59
|
+
while !ARGV[0].nil? && ARGV[0][0] == '-'
|
60
|
+
arg = ARGV.shift
|
61
|
+
case arg
|
62
|
+
when '--ssl', '-s'
|
63
|
+
usage("Please do not repeat the --ssl (or -s) parameter") if use_ssl
|
64
|
+
use_ssl = true
|
65
|
+
when '--unencrypted_plaintext', '-u'
|
66
|
+
usage("Please do not repeat the --unencrypted_plaintext (or -u) parameter") if unencrypted_plaintext
|
67
|
+
unencrypted_plaintext = true
|
68
|
+
else
|
69
|
+
usage("Unknown argument #{arg.inspect}")
|
70
|
+
end
|
71
|
+
end
|
72
|
+
usage("Too few arguments.") if ARGV.size < 4
|
73
|
+
usage("First command must start with a slash '/' character. #{ARGV[3].inspect}") if ARGV[3].nil? || ARGV[3][0] != '/'
|
74
|
+
|
75
|
+
## Permit setting use_ssl and unencrypted_plaintext via environment variables:
|
76
|
+
use_ssl = true if ENV['MTIK_SSL']
|
77
|
+
unencrypted_plaintext = true if ENV['MTIK_UNENCRYPTED_PLAINTEXT']
|
51
78
|
|
52
79
|
## Detect multiple command sequences and build an array of arrays
|
53
80
|
## where each outer array element is a command plus arguments:
|
@@ -62,10 +89,14 @@ while i < ARGV.length
|
|
62
89
|
i += 1
|
63
90
|
end
|
64
91
|
|
65
|
-
|
66
|
-
:host=>ARGV[0],
|
67
|
-
:user=>ARGV[1],
|
68
|
-
:pass=>ARGV[2],
|
69
|
-
:command=>command
|
70
|
-
|
92
|
+
args = {
|
93
|
+
:host => ARGV[0],
|
94
|
+
:user => ARGV[1],
|
95
|
+
:pass => ARGV[2],
|
96
|
+
:command => command,
|
97
|
+
:ssl => use_ssl,
|
98
|
+
:unencrypted_plaintext => unencrypted_plaintext
|
99
|
+
}
|
100
|
+
|
101
|
+
p MTik::command(args)
|
71
102
|
|
data/bin/tikfetch
CHANGED
@@ -46,16 +46,48 @@ require 'mtik'
|
|
46
46
|
## output of all API interactions:
|
47
47
|
#MTik::verbose = true
|
48
48
|
|
49
|
-
|
50
|
-
print
|
51
|
-
|
49
|
+
def usage(msg='')
|
50
|
+
STDERR.print(
|
51
|
+
(msg.size > 0 ? msg + "\n\n" : '') +
|
52
|
+
"Usage: #{$0} [-s|--ssl] [-u|--unencrypted_plaintext] <device> <user> <pass> <url> [<localfilename> [<url> [<localfilename> ... ]]]\n" +
|
53
|
+
" --unencrypted_plaintext OR -u - Use the 6.43+ login API even if NOT\n" +
|
54
|
+
" using SSL.\n" +
|
55
|
+
" --ssl OR -s - Use SSL for the API connection.\n"
|
56
|
+
)
|
57
|
+
exit(-1)
|
58
|
+
end
|
59
|
+
|
60
|
+
use_ssl = unencrypted_plaintext = false
|
61
|
+
while !ARGV[0].nil? && ARGV[0][0] == '-'
|
62
|
+
arg = ARGV.shift
|
63
|
+
case arg
|
64
|
+
when '--ssl', '-s'
|
65
|
+
usage("Please do not repeat the --ssl (or -s) parameter") if use_ssl
|
66
|
+
use_ssl = true
|
67
|
+
when '--unencrypted_plaintext', '-u'
|
68
|
+
usage("Please do not repeat the --unencrypted_plaintext (or -u) parameter") if unencrypted_plaintext
|
69
|
+
unencrypted_plaintext = true
|
70
|
+
else
|
71
|
+
usage("Unknown argument #{arg.inspect}")
|
72
|
+
end
|
52
73
|
end
|
74
|
+
usage("Too few arguments.") if ARGV.size < 4
|
75
|
+
|
76
|
+
## Permit setting use_ssl and unencrypted_plaintext via environment variables:
|
77
|
+
use_ssl = true if ENV['MTIK_SSL']
|
78
|
+
unencrypted_plaintext = true if ENV['MTIK_UNENCRYPTED_PLAINTEXT']
|
79
|
+
|
80
|
+
args = {
|
81
|
+
:host => ARGV.shift,
|
82
|
+
:user => ARGV.shift,
|
83
|
+
:pass => ARGV.shift,
|
84
|
+
:ssl => use_ssl,
|
85
|
+
:unencrypted_plaintext => unencrypted_plaintext
|
86
|
+
}
|
87
|
+
|
53
88
|
|
54
|
-
host = ARGV.shift
|
55
|
-
user = ARGV.shift
|
56
|
-
pass = ARGV.shift
|
57
89
|
begin
|
58
|
-
mt = MTik::Connection.new(
|
90
|
+
mt = MTik::Connection.new(args)
|
59
91
|
rescue Errno::ETIMEDOUT, Errno::ENETUNREACH, Errno::EHOSTUNREACH, MTik::Error => e
|
60
92
|
print ">>> ERROR CONNECTING: #{e}\n"
|
61
93
|
exit
|
@@ -129,6 +161,7 @@ print "SIZE CREATED FILENAME\n"
|
|
129
161
|
print "====================================================================\n"
|
130
162
|
mt.get_reply_each('/file/getall') do |req, s|
|
131
163
|
unless s.key?('!done')
|
164
|
+
s['size'] = 'directory' if s['type'] == 'directory'
|
132
165
|
print "#{(s['size']+' ')[0,10]} #{s['creation-time']} #{s['name']}\n"
|
133
166
|
end
|
134
167
|
end
|
data/lib/mtik.rb
CHANGED
@@ -49,7 +49,7 @@ module MTik
|
|
49
49
|
USER = 'admin'
|
50
50
|
## Default password to use if none is specified:
|
51
51
|
PASS = ''
|
52
|
-
## Connection timeout default -- *NOT USED*
|
52
|
+
## Connection timeout default -- *NOT USED*
|
53
53
|
CONN_TIMEOUT = 60
|
54
54
|
## Command timeout -- The maximum number of seconds to wait for more
|
55
55
|
## API data when expecting one or more command responses.
|
@@ -86,12 +86,30 @@ module MTik
|
|
86
86
|
|
87
87
|
|
88
88
|
## Act as an interactive client with the device, accepting user
|
89
|
-
## input from STDIN.
|
90
|
-
|
89
|
+
## input from STDIN. Arguments are key/value pairs, and are
|
90
|
+
## simply passed directly to MTik::Connection(). The below
|
91
|
+
## documentation is taken directly from MTik::Connection. One
|
92
|
+
## more ## key/value pair style arguments must be specified.
|
93
|
+
## The one ## required argument is the host or IP of the device
|
94
|
+
## to connect to.
|
95
|
+
## +host+:: This is the only _required_ argument. Example:
|
96
|
+
## <i> :host => "rb411.example.org" </i>
|
97
|
+
## +ssl+:: Use SSL to encrypt communications
|
98
|
+
## +port+:: Override the default API port (8728/8729)
|
99
|
+
## +user+:: Override the default API username ('admin')
|
100
|
+
## +pass+:: Override the default API password (blank)
|
101
|
+
## +conn_timeout+:: Override the default connection
|
102
|
+
## timeout (60 seconds)
|
103
|
+
## +cmd_timeout+:: Override the default command timeout
|
104
|
+
## (60 seconds) -- the number of seconds
|
105
|
+
## to wait for additional API input.
|
106
|
+
## +unencrypted_plaintext+:: Attempt to use the 6.43+ login API
|
107
|
+
## even without SSL
|
108
|
+
def self.interactive_client(args)
|
91
109
|
old_verbose = MTik::verbose
|
92
110
|
MTik::verbose = true
|
93
111
|
begin
|
94
|
-
tk = MTik::Connection.new(
|
112
|
+
tk = MTik::Connection.new(args)
|
95
113
|
rescue MTik::Error, Errno::ECONNREFUSED => e
|
96
114
|
print "=== LOGIN ERROR: #{e.message}\n"
|
97
115
|
exit
|
@@ -132,7 +150,7 @@ module MTik
|
|
132
150
|
cmd == '/tool/fetch' && sentence['status'] == 'finished'
|
133
151
|
) || (maxreply > 0 && count == maxreply)
|
134
152
|
state = 2
|
135
|
-
req.cancel do |r, s|
|
153
|
+
req.cancel do |r, s|
|
136
154
|
state = 1
|
137
155
|
end
|
138
156
|
end
|
@@ -159,7 +177,7 @@ module MTik
|
|
159
177
|
end
|
160
178
|
end
|
161
179
|
end
|
162
|
-
|
180
|
+
|
163
181
|
reply = tk.get_reply('/quit')
|
164
182
|
unless reply[0].key?('!fatal')
|
165
183
|
raise MTik::Error.new("Unexpected response to '/quit' command.")
|
@@ -245,16 +263,9 @@ module MTik
|
|
245
263
|
## Remember that the limit applies separately to each API command
|
246
264
|
## executed.
|
247
265
|
def self.command(args)
|
248
|
-
tk
|
249
|
-
|
250
|
-
|
251
|
-
:pass => args[:pass],
|
252
|
-
:port => args[:port],
|
253
|
-
:conn_timeout => args[:conn_timeout],
|
254
|
-
:cmd_timeout => args[:cmd_timeout]
|
255
|
-
)
|
256
|
-
limit = args[:limit] ## Optional reply limit
|
257
|
-
cmd = args[:command]
|
266
|
+
tk = MTik::Connection.new(args)
|
267
|
+
limit = args[:limit] ## Optional reply limit
|
268
|
+
cmd = args[:command]
|
258
269
|
replies = Array.new
|
259
270
|
if cmd.is_a?(String)
|
260
271
|
## Single command, no arguments
|
data/lib/mtik/connection.rb
CHANGED
@@ -62,7 +62,7 @@ class MTik::Connection
|
|
62
62
|
@ssl_sock = nil
|
63
63
|
@requests = Hash.new
|
64
64
|
@use_ssl = args[:ssl] || MTik::USE_SSL
|
65
|
-
@unencrypted_plaintext = args[:
|
65
|
+
@unencrypted_plaintext = args[:unencrypted_plaintext]
|
66
66
|
@host = args[:host]
|
67
67
|
@port = args[:port] || (@use_ssl ? MTik::PORT_SSL : MTik::PORT)
|
68
68
|
@user = args[:user] || MTik::USER
|
@@ -151,23 +151,20 @@ class MTik::Connection
|
|
151
151
|
return unless @sock.nil?
|
152
152
|
## TODO: Perhaps catch more errors
|
153
153
|
begin
|
154
|
-
addr
|
154
|
+
addr = Socket.getaddrinfo(@host, nil)
|
155
155
|
@sock = Socket.new(Socket.const_get(addr[0][0]), Socket::SOCK_STREAM, 0)
|
156
156
|
|
157
157
|
begin
|
158
158
|
@sock.connect_nonblock(Socket.pack_sockaddr_in(@port, addr[0][3]))
|
159
159
|
rescue Errno::EINPROGRESS
|
160
160
|
ready = IO.select([@sock], [@sock], [], @conn_timeout)
|
161
|
-
|
162
|
-
@sock
|
163
|
-
else
|
164
|
-
raise Errno::ETIMEDOUT
|
161
|
+
raise Errno::ETIMEDOUT unless ready
|
165
162
|
end
|
166
|
-
end
|
167
|
-
|
168
|
-
connect_ssl(@sock) if @use_ssl
|
169
163
|
|
170
|
-
|
164
|
+
connect_ssl(@sock) if @use_ssl
|
165
|
+
rescue Errno::ECONNREFUSED,
|
166
|
+
Errno::ETIMEDOUT,
|
167
|
+
Errno::ENETUNREACH,
|
171
168
|
Errno::EHOSTUNREACH => e
|
172
169
|
@sock = nil
|
173
170
|
raise e ## Re-raise the exception
|
@@ -417,12 +414,16 @@ class MTik::Connection
|
|
417
414
|
|
418
415
|
## Send the request object over the socket
|
419
416
|
def xmit(req)
|
420
|
-
|
421
|
-
@ssl_sock
|
422
|
-
|
423
|
-
|
417
|
+
begin
|
418
|
+
if @ssl_sock
|
419
|
+
@ssl_sock.write(req.request)
|
420
|
+
else
|
421
|
+
@sock.send(req.request, 0)
|
422
|
+
end
|
423
|
+
rescue Errno::EPIPE => e
|
424
|
+
@sock = @ssl_sock = nil
|
425
|
+
raise e ## Re-raise the exception
|
424
426
|
end
|
425
|
-
|
426
427
|
return req
|
427
428
|
end
|
428
429
|
|