diagnose.py
来自「xen虚拟机源代码安装包」· Python 代码 · 共 186 行
PY
186 行
# This library is free software; you can redistribute it and/or# modify it under the terms of version 2.1 of the GNU Lesser General Public# License as published by the Free Software Foundation.## This library is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU# Lesser General Public License for more details.## You should have received a copy of the GNU Lesser General Public# License along with this library; if not, write to the Free Software# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA## Copyright (c) 2005-2006 XenSource Incimport reimport socketimport sysfrom xen.xend import sxpfrom xen.xend.XendClient import serverfrom xen.xend.XendError import XendErrorfrom xen.xend.xenstore.xstransact import xstransactfrom xen.xend.server import DevControllerimport xen.xend.XendProtocoldomain = Nonedomid = NonedeviceClass = Nonedevice = NonefrontendPath = NonebackendPath = Nonedef diagnose(dom): global domain global domid global dompath try: domain = server.xend.domain(dom) state = sxp.child_value(domain, 'state') domid = int(sxp.child_value(domain, 'domid')) name = sxp.child_value(domain, 'name') print "Domain ID is %d." % domid print "Domain name is %s." % name if not state: raise XendError("Cannot find state") if state.find('c') != -1: print "Domain has crashed." except socket.error, exn: print "Cannot contact Xend." try: domid = int(dom) name = dom except ValueError: print \"Without Xend, you will have to specify the domain ID, not the domain name." sys.exit(1) except xen.xend.XendProtocol.XendError, exn: print exn sys.exit(1) dompath = '/local/domain/%d' % domid diagnose_console() diagnose_devices()def diagnose_console(): port = xstransact.Read(dompath + '/console/port') ringref = xstransact.Read(dompath + '/console/ring-ref') tty = xstransact.Read(dompath + '/console/tty') if not port: print "Console port is missing; Xend has failed." if not ringref: print "Console ring-ref is missing; Xend has failed." if not tty: print "Console tty is missing; Xenconsoled has failed."def diagnose_devices(): global deviceClass global device global frontendPath global backendPath device_path = dompath + '/device' device_classes = xstransact.List(device_path) print "Found %d device classes in use." % len(device_classes) for dc in device_classes: deviceClass = dc device_class_path = device_path + '/' + deviceClass devices = xstransact.List(device_class_path) print "Found %d %s devices." % (len(devices), deviceClass) for d in devices: device = d print "Found device %s, %s." % (deviceClass, device) frontendPath = device_class_path + '/' + device backendPath = xstransact.Read(frontendPath, 'backend') if not backendPath: print ("Cannot find backend path for device %s, %s." % (deviceClass, device)) else: frontend_state = xstransact.Read(frontendPath, 'state') backend_state = xstransact.Read(backendPath, 'state') print "Backend is in state %s." % stateString(backend_state) print "Frontend is in state %s." % stateString(frontend_state) check_for_error(True) check_for_error(False) diagnose_hotplugging()def check_for_error(backend): if backend: path = backendPath.replace('backend/', 'error/backend/') else: path = frontendPath.replace('device/', 'error/device/') err = xstransact.Read(path, 'error') if err: print ("%s for device %s, %s shows error %s." % (backend and 'Backend' or 'Frontend', deviceClass, device, err))def diagnose_hotplugging(): if deviceClass == 'vbd': phy = xstransact.Read(backendPath, 'physical-device') if phy: print ('Device %s, %s hotplugging has completed successfully, ' 'and is connected to physical device %s.' % (deviceClass, device, phy)) else: print ('Device %s, %s hotplugging failed.' % (deviceClass, device)) elif deviceClass == 'vif': handle = xstransact.Read(backendPath, 'handle') if handle: print ('Device %s, %s hotplugging has completed successfully, ' 'and is using handle %s.' % (deviceClass, device, handle)) else: print ('Device %s, %s hotplugging failed.' % (deviceClass, device))def stateString(state): return state and DevController.xenbusState[int(state)] or '<None>'def main(argv = None): if argv is None: argv = sys.argv diagnose(argv[1]) return 0if __name__ == "__main__": sys.exit(main())
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?