После обновления до последней версии crossbar.io приведенная ниже программа Python зависает при вызове wamp.session.get. Весь код перед ним, включая вызов wamp.session.list, работает нормально, а wamp.session.list возвращает действительный список идентификаторов сеансов.
Цель этой программы - убедиться, что сервер майнинга криптовалют по указанному IP-адресу подключен к WAMP и получает новые блоки из своих монет. Система мониторинга OpenNMS вызывает эту программу и, когда она указывает, что сервер не подключен, будит кого-то, чтобы решить проблему. На момент запуска вызова ничего не было обновлено на сервере, на котором запущена эта программа.
from twisted.internet import reactor, defer
from autobahn.twisted.wamp import ApplicationRunner
from autobahn.twisted.wamp import ApplicationSession
from autobahn.wamp import auth
import sys, traceback, os
import socket
DAEMON_URL = u'censored'
DAEMON_REALM = u'censored'
DAEMON_USERNAME = u'censored'
DAEMON_PASSWORD = u'censored'
class DaemonRealmSession(ApplicationSession):
def onConnect(self):
print "Connected."
self.join(self.config.realm, [u"wampcra"], DAEMON_USERNAME)
@defer.inlineCallbacks
def onJoin(self, details):
try:
print "Joined realm."
if len(sys.argv) < 2:
print "No IP address was provided as an argument. Exit status is 1."
os._exit(1)
ip_address = sys.argv[1]
session_list = yield self.call(u'wamp.session.list')
#Search through the list and find at least two connections from this IP.
for session_id in session_list:
try:
session_info = yield self.call(u'wamp.session.get', session_id)
except Exception, ex:
os._exit(1)
split_peer = session_info['transport']['peer'].split(":")
peer_ip = split_peer[1]
if peer_ip == ip_address:
os._exit(0)
except Exception:
traceback.print_exc()
os._exit(1)
reactor.stop()
def onChallenge(self, challenge):
try:
if challenge.method == "wampcra":
if 'salt' in challenge.extra:
key = auth.derive_key(DAEMON_PASSWORD.encode('utf8'),
challenge.extra['salt'].encode('utf8'),
challenge.extra.get('iterations', None),
challenge.extra.get('keylen', None))
else:
key = DAEMON_PASSWORD.encode('utf8')
signature = auth.compute_wcs(key, challenge.extra['challenge'].encode('utf8'))
return signature.decode('ascii')
else:
raise Exception("don't know how to compute challenge for authmethod {}".format(challenge.method))
except Exception:
traceback.print_exc()
reactor.stop()
daemon_runner = ApplicationRunner(url=DAEMON_URL, realm=DAEMON_REALM)
daemon_runner.run(DaemonRealmSession, start_reactor=False, log_level='debug', auto_reconnect=True)
reactor.run()
#If the code gets here, then the IP address wasn't found.
os._exit(1)
К сожалению, я не могу найти документацию, которая показывает, как найти версию перекладины, работающей на сервере. Это версия из стабильных репозиториев Debian 9 от 15 декабря.
Что изменилось в перекладине, из-за которой wamp.session.get перестал отвечать в этой версии?