aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/examples/Makefile9
-rwxr-xr-xtools/examples/init.d/xendomains46
-rw-r--r--tools/xenmgr/lib/XendBridge.py11
-rw-r--r--tools/xenmgr/lib/XendDomain.py32
-rw-r--r--tools/xenmgr/lib/XendDomainInfo.py1
-rw-r--r--tools/xenmgr/lib/XendRoot.py6
-rw-r--r--tools/xenmgr/lib/server/SrvConsoleServer.py1
-rw-r--r--tools/xenmgr/lib/server/SrvDomain.py4
-rwxr-xr-xtools/xenmgr/lib/server/blkif.py33
-rwxr-xr-xtools/xenmgr/lib/server/controller.py2
-rwxr-xr-xtools/xenmgr/lib/server/netif.py21
-rw-r--r--tools/xenmgr/lib/xm/create.py15
-rw-r--r--tools/xenmgr/lib/xm/main.py107
-rw-r--r--tools/xenmgr/lib/xm/opts.py2
-rw-r--r--tools/xenmgr/lib/xm/shutdown.py4
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() ]