Ruby API клиент был обновлен и теперь работает как с Ruby 1.8, так и с Ruby 1.9. Версия 2.0.1 внесла некоторые значительные изменения, перейдя к модели, управляемой событиями с обратными вызовами, для обработки ответов на API-команды. Весь ввод-вывод по-прежнему синхронный, но новая структура должна упростить переход к полностью асинхронной модели ввода-вывода для повышения производительности ввода-вывода (и позволить однопоточное обработку нескольких одновременных команд без блокировки в ожидании завершения одной из них) в будущем. Это большой шаг к достижению этой цели в проектировании. На MikroTik wiki была добавлена страница для Ruby API клиента: При продуманном проектировании и использовании, Ruby клиент 2.0 теперь может обрабатывать команды, которые не завершаются сразу, а вместо этого выдают периодические ответы. Например: подключитесь к устройству и получите список текущих DHCP-аренд.
require 'mtik.rb'
begin
tik = MTik.new(:host => '10.20.30.1', :user => 'admin', :pass => 'mypassword')
rescue MTikError, Errno::ETIMEDOUT, Errno::EHOSTUNREACH, Errno::ECONNREFUSED => e
print "ERROR CONNECTING OR LOGGING IN: #{e}\n"
exit
end
begin
tik.send_request(true, '/ip/dhcp-server/lease/getall') do |req, sentence|
## Этот блок кода выполняется ТОЛЬКО тогда, когда команда
## завершается с выводом '!done'...
## Перебираем каждое реплику ответа:
req.reply.each do |reply|
if reply.key?('!re')
## Смотрим информацию об аренде DHCP...
print "LEASE: mac=#{reply['mac-address']} IP=#{reply['address']} status=#{reply['status']}\n"
end
end
end
while tik.outstanding > 0
## Основной "цикл событий"
tik.wait_for_reply
end
rescue MTikError, Errno::ETIMEDOUT, Errno::EHOSTUNREACH, Errno::ECONNREFUSED => e
print "ERROR during DHCP lease API request: #{e}\n"
exit
end
tik.close Вывод может выглядеть так: LEASE: mac=00:85:71:37:4F:26 IP=10.20.30.100 status=bound
LEASE: mac=00:1E:48:FE:1F:7E IP=10.20.30.103 status=
LEASE: mac=00:FF:44:08:43:E2 IP=10.20.30.105 status=
LEASE: mac=00:14:D2:F2:87:F0 IP=10.20.30.109 status=bound
LEASE: mac=00:19:BB:C9:82:FA IP=10.20.30.110 status=
LEASE: mac=00:0E:A3:BE:B3:AF IP=10.20.30.111 status=bound
LEASE: mac=00:25:C7:63:12:9A IP=10.20.30.108 status=bound Aaron out.
require 'mtik.rb'
begin
tik = MTik.new(:host => '10.20.30.1', :user => 'admin', :pass => 'mypassword')
rescue MTikError, Errno::ETIMEDOUT, Errno::EHOSTUNREACH, Errno::ECONNREFUSED => e
print "ERROR CONNECTING OR LOGGING IN: #{e}\n"
exit
end
begin
tik.send_request(true, '/ip/dhcp-server/lease/getall') do |req, sentence|
## Этот блок кода выполняется ТОЛЬКО тогда, когда команда
## завершается с выводом '!done'...
## Перебираем каждое реплику ответа:
req.reply.each do |reply|
if reply.key?('!re')
## Смотрим информацию об аренде DHCP...
print "LEASE: mac=#{reply['mac-address']} IP=#{reply['address']} status=#{reply['status']}\n"
end
end
end
while tik.outstanding > 0
## Основной "цикл событий"
tik.wait_for_reply
end
rescue MTikError, Errno::ETIMEDOUT, Errno::EHOSTUNREACH, Errno::ECONNREFUSED => e
print "ERROR during DHCP lease API request: #{e}\n"
exit
end
tik.close Вывод может выглядеть так: LEASE: mac=00:85:71:37:4F:26 IP=10.20.30.100 status=bound
LEASE: mac=00:1E:48:FE:1F:7E IP=10.20.30.103 status=
LEASE: mac=00:FF:44:08:43:E2 IP=10.20.30.105 status=
LEASE: mac=00:14:D2:F2:87:F0 IP=10.20.30.109 status=bound
LEASE: mac=00:19:BB:C9:82:FA IP=10.20.30.110 status=
LEASE: mac=00:0E:A3:BE:B3:AF IP=10.20.30.111 status=bound
LEASE: mac=00:25:C7:63:12:9A IP=10.20.30.108 status=bound Aaron out.
