나는 마침내 포기하고 이것을 직접 디버깅했다.
@SelivanovPavel 의 답변을 바탕으로 디버깅을 켜고 zencommand
기다렸다가 ZenPack이 실패했습니다.
2012-08-16 18:16:14,092 INFO zen.zencommand: Datasource MySQL/mysql command: /opt/zenoss/ZenPacks/ZenPacks.zenoss.MySqlMonitor-2.2.0-py2.7.egg/ZenPacks/zenoss/MySqlMonitor/libexec/check_mysql_stats.py -H 2001:db8:81:2c::2 -p 3306 -u zenoss -w 'password' -g
2012-08-16 18:16:14,100 DEBUG zen.zencommand: Running /opt/zenoss/ZenPacks/ZenPacks.zenoss.MySqlMonitor-2.2.0-py2.7.egg/ZenPacks/zenoss/MySqlMonitor/libexec/check_mysql_stats.py
2012-08-16 18:16:14,544 DEBUG zen.zencommand: Datasource: mysql Received exit code: 1 Output: 'MySQL Error: (2003, "Can\'t connect to MySQL server on \'2001:db8:81:2c::2\' (-9)")\n'
2012-08-16 18:16:14,545 DEBUG zen.zencommand: Process MySQL/mysql stopped (1), 0.43 seconds elapsed
나는 ZenPack 파고하고 (의 분명히 이전 버전)를 수입했다 발견 그래서 pymysql
에서 /opt/zenoss/lib/python
.
파이썬 명령 줄에서 테스트 할 때 예외가 발생한 곳을 발견했습니다.
>>> sys.path.insert(0, "/opt/zenoss/lib/python");
>>> import pymysql
>>> pymysql.install_as_MySQLdb()
>>> import MySQLdb
>>> self.conn = MySQLdb.connect(host="2001:db8:81:2c::2", port=3306, db='', user='zenoss', passwd='password')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/zenoss/lib/python/pymysql/__init__.py", line 93, in Connect
return Connection(*args, **kwargs)
File "/opt/zenoss/lib/python/pymysql/connections.py", line 504, in __init__
self._connect()
File "/opt/zenoss/lib/python/pymysql/connections.py", line 673, in _connect
raise OperationalError(2003, "Can't connect to MySQL server on %r (%s)" % (self.host, e.args[0]))
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '2001:db8:81:2c::2' (-9)")
그리고 connections.py
그 일반적인 주변 에서 조사 하면서 나는 AF_INET
소켓 을 열려고 시도하는 공포를 발견했으며 소켓을 여는 코드는 어디에도 없었습니다 AF_INET6
. 붐, 즉시 실패.
현재 버전 pymysql
에도이 결함이있는 것 같습니다. 어떤 IPv6도 지원하지 않습니다.
따라서 "답변"은 수정해야합니다 pymysql
. 내가 어떻게 오후를 보내고 싶었는지.
이 불쾌한 해커는 일을 처리합니다 (Python 2.6이 필요하지만). 660 행 /opt/zenoss/lib/python/pymysql/connections.py
을 열고 검색하십시오. AF_INET
그런 다음 다음을 변경하십시오.
if DEBUG: print 'connected using unix_socket'
else:
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- t = sock.gettimeout()
- sock.settimeout(self.connect_timeout)
- sock.connect((self.host, self.port))
- sock.settimeout(t)
+ sock = socket.create_connection((self.host, self.port), self.connect_timeout)
self.host_info = "socket %s:%d" % (self.host, self.port)
if DEBUG: print 'connected using socket'
이는 이후 업스트림 pymysql에서 수정되었으며 이후 릴리스에서 제공 될 예정입니다.