dom0/qvm-tools: output diagnostics to stderr instead of stdout (#276)
This commit is contained in:
parent
05605f1394
commit
ed23b0d6a2
@ -23,6 +23,7 @@
|
||||
from qubes.qubes import QubesVmCollection
|
||||
from qubes.qubes import QubesException
|
||||
from optparse import OptionParser;
|
||||
import sys
|
||||
|
||||
def main():
|
||||
usage = "usage: %prog [options] <appvm-name> <vm-template-name>\n\n"\
|
||||
@ -48,12 +49,12 @@ def main():
|
||||
qvm_collection.load()
|
||||
|
||||
if qvm_collection.get_vm_by_name(vmname) is not None:
|
||||
print "ERROR: A VM with the name '{0}' already exists in the system.".format(vmname)
|
||||
print >> sys.stderr, "ERROR: A VM with the name '{0}' already exists in the system.".format(vmname)
|
||||
exit(1)
|
||||
|
||||
template_vm = qvm_collection.get_vm_by_name(templatename)
|
||||
if template_vm is None:
|
||||
print "ERROR: A Template VM with the name '{0}' does not exist in the system.".format(templatename)
|
||||
print >> sys.stderr, "ERROR: A Template VM with the name '{0}' does not exist in the system.".format(templatename)
|
||||
exit(1)
|
||||
|
||||
|
||||
@ -64,7 +65,7 @@ def main():
|
||||
try:
|
||||
vm.verify_files()
|
||||
except QubesException as err:
|
||||
print "ERROR: {0}".format(err)
|
||||
print >> sys.stderr, "ERROR: {0}".format(err)
|
||||
qvm_collection.pop(vm.qid)
|
||||
exit (1)
|
||||
|
||||
|
@ -23,6 +23,7 @@
|
||||
from qubes.qubes import QubesVmCollection
|
||||
from qubes.qubes import QubesException
|
||||
from optparse import OptionParser;
|
||||
import sys
|
||||
|
||||
def main():
|
||||
usage = "usage: %prog [options] <vm-template-name>\n"\
|
||||
@ -49,7 +50,7 @@ def main():
|
||||
qvm_collection.load()
|
||||
|
||||
if qvm_collection.get_vm_by_name(vmname) is not None:
|
||||
print "ERROR: A VM with the name '{0}' already exists in the system.".format(vmname)
|
||||
print >> sys.stderr, "ERROR: A VM with the name '{0}' already exists in the system.".format(vmname)
|
||||
exit(1)
|
||||
|
||||
vm = qvm_collection.add_new_templatevm(vmname,
|
||||
@ -60,7 +61,7 @@ def main():
|
||||
try:
|
||||
vm.verify_files()
|
||||
except QubesException as err:
|
||||
print "ERROR: {0}".format(err)
|
||||
print >> sys.stderr, "ERROR: {0}".format(err)
|
||||
qvm_collection.pop(vm.qid)
|
||||
exit (1)
|
||||
|
||||
|
@ -62,14 +62,14 @@ def main():
|
||||
(options, args) = parser.parse_args ()
|
||||
|
||||
if (len (args) != 1):
|
||||
print "You must specify the target backup directory (e.g. /mnt/backup)"
|
||||
print "qvm-backup will create a subdirectory there for each individual backup."
|
||||
print >> sys.stderr, "You must specify the target backup directory (e.g. /mnt/backup)"
|
||||
print >> sys.stderr, "qvm-backup will create a subdirectory there for each individual backup."
|
||||
exit (0)
|
||||
|
||||
base_backup_dir = args[0]
|
||||
|
||||
if not os.path.exists (base_backup_dir):
|
||||
print "The target directory doesn't exist!"
|
||||
print >> sys.stderr, "The target directory doesn't exist!"
|
||||
exit(1)
|
||||
|
||||
qvm_collection = QubesVmCollection()
|
||||
@ -78,7 +78,7 @@ def main():
|
||||
|
||||
|
||||
if options is not None and options.exclude_list is not None:
|
||||
print "Excluding the following VMs:", options.exclude_list
|
||||
print >> sys.stderr, "Excluding the following VMs:", options.exclude_list
|
||||
vms_list = [vm for vm in qvm_collection.values() if vm.name not in options.exclude_list]
|
||||
else:
|
||||
vms_list = [vm for vm in qvm_collection.values()]
|
||||
@ -215,18 +215,18 @@ def main():
|
||||
backup_fs_free_sz = stat.f_bsize * stat.f_bavail
|
||||
print
|
||||
if (total_backup_sz > backup_fs_free_sz):
|
||||
print "Not enough space avilable on the backup filesystem!"
|
||||
print >> sys.stderr, "Not enough space avilable on the backup filesystem!"
|
||||
exit (1)
|
||||
|
||||
if (there_are_running_vms):
|
||||
print "Please shutdown all VMs before proceeding."
|
||||
print >> sys.stderr, "Please shutdown all VMs before proceeding."
|
||||
exit (1)
|
||||
|
||||
|
||||
backup_dir = base_backup_dir + "/qubes-{0}".format (time.strftime("%Y-%m-%d-%H%M%S"))
|
||||
if os.path.exists (backup_dir):
|
||||
print "ERROR: the path {0} already exists?!".format(backup_dir)
|
||||
print "Aborting..."
|
||||
print >> sys.stderr, "ERROR: the path {0} already exists?!".format(backup_dir)
|
||||
print >> sys.stderr, "Aborting..."
|
||||
exit (1)
|
||||
|
||||
print "-> Backup dir: {0}".format (backup_dir)
|
||||
@ -239,8 +239,8 @@ def main():
|
||||
os.mkdir (backup_dir)
|
||||
|
||||
if not os.path.exists (backup_dir):
|
||||
print "ERROR: Strange: couldn't create backup dir: {0}?!".format(backup_dir)
|
||||
print "Aborting..."
|
||||
print >> sys.stderr, "ERROR: Strange: couldn't create backup dir: {0}?!".format(backup_dir)
|
||||
print >> sys.stderr, "Aborting..."
|
||||
exit (1)
|
||||
|
||||
bytes_backedup = 0
|
||||
@ -252,13 +252,13 @@ def main():
|
||||
if file["subdir"] != "":
|
||||
retcode = subprocess.call (["mkdir", "-p", dest_dir])
|
||||
if retcode != 0:
|
||||
print "Cannot create directory: {0}?!".format(dest_dir)
|
||||
print "Aborting..."
|
||||
print >> sys.stderr, "Cannot create directory: {0}?!".format(dest_dir)
|
||||
print >> sys.stderr, "Aborting..."
|
||||
exit(1)
|
||||
|
||||
retcode = subprocess.call (["cp", "-rp", file["path"], dest_dir])
|
||||
if retcode != 0:
|
||||
print "Error while copying file {0} to {1}".format(file["path"], dest_dir)
|
||||
print >> sys.stderr, "Error while copying file {0} to {1}".format(file["path"], dest_dir)
|
||||
exit (1)
|
||||
|
||||
bytes_backedup += file["size"]
|
||||
|
@ -94,7 +94,7 @@ def restore_vm_file (backup_dir, file_path):
|
||||
# We prefer to use Linux's cp, because it nicely handles sparse files
|
||||
retcode = subprocess.call (["cp", "-p", backup_file_path, file_path])
|
||||
if retcode != 0:
|
||||
print "*** Error while copying file {0} to {1}".format(backup_file_path, file_path)
|
||||
print >> sys.stderr, "*** Error while copying file {0} to {1}".format(backup_file_path, file_path)
|
||||
exit (1)
|
||||
|
||||
def restore_vm_dir (backup_dir, src_dir, dst_dir):
|
||||
@ -104,7 +104,7 @@ def restore_vm_dir (backup_dir, src_dir, dst_dir):
|
||||
# We prefer to use Linux's cp, because it nicely handles sparse files
|
||||
retcode = subprocess.call (["cp", "-rp", backup_src_dir, dst_dir])
|
||||
if retcode != 0:
|
||||
print "*** Error while copying file {0} to {1}".format(backup_src_dir, dest_dir)
|
||||
print >> sys.stderr, "*** Error while copying file {0} to {1}".format(backup_src_dir, dest_dir)
|
||||
exit (1)
|
||||
|
||||
def find_template_name(template, replaces):
|
||||
@ -138,13 +138,13 @@ def main():
|
||||
(options, args) = parser.parse_args ()
|
||||
|
||||
if (len (args) != 1):
|
||||
print "You must specify the backup directory (e.g. /mnt/backup/qubes-2010-12-01-235959)"
|
||||
print >> sys.stderr, "You must specify the backup directory (e.g. /mnt/backup/qubes-2010-12-01-235959)"
|
||||
exit (0)
|
||||
|
||||
backup_dir = args[0]
|
||||
|
||||
if not os.path.exists (backup_dir):
|
||||
print "The backup directory doesn't exist!"
|
||||
print >> sys.stderr, "The backup directory doesn't exist!"
|
||||
exit(1)
|
||||
|
||||
backup_collection = QubesVmCollection(store_filename = backup_dir + "/qubes.xml")
|
||||
@ -245,52 +245,52 @@ def main():
|
||||
print
|
||||
|
||||
if os.geteuid() == 0:
|
||||
print "*** Running this tool as root is strongly discouraged, this will lead you in permissions problems."
|
||||
print >> sys.stderr, "*** Running this tool as root is strongly discouraged, this will lead you in permissions problems."
|
||||
if options.force_root:
|
||||
print "Continuing as commanded. You have been warned."
|
||||
print >> sys.stderr, "Continuing as commanded. You have been warned."
|
||||
else:
|
||||
print "Retry as unprivileged user."
|
||||
print "... or use --force-root to continue anyway."
|
||||
print >> sys.stderr, "Retry as unprivileged user."
|
||||
print >> sys.stderr, "... or use --force-root to continue anyway."
|
||||
exit(1)
|
||||
|
||||
if there_are_conflicting_vms:
|
||||
print "*** There VMs with conflicting names on the host! ***"
|
||||
print >> sys.stderr, "*** There VMs with conflicting names on the host! ***"
|
||||
if options.skip_conflicting:
|
||||
print "Those VMs will not be restored, the host VMs will not be overwritten!"
|
||||
print >> sys.stderr, "Those VMs will not be restored, the host VMs will not be overwritten!"
|
||||
else:
|
||||
print "Remove VMs with conflicting names from the host before proceeding."
|
||||
print "... or use --skip-conflicting to restore only those VMs that do not exist on the host."
|
||||
print >> sys.stderr, "Remove VMs with conflicting names from the host before proceeding."
|
||||
print >> sys.stderr, "... or use --skip-conflicting to restore only those VMs that do not exist on the host."
|
||||
exit (1)
|
||||
|
||||
print "The above VMs will be copied and added to your system."
|
||||
print "Exisiting VMs will not be removed."
|
||||
|
||||
if there_are_missing_templates:
|
||||
print "*** One or more template VM is missing on the host! ***"
|
||||
print >> sys.stderr, "*** One or more template VM is missing on the host! ***"
|
||||
if not (options.skip_broken or options.ignore_missing):
|
||||
print "Install it first, before proceeding with backup restore."
|
||||
print "Or pass: --skip-broken or --ignore-missing switch."
|
||||
print >> sys.stderr, "Install it first, before proceeding with backup restore."
|
||||
print >> sys.stderr, "Or pass: --skip-broken or --ignore-missing switch."
|
||||
exit (1)
|
||||
elif options.skip_broken:
|
||||
print "... VMs that depend on it will not be restored (--skip-broken used)"
|
||||
print >> sys.stderr, "... VMs that depend on it will not be restored (--skip-broken used)"
|
||||
elif options.ignore_missing:
|
||||
print "... VMs that depend on it will be restored anyway (--ignore-missing used)"
|
||||
print >> sys.stderr, "... VMs that depend on it will be restored anyway (--ignore-missing used)"
|
||||
else:
|
||||
print "INTERNAL ERROR?!"
|
||||
print >> sys.stderr, "INTERNAL ERROR?!"
|
||||
exit (1)
|
||||
|
||||
if there_are_missing_netvms:
|
||||
print "*** One or more network VM is missing on the host! ***"
|
||||
print >> sys.stderr, "*** One or more network VM is missing on the host! ***"
|
||||
if not (options.skip_broken or options.ignore_missing):
|
||||
print "Install it first, before proceeding with backup restore."
|
||||
print "Or pass: --skip_broken or --ignore_missing switch."
|
||||
print >> sys.stderr, "Install it first, before proceeding with backup restore."
|
||||
print >> sys.stderr, "Or pass: --skip_broken or --ignore_missing switch."
|
||||
exit (1)
|
||||
elif options.skip_broken:
|
||||
print "... VMs that depend on it will not be restored (--skip-broken used)"
|
||||
print >> sys.stderr, "... VMs that depend on it will not be restored (--skip-broken used)"
|
||||
elif options.ignore_missing:
|
||||
print "... VMs that depend on it be restored anyway (--ignore-missing used)"
|
||||
print >> sys.stderr, "... VMs that depend on it be restored anyway (--ignore-missing used)"
|
||||
else:
|
||||
print "INTERNAL ERROR?!"
|
||||
print >> sys.stderr, "INTERNAL ERROR?!"
|
||||
exit (1)
|
||||
|
||||
prompt = raw_input ("Do you want to proceed? [y/N] ")
|
||||
@ -302,8 +302,8 @@ def main():
|
||||
print "-> Restoring Template VM {0}...".format(vm.name)
|
||||
retcode = subprocess.call (["mkdir", "-p", vm.dir_path])
|
||||
if retcode != 0:
|
||||
print ("*** Cannot create directory: {0}?!".format(dest_dir))
|
||||
print ("Skiping...")
|
||||
print >> sys.stderr, ("*** Cannot create directory: {0}?!".format(dest_dir))
|
||||
print >> sys.stderr, ("Skiping...")
|
||||
continue
|
||||
|
||||
restore_vm_dir (backup_dir, vm.dir_path, qubes_templates_dir);
|
||||
@ -317,8 +317,8 @@ def main():
|
||||
vm.updateable = updateable
|
||||
vm.verify_files()
|
||||
except Exception as err:
|
||||
print "ERROR: {0}".format(err)
|
||||
print "*** Skiping VM: {0}".vm.name
|
||||
print >> sys.stderr, "ERROR: {0}".format(err)
|
||||
print >> sys.stderr, "*** Skiping VM: {0}".vm.name
|
||||
if vm:
|
||||
host_collection.pop(vm.qid)
|
||||
continue
|
||||
@ -326,8 +326,8 @@ def main():
|
||||
try:
|
||||
vm.create_appmenus(verbose=True)
|
||||
except Exception as err:
|
||||
print "ERROR during appmenu restore: {0}".format(err)
|
||||
print "*** VM '{0}' will not have appmenus".format(vm.name)
|
||||
print >> sys.stderr, "ERROR during appmenu restore: {0}".format(err)
|
||||
print >> sys.stderr, "*** VM '{0}' will not have appmenus".format(vm.name)
|
||||
|
||||
# ... then NetVMs...
|
||||
for vm in [ vm for vm in vms_to_restore if vm.is_netvm()]:
|
||||
@ -335,8 +335,8 @@ def main():
|
||||
print "-> Restoring {0} {1}...".format(vm.type, vm.name)
|
||||
retcode = subprocess.call (["mkdir", "-p", vm.dir_path])
|
||||
if retcode != 0:
|
||||
print ("*** Cannot create directory: {0}?!".format(dest_dir))
|
||||
print ("Skiping...")
|
||||
print >> sys.stderr, ("*** Cannot create directory: {0}?!".format(dest_dir))
|
||||
print >> sys.stderr, ("Skiping...")
|
||||
continue
|
||||
|
||||
restore_vm_dir (backup_dir, vm.dir_path, qubes_servicevms_dir);
|
||||
@ -368,8 +368,8 @@ def main():
|
||||
updateable=updateable,
|
||||
label=vm.label)
|
||||
except Exception as err:
|
||||
print "ERROR: {0}".format(err)
|
||||
print "*** Skiping VM: {0}".format(vm.name)
|
||||
print >> sys.stderr, "ERROR: {0}".format(err)
|
||||
print >> sys.stderr, "*** Skiping VM: {0}".format(vm.name)
|
||||
if vm:
|
||||
host_collection.pop(vm.qid)
|
||||
continue
|
||||
@ -381,8 +381,8 @@ def main():
|
||||
try:
|
||||
vm.verify_files()
|
||||
except Exception as err:
|
||||
print "ERROR: {0}".format(err)
|
||||
print "*** Skiping VM: {0}".format(vm.name)
|
||||
print >> sys.stderr, "ERROR: {0}".format(err)
|
||||
print >> sys.stderr, "*** Skiping VM: {0}".format(vm.name)
|
||||
host_collection.pop(vm.qid)
|
||||
continue
|
||||
|
||||
@ -392,8 +392,8 @@ def main():
|
||||
print "-> Restoring AppVM {0}...".format(vm.name)
|
||||
retcode = subprocess.call (["mkdir", "-p", vm.dir_path])
|
||||
if retcode != 0:
|
||||
print ("*** Cannot create directory: {0}?!".format(dest_dir))
|
||||
print ("Skiping...")
|
||||
print >> sys.stderr, ("*** Cannot create directory: {0}?!".format(dest_dir))
|
||||
print >> sys.stderr, ("Skiping...")
|
||||
continue
|
||||
|
||||
restore_vm_dir (backup_dir, vm.dir_path, qubes_appvms_dir);
|
||||
@ -418,8 +418,8 @@ def main():
|
||||
updateable=updateable,
|
||||
label=vm.label)
|
||||
except Exception as err:
|
||||
print "ERROR: {0}".format(err)
|
||||
print "*** Skiping VM: {0}".format(vm.name)
|
||||
print >> sys.stderr, "ERROR: {0}".format(err)
|
||||
print >> sys.stderr, "*** Skiping VM: {0}".format(vm.name)
|
||||
if vm:
|
||||
host_collection.pop(vm.qid)
|
||||
continue
|
||||
@ -431,14 +431,14 @@ def main():
|
||||
try:
|
||||
vm.create_appmenus(verbose=True)
|
||||
except Exception as err:
|
||||
print "ERROR during appmenu restore: {0}".format(err)
|
||||
print "*** VM '{0}' will not have appmenus".format(vm.name)
|
||||
print >> sys.stderr, "ERROR during appmenu restore: {0}".format(err)
|
||||
print >> sys.stderr, "*** VM '{0}' will not have appmenus".format(vm.name)
|
||||
|
||||
try:
|
||||
vm.verify_files()
|
||||
except Exception as err:
|
||||
print "ERROR: {0}".format(err)
|
||||
print "*** Skiping VM: {0}".format(vm.name)
|
||||
print >> sys.stderr, "ERROR: {0}".format(err)
|
||||
print >> sys.stderr, "*** Skiping VM: {0}".format(vm.name)
|
||||
host_collection.pop(vm.qid)
|
||||
continue
|
||||
|
||||
|
@ -49,7 +49,7 @@ def main():
|
||||
(options, args) = parser.parse_args ()
|
||||
|
||||
if options.do_list + options.do_attach + options.do_detach > 1:
|
||||
print "Only one of -l -a -d is allowed!"
|
||||
print >> sys.stderr, "Only one of -l -a -d is allowed!"
|
||||
exit (1)
|
||||
|
||||
if options.do_attach or options.do_detach:
|
||||
|
@ -23,6 +23,7 @@
|
||||
from qubes.qubes import QubesVmCollection
|
||||
from qubes.qubes import QubesException
|
||||
from optparse import OptionParser;
|
||||
import sys
|
||||
|
||||
def main():
|
||||
usage = "usage: %prog [options] <src-template-name> <new-template-name>\n"\
|
||||
@ -45,11 +46,11 @@ def main():
|
||||
|
||||
src_tvm = qvm_collection.get_vm_by_name(srcname)
|
||||
if src_tvm is None:
|
||||
print "ERROR: A VM with the name '{0}' does not exist in the system.".format(srcname)
|
||||
print >> sys.stderr, "ERROR: A VM with the name '{0}' does not exist in the system.".format(srcname)
|
||||
exit(1)
|
||||
|
||||
if qvm_collection.get_vm_by_name(dstname) is not None:
|
||||
print "ERROR: A VM with the name '{0}' already exists in the system.".format(dstname)
|
||||
print >> sys.stderr, "ERROR: A VM with the name '{0}' already exists in the system.".format(dstname)
|
||||
exit(1)
|
||||
|
||||
dst_tvm = qvm_collection.clone_templatevm(src_template_vm=src_tvm,
|
||||
@ -59,7 +60,7 @@ def main():
|
||||
try:
|
||||
dst_tvm.clone_disk_files (src_template_vm=src_tvm, verbose=options.verbose)
|
||||
except (IOError, OSError) as err:
|
||||
print "ERROR: {0}".format(err)
|
||||
print >> sys.stderr, "ERROR: {0}".format(err)
|
||||
qvm_collection.pop(dst_tvm.qid)
|
||||
exit (1)
|
||||
|
||||
|
@ -26,6 +26,7 @@ from optparse import OptionParser;
|
||||
import subprocess
|
||||
import re
|
||||
import os
|
||||
import sys
|
||||
|
||||
def main():
|
||||
usage = "usage: %prog [options] <vm-name>"
|
||||
@ -59,25 +60,25 @@ def main():
|
||||
parser.error ("You must specify at most one of --proxy and --net")
|
||||
|
||||
if os.geteuid() == 0:
|
||||
print "*** Running this tool as root is strongly discouraged, this will lead you in permissions problems."
|
||||
print >> sys.stderr, "*** Running this tool as root is strongly discouraged, this will lead you in permissions problems."
|
||||
if options.force_root:
|
||||
print "Continuing as commanded. You have been warned."
|
||||
print >> sys.stderr, "Continuing as commanded. You have been warned."
|
||||
else:
|
||||
print "Retry as unprivileged user."
|
||||
print "... or use --force-root to continue anyway."
|
||||
print >> sys.stderr, "Retry as unprivileged user."
|
||||
print >> sys.stderr, "... or use --force-root to continue anyway."
|
||||
exit(1)
|
||||
|
||||
if options.label is None:
|
||||
print "You must choose a label for the new VM by passing the --label option."
|
||||
print "Possible values are:"
|
||||
print >> sys.stderr, "You must choose a label for the new VM by passing the --label option."
|
||||
print >> sys.stderr, "Possible values are:"
|
||||
for l in QubesVmLabels.values():
|
||||
print "* {0}".format(l.name)
|
||||
print >> sys.stderr, "* {0}".format(l.name)
|
||||
exit (1)
|
||||
|
||||
if options.label not in QubesVmLabels:
|
||||
print "Wrong label name, supported values are the following:"
|
||||
print >> sys.stderr, "Wrong label name, supported values are the following:"
|
||||
for l in QubesVmLabels.values():
|
||||
print "* {0}".format(l.name)
|
||||
print >> sys.stderr, "* {0}".format(l.name)
|
||||
exit (1)
|
||||
label = QubesVmLabels[options.label]
|
||||
|
||||
@ -86,23 +87,23 @@ def main():
|
||||
qvm_collection.load()
|
||||
|
||||
if qvm_collection.get_vm_by_name(vmname) is not None:
|
||||
print "A VM with the name '{0}' already exists in the system.".format(vmname)
|
||||
print >> sys.stderr, "A VM with the name '{0}' already exists in the system.".format(vmname)
|
||||
exit(1)
|
||||
|
||||
if options.template is not None:
|
||||
template_vm = qvm_collection.get_vm_by_name(options.template)
|
||||
if template_vm is None:
|
||||
print "There is no (Templete)VM with the name '{0}'".format(options.template)
|
||||
print >> sys.stderr, "There is no (Templete)VM with the name '{0}'".format(options.template)
|
||||
exit (1)
|
||||
if not template_vm.is_template():
|
||||
print "VM '{0}' is not a TemplateVM".format(options.template)
|
||||
print >> sys.stderr, "VM '{0}' is not a TemplateVM".format(options.template)
|
||||
exit (1)
|
||||
if (options.verbose):
|
||||
print "--> Using TemplateVM: {0}".format(template_vm.name)
|
||||
|
||||
else:
|
||||
if qvm_collection.get_default_template_vm() is None:
|
||||
print "No default TempleteVM defined!"
|
||||
print >> sys.stderr, "No default TempleteVM defined!"
|
||||
exit (1)
|
||||
else:
|
||||
template_vm = qvm_collection.get_default_template_vm()
|
||||
@ -135,7 +136,7 @@ def main():
|
||||
vm.create_on_disk(verbose=options.verbose, source_template=template_vm)
|
||||
|
||||
except (IOError, OSError) as err:
|
||||
print "ERROR: {0}".format(err)
|
||||
print >> sys.stderr, "ERROR: {0}".format(err)
|
||||
exit (1)
|
||||
|
||||
|
||||
|
@ -37,7 +37,7 @@ def get_netvm():
|
||||
while netvm.netvm_vm is not None:
|
||||
netvm = netvm.netvm_vm
|
||||
if netvm is None or netvm.name == 'dom0':
|
||||
print 'There seems to be no dedicated default netvm, aborting.'
|
||||
print >> sys.stderr, 'There seems to be no dedicated default netvm, aborting.'
|
||||
sys.exit(1)
|
||||
return netvm
|
||||
|
||||
@ -45,8 +45,8 @@ def vif_eth0_exists():
|
||||
if not os.path.islink('/sys/class/net/eth0'):
|
||||
return False
|
||||
if not os.path.isdir('/sys/devices/xen/vif-0/net/eth0'):
|
||||
print 'There is a dedicated netvm, but device eth0 is present'
|
||||
print 'and it is not a Xen interface. Refusing to continue.'
|
||||
print >> sys.stderr, 'There is a dedicated netvm, but device eth0 is present'
|
||||
print >> sys.stderr, 'and it is not a Xen interface. Refusing to continue.'
|
||||
sys.exit(1)
|
||||
return True
|
||||
|
||||
@ -64,7 +64,7 @@ def netup():
|
||||
if not vif_eth0_exists():
|
||||
cmd = 'modprobe xennet'
|
||||
if os.system(cmd) != 0:
|
||||
print 'Error creating network device'
|
||||
print >> sys.stderr, 'Error creating network device'
|
||||
sys.exit(1)
|
||||
qvm_collection[0].attach_network(verbose=True, netvm=netvm, wait=True)
|
||||
if not bringup_eth0(netvm):
|
||||
@ -73,20 +73,20 @@ def netup():
|
||||
def netdown():
|
||||
netvm = get_netvm()
|
||||
if not vif_eth0_exists():
|
||||
print 'There is no eth0 that is a Xen vif device, aborting.'
|
||||
print >> sys.stderr, 'There is no eth0 that is a Xen vif device, aborting.'
|
||||
sys.exit(1)
|
||||
os.system('ifconfig eth0 down')
|
||||
os.system('xl network-detach 0 0')
|
||||
|
||||
def usage():
|
||||
print 'Usage: qvm-dom0-network-via-netvm [up|down]'
|
||||
print >> sys.stderr, 'Usage: qvm-dom0-network-via-netvm [up|down]'
|
||||
sys.exit(1)
|
||||
|
||||
def main():
|
||||
if len(sys.argv) != 2:
|
||||
usage()
|
||||
if os.getuid() != 0:
|
||||
print 'This script must be run as root'
|
||||
print >> sys.stderr, 'This script must be run as root'
|
||||
sys.exit(1)
|
||||
if sys.argv[1] == 'up':
|
||||
netup()
|
||||
|
@ -26,6 +26,7 @@ from optparse import OptionParser
|
||||
import subprocess
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
|
||||
qvm_run_path = "/usr/bin/qvm-run"
|
||||
|
||||
@ -44,7 +45,7 @@ def parse_size(size):
|
||||
size = size[:-len(unit)].strip()
|
||||
return int(size)*multiplier
|
||||
|
||||
print "Invalid size: {0}.".format(size)
|
||||
print >> sys.stderr, "Invalid size: {0}.".format(size)
|
||||
exit(1)
|
||||
|
||||
def main():
|
||||
@ -64,23 +65,23 @@ def main():
|
||||
|
||||
vm = qvm_collection.get_vm_by_name(vmname)
|
||||
if vm is None:
|
||||
print "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
print >> sys.stderr, "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
exit(1)
|
||||
|
||||
if vm.is_running() and os.geteuid() != 0:
|
||||
print "You must be root to grow private.img on running VM."
|
||||
print >> sys.stderr, "You must be root to grow private.img on running VM."
|
||||
exit(1)
|
||||
|
||||
size_bytes = parse_size(size)
|
||||
|
||||
if size_bytes < vm.get_private_img_sz():
|
||||
print "Cannot shrink private.img ({0} < {1})".format(size_bytes, vm.get_private_img_sz())
|
||||
print >> sys.stderr, "Cannot shrink private.img ({0} < {1})".format(size_bytes, vm.get_private_img_sz())
|
||||
exit(1)
|
||||
|
||||
try:
|
||||
vm.resize_private_img(size_bytes)
|
||||
except (IOError, OSError, QubesException) as err:
|
||||
print "ERROR: {0}".format(err)
|
||||
print >> sys.stderr, "ERROR: {0}".format(err)
|
||||
exit (1)
|
||||
|
||||
if vm.is_running():
|
||||
@ -90,7 +91,7 @@ def main():
|
||||
result = p.communicate()
|
||||
m = re.match(r"^(/dev/loop\d+):\s", result[0])
|
||||
if m is None:
|
||||
print "ERROR: Cannot find loop device!"
|
||||
print >> sys.stderr, "ERROR: Cannot find loop device!"
|
||||
exit(1)
|
||||
|
||||
loop_dev = m.group(1)
|
||||
|
@ -21,11 +21,12 @@
|
||||
#
|
||||
|
||||
from qubes.qubes import QubesVmCollection
|
||||
import sys
|
||||
|
||||
def main():
|
||||
qvm_collection = QubesVmCollection()
|
||||
if qvm_collection.check_if_storage_exists():
|
||||
print "Storage exists, not overwriting."
|
||||
print >> sys.stderr, "Storage exists, not overwriting."
|
||||
exit(1)
|
||||
qvm_collection.create_empty_storage()
|
||||
|
||||
|
@ -23,6 +23,7 @@
|
||||
from qubes.qubes import QubesVmCollection
|
||||
from optparse import OptionParser;
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
qubes_guid_path = "/usr/bin/qubes_guid"
|
||||
|
||||
@ -41,13 +42,13 @@ def main():
|
||||
|
||||
vm = qvm_collection.get_vm_by_name(vmname)
|
||||
if vm is None:
|
||||
print "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
print >> sys.stderr, "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
exit(1)
|
||||
|
||||
try:
|
||||
vm.force_shutdown()
|
||||
except (IOError, OSError) as err:
|
||||
print "ERROR: {0}".format(err)
|
||||
print >> sys.stderr, "ERROR: {0}".format(err)
|
||||
exit (1)
|
||||
|
||||
|
||||
|
@ -24,6 +24,7 @@ from qubes.qubes import QubesVmCollection
|
||||
from qubes.qubes import QubesHost
|
||||
from qubes.qubes import QubesException
|
||||
from optparse import OptionParser
|
||||
import sys
|
||||
|
||||
|
||||
fields = {
|
||||
@ -201,6 +202,6 @@ def main():
|
||||
try:
|
||||
vm.verify_files()
|
||||
except QubesException as err:
|
||||
print "WARNING: VM '{0}' has corrupted files!".format(vm.name)
|
||||
print >> sys.stderr, "WARNING: VM '{0}' has corrupted files!".format(vm.name)
|
||||
|
||||
main()
|
||||
|
@ -24,6 +24,7 @@ from qubes.qubes import QubesVmCollection
|
||||
from optparse import OptionParser
|
||||
import subprocess
|
||||
import os
|
||||
import sys
|
||||
|
||||
def main():
|
||||
usage = "usage: %prog -l [options] <vm-name>\n"\
|
||||
@ -43,7 +44,7 @@ def main():
|
||||
vmname = args[0]
|
||||
|
||||
if options.do_list + options.do_add + options.do_delete > 1:
|
||||
print "Only one of -l -a -d is allowed!"
|
||||
print >> sys.stderr, "Only one of -l -a -d is allowed!"
|
||||
exit (1)
|
||||
|
||||
if options.do_add or options.do_delete:
|
||||
@ -58,17 +59,17 @@ def main():
|
||||
|
||||
vm = qvm_collection.get_vm_by_name(vmname)
|
||||
if vm is None or vm.qid not in qvm_collection:
|
||||
print "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
print >> sys.stderr, "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
exit(1)
|
||||
|
||||
if options.do_add:
|
||||
if len (args) < 2:
|
||||
print "You must specify the PCI device to add"
|
||||
print >> sys.stderr, "You must specify the PCI device to add"
|
||||
exit (1)
|
||||
|
||||
pci = args[1]
|
||||
if not os.path.exists('/sys/bus/pci/devices/0000:%s' % pci):
|
||||
print "Invalid PCI device: %s" % pci
|
||||
print >> sys.stderr, "Invalid PCI device: %s" % pci
|
||||
exit(1)
|
||||
if vm.pcidevs.count(pci) == 0:
|
||||
vm.pcidevs.append(pci)
|
||||
@ -77,7 +78,7 @@ def main():
|
||||
|
||||
elif options.do_delete:
|
||||
if len (args) < 2:
|
||||
print "You must specify the PCI device to delete"
|
||||
print >> sys.stderr, "You must specify the PCI device to delete"
|
||||
exit (1)
|
||||
|
||||
pci = args[1]
|
||||
|
@ -26,6 +26,7 @@ from qubes.qubes import qubes_kernels_base_dir
|
||||
from optparse import OptionParser
|
||||
import subprocess
|
||||
import os
|
||||
import sys
|
||||
|
||||
def do_list(vm):
|
||||
label_width = 18
|
||||
@ -69,13 +70,13 @@ def do_list(vm):
|
||||
|
||||
def set_label(vms, vm, args):
|
||||
if len (args) != 1:
|
||||
print "Missing label name argument!"
|
||||
print >> sys.stderr, "Missing label name argument!"
|
||||
|
||||
label = args[0]
|
||||
if label not in QubesVmLabels:
|
||||
print "Wrong label name, supported values are the following:"
|
||||
print >> sys.stderr, "Wrong label name, supported values are the following:"
|
||||
for l in QubesVmLabels.values():
|
||||
print "* {0}".format(l.name)
|
||||
print >> sys.stderr, "* {0}".format(l.name)
|
||||
exit (1)
|
||||
|
||||
vm.label = QubesVmLabels[label]
|
||||
@ -83,29 +84,29 @@ def set_label(vms, vm, args):
|
||||
|
||||
def set_memory(vms, vm, args):
|
||||
if len (args) != 1:
|
||||
print "Missing memory argument!"
|
||||
print >> sys.stderr, "Missing memory argument!"
|
||||
|
||||
vm.memory = int(args[0])
|
||||
|
||||
def set_maxmem(vms, vm, args):
|
||||
if len (args) != 1:
|
||||
print "Missing maxmem argument!"
|
||||
print >> sys.stderr, "Missing maxmem argument!"
|
||||
|
||||
vm.maxmem = int(args[0])
|
||||
|
||||
def set_pcidevs(vms, vm, args):
|
||||
if len (args) != 1:
|
||||
print "Missing pcidevs argument!"
|
||||
print >> sys.stderr, "Missing pcidevs argument!"
|
||||
|
||||
vm.pcidevs = list(eval(args[0]))
|
||||
|
||||
def set_netvm(vms, vm, args):
|
||||
if len (args) != 1:
|
||||
print "Missing netvm name argument!"
|
||||
print "Possible values:"
|
||||
print "1) default"
|
||||
print "2) none"
|
||||
print "3) <vmaname>"
|
||||
print >> sys.stderr, "Missing netvm name argument!"
|
||||
print >> sys.stderr, "Possible values:"
|
||||
print >> sys.stderr, "1) default"
|
||||
print >> sys.stderr, "2) none"
|
||||
print >> sys.stderr, "3) <vmaname>"
|
||||
return
|
||||
|
||||
netvm = args[0]
|
||||
@ -118,10 +119,10 @@ def set_netvm(vms, vm, args):
|
||||
else:
|
||||
netvm_vm = vms.get_vm_by_name (netvm)
|
||||
if netvm_vm is None:
|
||||
print "A VM with the name '{0}' does not exist in the system.".format(netvm)
|
||||
print >> sys.stderr, "A VM with the name '{0}' does not exist in the system.".format(netvm)
|
||||
exit(1)
|
||||
if not netvm_vm.is_netvm():
|
||||
print "VM '{0}' is not a NetVM".format(netvm)
|
||||
print >> sys.stderr, "VM '{0}' is not a NetVM".format(netvm)
|
||||
exit (1)
|
||||
vm.uses_default_netvm = False
|
||||
|
||||
@ -140,70 +141,70 @@ def set_netvm(vms, vm, args):
|
||||
|
||||
def set_updateable(vms, vm, args):
|
||||
if vm.is_updateable():
|
||||
print "VM '{0}' is already set 'updateable', no action required.".format(vm.name)
|
||||
print >> sys.stderr, "VM '{0}' is already set 'updateable', no action required.".format(vm.name)
|
||||
return True
|
||||
|
||||
if vm.is_running():
|
||||
print "Cannot change 'updateable' attribute of a running VM. Shut it down first."
|
||||
print >> sys.stderr, "Cannot change 'updateable' attribute of a running VM. Shut it down first."
|
||||
return False
|
||||
|
||||
if vm.is_appvm():
|
||||
# Check if the Template is *non* updateable...
|
||||
if not vm.template_vm.is_updateable():
|
||||
print "VM '{0}': Setting 'updateable' attribute to True.".format(vm.name)
|
||||
print >> sys.stderr, "VM '{0}': Setting 'updateable' attribute to True.".format(vm.name)
|
||||
vm.set_updateable()
|
||||
else:
|
||||
print "The Template VM ('{0}') is marked as 'updateable' itself!".format(vm.template_vm.name)
|
||||
print "Cannot make the AppVM updateable too, as this might cause COW-backed storage incoherency."
|
||||
print "If you want to make this AppVM updateable, you must first make the Template VM nonupdateable."
|
||||
print >> sys.stderr, "The Template VM ('{0}') is marked as 'updateable' itself!".format(vm.template_vm.name)
|
||||
print >> sys.stderr, "Cannot make the AppVM updateable too, as this might cause COW-backed storage incoherency."
|
||||
print >> sys.stderr, "If you want to make this AppVM updateable, you must first make the Template VM nonupdateable."
|
||||
return False
|
||||
|
||||
if vm.is_template():
|
||||
# Make sure that all the AppVMs are non-updateable...
|
||||
for appvm in vm.appvms.values():
|
||||
if appvm.is_updateable():
|
||||
print "At least one of the AppVMs ('{0}') of this Template VM is also marked 'updateable'.".format(appvm.name)
|
||||
print "Cannot make the Template VM updateable too, as this might cause COW-backed storage incoherency."
|
||||
print "If you want to make this Template VM updateable, you must first make all its decedent AppVMs nonupdateable."
|
||||
print >> sys.stderr, "At least one of the AppVMs ('{0}') of this Template VM is also marked 'updateable'.".format(appvm.name)
|
||||
print >> sys.stderr, "Cannot make the Template VM updateable too, as this might cause COW-backed storage incoherency."
|
||||
print >> sys.stderr, "If you want to make this Template VM updateable, you must first make all its decedent AppVMs nonupdateable."
|
||||
return False
|
||||
|
||||
|
||||
print "VM '{0}': Setting 'updateable' attribute to True.".format(vm.name)
|
||||
print >> sys.stderr, "VM '{0}': Setting 'updateable' attribute to True.".format(vm.name)
|
||||
vm.set_updateable()
|
||||
|
||||
return True
|
||||
|
||||
def set_nonupdateable(vms, vm, args):
|
||||
if not vm.is_updateable():
|
||||
print "VM '{0}' is already set 'nonupdateable', no action required.".format(vm.name)
|
||||
print >> sys.stderr, "VM '{0}' is already set 'nonupdateable', no action required.".format(vm.name)
|
||||
return True
|
||||
|
||||
if vm.is_running():
|
||||
print "Cannot change 'updateable' attribute of a running VM. Shut it down first."
|
||||
print >> sys.stderr, "Cannot change 'updateable' attribute of a running VM. Shut it down first."
|
||||
return False
|
||||
|
||||
if vm.is_netvm():
|
||||
print "Why, on earth, would you want to make a NetVM 'nonupdateable'?"
|
||||
print >> sys.stderr, "Why, on earth, would you want to make a NetVM 'nonupdateable'?"
|
||||
return False
|
||||
|
||||
|
||||
print "VM '{0}': Setting 'updateable' attribute to False.".format(vm.name)
|
||||
print >> sys.stderr, "VM '{0}': Setting 'updateable' attribute to False.".format(vm.name)
|
||||
vm.set_nonupdateable()
|
||||
return True
|
||||
|
||||
def set_kernel(vms, vm, args):
|
||||
if vm.template_vm is not None:
|
||||
print "Cannot set kernel for template-based VM. Set it for template instead."
|
||||
print >> sys.stderr, "Cannot set kernel for template-based VM. Set it for template instead."
|
||||
return False
|
||||
|
||||
if len (args) != 1:
|
||||
print "Missing kernel version argument!"
|
||||
print "Possible values:"
|
||||
print "1) default"
|
||||
print "2) none (kernels subdir in VM)"
|
||||
print "3) <kernel version>, one of:"
|
||||
print >> sys.stderr, "Missing kernel version argument!"
|
||||
print >> sys.stderr, "Possible values:"
|
||||
print >> sys.stderr, "1) default"
|
||||
print >> sys.stderr, "2) none (kernels subdir in VM)"
|
||||
print >> sys.stderr, "3) <kernel version>, one of:"
|
||||
for k in os.listdir(qubes_kernels_base_dir):
|
||||
print " -", k
|
||||
print >> sys.stderr, " -", k
|
||||
return
|
||||
|
||||
kernel = args[0]
|
||||
@ -215,7 +216,7 @@ def set_kernel(vms, vm, args):
|
||||
vm.uses_default_kernel = False
|
||||
else:
|
||||
if not os.path.exists(qubes_kernels_base_dir + '/' + kernel):
|
||||
print "Kernel version {0} not installed.".format(kernel)
|
||||
print >> sys.stderr, "Kernel version {0} not installed.".format(kernel)
|
||||
exit(1)
|
||||
vm.uses_default_kernel = False
|
||||
|
||||
@ -223,48 +224,48 @@ def set_kernel(vms, vm, args):
|
||||
|
||||
def set_template(vms, vm, args):
|
||||
if len (args) != 1:
|
||||
print "Missing template name argument!"
|
||||
print >> sys.stderr, "Missing template name argument!"
|
||||
return False
|
||||
|
||||
template_name = args[0];
|
||||
template_vm = vms.get_vm_by_name(template_name)
|
||||
if template_vm is None or template_vm.qid not in vms:
|
||||
print "A VM with the name '{0}' does not exist in the system.".format(template_name)
|
||||
print >> sys.stderr, "A VM with the name '{0}' does not exist in the system.".format(template_name)
|
||||
return False
|
||||
|
||||
if not template_vm.is_template():
|
||||
print "VM '{0}' is not a TemplateVM".format(template_name)
|
||||
print >> sys.stderr, "VM '{0}' is not a TemplateVM".format(template_name)
|
||||
return False
|
||||
|
||||
print "Setting template for VM '{0}' to '{1}'...".format (vm.name, template_name)
|
||||
print >> sys.stderr, "Setting template for VM '{0}' to '{1}'...".format (vm.name, template_name)
|
||||
vm.template_vm = template_vm
|
||||
return True
|
||||
|
||||
def set_vcpus(vms, vm, args):
|
||||
if len (args) != 1:
|
||||
print "Missing vcpus count argument!"
|
||||
print >> sys.stderr, "Missing vcpus count argument!"
|
||||
return False
|
||||
|
||||
vcpus = int(args[0])
|
||||
if vcpus <= 0:
|
||||
print "A vcpus count must be positive."
|
||||
print >> sys.stderr, "A vcpus count must be positive."
|
||||
return False
|
||||
|
||||
qubes_host = QubesHost()
|
||||
if vcpus > qubes_host.no_cpus:
|
||||
print "This host has only {0} cpus".format(ubes_host.no_cpus)
|
||||
print >> sys.stderr, "This host has only {0} cpus".format(ubes_host.no_cpus)
|
||||
return False
|
||||
|
||||
print "Setting vcpus count for VM '{0}' to '{1}'...".format (vm.name, vcpus)
|
||||
print >> sys.stderr, "Setting vcpus count for VM '{0}' to '{1}'...".format (vm.name, vcpus)
|
||||
vm.vcpus = vcpus
|
||||
return True
|
||||
|
||||
def set_kernelopts(vms, vm, args):
|
||||
if len (args) != 1:
|
||||
print "Missing kernel opts argument!"
|
||||
print "Possible values:"
|
||||
print "1) default"
|
||||
print "2) <opts>"
|
||||
print >> sys.stderr, "Missing kernel opts argument!"
|
||||
print >> sys.stderr, "Possible values:"
|
||||
print >> sys.stderr, "1) default"
|
||||
print >> sys.stderr, "2) <opts>"
|
||||
return False
|
||||
|
||||
if args[0] == 'default':
|
||||
@ -292,7 +293,7 @@ properties = {
|
||||
|
||||
def do_set(vms, vm, property, args):
|
||||
if property not in properties.keys():
|
||||
print "ERROR: Wrong property name: '{0}'".format(property)
|
||||
print >> sys.stderr, "ERROR: Wrong property name: '{0}'".format(property)
|
||||
return False
|
||||
|
||||
return properties[property](vms, vm, args)
|
||||
@ -314,7 +315,7 @@ def main():
|
||||
vmname = args[0]
|
||||
|
||||
if options.do_list and options.do_set:
|
||||
print "You cannot provide -l and -s at the same time!"
|
||||
print >> sys.stderr, "You cannot provide -l and -s at the same time!"
|
||||
exit (1)
|
||||
|
||||
|
||||
@ -331,15 +332,15 @@ def main():
|
||||
|
||||
vm = qvm_collection.get_vm_by_name(vmname)
|
||||
if vm is None or vm.qid not in qvm_collection:
|
||||
print "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
print >> sys.stderr, "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
exit(1)
|
||||
|
||||
if options.do_set:
|
||||
if len (args) < 2:
|
||||
print "You must specify the property you wish to set..."
|
||||
print "Available properties:"
|
||||
print >> sys.stderr, "You must specify the property you wish to set..."
|
||||
print >> sys.stderr, "Available properties:"
|
||||
for p in properties.keys():
|
||||
print "--> '{0}'".format(p)
|
||||
print >> sys.stderr, "--> '{0}'".format(p)
|
||||
exit (1)
|
||||
|
||||
property = args[1]
|
||||
|
@ -23,6 +23,7 @@
|
||||
from qubes.qubes import QubesVmCollection
|
||||
from optparse import OptionParser;
|
||||
import os
|
||||
import sys
|
||||
|
||||
def main():
|
||||
usage = "usage: %prog [options] <vm-name>"
|
||||
@ -42,25 +43,25 @@ def main():
|
||||
qvm_collection.load()
|
||||
vm = qvm_collection.get_vm_by_name(vmname)
|
||||
if vm is None or vm.qid not in qvm_collection:
|
||||
print "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
print >> sys.stderr, "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
exit(1)
|
||||
|
||||
if os.geteuid() == 0:
|
||||
print "*** Running this tool as root is strongly discouraged, this will lead you in permissions problems."
|
||||
print >> sys.stderr, "*** Running this tool as root is strongly discouraged, this will lead you in permissions problems."
|
||||
if options.force_root:
|
||||
print "Continuing as commanded. You have been warned."
|
||||
print >> sys.stderr, "Continuing as commanded. You have been warned."
|
||||
else:
|
||||
print "Retry as unprivileged user."
|
||||
print "... or use --force-root to continue anyway."
|
||||
print >> sys.stderr, "Retry as unprivileged user."
|
||||
print >> sys.stderr, "... or use --force-root to continue anyway."
|
||||
exit(1)
|
||||
|
||||
if vm.is_template():
|
||||
dependent_vms = qvm_collection.get_vms_based_on(vm.qid)
|
||||
if len(dependent_vms) > 0:
|
||||
print "The following AppVMs use '{0}' as a template:".format(vmname)
|
||||
print >> sys.stderr, "The following AppVMs use '{0}' as a template:".format(vmname)
|
||||
for vm in dependent_vms:
|
||||
print "{name:<12} (qid={qid})".format(qid=vm.qid, name=vm.name)
|
||||
print "Please remove those VMs first."
|
||||
print >> sys.stderr, "{name:<12} (qid={qid})".format(qid=vm.qid, name=vm.name)
|
||||
print >> sys.stderr, "Please remove those VMs first."
|
||||
exit (1)
|
||||
if qvm_collection.default_template_qid == vm.qid:
|
||||
qvm_collection.default_template_qid = None
|
||||
@ -71,18 +72,18 @@ def main():
|
||||
|
||||
|
||||
if vm.is_running():
|
||||
print "Cannot remove a running VM, stop it first"
|
||||
print >> sys.stderr, "Cannot remove a running VM, stop it first"
|
||||
exit (1)
|
||||
|
||||
if vm.installed_by_rpm and not options.remove_from_db_only:
|
||||
if options.verbose:
|
||||
print "This VM has been installed by RPM, use rpm -e <pkg name> to remove it!"
|
||||
print >> sys.stderr, "This VM has been installed by RPM, use rpm -e <pkg name> to remove it!"
|
||||
exit (1)
|
||||
|
||||
try:
|
||||
if vm.installed_by_rpm:
|
||||
if options.verbose:
|
||||
print "--> VM installed by RPM, leaving all the files on disk"
|
||||
print >> sys.stderr, "--> VM installed by RPM, leaving all the files on disk"
|
||||
else:
|
||||
if options.verbose:
|
||||
print "--> Removing all the files on disk..."
|
||||
@ -92,7 +93,7 @@ def main():
|
||||
|
||||
|
||||
except (IOError, OSError) as err:
|
||||
print "Warning: {0}".format(err)
|
||||
print >> sys.stderr, "Warning: {0}".format(err)
|
||||
# Do not exit, perhaps the VM files were somehow removed
|
||||
# so just remove it from Qubes DB
|
||||
|
||||
|
@ -27,6 +27,7 @@ import subprocess
|
||||
import os
|
||||
import time
|
||||
import glob
|
||||
import sys
|
||||
|
||||
def main():
|
||||
usage = "usage: %prog [options] <template-name>"
|
||||
@ -40,7 +41,7 @@ def main():
|
||||
vmname = args[0]
|
||||
|
||||
if os.geteuid() != 0:
|
||||
print "ERROR: This tool must be run as root!"
|
||||
print >> sys.stderr, "ERROR: This tool must be run as root!"
|
||||
exit(1)
|
||||
|
||||
qvm_collection = QubesVmCollection()
|
||||
@ -50,15 +51,15 @@ def main():
|
||||
|
||||
vm = qvm_collection.get_vm_by_name(vmname)
|
||||
if vm is None:
|
||||
print "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
print >> sys.stderr, "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
exit(1)
|
||||
|
||||
if not vm.is_template():
|
||||
print "A VM '{0}' is not template.".format(vmname)
|
||||
print >> sys.stderr, "A VM '{0}' is not template.".format(vmname)
|
||||
exit(1)
|
||||
|
||||
if vm.is_running():
|
||||
print "You must stop VM first."
|
||||
print >> sys.stderr, "You must stop VM first."
|
||||
exit(1)
|
||||
|
||||
oldcow_img = vm.rootcow_img + '.old'
|
||||
@ -76,7 +77,7 @@ def main():
|
||||
if dev == old_dmdev:
|
||||
snapshot_present = True
|
||||
else:
|
||||
print "ERROR: You must shutdown all VMs running system older/newer than last good one."
|
||||
print >> sys.stderr, "ERROR: You must shutdown all VMs running system older/newer than last good one."
|
||||
exit(1)
|
||||
|
||||
root_blocks = os.path.getsize(vm.root_img)/512
|
||||
@ -86,7 +87,7 @@ def main():
|
||||
stdout=subprocess.PIPE)
|
||||
result = p.communicate()
|
||||
if result[0].strip() != old_dmdev:
|
||||
print "ERROR: Cannot create snapshot device ({0} != {1})".format(
|
||||
print >> sys.stderr, "ERROR: Cannot create snapshot device ({0} != {1})".format(
|
||||
result[0].strip(), old_dmdev)
|
||||
exit(1)
|
||||
|
||||
@ -102,7 +103,7 @@ def main():
|
||||
dm_table = result[0]
|
||||
dm_table_elements = dm_table.split(' ')
|
||||
if dm_table_elements[2] != 'snapshot':
|
||||
print "ERROR: Unexpected device-mapper type ({0}). Template changes reverting already running".format(dm_table_elements[2])
|
||||
print >> sys.stderr, "ERROR: Unexpected device-mapper type ({0}). Template changes reverting already running".format(dm_table_elements[2])
|
||||
exit(1)
|
||||
|
||||
dm_table_elements[2] = 'snapshot-merge'
|
||||
|
@ -29,6 +29,7 @@ import socket
|
||||
import errno
|
||||
import dbus
|
||||
import time
|
||||
import sys
|
||||
import os
|
||||
import os.path
|
||||
|
||||
@ -59,18 +60,18 @@ def actually_execute(domid, cmd, options):
|
||||
|
||||
def start_guid(vm, options):
|
||||
if options.verbose:
|
||||
print "--> Starting Qubes GUId..."
|
||||
print >> sys.stderr, "--> Starting Qubes GUId..."
|
||||
xid = vm.get_xid()
|
||||
|
||||
retcode = subprocess.call ([qubes_guid_path, "-d", str(xid), "-c", vm.label.color, "-i", vm.label.icon, "-l", str(vm.label.index)])
|
||||
if (retcode != 0) :
|
||||
print "ERROR: Cannot start qubes_guid!"
|
||||
print >> sys.stderr, "ERROR: Cannot start qubes_guid!"
|
||||
if options.tray:
|
||||
tray_notify_error ("ERROR: Cannot start qubes_guid!")
|
||||
exit (1)
|
||||
|
||||
if options.verbose:
|
||||
print "--> Waiting for qubes-session..."
|
||||
print >> sys.stderr, "--> Waiting for qubes-session..."
|
||||
|
||||
subprocess.call([qrexec_client_path, "-d", str(xid), "user:echo $$ >> /tmp/qubes-session-waiter; [ ! -f /tmp/qubes-session-env ] && exec sleep 365d"])
|
||||
|
||||
@ -78,44 +79,44 @@ def start_guid(vm, options):
|
||||
def vm_run_cmd(vm, cmd, options):
|
||||
if options.shutdown:
|
||||
if options.verbose:
|
||||
print "Shutting down VM: '{0}'...".format(vm.name)
|
||||
print >> sys.stderr, "Shutting down VM: '{0}'...".format(vm.name)
|
||||
subprocess.call (["/usr/sbin/xl", "shutdown", vm.name])
|
||||
return
|
||||
|
||||
if options.pause:
|
||||
if options.verbose:
|
||||
print "Pausing VM: '{0}'...".format(vm.name)
|
||||
print >> sys.stderr, "Pausing VM: '{0}'...".format(vm.name)
|
||||
subprocess.call (["/usr/sbin/xl", "pause", vm.name])
|
||||
return
|
||||
|
||||
if options.unpause:
|
||||
if options.verbose:
|
||||
print "UnPausing VM: '{0}'...".format(vm.name)
|
||||
print >> sys.stderr, "UnPausing VM: '{0}'...".format(vm.name)
|
||||
subprocess.call (["/usr/sbin/xl", "unpause", vm.name])
|
||||
return
|
||||
|
||||
if options.verbose:
|
||||
print "Running command on VM: '{0}'...".format(vm.name)
|
||||
print >> sys.stderr, "Running command on VM: '{0}'...".format(vm.name)
|
||||
|
||||
if not vm.is_running():
|
||||
if not options.auto:
|
||||
print "VM '{0}' is not running. Please start it first or use the '--auto' switch".format(vm.name)
|
||||
print >> sys.stderr, "VM '{0}' is not running. Please start it first or use the '--auto' switch".format(vm.name)
|
||||
exit (1)
|
||||
try:
|
||||
if options.verbose:
|
||||
print "Starting the VM '{0}'...".format(vm.name)
|
||||
print >> sys.stderr, "Starting the VM '{0}'...".format(vm.name)
|
||||
if options.tray:
|
||||
tray_notify ("Starting the '{0}' VM...".format(vm.name), label=vm.label)
|
||||
xid = vm.start(verbose=options.verbose)
|
||||
|
||||
except (IOError, OSError, QubesException) as err:
|
||||
print "ERROR: {0}".format(err)
|
||||
print >> sys.stderr, "ERROR: {0}".format(err)
|
||||
if options.tray:
|
||||
tray_notify_error ("Error while starting the '{0}' VM: {1}".format(vm.name, err))
|
||||
exit (1)
|
||||
except (MemoryError) as err:
|
||||
print "ERROR: {0}".format(err)
|
||||
print "Close one or more running VMs and try again."
|
||||
print >> sys.stderr, "ERROR: {0}".format(err)
|
||||
print >> sys.stderr, "Close one or more running VMs and try again."
|
||||
if options.tray:
|
||||
subprocess.call(["kdialog", "--error", "Not enough memory to start '{0}' VM! Close one or more running VMs and try again.".format(vm.name)])
|
||||
exit (1)
|
||||
@ -218,7 +219,7 @@ def main():
|
||||
else:
|
||||
vm = qvm_collection.get_vm_by_name(vmname)
|
||||
if vm is None:
|
||||
print "A VM with the name '{0}' does not exist in the system!".format(vmname)
|
||||
print >> sys.stderr, "A VM with the name '{0}' does not exist in the system!".format(vmname)
|
||||
exit(1)
|
||||
vms_list.append(vm)
|
||||
|
||||
@ -226,9 +227,9 @@ def main():
|
||||
if options.shutdown and vm.is_netvm():
|
||||
connected_vms = [vm for vm in qvm_collection.get_vms_connected_to(vm.qid) if vm.is_running()]
|
||||
if connected_vms and not options.force:
|
||||
print "ERROR: There are other VMs connected to this VM, "
|
||||
print " shutdown them first or use --force option"
|
||||
print "VMs list: " + str([vm.name for vm in connected_vms])
|
||||
print >> sys.stderr, "ERROR: There are other VMs connected to this VM, "
|
||||
print >> sys.stderr, " shutdown them first or use --force option"
|
||||
print >> sys.stderr, "VMs list: " + str([vm.name for vm in connected_vms])
|
||||
exit(1)
|
||||
|
||||
if takes_cmd_argument:
|
||||
@ -242,19 +243,19 @@ def main():
|
||||
|
||||
if options.wait_for_shutdown:
|
||||
if options.verbose:
|
||||
print "Waiting for the VM(s) to shutdown..."
|
||||
print >> sys.stderr, "Waiting for the VM(s) to shutdown..."
|
||||
shutdown_counter = 0
|
||||
|
||||
while len (vms_list):
|
||||
if options.verbose:
|
||||
print "Waiting for VMs: ", [vm.name for vm in vms_list]
|
||||
print >> sys.stderr, "Waiting for VMs: ", [vm.name for vm in vms_list]
|
||||
for vm in vms_list:
|
||||
if not vm.is_running():
|
||||
vms_list.remove (vm)
|
||||
if shutdown_counter > shutdown_counter_max:
|
||||
# kill the VM
|
||||
if options.verbose:
|
||||
print "Killing the (apparently hanging) VM '{0}'...".format(vm.name)
|
||||
print >> sys.stderr, "Killing the (apparently hanging) VM '{0}'...".format(vm.name)
|
||||
vm.force_shutdown()
|
||||
#vms_list.remove(vm)
|
||||
|
||||
@ -264,7 +265,7 @@ def main():
|
||||
|
||||
retcode = subprocess.call([qubes_clipd_path])
|
||||
if retcode != 0:
|
||||
print "ERROR: Cannot start qclipd!"
|
||||
print >> sys.stderr, "ERROR: Cannot start qclipd!"
|
||||
if options.tray:
|
||||
tray_notify ("ERROR: Cannot start the Qubes Clipboard Notifier!")
|
||||
|
||||
|
@ -22,6 +22,7 @@
|
||||
|
||||
from qubes.qubes import QubesVmCollection
|
||||
from optparse import OptionParser;
|
||||
import sys
|
||||
|
||||
def main():
|
||||
usage = "usage: %prog <vm-name>"
|
||||
@ -36,7 +37,7 @@ def main():
|
||||
qvm_collection.load()
|
||||
vm = qvm_collection.get_vm_by_name(vmname)
|
||||
if vm is None or vm.qid not in qvm_collection:
|
||||
print "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
print >> sys.stderr, "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
exit(1)
|
||||
|
||||
qvm_collection.set_clockvm_vm(vm)
|
||||
|
@ -23,6 +23,7 @@
|
||||
from qubes.qubes import QubesVmCollection, qubes_kernels_base_dir
|
||||
from optparse import OptionParser;
|
||||
import os
|
||||
import sys
|
||||
|
||||
def main():
|
||||
usage = "usage: %prog <kernel>"
|
||||
@ -33,7 +34,7 @@ def main():
|
||||
kernel = args[0]
|
||||
|
||||
if not os.path.exists(qubes_kernels_base_dir + "/" + kernel):
|
||||
print "Kernel {0} not installed".format(kernel)
|
||||
print >> sys.stderr, "Kernel {0} not installed".format(kernel)
|
||||
exit(1)
|
||||
|
||||
qvm_collection = QubesVmCollection()
|
||||
|
@ -22,6 +22,7 @@
|
||||
|
||||
from qubes.qubes import QubesVmCollection
|
||||
from optparse import OptionParser;
|
||||
import sys
|
||||
|
||||
def main():
|
||||
usage = "usage: %prog <netvm-name>"
|
||||
@ -36,11 +37,11 @@ def main():
|
||||
qvm_collection.load()
|
||||
vm = qvm_collection.get_vm_by_name(vmname)
|
||||
if vm is None or vm.qid not in qvm_collection:
|
||||
print "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
print >> sys.stderr, "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
exit(1)
|
||||
|
||||
if not vm.is_netvm():
|
||||
print "VM '{0}' is not a NetVM".format(vmname)
|
||||
print >> sys.stderr, "VM '{0}' is not a NetVM".format(vmname)
|
||||
exit (1)
|
||||
|
||||
qvm_collection.set_default_netvm_vm(vm)
|
||||
|
@ -22,6 +22,7 @@
|
||||
|
||||
from qubes.qubes import QubesVmCollection
|
||||
from optparse import OptionParser;
|
||||
import sys
|
||||
|
||||
def main():
|
||||
usage = "usage: %prog <template-vm-name>"
|
||||
@ -36,11 +37,11 @@ def main():
|
||||
qvm_collection.load()
|
||||
vm = qvm_collection.get_vm_by_name(vmname)
|
||||
if vm is None or vm.qid not in qvm_collection:
|
||||
print "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
print >> sys.stderr, "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
exit(1)
|
||||
|
||||
if not vm.is_template():
|
||||
print "VM '{0}' is not a TemplateVM".format(vmname)
|
||||
print >> sys.stderr, "VM '{0}' is not a TemplateVM".format(vmname)
|
||||
exit (1)
|
||||
|
||||
qvm_collection.set_default_template_vm(vm)
|
||||
|
@ -22,6 +22,7 @@
|
||||
|
||||
from qubes.qubes import QubesVmCollection
|
||||
from optparse import OptionParser;
|
||||
import sys
|
||||
|
||||
def main():
|
||||
usage = "usage: %prog <vm-name>"
|
||||
@ -36,7 +37,7 @@ def main():
|
||||
qvm_collection.load()
|
||||
vm = qvm_collection.get_vm_by_name(vmname)
|
||||
if vm is None or vm.qid not in qvm_collection:
|
||||
print "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
print >> sys.stderr, "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
exit(1)
|
||||
|
||||
qvm_collection.set_updatevm_vm(vm)
|
||||
|
@ -25,6 +25,7 @@ from qubes.qubes import QubesException
|
||||
from optparse import OptionParser
|
||||
import subprocess
|
||||
import os
|
||||
import sys
|
||||
|
||||
qubes_guid_path = "/usr/bin/qubes_guid"
|
||||
|
||||
@ -51,23 +52,23 @@ def main():
|
||||
|
||||
vm = qvm_collection.get_vm_by_name(vmname)
|
||||
if vm is None:
|
||||
print "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
print >> sys.stderr, "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
exit(1)
|
||||
|
||||
try:
|
||||
vm.verify_files()
|
||||
xid = vm.start(debug_console=options.debug_console, verbose=options.verbose, preparing_dvm=options.preparing_dvm)
|
||||
except (IOError, OSError, QubesException) as err:
|
||||
print "ERROR: {0}".format(err)
|
||||
print >> sys.stderr, "ERROR: {0}".format(err)
|
||||
exit (1)
|
||||
|
||||
if not options.noguid and os.getenv("DISPLAY") is not None:
|
||||
if options.verbose:
|
||||
print "--> Starting Qubes GUId..."
|
||||
print >> sys.stderr, "--> Starting Qubes GUId..."
|
||||
|
||||
retcode = subprocess.call ([qubes_guid_path, "-d", str(xid), "-c", vm.label.color, "-i", vm.label.icon, "-l", str(vm.label.index)])
|
||||
if (retcode != 0) :
|
||||
print "ERROR: Cannot start qubes_guid!"
|
||||
print >> sys.stderr, "ERROR: Cannot start qubes_guid!"
|
||||
exit (1)
|
||||
|
||||
|
||||
|
@ -192,25 +192,25 @@ def main():
|
||||
|
||||
# Create new/update existing templates
|
||||
if options.verbose:
|
||||
print "--> Got {0} appmenus, storing to disk".format(str(len(new_appmenus)))
|
||||
print >> sys.stderr, "--> Got {0} appmenus, storing to disk".format(str(len(new_appmenus)))
|
||||
for appmenu_file in new_appmenus.keys():
|
||||
if options.verbose:
|
||||
if os.path.exists(vm.appmenus_templates_dir + '/' + appmenu_file):
|
||||
print "---> Updating {0}".format(appmenu_file)
|
||||
print >> sys.stderr, "---> Updating {0}".format(appmenu_file)
|
||||
else:
|
||||
print "---> Creating {0}".format(appmenu_file)
|
||||
print >> sys.stderr, "---> Creating {0}".format(appmenu_file)
|
||||
create_template(vm.appmenus_templates_dir + '/' + appmenu_file, new_appmenus[appmenu_file])
|
||||
|
||||
# Delete appmenus of remove applications
|
||||
if options.verbose:
|
||||
print "--> Cleaning old files"
|
||||
print >> sys.stderr, "--> Cleaning old files"
|
||||
for appmenu_file in os.listdir(vm.appmenus_templates_dir):
|
||||
if not fnmatch.fnmatch(appmenu_file, '*.desktop'):
|
||||
continue
|
||||
|
||||
if not new_appmenus.has_key(appmenu_file):
|
||||
if options.verbose:
|
||||
print "---> Removing {0}".format(appmenu_file)
|
||||
print >> sys.stderr, "---> Removing {0}".format(appmenu_file)
|
||||
os.unlink(vm.appmenus_templates_dir + '/' + appmenu_file)
|
||||
|
||||
main()
|
||||
|
@ -10,7 +10,7 @@ if [ -z "$CLOCK_VM" ]; then
|
||||
fi
|
||||
|
||||
if ! xl domid "$CLOCK_VM" > /dev/null 2>&1; then
|
||||
echo "ClockVM not started, exiting!"
|
||||
echo "ClockVM not started, exiting!" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@ -27,8 +27,8 @@ CURRENT_TIME="$($QREXEC_CLIENT -d $CLOCK_VM 'user:date -u' |
|
||||
if [ -n "$CURRENT_TIME" ] ; then
|
||||
echo Syncing Dom0 clock: setting time "$CURRENT_TIME"...
|
||||
sudo date -u -s "$CURRENT_TIME" ;
|
||||
echo Done.
|
||||
echo Done. >&2
|
||||
else
|
||||
echo "Error while parsing the time obtained from the ClockVM ($CLOCK_VM).."
|
||||
echo "Error while parsing the time obtained from the ClockVM ($CLOCK_VM).." >&2
|
||||
fi
|
||||
|
||||
|
@ -24,6 +24,7 @@ from qubes.qubes import QubesVmCollection
|
||||
from qubes.qubes import QubesException
|
||||
from optparse import OptionParser
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
qubes_guid_path = "/usr/bin/qubes_guid"
|
||||
|
||||
@ -43,22 +44,22 @@ def main():
|
||||
|
||||
vm = qvm_collection.get_vm_by_name(vmname)
|
||||
if vm is None:
|
||||
print "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
print >> sys.stderr, "A VM with the name '{0}' does not exist in the system.".format(vmname)
|
||||
exit(1)
|
||||
|
||||
if not vm.is_template():
|
||||
print "A VM '{0}' is not template.".format(vmname)
|
||||
print >> sys.stderr, "A VM '{0}' is not template.".format(vmname)
|
||||
exit(1)
|
||||
|
||||
if vm.is_running():
|
||||
print "You must stop VM first."
|
||||
print >> sys.stderr, "You must stop VM first."
|
||||
exit(1)
|
||||
|
||||
try:
|
||||
vm.verify_files()
|
||||
vm.commit_changes()
|
||||
except (IOError, OSError, QubesException) as err:
|
||||
print "ERROR: {0}".format(err)
|
||||
print >> sys.stderr, "ERROR: {0}".format(err)
|
||||
exit (1)
|
||||
|
||||
exit (0)
|
||||
|
Loading…
Reference in New Issue
Block a user