diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/examples/Makefile | 9 | ||||
-rwxr-xr-x | tools/examples/init.d/xendomains | 46 | ||||
-rw-r--r-- | tools/xenmgr/lib/XendBridge.py | 11 | ||||
-rw-r--r-- | tools/xenmgr/lib/XendDomain.py | 32 | ||||
-rw-r--r-- | tools/xenmgr/lib/XendDomainInfo.py | 1 | ||||
-rw-r--r-- | tools/xenmgr/lib/XendRoot.py | 6 | ||||
-rw-r--r-- | tools/xenmgr/lib/server/SrvConsoleServer.py | 1 | ||||
-rw-r--r-- | tools/xenmgr/lib/server/SrvDomain.py | 4 | ||||
-rwxr-xr-x | tools/xenmgr/lib/server/blkif.py | 33 | ||||
-rwxr-xr-x | tools/xenmgr/lib/server/controller.py | 2 | ||||
-rwxr-xr-x | tools/xenmgr/lib/server/netif.py | 21 | ||||
-rw-r--r-- | tools/xenmgr/lib/xm/create.py | 15 | ||||
-rw-r--r-- | tools/xenmgr/lib/xm/main.py | 107 | ||||
-rw-r--r-- | tools/xenmgr/lib/xm/opts.py | 2 | ||||
-rw-r--r-- | tools/xenmgr/lib/xm/shutdown.py | 4 |
15 files changed, 193 insertions, 101 deletions
diff --git a/tools/examples/Makefile b/tools/examples/Makefile index ed8e4c71b1..3f7075ed1d 100644 --- a/tools/examples/Makefile +++ b/tools/examples/Makefile @@ -1,19 +1,20 @@ INSTALL = $(wildcard *.py) ETC = defaults democd netbsd xmdefaults +ETCDIR = /etc/xen INITD = init.d/xendomains init.d/xend all: install: all mkdir -p $(prefix)/usr/bin - mkdir -p $(prefix)/etc/xc - mkdir -p $(prefix)/etc/xc/auto + mkdir -p $(prefix)$(ETCDIR) + mkdir -p $(prefix)$(ETCDIR)/auto mkdir -p $(prefix)/etc/init.d install -m0755 $(INSTALL) $(prefix)/usr/bin for i in $(ETC); \ - do [ -a $(prefix)/etc/xc/$$i ] || \ - install -m0644 $$i $(prefix)/etc/xc; \ + do [ -a $(prefix)/$(ETCDIR)/$$i ] || \ + install -m0644 $$i $(prefix)$(ETCDIR); \ done install -m0755 $(INITD) $(prefix)/etc/init.d diff --git a/tools/examples/init.d/xendomains b/tools/examples/init.d/xendomains index fa96ff8378..41524e6f57 100755 --- a/tools/examples/init.d/xendomains +++ b/tools/examples/init.d/xendomains @@ -19,6 +19,9 @@ RETVAL=0 INITD=/etc/init.d/ +AUTODIR=/etc/xen/auto +LOCKFILE=/var/lock/subsys/xendomains + if [ -e /lib/lsb ]; then # assume an LSB-compliant distro (Debian with LSB package, # recent-enough SuSE, others...) @@ -52,24 +55,23 @@ fi start() { - if [ -f /var/lock/subsys/xendomains ]; then return; fi + if [ -f $LOCKFILE ]; then return; fi echo -n $"Starting auto Xen domains:" - # we expect config scripts for auto starting domains to be in - # /etc/xc/auto/ - they could just be symlinks to files elsewhere - if [ -d /etc/xc/auto ] && - [ $(ls /etc/xc/auto/ | wc -l) -gt 0 ]; then + # We expect config scripts for auto starting domains to be in + # AUTODIR - they could just be symlinks to files elsewhere + if [ -d $AUTODIR ] && [ $(ls $AUTODIR | wc -l) -gt 0 ]; then + touch $LOCKFILE - # create all domains with config files in /etc/xc/auto - for dom in /etc/xc/auto/*; do - xc_dom_create.py -q -f $dom + # Create all domains with config files in AUTODIR. + for dom in $AUTODIR/*; do + xm create --quiet --defaults $dom if [ $? -ne 0 ]; then RETVAL=$? fi done - touch /var/lock/subsys/xendomains fi on_fn_exit @@ -78,40 +80,24 @@ start() { stop() { # NB. this shuts down ALL Xen domains (politely), not just the ones in - # /etc/xc/auto/* + # AUTODIR/* # This is because it's easier to do ;-) but arguably if this script is run # on system shutdown then it's also the right thing to do. echo -n $"Shutting down all Xen domains:" - if [ -d /var/run/xendomains ] && - [ $(ls /var/run/xendomains/ | wc -l) -gt 0 ]; then - - cd /var/run/xendomains/ - - for pid in *; do - - kill -s SIGTERM $(cat $pid) - - done + xm shutdown --all --wait --norestart - fi - - sleep 3 # avoid races - - xc_dom_control.py shutdown all -w # shut down all domains, politely and wait - # for all to exit - RETVAL=$? - [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/xendomains + [ $RETVAL -eq 0 ] && rm -f $LOCKFILE on_fn_exit } # This does NOT necessarily restart all running domains: instead it # stops all running domains and then boots all the domains specified in -# /etc/xc/auto. If other domains have been started manually then they will +# AUTODIR. If other domains have been started manually then they will # not get restarted. # Commented out to avoid confusion! # @@ -149,7 +135,7 @@ case "$1" in # ;; status) - xc_dom_control.py list + xm list ;; *) diff --git a/tools/xenmgr/lib/XendBridge.py b/tools/xenmgr/lib/XendBridge.py index 1be802477d..10e2234eae 100644 --- a/tools/xenmgr/lib/XendBridge.py +++ b/tools/xenmgr/lib/XendBridge.py @@ -12,6 +12,7 @@ os.defpath = os.defpath + ':/sbin:/usr/sbin:/usr/local/sbin' CMD_IFCONFIG = 'ifconfig' CMD_ROUTE = 'route' CMD_BRCTL = 'brctl' +CMD_IPTABLES = "iptables" DEFAULT_BRIDGE = 'nbe-br' DEFAULT_INTERFACE = 'eth0' @@ -61,6 +62,16 @@ def vif_bridge_rem(dom, vif, bridge=None): d = { 'bridge': bridge, 'vif': vif_dev(dom, vif) } cmd(CMD_BRCTL, 'delif %(bridge)s %(vif)s' % d) +def vif_restrict_addr(dom, vif, addr, delete=0): + d = { 'vif': vif_dev(dom, vif), 'addr': addr} + if delete: + d['flag'] = '-D' + else: + d['flag'] = '-A' + cmd(CMD_IPTABLES, '-P FORWARD DROP') + cmd(CMD_IPTABLES, '%(flag)s FORWARD -m physdev --physdev-in %(vif)s -s %(addr)s -j ACCEPT' % d) + cmd(CMD_IPTABLES, '%(flag)s FORWARD -m physdev --physdev-out %(vif)s -d %(addr)s -j ACCEPT' % d) + def bridge_create(bridge=None, **kwd): """Create a bridge. Defaults hello time to 0, forward delay to 0 and stp off. diff --git a/tools/xenmgr/lib/XendDomain.py b/tools/xenmgr/lib/XendDomain.py index 106af33b61..5c31079b2e 100644 --- a/tools/xenmgr/lib/XendDomain.py +++ b/tools/xenmgr/lib/XendDomain.py @@ -42,8 +42,13 @@ class XendDomain: if xroot.get_rebooted(): print 'XendDomain> rebooted: removing all domain info' self.rm_all() + eserver.subscribe('xend.virq', self.onVirq) self.initial_refresh() + def onVirq(self, event, val): + print 'XendDomain> virq', val + self.reap() + def rm_all(self): """Remove all domain info. Used after reboot. """ @@ -136,13 +141,33 @@ class XendDomain: def _delete_domain(self, id, notify=1): if id in self.domain: - self.domain[id].died() if notify: eserver.inject('xend.domain.died', id) del self.domain[id] if id in self.domain_db: del self.domain_db[id] self.db.delete(id) + def reap(self): + print 'reap>' + domlist = xc.domain_getinfo() + casualties = [] + for d in domlist: + print 'dom', d + dead = 0 + dead = dead or (d['crashed'] or d['shutdown']) + dead = dead or (d['dying'] and + not(d['running'] or d['paused'] or d['blocked'])) + if dead: + casualties.append(d) + for d in casualties: + id = str(d['dom']) + print 'died> id=', id, d + dominfo = self.domain.get(id) + if not dominfo: continue + dominfo.died() + self.domain_destroy(id, refresh=0) + print 'reap<' + def refresh(self): """Refresh domain list from Xen. """ @@ -169,6 +194,7 @@ class XendDomain: d.update(dominfo) else: self._delete_domain(d.id) + self.reap() def refresh_domain(self, id): dom = int(id) @@ -232,7 +258,7 @@ class XendDomain: self.refresh() return val - def domain_destroy(self, id): + def domain_destroy(self, id, refresh=1): """Terminate domain immediately. """ dom = int(id) @@ -240,7 +266,7 @@ class XendDomain: return 0 eserver.inject('xend.domain.destroy', id) val = xc.domain_destroy(dom=dom) - self.refresh() + if refresh: self.refresh() return val def domain_migrate(self, id, dst): diff --git a/tools/xenmgr/lib/XendDomainInfo.py b/tools/xenmgr/lib/XendDomainInfo.py index 0dfd1a71ee..1f44f026a4 100644 --- a/tools/xenmgr/lib/XendDomainInfo.py +++ b/tools/xenmgr/lib/XendDomainInfo.py @@ -364,6 +364,7 @@ class XendDomainInfo: """Update with info from xc.domain_getinfo(). """ self.info = info + self.memory = self.info['mem_kb'] / 1024 def __str__(self): s = "domain" diff --git a/tools/xenmgr/lib/XendRoot.py b/tools/xenmgr/lib/XendRoot.py index 6d9903a91d..665f5df29e 100644 --- a/tools/xenmgr/lib/XendRoot.py +++ b/tools/xenmgr/lib/XendRoot.py @@ -30,13 +30,13 @@ def last_reboot(): class XendRoot: """Root of the management classes.""" - lastboot_default = "/etc/xen/xend/lastboot" + lastboot_default = "/var/xen/lastboot" """Default path to the root of the database.""" - dbroot_default = "/etc/xen/xend/xenmgr-db" + dbroot_default = "/var/xen/xend-db" """Default path to the config file.""" - config_default = "/etc/xen/xenmgr-config.sxp" + config_default = "/etc/xen/xend-config.sxp" """Environment variable used to override config_default.""" config_var = "XEND_CONFIG" diff --git a/tools/xenmgr/lib/server/SrvConsoleServer.py b/tools/xenmgr/lib/server/SrvConsoleServer.py index 7a8e4b96d8..1fcaf7d707 100644 --- a/tools/xenmgr/lib/server/SrvConsoleServer.py +++ b/tools/xenmgr/lib/server/SrvConsoleServer.py @@ -417,6 +417,7 @@ class VirqClient: def virqReceived(self, virq): print 'VirqClient.virqReceived>', virq + eserver.inject('xend.virq', virq) def lostChannel(self, channel): print 'VirqClient.lostChannel>', channel diff --git a/tools/xenmgr/lib/server/SrvDomain.py b/tools/xenmgr/lib/server/SrvDomain.py index d8287e05ea..44d8f4cf6d 100644 --- a/tools/xenmgr/lib/server/SrvDomain.py +++ b/tools/xenmgr/lib/server/SrvDomain.py @@ -40,14 +40,14 @@ class SrvDomain(SrvDir): def op_save(self, op, req): fn = FormFn(self.xd.domain_save, [['dom', 'int'], - ['dst', 'str']]) + ['file', 'str']]) val = fn(req.args, {'dom': self.dom.id}) return val def op_restore(self, op, req): fn = FormFn(self.xd.domain_restore, [['dom', 'int'], - ['src', 'str']]) + ['file', 'str']]) val = fn(req.args, {'dom': self.dom.id}) return val diff --git a/tools/xenmgr/lib/server/blkif.py b/tools/xenmgr/lib/server/blkif.py index 92706316b1..f23a6d7fa4 100755 --- a/tools/xenmgr/lib/server/blkif.py +++ b/tools/xenmgr/lib/server/blkif.py @@ -1,5 +1,8 @@ from twisted.internet import defer +from xenmgr import sxp +from xenmgr import PrettyPrint + import channel import controller from messages import * @@ -140,11 +143,12 @@ class BlkDev(controller.Dev): return 'w' not in self.mode def sxpr(self): - print 'BlkDev>sxpr>', vars(self) - val = ['blkif', ['vdev', self.vdev], ['mode', self.mode] ] + val = ['blkdev', ['vdev', self.vdev], ['mode', self.mode] ] return val def destroy(self): + print 'BlkDev>destroy>', self.vdev + PrettyPrint.prettyprint(self.sxpr()) self.controller.send_be_vbd_destroy(self.vdev) class BlkifController(controller.Controller): @@ -166,9 +170,18 @@ class BlkifController(controller.Controller): self.recv_fe_interface_connect, } self.attached = 1 + self.evtchn = None self.registerChannel() #print 'BlkifController<', 'dom=', self.dom, 'idx=', self.idx + def sxpr(self): + val = ['blkif', ['dom', self.dom]] + if self.evtchn: + val.append(['evtchn', + self.evtchn['port1'], + self.evtchn['port2']]) + return val + def lostChannel(self): print 'BlkifController>lostChannel>', 'dom=', self.dom #self.destroyDevices() @@ -201,7 +214,9 @@ class BlkifController(controller.Controller): return d def destroy(self): + print 'BlkifController>destroy> dom=', self.dom self.destroyDevices() + self.send_be_destroy() def destroyDevices(self): for dev in self.getDevices(): @@ -229,7 +244,8 @@ class BlkifController(controller.Controller): return self.attached def reattached(self): - """All devices have been reattached after the back-end control domain has changed. + """All devices have been reattached after the back-end control + domain has changed. """ msg = packMsg('blkif_fe_interface_status_changed_t', { 'handle' : 0, @@ -246,6 +262,8 @@ class BlkifController(controller.Controller): def recv_fe_interface_connect(self, msg, req): val = unpackMsg('blkif_fe_interface_connect_t', msg) self.evtchn = channel.eventChannel(0, self.dom) + print 'recv_fe_interface_connect>' + PrettyPrint.prettyprint(self.sxpr()) msg = packMsg('blkif_be_connect_t', { 'domid' : self.dom, 'blkif_handle' : val['handle'], @@ -272,6 +290,13 @@ class BlkifController(controller.Controller): 'blkif_handle' : 0 }) self.factory.writeRequest(msg) + def send_be_destroy(self): + print '>BlkifController>send_be_destroy>', 'dom=', self.dom + msg = packMsg('blkif_be_destroy_t', + { 'domid' : self.dom, + 'blkif_handle' : 0 }) + self.factory.writeRequest(msg) + def send_be_vbd_create(self, vdev): dev = self.devices[vdev] msg = packMsg('blkif_be_vbd_create_t', @@ -293,6 +318,8 @@ class BlkifController(controller.Controller): self.factory.writeRequest(msg) def send_be_vbd_destroy(self, vdev): + print '>BlkifController>send_be_vbd_destroy>', 'dom=', self.dom, 'vdev=', vdev + PrettyPrint.prettyprint(self.sxpr()) dev = self.devices[vdev] msg = packMsg('blkif_be_vbd_destroy_t', { 'domid' : self.dom, diff --git a/tools/xenmgr/lib/server/controller.py b/tools/xenmgr/lib/server/controller.py index cb543fa57c..08afdfd634 100755 --- a/tools/xenmgr/lib/server/controller.py +++ b/tools/xenmgr/lib/server/controller.py @@ -132,7 +132,7 @@ class Controller(CtrlMsgRcvr): def close(self): self.deregisterChannel() - self.lostChannel(self) + self.lostChannel() def lostChannel(self): self.factory.instanceClosed(self) diff --git a/tools/xenmgr/lib/server/netif.py b/tools/xenmgr/lib/server/netif.py index d2a6a53860..f999aefcc5 100755 --- a/tools/xenmgr/lib/server/netif.py +++ b/tools/xenmgr/lib/server/netif.py @@ -2,6 +2,8 @@ import random from twisted.internet import defer +from xenmgr import sxp +from xenmgr import PrettyPrint from xenmgr import XendBridge import channel @@ -117,9 +119,13 @@ class NetDev(controller.Dev): def sxpr(self): vif = str(self.vif) mac = ':'.join(map(lambda x: "%x" % x, self.mac)) - val = ['netif', ['vif', vif], ['mac', mac]] + val = ['netdev', ['vif', vif], ['mac', mac]] if self.bridge: - val += ['bridge', self.bridge] + val.append(['bridge', self.bridge]) + if self.evtchn: + val.append(['evtchn', + self.evtchn['port1'], + self.evtchn['port2']]) return val def bridge_add(self, bridge): @@ -131,6 +137,8 @@ class NetDev(controller.Dev): self.bridge = None def destroy(self): + print 'NetDev>destroy>', 'vif=', self.vif + PrettyPrint.prettyprint(self.sxpr()) self.bridge_rem() self.controller.send_be_destroy(self.vif) @@ -155,7 +163,10 @@ class NetifController(controller.Controller): self.registerChannel() #print 'NetifController<', 'dom=', self.dom, 'idx=', self.idx - + def sxpr(self): + val = ['netif', ['dom', self.dom]] + return val + def randomMAC(self): # VIFs get a random MAC address with a "special" vendor id. # @@ -194,6 +205,7 @@ class NetifController(controller.Controller): return dev def destroy(self): + print 'NetifController>destroy>', 'dom=', self.dom self.destroyDevices() def destroyDevices(self): @@ -270,7 +282,8 @@ class NetifController(controller.Controller): self.factory.writeRequest(msg) def send_be_destroy(self, vif): - print 'send_be_destroy>', 'dom=', self.dom, 'vif=', vif + print 'NetifController>send_be_destroy>', 'dom=', self.dom, 'vif=', vif + PrettyPrint.prettyprint(self.sxpr()) dev = self.devices[vif] del self.devices[vif] msg = packMsg('netif_be_destroy_t', diff --git a/tools/xenmgr/lib/xm/create.py b/tools/xenmgr/lib/xm/create.py index e3ccad20b7..d0bfa0859c 100644 --- a/tools/xenmgr/lib/xm/create.py +++ b/tools/xenmgr/lib/xm/create.py @@ -24,7 +24,7 @@ gopts.opt('quiet', short='q', use="Quiet.") gopts.opt('path', val='PATH', - fn=set_value, default='.:/etc/xc', + fn=set_value, default='.:/etc/xen', use="Search path for default scripts.") gopts.opt('defaults', short='f', val='FILE', @@ -220,12 +220,13 @@ def configure_vifs(config_devs, opts): config_vif.append(['bridge', bridge]) config_devs.append(['device', config_vif]) -## if vfr_ipaddr: -## config_vfr = ['vfr'] -## idx = 0 # No way of saying which IP is for which vif? -## for ip in vfr_ipaddr: -## config_vfr.append(['vif', ['id', idx], ['ip', ip]]) -## config.append(config_vfr) +def configure_vfr(config, opts): + if not opts.ipaddr: return + config_vfr = ['vfr'] + idx = 0 # No way of saying which IP is for which vif? + for ip in opts.ipaddr: + config_vfr.append(['vif', ['id', idx], ['ip', ip]]) + config.append(config_vfr) def make_config(opts): diff --git a/tools/xenmgr/lib/xm/main.py b/tools/xenmgr/lib/xm/main.py index 40daf0ae54..673cccd9fa 100644 --- a/tools/xenmgr/lib/xm/main.py +++ b/tools/xenmgr/lib/xm/main.py @@ -4,6 +4,7 @@ import os import os.path import sys +from getopt import getopt from xenmgr import PrettyPrint from xenmgr import sxp @@ -127,7 +128,7 @@ class ProgHelp(Prog): name = args[1] p = self.xm.getprog(name) if p: - p.help(args) + p.help(args[1:]) else: print '%s: Unknown command: %s' % (self.name, name) else: @@ -159,22 +160,13 @@ class ProgSave(Prog): info = """Save domain state (and config) to file.""" def help(self, args): - print self.name, "DOM FILE [CONFIG]" - print """\nSave domain with id DOM to FILE. - Optionally save config to CONFIG.""" + print args[0], "DOM FILE" + print """\nSave domain with id DOM to FILE.""" def main(self, args): - if len(args) < 3: self.err("%s: Missing arguments" % self.name) + if len(args) < 3: self.err("%s: Missing arguments" % args[0]) dom = args[1] savefile = os.path.abspath(args[2]) - configfile = None - if len(args) == 4: - configfile = os.path.abspath(args[3]) - if configfile: - out = file(configfile, 'w') - config = server.xend_domain(dom) - PrettyPrint.prettyprint(config, out=out) - out.close() server.xend_domain_save(dom, savefile) xm.prog(ProgSave) @@ -185,13 +177,16 @@ class ProgRestore(Prog): info = """Create a domain from a saved state.""" def help(self, args): - print self.name, "FILE CONFIG" + print args[0], "FILE [CONFIG]" print "\nRestore a domain from FILE using configuration CONFIG." def main(self, help, args): - if len(args) < 3: self.err("%s: Missing arguments" % self.name) + if len(args) < 2: self.err("%s: Missing arguments" % args[0]) savefile = os.path.abspath(args[1]) - configfile = os.path.abspath(args[2]) + if len(args) >= 3: + configfile = os.path.abspath(args[2]) + else: + configfile = None info = server.xend_domain_restore(savefile, configfile) PrettyPrint.prettyprint(info) @@ -202,20 +197,41 @@ class ProgList(Prog): name = "list" info = """List info about domains.""" + short_options = 'l' + long_options = ['long'] + def help(self, args): if help: - print self.name, '[DOM...]' + print args[0], '[options] [DOM...]' print """\nGet information about domains. - Either all domains or the domains given.""" + Either all domains or the domains given. + + -l, --long Get more detailed information. + """ return def main(self, args): - n = len(args) - if n == 1: - doms = server.xend_domains() + use_long = 0 + (options, params) = getopt(args[1:], + self.short_options, + self.long_options) + n = len(params) + for (k, v) in options: + if k in ['-l', '--long']: + use_long = 1 + + if n == 0: + doms = map(int, server.xend_domains()) + doms.sort() + else: + doms = map(int, params) + + if use_long: + self.long_list(doms) else: - doms = map(int, args[1:]) - doms.sort() + self.brief_list(doms) + + def brief_list(self, doms): print 'Dom Name Mem(MB) CPU State Time(s)' for dom in doms: info = server.xend_domain(dom) @@ -228,6 +244,12 @@ class ProgList(Prog): d['cpu_time'] = float(sxp.child_value(info, 'cpu_time', '0')) print ("%(dom)-4d %(name)-16s %(mem)7d %(cpu)3d %(state)5s %(cpu_time)7.1f" % d) + def long_list(self, doms): + for dom in doms: + info = server.xend_domain(dom) + print '\nDomain %d' % dom + PrettyPrint.prettyprint(info) + xm.prog(ProgList) class ProgDestroy(Prog): @@ -236,11 +258,11 @@ class ProgDestroy(Prog): info = """Terminate a domain immediately.""" def help(self, args): - print self.name, 'DOM' + print args[0], 'DOM' print '\nTerminate domain DOM immediately.' def main(self, args): - if len(args) < 2: self.err("%s: Missing domain" % self.name) + if len(args) < 2: self.err("%s: Missing domain" % args[0]) dom = args[1] server.xend_domain_destroy(dom) @@ -252,8 +274,7 @@ class ProgShutdown(Prog): info = """Shutdown a domain.""" def help(self, args): - print self.name, 'DOM' - print '\nSignal domain DOM to shutdown.' + shutdown.main([args[0], '-h']) def main(self, args): shutdown.main(args) @@ -266,11 +287,11 @@ class ProgPause(Prog): info = """Pause execution of a domain.""" def help(self, args): - print self.name, 'DOM' + print args[0], 'DOM' print '\nPause execution of domain DOM.' def main(self, args): - if len(args) < 2: self.err("%s: Missing domain" % self.name) + if len(args) < 2: self.err("%s: Missing domain" % args[0]) dom = args[1] server.xend_domain_pause(dom) @@ -282,11 +303,11 @@ class ProgUnpause(Prog): info = """Unpause a paused domain.""" def help(self, args): - print self.name, 'DOM' + print args[0], 'DOM' print '\nUnpause execution of domain DOM.' def main(self, args): - if len(args) < 2: self.err("%s: Missing domain" % self.name) + if len(args) < 2: self.err("%s: Missing domain" % args[0]) dom = args[1] server.xend_domain_unpause(dom) @@ -298,11 +319,11 @@ class ProgPincpu(Prog): info = """Pin a domain to a cpu. """ def help(self, args): - print self.name,'DOM CPU' + print args[0],'DOM CPU' print '\nPin domain DOM to cpu CPU.' def main(self, args): - if len(args) != 3: self.err("%s: Invalid argument(s)" % self.name) + if len(args) != 3: self.err("%s: Invalid argument(s)" % args[0]) v = map(int, args[1:3]) server.xend_domain_pincpu(*v) @@ -314,11 +335,11 @@ class ProgBvt(Prog): info = """Set BVT scheduler parameters.""" def help(self, args): - print self.name, "DOM MCUADV WARP WARPL WARPU" + print args[0], "DOM MCUADV WARP WARPL WARPU" print '\nSet Borrowed Virtual Time scheduler parameters.' def main(self, args): - if len(args) != 6: self.err("%s: Invalid argument(s)" % self.name) + if len(args) != 6: self.err("%s: Invalid argument(s)" % args[0]) v = map(int, args[1:6]) server.xend_domain_cpu_bvt_set(*v) @@ -330,11 +351,11 @@ class ProgBvtslice(Prog): info = """Set the BVT scheduler slice.""" def help(self, args): - print self.name, 'SLICE' + print args[0], 'SLICE' print '\nSet Borrowed Virtual Time scheduler slice.' def main(self, args): - if len(args) < 2: self.err('%s: Missing slice' % self.name) + if len(args) < 2: self.err('%s: Missing slice' % args[0]) server.xend_node_cpu_bvt_slice_set(slice) xm.prog(ProgBvtslice) @@ -345,11 +366,11 @@ class ProgAtropos(Prog): info = """Set atropos parameters.""" def help(self, args): - print self.name, "DOM PERIOD SLICE LATENCY XTRATIME" + print args[0], "DOM PERIOD SLICE LATENCY XTRATIME" print "\nSet atropos parameters." def main(self, args): - if len(args) != 5: self.err("%s: Invalid argument(s)" % self.name) + if len(args) != 5: self.err("%s: Invalid argument(s)" % args[0]) v = map(int, args[1:5]) server.xend_domain_cpu_atropos_set(*v) @@ -361,11 +382,11 @@ class ProgRrobin(Prog): info = """Set round robin slice.""" def help(self, args): - print self.name, "SLICE" + print args[0], "SLICE" print "\nSet round robin scheduler slice." def main(self, args): - if len(args) != 2: self.err("%s: Invalid argument(s)" % self.name) + if len(args) != 2: self.err("%s: Invalid argument(s)" % args[0]) rrslice = int(args[1]) server.xend_node_rrobin_set(rrslice) @@ -407,11 +428,11 @@ class ProgConsole(Prog): info = """Open a console to a domain.""" def help(self, args): - print self.name, "DOM" + print "console DOM" print "\nOpen a console to domain DOM." def main(self, args): - if len(args) < 2: self.err("%s: Missing domain" % self.name) + if len(args) < 2: self.err("%s: Missing domain" % args[0]) dom = args[1] info = server.xend_domain(dom) console = sxp.child(info, "console") diff --git a/tools/xenmgr/lib/xm/opts.py b/tools/xenmgr/lib/xm/opts.py index b2cb2c7463..5b9515215d 100644 --- a/tools/xenmgr/lib/xm/opts.py +++ b/tools/xenmgr/lib/xm/opts.py @@ -273,7 +273,7 @@ class Opts: self.load(p) break else: - self.err("Cannot open defaults file %s" % self.defaults) + self.err("Cannot open defaults file %s" % self.vals.defaults) def load(self, defaults, help=0): """Load a defaults file. Local variables in the file diff --git a/tools/xenmgr/lib/xm/shutdown.py b/tools/xenmgr/lib/xm/shutdown.py index 98decaedbe..2c7831876b 100644 --- a/tools/xenmgr/lib/xm/shutdown.py +++ b/tools/xenmgr/lib/xm/shutdown.py @@ -24,6 +24,10 @@ gopts.opt('wait', short='w', fn=set_true, default=0, use='Wait for shutdown to complete.') +gopts.opt('norestart', short='n', + fn=set_true, default=0, + use='Prevent domain restart.') + def shutdown(opts, doms, wait): def domains(): return [ int(a) for a in server.xend_domains() ] |