📄 main.py
字号:
config = xml.dom.minidom.parse(xmConfigFile) except: print >>sys.stderr, ('Ignoring invalid configuration file %s.' % xmConfigFile)def parseServer(): if config: server = config.getElementsByTagName('server') if server: st = server[0].getAttribute('type') if st != SERVER_XEN_API and st != SERVER_LEGACY_XMLRPC: print >>sys.stderr, ('Invalid server type %s; using %s.' % (st, SERVER_LEGACY_XMLRPC)) st = SERVER_LEGACY_XMLRPC return (st, server[0].getAttribute('uri')) return SERVER_LEGACY_XMLRPC, XendClient.uridef parseAuthentication(): server = config.getElementsByTagName('server')[0] return (server.getAttribute('username'), server.getAttribute('password'))serverType, serverURI = parseServer()server = None###################################################################### Help/usage printing functions#####################################################################def cmdHelp(cmd): """Print help for a specific subcommand.""" if not SUBCOMMAND_HELP.has_key(cmd): for fc in SUBCOMMAND_HELP.keys(): if fc[:len(cmd)] == cmd: cmd = fc break try: args, desc = SUBCOMMAND_HELP[cmd] except KeyError: shortHelp() return print 'Usage: xm %s %s' % (cmd, args) print print desc try: # If options help message is defined, print this. for shortopt, longopt, desc in SUBCOMMAND_OPTIONS[cmd]: if shortopt and longopt: optdesc = '%s, %s' % (shortopt, longopt) elif shortopt: optdesc = shortopt elif longopt: optdesc = longopt wrapped_desc = wrap(desc, 43) print ' %-30s %-43s' % (optdesc, wrapped_desc[0]) for line in wrapped_desc[1:]: print ' ' * 33 + line print except KeyError: # if the command is an external module, we grab usage help # from the module itself. if cmd in IMPORTED_COMMANDS: try: cmd_module = __import__(cmd, globals(), locals(), 'xen.xm') cmd_usage = getattr(cmd_module, "help", None) if cmd_usage: print cmd_usage() except ImportError: pass def shortHelp(): """Print out generic help when xm is called without subcommand.""" print USAGE_HELP print 'Common \'xm\' commands:\n' for command in common_commands: try: args, desc = SUBCOMMAND_HELP[command] except KeyError: continue wrapped_desc = wrap(desc, 50) print ' %-20s %-50s' % (command, wrapped_desc[0]) for line in wrapped_desc[1:]: print ' ' * 22 + line print print USAGE_FOOTER print 'For a complete list of subcommands run \'xm help\'.' def longHelp(): """Print out full help when xm is called with xm --help or xm help""" print USAGE_HELP print 'xm full list of subcommands:\n' for command in all_commands: try: args, desc = SUBCOMMAND_HELP[command] except KeyError: continue wrapped_desc = wrap(desc, 50) print ' %-20s %-50s' % (command, wrapped_desc[0]) for line in wrapped_desc[1:]: print ' ' * 22 + line print print USAGE_FOOTER def _usage(cmd): """ Print help usage information """ if cmd: cmdHelp(cmd) else: shortHelp()def usage(cmd = None): """ Print help usage information and exits """ _usage(cmd) sys.exit(1)###################################################################### Utility functions#####################################################################def get_default_SR(): return [sr_ref for sr_ref in server.xenapi.SR.get_all() if server.xenapi.SR.get_type(sr_ref) == "local"][0]def get_default_Network(): return [network_ref for network_ref in server.xenapi.network.get_all()][0]class XenAPIUnsupportedException(Exception): passdef xenapi_unsupported(): if serverType == SERVER_XEN_API: raise XenAPIUnsupportedException, "This function is not supported by Xen-API"def xenapi_only(): if serverType != SERVER_XEN_API: raise XenAPIUnsupportedException, "This function is only supported by Xen-API"def map2sxp(m): return [[k, m[k]] for k in m.keys()]def arg_check(args, name, lo, hi = -1): n = len([i for i in args if i != '--']) if hi == -1: if n != lo: err("'xm %s' requires %d argument%s.\n" % (name, lo, lo == 1 and '' or 's')) usage(name) else: if n < lo or n > hi: err("'xm %s' requires between %d and %d arguments.\n" % (name, lo, hi)) usage(name)def unit(c): if not c.isalpha(): return 0 base = 1 if c == 'G' or c == 'g': base = 1024 * 1024 * 1024 elif c == 'M' or c == 'm': base = 1024 * 1024 elif c == 'K' or c == 'k': base = 1024 else: print 'ignoring unknown unit' return basedef int_unit(str, dest): base = unit(str[-1]) if not base: return int(str) value = int(str[:-1]) dst_base = unit(dest) if dst_base == 0: dst_base = 1 if dst_base > base: return value / (dst_base / base) else: return value * (base / dst_base)def err(msg): print >>sys.stderr, "Error:", msgdef get_single_vm(dom): if serverType == SERVER_XEN_API: uuids = server.xenapi.VM.get_by_name_label(dom) if len(uuids) > 0: return uuids[0] refs = [] try: domid = int(dom) refs = [vm_ref for vm_ref in server.xenapi.VM.get_all() if int(server.xenapi.VM.get_domid(vm_ref)) == domid] except: pass if len(refs) > 0: return refs[0] raise OptionError("Domain '%s' not found." % dom) else: dominfo = server.xend.domain(dom, False) return dominfo['uuid']#### Xen-API Shell###class Shell(cmd.Cmd): def __init__(self): cmd.Cmd.__init__(self) self.prompt = "xm> " if serverType == SERVER_XEN_API: try: res = server.xenapi.host.list_methods() for f in res: setattr(Shell, 'do_' + f + ' ', self.default) except: pass def preloop(self): cmd.Cmd.preloop(self) try: import readline readline.set_completer_delims(' ') except ImportError: pass def default(self, line): words = shlex.split(line) if len(words) > 0 and words[0] == 'xm': words = words[1:] if len(words) > 0: cmd = xm_lookup_cmd(words[0]) if cmd: _run_cmd(cmd, words[0], words[1:]) elif serverType == SERVER_XEN_API: ok, res = _run_cmd(lambda x: server.xenapi_request(words[0], tuple(x)), words[0], words[1:]) if ok and res is not None and res != '': pprint.pprint(res) else: print '*** Unknown command: %s' % words[0] return False def completedefault(self, text, line, begidx, endidx): words = shlex.split(line[:begidx]) clas, func = words[0].split('.') if len(words) > 1 or \ func.startswith('get_by_') or \ func == 'get_all': return [] uuids = server.xenapi_request('%s.get_all' % clas, ()) return [u + " " for u in uuids if u.startswith(text)] def emptyline(self): pass def do_EOF(self, line): print sys.exit(0) def do_help(self, line): _usage(line)def xm_shell(args): Shell().cmdloop('The Xen Master. Type "help" for a list of functions.')def xm_event_monitor(args): if serverType == SERVER_XEN_API: while True: server.xenapi.event.register(args) events = server.xenapi.event.next() for e in events: print e else: err("Event monitoring not supported unless using Xen-API.")########################################################################### Main xm functions##########################################################################def xm_save(args): arg_check(args, "save", 2, 3) try: (options, params) = getopt.gnu_getopt(args, 'c', ['checkpoint']) except getopt.GetoptError, opterr: err(opterr) sys.exit(1) checkpoint = False for (k, v) in options: if k in ['-c', '--checkpoint']: checkpoint = True if len(params) != 2: err("Wrong number of parameters") usage('save') dom = params[0] savefile = os.path.abspath(params[1]) if not os.access(os.path.dirname(savefile), os.W_OK): err("xm save: Unable to create file %s" % savefile) sys.exit(1) if serverType == SERVER_XEN_API: server.xenapi.VM.save(get_single_vm(dom), savefile, checkpoint) else: server.xend.domain.save(dom, savefile, checkpoint) def xm_restore(args): arg_check(args, "restore", 1, 2) try: (options, params) = getopt.gnu_getopt(args, 'p', ['paused']) except getopt.GetoptError, opterr: err(opterr) usage('restore') paused = False for (k, v) in options: if k in ['-p', '--paused']: paused = True if len(params) != 1: err("Wrong number of parameters") usage('restore') savefile = os.path.abspath(params[0]) if not os.access(savefile, os.R_OK): err("xm restore: Unable to read file %s" % savefile) sys.exit(1) if serverType == SERVER_XEN_API: server.xenapi.VM.restore(savefile, paused) else: server.xend.domain.restore(savefile, paused)def datetime_to_secs(v): unwanted = ":-." for c in unwanted: v = str(v).replace(c, "") return time.mktime(time.strptime(v[0:14], '%Y%m%dT%H%M%S'))def getDomains(domain_names, state, full = 0): if serverType == SERVER_XEN_API: doms_sxp = [] doms_dict = [] dom_recs = server.xenapi.VM.get_all_records() dom_metrics_recs = server.xenapi.VM_metrics.get_all_records() for dom_ref, dom_rec in dom_recs.items(): dom_metrics_rec = dom_metrics_recs[dom_rec['metrics']] states = ('running', 'blocked', 'paused', 'shutdown', 'crashed', 'dying') def state_on_off(state): if state in dom_metrics_rec['state']: return state[0] else: return "-" state_str = "".join([state_on_off(state) for state in states]) dom_rec.update({'name': dom_rec['name_label'], 'memory_actual': int(dom_metrics_rec['memory_actual'])/1024, 'vcpus': dom_metrics_rec['VCPUs_number'], 'state': state_str, 'cpu_time': dom_metrics_rec['VCPUs_utilisation'], 'start_time': datetime_to_secs( dom_metrics_rec['start_time'])}) doms_sxp.append(['domain'] + map2sxp(dom_rec)) doms_dict.append(dom_rec)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -