অবশেষে আমি হাল ছেড়ে দিয়ে এটিকে নিজেই ডিবাগ করতে চলেছি।
@ সেলিবানোভ পাভেলের উত্তরের ভিত্তিতে আমি 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_INET
Then তারপরে নিম্নলিখিত পরিবর্তনটি করুন:
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'
এটি এর পরে আপস্ট্রিম পাইমিস্কুলে স্থির করা হয়েছে এবং ভবিষ্যতে প্রকাশিত হওয়া উচিত।