অবশেষে আমি হাল ছেড়ে দিয়ে এটিকে নিজেই ডিবাগ করতে চলেছি।
@ সেলিবানোভ পাভেলের উত্তরের ভিত্তিতে আমি zencommandডিবাগিংটি চালু করলাম এবং অপেক্ষা করছিলাম, এবং নিশ্চিতভাবেই, জেনপ্যাক ব্যর্থ হয়েছিল।
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এই ঘাটতি রয়েছে বলে মনে হয়; কোনও আইপিভি 6 সমর্থন করে না।
সুতরাং "উত্তর" আমি ঠিক করতে যাচ্ছি pymysql। আমি কিভাবে আমার বিকাল কাটাতে চেয়েছিলাম তা নয়।
এই বিড়াল হ্যাকারি জিনিসগুলি কাজ করে (যদিও আপনার পাইথন ২.6 প্রয়োজন)। 660 লাইনটি খুলুন /opt/zenoss/lib/python/pymysql/connections.pyএবং অনুসন্ধান করুন AF_INETThen তারপরে নিম্নলিখিত পরিবর্তনটি করুন:
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'
এটি এর পরে আপস্ট্রিম পাইমিস্কুলে স্থির করা হয়েছে এবং ভবিষ্যতে প্রকাশিত হওয়া উচিত।